diff -x .svn -aruN 2.2.2.src/license.txt 2.5.src/license.txt
--- 2.2.2.src/license.txt	2003-04-01 08:12:34.000000000 -0600
+++ 2.5.src/license.txt	2008-03-02 15:34:25.000000000 -0600
@@ -1,280 +1,280 @@
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-                          675 Mass Ave, Cambridge, MA 02139, 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 Library 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
-
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                          675 Mass Ave, Cambridge, MA 02139, 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 Library 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
+
diff -x .svn -aruN 2.2.2.src/readme.html 2.5.src/readme.html
--- 2.2.2.src/readme.html	2007-04-20 21:20:09.000000000 -0500
+++ 2.5.src/readme.html	2008-02-29 11:09:44.000000000 -0600
@@ -1,14 +1,14 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-	<title>WordPress &rsaquo; ReadMe</title>
 	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-	<link rel="stylesheet" href="wp-admin/install.css" type="text/css" />
+	<title>WordPress &rsaquo; ReadMe</title>
+	<link rel="stylesheet" href="wp-admin/css/install.css" type="text/css" />
 </head>
 <body>
 <h1 id="logo" style="text-align: center">
 	<img alt="WordPress" src="wp-admin/images/wordpress-logo.png" />
-	<br /> Version 2.2
+	<br /> Version 2.5
 </h1>
 <p style="text-align: center">Semantic Personal Publishing Platform</p>
 
@@ -29,7 +29,7 @@
 
 <h1>Upgrading</h1>
 <p>Before you upgrade anything, make sure you have backup copies of any files you may have modified such as <code>index.php</code>.</p>
-<h2>Upgrading from any previous WordPress to 2.2:</h2>
+<h2>Upgrading from any previous WordPress to 2.5:</h2>
 <ol>
 	<li>Delete your old WP files, saving ones you've modified.</li>
 	<li>Upload the new files.</li>
@@ -56,7 +56,7 @@
 
 <h1>System Recommendations</h1>
 <ul>
-	<li>PHP version <strong>4.2</strong> or higher.</li>
+	<li>PHP version <strong>4.3</strong> or higher.</li>
 	<li>MySQL version <strong>4.0</strong> or higher.</li>
 	<li>... and a link to <a href="http://wordpress.org/">http://wordpress.org</a> on your site.</li>
 </ul>
@@ -70,7 +70,7 @@
 
 <h1>Post via Email</h1>
 <p>You can post from an email client! To set this up go to your &quot;Writing&quot; options screen and fill in the connection details for your secret POP3 account. Then you need to set up <code>wp-mail.php</code> to execute periodically to check the mailbox for new posts. You can do it with Cron-jobs, or if your host doesn't support it you can look into the various website-monitoring services, and make them check your <code>wp-mail.php</code> URL.</p>
-<p>Posting is easy: Any email sent to the address you specify will be posted, with the subject as the title. It is best to keep the address dicrete. The script will <i>delete</i> emails that are successfully posted.</p>
+<p>Posting is easy: Any email sent to the address you specify will be posted, with the subject as the title. It is best to keep the address discrete. The script will <em>delete</em> emails that are successfully posted.</p>
 
 <h1>User Roles</h1>
 <p>We've eliminated user levels in order to make way for the much more flexible roles system introduced in 2.0. You can <a href="http://codex.wordpress.org/Roles_and_Capabilities">read more about Roles and Capabilities on the Codex</a>.</p>
diff -x .svn -aruN 2.2.2.src/wp-admin/admin-ajax.php 2.5.src/wp-admin/admin-ajax.php
--- 2.2.2.src/wp-admin/admin-ajax.php	2007-03-27 16:20:16.000000000 -0500
+++ 2.5.src/wp-admin/admin-ajax.php	2008-03-24 20:42:38.000000000 -0500
@@ -1,62 +1,91 @@
 <?php
-require_once('../wp-config.php');
-require_once('admin-functions.php');
-require_once('admin-db.php');
-
 define('DOING_AJAX', true);
 
-check_ajax_referer();
+require_once('../wp-config.php');
+require_once('includes/admin.php');
+
 if ( !is_user_logged_in() )
 	die('-1');
 
-function get_out_now() { exit; }
-add_action( 'shutdown', 'get_out_now', -1 );
+if ( isset($_GET['action']) && 'ajax-tag-search' == $_GET['action'] ) {
+	if ( !current_user_can( 'manage_categories' ) )
+		die('-1');
 
-function wp_ajax_meta_row( $pid, $mid, $key, $value ) {
-	$value = attribute_escape($value);
-	$key_js = addslashes(wp_specialchars($key, 'double'));
-	$key = attribute_escape($key);
-	$r .= "<tr id='meta-$mid'><td valign='top'>";
-	$r .= "<input name='meta[$mid][key]' tabindex='6' onkeypress='return killSubmit(\"theList.ajaxUpdater(&#039;meta&#039;,&#039;meta-$mid&#039;);\",event);' type='text' size='20' value='$key' />";
-	$r .= "</td><td><textarea name='meta[$mid][value]' tabindex='6' rows='2' cols='30'>$value</textarea></td><td align='center'>";
-	$r .= "<input name='updatemeta' type='button' class='updatemeta' tabindex='6' value='".attribute_escape(__('Update'))."' onclick='return theList.ajaxUpdater(&#039;meta&#039;,&#039;meta-$mid&#039;);' /><br />";
-	$r .= "<input name='deletemeta[$mid]' type='submit' onclick=\"return deleteSomething( 'meta', $mid, '";
-	$r .= js_escape(sprintf(__("You are about to delete the '%s' custom field on this post.\n'OK' to delete, 'Cancel' to stop."), $key_js));
-	$r .= "' );\" class='deletemeta' tabindex='6' value='".attribute_escape(__('Delete'))."' /></td></tr>";
-	return $r;
+	$s = $_GET['q']; // is this slashed already?
+
+	if ( strstr( $s, ',' ) )
+		die; // it's a multiple tag insert, we won't find anything
+	$results = $wpdb->get_col( "SELECT name FROM $wpdb->terms WHERE name LIKE ('%$s%')" );
+	echo join( $results, "\n" );
+	die;
 }
 
-$id = (int) $_POST['id'];
-switch ( $_POST['action'] ) :
+$id = isset($_POST['id'])? (int) $_POST['id'] : 0;
+switch ( $action = $_POST['action'] ) :
 case 'delete-comment' :
+	check_ajax_referer( "delete-comment_$id" );
 	if ( !$comment = get_comment( $id ) )
 		die('0');
 	if ( !current_user_can( 'edit_post', $comment->comment_post_ID ) )
 		die('-1');
 
-	if ( wp_delete_comment( $comment->comment_ID ) )
-		die('1');
-	else	die('0');
+	if ( isset($_POST['spam']) && 1 == $_POST['spam'] )
+		$r = wp_set_comment_status( $comment->comment_ID, 'spam' );
+	else
+		$r = wp_delete_comment( $comment->comment_ID );
+
+	die( $r ? '1' : '0' );
 	break;
-case 'delete-comment-as-spam' :
-	if ( !$comment = get_comment( $id ) )
-		die('0');
-	if ( !current_user_can( 'edit_post', $comment->comment_post_ID ) )
+case 'delete-cat' :
+	check_ajax_referer( "delete-category_$id" );
+	if ( !current_user_can( 'manage_categories' ) )
 		die('-1');
 
-	if ( wp_set_comment_status( $comment->comment_ID, 'spam' ) )
+	if ( wp_delete_category( $id ) )
 		die('1');
 	else	die('0');
 	break;
-case 'delete-cat' :
+case 'delete-tag' :
+	check_ajax_referer( "delete-tag_$id" );
 	if ( !current_user_can( 'manage_categories' ) )
 		die('-1');
 
-	if ( wp_delete_category( $id ) )
+	if ( wp_delete_term($id, 'post_tag'))
 		die('1');
 	else	die('0');
 	break;
+case 'delete-link-cat' :
+	check_ajax_referer( "delete-link-category_$id" );
+	if ( !current_user_can( 'manage_categories' ) )
+		die('-1');
+
+	$cat_name = get_term_field('name', $id, 'link_category');
+
+	// Don't delete the default cats.
+	if ( $id == get_option('default_link_category') ) {
+		$x = new WP_AJAX_Response( array(
+			'what' => 'link-cat',
+			'id' => $id,
+			'data' => new WP_Error( 'default-link-cat', sprintf(__("Can&#8217;t delete the <strong>%s</strong> category: this is the default one"), $cat_name) )
+		) );
+		$x->send();
+	}
+
+	$r = wp_delete_term($id, 'link_category');
+	if ( !$r )
+		die('0');
+	if ( is_wp_error($r) ) {
+		$x = new WP_AJAX_Response( array(
+			'what' => 'link-cat',
+			'id' => $id,
+			'data' => $r
+		) );
+		$x->send();
+	}
+	die('1');
+	break;
 case 'delete-link' :
+	check_ajax_referer( "delete-bookmark_$id" );
 	if ( !current_user_can( 'manage_links' ) )
 		die('-1');
 
@@ -65,6 +94,7 @@
 	else	die('0');
 	break;
 case 'delete-meta' :
+	check_ajax_referer( "delete-meta_$id" );
 	if ( !$meta = get_post_meta_by_id( $id ) )
 		die('0');
 	if ( !current_user_can( 'edit_post', $meta->post_id ) )
@@ -74,14 +104,17 @@
 	die('0');
 	break;
 case 'delete-post' :
+	check_ajax_referer( "{$action}_$id" );
 	if ( !current_user_can( 'delete_post', $id ) )
 		die('-1');
 
 	if ( wp_delete_post( $id ) )
 		die('1');
-	else	die('0');
+	else
+		die('0');
 	break;
 case 'delete-page' :
+	check_ajax_referer( "{$action}_$id" );
 	if ( !current_user_can( 'delete_page', $id ) )
 		die('-1');
 
@@ -98,66 +131,224 @@
 		die('-1');
 
 	if ( 'unapproved' == wp_get_comment_status($comment->comment_ID) ) {
+		check_ajax_referer( "approve-comment_$id" );
 		if ( wp_set_comment_status( $comment->comment_ID, 'approve' ) )
 			die('1');
 	} else {
+		check_ajax_referer( "unapprove-comment_$id" );
 		if ( wp_set_comment_status( $comment->comment_ID, 'hold' ) )
 			die('1');
 	}
 	die('0');
 	break;
 case 'add-category' : // On the Fly
+	check_ajax_referer( $action );
 	if ( !current_user_can( 'manage_categories' ) )
 		die('-1');
 	$names = explode(',', $_POST['newcat']);
+	if ( 0 > $parent = (int) $_POST['newcat_parent'] )
+		$parent = 0;
+	$post_category = isset($_POST['post_category'])? (array) $_POST['post_category'] : array();
+	$checked_categories = array_map( 'absint', (array) $post_category );
+
 	$x = new WP_Ajax_Response();
 	foreach ( $names as $cat_name ) {
 		$cat_name = trim($cat_name);
-		if ( !$category_nicename = sanitize_title($cat_name) )
-			die('0');
-		if ( !$cat_id = category_exists( $cat_name ) )
-			$cat_id = wp_create_category( $cat_name );
-		$cat_name = wp_specialchars(stripslashes($cat_name));
+		$category_nicename = sanitize_title($cat_name);
+		if ( '' === $category_nicename )
+			continue;
+		$cat_id = wp_create_category( $cat_name, $parent );
+		$checked_categories[] = $cat_id;
+		if ( $parent ) // Do these all at once in a second
+			continue;
+		$category = get_category( $cat_id );
+		$checked_categories[] = $cat_id;
+		ob_start();
+			dropdown_categories( 0, $category );
+		$data = ob_get_contents();
+		ob_end_clean();
 		$x->add( array(
 			'what' => 'category',
 			'id' => $cat_id,
-			'data' => "<li id='category-$cat_id'><label for='in-category-$cat_id' class='selectit'><input value='$cat_id' type='checkbox' checked='checked' name='post_category[]' id='in-category-$cat_id'/> $cat_name</label></li>"
+			'data' => $data,
+			'position' => -1
+		) );
+	}
+	if ( $parent ) { // Foncy - replace the parent and all its children
+		$parent = get_category( $parent );
+		ob_start();
+			dropdown_categories( 0, $parent );
+		$data = ob_get_contents();
+		ob_end_clean();
+		$x->add( array(
+			'what' => 'category',
+			'id' => $parent->term_id,
+			'old_id' => $parent->term_id,
+			'data' => $data,
+			'position' => -1
+		) );
+
+	}
+	$x->send();
+	break;
+case 'add-link-category' : // On the Fly
+	check_ajax_referer( $action );
+	if ( !current_user_can( 'manage_categories' ) )
+		die('-1');
+	$names = explode(',', $_POST['newcat']);
+	$x = new WP_Ajax_Response();
+	foreach ( $names as $cat_name ) {
+		$cat_name = trim($cat_name);
+		$slug = sanitize_title($cat_name);
+		if ( '' === $slug )
+			continue;
+		if ( !$cat_id = is_term( $cat_name, 'link_category' ) ) {
+			$cat_id = wp_insert_term( $cat_name, 'link_category' );
+		}
+		$cat_id = $cat_id['term_id'];
+		$cat_name = wp_specialchars(stripslashes($cat_name));
+		$x->add( array(
+			'what' => 'link-category',
+			'id' => $cat_id,
+			'data' => "<li id='link-category-$cat_id'><label for='in-link-category-$cat_id' class='selectit'><input value='$cat_id' type='checkbox' checked='checked' name='link_category[]' id='in-link-category-$cat_id'/> $cat_name</label></li>",
+			'position' => -1
 		) );
 	}
 	$x->send();
 	break;
 case 'add-cat' : // From Manage->Categories
+	check_ajax_referer( 'add-category' );
 	if ( !current_user_can( 'manage_categories' ) )
 		die('-1');
-	if ( !$cat = wp_insert_category( $_POST ) )
-		die('0');
-	if ( !$cat = get_category( $cat ) )
+
+	if ( '' === trim($_POST['cat_name']) ) {
+		$x = new WP_Ajax_Response( array(
+			'what' => 'cat',
+			'id' => new WP_Error( 'cat_name', __('You did not enter a category name.') )
+		) );
+		$x->send();
+	}
+
+	if ( category_exists( trim( $_POST['cat_name'] ) ) ) {
+		$x = new WP_Ajax_Response( array(
+			'what' => 'cat',
+			'id' => new WP_Error( 'cat_exists', __('The category you are trying to create already exists.'), array( 'form-field' => 'cat_name' ) ),
+		) );
+		$x->send();
+	}
+	
+	$cat = wp_insert_category( $_POST, true );
+
+	if ( is_wp_error($cat) ) {
+		$x = new WP_Ajax_Response( array(
+			'what' => 'cat',
+			'id' => $cat
+		) );
+		$x->send();
+	}
+
+	if ( !$cat || (!$cat = get_category( $cat )) )
 		die('0');
+
 	$level = 0;
-	$cat_full_name = $cat->cat_name;
+	$cat_full_name = $cat->name;
 	$_cat = $cat;
-	while ( $_cat->category_parent ) {
-		$_cat = get_category( $_cat->category_parent );
-		$cat_full_name = $_cat->cat_name . ' &#8212; ' . $cat_full_name;
+	while ( $_cat->parent ) {
+		$_cat = get_category( $_cat->parent );
+		$cat_full_name = $_cat->name . ' &#8212; ' . $cat_full_name;
 		$level++;
 	}
 	$cat_full_name = attribute_escape($cat_full_name);
 
 	$x = new WP_Ajax_Response( array(
 		'what' => 'cat',
-		'id' => $cat->cat_ID,
+		'id' => $cat->term_id,
 		'data' => _cat_row( $cat, $level, $cat_full_name ),
-		'supplemental' => array('name' => $cat_full_name, 'show-link' => sprintf(__( 'Category <a href="#%s">%s</a> added' ), "cat-$cat->cat_ID", $cat_full_name))
+		'supplemental' => array('name' => $cat_full_name, 'show-link' => sprintf(__( 'Category <a href="#%s">%s</a> added' ), "cat-$cat->term_id", $cat_full_name))
+	) );
+	$x->send();
+	break;
+case 'add-link-cat' : // From Blogroll -> Categories
+	check_ajax_referer( 'add-link-category' );
+	if ( !current_user_can( 'manage_categories' ) )
+		die('-1');
+
+	if ( '' === trim($_POST['name']) ) {
+		$x = new WP_Ajax_Response( array(
+			'what' => 'link-cat',
+			'id' => new WP_Error( 'name', __('You did not enter a category name.') )
+		) );
+		$x->send();
+	}
+
+	$r = wp_insert_term($_POST['name'], 'link_category', $_POST );
+	if ( is_wp_error( $r ) ) {
+		$x = new WP_AJAX_Response( array(
+			'what' => 'link-cat',
+			'id' => $r
+		) );
+		$x->send();
+	}
+
+	extract($r, EXTR_SKIP);
+
+	if ( !$link_cat = link_cat_row( $term_id ) )
+		die('0');
+
+	$x = new WP_Ajax_Response( array(
+		'what' => 'link-cat',
+		'id' => $term_id,
+		'data' => $link_cat
+	) );
+	$x->send();
+	break;
+case 'add-tag' : // From Manage->Tags
+	check_ajax_referer( 'add-tag' );
+	if ( !current_user_can( 'manage_categories' ) )
+		die('-1');
+
+	if ( '' === trim($_POST['name']) ) {
+		$x = new WP_Ajax_Response( array(
+			'what' => 'tag',
+			'id' => new WP_Error( 'name', __('You did not enter a tag name.') )
+		) );
+		$x->send();
+	}
+
+	$tag = wp_insert_term($_POST['name'], 'post_tag', $_POST );
+
+	if ( is_wp_error($tag) ) {
+		$x = new WP_Ajax_Response( array(
+			'what' => 'tag',
+			'id' => $tag
+		) );
+		$x->send();
+	}
+
+	if ( !$tag || (!$tag = get_term( $tag['term_id'], 'post_tag' )) )
+		die('0');
+
+	$tag_full_name = $tag->name;
+	$tag_full_name = attribute_escape($tag_full_name);
+
+	$x = new WP_Ajax_Response( array(
+		'what' => 'tag',
+		'id' => $tag->term_id,
+		'data' => _tag_row( $tag ),
+		'supplemental' => array('name' => $tag_full_name, 'show-link' => sprintf(__( 'Tag <a href="#%s">%s</a> added' ), "tag-$tag->term_id", $tag_full_name))
 	) );
 	$x->send();
 	break;
 case 'add-comment' :
+	check_ajax_referer( $action );
 	if ( !current_user_can( 'edit_post', $id ) )
 		die('-1');
 	$search = isset($_POST['s']) ? $_POST['s'] : false;
-	$start = isset($_POST['page']) ? intval($_POST['page']) * 25 : 25;
+	$start = isset($_POST['page']) ? intval($_POST['page']) * 25 - 1: 24;
+	$status = isset($_POST['comment_status']) ? $_POST['comment_status'] : false;
+	$mode = isset($_POST['mode']) ? $_POST['mode'] : 'detail';
 
-	list($comments, $total) = _wp_get_comment_list( $search, $start, 1 );
+	list($comments, $total) = _wp_get_comment_list( $status, $search, $start, 1 );
 
 	if ( !$comments )
 		die('1');
@@ -165,7 +356,7 @@
 	foreach ( (array) $comments as $comment ) {
 		get_comment( $comment );
 		ob_start();
-			_wp_comment_list_item( $comment->comment_ID );
+			_wp_comment_row( $comment->comment_ID, $mode, false );
 			$comment_list_item = ob_get_contents();
 		ob_end_clean();
 		$x->add( array(
@@ -177,93 +368,140 @@
 	$x->send();
 	break;
 case 'add-meta' :
-	if ( !current_user_can( 'edit_post', $id ) )
-		die('-1');
-	if ( $id < 0 ) {
-		$now = current_time('timestamp', 1);
-		if ( $pid = wp_insert_post( array(
-			'post_title' => sprintf('Draft created on %s at %s', date(get_option('date_format'), $now), date(get_option('time_format'), $now))
-		) ) )
-			$mid = add_meta( $pid );
-		else
+	check_ajax_referer( 'add-meta' );
+	$c = 0;
+	$pid = (int) $_POST['post_id'];
+	if ( isset($_POST['metakeyselect']) || isset($_POST['metakeyinput']) ) {
+		if ( !current_user_can( 'edit_post', $pid ) )
+			die('-1');
+		if ( '#NONE#' == $_POST['metakeyselect'] && empty($_POST['metakeyinput']) )
+			die('1');
+		if ( $pid < 0 ) {
+			$now = current_time('timestamp', 1);
+			if ( $pid = wp_insert_post( array(
+				'post_title' => sprintf('Draft created on %s at %s', date(get_option('date_format'), $now), date(get_option('time_format'), $now))
+			) ) ) {
+				if ( is_wp_error( $pid ) ) {
+					$x = new WP_Ajax_Response( array(
+						'what' => 'meta',
+						'data' => $pid
+					) );
+					$x->send();
+				}
+				$mid = add_meta( $pid );
+			} else {
+				die('0');
+			}
+		} else if ( !$mid = add_meta( $pid ) ) {
 			die('0');
-	} else if ( !$mid = add_meta( $id ) ) {
-		die('0');
-	}
-
-	$meta = get_post_meta_by_id( $mid );
-	$key = $meta->meta_key;
-	$value = $meta->meta_value;
-	$pid = (int) $meta->post_id;
+		}
 
-	$x = new WP_Ajax_Response( array(
-		'what' => 'meta',
-		'id' => $mid,
-		'data' => wp_ajax_meta_row( $pid, $mid, $key, $value ),
-		'supplemental' => array('postid' => $pid)
-	) );
-	$x->send();
-	break;
-case 'update-meta' :
-	$mid = (int) array_pop(array_keys($_POST['meta']));
-	$key = $_POST['meta'][$mid]['key'];
-	$value = $_POST['meta'][$mid]['value'];
-	if ( !$meta = get_post_meta_by_id( $mid ) )
-		die('0'); // if meta doesn't exist
-	if ( !current_user_can( 'edit_post', $meta->post_id ) )
-		die('-1');
-	if ( $u = update_meta( $mid, $key, $value ) ) {
+		$meta = get_post_meta_by_id( $mid );
+		$pid = (int) $meta->post_id;
+		$meta = get_object_vars( $meta );
+		$x = new WP_Ajax_Response( array(
+			'what' => 'meta',
+			'id' => $mid,
+			'data' => _list_meta_row( $meta, $c ),
+			'position' => 1,
+			'supplemental' => array('postid' => $pid)
+		) );
+	} else {
+		$mid = (int) array_pop(array_keys($_POST['meta']));
+		$key = $_POST['meta'][$mid]['key'];
+		$value = $_POST['meta'][$mid]['value'];
+		if ( !$meta = get_post_meta_by_id( $mid ) )
+			die('0'); // if meta doesn't exist
+		if ( !current_user_can( 'edit_post', $meta->post_id ) )
+			die('-1');
+		if ( !$u = update_meta( $mid, $key, $value ) )
+			die('1'); // We know meta exists; we also know it's unchanged (or DB error, in which case there are bigger problems).
 		$key = stripslashes($key);
 		$value = stripslashes($value);
 		$x = new WP_Ajax_Response( array(
 			'what' => 'meta',
-			'id' => $mid,
-			'data' => wp_ajax_meta_row( $meta->post_id, $mid, $key, $value ),
+			'id' => $mid, 'old_id' => $mid,
+			'data' => _list_meta_row( array(
+				'meta_key' => $key,
+				'meta_value' => $value,
+				'meta_id' => $mid
+			), $c ),
+			'position' => 0,
 			'supplemental' => array('postid' => $meta->post_id)
 		) );
-		$x->send();
 	}
-	die('1'); // We know meta exists; we also know it's unchanged (or DB error, in which case there are bigger problems).
+	$x->send();
 	break;
 case 'add-user' :
+	check_ajax_referer( $action );
 	if ( !current_user_can('edit_users') )
 		die('-1');
 	require_once(ABSPATH . WPINC . '/registration.php');
 	if ( !$user_id = add_user() )
 		die('0');
 	elseif ( is_wp_error( $user_id ) ) {
-		foreach( $user_id->get_error_messages() as $message )
-			echo "<p>$message<p>";
-		exit;
+		$x = new WP_Ajax_Response( array(
+			'what' => 'user',
+			'id' => $user_id
+		) );
+		$x->send();
 	}
 	$user_object = new WP_User( $user_id );
+
 	$x = new WP_Ajax_Response( array(
 		'what' => 'user',
 		'id' => $user_id,
-		'data' => user_row( $user_object ),
-		'supplemental' => array('show-link' => sprintf(__( 'User <a href="#%s">%s</a> added' ), "user-$user_id", $user_object->user_login))
+		'data' => user_row( $user_object, '', $user_object->roles[0] ),
+		'supplemental' => array(
+			'show-link' => sprintf(__( 'User <a href="#%s">%s</a> added' ), "user-$user_id", $user_object->user_login),
+			'role' => $user_object->roles[0]
+		)
 	) );
 	$x->send();
 	break;
 case 'autosave' : // The name of this action is hardcoded in edit_post()
-	$_POST['post_content'] = $_POST['content'];
-	$_POST['post_excerpt'] = $_POST['excerpt'];
+	$nonce_age = check_ajax_referer( 'autosave', 'autosavenonce');
+	global $current_user;
+
 	$_POST['post_status'] = 'draft';
 	$_POST['post_category'] = explode(",", $_POST['catslist']);
+	$_POST['tags_input'] = explode(",", $_POST['tags_input']);
 	if($_POST['post_type'] == 'page' || empty($_POST['post_category']))
 		unset($_POST['post_category']);
 
+	$do_autosave = (bool) $_POST['autosave'];
+	$do_lock = true;
+
+	$data = '';
+	$message = sprintf( __('Draft Saved at %s.'), date( __('g:i:s a'), current_time( 'timestamp', true ) ) );
+
+	$supplemental = array();
+
+	$id = 0;
 	if($_POST['post_ID'] < 0) {
 		$_POST['temp_ID'] = $_POST['post_ID'];
-		$id = wp_write_post();
-		if( is_wp_error($id) )
-			die($id->get_error_message());
-		else
-			die("$id");
+		if ( $do_autosave ) {
+			$id = wp_write_post();
+			$data = $message;
+		}
 	} else {
 		$post_ID = (int) $_POST['post_ID'];
 		$_POST['ID'] = $post_ID;
 		$post = get_post($post_ID);
+
+		if ( $last = wp_check_post_lock( $post->ID ) ) {
+			$do_autosave = $do_lock = false;
+
+			$last_user = get_userdata( $last );
+			$last_user_name = $last_user ? $last_user->display_name : __( 'Someone' );
+			$data = new WP_Error( 'locked', sprintf(
+				$_POST['post_type'] == 'page' ? __( 'Autosave disabled: %s is currently editing this page.' ) : __( 'Autosave disabled: %s is currently editing this post.' ),
+				wp_specialchars( $last_user_name )
+			) );
+
+			$supplemental['disable_autosave'] = 'disable';
+		}
+
 		if ( 'page' == $post->post_type ) {
 			if ( !current_user_can('edit_page', $post_ID) )
 				die(__('You are not allowed to edit this page.'));
@@ -271,11 +509,40 @@
 			if ( !current_user_can('edit_post', $post_ID) )
 				die(__('You are not allowed to edit this post.'));
 		}
-		wp_update_post($_POST);
+		if ( $do_autosave ) {
+			$id = edit_post();
+			$data = $message;
+		} else {
+			$id = $post->ID;
+		}
 	}
-	die('0');
-break;
+
+	if ( $do_lock && $id && is_numeric($id) )
+		wp_set_post_lock( $id );
+
+	if ( $nonce_age == 2 ) {
+		$supplemental['replace-autosavenonce'] = wp_create_nonce('autosave');
+		$supplemental['replace-getpermalinknonce'] = wp_create_nonce('getpermalink');
+		$supplemental['replace-samplepermalinknonce'] = wp_create_nonce('samplepermalink');
+		$supplemental['replace-closedpostboxesnonce'] = wp_create_nonce('closedpostboxes');
+		if ( $id ) {
+			if ( $_POST['post_type'] == 'post' )
+				$supplemental['replace-_wpnonce'] = wp_create_nonce('update-post_' . $id);
+			elseif ( $_POST['post_type'] == 'page' )
+				$supplemental['replace-_wpnonce'] = wp_create_nonce('update-page_' . $id);
+		}
+	}
+
+	$x = new WP_Ajax_Response( array(
+		'what' => 'autosave',
+		'id' => $id,
+		'data' => $id ? $data : '',
+		'supplemental' => $supplemental
+	) );
+	$x->send();
+	break;
 case 'autosave-generate-nonces' :
+	check_ajax_referer( 'autosave', 'autosavenonce' );
 	$ID = (int) $_POST['post_ID'];
 	if($_POST['post_type'] == 'post') {
 		if(current_user_can('edit_post', $ID))
@@ -286,7 +553,31 @@
 			die(wp_create_nonce('update-page_' . $ID));
 		}
 	}
-	die($_POST['post_type']);
+	die('0');
+break;
+case 'closed-postboxes' :
+	check_ajax_referer( 'closedpostboxes', 'closedpostboxesnonce' );
+	$closed = isset( $_POST['closed'] )? $_POST['closed'] : '';
+	$closed = explode( ',', $_POST['closed'] );
+	$page = isset( $_POST['page'] )? $_POST['page'] : '';
+	if ( !preg_match( '/^[a-z-]+$/', $page ) ) {
+		die(-1);
+	}
+	if (!is_array($closed)) break;
+	$current_user = wp_get_current_user();
+	update_usermeta($current_user->ID, 'closedpostboxes_'.$page, $closed);
+break;
+case 'get-permalink':
+	check_ajax_referer( 'getpermalink', 'getpermalinknonce' );
+	$post_id = isset($_POST['post_id'])? intval($_POST['post_id']) : 0;
+	die(add_query_arg(array('preview' => 'true'), get_permalink($post_id)));
+break;
+case 'sample-permalink':
+	check_ajax_referer( 'samplepermalink', 'samplepermalinknonce' );
+	$post_id = isset($_POST['post_id'])? intval($_POST['post_id']) : 0;
+	$title = isset($_POST['new_title'])? $_POST['new_title'] : '';
+	$slug = isset($_POST['new_slug'])? $_POST['new_slug'] : '';
+	die(get_sample_permalink_html($post_id, $title, $slug));
 break;
 default :
 	do_action( 'wp_ajax_' . $_POST['action'] );
diff -x .svn -aruN 2.2.2.src/wp-admin/admin-db.php 2.5.src/wp-admin/admin-db.php
--- 2.2.2.src/wp-admin/admin-db.php	2007-07-13 13:30:06.000000000 -0500
+++ 2.5.src/wp-admin/admin-db.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,525 +0,0 @@
-<?php
-
-function get_users_drafts( $user_id ) {
-	global $wpdb;
-	$user_id = (int) $user_id;
-	$query = "SELECT ID, post_title FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'draft' AND post_author = $user_id ORDER BY ID DESC";
-	$query = apply_filters('get_users_drafts', $query);
-	return $wpdb->get_results( $query );
-}
-
-function get_others_drafts( $user_id ) {
-	global $wpdb;
-	$user = get_userdata( $user_id );
-	$level_key = $wpdb->prefix . 'user_level';
-
-	$editable = get_editable_user_ids( $user_id );
-
-	if( !$editable ) {
-		$other_drafts = '';
-	} else {
-		$editable = join(',', $editable);
-		$other_drafts = $wpdb->get_results("SELECT ID, post_title FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'draft' AND post_author IN ($editable) AND post_author != '$user_id' ");
-	}
-
-	return apply_filters('get_others_drafts', $other_drafts);
-}
-
-function get_editable_authors( $user_id ) {
-	global $wpdb;
-
-	$editable = get_editable_user_ids( $user_id );
-
-	if( !$editable ) {
-		return false;
-	} else {
-		$editable = join(',', $editable);
-		$authors = $wpdb->get_results( "SELECT * FROM $wpdb->users WHERE ID IN ($editable) ORDER BY display_name" );
-	}
-
-	return apply_filters('get_editable_authors', $authors);
-}
-
-function get_editable_user_ids( $user_id, $exclude_zeros = true ) {
-	global $wpdb;
-
-	$user = new WP_User( $user_id );
-
-	if ( ! $user->has_cap('edit_others_posts') ) {
-		if ( $user->has_cap('edit_posts') || $exclude_zeros == false )
-			return array($user->id);
-		else
-			return false;
-	}
-
-	$level_key = $wpdb->prefix . 'user_level';
-
-	$query = "SELECT user_id FROM $wpdb->usermeta WHERE meta_key = '$level_key'";
-	if ( $exclude_zeros )
-		$query .= " AND meta_value != '0'";
-
-	return $wpdb->get_col( $query );
-}
-
-function get_author_user_ids() {
-	global $wpdb;
-	$level_key = $wpdb->prefix . 'user_level';
-
-	$query = "SELECT user_id FROM $wpdb->usermeta WHERE meta_key = '$level_key' AND meta_value != '0'";
-
-	return $wpdb->get_col( $query );
-}
-
-function get_nonauthor_user_ids() {
-	global $wpdb;
-	$level_key = $wpdb->prefix . 'user_level';
-
-	$query = "SELECT user_id FROM $wpdb->usermeta WHERE meta_key = '$level_key' AND meta_value = '0'";
-
-	return $wpdb->get_col( $query );
-}
-
-function wp_insert_category($catarr) {
-	global $wpdb;
-
-	extract($catarr, EXTR_SKIP);
-
-	if( trim( $cat_name ) == '' )
-		return 0;
-
-	$cat_ID = (int) $cat_ID;
-
-	// Are we updating or creating?
-	if (!empty ($cat_ID))
-		$update = true;
-	else
-		$update = false;
-
-	$cat_name = apply_filters('pre_category_name', $cat_name);
-
-	if (empty ($category_nicename))
-		$category_nicename = sanitize_title($cat_name);
-	else
-		$category_nicename = sanitize_title($category_nicename);
-	$category_nicename = apply_filters('pre_category_nicename', $category_nicename);
-
-	if (empty ($category_description))
-		$category_description = '';
-	$category_description = apply_filters('pre_category_description', $category_description);
-
-	$category_parent = (int) $category_parent;
-	if ( empty($category_parent) || !get_category( $category_parent ) || ($cat_ID && cat_is_ancestor_of($cat_ID, $category_parent) ) )
-		$category_parent = 0;
-
-	if ( isset($posts_private) )
-		$posts_private = (int) $posts_private;
-	else
-		$posts_private = 0;
-
-	if ( isset($links_private) )
-		$links_private = (int) $links_private;
-	else
-		$links_private = 0;
-
-	if (!$update) {
-		$wpdb->query("INSERT INTO $wpdb->categories (cat_ID, cat_name, category_nicename, category_description, category_parent, links_private, posts_private) VALUES ('0', '$cat_name', '$category_nicename', '$category_description', '$category_parent', '$links_private', '$posts_private')");
-		$cat_ID = (int) $wpdb->insert_id;
-	} else {
-		$wpdb->query ("UPDATE $wpdb->categories SET cat_name = '$cat_name', category_nicename = '$category_nicename', category_description = '$category_description', category_parent = '$category_parent', links_private = '$links_private', posts_private = '$posts_private' WHERE cat_ID = '$cat_ID'");
-	}
-
-	if ( $category_nicename == '' ) {
-		$category_nicename = sanitize_title($cat_name, $cat_ID );
-		$wpdb->query( "UPDATE $wpdb->categories SET category_nicename = '$category_nicename' WHERE cat_ID = '$cat_ID'" );
-	}
-
-	// Keep in mind when using this filter and altering the cat_ID that the two queries above
-	// have already taken place with the OLD cat_ID
-	// Also note that you may have post2cat entries with the old cat_ID if this is an update
-
-	if ($update) {
-		do_action('edit_category', $cat_ID);
-	} else {
-		do_action('create_category', $cat_ID);
-		do_action('add_category', $cat_ID);
-	}
-
-	$cat_ID = apply_filters('cat_id_filter', $cat_ID, $update);
-
-	clean_category_cache($cat_ID);
-
-	if ($update)
-		do_action('edited_category', $cat_ID);
-	else
-		do_action('created_category', $cat_ID);
-	
-	return $cat_ID;
-}
-
-function wp_update_category($catarr) {
-	global $wpdb;
-
-	$cat_ID = (int) $catarr['cat_ID'];
-
-	if( $cat_ID == $catarr['category_parent'] )
-		return false;
-
-	// First, get all of the original fields
-	$category = get_category($cat_ID, ARRAY_A);
-
-	// Escape data pulled from DB.
-	$category = add_magic_quotes($category);
-
-	// Merge old and new fields with new fields overwriting old ones.
-	$catarr = array_merge($category, $catarr);
-
-	return wp_insert_category($catarr);
-}
-
-function wp_delete_category($cat_ID) {
-	global $wpdb;
-
-	$cat_ID = (int) $cat_ID;
-	$default_cat = get_option('default_category');
-	$default_link_cat = get_option('default_link_category');
-
-	// Don't delete either of the default cats
-	if ( $cat_ID == $default_cat || $cat_ID == $default_link_cat )
-		return 0;
-
-	$category = get_category($cat_ID);
-
-	$parent = $category->category_parent;
-
-	// Delete the category
-	if ( !$wpdb->query("DELETE FROM $wpdb->categories WHERE cat_ID = '$cat_ID'") )
-		return 0;
-
-	// Update children to point to new parent
-	$wpdb->query("UPDATE $wpdb->categories SET category_parent = '$parent' WHERE category_parent = '$cat_ID'");
-
-	// Only set posts and links to the default category if they're not in another category already
-	$posts = $wpdb->get_col("SELECT post_id FROM $wpdb->post2cat WHERE category_id='$cat_ID'");
-	foreach ( (array) $posts as $post_id ) {
-		$cats = wp_get_post_categories($post_id);
-		if ( 1 == count($cats) )
-			$cats = array($default_cat);
-		else
-			$cats = array_diff($cats, array($cat_ID));
-		wp_set_post_categories($post_id, $cats);
-	}
-
-	$links = $wpdb->get_col("SELECT link_id FROM $wpdb->link2cat WHERE category_id='$cat_ID'");
-	foreach ( (array) $links as $link_id ) {
-		$cats = wp_get_link_cats($link_id);
-		if ( 1 == count($cats) )
-			$cats = array($default_link_cat);
-		else
-			$cats = array_diff($cats, array($cat_ID));
-		wp_set_link_cats($link_id, $cats);
-	}
-
-	clean_category_cache($cat_ID);
-	do_action('delete_category', $cat_ID);
-	return 1;
-}
-
-function wp_create_category($cat_name) {
-	$cat_array = compact('cat_name');
-	return wp_insert_category($cat_array);
-}
-
-function wp_create_categories($categories, $post_id = '') {
-	$cat_ids = array ();
-	foreach ($categories as $category) {
-		if ($id = category_exists($category))
-			$cat_ids[] = $id;
-		else
-			if ($id = wp_create_category($category))
-				$cat_ids[] = $id;
-	}
-
-	if ($post_id)
-		wp_set_post_categories($post_id, $cat_ids);
-
-	return $cat_ids;
-}
-
-function category_exists($cat_name) {
-	global $wpdb;
-	if (!$category_nicename = sanitize_title($cat_name))
-		return 0;
-
-	return (int) $wpdb->get_var("SELECT cat_ID FROM $wpdb->categories WHERE category_nicename = '$category_nicename'");
-}
-
-function wp_delete_user($id, $reassign = 'novalue') {
-	global $wpdb;
-
-	$id = (int) $id;
-	$user = get_userdata($id);
-
-	if ($reassign == 'novalue') {
-		$post_ids = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE post_author = $id");
-
-		if ($post_ids) {
-			foreach ($post_ids as $post_id)
-				wp_delete_post($post_id);
-		}
-
-		// Clean links
-		$wpdb->query("DELETE FROM $wpdb->links WHERE link_owner = $id");
-	} else {
-		$reassign = (int) $reassign;
-		$wpdb->query("UPDATE $wpdb->posts SET post_author = {$reassign} WHERE post_author = {$id}");
-		$wpdb->query("UPDATE $wpdb->links SET link_owner = {$reassign} WHERE link_owner = {$id}");
-	}
-
-	// FINALLY, delete user
-	do_action('delete_user', $id);
-
-	$wpdb->query("DELETE FROM $wpdb->users WHERE ID = $id");
-	$wpdb->query("DELETE FROM $wpdb->usermeta WHERE user_id = '$id'");
-
-	wp_cache_delete($id, 'users');
-	wp_cache_delete($user->user_login, 'userlogins');
-
-	return true;
-}
-
-function wp_revoke_user($id) {
-	$id = (int) $id;
-
-	$user = new WP_User($id);
-	$user->remove_all_caps();
-}
-
-function wp_insert_link($linkdata) {
-	global $wpdb, $current_user;
-
-	extract($linkdata, EXTR_SKIP);
-
-	$update = false;
-
-	if ( !empty($link_id) )
-		$update = true;
-
-	$link_id = (int) $link_id;
-
-	if( trim( $link_name ) == '' )
-		return 0;
-	$link_name = apply_filters('pre_link_name', $link_name);
-
-	if( trim( $link_url ) == '' )
-		return 0;
-	$link_url = apply_filters('pre_link_url', $link_url);
-
-	if ( empty($link_rating) )
-		$link_rating = 0;
-	else
-		$link_rating = (int) $link_rating;
-
-	if ( empty($link_image) )
-		$link_image = '';
-	$link_image = apply_filters('pre_link_image', $link_image);
-
-	if ( empty($link_target) )
-		$link_target = '';
-	$link_target = apply_filters('pre_link_target', $link_target);
-
-	if ( empty($link_visible) )
-		$link_visible = 'Y';
-	$link_visibile = preg_replace('/[^YNyn]/', '', $link_visible);
-
-	if ( empty($link_owner) )
-		$link_owner = $current_user->id;
-	else
-		$link_owner = (int) $link_owner;
-
-	if ( empty($link_notes) )
-		$link_notes = '';
-	$link_notes = apply_filters('pre_link_notes', $link_notes);
-
-	if ( empty($link_description) )
-		$link_description = '';
-	$link_description = apply_filters('pre_link_description', $link_description);
-
-	if ( empty($link_rss) )
-		$link_rss = '';
-	$link_rss = apply_filters('pre_link_rss', $link_rss);
-
-	if ( empty($link_rel) )
-		$link_rel = '';
-	$link_rel = apply_filters('pre_link_rel', $link_rel);
-
-	// Make sure we set a valid category
-	if (0 == count($link_category) || !is_array($link_category)) {
-		$link_category = array(get_option('default_link_category'));
-	}
-
-	if ( $update ) {
-		$wpdb->query("UPDATE $wpdb->links SET link_url='$link_url',
-			link_name='$link_name', link_image='$link_image',
-			link_target='$link_target',
-			link_visible='$link_visible', link_description='$link_description',
-			link_rating='$link_rating', link_rel='$link_rel',
-			link_notes='$link_notes', link_rss = '$link_rss'
-			WHERE link_id='$link_id'");
-	} else {
-		$wpdb->query("INSERT INTO $wpdb->links (link_url, link_name, link_image, link_target, link_description, link_visible, link_owner, link_rating, link_rel, link_notes, link_rss) VALUES('$link_url','$link_name', '$link_image', '$link_target', '$link_description', '$link_visible', '$link_owner', '$link_rating', '$link_rel', '$link_notes', '$link_rss')");
-		$link_id = (int) $wpdb->insert_id;
-	}
-
-	wp_set_link_cats($link_id, $link_category);
-
-	if ( $update )
-		do_action('edit_link', $link_id);
-	else
-		do_action('add_link', $link_id);
-
-	return $link_id;
-}
-
-function wp_update_link($linkdata) {
-	global $wpdb;
-
-	$link_id = (int) $linkdata['link_id'];
-
-	$link = get_link($link_id, ARRAY_A);
-
-	// Escape data pulled from DB.
-	$link = add_magic_quotes($link);
-
-	// Passed link category list overwrites existing category list if not empty.
-	if ( isset($linkdata['link_category']) && is_array($linkdata['link_category'])
-			 && 0 != count($linkdata['link_category']) )
-		$link_cats = $linkdata['link_category'];
-	else
-		$link_cats = $link['link_category'];
-
-	// Merge old and new fields with new fields overwriting old ones.
-	$linkdata = array_merge($link, $linkdata);
-	$linkdata['link_category'] = $link_cats;
-
-	return wp_insert_link($linkdata);
-}
-
-function wp_delete_link($link_id) {
-	global $wpdb;
-
-	do_action('delete_link', $link_id);
-
-	$categories = wp_get_link_cats($link_id);
-	if( is_array( $categories ) ) {
-		foreach ( $categories as $category ) {
-			$wpdb->query("UPDATE $wpdb->categories SET link_count = link_count - 1 WHERE cat_ID = '$category'");
-			wp_cache_delete($category, 'category');
-			do_action('edit_category', $cat_id);
-		}
-	}
-
-	$wpdb->query("DELETE FROM $wpdb->link2cat WHERE link_id = '$link_id'");
-	$wpdb->query("DELETE FROM $wpdb->links WHERE link_id = '$link_id'");
-	
-	do_action('deleted_link', $link_id);
-
-	return true;
-}
-
-function wp_get_link_cats($link_ID = 0) {
-	global $wpdb;
-
-	$sql = "SELECT category_id
-		FROM $wpdb->link2cat
-		WHERE link_id = $link_ID
-		ORDER BY category_id";
-
-	$result = $wpdb->get_col($sql);
-
-	if ( !$result )
-		$result = array();
-
-	return array_unique($result);
-}
-
-function wp_set_link_cats($link_ID = 0, $link_categories = array()) {
-	global $wpdb;
-	// If $link_categories isn't already an array, make it one:
-	if (!is_array($link_categories) || 0 == count($link_categories))
-		$link_categories = array(get_option('default_link_category'));
-
-	$link_categories = array_unique($link_categories);
-
-	// First the old categories
-	$old_categories = $wpdb->get_col("
-		SELECT category_id
-		FROM $wpdb->link2cat
-		WHERE link_id = '$link_ID'");
-
-	if (!$old_categories) {
-		$old_categories = array();
-	} else {
-		$old_categories = array_unique($old_categories);
-	}
-
-	// Delete any?
-	$delete_cats = array_diff($old_categories,$link_categories);
-
-	if ($delete_cats) {
-		foreach ($delete_cats as $del) {
-			$del = (int) $del;
-			$wpdb->query("
-				DELETE FROM $wpdb->link2cat
-				WHERE category_id = '$del'
-					AND link_id = '$link_ID'
-				");
-		}
-	}
-
-	// Add any?
-	$add_cats = array_diff($link_categories, $old_categories);
-
-	if ($add_cats) {
-		foreach ($add_cats as $new_cat) {
-			$new_cat = (int) $new_cat;
-			if ( !empty($new_cat) )
-				$wpdb->query("
-					INSERT INTO $wpdb->link2cat (link_id, category_id)
-					VALUES ('$link_ID', '$new_cat')");
-		}
-	}
-
-	// Update category counts.
-	$all_affected_cats = array_unique(array_merge($link_categories, $old_categories));
-	foreach ( $all_affected_cats as $cat_id ) {
-		$count = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->link2cat, $wpdb->links WHERE $wpdb->links.link_id = $wpdb->link2cat.link_id AND category_id = '$cat_id'");
-		$wpdb->query("UPDATE $wpdb->categories SET link_count = '$count' WHERE cat_ID = '$cat_id'");
-		wp_cache_delete($cat_id, 'category');
-		do_action('edit_category', $cat_id);
-	}
-
-}	// wp_set_link_cats()
-
-function post_exists($title, $content = '', $post_date = '') {
-	global $wpdb;
-
-	if (!empty ($post_date))
-		$post_date = "AND post_date = '$post_date'";
-
-	if (!empty ($title))
-		return $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_title = '$title' $post_date");
-	else
-		if (!empty ($content))
-			return $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_content = '$content' $post_date");
-
-	return 0;
-}
-
-function comment_exists($comment_author, $comment_date) {
-	global $wpdb;
-
-	return $wpdb->get_var("SELECT comment_post_ID FROM $wpdb->comments
-			WHERE comment_author = '$comment_author' AND comment_date = '$comment_date'");
-}
-
-?>
diff -x .svn -aruN 2.2.2.src/wp-admin/admin-footer.php 2.5.src/wp-admin/admin-footer.php
--- 2.2.2.src/wp-admin/admin-footer.php	2006-10-05 20:14:47.000000000 -0500
+++ 2.5.src/wp-admin/admin-footer.php	2008-02-29 17:27:02.000000000 -0600
@@ -1,10 +1,14 @@
-
+</div><!-- wpbody -->
+</div><!-- wpcontent -->
+</div><!-- wpwrap -->
 <div id="footer">
-<p class="logo"><a href="http://wordpress.org/" id="wordpress-logo"><img src="images/wordpress-logo.png" alt="WordPress" /></a></p>
-<p class="docs"><?php _e('<a href="http://codex.wordpress.org/">Documentation</a>'); ?> &#8212; <?php _e('<a href="http://wordpress.org/support/">Support Forums</a>'); ?><br />
-<?php bloginfo('version'); ?> &#8212; <?php printf(__('%s seconds'), timer_stop(0, 2)); ?></p>
+<p><?php
+do_action('in_admin_footer', '');
+$upgrade = apply_filters( 'update_footer', '' );
+echo __('Thank you for creating with <a href="http://wordpress.org/">WordPress</a>').' | '.__('<a href="http://codex.wordpress.org/">Documentation</a>').' | '.__('<a href="http://wordpress.org/support/forum/4">Feedback</a>').' '.$upgrade;
+?></p>
 </div>
 <?php do_action('admin_footer', ''); ?>
 <script type="text/javascript">if(typeof wpOnload=='function')wpOnload();</script>
 </body>
-</html>
\ No newline at end of file
+</html>
diff -x .svn -aruN 2.2.2.src/wp-admin/admin-functions.php 2.5.src/wp-admin/admin-functions.php
--- 2.2.2.src/wp-admin/admin-functions.php	2007-08-02 09:58:15.000000000 -0500
+++ 2.5.src/wp-admin/admin-functions.php	2008-03-21 04:29:22.000000000 -0500
@@ -1,2332 +1,5 @@
 <?php
-
-function write_post() {
-	$result = wp_write_post();
-	if( is_wp_error( $result ) )
-		wp_die( $result->get_error_message() );
-	else
-		return $result;
-}
-
-// Creates a new post from the "Write Post" form using $_POST information.
-function wp_write_post() {
-	global $user_ID;
-
-	if ( 'page' == $_POST['post_type'] ) {
-		if ( !current_user_can( 'edit_pages' ) )
-			return new WP_Error( 'edit_pages', __( 'You are not allowed to create pages on this blog.' ) );
-	} else {
-		if ( !current_user_can( 'edit_posts' ) )
-			return new WP_Error( 'edit_posts', __( 'You are not allowed to create posts or drafts on this blog.' ) );
-	}
-
-
-	// Check for autosave collisions
-	$temp_id = false;
-	if ( isset($_POST['temp_ID']) ) {
-		$temp_id = (int) $_POST['temp_ID'];
-		if ( !$draft_ids = get_user_option( 'autosave_draft_ids' ) )
-			$draft_ids = array();
-		foreach ( $draft_ids as $temp => $real )
-			if ( time() + $temp > 86400 ) // 1 day: $temp is equal to -1 * time( then )
-				unset($draft_ids[$temp]);
-
-		if ( isset($draft_ids[$temp_id]) ) { // Edit, don't write
-			$_POST['post_ID'] = $draft_ids[$temp_id];
-			unset($_POST['temp_ID']);
-			update_user_option( $user_ID, 'autosave_draft_ids', $draft_ids );
-			return edit_post();
-		}
-	}
-
-	// Rename.
-	$_POST['post_content'] = $_POST['content'];
-	$_POST['post_excerpt'] = $_POST['excerpt'];
-	$_POST['post_parent'] = $_POST['parent_id'];
-	$_POST['to_ping'] = $_POST['trackback_url'];
-
-	if (!empty ( $_POST['post_author_override'] ) ) {
-		$_POST['post_author'] = (int) $_POST['post_author_override'];
-	} else {
-		if (!empty ( $_POST['post_author'] ) ) {
-			$_POST['post_author'] = (int) $_POST['post_author'];
-		} else {
-			$_POST['post_author'] = (int) $_POST['user_ID'];
-		}
-
-	}
-
-	if ( $_POST['post_author'] != $_POST['user_ID'] ) {
-		if ( 'page' == $_POST['post_type'] ) {
-			if ( !current_user_can( 'edit_others_pages' ) )
-				return new WP_Error( 'edit_others_pages', __( 'You are not allowed to create pages as this user.' ) );
-		} else {
-			if ( !current_user_can( 'edit_others_posts' ) )
-				return new WP_Error( 'edit_others_posts', __( 'You are not allowed to post as this user.' ) );
-
-		}
-	}
-
-	// What to do based on which button they pressed
-	if ('' != $_POST['saveasdraft'] )
-		$_POST['post_status'] = 'draft';
-	if ('' != $_POST['saveasprivate'] )
-		$_POST['post_status'] = 'private';
-	if ('' != $_POST['publish'] )
-		$_POST['post_status'] = 'publish';
-	if ('' != $_POST['advanced'] )
-		$_POST['post_status'] = 'draft';
-
-	if ( 'page' == $_POST['post_type'] ) {
-		if ('publish' == $_POST['post_status'] && !current_user_can( 'publish_pages' ) )
-			$_POST['post_status'] = 'draft';
-	} else {
-		if ('publish' == $_POST['post_status'] && !current_user_can( 'publish_posts' ) )
-			$_POST['post_status'] = 'draft';
-	}
-
-	if (!isset( $_POST['comment_status'] ))
-		$_POST['comment_status'] = 'closed';
-
-	if (!isset( $_POST['ping_status'] ))
-		$_POST['ping_status'] = 'closed';
-
-	if (!empty ( $_POST['edit_date'] ) ) {
-		$aa = $_POST['aa'];
-		$mm = $_POST['mm'];
-		$jj = $_POST['jj'];
-		$hh = $_POST['hh'];
-		$mn = $_POST['mn'];
-		$ss = $_POST['ss'];
-		$jj = ($jj > 31 ) ? 31 : $jj;
-		$hh = ($hh > 23 ) ? $hh -24 : $hh;
-		$mn = ($mn > 59 ) ? $mn -60 : $mn;
-		$ss = ($ss > 59 ) ? $ss -60 : $ss;
-		$_POST['post_date'] = sprintf( "%04d-%02d-%02d %02d:%02d:%02d", $aa, $mm, $jj, $hh, $mn, $ss );
-		$_POST['post_date_gmt'] = get_gmt_from_date( $_POST['post_date'] );
-	}
-
-	// Create the post.
-	$post_ID = wp_insert_post( $_POST );
-
-	add_meta( $post_ID );
-
-	// Reunite any orphaned attachments with their parent
-	if ( !$draft_ids = get_user_option( 'autosave_draft_ids' ) )
-		$draft_ids = array();
-	if ( $draft_temp_id = (int) array_search( $post_ID, $draft_ids ) )
-		relocate_children( $draft_temp_id, $post_ID );
-	if ( $temp_id && $temp_id != $draft_temp_id )
-		relocate_children( $temp_id, $post_ID );
-
-	// Update autosave collision detection
-	if ( $temp_id ) {
-		$draft_ids[$temp_id] = $post_ID;
-		update_user_option( $user_ID, 'autosave_draft_ids', $draft_ids );
-	}
-
-	// Now that we have an ID we can fix any attachment anchor hrefs
-	fix_attachment_links( $post_ID );
-
-	return $post_ID;
-}
-
-// Move child posts to a new parent
-function relocate_children( $old_ID, $new_ID ) {
-	global $wpdb;
-	$old_ID = (int) $old_ID;
-	$new_ID = (int) $new_ID;
-	return $wpdb->query( "UPDATE $wpdb->posts SET post_parent = $new_ID WHERE post_parent = $old_ID" );
-}
-
-// Replace hrefs of attachment anchors with up-to-date permalinks.
-function fix_attachment_links( $post_ID ) {
-	global $wp_rewrite;
-
-	$post = & get_post( $post_ID, ARRAY_A );
-
-	$search = "#<a[^>]+rel=('|\")[^'\"]*attachment[^>]*>#ie";
-
-	// See if we have any rel="attachment" links
-	if ( 0 == preg_match_all( $search, $post['post_content'], $anchor_matches, PREG_PATTERN_ORDER ) )
-		return;
-
-	$i = 0;
-	$search = "#[\s]+rel=(\"|')(.*?)wp-att-(\d+)\\1#i";
-	foreach ( $anchor_matches[0] as $anchor ) {
-		if ( 0 == preg_match( $search, $anchor, $id_matches ) )
-			continue;
-
-		$id = (int) $id_matches[3];
-
-		// While we have the attachment ID, let's adopt any orphans.
-		$attachment = & get_post( $id, ARRAY_A );
-		if ( ! empty( $attachment) && ! is_object( get_post( $attachment['post_parent'] ) ) ) {
-			$attachment['post_parent'] = $post_ID;
-			// Escape data pulled from DB.
-			$attachment = add_magic_quotes( $attachment);
-			wp_update_post( $attachment);
-		}
-
-		$post_search[$i] = $anchor;
-		$post_replace[$i] = preg_replace( "#href=(\"|')[^'\"]*\\1#e", "stripslashes( 'href=\\1' ).get_attachment_link( $id ).stripslashes( '\\1' )", $anchor );
-		++$i;
-	}
-
-	$post['post_content'] = str_replace( $post_search, $post_replace, $post['post_content'] );
-
-	// Escape data pulled from DB.
-	$post = add_magic_quotes( $post);
-
-	return wp_update_post( $post);
-}
-
-// Update an existing post with values provided in $_POST.
-function edit_post() {
-	global $user_ID;
-
-	$post_ID = (int) $_POST['post_ID'];
-
-	if ( 'page' == $_POST['post_type'] ) {
-		if ( !current_user_can( 'edit_page', $post_ID ) )
-			wp_die( __('You are not allowed to edit this page.' ));
-	} else {
-		if ( !current_user_can( 'edit_post', $post_ID ) )
-			wp_die( __('You are not allowed to edit this post.' ));
-	}
-
-	// Autosave shouldn't save too soon after a real save
-	if ( 'autosave' == $_POST['action'] ) {
-		$post =& get_post( $post_ID );
-		$now = time();
-		$then = strtotime($post->post_date_gmt . ' +0000');
-		// Keep autosave_interval in sync with autosave-js.php.
-		$delta = apply_filters( 'autosave_interval', 120 ) / 2;
-		if ( ($now - $then) < $delta )
-			return $post_ID;
-	}
-
-	// Rename.
-	$_POST['ID'] = (int) $_POST['post_ID'];
-	$_POST['post_content'] = $_POST['content'];
-	$_POST['post_excerpt'] = $_POST['excerpt'];
-	$_POST['post_parent'] = $_POST['parent_id'];
-	$_POST['to_ping'] = $_POST['trackback_url'];
-
-	if (!empty ( $_POST['post_author_override'] ) ) {
-		$_POST['post_author'] = (int) $_POST['post_author_override'];
-	} else
-		if (!empty ( $_POST['post_author'] ) ) {
-			$_POST['post_author'] = (int) $_POST['post_author'];
-		} else {
-			$_POST['post_author'] = (int) $_POST['user_ID'];
-		}
-
-	if ( $_POST['post_author'] != $_POST['user_ID'] ) {
-		if ( 'page' == $_POST['post_type'] ) {
-			if ( !current_user_can( 'edit_others_pages' ) )
-				wp_die( __('You are not allowed to edit pages as this user.' ));
-		} else {
-			if ( !current_user_can( 'edit_others_posts' ) )
-				wp_die( __('You are not allowed to edit posts as this user.' ));
-
-		}
-	}
-
-	// What to do based on which button they pressed
-	if ('' != $_POST['saveasdraft'] )
-		$_POST['post_status'] = 'draft';
-	if ('' != $_POST['saveasprivate'] )
-		$_POST['post_status'] = 'private';
-	if ('' != $_POST['publish'] )
-		$_POST['post_status'] = 'publish';
-	if ('' != $_POST['advanced'] )
-		$_POST['post_status'] = 'draft';
-
-	if ( 'page' == $_POST['post_type'] ) {
-		if ('publish' == $_POST['post_status'] && !current_user_can( 'edit_published_pages' ))
-			$_POST['post_status'] = 'draft';
-	} else {
-		if ('publish' == $_POST['post_status'] && !current_user_can( 'edit_published_posts' ))
-			$_POST['post_status'] = 'draft';
-	}
-
-	if (!isset( $_POST['comment_status'] ))
-		$_POST['comment_status'] = 'closed';
-
-	if (!isset( $_POST['ping_status'] ))
-		$_POST['ping_status'] = 'closed';
-
-	if (!empty ( $_POST['edit_date'] ) ) {
-		$aa = $_POST['aa'];
-		$mm = $_POST['mm'];
-		$jj = $_POST['jj'];
-		$hh = $_POST['hh'];
-		$mn = $_POST['mn'];
-		$ss = $_POST['ss'];
-		$jj = ($jj > 31 ) ? 31 : $jj;
-		$hh = ($hh > 23 ) ? $hh -24 : $hh;
-		$mn = ($mn > 59 ) ? $mn -60 : $mn;
-		$ss = ($ss > 59 ) ? $ss -60 : $ss;
-		$_POST['post_date'] = "$aa-$mm-$jj $hh:$mn:$ss";
-		$_POST['post_date_gmt'] = get_gmt_from_date( "$aa-$mm-$jj $hh:$mn:$ss" );
-	}
-
-	// Meta Stuff
-	if ( $_POST['meta'] ) {
-		foreach ( $_POST['meta'] as $key => $value )
-			update_meta( $key, $value['key'], $value['value'] );
-	}
-
-	if ( $_POST['deletemeta'] ) {
-		foreach ( $_POST['deletemeta'] as $key => $value )
-			delete_meta( $key );
-	}
-
-	add_meta( $post_ID );
-
-	wp_update_post( $_POST );
-
-	// Reunite any orphaned attachments with their parent
-	if ( !$draft_ids = get_user_option( 'autosave_draft_ids' ) )
-		$draft_ids = array();
-	if ( $draft_temp_id = (int) array_search( $post_ID, $draft_ids ) )
-		relocate_children( $draft_temp_id, $post_ID );
-
-	// Now that we have an ID we can fix any attachment anchor hrefs
-	fix_attachment_links( $post_ID );
-
-	return $post_ID;
-}
-
-function edit_comment() {
-	global $user_ID;
-
-	$comment_ID = (int) $_POST['comment_ID'];
-	$comment_post_ID = (int) $_POST['comment_post_ID'];
-
-	if (!current_user_can( 'edit_post', $comment_post_ID ))
-		wp_die( __('You are not allowed to edit comments on this post, so you cannot edit this comment.' ));
-
-	$_POST['comment_author'] = $_POST['newcomment_author'];
-	$_POST['comment_author_email'] = $_POST['newcomment_author_email'];
-	$_POST['comment_author_url'] = $_POST['newcomment_author_url'];
-	$_POST['comment_approved'] = $_POST['comment_status'];
-	$_POST['comment_content'] = $_POST['content'];
-	$_POST['comment_ID'] = (int) $_POST['comment_ID'];
-
-	if (!empty ( $_POST['edit_date'] ) ) {
-		$aa = $_POST['aa'];
-		$mm = $_POST['mm'];
-		$jj = $_POST['jj'];
-		$hh = $_POST['hh'];
-		$mn = $_POST['mn'];
-		$ss = $_POST['ss'];
-		$jj = ($jj > 31 ) ? 31 : $jj;
-		$hh = ($hh > 23 ) ? $hh -24 : $hh;
-		$mn = ($mn > 59 ) ? $mn -60 : $mn;
-		$ss = ($ss > 59 ) ? $ss -60 : $ss;
-		$_POST['comment_date'] = "$aa-$mm-$jj $hh:$mn:$ss";
-	}
-
-	wp_update_comment( $_POST);
-}
-
-// Get an existing post and format it for editing.
-function get_post_to_edit( $id ) {
-
-	$post = get_post( $id );
-
-	$post->post_content = format_to_edit( $post->post_content, user_can_richedit() );
-	$post->post_content = apply_filters( 'content_edit_pre', $post->post_content);
-
-	$post->post_excerpt = format_to_edit( $post->post_excerpt);
-	$post->post_excerpt = apply_filters( 'excerpt_edit_pre', $post->post_excerpt);
-
-	$post->post_title = format_to_edit( $post->post_title );
-	$post->post_title = apply_filters( 'title_edit_pre', $post->post_title );
-
-	$post->post_password = format_to_edit( $post->post_password );
-	
-	$post->menu_order = (int) $post->menu_order;
-
-	if ( $post->post_type == 'page' )
-		$post->page_template = get_post_meta( $id, '_wp_page_template', true );
-
-	return $post;
-}
-
-// Default post information to use when populating the "Write Post" form.
-function get_default_post_to_edit() {
-	if ( !empty( $_REQUEST['post_title'] ) )
-		$post_title = wp_specialchars( stripslashes( $_REQUEST['post_title'] ));
-	else if ( !empty( $_REQUEST['popuptitle'] ) ) {
-		$post_title = wp_specialchars( stripslashes( $_REQUEST['popuptitle'] ));
-		$post_title = funky_javascript_fix( $post_title );
-	} else {
-		$post_title = '';
-	}
-
-	if ( !empty( $_REQUEST['content'] ) )
-		$post_content = wp_specialchars( stripslashes( $_REQUEST['content'] ));
-	else if ( !empty( $post_title ) ) {
-		$text       = wp_specialchars( stripslashes( urldecode( $_REQUEST['text'] ) ) );
-		$text       = funky_javascript_fix( $text);
-		$popupurl   = clean_url($_REQUEST['popupurl']);
-        $post_content = '<a href="'.$popupurl.'">'.$post_title.'</a>'."\n$text";
-    }
-
-	if ( !empty( $_REQUEST['excerpt'] ) )
-		$post_excerpt = wp_specialchars( stripslashes( $_REQUEST['excerpt'] ));
-	else
-		$post_excerpt = '';
-
-	$post->post_status = 'draft';
-	$post->comment_status = get_option( 'default_comment_status' );
-	$post->ping_status = get_option( 'default_ping_status' );
-	$post->post_pingback = get_option( 'default_pingback_flag' );
-	$post->post_category = get_option( 'default_category' );
-	$post->post_content = apply_filters( 'default_content', $post_content);
-	$post->post_title = apply_filters( 'default_title', $post_title );
-	$post->post_excerpt = apply_filters( 'default_excerpt', $post_excerpt);
-	$post->page_template = 'default';
-	$post->post_parent = 0;
-	$post->menu_order = 0;
-
-	return $post;
-}
-
-function get_comment_to_edit( $id ) {
-	$comment = get_comment( $id );
-	
-	$comment->comment_ID = (int) $comment->comment_ID;
-	$comment->comment_post_ID = (int) $comment->comment_post_ID;
-
-	$comment->comment_content = format_to_edit( $comment->comment_content );
-	$comment->comment_content = apply_filters( 'comment_edit_pre', $comment->comment_content);
-
-	$comment->comment_author = format_to_edit( $comment->comment_author );
-	$comment->comment_author_email = format_to_edit( $comment->comment_author_email );
-	$comment->comment_author_url = clean_url($comment->comment_author_url);
-	$comment->comment_author_url = format_to_edit( $comment->comment_author_url );
-
-	return $comment;
-}
-
-function get_category_to_edit( $id ) {
-	$category = get_category( $id );
-	
-	$category->term_id = (int) $category->term_id;
-	$category->parent = (int) $category->parent;
-
-	return $category;
-}
-
-function wp_dropdown_roles( $default = false ) {
-	global $wp_roles;
-	$r = '';
-	foreach( $wp_roles->role_names as $role => $name )
-		if ( $default == $role ) // Make default first in list
-			$p = "\n\t<option selected='selected' value='$role'>$name</option>";
-		else
-			$r .= "\n\t<option value='$role'>$name</option>";
-	echo $p . $r;
-}
-
-
-function get_user_to_edit( $user_id ) {
-	$user = new WP_User( $user_id );
-	$user->user_login   = attribute_escape($user->user_login);
-	$user->user_email   = attribute_escape($user->user_email);
-	$user->user_url     = clean_url($user->user_url);
-	$user->first_name   = attribute_escape($user->first_name);
-	$user->last_name    = attribute_escape($user->last_name);
-	$user->display_name = attribute_escape($user->display_name);
-	$user->nickname     = attribute_escape($user->nickname);
-	$user->aim          = attribute_escape($user->aim);
-	$user->yim          = attribute_escape($user->yim);
-	$user->jabber       = attribute_escape($user->jabber);
-	$user->description  =  wp_specialchars($user->description);
-
-	return $user;
-}
-
-// Creates a new user from the "Users" form using $_POST information.
-
-function add_user() {
-	if ( func_num_args() ) { // The hackiest hack that ever did hack
-		global $current_user, $wp_roles;
-		$user_id = (int) func_get_arg( 0 );
-
-		if ( isset( $_POST['role'] ) ) {
-			if( $user_id != $current_user->id || $wp_roles->role_objects[$_POST['role']]->has_cap( 'edit_users' ) ) {
-				$user = new WP_User( $user_id );
-				$user->set_role( $_POST['role'] );
-			}
-		}
-	} else {
-		add_action( 'user_register', 'add_user' ); // See above
-		return edit_user();
-	}
-}
-
-function edit_user( $user_id = 0 ) {
-	global $current_user, $wp_roles, $wpdb;
-	if ( $user_id != 0 ) {
-		$update = true;
-		$user->ID = (int) $user_id;
-		$userdata = get_userdata( $user_id );
-		$user->user_login = $wpdb->escape( $userdata->user_login );
-	} else {
-		$update = false;
-		$user = '';
-	}
-
-	if ( isset( $_POST['user_login'] ))
-		$user->user_login = wp_specialchars( trim( $_POST['user_login'] ));
-
-	$pass1 = $pass2 = '';
-	if ( isset( $_POST['pass1'] ))
-		$pass1 = $_POST['pass1'];
-	if ( isset( $_POST['pass2'] ))
-		$pass2 = $_POST['pass2'];
-
-	if ( isset( $_POST['role'] ) && current_user_can( 'edit_users' ) ) { 
-		if( $user_id != $current_user->id || $wp_roles->role_objects[$_POST['role']]->has_cap( 'edit_users' ))
-			$user->role = $_POST['role'];
-	}
-
-	if ( isset( $_POST['email'] ))
-		$user->user_email = wp_specialchars( trim( $_POST['email'] ));
-	if ( isset( $_POST['url'] ) ) {
-		$user->user_url = clean_url( trim( $_POST['url'] ));
-		$user->user_url = preg_match('/^(https?|ftps?|mailto|news|irc|gopher|nntp|feed|telnet):/is', $user->user_url) ? $user->user_url : 'http://'.$user->user_url;
-	}
-	if ( isset( $_POST['first_name'] ))
-		$user->first_name = wp_specialchars( trim( $_POST['first_name'] ));
-	if ( isset( $_POST['last_name'] ))
-		$user->last_name = wp_specialchars( trim( $_POST['last_name'] ));
-	if ( isset( $_POST['nickname'] ))
-		$user->nickname = wp_specialchars( trim( $_POST['nickname'] ));
-	if ( isset( $_POST['display_name'] ))
-		$user->display_name = wp_specialchars( trim( $_POST['display_name'] ));
-	if ( isset( $_POST['description'] ))
-		$user->description = trim( $_POST['description'] );
-	if ( isset( $_POST['jabber'] ))
-		$user->jabber = wp_specialchars( trim( $_POST['jabber'] ));
-	if ( isset( $_POST['aim'] ))
-		$user->aim = wp_specialchars( trim( $_POST['aim'] ));
-	if ( isset( $_POST['yim'] ))
-		$user->yim = wp_specialchars( trim( $_POST['yim'] ));
-	if ( !$update )
-		$user->rich_editing = 'true';  // Default to true for new users.
-	else if ( isset( $_POST['rich_editing'] ) )
-		$user->rich_editing = $_POST['rich_editing'];
-	else
-		$user->rich_editing = 'false';
-
-	$errors = new WP_Error();
-
-	/* checking that username has been typed */
-	if ( $user->user_login == '' )
-		$errors->add( 'user_login', __( '<strong>ERROR</strong>: Please enter a username.' ));
-
-	/* checking the password has been typed twice */
-	do_action_ref_array( 'check_passwords', array ( $user->user_login, & $pass1, & $pass2 ));
-
-	if (!$update ) {
-		if ( $pass1 == '' || $pass2 == '' )
-			$errors->add( 'pass', __( '<strong>ERROR</strong>: Please enter your password twice.' ));
-	} else {
-		if ((empty ( $pass1 ) && !empty ( $pass2 ) ) || (empty ( $pass2 ) && !empty ( $pass1 ) ) )
-			$errors->add( 'pass', __( "<strong>ERROR</strong>: you typed your new password only once." ));
-	}
-
-	/* Check for "\" in password */
-	if( strpos( " ".$pass1, "\\" ) )
-		$errors->add( 'pass', __( '<strong>ERROR</strong>: Passwords may not contain the character "\\".' ));
-
-	/* checking the password has been typed twice the same */
-	if ( $pass1 != $pass2 )
-		$errors->add( 'pass', __( '<strong>ERROR</strong>: Please type the same password in the two password fields.' ));
-
-	if (!empty ( $pass1 ))
-		$user->user_pass = $pass1;
-
-	if ( !$update && !validate_username( $user->user_login ) )
-		$errors->add( 'user_login', __( '<strong>ERROR</strong>: This username is invalid.  Please enter a valid username.' ));
-
-	if (!$update && username_exists( $user->user_login ))
-		$errors->add( 'user_login', __( '<strong>ERROR</strong>: This username is already registered, please choose another one.' ));
-
-	/* checking e-mail address */
-	if ( empty ( $user->user_email ) ) {
-		$errors->add( 'user_email', __( "<strong>ERROR</strong>: please type an e-mail address" ));
-	} else
-		if (!is_email( $user->user_email ) ) {
-			$errors->add( 'user_email', __( "<strong>ERROR</strong>: the email address isn't correct" ));
-		}
-
-	if ( $errors->get_error_codes() )
-		return $errors;
-
-	if ( $update ) {
-		$user_id = wp_update_user( get_object_vars( $user ));
-	} else {
-		$user_id = wp_insert_user( get_object_vars( $user ));
-		wp_new_user_notification( $user_id );
-	}
-	return $user_id;
-}
-
-
-function get_link_to_edit( $link_id ) {
-	$link = get_link( $link_id );
-
-	$link->link_url         = clean_url($link->link_url);
-	$link->link_name        = attribute_escape($link->link_name);
-	$link->link_image       = attribute_escape($link->link_image);
-	$link->link_description = attribute_escape($link->link_description);
-	$link->link_rss         = clean_url($link->link_rss);
-	$link->link_rel         = attribute_escape($link->link_rel);
-	$link->link_notes       =  wp_specialchars($link->link_notes);
-	$link->post_category    = $link->link_category;
-
-	return $link;
-}
-
-function get_default_link_to_edit() {
-	if ( isset( $_GET['linkurl'] ) )
-		$link->link_url = clean_url( $_GET['linkurl']);
-	else
-		$link->link_url = '';
-
-	if ( isset( $_GET['name'] ) )
-		$link->link_name = attribute_escape( $_GET['name']);
-	else
-		$link->link_name = '';
-
-	$link->link_visible = 'Y';
-
-	return $link;
-}
-
-function add_link() {
-	return edit_link();
-}
-
-function edit_link( $link_id = '' ) {
-	if (!current_user_can( 'manage_links' ))
-		wp_die( __( 'Cheatin&#8217; uh?' ));
-
-	$_POST['link_url'] = wp_specialchars( $_POST['link_url'] );
-	$_POST['link_url'] = clean_url($_POST['link_url']);
-	$_POST['link_name'] = wp_specialchars( $_POST['link_name'] );
-	$_POST['link_image'] = wp_specialchars( $_POST['link_image'] );
-	$_POST['link_rss'] = clean_url($_POST['link_rss']);
-	$_POST['link_category'] = $_POST['post_category'];
-
-	if ( !empty( $link_id ) ) {
-		$_POST['link_id'] = $link_id;
-		return wp_update_link( $_POST);
-	} else {
-		return wp_insert_link( $_POST);
-	}
-}
-
-function url_shorten( $url ) {
-	$short_url = str_replace( 'http://', '', stripslashes( $url ));
-	$short_url = str_replace( 'www.', '', $short_url );
-	if ('/' == substr( $short_url, -1 ))
-		$short_url = substr( $short_url, 0, -1 );
-	if ( strlen( $short_url ) > 35 )
-		$short_url = substr( $short_url, 0, 32 ).'...';
-	return $short_url;
-}
-
-function selected( $selected, $current) {
-	if ( $selected == $current)
-		echo ' selected="selected"';
-}
-
-function checked( $checked, $current) {
-	if ( $checked == $current)
-		echo ' checked="checked"';
-}
-
-function return_categories_list( $parent = 0 ) {
-	global $wpdb;
-	return $wpdb->get_col( "SELECT cat_ID FROM $wpdb->categories WHERE category_parent = $parent AND ( link_count = 0 OR category_count != 0 OR ( link_count = 0 AND category_count = 0 ) ) ORDER BY category_count DESC" );
-}
-
-function sort_cats( $cat1, $cat2 ) {
-	if ( $cat1['checked'] || $cat2['checked'] )
-		return ( $cat1['checked'] && !$cat2['checked'] ) ? -1 : 1;
-	else
-		return strcasecmp( $cat1['cat_name'], $cat2['cat_name'] );
-}
-
-function get_nested_categories( $default = 0, $parent = 0 ) {
-	global $post_ID, $link_id, $mode, $wpdb;
-
-	if ( $post_ID ) {
-		$checked_categories = $wpdb->get_col( "
-		     SELECT category_id
-		     FROM $wpdb->categories, $wpdb->post2cat
-		     WHERE $wpdb->post2cat.category_id = cat_ID AND $wpdb->post2cat.post_id = '$post_ID'
-		     " );
-
-		if ( count( $checked_categories ) == 0 ) {
-			// No selected categories, strange
-			$checked_categories[] = $default;
-		}
-	} else if ( $link_id ) {
-		$checked_categories = $wpdb->get_col( "
-		     SELECT category_id
-		     FROM $wpdb->categories, $wpdb->link2cat
-		     WHERE $wpdb->link2cat.category_id = cat_ID AND $wpdb->link2cat.link_id = '$link_id'
-		     " );
-
-		if ( count( $checked_categories ) == 0 ) {
-			// No selected categories, strange
-			$checked_categories[] = $default;
-		}
-	} else {
-		$checked_categories[] = $default;
-	}
-
-	$cats = return_categories_list( $parent);
-	$result = array ();
-
-	if ( is_array( $cats ) ) {
-		foreach ( $cats as $cat) {
-			$result[$cat]['children'] = get_nested_categories( $default, $cat);
-			$result[$cat]['cat_ID'] = $cat;
-			$result[$cat]['checked'] = in_array( $cat, $checked_categories );
-			$result[$cat]['cat_name'] = get_the_category_by_ID( $cat);
-		}
-	}
-
-	usort( $result, 'sort_cats' );
-
-	return $result;
-}
-
-function write_nested_categories( $categories ) {
-	foreach ( $categories as $category ) {
-		echo '<li id="category-', $category['cat_ID'], '"><label for="in-category-', $category['cat_ID'], '" class="selectit"><input value="', $category['cat_ID'], '" type="checkbox" name="post_category[]" id="in-category-', $category['cat_ID'], '"', ($category['checked'] ? ' checked="checked"' : "" ), '/> ', wp_specialchars( apply_filters('the_category', $category['cat_name'] )), "</label></li>";
-
-		if ( $category['children'] ) {
-			echo "<ul>\n";
-			write_nested_categories( $category['children'] );
-			echo "</ul>\n";
-		}
-	}
-}
-
-function dropdown_categories( $default = 0 ) {
-	write_nested_categories( get_nested_categories( $default) );
-}
-
-function return_link_categories_list( $parent = 0 ) {
-	global $wpdb;
-	return $wpdb->get_col( "SELECT cat_ID FROM $wpdb->categories WHERE category_parent = $parent AND ( category_count = 0  OR link_count != 0 OR ( link_count = 0 AND category_count = 0 ) ) ORDER BY link_count DESC" );
-}
-
-function get_nested_link_categories( $default = 0, $parent = 0 ) {
-	global $post_ID, $link_id, $mode, $wpdb;
-
-	if ( $link_id ) {
-		$checked_categories = $wpdb->get_col( "
-		     SELECT category_id
-		     FROM $wpdb->categories, $wpdb->link2cat
-		     WHERE $wpdb->link2cat.category_id = cat_ID AND $wpdb->link2cat.link_id = '$link_id'
-		     " );
-
-		if ( count( $checked_categories ) == 0 ) {
-			// No selected categories, strange
-			$checked_categories[] = $default;
-		}
-	} else {
-		$checked_categories[] = $default;
-	}
-
-	$cats = return_link_categories_list( $parent);
-	$result = array ();
-
-	if ( is_array( $cats ) ) {
-		foreach ( $cats as $cat) {
-			$result[$cat]['children'] = get_nested_link_categories( $default, $cat);
-			$result[$cat]['cat_ID'] = $cat;
-			$result[$cat]['checked'] = in_array( $cat, $checked_categories );
-			$result[$cat]['cat_name'] = get_the_category_by_ID( $cat);
-		}
-	}
-
-	usort( $result, 'sort_cats' );
-
-	return $result;
-}
-
-function dropdown_link_categories( $default = 0 ) {
-	write_nested_categories( get_nested_link_categories( $default) );
-}
-
-// Dandy new recursive multiple category stuff.
-function cat_rows( $parent = 0, $level = 0, $categories = 0 ) {
-	if (!$categories )
-		$categories = get_categories( 'hide_empty=0' );
-
-	$children = _get_category_hierarchy();
-
-	if ( $categories ) {
-		ob_start();
-		foreach ( $categories as $category ) {
-			if ( $category->category_parent == $parent) {
-				echo "\t" . _cat_row( $category, $level );
-				if ( isset($children[$category->cat_ID]) )
-					cat_rows( $category->cat_ID, $level +1, $categories );
-			}
-		}
-		$output = ob_get_contents();
-		ob_end_clean();
-
-		$output = apply_filters('cat_rows', $output);
-
-		echo $output;
-	} else {
-		return false;
-	}
-}
-
-function _cat_row( $category, $level, $name_override = false ) {
-	global $class;
-
-	$pad = str_repeat( '&#8212; ', $level );
-	if ( current_user_can( 'manage_categories' ) ) {
-		$edit = "<a href='categories.php?action=edit&amp;cat_ID=$category->cat_ID' class='edit'>".__( 'Edit' )."</a></td>";
-		$default_cat_id = (int) get_option( 'default_category' );
-		$default_link_cat_id = (int) get_option( 'default_link_category' );
-
-		if ( ($category->cat_ID != $default_cat_id ) && ($category->cat_ID != $default_link_cat_id ) )
-			$edit .= "<td><a href='" . wp_nonce_url( "categories.php?action=delete&amp;cat_ID=$category->cat_ID", 'delete-category_' . $category->cat_ID ) . "' onclick=\"return deleteSomething( 'cat', $category->cat_ID, '" . js_escape(sprintf( __("You are about to delete the category '%s'.\nAll posts that were only assigned to this category will be assigned to the '%s' category.\nAll links that were only assigned to this category will be assigned to the '%s' category.\n'OK' to delete, 'Cancel' to stop." ), $category->cat_name, get_catname( $default_cat_id ), get_catname( $default_link_cat_id ) )) . "' );\" class='delete'>".__( 'Delete' )."</a>";
-		else
-			$edit .= "<td style='text-align:center'>".__( "Default" );
-	} else
-		$edit = '';
-
-	$class = ( ( defined( 'DOING_AJAX' ) && DOING_AJAX ) || " class='alternate'" == $class ) ? '' : " class='alternate'";
-
-	$category->category_count = number_format( $category->category_count );
-	$category->link_count = number_format( $category->link_count );
-	$posts_count = ( $category->category_count > 0 ) ? "<a href='edit.php?cat=$category->cat_ID'>$category->category_count</a>" : $category->category_count;
-	return "<tr id='cat-$category->cat_ID'$class>
-		<th scope='row' style='text-align: center'>$category->cat_ID</th>
-		<td>" . ( $name_override ? $name_override : $pad . ' ' . $category->cat_name ) . "</td>
-		<td>$category->category_description</td>
-		<td align='center'>$posts_count</td>
-		<td align='center'>$category->link_count</td>
-		<td>$edit</td>\n\t</tr>\n";
-}
-
-function page_rows( $parent = 0, $level = 0, $pages = 0, $hierarchy = true ) {
-	global $wpdb, $class, $post;
-
-	if (!$pages )
-		$pages = get_pages( 'sort_column=menu_order' );
-
-	if (! $pages )
-		return false;
-
-	foreach ( $pages as $post) {
-		setup_postdata( $post);
-		if ( $hierarchy && ($post->post_parent != $parent) )
-			continue;
-
-		$post->post_title = wp_specialchars( $post->post_title );
-		$pad = str_repeat( '&#8212; ', $level );
-		$id = (int) $post->ID;
-		$class = ('alternate' == $class ) ? '' : 'alternate';
-?>
-  <tr id='page-<?php echo $id; ?>' class='<?php echo $class; ?>'> 
-    <th scope="row" style="text-align: center"><?php echo $post->ID; ?></th> 
-    <td>
-      <?php echo $pad; ?><?php the_title() ?>
-    </td> 
-    <td><?php the_author() ?></td>
-    <td><?php if ( '0000-00-00 00:00:00' ==$post->post_modified ) _e('Unpublished'); else echo mysql2date( __('Y-m-d g:i a'), $post->post_modified ); ?></td> 
-	<td><a href="<?php the_permalink(); ?>" rel="permalink" class="edit"><?php _e( 'View' ); ?></a></td>
-    <td><?php if ( current_user_can( 'edit_page', $id ) ) { echo "<a href='page.php?action=edit&amp;post=$id' class='edit'>" . __( 'Edit' ) . "</a>"; } ?></td> 
-    <td><?php if ( current_user_can( 'delete_page', $id ) ) { echo "<a href='" . wp_nonce_url( "page.php?action=delete&amp;post=$id", 'delete-page_' . $id ) .  "' class='delete' onclick=\"return deleteSomething( 'page', " . $id . ", '" . js_escape(sprintf( __("You are about to delete the '%s' page.\n'OK' to delete, 'Cancel' to stop." ), get_the_title() ) ) . "' );\">" . __( 'Delete' ) . "</a>"; } ?></td> 
-  </tr> 
-
-<?php
-		if ( $hierarchy ) page_rows( $id, $level + 1, $pages );
-	}
-}
-
-function user_row( $user_object, $style = '' ) {
-	if ( !(is_object( $user_object) && is_a( $user_object, 'WP_User' ) ) )
-		$user_object = new WP_User( (int) $user_object );
-	$email = $user_object->user_email;
-	$url = $user_object->user_url;
-	$short_url = str_replace( 'http://', '', $url );
-	$short_url = str_replace( 'www.', '', $short_url );
-	if ('/' == substr( $short_url, -1 ))
-		$short_url = substr( $short_url, 0, -1 );
-	if ( strlen( $short_url ) > 35 )
-		$short_url =  substr( $short_url, 0, 32 ).'...';
-	$numposts = get_usernumposts( $user_object->ID );
-	$r = "<tr id='user-$user_object->ID'$style>
-		<td><input type='checkbox' name='users[]' id='user_{$user_object->ID}' value='{$user_object->ID}' /> <label for='user_{$user_object->ID}'>{$user_object->ID}</label></td>
-		<td><label for='user_{$user_object->ID}'><strong>$user_object->user_login</strong></label></td>
-		<td><label for='user_{$user_object->ID}'>$user_object->first_name $user_object->last_name</label></td>
-		<td><a href='mailto:$email' title='" . sprintf( __('e-mail: %s' ), $email ) . "'>$email</a></td>
-		<td><a href='$url' title='website: $url'>$short_url</a></td>";
-	$r .= "\n\t\t<td align='center'>";
-	if ( $numposts > 0 ) {
-		$r .= "<a href='edit.php?author=$user_object->ID' title='" . __( 'View posts by this author' ) . "' class='edit'>";
-		$r .= sprintf(__ngettext( 'View %s post', 'View %s posts', $numposts ), $numposts);
-		$r .= '</a>';
-	}
-	$r .= "</td>\n\t\t<td>";
-	if ( current_user_can( 'edit_user', $user_object->ID ) ) {
-		$edit_link = add_query_arg( 'wp_http_referer', urlencode( clean_url( stripslashes( $_SERVER['REQUEST_URI'] ) ) ), "user-edit.php?user_id=$user_object->ID" );
-		$r .= "<a href='$edit_link' class='edit'>".__( 'Edit' )."</a>";
-	}
-	$r .= "</td>\n\t</tr>";
-	return $r;
-}
-
-function _wp_get_comment_list( $s = false, $start, $num ) {
-	global $wpdb;
-
-	$start = abs( (int) $start );
-	$num = (int) $num;
-
-	if ( $s ) {
-		$s = $wpdb->escape($s);
-		$comments = $wpdb->get_results("SELECT SQL_CALC_FOUND_ROWS * FROM $wpdb->comments WHERE
-			(comment_author LIKE '%$s%' OR
-			comment_author_email LIKE '%$s%' OR
-			comment_author_url LIKE ('%$s%') OR
-			comment_author_IP LIKE ('%$s%') OR
-			comment_content LIKE ('%$s%') ) AND
-			comment_approved != 'spam'
-			ORDER BY comment_date DESC LIMIT $start, $num");
-	} else {
-		$comments = $wpdb->get_results( "SELECT SQL_CALC_FOUND_ROWS * FROM $wpdb->comments WHERE comment_approved = '0' OR comment_approved = '1' ORDER BY comment_date DESC LIMIT $start, $num" );
-	}
-
-	$total = $wpdb->get_var( "SELECT FOUND_ROWS()" );
-
-	return array($comments, $total);
-}
-
-function _wp_comment_list_item( $id, $alt = 0 ) {
-	global $authordata, $comment, $wpdb;
-	$id = (int) $id;
-	$comment =& get_comment( $id );
-	$class = '';
-	$authordata = get_userdata($wpdb->get_var("SELECT post_author FROM $wpdb->posts WHERE ID = $comment->comment_post_ID"));
-	$comment_status = wp_get_comment_status($comment->comment_ID);
-	if ( 'unapproved' == $comment_status )
-		$class .= ' unapproved';
-	if ( $alt % 2 )
-		$class .= ' alternate';
-	echo "<li id='comment-$comment->comment_ID' class='$class'>";
-?>
-<p><strong><?php comment_author(); ?></strong> <?php if ($comment->comment_author_email) { ?>| <?php comment_author_email_link() ?> <?php } if ($comment->comment_author_url && 'http://' != $comment->comment_author_url) { ?> | <?php comment_author_url_link() ?> <?php } ?>| <?php _e('IP:') ?> <a href="http://ws.arin.net/cgi-bin/whois.pl?queryinput=<?php comment_author_IP() ?>"><?php comment_author_IP() ?></a></p>
-
-<?php comment_text() ?>
-
-<p><?php comment_date(__('M j, g:i A'));  ?> &#8212; [
-<?php
-if ( current_user_can('edit_post', $comment->comment_post_ID) ) {
-	echo " <a href='comment.php?action=editcomment&amp;c=".$comment->comment_ID."'>" .  __('Edit') . '</a>';
-	echo ' | <a href="' . wp_nonce_url('comment.php?action=deletecomment&amp;p=' . $comment->comment_post_ID . '&amp;c=' . $comment->comment_ID, 'delete-comment_' . $comment->comment_ID) . '" onclick="return deleteSomething( \'comment\', ' . $comment->comment_ID . ', \'' . js_escape(sprintf(__("You are about to delete this comment by '%s'.\n'Cancel' to stop, 'OK' to delete."), $comment->comment_author)) . "', theCommentList );\">" . __('Delete') . '</a> ';
-	if ( ('none' != $comment_status) && ( current_user_can('moderate_comments') ) ) {
-		echo '<span class="unapprove"> | <a href="' . wp_nonce_url('comment.php?action=unapprovecomment&amp;p=' . $comment->comment_post_ID . '&amp;c=' . $comment->comment_ID, 'unapprove-comment_' . $comment->comment_ID) . '" onclick="return dimSomething( \'comment\', ' . $comment->comment_ID . ', \'unapproved\', theCommentList );">' . __('Unapprove') . '</a> </span>';
-		echo '<span class="approve"> | <a href="' . wp_nonce_url('comment.php?action=approvecomment&amp;p=' . $comment->comment_post_ID . '&amp;c=' . $comment->comment_ID, 'approve-comment_' . $comment->comment_ID) . '" onclick="return dimSomething( \'comment\', ' . $comment->comment_ID . ', \'unapproved\', theCommentList );">' . __('Approve') . '</a> </span>';
-	}
-	echo " | <a href=\"" . wp_nonce_url("comment.php?action=deletecomment&amp;dt=spam&amp;p=" . $comment->comment_post_ID . "&amp;c=" . $comment->comment_ID, 'delete-comment_' . $comment->comment_ID) . "\" onclick=\"return deleteSomething( 'comment-as-spam', $comment->comment_ID, '" . js_escape(sprintf(__("You are about to mark as spam this comment by '%s'.\n'Cancel' to stop, 'OK' to mark as spam."), $comment->comment_author))  . "', theCommentList );\">" . __('Spam') . "</a> ";
-}
-$post = get_post($comment->comment_post_ID);
-$post_title = wp_specialchars( $post->post_title, 'double' );
-$post_title = ('' == $post_title) ? "# $comment->comment_post_ID" : $post_title;
-?>
- ] &#8212; <a href="<?php echo get_permalink($comment->comment_post_ID); ?>"><?php echo $post_title; ?></a></p>
-		</li>
-<?php
-}
-
-function wp_dropdown_cats( $currentcat = 0, $currentparent = 0, $parent = 0, $level = 0, $categories = 0 ) {
-	global $wpdb;
-	if (!$categories )
-		$categories = get_categories( 'hide_empty=0' );
-
-	if ( $categories ) {
-		foreach ( $categories as $category ) {
-			if ( $currentcat != $category->cat_ID && $parent == $category->category_parent) {
-				$pad = str_repeat( '&#8211; ', $level );
-				$category->cat_name = wp_specialchars( $category->cat_name );
-				echo "\n\t<option value='$category->cat_ID'";
-				if ( $currentparent == $category->cat_ID )
-					echo " selected='selected'";
-				echo ">$pad$category->cat_name</option>";
-				wp_dropdown_cats( $currentcat, $currentparent, $category->cat_ID, $level +1, $categories );
-			}
-		}
-	} else {
-		return false;
-	}
-}
-
-// Some postmeta stuff
-function has_meta( $postid ) {
-	global $wpdb;
-
-	return $wpdb->get_results( "
-			SELECT meta_key, meta_value, meta_id, post_id
-			FROM $wpdb->postmeta
-			WHERE post_id = '$postid'
-			ORDER BY meta_key,meta_id", ARRAY_A );
-
-}
-
-function list_meta( $meta ) {
-	global $post_ID;
-	// Exit if no meta
-	if (!$meta ) {
-		echo '<tbody id="the-list"><tr style="display: none;"><td>&nbsp;</td></tr></tbody>'; //TBODY needed for list-manipulation JS
-		return;
-	}
-	$count = 0;
-?>
-	<thead>
-	<tr>
-		<th><?php _e( 'Key' ) ?></th>
-		<th><?php _e( 'Value' ) ?></th>
-		<th colspan='2'><?php _e( 'Action' ) ?></th>
-	</tr>
-	</thead>
-<?php
-	$r ="\n\t<tbody id='the-list'>";
-	foreach ( $meta as $entry ) {
-		++ $count;
-		if ( $count % 2 )
-			$style = 'alternate';
-		else
-			$style = '';
-		if ('_' == $entry['meta_key'] { 0 } )
-			$style .= ' hidden';
-
-		if ( is_serialized( $entry['meta_value'] ) ) {
-			if ( is_serialized_string( $entry['meta_value'] ) ) {
-				// this is a serialized string, so we should display it
-				$entry['meta_value'] = maybe_unserialize( $entry['meta_value'] );
-			} else {
-				// this is a serialized array/object so we should NOT display it
-				--$count;
-				continue;
-			}
-		}
-
-		$key_js = js_escape( $entry['meta_key'] );
-		$entry['meta_key']   = attribute_escape($entry['meta_key']);
-		$entry['meta_value'] = attribute_escape($entry['meta_value']);
-		$entry['meta_id'] = (int) $entry['meta_id'];
-		$r .= "\n\t<tr id='meta-{$entry['meta_id']}' class='$style'>";
-		$r .= "\n\t\t<td valign='top'><input name='meta[{$entry['meta_id']}][key]' tabindex='6' type='text' size='20' value='{$entry['meta_key']}' /></td>";
-		$r .= "\n\t\t<td><textarea name='meta[{$entry['meta_id']}][value]' tabindex='6' rows='2' cols='30'>{$entry['meta_value']}</textarea></td>";
-		$r .= "\n\t\t<td align='center'><input name='updatemeta' type='submit' class='updatemeta' tabindex='6' value='".attribute_escape(__( 'Update' ))."' /><br />";
-		$r .= "\n\t\t<input name='deletemeta[{$entry['meta_id']}]' type='submit' onclick=\"return deleteSomething( 'meta', {$entry['meta_id']}, '";
-		$r .= js_escape(sprintf( __("You are about to delete the '%s' custom field on this post.\n'OK' to delete, 'Cancel' to stop." ), $key_js ) );
-		$r .= "' );\" class='deletemeta' tabindex='6' value='".attribute_escape(__( 'Delete' ))."' /></td>";
-		$r .= "\n\t</tr>";
-	}
-	echo $r;
-	echo "\n\t</tbody>";
-}
-
-// Get a list of previously defined keys
-function get_meta_keys() {
-	global $wpdb;
-
-	$keys = $wpdb->get_col( "
-			SELECT meta_key
-			FROM $wpdb->postmeta
-			GROUP BY meta_key
-			ORDER BY meta_key" );
-
-	return $keys;
-}
-
-function meta_form() {
-	global $wpdb;
-	$limit = (int) apply_filters( 'postmeta_form_limit', 30 );
-	$keys = $wpdb->get_col( "
-		SELECT meta_key
-		FROM $wpdb->postmeta
-		GROUP BY meta_key
-		ORDER BY meta_id DESC
-		LIMIT $limit" );
-	if ( $keys )
-		natcasesort($keys);
-?>
-<h3><?php _e( 'Add a new custom field:' ) ?></h3>
-<table id="newmeta" cellspacing="3" cellpadding="3">
-	<tr>
-<th colspan="2"><?php _e( 'Key' ) ?></th>
-<th><?php _e( 'Value' ) ?></th>
-</tr>
-	<tr valign="top">
-		<td align="right" width="18%">
-<?php if ( $keys ) : ?>
-<select id="metakeyselect" name="metakeyselect" tabindex="7">
-<option value="#NONE#"><?php _e( '- Select -' ); ?></option>
-<?php
-
-	foreach ( $keys as $key ) {
-		$key = attribute_escape( $key );
-		echo "\n\t<option value='$key'>$key</option>";
-	}
-?>
-</select> <?php _e( 'or' ); ?>
-<?php endif; ?>
-</td>
-<td><input type="text" id="metakeyinput" name="metakeyinput" tabindex="7" /></td>
-		<td><textarea id="metavalue" name="metavalue" rows="3" cols="25" tabindex="8"></textarea></td>
-	</tr>
-
-</table>
-<p class="submit"><input type="submit" id="updatemetasub" name="updatemeta" tabindex="9" value="<?php _e( 'Add Custom Field &raquo;' ) ?>" /></p>
-<?php
-
-}
-
-function add_meta( $post_ID ) {
-	global $wpdb;
-	$post_ID = (int) $post_ID;
-
-	$protected = array( '_wp_attached_file', '_wp_attachment_metadata', '_wp_old_slug', '_wp_page_template' );
-
-	$metakeyselect = $wpdb->escape( stripslashes( trim( $_POST['metakeyselect'] ) ) );
-	$metakeyinput = $wpdb->escape( stripslashes( trim( $_POST['metakeyinput'] ) ) );
-	$metavalue = maybe_serialize( stripslashes( (trim( $_POST['metavalue'] ) ) ));
-	$metavalue = $wpdb->escape( $metavalue );
-
-	if ( ('0' === $metavalue || !empty ( $metavalue ) ) && ((('#NONE#' != $metakeyselect) && !empty ( $metakeyselect) ) || !empty ( $metakeyinput) ) ) {
-		// We have a key/value pair. If both the select and the 
-		// input for the key have data, the input takes precedence:
-
- 		if ('#NONE#' != $metakeyselect)
-			$metakey = $metakeyselect;
-
-		if ( $metakeyinput)
-			$metakey = $metakeyinput; // default
-
-		if ( in_array($metakey, $protected) )
-			return false;
-
-		$result = $wpdb->query( "
-						INSERT INTO $wpdb->postmeta 
-						(post_id,meta_key,meta_value ) 
-						VALUES ('$post_ID','$metakey','$metavalue' )
-					" );
-		return $wpdb->insert_id;
-	}
-	return false;
-} // add_meta
-
-function delete_meta( $mid ) {
-	global $wpdb;
-	$mid = (int) $mid;
-
-	return $wpdb->query( "DELETE FROM $wpdb->postmeta WHERE meta_id = '$mid'" );
-}
-
-function update_meta( $mid, $mkey, $mvalue ) {
-	global $wpdb;
-
-	$protected = array( '_wp_attached_file', '_wp_attachment_metadata', '_wp_old_slug', '_wp_page_template' );
-
-	if ( in_array($mkey, $protected) )
-		return false;
-
-	$mvalue = maybe_serialize( stripslashes( $mvalue ));
-	$mvalue = $wpdb->escape( $mvalue );
-	$mid = (int) $mid;
-	return $wpdb->query( "UPDATE $wpdb->postmeta SET meta_key = '$mkey', meta_value = '$mvalue' WHERE meta_id = '$mid'" );
-}
-
-function get_post_meta_by_id( $mid ) {
-	global $wpdb;
-	$mid = (int) $mid;
-
-	$meta = $wpdb->get_row( "SELECT * FROM $wpdb->postmeta WHERE meta_id = '$mid'" );
-	if ( is_serialized_string( $meta->meta_value ) )
-		$meta->meta_value = maybe_unserialize( $meta->meta_value );
-	return $meta;
-}
-
-function touch_time( $edit = 1, $for_post = 1 ) {
-	global $wp_locale, $post, $comment;
-
-	if ( $for_post )
-		$edit = ( ('draft' == $post->post_status ) && (!$post->post_date || '0000-00-00 00:00:00' == $post->post_date ) ) ? false : true;
- 
-	echo '<fieldset><legend><input type="checkbox" class="checkbox" name="edit_date" value="1" id="timestamp" /> <label for="timestamp">'.__( 'Edit timestamp' ).'</label></legend>';
-
-	$time_adj = time() + (get_option( 'gmt_offset' ) * 3600 );
-	$post_date = ($for_post) ? $post->post_date : $comment->comment_date;
-	$jj = ($edit) ? mysql2date( 'd', $post_date ) : gmdate( 'd', $time_adj );
-	$mm = ($edit) ? mysql2date( 'm', $post_date ) : gmdate( 'm', $time_adj );
-	$aa = ($edit) ? mysql2date( 'Y', $post_date ) : gmdate( 'Y', $time_adj );
-	$hh = ($edit) ? mysql2date( 'H', $post_date ) : gmdate( 'H', $time_adj );
-	$mn = ($edit) ? mysql2date( 'i', $post_date ) : gmdate( 'i', $time_adj );
-	$ss = ($edit) ? mysql2date( 's', $post_date ) : gmdate( 's', $time_adj );
-
-	echo "<select name=\"mm\" onchange=\"edit_date.checked=true\">\n";
-	for ( $i = 1; $i < 13; $i = $i +1 ) {
-		echo "\t\t\t<option value=\"$i\"";
-		if ( $i == $mm )
-			echo ' selected="selected"';
-		echo '>' . $wp_locale->get_month( $i ) . "</option>\n";
-	}
-?>
-</select>
-<input type="text" id="jj" name="jj" value="<?php echo $jj; ?>" size="2" maxlength="2" onchange="edit_date.checked=true"/>
-<input type="text" id="aa" name="aa" value="<?php echo $aa ?>" size="4" maxlength="5" onchange="edit_date.checked=true" /> @
-<input type="text" id="hh" name="hh" value="<?php echo $hh ?>" size="2" maxlength="2" onchange="edit_date.checked=true" /> :
-<input type="text" id="mn" name="mn" value="<?php echo $mn ?>" size="2" maxlength="2" onchange="edit_date.checked=true" />
-<input type="hidden" id="ss" name="ss" value="<?php echo $ss ?>" size="2" maxlength="2" onchange="edit_date.checked=true" />
-<?php
-	if ( $edit ) {
-		printf( __('Existing timestamp: %1$s %2$s, %3$s @ %4$s:%5$s' ), $wp_locale->get_month( $mm ), $jj, $aa, $hh, $mn );
-	}
-?>
-</fieldset>
-	<?php
-
-}
-
-// insert_with_markers: Owen Winkler, fixed by Eric Anderson
-// Inserts an array of strings into a file (.htaccess ), placing it between
-// BEGIN and END markers.  Replaces existing marked info.  Retains surrounding
-// data.  Creates file if none exists.
-// Returns true on write success, false on failure.
-function insert_with_markers( $filename, $marker, $insertion ) {
-	if (!file_exists( $filename ) || is_writeable( $filename ) ) {
-		if (!file_exists( $filename ) ) {
-			$markerdata = '';
-		} else {
-			$markerdata = explode( "\n", implode( '', file( $filename ) ) );
-		}
-
-		$f = fopen( $filename, 'w' );
-		$foundit = false;
-		if ( $markerdata ) {
-			$state = true;
-			foreach ( $markerdata as $n => $markerline ) {
-				if (strpos($markerline, '# BEGIN ' . $marker) !== false)
-					$state = false;
-				if ( $state ) {
-					if ( $n + 1 < count( $markerdata ) )
-						fwrite( $f, "{$markerline}\n" );
-					else
-						fwrite( $f, "{$markerline}" );
-				}
-				if (strpos($markerline, '# END ' . $marker) !== false) {
-					fwrite( $f, "# BEGIN {$marker}\n" );
-					if ( is_array( $insertion ))
-						foreach ( $insertion as $insertline )
-							fwrite( $f, "{$insertline}\n" );
-					fwrite( $f, "# END {$marker}\n" );
-					$state = true;
-					$foundit = true;
-				}
-			}
-		}
-		if (!$foundit) {
-			fwrite( $f, "# BEGIN {$marker}\n" );
-			foreach ( $insertion as $insertline )
-				fwrite( $f, "{$insertline}\n" );
-			fwrite( $f, "# END {$marker}\n" );
-		}
-		fclose( $f );
-		return true;
-	} else {
-		return false;
-	}
-}
-
-// extract_from_markers: Owen Winkler
-// Returns an array of strings from a file (.htaccess ) from between BEGIN
-// and END markers.
-function extract_from_markers( $filename, $marker ) {
-	$result = array ();
-
-	if (!file_exists( $filename ) ) {
-		return $result;
-	}
-
-	if ( $markerdata = explode( "\n", implode( '', file( $filename ) ) ));
-	{
-		$state = false;
-		foreach ( $markerdata as $markerline ) {
-			if (strpos($markerline, '# END ' . $marker) !== false)
-				$state = false;
-			if ( $state )
-				$result[] = $markerline;
-			if (strpos($markerline, '# BEGIN ' . $marker) !== false)
-				$state = true;
-		}
-	}
-
-	return $result;
-}
-
-function got_mod_rewrite() {
-	global $is_apache;
-
-	// take 3 educated guesses as to whether or not mod_rewrite is available
-	if ( !$is_apache )
-		return false;
-
-	if ( function_exists( 'apache_get_modules' ) ) {
-		if ( !in_array( 'mod_rewrite', apache_get_modules() ) )
-			return false;
-	}
-
-	return true;
-}
-
-function save_mod_rewrite_rules() {
-	global $is_apache, $wp_rewrite;
-	$home_path = get_home_path();
-
-	if (!$wp_rewrite->using_mod_rewrite_permalinks() )
-		return false;
-
-	if (!((!file_exists( $home_path.'.htaccess' ) && is_writable( $home_path ) ) || is_writable( $home_path.'.htaccess' ) ) )
-		return false;
-
-	if (! got_mod_rewrite() )
-		return false;
-
-	$rules = explode( "\n", $wp_rewrite->mod_rewrite_rules() );
-	return insert_with_markers( $home_path.'.htaccess', 'WordPress', $rules );
-}
-
-function get_broken_themes() {
-	global $wp_broken_themes;
-
-	get_themes();
-	return $wp_broken_themes;
-}
-
-function get_page_templates() {
-	$themes = get_themes();
-	$theme = get_current_theme();
-	$templates = $themes[$theme]['Template Files'];
-	$page_templates = array ();
-
-	if ( is_array( $templates ) ) {
-		foreach ( $templates as $template ) {
-			$template_data = implode( '', file( ABSPATH.$template ));
-			preg_match( "|Template Name:(.*)|i", $template_data, $name );
-			preg_match( "|Description:(.*)|i", $template_data, $description );
-
-			$name = $name[1];
-			$description = $description[1];
-
-			if (!empty ( $name ) ) {
-				$page_templates[trim( $name )] = basename( $template );
-			}
-		}
-	}
-
-	return $page_templates;
-}
-
-function page_template_dropdown( $default = '' ) {
-	$templates = get_page_templates();
-	foreach (array_keys( $templates ) as $template )
-		: if ( $default == $templates[$template] )
-			$selected = " selected='selected'";
-		else
-			$selected = '';
-	echo "\n\t<option value='".$templates[$template]."' $selected>$template</option>";
-	endforeach;
-}
-
-function parent_dropdown( $default = 0, $parent = 0, $level = 0 ) {
-	global $wpdb, $post_ID;
-	$items = $wpdb->get_results( "SELECT ID, post_parent, post_title FROM $wpdb->posts WHERE post_parent = $parent AND post_type = 'page' ORDER BY menu_order" );
-
-	if ( $items ) {
-		foreach ( $items as $item ) {
-			// A page cannot be its own parent.
-			if (!empty ( $post_ID ) ) {
-				if ( $item->ID == $post_ID ) {
-					continue;
-				}
-			}
-			$pad = str_repeat( '&nbsp;', $level * 3 );
-			if ( $item->ID == $default)
-				$current = ' selected="selected"';
-			else
-				$current = '';
-
-			echo "\n\t<option value='$item->ID'$current>$pad $item->post_title</option>";
-			parent_dropdown( $default, $item->ID, $level +1 );
-		}
-	} else {
-		return false;
-	}
-}
-
-function user_can_access_admin_page() {
-	global $pagenow;
-	global $menu;
-	global $submenu;
-	global $_wp_menu_nopriv;
-	global $_wp_submenu_nopriv;
-	global $plugin_page;
-
-	$parent = get_admin_page_parent();
-
-	if ( isset( $_wp_submenu_nopriv[$parent][$pagenow] ) )
-		return false;
-
-	if ( isset( $plugin_page ) && isset( $_wp_submenu_nopriv[$parent][$plugin_page] ) )
-		return false;
-
-	if ( empty( $parent) ) {
-		if ( isset( $_wp_menu_nopriv[$pagenow] ) )
-			return false;
-		if ( isset( $_wp_submenu_nopriv[$pagenow][$pagenow] ) )
-			return false;
-		if ( isset( $plugin_page ) && isset( $_wp_submenu_nopriv[$pagenow][$plugin_page] ) )
-			return false;
-		foreach (array_keys( $_wp_submenu_nopriv ) as $key ) {
-			if ( isset( $_wp_submenu_nopriv[$key][$pagenow] ) )
-				return false;
-			if ( isset( $plugin_page ) && isset( $_wp_submenu_nopriv[$key][$plugin_page] ) )
-			return false;
-		}
-		return true;
-	}
-
-	if ( isset( $submenu[$parent] ) ) {
-		foreach ( $submenu[$parent] as $submenu_array ) {
-			if ( isset( $plugin_page ) && ( $submenu_array[2] == $plugin_page ) ) {
-				if ( current_user_can( $submenu_array[1] ))
-					return true;
-				else
-					return false;
-			} else if ( $submenu_array[2] == $pagenow ) {
-				if ( current_user_can( $submenu_array[1] ))
-					return true;
-				else
-					return false;
-			}
-		}
-	}
-
-	foreach ( $menu as $menu_array ) {
-		if ( $menu_array[2] == $parent) {
-			if ( current_user_can( $menu_array[1] ))
-				return true;
-			else
-				return false;
-		}
-	}
-
-	return true;
-}
-
-function get_admin_page_title() {
-	global $title;
-	global $menu;
-	global $submenu;
-	global $pagenow;
-	global $plugin_page;
-
-	if ( isset( $title ) && !empty ( $title ) ) {
-		return $title;
-	}
-
-	$hook = get_plugin_page_hook( $plugin_page, $pagenow );
-
-	$parent = $parent1 = get_admin_page_parent();
-	if ( empty ( $parent) ) {
-		foreach ( $menu as $menu_array ) {
-			if ( isset( $menu_array[3] ) ) {
-				if ( $menu_array[2] == $pagenow ) {
-					$title = $menu_array[3];
-					return $menu_array[3];
-				} else
-					if ( isset( $plugin_page ) && ($plugin_page == $menu_array[2] ) && ($hook == $menu_array[3] ) ) {
-						$title = $menu_array[3];
-						return $menu_array[3];
-					}
-			} else {
-				$title = $menu_array[0];
-				return $title;
-			}
-		}
-	} else {
-		foreach (array_keys( $submenu ) as $parent) {
-			foreach ( $submenu[$parent] as $submenu_array ) {
-				if ( isset( $plugin_page ) && 
-					($plugin_page == $submenu_array[2] ) && 
-					(($parent == $pagenow ) || ($parent == $plugin_page ) || ($plugin_page == $hook ) || (($pagenow == 'admin.php' ) && ($parent1 != $submenu_array[2] ) ) )
-					) {
-						$title = $submenu_array[3];
-						return $submenu_array[3];
-					}
-
-				if ( $submenu_array[2] != $pagenow || isset( $_GET['page'] ) ) // not the current page
-					continue;
-
-				if ( isset( $submenu_array[3] ) ) {
-					$title = $submenu_array[3];
-					return $submenu_array[3];
-				} else {
-					$title = $submenu_array[0];
-					return $title;
-				}
-			}
-		}
-	}
-
-	return $title;
-}
-
-function get_admin_page_parent() {
-	global $parent_file;
-	global $menu;
-	global $submenu;
-	global $pagenow;
-	global $plugin_page;
-	global $_wp_real_parent_file;
-	global $_wp_menu_nopriv;
-	global $_wp_submenu_nopriv;
-
-	if ( !empty ( $parent_file ) ) {
-		if ( isset( $_wp_real_parent_file[$parent_file] ) )
-			$parent_file = $_wp_real_parent_file[$parent_file];
-
-		return $parent_file;
-	}
-
-	if ( $pagenow == 'admin.php' && isset( $plugin_page ) ) {
-		foreach ( $menu as $parent_menu ) {
-			if ( $parent_menu[2] == $plugin_page ) {
-				$parent_file = $plugin_page;
-				if ( isset( $_wp_real_parent_file[$parent_file] ) )
-					$parent_file = $_wp_real_parent_file[$parent_file];
-				return $parent_file;
-			}
-		}
-		if ( isset( $_wp_menu_nopriv[$plugin_page] ) ) {
-			$parent_file = $plugin_page;
-			if ( isset( $_wp_real_parent_file[$parent_file] ) )
-					$parent_file = $_wp_real_parent_file[$parent_file];
-			return $parent_file;
-		}
-	}
-
-	if ( isset( $plugin_page ) && isset( $_wp_submenu_nopriv[$pagenow][$plugin_page] ) ) {
-		$parent_file = $pagenow;
-		if ( isset( $_wp_real_parent_file[$parent_file] ) )
-			$parent_file = $_wp_real_parent_file[$parent_file];
-		return $parent_file;
-	}
-
-	foreach (array_keys( $submenu ) as $parent) {
-		foreach ( $submenu[$parent] as $submenu_array ) {
-			if ( isset( $_wp_real_parent_file[$parent] ) )
-				$parent = $_wp_real_parent_file[$parent];
-			if ( $submenu_array[2] == $pagenow ) {
-				$parent_file = $parent;
-				return $parent;
-			} else
-				if ( isset( $plugin_page ) && ($plugin_page == $submenu_array[2] ) ) {
-					$parent_file = $parent;
-					return $parent;
-				}
-		}
-	}
-
-	$parent_file = '';
-	return '';
-}
-
-function add_menu_page( $page_title, $menu_title, $access_level, $file, $function = '' ) {
-	global $menu, $admin_page_hooks;
-
-	$file = plugin_basename( $file );
-
-	$menu[] = array ( $menu_title, $access_level, $file, $page_title );
-
-	$admin_page_hooks[$file] = sanitize_title( $menu_title );
-
-	$hookname = get_plugin_page_hookname( $file, '' );
-	if (!empty ( $function ) && !empty ( $hookname ))
-		add_action( $hookname, $function );
-
-	return $hookname;
-}
-
-function add_submenu_page( $parent, $page_title, $menu_title, $access_level, $file, $function = '' ) {
-	global $submenu;
-	global $menu;
-	global $_wp_real_parent_file;
-	global $_wp_submenu_nopriv;
-	global $_wp_menu_nopriv;
-
-	$file = plugin_basename( $file );
-
-	$parent = plugin_basename( $parent);
-	if ( isset( $_wp_real_parent_file[$parent] ) )
-		$parent = $_wp_real_parent_file[$parent];
-
-	if ( !current_user_can( $access_level ) ) {
-		$_wp_submenu_nopriv[$parent][$file] = true;
-		return false;
-	}
-
-	// If the parent doesn't already have a submenu, add a link to the parent
-	// as the first item in the submenu.  If the submenu file is the same as the
-	// parent file someone is trying to link back to the parent manually.  In
-	// this case, don't automatically add a link back to avoid duplication.
-	if (!isset( $submenu[$parent] ) && $file != $parent  ) {
-		foreach ( $menu as $parent_menu ) {
-			if ( $parent_menu[2] == $parent && current_user_can( $parent_menu[1] ) )
-				$submenu[$parent][] = $parent_menu;
-		}
-	}
-
-	$submenu[$parent][] = array ( $menu_title, $access_level, $file, $page_title );
-
-	$hookname = get_plugin_page_hookname( $file, $parent);
-	if (!empty ( $function ) && !empty ( $hookname ))
-		add_action( $hookname, $function );
-
-	return $hookname;
-}
-
-function add_options_page( $page_title, $menu_title, $access_level, $file, $function = '' ) {
-	return add_submenu_page( 'options-general.php', $page_title, $menu_title, $access_level, $file, $function );
-}
-
-function add_management_page( $page_title, $menu_title, $access_level, $file, $function = '' ) {
-	return add_submenu_page( 'edit.php', $page_title, $menu_title, $access_level, $file, $function );
-}
-
-function add_theme_page( $page_title, $menu_title, $access_level, $file, $function = '' ) {
-	return add_submenu_page( 'themes.php', $page_title, $menu_title, $access_level, $file, $function );
-}
-
-function add_users_page( $page_title, $menu_title, $access_level, $file, $function = '' ) {
-	if ( current_user_can('edit_users') )
-		$parent = 'users.php';
-	else
-		$parent = 'profile.php';
-	return add_submenu_page( $parent, $page_title, $menu_title, $access_level, $file, $function );
-}
-
-function validate_file( $file, $allowed_files = '' ) {
-	if ( false !== strpos( $file, './' ))
-		return 1;
-
-	if (':' == substr( $file, 1, 1 ))
-		return 2;
-
-	if (!empty ( $allowed_files ) && (!in_array( $file, $allowed_files ) ) )
-		return 3;
-
-	return 0;
-}
-
-function validate_file_to_edit( $file, $allowed_files = '' ) {
-	$file = stripslashes( $file );
-
-	$code = validate_file( $file, $allowed_files );
-
-	if (!$code )
-		return $file;
-
-	switch ( $code ) {
-		case 1 :
-			wp_die( __('Sorry, can&#8217;t edit files with ".." in the name. If you are trying to edit a file in your WordPress home directory, you can just type the name of the file in.' ));
-
-		case 2 :
-			wp_die( __('Sorry, can&#8217;t call files with their real path.' ));
-
-		case 3 :
-			wp_die( __('Sorry, that file cannot be edited.' ));
-	}
-}
-
-function get_home_path() {
-	$home = get_option( 'home' );
-	if ( $home != '' && $home != get_option( 'siteurl' ) ) {
-		$home_path = parse_url( $home );
-		$home_path = $home_path['path'];
-		$root = str_replace( $_SERVER["PHP_SELF"], '', $_SERVER["SCRIPT_FILENAME"] );
-		$home_path = trailingslashit( $root.$home_path );
-	} else {
-		$home_path = ABSPATH;
-	}
-
-	return $home_path;
-}
-
-function get_real_file_to_edit( $file ) {
-	if ('index.php' == $file || '.htaccess' == $file ) {
-		$real_file = get_home_path().$file;
-	} else {
-		$real_file = ABSPATH.$file;
-	}
-
-	return $real_file;
-}
-
-$wp_file_descriptions = array ('index.php' => __( 'Main Index Template' ), 'style.css' => __( 'Stylesheet' ), 'comments.php' => __( 'Comments' ), 'comments-popup.php' => __( 'Popup Comments' ), 'footer.php' => __( 'Footer' ), 'header.php' => __( 'Header' ), 'sidebar.php' => __( 'Sidebar' ), 'archive.php' => __( 'Archives' ), 'category.php' => __( 'Category Template' ), 'page.php' => __( 'Page Template' ), 'search.php' => __( 'Search Results' ), 'single.php' => __( 'Single Post' ), '404.php' => __( '404 Template' ), 'my-hacks.php' => __( 'my-hacks.php (legacy hacks support)' ), '.htaccess' => __( '.htaccess (for rewrite rules )' ),
-	// Deprecated files
-	'wp-layout.css' => __( 'Stylesheet' ), 'wp-comments.php' => __( 'Comments Template' ), 'wp-comments-popup.php' => __( 'Popup Comments Template' ));
-
-function get_file_description( $file ) {
-	global $wp_file_descriptions;
-
-	if ( isset( $wp_file_descriptions[basename( $file )] ) ) {
-		return $wp_file_descriptions[basename( $file )];
-	}
-	elseif ( file_exists( ABSPATH . $file ) && is_file( ABSPATH . $file ) ) {
-		$template_data = implode( '', file( ABSPATH . $file ) );
-		if ( preg_match( "|Template Name:(.*)|i", $template_data, $name ))
-			return $name[1];
-	}
-
-	return basename( $file );
-}
-
-function update_recently_edited( $file ) {
-	$oldfiles = (array ) get_option( 'recently_edited' );
-	if ( $oldfiles ) {
-		$oldfiles = array_reverse( $oldfiles );
-		$oldfiles[] = $file;
-		$oldfiles = array_reverse( $oldfiles );
-		$oldfiles = array_unique( $oldfiles );
-		if ( 5 < count( $oldfiles ))
-			array_pop( $oldfiles );
-	} else {
-		$oldfiles[] = $file;
-	}
-	update_option( 'recently_edited', $oldfiles );
-}
-
-function get_plugin_data( $plugin_file ) {
-	$plugin_data = implode( '', file( $plugin_file ));
-	preg_match( "|Plugin Name:(.*)|i", $plugin_data, $plugin_name );
-	preg_match( "|Plugin URI:(.*)|i", $plugin_data, $plugin_uri );
-	preg_match( "|Description:(.*)|i", $plugin_data, $description );
-	preg_match( "|Author:(.*)|i", $plugin_data, $author_name );
-	preg_match( "|Author URI:(.*)|i", $plugin_data, $author_uri );
-	if ( preg_match( "|Version:(.*)|i", $plugin_data, $version ))
-		$version = trim( $version[1] );
-	else
-		$version = '';
-
-	$description = wptexturize( trim( $description[1] ));
-
-	$name = $plugin_name[1];
-	$name = trim( $name );
-	$plugin = $name;
-	if ('' != $plugin_uri[1] && '' != $name ) {
-		$plugin = '<a href="' . trim( $plugin_uri[1] ) . '" title="'.__( 'Visit plugin homepage' ).'">'.$plugin.'</a>';
-	}
-
-	if ('' == $author_uri[1] ) {
-		$author = trim( $author_name[1] );
-	} else {
-		$author = '<a href="' . trim( $author_uri[1] ) . '" title="'.__( 'Visit author homepage' ).'">' . trim( $author_name[1] ) . '</a>';
-	}
-
-	return array('Name' => $name, 'Title' => $plugin, 'Description' => $description, 'Author' => $author, 'Version' => $version);
-}
-
-function get_plugins() {
-	global $wp_plugins;
-
-	if ( isset( $wp_plugins ) ) {
-		return $wp_plugins;
-	}
-
-	$wp_plugins = array ();
-	$plugin_root = ABSPATH . PLUGINDIR;
-
-	// Files in wp-content/plugins directory
-	$plugins_dir = @ dir( $plugin_root);
-	if ( $plugins_dir ) {
-		while (($file = $plugins_dir->read() ) !== false ) {
-			if ( substr($file, 0, 1) == '.' )
-				continue;
-			if ( is_dir( $plugin_root.'/'.$file ) ) {
-				$plugins_subdir = @ dir( $plugin_root.'/'.$file );
-				if ( $plugins_subdir ) {
-					while (($subfile = $plugins_subdir->read() ) !== false ) {
-						if ( substr($subfile, 0, 1) == '.' )
-							continue;
-						if ( substr($subfile, -4) == '.php' )
-							$plugin_files[] = "$file/$subfile";
-					}
-				}
-			} else {
-				if ( substr($file, -4) == '.php' )
-					$plugin_files[] = $file;
-			}
-		}
-	}
-
-	if ( !$plugins_dir || !$plugin_files )
-		return $wp_plugins;
-
-	foreach ( $plugin_files as $plugin_file ) {
-		if ( !is_readable( "$plugin_root/$plugin_file" ) )
-			continue;
-
-		$plugin_data = get_plugin_data( "$plugin_root/$plugin_file" );
-
-		if ( empty ( $plugin_data['Name'] ) )
-			continue;
-
-		$wp_plugins[plugin_basename( $plugin_file )] = $plugin_data;
-	}
-
-	uasort( $wp_plugins, create_function( '$a, $b', 'return strnatcasecmp( $a["Name"], $b["Name"] );' ));
-
-	return $wp_plugins;
-}
-
-function get_plugin_page_hookname( $plugin_page, $parent_page ) {
-	global $admin_page_hooks;
-
-	$parent = get_admin_page_parent();
-
-	if ( empty ( $parent_page ) || 'admin.php' == $parent_page ) {
-		if ( isset( $admin_page_hooks[$plugin_page] ))
-			$page_type = 'toplevel';
-		else
-			if ( isset( $admin_page_hooks[$parent] ))
-				$page_type = $admin_page_hooks[$parent];
-	} else
-		if ( isset( $admin_page_hooks[$parent_page] ) ) {
-			$page_type = $admin_page_hooks[$parent_page];
-		} else {
-			$page_type = 'admin';
-		}
-
-	$plugin_name = preg_replace( '!\.php!', '', $plugin_page );
-
-	return $page_type.'_page_'.$plugin_name;
-}
-
-function get_plugin_page_hook( $plugin_page, $parent_page ) {
-	global $wp_filter;
-
-	$hook = get_plugin_page_hookname( $plugin_page, $parent_page );
-	if ( isset( $wp_filter[$hook] ))
-		return $hook;
-	else
-		return '';
-}
-
-function browse_happy() {
-	$getit = __( 'WordPress recommends a better browser' );
-	echo '
-		<p id="bh" style="text-align: center;"><a href="http://browsehappy.com/" title="'.$getit.'"><img src="images/browse-happy.gif" alt="Browse Happy" /></a></p>
-		';
-}
-
-if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false)
-	add_action( 'admin_footer', 'browse_happy' );
-
-function documentation_link( $for ) {
-	return;
-}
-
-function register_importer( $id, $name, $description, $callback ) {
-	global $wp_importers;
-
-	$wp_importers[$id] = array ( $name, $description, $callback );
-}
-
-function get_importers() {
-	global $wp_importers;
-	uasort($wp_importers, create_function('$a, $b', 'return strcmp($a[0], $b[0]);'));
-	return $wp_importers;
-}
-
-function current_theme_info() {
-	$themes = get_themes();
-	$current_theme = get_current_theme();
-	$ct->name = $current_theme;
-	$ct->title = $themes[$current_theme]['Title'];
-	$ct->version = $themes[$current_theme]['Version'];
-	$ct->parent_theme = $themes[$current_theme]['Parent Theme'];
-	$ct->template_dir = $themes[$current_theme]['Template Dir'];
-	$ct->stylesheet_dir = $themes[$current_theme]['Stylesheet Dir'];
-	$ct->template = $themes[$current_theme]['Template'];
-	$ct->stylesheet = $themes[$current_theme]['Stylesheet'];
-	$ct->screenshot = $themes[$current_theme]['Screenshot'];
-	$ct->description = $themes[$current_theme]['Description'];
-	$ct->author = $themes[$current_theme]['Author'];
-	return $ct;
-}
-
-
-// array wp_handle_upload ( array &file [, array overrides] )
-// file: reference to a single element of $_FILES. Call the function once for each uploaded file.
-// overrides: an associative array of names=>values to override default variables with extract( $overrides, EXTR_OVERWRITE ).
-// On success, returns an associative array of file attributes.
-// On failure, returns $overrides['upload_error_handler'](&$file, $message ) or array( 'error'=>$message ).
-function wp_handle_upload( &$file, $overrides = false ) {
-	// The default error handler.
-	if (! function_exists( 'wp_handle_upload_error' ) ) {
-		function wp_handle_upload_error( &$file, $message ) {
-			return array( 'error'=>$message );
-		}
-	}
-
-	// You may define your own function and pass the name in $overrides['upload_error_handler']
-	$upload_error_handler = 'wp_handle_upload_error';
-
-	// $_POST['action'] must be set and its value must equal $overrides['action'] or this:
-	$action = 'wp_handle_upload';
-
-	// Courtesy of php.net, the strings that describe the error indicated in $_FILES[{form field}]['error'].
-	$upload_error_strings = array( false,
-		__( "The uploaded file exceeds the <code>upload_max_filesize</code> directive in <code>php.ini</code>." ),
-		__( "The uploaded file exceeds the <em>MAX_FILE_SIZE</em> directive that was specified in the HTML form." ),
-		__( "The uploaded file was only partially uploaded." ),
-		__( "No file was uploaded." ),
-		__( "Missing a temporary folder." ),
-		__( "Failed to write file to disk." ));
-
-	// All tests are on by default. Most can be turned off by $override[{test_name}] = false;
-	$test_form = true;
-	$test_size = true;
-
-	// If you override this, you must provide $ext and $type!!!!
-	$test_type = true;
-
-	// Install user overrides. Did we mention that this voids your warranty?
-	if ( is_array( $overrides ) )
-		extract( $overrides, EXTR_OVERWRITE );
-
-	// A correct form post will pass this test.
-	if ( $test_form && (!isset( $_POST['action'] ) || ($_POST['action'] != $action ) ) )
-		return $upload_error_handler( $file, __( 'Invalid form submission.' ));
-
-	// A successful upload will pass this test. It makes no sense to override this one.
-	if ( $file['error'] > 0 )
-		return $upload_error_handler( $file, $upload_error_strings[$file['error']] );
-
-	// A non-empty file will pass this test.
-	if ( $test_size && !($file['size'] > 0 ) )
-		return $upload_error_handler( $file, __( 'File is empty. Please upload something more substantial.' ));
-
-	// A properly uploaded file will pass this test. There should be no reason to override this one.
-	if (! @ is_uploaded_file( $file['tmp_name'] ) )
-		return $upload_error_handler( $file, __( 'Specified file failed upload test.' ));
-
-	// A correct MIME type will pass this test. Override $mimes or use the upload_mimes filter.
-	if ( $test_type ) {
-		$wp_filetype = wp_check_filetype( $file['name'], $mimes );
-
-		extract( $wp_filetype );
-
-		if ( !$type || !$ext )
-			return $upload_error_handler( $file, __( 'File type does not meet security guidelines. Try another.' ));
-	}
-
-	// A writable uploads dir will pass this test. Again, there's no point overriding this one.
-	if ( ! ( ( $uploads = wp_upload_dir() ) && false === $uploads['error'] ) )
-		return $upload_error_handler( $file, $uploads['error'] );
-
-	// Increment the file number until we have a unique file to save in $dir. Use $override['unique_filename_callback'] if supplied.
-	if ( isset( $unique_filename_callback ) && function_exists( $unique_filename_callback ) ) {
-		$filename = $unique_filename_callback( $uploads['path'], $file['name'] );
-	} else {
-		$number = '';
-		$filename = str_replace( '#', '_', $file['name'] );
-		$filename = str_replace( array( '\\', "'" ), '', $filename );
-		if ( empty( $ext) )
-			$ext = '';
-		else
-			$ext = ".$ext";
-		while ( file_exists( $uploads['path'] . "/$filename" ) ) {
-			if ( '' == "$number$ext" )
-				$filename = $filename . ++$number . $ext;
-			else
-				$filename = str_replace( "$number$ext", ++$number . $ext, $filename );
-		}
-		$filename = str_replace( $ext, '', $filename );
-		$filename = sanitize_title_with_dashes( $filename ) . $ext;
-	}
-
-	// Move the file to the uploads dir
-	$new_file = $uploads['path'] . "/$filename";
-	if ( false === @ move_uploaded_file( $file['tmp_name'], $new_file ) )
-		wp_die( printf( __('The uploaded file could not be moved to %s.' ), $uploads['path'] ));
-
-	// Set correct file permissions
-	$stat = stat( dirname( $new_file ));
-	$perms = $stat['mode'] & 0000666;
-	@ chmod( $new_file, $perms );
-
-	// Compute the URL
-	$url = $uploads['url'] . "/$filename";
-
-	$return = apply_filters( 'wp_handle_upload', array( 'file' => $new_file, 'url' => $url, 'type' => $type ) );
-
-	return $return;
-}
-
-function wp_shrink_dimensions( $width, $height, $wmax = 128, $hmax = 96 ) {
-	if ( $height <= $hmax && $width <= $wmax )
-		return array( $width, $height);
-	elseif ( $width / $height > $wmax / $hmax )
-		return array( $wmax, (int) ($height / $width * $wmax ));
-	else
-		return array( (int) ($width / $height * $hmax ), $hmax );
-}
-
-function wp_import_cleanup( $id ) {
-	wp_delete_attachment( $id );
-}
-
-function wp_import_upload_form( $action ) {
-	$size = strtolower( ini_get( 'upload_max_filesize' ) );
-	$bytes = 0;
-	if (strpos($size, 'k') !== false)
-		$bytes = $size * 1024;
-	if (strpos($size, 'm') !== false)
-		$bytes = $size * 1024 * 1024;
-	if (strpos($size, 'g') !== false)
-		$bytes = $size * 1024 * 1024 * 1024;
-?>
-<form enctype="multipart/form-data" id="import-upload-form" method="post" action="<?php echo attribute_escape($action) ?>">
-<p>
-<?php wp_nonce_field('import-upload'); ?>
-<label for="upload"><?php _e( 'Choose a file from your computer:' ); ?></label> (<?php printf( __('Maximum size: %s' ), $size ); ?> )
-<input type="file" id="upload" name="import" size="25" />
-<input type="hidden" name="action" value="save" />
-<input type="hidden" name="max_file_size" value="<?php echo $bytes; ?>" />
-</p>
-<p class="submit">
-<input type="submit" value="<?php _e( 'Upload file and import' ); ?> &raquo;" />
-</p>
-</form>
-<?php
-}
-
-function wp_import_handle_upload() {
-	$overrides = array( 'test_form' => false, 'test_type' => false );
-	$file = wp_handle_upload( $_FILES['import'], $overrides );
-
-	if ( isset( $file['error'] ) )
-		return $file;
-
-	$url = $file['url'];
-	$type = $file['type'];
-	$file = addslashes( $file['file'] );
-	$filename = basename( $file );
-
-	// Construct the object array
-	$object = array( 'post_title' => $filename,
-		'post_content' => $url,
-		'post_mime_type' => $type,
-		'guid' => $url
-	);
-
-	// Save the data
-	$id = wp_insert_attachment( $object, $file );
-
-	return array( 'file' => $file, 'id' => $id );
-}
-
-function the_attachment_links( $id = false ) {
-	$id = (int) $id;
-	$post = & get_post( $id );
-
-	if ( $post->post_type != 'attachment' )
-		return false;
-
-	$icon = get_attachment_icon( $post->ID );
-	$attachment_data = wp_get_attachment_metadata( $id );
-	$thumb = isset( $attachment_data['thumb'] );
-?>
-<form id="the-attachment-links">
-<table>
-	<col />
-	<col class="widefat" />
-	<tr>
-		<th scope="row"><?php _e( 'URL' ) ?></th>
-		<td><textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><?php echo wp_get_attachment_url(); ?></textarea></td>
-	</tr>
-<?php if ( $icon ) : ?>
-	<tr>
-		<th scope="row"><?php $thumb ? _e( 'Thumbnail linked to file' ) : _e( 'Image linked to file' ); ?></th>
-		<td><textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><a href="<?php echo wp_get_attachment_url(); ?>"><?php echo $icon ?></a></textarea></td>
-	</tr>
-	<tr>
-		<th scope="row"><?php $thumb ? _e( 'Thumbnail linked to page' ) : _e( 'Image linked to page' ); ?></th>
-		<td><textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><a href="<?php echo get_attachment_link( $post->ID ) ?>" rel="attachment wp-att-<?php echo $post->ID; ?>"><?php echo $icon ?></a></textarea></td>
-	</tr>
-<?php else : ?>
-	<tr>
-		<th scope="row"><?php _e( 'Link to file' ) ?></th>
-		<td><textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><a href="<?php echo wp_get_attachment_url(); ?>" class="attachmentlink"><?php echo basename( wp_get_attachment_url() );  ?></a></textarea></td>
-	</tr>
-	<tr>
-		<th scope="row"><?php _e( 'Link to page' ) ?></th>
-		<td><textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><a href="<?php echo get_attachment_link( $post->ID ) ?>" rel="attachment wp-att-<?php echo $post->ID ?>"><?php the_title(); ?></a></textarea></td>
-	</tr>
-<?php endif; ?>
-</table>
-</form>
-<?php
-}
-
-function get_udims( $width, $height) {
-	if ( $height <= 96 && $width <= 128 )
-		return array( $width, $height);
-	elseif ( $width / $height > 4 / 3 )
-		return array( 128, (int) ($height / $width * 128 ));
-	else
-		return array( (int) ($width / $height * 96 ), 96 );
-}
-
-function wp_reset_vars( $vars ) {
-	for ( $i=0; $i<count( $vars ); $i += 1 ) {
-		$var = $vars[$i];
-		global $$var;
-
-		if (!isset( $$var ) ) {
-			if ( empty( $_POST["$var"] ) ) {
-				if ( empty( $_GET["$var"] ) )
-					$$var = '';
-				else
-					$$var = $_GET["$var"];
-			} else {
-				$$var = $_POST["$var"];
-			}
-		}
-	}
-}
-
-
-function wp_remember_old_slug() {
-	global $post;
-	$name = attribute_escape($post->post_name); // just in case
-	if ( strlen($name) )
-		echo '<input type="hidden" id="wp-old-slug" name="wp-old-slug" value="' . $name . '" />';
-}
-
-
-// If siteurl or home changed, reset cookies and flush rewrite rules.
-function update_home_siteurl( $old_value, $value ) {
-	global $wp_rewrite, $user_login, $user_pass_md5;
-
-	if ( defined( "WP_INSTALLING" ) )
-		return;
-
-	// If home changed, write rewrite rules to new location.
-	$wp_rewrite->flush_rules();
-	// Clear cookies for old paths.
-	wp_clearcookie();
-	// Set cookies for new paths.
-	wp_setcookie( $user_login, $user_pass_md5, true, get_option( 'home' ), get_option( 'siteurl' ));
-}
-
-add_action( 'update_option_home', 'update_home_siteurl', 10, 2 );
-add_action( 'update_option_siteurl', 'update_home_siteurl', 10, 2 );
-
-function wp_crop_image( $src_file, $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h, $src_abs = false, $dst_file = false ) {
-	if ( ctype_digit( $src_file ) ) // Handle int as attachment ID
-		$src_file = get_attached_file( $src_file );
-
-	$src = wp_load_image( $src_file );
-
-	if ( !is_resource( $src ))
-		return $src;
-
-	$dst = imagecreatetruecolor( $dst_w, $dst_h );
-
-	if ( $src_abs ) {
-		$src_w -= $src_x;
-		$src_h -= $src_y;
-	}
-
-	if (function_exists('imageantialias'))
-		imageantialias( $dst, true );
-	
-	imagecopyresampled( $dst, $src, 0, 0, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h );
-
-	if ( !$dst_file )
-		$dst_file = str_replace( basename( $src_file ), 'cropped-'.basename( $src_file ), $src_file );
-
-	$dst_file = preg_replace( '/\\.[^\\.]+$/', '.jpg', $dst_file );
-
-	if ( imagejpeg( $dst, $dst_file ) )
-		return $dst_file;
-	else
-		return false;
-}
-
-function wp_load_image( $file ) {
-	if ( ctype_digit( $file ) )
-		$file = get_attached_file( $file );
-
-	if ( !file_exists( $file ) )
-		return sprintf(__("File '%s' doesn't exist?"), $file);
-
-	if ( ! function_exists('imagecreatefromstring') )
-		return __('The GD image library is not installed.');
-
-	$contents = file_get_contents( $file );
-
-	$image = imagecreatefromstring( $contents );
-
-	if ( !is_resource( $image ) )
-		return sprintf(__("File '%s' is not an image."), $file);
-
-	return $image;
-}
-
-function wp_generate_attachment_metadata( $attachment_id, $file ) {
-	$attachment = get_post( $attachment_id );
-
-	$metadata = array();
-	if ( preg_match('!^image/!', get_post_mime_type( $attachment )) ) {
-		$imagesize = getimagesize($file);
-		$metadata['width'] = $imagesize['0'];
-		$metadata['height'] = $imagesize['1'];
-		list($uwidth, $uheight) = get_udims($metadata['width'], $metadata['height']);
-		$metadata['hwstring_small'] = "height='$uheight' width='$uwidth'";
-		$metadata['file'] = $file;
-
-		$max = apply_filters( 'wp_thumbnail_creation_size_limit', 3 * 1024 * 1024, $attachment_id, $file );
-
-		if ( $max < 0 || $metadata['width'] * $metadata['height'] < $max ) {
-			$max_side = apply_filters( 'wp_thumbnail_max_side_length', 128, $attachment_id, $file );
-			$thumb = wp_create_thumbnail( $file, $max_side );
-
-			if ( @file_exists($thumb) )
-				$metadata['thumb'] = basename($thumb);
-		}
-	}
-	return apply_filters( 'wp_generate_attachment_metadata', $metadata );
-}
-
-function wp_create_thumbnail( $file, $max_side, $effect = '' ) {
-
-		// 1 = GIF, 2 = JPEG, 3 = PNG
-
-	if ( file_exists( $file ) ) {
-		$type = getimagesize( $file );
-
-		// if the associated function doesn't exist - then it's not
-		// handle. duh. i hope.
-
-		if (!function_exists( 'imagegif' ) && $type[2] == 1 ) {
-			$error = __( 'Filetype not supported. Thumbnail not created.' );
-		}
-		elseif (!function_exists( 'imagejpeg' ) && $type[2] == 2 ) {
-			$error = __( 'Filetype not supported. Thumbnail not created.' );
-		}
-		elseif (!function_exists( 'imagepng' ) && $type[2] == 3 ) {
-			$error = __( 'Filetype not supported. Thumbnail not created.' );
-		} else {
-
-			// create the initial copy from the original file
-			if ( $type[2] == 1 ) {
-				$image = imagecreatefromgif( $file );
-			}
-			elseif ( $type[2] == 2 ) {
-				$image = imagecreatefromjpeg( $file );
-			}
-			elseif ( $type[2] == 3 ) {
-				$image = imagecreatefrompng( $file );
-			}
-
-			if ( function_exists( 'imageantialias' ))
-				imageantialias( $image, TRUE );
-
-			$image_attr = getimagesize( $file );
-
-			// figure out the longest side
-
-			if ( $image_attr[0] > $image_attr[1] ) {
-				$image_width = $image_attr[0];
-				$image_height = $image_attr[1];
-				$image_new_width = $max_side;
-
-				$image_ratio = $image_width / $image_new_width;
-				$image_new_height = $image_height / $image_ratio;
-				//width is > height
-			} else {
-				$image_width = $image_attr[0];
-				$image_height = $image_attr[1];
-				$image_new_height = $max_side;
-
-				$image_ratio = $image_height / $image_new_height;
-				$image_new_width = $image_width / $image_ratio;
-				//height > width
-			}
-
-			$thumbnail = imagecreatetruecolor( $image_new_width, $image_new_height);
-			@ imagecopyresampled( $thumbnail, $image, 0, 0, 0, 0, $image_new_width, $image_new_height, $image_attr[0], $image_attr[1] );
-
-			// If no filters change the filename, we'll do a default transformation.
-			if ( basename( $file ) == $thumb = apply_filters( 'thumbnail_filename', basename( $file ) ) )
-				$thumb = preg_replace( '!(\.[^.]+)?$!', '.thumbnail' . '$1', basename( $file ), 1 );
-
-			$thumbpath = str_replace( basename( $file ), $thumb, $file );
-
-			// move the thumbnail to its final destination
-			if ( $type[2] == 1 ) {
-				if (!imagegif( $thumbnail, $thumbpath ) ) {
-					$error = __( "Thumbnail path invalid" );
-				}
-			}
-			elseif ( $type[2] == 2 ) {
-				if (!imagejpeg( $thumbnail, $thumbpath ) ) {
-					$error = __( "Thumbnail path invalid" );
-				}
-			}
-			elseif ( $type[2] == 3 ) {
-				if (!imagepng( $thumbnail, $thumbpath ) ) {
-					$error = __( "Thumbnail path invalid" );
-				}
-			}
-
-		}
-	} else {
-		$error = __( 'File not found' );
-	}
-
-	if (!empty ( $error ) ) {
-		return $error;
-	} else {
-		return apply_filters( 'wp_create_thumbnail', $thumbpath );
-	}
-}
-
+// Deprecated.  Use includes/admin.php.
+_deprecated_file( basename(__FILE__), '2.5', 'wp-admin/includes/admin.php' );
+require_once(ABSPATH . 'wp-admin/includes/admin.php');
 ?>
diff -x .svn -aruN 2.2.2.src/wp-admin/admin-header.php 2.5.src/wp-admin/admin-header.php
--- 2.2.2.src/wp-admin/admin-header.php	2007-04-13 19:16:38.000000000 -0500
+++ 2.5.src/wp-admin/admin-header.php	2008-03-26 02:14:07.000000000 -0500
@@ -1,14 +1,24 @@
 <?php
-@header('Content-type: ' . get_option('html_type') . '; charset=' . get_option('blog_charset'));
+@header('Content-Type: ' . get_option('html_type') . '; charset=' . get_option('blog_charset'));
 if (!isset($_GET["page"])) require_once('admin.php');
 if ( $editing ) {
-	wp_enqueue_script( array('dbx-admin-key?pagenow=' . attribute_escape($pagenow),'admin-custom-fields') );
-	if ( current_user_can('manage_categories') )
-		wp_enqueue_script( 'ajaxcat' );
 	if ( user_can_richedit() )
 		wp_enqueue_script( 'wp_tiny_mce' );
 }
 
+$min_width_pages = array( 'post.php', 'post-new.php', 'page.php', 'page-new.php', 'widgets.php', 'comment.php', 'link.php' );
+$the_current_page = preg_replace('|^.*/wp-admin/|i', '', $_SERVER['PHP_SELF']);
+$ie6_no_scrollbar = true;
+
+function add_minwidth($c) {
+	return $c . 'minwidth ';
+}
+
+if ( in_array( $the_current_page, $min_width_pages ) ) {
+		$ie6_no_scrollbar = false;
+		add_filter( 'admin_body_class', 'add_minwidth' );
+}
+
 get_admin_page_title();
 
 ?>
@@ -17,16 +27,21 @@
 <head>
 <meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php echo get_option('blog_charset'); ?>" />
 <title><?php bloginfo('name') ?> &rsaquo; <?php echo wp_specialchars( strip_tags( $title ) ); ?> &#8212; WordPress</title>
-<link rel="stylesheet" href="<?php echo get_option('siteurl') ?>/wp-admin/wp-admin.css?version=<?php bloginfo('version'); ?>" type="text/css" />
-<?php if ( ('rtl' == $wp_locale->text_direction) ) : ?>
-<link rel="stylesheet" href="<?php echo get_option('siteurl') ?>/wp-admin/rtl.css?version=<?php bloginfo('version'); ?>" type="text/css" />
-<?php endif; ?> 
+<?php
+wp_admin_css( 'css/global' );
+wp_admin_css();
+wp_admin_css( 'css/colors' );
+?>
+<!--[if gte IE 6]>
+<?php wp_admin_css( 'css/ie' );
+?>
+<![endif]-->
 <script type="text/javascript">
 //<![CDATA[
-function addLoadEvent(func) {if ( typeof wpOnload!='function'){wpOnload=func;}else{ var oldonload=wpOnload;wpOnload=function(){oldonload();func();}}}
+addLoadEvent = function(func) {if (typeof jQuery != "undefined") jQuery(document).ready(func); else if (typeof wpOnload!='function'){wpOnload=func;} else {var oldonload=wpOnload; wpOnload=function(){oldonload();func();}}};
 //]]>
 </script>
-<?php if ( ($parent_file != 'link-manager.php') && ($parent_file != 'options-general.php') ) : ?>
+<?php if ( ($parent_file != 'link-manager.php') && ($parent_file != 'options-general.php') && $ie6_no_scrollbar ) : ?>
 <style type="text/css">* html { overflow-x: hidden; }</style>
 <?php endif;
 if ( isset($page_hook) )
@@ -42,16 +57,19 @@
 do_action('admin_head');
 ?>
 </head>
-<body>
+<body class="wp-admin <?php echo apply_filters( 'admin_body_class', '' ); ?>">
+<div id="wpwrap">
+<div id="wpcontent">
 <div id="wphead">
-<h1><?php bloginfo('name'); ?> <span>(<a href="<?php echo get_option('home') . '/'; ?>"><?php _e('View site &raquo;') ?></a>)</span></h1>
+<h1><?php bloginfo('name'); ?><span id="viewsite"><a href="<?php echo trailingslashit( get_option('home') ); ?>"><?php _e('Visit Site') ?></a></span></h1>
 </div>
-<div id="user_info"><p><?php printf(__('Howdy, <strong>%s</strong>.'), $user_identity) ?> [<a href="<?php echo get_option('siteurl'); ?>/wp-login.php?action=logout" title="<?php _e('Log out of this account') ?>"><?php _e('Sign Out'); ?></a>, <a href="profile.php"><?php _e('My Profile'); ?></a>] </p></div>
+<div id="user_info"><p><?php printf(__('Howdy, <a href="%1$s">%2$s</a>!'), 'profile.php', $user_identity) ?> | <a href="<?php echo get_option('siteurl'); ?>/wp-login.php?action=logout" title="<?php _e('Log Out') ?>"><?php _e('Log Out'); ?></a> | <?php _e('<a href="http://codex.wordpress.org/">Help</a>') ?> | <?php _e('<a href="http://wordpress.org/support/">Forums</a>') ?></p></div>
 
 <?php
-require(ABSPATH . '/wp-admin/menu-header.php');
+require(ABSPATH . 'wp-admin/menu-header.php');
 
 if ( $parent_file == 'options-general.php' ) {
-	require(ABSPATH . '/wp-admin/options-head.php');
+	require(ABSPATH . 'wp-admin/options-head.php');
 }
 ?>
+<div id="wpbody">
diff -x .svn -aruN 2.2.2.src/wp-admin/admin.php 2.5.src/wp-admin/admin.php
--- 2.2.2.src/wp-admin/admin.php	2007-02-15 02:16:43.000000000 -0600
+++ 2.5.src/wp-admin/admin.php	2008-03-11 19:12:34.000000000 -0500
@@ -1,4 +1,6 @@
 <?php
+define('WP_ADMIN', TRUE);
+
 if ( defined('ABSPATH') )
 	require_once( ABSPATH . 'wp-config.php');
 else
@@ -9,9 +11,7 @@
 	exit;
 }
 
-require_once(ABSPATH . 'wp-admin/admin-functions.php');
-require_once(ABSPATH . 'wp-admin/admin-db.php');
-require_once(ABSPATH . WPINC . '/registration.php');
+require_once(ABSPATH . 'wp-admin/includes/admin.php');
 
 auth_redirect();
 
@@ -19,8 +19,6 @@
 
 update_category_cache();
 
-wp_get_current_user();
-
 $posts_per_page = get_option('posts_per_page');
 $what_to_show = get_option('what_to_show');
 $date_format = get_option('date_format');
@@ -28,7 +26,11 @@
 
 wp_reset_vars(array('profile', 'redirect', 'redirect_url', 'a', 'popuptitle', 'popupurl', 'text', 'trackback', 'pingback'));
 
-wp_enqueue_script( 'fat' );
+wp_admin_css_color('classic', __('Classic'), get_option( 'siteurl' ) . "/wp-admin/css/colors-classic.css", array('#07273E', '#14568A', '#D54E21', '#2683AE'));
+wp_admin_css_color('fresh', __('Fresh'), get_option( 'siteurl' ) . "/wp-admin/css/colors-fresh.css", array('#464646', '#CEE1EF', '#D54E21', '#2683AE'));
+
+wp_enqueue_script( 'common' );
+wp_enqueue_script( 'jquery-color' );
 
 $editing = false;
 
@@ -37,7 +39,9 @@
 	$plugin_page = plugin_basename($plugin_page);
 }
 
-require(ABSPATH . '/wp-admin/menu.php');
+require(ABSPATH . 'wp-admin/menu.php');
+
+do_action('admin_init');
 
 // Handle plugin admin pages.
 if (isset($plugin_page)) {
@@ -46,7 +50,7 @@
 	if ( $page_hook ) {
 		do_action('load-' . $page_hook);
 		if (! isset($_GET['noheader']))
-			require_once(ABSPATH . '/wp-admin/admin-header.php');
+			require_once(ABSPATH . 'wp-admin/admin-header.php');
 
 		do_action($page_hook);
 	} else {
@@ -54,13 +58,13 @@
 			wp_die(__('Invalid plugin page'));
 		}
 
-		if (! file_exists(ABSPATH . PLUGINDIR . "/$plugin_page"))
+		if (! ( file_exists(ABSPATH . PLUGINDIR . "/$plugin_page") && is_file( ABSPATH . PLUGINDIR . "/$plugin_page") ) )
 			wp_die(sprintf(__('Cannot load %s.'), htmlentities($plugin_page)));
 
 		do_action('load-' . $plugin_page);
 
 		if (! isset($_GET['noheader']))
-			require_once(ABSPATH . '/wp-admin/admin-header.php');
+			require_once(ABSPATH . 'wp-admin/admin-header.php');
 
 		include(ABSPATH . PLUGINDIR . "/$plugin_page");
 	}
@@ -79,10 +83,15 @@
 		wp_die(__('Invalid importer.'));
 	}
 
-	if (! file_exists(ABSPATH . "wp-admin/import/$importer.php"))
-		wp_die(__('Cannot load importer.'));
-
-	include(ABSPATH . "wp-admin/import/$importer.php");
+	// Allow plugins to define importers as well
+	if (! is_callable($wp_importers[$importer][2]))
+	{
+		if (! file_exists(ABSPATH . "wp-admin/import/$importer.php"))
+		{
+			wp_die(__('Cannot load importer.'));
+		}
+		include(ABSPATH . "wp-admin/import/$importer.php");
+	}
 
 	$parent_file = 'edit.php';
 	$submenu_file = 'import.php';
@@ -91,7 +100,7 @@
 	if (! isset($_GET['noheader']))
 		require_once(ABSPATH . 'wp-admin/admin-header.php');
 
-	require_once(ABSPATH . 'wp-admin/upgrade-functions.php');
+	require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
 
 	define('WP_IMPORTING', true);
 
diff -x .svn -aruN 2.2.2.src/wp-admin/async-upload.php 2.5.src/wp-admin/async-upload.php
--- 2.2.2.src/wp-admin/async-upload.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/async-upload.php	2008-02-13 17:16:11.000000000 -0600
@@ -0,0 +1,32 @@
+<?php
+
+/* This accepts file uploads from swfupload or other asynchronous upload methods.
+
+*/
+
+if ( defined('ABSPATH') )
+	require_once( ABSPATH . 'wp-config.php');
+else
+    require_once('../wp-config.php');
+
+// Flash often fails to send cookies with the POST or upload, so we need to pass it in GET or POST instead
+if ( empty($_COOKIE[AUTH_COOKIE]) && !empty($_REQUEST['auth_cookie']) )
+	$_COOKIE[AUTH_COOKIE] = $_REQUEST['auth_cookie'];
+unset($current_user);
+require_once('admin.php');
+
+header('Content-Type: text/plain');
+
+if ( !current_user_can('upload_files') )
+	wp_die(__('You do not have permission to upload files.'));
+
+$id = media_handle_upload('async-upload', $_REQUEST['post_id']);
+if (is_wp_error($id)) {
+	echo '<div id="media-upload-error">'.wp_specialchars($id->get_error_message()).'</div>';
+	exit;
+}
+
+$type = $_REQUEST['type'];
+echo apply_filters("async_upload_{$type}", $id);
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/bookmarklet.php 2.5.src/wp-admin/bookmarklet.php
--- 2.2.2.src/wp-admin/bookmarklet.php	2007-03-17 03:46:59.000000000 -0500
+++ 2.5.src/wp-admin/bookmarklet.php	2008-03-02 14:17:30.000000000 -0600
@@ -51,7 +51,10 @@
 <head>
 <title><?php bloginfo('name') ?> &rsaquo; Bookmarklet &#8212; WordPress</title>
 <meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php echo get_option('blog_charset'); ?>" />
-<link rel="stylesheet" href="wp-admin.css" type="text/css" />
+<?php
+wp_admin_css( 'css/global' );
+wp_admin_css();
+?>
 
 <style type="text/css">
 <!--
diff -x .svn -aruN 2.2.2.src/wp-admin/cat.js 2.5.src/wp-admin/cat.js
--- 2.2.2.src/wp-admin/cat.js	2007-04-17 15:56:41.000000000 -0500
+++ 2.5.src/wp-admin/cat.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,10 +0,0 @@
-addLoadEvent(function(){catList=new listMan('categorychecklist');catList.ajaxRespEl='jaxcat';catList.topAdder=1;catList.alt=0;catList.showLink=0;});
-addLoadEvent(newCatAddIn);
-function newCatAddIn() {
-	var jaxcat = $('jaxcat');
-	if ( !jaxcat )
-		return false;
-	Element.update(jaxcat,'<span id="ajaxcat"><input type="text" name="newcat" id="newcat" size="16" autocomplete="off"/><input type="button" name="Button" id="catadd" value="' + catL10n.add + '"/><input type="hidden"/><span id="howto">' + catL10n.how + '</span></span>');
-	$('newcat').onkeypress = function(e) { return killSubmit("catList.ajaxAdder('category','jaxcat');", e); };
-	$('catadd').onclick = function() { catList.ajaxAdder('category', 'jaxcat'); };
-}
diff -x .svn -aruN 2.2.2.src/wp-admin/categories.js 2.5.src/wp-admin/categories.js
--- 2.2.2.src/wp-admin/categories.js	2007-03-27 18:51:26.000000000 -0500
+++ 2.5.src/wp-admin/categories.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,16 +0,0 @@
-addLoadEvent(function() {
-	if (!theList.theList) return false;
-	document.forms.addcat.submit.onclick = function(e) {return killSubmit('theList.ajaxAdder("cat", "addcat");', e); };
-	theList.addComplete = function(what, where, update, transport) {
-		var name = getNodeValue(transport.responseXML, 'name').unescapeHTML();
-		var id = transport.responseXML.getElementsByTagName(what)[0].getAttribute('id');
-		var options = document.forms['addcat'].category_parent.options;
-		options[options.length] = new Option(name, id);
-	};
-	theList.delComplete = function(what, id) {
-		var options = document.forms['addcat'].category_parent.options;
-		for ( var o = 0; o < options.length; o++ )
-			if ( id == options[o].value )
-				options[o] = null;
-	};
-});
diff -x .svn -aruN 2.2.2.src/wp-admin/categories.php 2.5.src/wp-admin/categories.php
--- 2.2.2.src/wp-admin/categories.php	2007-04-19 17:26:52.000000000 -0500
+++ 2.5.src/wp-admin/categories.php	2008-03-23 01:41:43.000000000 -0500
@@ -6,6 +6,9 @@
 
 wp_reset_vars(array('action', 'cat'));
 
+if ( isset($_GET['deleteit']) && isset($_GET['delete']) )
+	$action = 'bulk-delete';
+
 switch($action) {
 
 case 'addcat':
@@ -36,9 +39,6 @@
     if ( $cat_ID == get_option('default_category') )
 		wp_die(sprintf(__("Can&#8217;t delete the <strong>%s</strong> category: this is the default one"), $cat_name));
 
-    if ( $cat_ID == get_option('default_link_category') )
-		wp_die(sprintf(__("Can&#8217;t delete the <strong>%s</strong> category: this is the default one for links"), $cat_name));
-
 	wp_delete_category($cat_ID);
 
 	wp_redirect('categories.php?message=2');
@@ -46,6 +46,29 @@
 
 break;
 
+case 'bulk-delete':
+	check_admin_referer('bulk-categories');
+
+	if ( !current_user_can('manage_categories') )
+		wp_die( __('You are not allowed to delete categories.') );
+
+	foreach ( (array) $_GET['delete'] as $cat_ID ) {
+		$cat_name = get_catname($cat_ID);
+
+		// Don't delete the default cats.
+		if ( $cat_ID == get_option('default_category') )
+			wp_die(sprintf(__("Can&#8217;t delete the <strong>%s</strong> category: this is the default one"), $cat_name));
+
+		wp_delete_category($cat_ID);
+	}
+
+	$sendback = wp_get_referer();
+	$sendback = preg_replace('|[^a-z0-9-~+_.?#=&;,/:]|i', '', $sendback);
+
+	wp_redirect($sendback);
+	exit();
+
+break;
 case 'edit':
 
 	require_once ('admin-header.php');
@@ -63,16 +86,23 @@
 		wp_die(__('Cheatin&#8217; uh?'));
 
 	if ( wp_update_category($_POST) )
-		wp_redirect('categories.php?message=3'); 
+		wp_redirect('categories.php?message=3');
 	else
-		wp_redirect('categories.php?message=5'); 
+		wp_redirect('categories.php?message=5');
 
 	exit;
 break;
 
 default:
 
+if ( !empty($_GET['_wp_http_referer']) ) {
+	 wp_redirect(remove_query_arg(array('_wp_http_referer', '_wpnonce'), stripslashes($_SERVER['REQUEST_URI'])));
+	 exit;
+}
+
 wp_enqueue_script( 'admin-categories' );
+wp_enqueue_script('admin-forms');
+
 require_once ('admin-header.php');
 
 $messages[1] = __('Category added.');
@@ -84,40 +114,68 @@
 
 <?php if (isset($_GET['message'])) : ?>
 <div id="message" class="updated fade"><p><?php echo $messages[$_GET['message']]; ?></p></div>
-<?php endif; ?>
+<?php $_SERVER['REQUEST_URI'] = remove_query_arg(array('message'), $_SERVER['REQUEST_URI']);
+endif; ?>
 
 <div class="wrap">
+<form id="posts-filter" action="" method="get">
 <?php if ( current_user_can('manage_categories') ) : ?>
-	<h2><?php printf(__('Categories (<a href="%s">add new</a>)'), '#addcat') ?> </h2>
+	<h2><?php printf(__('Manage Categories (<a href="%s">add new</a>)'), '#addcat') ?> </h2>
 <?php else : ?>
-	<h2><?php _e('Categories') ?> </h2>
+	<h2><?php _e('Manage Categories') ?> </h2>
 <?php endif; ?>
+
+<p id="post-search">
+	<input type="text" id="post-search-input" name="s" value="<?php echo attribute_escape(stripslashes($_GET['s'])); ?>" />
+	<input type="submit" value="<?php _e( 'Search Categories' ); ?>" class="button" />
+</p>
+
+<br class="clear" />
+
+<div class="tablenav">
+
+<div class="alignleft">
+<input type="submit" value="<?php _e('Delete'); ?>" name="deleteit" class="button-secondary delete" />
+<?php wp_nonce_field('bulk-categories'); ?>
+</div>
+
+<br class="clear" />
+</div>
+
+<br class="clear" />
+
 <table class="widefat">
 	<thead>
 	<tr>
-		<th scope="col" style="text-align: center"><?php _e('ID') ?></th>
+		<th scope="col" class="check-column"><input type="checkbox" onclick="checkAll(document.getElementById('posts-filter'));" /></th>
         <th scope="col"><?php _e('Name') ?></th>
         <th scope="col"><?php _e('Description') ?></th>
-        <th scope="col" width="90" style="text-align: center"><?php _e('Posts') ?></th>
-        <th scope="col" width="90" style="text-align: center"><?php _e('Links') ?></th>
-        <th colspan="2" style="text-align: center"><?php _e('Action') ?></th>
+        <th scope="col" class="num"><?php _e('Posts') ?></th>
 	</tr>
 	</thead>
-	<tbody id="the-list">
+	<tbody id="the-list" class="list:cat">
 <?php
 cat_rows();
 ?>
 	</tbody>
 </table>
+</form>
+
+<div class="tablenav">
+<br class="clear" />
+</div>
+<br class="clear" />
 
 </div>
 
 <?php if ( current_user_can('manage_categories') ) : ?>
 <div class="wrap">
-<p><?php printf(__('<strong>Note:</strong><br />Deleting a category does not delete the posts and links in that category. Instead, posts that were only assigned to the deleted category are set to the category <strong>%s</strong> and links that were only assigned to the deleted category are set to <strong>%s</strong>.'), apply_filters('the_category', get_catname(get_option('default_category'))), apply_filters('the_category', get_catname(get_option('default_link_category')))) ?></p>
+<p><?php printf(__('<strong>Note:</strong><br />Deleting a category does not delete the posts in that category. Instead, posts that were only assigned to the deleted category are set to the category <strong>%s</strong>.'), apply_filters('the_category', get_catname(get_option('default_category')))) ?></p>
+<p><?php printf(__('Categories can be selectively converted to tags using the <a href="%s">category to tag converter</a>.'), 'admin.php?import=wp-cat2tag') ?></p>
 </div>
 
 <?php include('edit-category-form.php'); ?>
+
 <?php endif; ?>
 
 <?php
diff -x .svn -aruN 2.2.2.src/wp-admin/comment.php 2.5.src/wp-admin/comment.php
--- 2.2.2.src/wp-admin/comment.php	2007-05-28 23:37:35.000000000 -0500
+++ 2.5.src/wp-admin/comment.php	2008-03-14 18:58:31.000000000 -0500
@@ -4,70 +4,86 @@
 $parent_file = 'edit-comments.php';
 $submenu_file = 'edit-comments.php';
 
-wp_reset_vars(array('action'));
+wp_reset_vars( array('action') );
 
 if ( isset( $_POST['deletecomment'] ) )
 	$action = 'deletecomment';
 
-switch($action) {
-case 'editcomment':
+function comment_footer_die( $msg ) {  // $msg is assumed to contain HTML and be sanitized
+	echo "<div class='wrap'><p>$msg</p></div>";
+	include('admin-footer.php');
+	die;
+}
+
+switch( $action ) {
+
+case 'editcomment' :
 	$title = __('Edit Comment');
 
-	require_once ('admin-header.php');
+	wp_enqueue_script('comment');
+	//wp_enqueue_script('thickbox');
+	require_once('admin-header.php');
 
-	$comment = (int) $_GET['c'];
+	$comment_id = absint( $_GET['c'] );
 
-	if ( ! $comment = get_comment($comment) )
-		wp_die(__('Oops, no comment with this ID.').sprintf(' <a href="%s">'.__('Go back').'</a>!', 'javascript:history.go(-1)'));
+	if ( !$comment = get_comment( $comment_id ) )
+		comment_footer_die( __('Oops, no comment with this ID.') . sprintf(' <a href="%s">'.__('Go back').'</a>!', 'javascript:history.go(-1)') );
 
 	if ( !current_user_can('edit_post', $comment->comment_post_ID) )
-		wp_die( __('You are not allowed to edit comments on this post.') );
+		comment_footer_die( __('You are not allowed to edit comments on this post.') );
 
-	$comment = get_comment_to_edit($comment);
+	$comment = get_comment_to_edit( $comment_id );
 
 	include('edit-form-comment.php');
 
 	break;
 
-case 'cdc':
-case 'mac':
+case 'cdc' :
+case 'mac' :
 
-	require_once('./admin-header.php');
+	require_once('admin-header.php');
 
-	$comment = (int) $_GET['c'];
+	$comment_id = absint( $_GET['c'] );
 	$formaction = 'cdc' == $action ? 'deletecomment' : 'approvecomment';
 	$nonce_action = 'cdc' == $action ? 'delete-comment_' : 'approve-comment_';
-	$nonce_action .= $comment;
+	$nonce_action .= $comment_id;
 
-	if ( ! $comment = get_comment_to_edit($comment) )
-		wp_die(__('Oops, no comment with this ID.').sprintf(' <a href="%s">'.__('Go back').'</a>!', 'edit.php'));
+	if ( !$comment = get_comment_to_edit( $comment_id ) )
+		comment_footer_die( __('Oops, no comment with this ID.') . sprintf(' <a href="%s">'.__('Go back').'</a>!', 'edit.php') );
 
-	if ( !current_user_can('edit_post', $comment->comment_post_ID) )
-		wp_die( 'cdc' == $action ? __('You are not allowed to delete comments on this post.') : __('You are not allowed to edit comments on this post, so you cannot approve this comment.') );
+	if ( !current_user_can( 'edit_post', $comment->comment_post_ID ) )
+		comment_footer_die( 'cdc' == $action ? __('You are not allowed to delete comments on this post.') : __('You are not allowed to edit comments on this post, so you cannot approve this comment.') );
 ?>
 <div class='wrap'>
 
 <div class="narrow">
-<?php if ( 'spam' == $_GET['dt'] ) { ?>
-<p><?php echo '<strong>'.__('Caution:').'</strong> '.__('You are about to mark the following comment as spam:'); ?></p>
-<?php } elseif ( 'cdc' == $action ) { ?>
-<p><?php echo '<strong>'.__('Caution:').'</strong> '.__('You are about to delete the following comment:'); ?></p>
-<?php } else { ?>
-<p><?php echo '<strong>'.__('Caution:').'</strong> '.__('You are about to approve the following comment:'); ?></p>
-<?php } ?>
+<?php
+if ( 'spam' == $_GET['dt'] ) {
+	$caution_msg = __('You are about to mark the following comment as spam:');
+	$button = __('Spam Comment');
+} elseif ( 'cdc' == $action ) {
+	$caution_msg = __('You are about to delete the following comment:');
+	$button = __('Delete Comment');
+} else {
+	$caution_msg = __('You are about to approve the following comment:');
+	$button = __('Approve Comment');
+}
+?>
+
+<p><strong><?php _e('Caution:'); ?></strong> <?php echo $caution_msg; ?></p>
 
 <p><?php _e('Are you sure you want to do that?'); ?></p>
 
-<form action='<?php echo get_option('siteurl'); ?>/wp-admin/comment.php' method='get'>
+<form action='comment.php' method='get'>
 
 <table width="100%">
 <tr>
-<td><input type='button' value='<?php _e('No'); ?>' onclick="self.location='<?php echo get_option('siteurl'); ?>/wp-admin/edit-comments.php';" /></td>
-<td align="right"><input type='submit' value='<?php _e('Yes'); ?>' /></td>
+<td><input type='button' class="button" value='<?php _e('No'); ?>' onclick="self.location='<?php echo get_option('siteurl'); ?>/wp-admin/edit-comments.php';" /></td>
+<td class="textright"><input type='submit' class="button" value='<?php echo $button; ?>' /></td>
 </tr>
 </table>
 
-<?php wp_nonce_field($nonce_action); ?>
+<?php wp_nonce_field( $nonce_action ); ?>
 <input type='hidden' name='action' value='<?php echo $formaction; ?>' />
 <?php if ( 'spam' == $_GET['dt'] ) { ?>
 <input type='hidden' name='dt' value='spam' />
@@ -77,25 +93,25 @@
 <input type='hidden' name='noredir' value='1' />
 </form>
 
-<table class="editform" cellpadding="5">
+<table class="form-table" cellpadding="5">
 <tr class="alt">
-<th scope="row"><?php _e('Author:'); ?></th>
+<th scope="row"><?php _e('Author'); ?></th>
 <td><?php echo $comment->comment_author; ?></td>
 </tr>
 <?php if ( $comment->comment_author_email ) { ?>
 <tr>
-<th scope="row"><?php _e('E-mail:'); ?></th>
+<th scope="row"><?php _e('E-mail'); ?></th>
 <td><?php echo $comment->comment_author_email; ?></td>
 </tr>
 <?php } ?>
 <?php if ( $comment->comment_author_url ) { ?>
 <tr>
-<th scope="row"><?php _e('URL:'); ?></th>
-<td><?php echo $comment->comment_author_url; ?></td>
+<th scope="row"><?php _e('URL'); ?></th>
+<td><a href='<?php echo $comment->comment_author_url; ?>'><?php echo $comment->comment_author_url; ?></a></td>
 </tr>
 <?php } ?>
 <tr>
-<th scope="row" valign="top"><p><?php _e('Comment:'); ?></p></th>
+<th scope="row" valign="top"><?php _e('Comment'); ?></th>
 <td><?php echo $comment->comment_content; ?></td>
 </tr>
 </table>
@@ -105,109 +121,110 @@
 <?php
 	break;
 
-case 'deletecomment':
-	$comment = (int) $_REQUEST['c'];
-	check_admin_referer('delete-comment_' . $comment);
+case 'deletecomment' :
+	$comment_id = absint( $_REQUEST['c'] );
+	check_admin_referer( 'delete-comment_' . $comment_id );
 
-	if ( isset($_REQUEST['noredir']) ) {
+	if ( isset( $_REQUEST['noredir'] ) )
 		$noredir = true;
-	} else {
+	else
 		$noredir = false;
-	}
 
-	if ( ! $comment = get_comment($comment) )
-			 wp_die(__('Oops, no comment with this ID.').sprintf(' <a href="%s">'.__('Go back').'</a>!', 'edit-comments.php'));
+	if ( !$comment = get_comment( $comment_id ) )
+		comment_footer_die( __('Oops, no comment with this ID.') . sprintf(' <a href="%s">'.__('Go back').'</a>!', 'edit-comments.php') );
 
-	if ( !current_user_can('edit_post', $comment->comment_post_ID) )
-		wp_die( __('You are not allowed to edit comments on this post.') );
+	if ( !current_user_can( 'edit_post', $comment->comment_post_ID ) )
+		comment_footer_die( __('You are not allowed to edit comments on this post.') );
 
 	if ( 'spam' == $_REQUEST['dt'] )
-		wp_set_comment_status($comment->comment_ID, 'spam');
+		wp_set_comment_status( $comment->comment_ID, 'spam' );
 	else
-		wp_delete_comment($comment->comment_ID);
+		wp_delete_comment( $comment->comment_ID );
 
-	if ((wp_get_referer() != '') && (false == $noredir)) {
-		wp_redirect(wp_get_referer());
-	} else {
-		wp_redirect(get_option('siteurl') .'/wp-admin/edit-comments.php');
-	}
-	exit();
+	if ( '' != wp_get_referer() && false == $noredir )
+		wp_redirect( wp_get_referer() );
+	else
+		wp_redirect( get_option('siteurl') . '/wp-admin/edit-comments.php' );
+
+	die;
 	break;
 
-case 'unapprovecomment':
-	$comment = (int) $_GET['c'];
-	check_admin_referer('unapprove-comment_' . $comment);
+case 'unapprovecomment' :
+	$comment_id = absint( $_GET['c'] );
+	check_admin_referer( 'unapprove-comment_' . $comment_id );
 
-	if (isset($_GET['noredir'])) {
+	if ( isset( $_GET['noredir'] ) )
 		$noredir = true;
-	} else {
+	else
 		$noredir = false;
-	}
 
-	if ( ! $comment = get_comment($comment) )
-		wp_die(__('Oops, no comment with this ID.').sprintf(' <a href="%s">'.__('Go back').'</a>!', 'edit.php'));
+	if ( !$comment = get_comment( $comment_id ) )
+		comment_footer_die( __('Oops, no comment with this ID.') . sprintf(' <a href="%s">'.__('Go back').'</a>!', 'edit.php') );
 
-	if ( !current_user_can('edit_post', $comment->comment_post_ID) )
-		wp_die( __('You are not allowed to edit comments on this post, so you cannot disapprove this comment.') );
+	if ( !current_user_can( 'edit_post', $comment->comment_post_ID ) )
+		comment_footer_die( __('You are not allowed to edit comments on this post, so you cannot disapprove this comment.') );
+
+	wp_set_comment_status( $comment->comment_ID, 'hold' );
 
-	wp_set_comment_status($comment->comment_ID, "hold");
+	if ( '' != wp_get_referer() && false == $noredir )
+		wp_redirect( wp_get_referer() );
+	else
+		wp_redirect( get_option('siteurl') . '/wp-admin/edit.php?p=' . absint( $comment->comment_post_ID ) . '#comments' );
 
-	if ((wp_get_referer() != "") && (false == $noredir)) {
-		wp_redirect(wp_get_referer());
-	} else {
-		wp_redirect(get_option('siteurl') .'/wp-admin/edit.php?p='. (int) $comment->comment_post_ID.'&c=1#comments');
-	}
 	exit();
 	break;
 
-case 'approvecomment':
-	$comment = (int) $_GET['c'];
-	check_admin_referer('approve-comment_' . $comment);
+case 'approvecomment' :
+	$comment_id = absint( $_GET['c'] );
+	check_admin_referer( 'approve-comment_' . $comment_id );
 
-	if (isset($_GET['noredir'])) {
+	if ( isset( $_GET['noredir'] ) )
 		$noredir = true;
-	} else {
+	else
 		$noredir = false;
-	}
 
-	if ( ! $comment = get_comment($comment) )
-		wp_die(__('Oops, no comment with this ID.').sprintf(' <a href="%s">'.__('Go back').'</a>!', 'edit.php'));
+	if ( !$comment = get_comment( $comment_id ) )
+		comment_footer_die( __('Oops, no comment with this ID.') . sprintf(' <a href="%s">'.__('Go back').'</a>!', 'edit.php') );
 
 	if ( !current_user_can('edit_post', $comment->comment_post_ID) )
-		wp_die( __('You are not allowed to edit comments on this post, so you cannot approve this comment.') );
+		comment_footer_die( __('You are not allowed to edit comments on this post, so you cannot approve this comment.') );
+
+	wp_set_comment_status( $comment->comment_ID, 'approve' );
 
-	wp_set_comment_status($comment->comment_ID, "approve");
-	if (get_option("comments_notify") == true) {
-		wp_notify_postauthor($comment->comment_ID);
-	}
+	if ( true == get_option('comments_notify') )
+		wp_notify_postauthor( $comment->comment_ID );
 
 
-	if ((wp_get_referer() != "") && (false == $noredir)) {
-		wp_redirect(wp_get_referer());
-	} else {
-		wp_redirect(get_option('siteurl') .'/wp-admin/edit.php?p='. (int) $comment->comment_post_ID.'&c=1#comments');
-	}
+	if ( '' != wp_get_referer() && false == $noredir )
+		wp_redirect( wp_get_referer() );
+	else
+		wp_redirect( get_option('siteurl') . '/wp-admin/edit.php?p=' . absint( $comment->comment_post_ID ) . '#comments' );
+
 	exit();
 	break;
 
-case 'editedcomment':
+case 'editedcomment' :
 
-	$comment_ID = (int) $_POST['comment_ID'];
-	$comment_post_ID = (int) $_POST['comment_post_id'];
+	$comment_id = absint( $_POST['comment_ID'] );
+	$comment_post_id = absint( $_POST['comment_post_id'] );
 
-	check_admin_referer('update-comment_' . $comment_ID);
+	check_admin_referer( 'update-comment_' . $comment_id );
 
 	edit_comment();
 
-	$location = ( empty($_POST['referredby']) ? "edit.php?p=$comment_post_ID&c=1" : $_POST['referredby'] ) . '#comment-' . $comment_ID;
-	$location = apply_filters('comment_edit_redirect', $location, $comment_ID);
-	wp_redirect($location);
+	$location = ( empty( $_POST['referredby'] ) ? "edit.php?p=$comment_post_id" : $_POST['referredby'] ) . '#comment-' . $comment_id;
+	$location = apply_filters( 'comment_edit_redirect', $location, $comment_id );
+	wp_redirect( $location );
+
 	exit();
 	break;
+
 default:
+	wp_die( __('Unknown action.') );
 	break;
+
 } // end switch
 
 include('admin-footer.php');
 
-?>
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/css/colors-classic-rtl.css 2.5.src/wp-admin/css/colors-classic-rtl.css
--- 2.2.2.src/wp-admin/css/colors-classic-rtl.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/css/colors-classic-rtl.css	2008-03-22 12:59:55.000000000 -0500
@@ -0,0 +1,3 @@
+#poststuff .closed .togbox, #poststuff .togbox {
+background-image: url(../images/toggle-arrow-rtl.gif) !important;
+}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/css/colors-classic.css 2.5.src/wp-admin/css/colors-classic.css
--- 2.2.2.src/wp-admin/css/colors-classic.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/css/colors-classic.css	2008-03-25 23:23:02.000000000 -0500
@@ -0,0 +1,715 @@
+a.page-numbers:hover {
+	border-color: #999;
+}
+
+body	{
+	background-color: #fff;
+	color: #333;
+}
+
+body > #upload-menu {
+	border-bottom-color: #fff;
+}
+
+div#current-widgets, #postcustomstuff table, #your-profile fieldset, a.page-numbers, #rightnow, div.dashboard-widget, .widefat {
+	border-color: #ccc;
+}
+
+div.dashboard-widget-error {
+	background-color: #c43;
+}
+
+div.dashboard-widget-notice {
+	background-color: #F0F6FB;
+}
+
+div.dashboard-widget-submit, ul.widget-control-list div.widget-control-actions {
+	border-top-color: #ccc;
+}
+
+input.disabled, textarea.disabled {
+	background-color: #ccc;
+}
+
+#user_info a:hover, li.widget-list-control-item h4.widget-title a:hover, .submit a, #dashmenu a:hover, #footer a, #upload-menu li a.upload-tab-link, li.widget-list-control-item h4.widget-title a,
+#dragHelper li.widget-list-control-item h4.widget-title a,
+#draghelper li.widget-list-control-item h4.widget-title a:visited, .login #backtoblog a:hover {
+	color: #fff;
+}
+
+ul#category-tabs li.ui-tabs-selected, li.widget-list-control-item, div.nav, .tablenav, .submitbox, h3.dashboard-widget-title, h3.dashboard-widget-title span, h3.dashboard-widget-title small, ul.view-switch li.current, .form-table tr, #poststuff h3, .login form {
+	background-color: #cfebf7;
+}
+
+div.ui-tabs-panel {
+	border-color: #cfebf7;
+}
+
+select {
+	background-color: #fff;
+	border-color: #ddd;
+}
+
+strong .post-com-count span {
+	background-color: #2583ad;
+}
+
+.button-secondary, #login form .submit input {
+	background-color: #8ebddc !important;
+}
+
+ul#widget-list li.widget-list-item h4.widget-title {
+	background-color: #f0f0f0;
+	color: #000;
+}
+
+ul.widget-control-list .sorthelper {
+	background-color: #ccf3fa;
+}
+
+.ac_match, .subsubsub a.current, h2 {
+	color: #000;
+}
+
+.ac_over {
+	background-color: #f0f0b8;
+}
+
+.ac_results {
+	background-color: #fff;
+	border-color: #808080;
+}
+
+.ac_results li {
+	color: #101010;
+}
+
+.alternate {
+	background-color: #f9f9f9;
+}
+
+.available-theme a.screenshot {
+	background-color: #f1f1f1;
+	border-color: #ccc;
+}
+
+.bar {
+	background-color: #e8e8e8;
+	border-right-color: #99d;
+}
+
+.describe {
+	border-top-color: #d0d0d0;
+}
+
+.error, #login #login_error {
+	background-color: #ffebe8;
+	border-color: #c00;
+}
+
+.error a {
+	color: #c00;
+}
+
+.form-invalid {
+	background-color: #ffebe8 !important;
+}
+
+.form-invalid input {
+	border-color: #c00 !important;
+}
+
+.form-table input, .form-table textarea {
+	border-color: #c6d9e9;
+}
+
+.form-table td, .form-table th {
+	border-bottom-color: #fff;
+}
+
+.highlight {
+	background-color: #cfebf7;
+	color: #d54e21;
+}
+
+.howto, .nonessential, #sidemenu, #edit-slug-box, .form-input-tip, #dashboard_primary span.rss-date, .subsubsub, #dashboard_secondary div.dashboard-widget-content ul li a cite {
+	color: #999;
+}
+
+#dashmenu a, #user_info a {
+	color: #88b4d7;
+}
+
+.media-item {
+	border-bottom-color: #d0d0d0;
+}
+
+.media-upload-form label.form-help, td.help {
+	color: #9a9a9a;
+}
+
+.page-numbers {
+	background-color: #fff;
+	border-color: #fff;
+}
+
+.page-numbers.current {
+	background-color: #328ab2;
+	border-color: #328ab2;
+	color: #fff;
+}
+
+.post-com-count {
+	background-image: url(../images/bubble_bg.gif);
+	color: #fff;
+}
+
+.post-com-count span {
+	background-color: #bbb;
+	color: #fff;
+}
+
+.post-com-count:hover span {
+	background-color: #d54e21;
+}
+
+.quicktags, .search {
+	background-color: #ccc;
+	color: #000;
+}
+
+.side-info h5, .bordertitle {
+	border-bottom-color: #dadada;
+}
+
+.side-info ul, .widget-description {
+	color: #666;
+}
+
+.submit input, .button, .button-secondary, #login form .submit input, div.dashboard-widget-submit input, #edit-slug-buttons a.save {
+	background-color: #e5e5e5;
+	color: #07273e;
+	border-color: #a3a3a3;
+}
+
+.tablenav .button-secondary {
+	border-color: #5396c5;
+}
+
+.submit input:hover, .button:hover, #edit-slug-buttons a.save:hover {
+	border-color: #535353;
+}
+
+.submit input:hover, .button:hover, .button-secondary:hover, #wphead #viewsite a:hover, #submenu a.current, #submenu a:hover, .submitbox #previewview a:hover, #the-comment-list .comment a:hover, #rightnow a:hover, a:hover, .subsubsub a:hover, .subsubsub a.current:hover, #login form .submit input:hover, div.dashboard-widget-submit input:hover, #edit-slug-buttons a.save:hover {
+	color: #d54e21;
+}
+
+#adminmenu a:hover, #sidemenu a:hover {
+	color: #97c4d8;
+}
+
+.button-secondary:hover, #login form .submit input:hover {
+	border-color: #328ab2;
+	background-color: #a6d2e5 !important;
+}
+
+.submitbox #autosave .error, ul.view-switch li.current a {
+	color: #333;
+}
+
+.submitbox #previewview {
+	background-color: #5488af;
+}
+
+.submitbox #previewview a, #rightnow .rbutton {
+	background-color: #ebebeb;
+	color: #264761;
+}
+
+.submitbox .submit {
+	background-color: #464646;
+	color: #ccc;
+}
+
+.submitbox .submitdelete {
+	border-bottom-color: #999;
+}
+
+.submitbox .submitdelete:hover {
+	color: #fff;
+	background-color: #f00;
+	border-bottom-color: #f00;
+}
+
+.tablenav .dots {
+	background-color: #cfebf7;
+	border-color: #cfebf7;
+}
+
+.tablenav .next, .tablenav .prev{
+	background-color: #cfebf7;
+	border-bottom-color: #cfebf7;
+	border-color: #cfebf7;
+	color: #2583ad;
+}
+
+.tablenav .next:hover, .tablenav .prev:hover {
+	border-bottom-color: #d54e21;
+	border-color: #cfebf7;
+	color: #d54e21;
+}
+
+.updated, .login #login_error, .login .message {
+	background-color: #ffffe0;
+	border-color: #e6db55;
+}
+
+.updated a {
+	border-bottom-color: #2583ad;
+}
+
+.widefat td, .widefat th, div#available-widgets-filter, ul#widget-list li.widget-list-item, .commentlist li {
+	border-bottom-color: #ccc;
+}
+
+.widefat thead, .thead {
+	background-color: #464646;
+	color: #d7d7d7;
+}
+
+.widget-control-save, .widget-control-remove {
+	background-color: #83b4d5;
+	color: #246;
+}
+
+.wrap h2 {
+	border-bottom-color: #dadada;
+	color: #5a5a5a;
+}
+
+#poststuff #edButtonPreview, #poststuff #edButtonHTML, #the-comment-list p.comment-author strong a, a {
+	color: #2e7ca0;
+}
+
+#adminmenu a {
+	color: #cfebf6;
+}
+
+#submenu a {
+	color: #2782af
+}
+/* Because we don't want visited on these links */
+#adminmenu a.current, #sidemenu a.current {
+	background-color: #fff;
+	border-color: #07273e;
+	border-bottom-color: #fff;
+	color: #d54e21;
+	font-weight: bold;
+}
+
+#adminmenu li a #awaiting-mod {
+	background-image: url(../images/comment-stalk-classic.gif);
+}
+
+#adminmenu li a #awaiting-mod span {
+	background-color: #d54e21;
+	color: #fff;
+}
+
+#rightnow .reallynow {
+	background-color: #114973;
+	color: #fff;
+}
+
+
+#adminmenu li a:hover #awaiting-mod span {
+	background-color: #07273E;
+}
+
+#adminmenu, div#media-upload-header {
+	background-color: #14568a;
+	border-bottom-color: #07273e;
+}
+
+#currenttheme img {
+	border-color: #666;
+}
+
+#current-widgets .drop-widget-here {
+	background-color: #ffc;
+}
+
+#dashboard_secondary div.dashboard-widget-content ul li a {
+	background-color: #f9f9f9;
+}
+
+input.readonly {
+	background-color: #ddd;
+}
+
+#dashmenu a.current {
+	background-color: #14568a;
+	color: #cfebf6;
+}
+
+#dragHelper h4.widget-title, li.widget-list-control-item h4, #dragHelper li.widget-list-control-item h4 {
+	background-color: #2683ae;
+	color: #fff;
+}
+
+#ed_toolbar input {
+	background: url( ../images/fade-butt.png ) #fff repeat-x 0 -2px;
+}
+
+#editable-post-name {
+	background-color: #fffbcc;
+}
+
+#edit-slug-box strong, .login #nav a {
+	color: #777;
+}
+
+#edit-slug-buttons a.save {
+	background-color: #ebebeb;
+}
+
+#footer {
+	background: url(../images/logo-ghost.png) #464646 no-repeat 20px 10px;
+	color: #999;
+}
+
+#media-items {
+	border-color: #c0c0c0;
+}
+
+#pass-strength-result {
+	background-color: #e3e3e3;
+	border-color: #000;
+}
+
+#pass-strength-result.bad {
+	background-color: #ffeff7;
+	border-color: #c69;
+}
+
+#pass-strength-result.good {
+	background-color: #effff4;
+	border-color: #66cc87;
+}
+
+#pass-strength-result.short {
+	background-color: #e3e3e3;
+}
+
+#pass-strength-result.strong {
+	background-color: #59ef86;
+	border-color: #319f52;
+}
+
+.checkbox, .side-info, #your-profile #rich_editing {
+	background-color: #fff;
+}
+
+#plugins .active {
+	background-color: #BBEEBB;
+}
+
+#plugins .togl {
+	border-right-color: #ccc;
+}
+
+#the-comment-list .unapproved {
+	background-color: #ffffe0;
+}
+
+#plugins tr {
+	background-color: #fff;
+}
+
+#poststuff #editor-toolbar .active {
+	background-color: #83b4d5;
+	color: #333;
+}
+
+#poststuff .closed .togbox {
+	background-color: #2583ad;
+	background-image: url(../images/toggle-arrow.gif);
+}
+
+#poststuff .postbox, #titlediv, #poststuff .postarea, #poststuff .stuffbox {
+	border-color: #ebebeb;
+	border-right-color: #ccc;
+	border-bottom-color: #ccc;
+}
+
+#poststuff .togbox {
+	background-color: #b2b2b2;
+	background-image: url(../images/toggle-arrow.gif);
+}
+
+#quicktags #ed_link {
+	color: #00f;
+}
+
+#rightnow .youhave {
+	background-color: #f0f6fb;
+}
+
+#rightnow a {
+	color: #448abd;
+}
+
+#sidemenu a {
+	background-color: #14568a;
+	border-bottom-color: #07273e;
+	border-top-color: #14568a;
+	color: #cfebf6;
+}
+
+#tagchecklist span a {
+	background: url(../images/xit.gif) no-repeat;
+}
+
+#tagchecklist span a:hover {
+	background: url(../images/xit.gif) no-repeat -10px 0;
+}
+
+#the-comment-list .comment a {
+	border-bottom-color: #ababab;
+	color: #666;
+}
+
+#update-nag, .plugin-update {
+	background-color: #fffeeb;
+	border-bottom-color: #ccc;
+	border-top-color: #ccc;
+	color: #555;
+}
+
+#upload-files a.file-link {
+	background-color: #d1e2ef;
+}
+
+#upload-file-view a img {
+	border-bottom-color: #69c;
+}
+
+#upload-menu li #current-tab-nav, #upload-file {
+	background-color: #f9fcfe;
+}
+
+#upload-menu li span a.page-numbers {
+	color: #00019b;
+}
+
+#upload-menu li.current {
+	border-right-color: #448abd;
+	color: #000;
+}
+
+#upload-menu li.current a.upload-tab-link, #upload-menu li a:hover {
+	background-color: #f9fcfe;
+	color: #000;
+}
+
+#upload-menu, #upload-menu li {
+	border-top-color: #247fab;
+}
+
+#user_info, .login #backtoblog a {
+	color: #ccc;
+}
+
+#wphead {
+	background-color: #14568a;
+}
+
+#wphead, body.login {
+	border-top-color: #07273e;
+}
+
+#wphead #viewsite a {
+	background-color: #5488af;
+	color: #cfebf7;
+	border-color: #0b3d64;
+}
+
+#wphead #viewsite a:hover {
+	color: #07273e;
+}
+
+#wphead h1, #dashmenu a.current:hover {
+	color: #cfebf6;
+}
+
+div#media-upload-error, .file-error, abbr.required, .widget-control-remove:hover, .delete:hover {
+	color: #f00;
+}
+
+#media-upload a.delete { 
+	color: #888; 
+}
+
+
+/* TinyMCE */
+.wp_themeSkin *,
+.wp_themeSkin a:hover, 
+.wp_themeSkin a:link, 
+.wp_themeSkin a:visited, 
+.wp_themeSkin a:active {
+	 color: #000;
+}
+
+/* Containers */
+.wp_themeSkin table {
+	background: #83B4D5;
+}
+
+.wp_themeSkin iframe {
+	background: #fff;
+}
+
+/* Layout */
+.wp_themeSkin .mceStatusbar {
+	 color:#000;
+	 background-color: #eaf3fa;
+}
+
+/* Button */
+.wp_themeSkin .mceButton { 
+	background-color: #e9e8e8;
+	border-color: #83B4D5;
+}
+
+.wp_themeSkin a.mceButtonEnabled:hover,
+.wp_themeSkin a.mceButtonActive, 
+.wp_themeSkin a.mceButtonSelected {
+	background-color: #d6d8da;
+	border-color: #7789ba !important;
+}
+
+.wp_themeSkin .mceButtonDisabled {
+	border-color: #83B4D5 !important;
+}
+
+/* ListBox */
+.wp_themeSkin .mceListBox .mceText,
+.wp_themeSkin .mceListBox .mceOpen  {
+	border-color: #83B4D5;
+	background-color: #e9e8e8;
+}
+
+.wp_themeSkin table.mceListBoxEnabled:hover .mceOpen, 
+.wp_themeSkin .mceListBoxHover .mceOpen,
+.wp_themeSkin .mceListBoxSelected .mceOpen,
+.wp_themeSkin .mceListBoxSelected .mceText {
+	border-color: #7789ba !important;
+	background-color: #d6d8da;
+}
+
+.wp_themeSkin table.mceListBoxEnabled:hover .mceText, 
+.wp_themeSkin .mceListBoxHover .mceText {
+	border-color: #7789ba !important;
+}
+
+.wp_themeSkin select.mceListBox {
+	border-color: #b3c7e1; 
+	background-color: #fff;
+}
+
+/* SplitButton */
+.wp_themeSkin .mceSplitButton a.mceAction, 
+.wp_themeSkin .mceSplitButton a.mceOpen {
+	background-color: #e9e8e8;
+	border-color: #83B4D5;
+}
+
+.wp_themeSkin .mceSplitButton a.mceOpen:hover,
+.wp_themeSkin .mceSplitButtonSelected a.mceOpen,
+.wp_themeSkin table.mceSplitButtonEnabled:hover a.mceAction,
+.wp_themeSkin .mceSplitButton a.mceAction:hover {
+	background-color: #d6d8da;
+	border-color: #7789ba !important;
+} 
+
+.wp_themeSkin .mceSplitButtonActive {
+	background-color: #d6d8da;
+}
+
+/* ColorSplitButton */
+.wp_themeSkin div.mceColorSplitMenu table {
+	background-color: #ebeaeb;
+	border-color: #808080;
+}
+
+.wp_themeSkin .mceColorSplitMenu a {
+	border-color: #808080;
+}
+
+.wp_themeSkin .mceColorSplitMenu a.mceMoreColors {
+	border-color: #fff;
+}
+
+.wp_themeSkin .mceColorSplitMenu a.mceMoreColors:hover {
+	border-color: #0A246A;
+	background-color: #B6BDD2;
+}
+
+.wp_themeSkin a.mceMoreColors:hover {
+	border-color: #0A246A;
+}
+
+/* Menu */
+.wp_themeSkin .mceMenu {
+	border-color: #ddd;
+}
+
+.wp_themeSkin .mceMenu table {
+	background-color: #ebeaeb;
+}
+
+.wp_themeSkin .mceMenu .mceText {
+	color: #000; 
+}
+
+.wp_themeSkin .mceMenu .mceMenuItemEnabled a:hover,
+.wp_themeSkin .mceMenu .mceMenuItemActive, #quicktags {
+	background-color: #83B4D5;
+}
+.wp_themeSkin td.mceMenuItemSeparator {
+	background-color: #aaa;
+}
+.wp_themeSkin .mceMenuItemTitle a {
+	background-color: #ccc; 
+	border-bottom-color: #aaa;
+}
+.wp_themeSkin .mceMenuItemTitle span.mceText {
+	color: #000;
+}
+.wp_themeSkin .mceMenuItemDisabled .mceText {
+	color: #888;
+}
+
+/* pop-up */
+.clearlooks2 .mceTop .mceLeft, .clearlooks2 .mceTop .mceRight {
+	background-color: #cee1ef;
+	border-color: #c6d9e9;
+}
+
+.clearlooks2 .mceFocus .mceTop .mceLeft, .clearlooks2 .mceFocus .mceTop .mceRight {
+	background-color: #5488AF;
+	border-color: #464646;
+}
+
+#editorcontainer {
+	border-color: #ccc;
+}
+
+#poststuff #titlewrap {
+	border-color: #ccc;
+}
+
+#tTips p#tTips_inside {
+	background-color: #ddd;
+	color: #333;
+}
diff -x .svn -aruN 2.2.2.src/wp-admin/css/colors-fresh-rtl.css 2.5.src/wp-admin/css/colors-fresh-rtl.css
--- 2.2.2.src/wp-admin/css/colors-fresh-rtl.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/css/colors-fresh-rtl.css	2008-03-19 11:08:03.000000000 -0500
@@ -0,0 +1,3 @@
+#poststuff .closed .togbox, #poststuff .togbox {
+background-image: url(../images/toggle-arrow-rtl.gif) !important;
+}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/css/colors-fresh.css 2.5.src/wp-admin/css/colors-fresh.css
--- 2.2.2.src/wp-admin/css/colors-fresh.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/css/colors-fresh.css	2008-03-26 17:27:27.000000000 -0500
@@ -0,0 +1,686 @@
+a.page-numbers:hover {
+	border-color: #999;
+}
+
+body	{
+	background-color: #fff;
+	color: #333;
+}
+
+body > #upload-menu {
+	border-bottom-color: #fff;
+}
+
+div#current-widgets, #postcustomstuff table, #your-profile fieldset, a.page-numbers, #rightnow, div.dashboard-widget, .widefat {
+	border-color: #ccc;
+}
+
+div.dashboard-widget-error {
+	background-color: #c43;
+}
+
+div.dashboard-widget-notice {
+	background-color: #cfe1ef;
+}
+
+div.dashboard-widget-submit, ul.widget-control-list div.widget-control-actions {
+	border-top-color: #ccc;
+}
+
+div.ui-tabs-panel {
+	border-color: #cee1ef;
+}
+
+input.disabled, textarea.disabled {
+	background-color: #ccc;
+}
+
+#user_info a:hover, li.widget-list-control-item h4.widget-title a:hover, .submit a, #dashmenu a:hover, #footer a, #upload-menu li a.upload-tab-link, li.widget-list-control-item h4.widget-title a,
+#dragHelper li.widget-list-control-item h4.widget-title a,
+#draghelper li.widget-list-control-item h4.widget-title a:visited, .login #backtoblog a:hover {
+	color: #fff;
+}
+
+li.widget-list-control-item, div.nav, .tablenav, .submitbox, h3.dashboard-widget-title, h3.dashboard-widget-title span, h3.dashboard-widget-title small, ul.view-switch li.current, .form-table tr, #poststuff h3, .login form {
+	background-color: #eaf3fa;
+}
+
+select {
+	background-color: #fff;
+	border-color: #ddd;
+}
+
+strong .post-com-count span {
+	background-color: #2583ad;
+}
+
+ul#category-tabs li.ui-tabs-selected, .button-secondary, #quicktags, #login form .submit input {
+	background-color: #cee1ef !important;
+}
+
+ul#widget-list li.widget-list-item h4.widget-title {
+	background-color: #f0f0f0;
+	color: #000;
+}
+
+ul.widget-control-list .sorthelper {
+	background-color: #ccf3fa;
+}
+
+.ac_match, .subsubsub a.current, h2 {
+	color: #000;
+}
+
+.ac_over {
+	background-color: #f0f0b8;
+}
+
+.ac_results {
+	background-color: #fff;
+	border-color: #808080;
+}
+
+.ac_results li {
+	color: #101010;
+}
+
+.alternate {
+	background-color: #f9f9f9;
+}
+
+.available-theme a.screenshot {
+	background-color: #f1f1f1;
+	border-color: #ccc;
+}
+
+.bar {
+	background-color: #e8e8e8;
+	border-right-color: #99d;
+}
+
+.describe {
+	border-top-color: #d0d0d0;
+}
+
+.error, #login #login_error {
+	background-color: #ffebe8;
+	border-color: #c00;
+}
+
+.error a {
+	color: #c00;
+}
+
+.form-invalid {
+	background-color: #ffebe8 !important;
+}
+
+.form-invalid input {
+	border-color: #c00 !important;
+}
+
+.form-table input, .form-table textarea {
+	border-color: #c6d9e9;
+}
+
+.form-table td, .form-table th {
+	border-bottom-color: #fff;
+}
+
+.highlight {
+	background-color: #e4f2fd;
+	color: #d54e21;
+}
+
+#user_info, .howto, .nonessential, #dashmenu a, #sidemenu, #edit-slug-box, .form-input-tip, #dashboard_primary span.rss-date, .subsubsub, #dashboard_secondary div.dashboard-widget-content ul li a cite {
+	color: #999;
+}
+
+.media-item {
+	border-bottom-color: #d0d0d0;
+}
+
+.media-upload-form label.form-help, td.help {
+	color: #9a9a9a;
+}
+
+.page-numbers {
+	background-color: #fff;
+	border-color: #fff;
+}
+
+.page-numbers.current {
+	background-color: #328ab2;
+	border-color: #328ab2;
+	color: #fff;
+}
+
+.post-com-count {
+	background-image: url(../images/bubble_bg.gif);
+	color: #fff;
+}
+
+.post-com-count span {
+	background-color: #bbb;
+	color: #fff;
+}
+
+.post-com-count:hover span {
+	background-color: #d54e21;
+}
+
+.quicktags, .search {
+	background-color: #ccc;
+	color: #000;
+}
+
+.side-info h5, .bordertitle {
+	border-bottom-color: #dadada;
+}
+
+.side-info ul, .widget-description {
+	color: #666;
+}
+
+.submit input, .button, .button-secondary, #login form .submit input, div.dashboard-widget-submit input, #edit-slug-buttons a.save {
+	background-color: #e5e5e5;
+	color: #246;
+	border-color: #80b5d0;
+}
+
+.submit input:hover, .button:hover, #edit-slug-buttons a.save:hover {
+	border-color: #535353;
+}
+
+.submit input:hover, .button:hover, .button-secondary:hover, #wphead #viewsite a:hover, #adminmenu a:hover, #sidemenu a:hover, #submenu a.current, #submenu a:hover, .submitbox #previewview a:hover, #the-comment-list .comment a:hover, #rightnow a:hover, a:hover, .subsubsub a:hover, .subsubsub a.current:hover, #login form .submit input:hover, div.dashboard-widget-submit input:hover, #edit-slug-buttons a.save:hover, #media-upload a.delete:hover {
+	color: #d54e21;
+}
+
+.button-secondary:hover, #login form .submit input:hover {
+	border-color: #328ab2;
+}
+
+.submitbox #autosave .error, ul.view-switch li.current a {
+	color: #333;
+}
+
+.submitbox #previewview {
+	background-color: #2683ae;
+}
+
+.submitbox #previewview a, #rightnow .rbutton {
+	background-color: #ebebeb;
+	color: #264761;
+}
+
+.submitbox .submit {
+	background-color: #464646;
+	color: #ccc;
+}
+
+.submitbox .submitdelete {
+	border-bottom-color: #999;
+}
+
+.submitbox .submitdelete:hover {
+	color: #fff;
+	background-color: #f00;
+	border-bottom-color: #f00;
+}
+
+.tablenav .dots {
+	background-color: #e4f2fd;
+	border-color: #e4f2fd;
+}
+
+.tablenav .next, .tablenav .prev{
+	background-color: #e4f2fd;
+	border-bottom-color: #2583ad;
+	border-color: #e4f2fd;
+	color: #2583ad;
+}
+
+.tablenav .next:hover, .tablenav .prev:hover {
+	border-bottom-color: #d54e21;
+	border-color: #e4f2fd;
+	color: #d54e21;
+}
+
+.updated, .login #login_error, .login .message {
+	background-color: #ffffe0;
+	border-color: #e6db55;
+}
+
+.updated a {
+	border-bottom-color: #2583ad;
+}
+
+.widefat td, .widefat th, div#available-widgets-filter, ul#widget-list li.widget-list-item, .commentlist li {
+	border-bottom-color: #ccc;
+}
+
+.widefat thead, .thead {
+	background-color: #464646;
+	color: #d7d7d7;
+}
+
+.widget-control-save, .widget-control-remove {
+	background-color: #cee1ef;
+	color: #246;
+}
+
+.wrap h2 {
+	border-bottom-color: #dadada;
+	color: #666;
+}
+
+#adminmenu a, #submenu a, #poststuff #edButtonPreview, #poststuff #edButtonHTML, #the-comment-list p.comment-author strong a, a {
+	color: #2583ad;
+}
+
+/* Because we don't want visited on these links */
+#adminmenu a.current, #sidemenu a.current {
+	background-color: #fff;
+	border-color: #c6d9e9;
+	border-bottom-color: #fff;
+	color: #d54e21;
+}
+
+#adminmenu li a #awaiting-mod {
+	background-image: url(../images/comment-stalk-fresh.gif);
+}
+
+#adminmenu li a #awaiting-mod span, #rightnow .reallynow {
+	background-color: #d54e21;
+	color: #fff;
+}
+
+#adminmenu li a:hover #awaiting-mod span {
+	background-color: #264761;
+}
+
+#adminmenu, div#media-upload-header {
+	background-color: #e4f2fd;
+	border-bottom-color: #c6d9e9;
+}
+
+#currenttheme img {
+	border-color: #666;
+}
+
+#current-widgets .drop-widget-here {
+	background-color: #ffc;
+}
+
+#dashboard_secondary div.dashboard-widget-content ul li a {
+	background-color: #f9f9f9;
+}
+
+input.readonly {
+	background-color: #ddd;
+}
+
+#dashmenu a.current {
+	background-color: #e4f2fd;
+	color: #555;
+}
+
+#dragHelper h4.widget-title, li.widget-list-control-item h4, #dragHelper li.widget-list-control-item h4 {
+	background-color: #2683ae;
+	color: #fff;
+}
+
+#ed_toolbar input {
+	background: url( ../images/fade-butt.png ) #fff repeat-x 0 -2px;
+}
+
+#editable-post-name {
+	background-color: #fffbcc;
+}
+
+#edit-slug-box strong, .login #nav a {
+	color: #777;
+}
+
+#footer {
+	background: url(../images/logo-ghost.png) #464646 no-repeat 20px 10px;
+	color: #999;
+}
+
+#media-items {
+	border-color: #c0c0c0;
+}
+
+#pass-strength-result {
+	background-color: #e3e3e3;
+	border-color: #000;
+}
+
+#pass-strength-result.bad {
+	background-color: #ffeff7;
+	border-color: #c69;
+}
+
+#pass-strength-result.good {
+	background-color: #effff4;
+	border-color: #66cc87;
+}
+
+#pass-strength-result.short {
+	background-color: #e3e3e3;
+}
+
+#pass-strength-result.strong {
+	background-color: #59ef86;
+	border-color: #319f52;
+}
+
+.checkbox, .side-info, #your-profile #rich_editing {
+	background-color: #fff;
+}
+
+#plugins .active {
+	background-color: #e7f7d3;
+}
+
+#plugins .togl {
+	border-right-color: #ccc;
+}
+
+#the-comment-list .unapproved {
+	background-color: #ffffe0;
+}
+
+#plugins tr {
+	background-color: #fff;
+}
+
+#poststuff #editor-toolbar .active {
+	background-color: #cee1ef;
+	color: #333;
+}
+
+#poststuff .closed .togbox {
+	background-color: #2583ad;
+	background-image: url(../images/toggle-arrow.gif);
+}
+
+#poststuff .postbox, #titlediv, #poststuff .postarea, #poststuff .stuffbox {
+	border-color: #ebebeb;
+	border-right-color: #ccc;
+	border-bottom-color: #ccc;
+}
+
+#poststuff .togbox {
+	background-color: #b2b2b2;
+	background-image: url(../images/toggle-arrow.gif);
+}
+
+#quicktags #ed_link {
+	color: #00f;
+}
+
+#rightnow .youhave {
+	background-color: #f0f6fb;
+}
+
+#rightnow a {
+	color: #448abd;
+}
+
+#sidemenu a {
+	background-color: #e4f2fd;
+	border-bottom-color: #c6d9e9;
+	border-top-color: #e4f2fd;
+}
+
+#tagchecklist span a {
+	background: url(../images/xit.gif) no-repeat;
+}
+
+#tagchecklist span a:hover {
+	background: url(../images/xit.gif) no-repeat -10px 0;
+}
+
+#the-comment-list .comment a {
+	border-bottom-color: #ababab;
+	color: #666;
+}
+
+#update-nag, .plugin-update {
+	background-color: #fffeeb;
+	border-bottom-color: #ccc;
+	border-top-color: #ccc;
+	color: #555;
+}
+
+#upload-files a.file-link {
+	background-color: #d1e2ef;
+}
+
+#upload-file-view a img {
+	border-bottom-color: #69c;
+}
+
+#upload-menu li #current-tab-nav, #upload-file {
+	background-color: #f9fcfe;
+}
+
+#upload-menu li span a.page-numbers {
+	color: #00019b;
+}
+
+#upload-menu li.current {
+	border-right-color: #448abd;
+	color: #000;
+}
+
+#upload-menu li.current a.upload-tab-link, #upload-menu li a:hover {
+	background-color: #f9fcfe;
+	color: #000;
+}
+
+#upload-menu, #upload-menu li {
+	border-top-color: #247fab;
+}
+
+.login #backtoblog a, .curtime, #user_info a {
+	color: #ccc;
+}
+
+#wphead {
+	background-color: #e4f2fd;
+}
+
+#wphead, body.login {
+	border-top-color: #464646;
+}
+
+#wphead #viewsite a {
+	background-color: #c6d9e9;
+	color: #246;
+	border-color: #80b5d0;
+}
+
+#wphead #viewsite a:hover {
+	border-color: #328ab2;
+}
+
+#wphead h1, #dashmenu a.current:hover, #login form input {
+	color: #555;
+}
+
+div#media-upload-error, .file-error, abbr.required, .widget-control-remove:hover, .delete:hover {
+	color: #f00;
+}
+
+#media-upload a.delete {
+	color: #888;
+}
+
+/* TinyMCE */
+.wp_themeSkin *,
+.wp_themeSkin a:hover, 
+.wp_themeSkin a:link, 
+.wp_themeSkin a:visited, 
+.wp_themeSkin a:active {
+	 color: #000;
+}
+
+/* Containers */
+.wp_themeSkin table {
+	background: #cee1ef;
+}
+
+.wp_themeSkin iframe {
+	background: #fff;
+}
+
+/* Layout */
+.wp_themeSkin .mceStatusbar {
+	 color:#000;
+	 background-color: #eaf3fa;
+}
+
+/* Button */
+.wp_themeSkin .mceButton { 
+	background-color: #e9e8e8;
+	border-color: #abc0fb;
+}
+
+.wp_themeSkin a.mceButtonEnabled:hover,
+.wp_themeSkin a.mceButtonActive, 
+.wp_themeSkin a.mceButtonSelected {
+	background-color: #d6d8da;
+	border-color: #7789ba !important;
+}
+
+.wp_themeSkin .mceButtonDisabled {
+	border-color: #bdd !important;
+}
+
+/* ListBox */
+.wp_themeSkin .mceListBox .mceText,
+.wp_themeSkin .mceListBox .mceOpen  {
+	border-color: #abc0fb;
+	background-color: #e9e8e8;
+}
+
+.wp_themeSkin table.mceListBoxEnabled:hover .mceOpen, 
+.wp_themeSkin .mceListBoxHover .mceOpen,
+.wp_themeSkin .mceListBoxSelected .mceOpen,
+.wp_themeSkin .mceListBoxSelected .mceText {
+	border-color: #7789ba !important;
+	background-color: #d6d8da;
+}
+
+.wp_themeSkin table.mceListBoxEnabled:hover .mceText, 
+.wp_themeSkin .mceListBoxHover .mceText {
+	border-color: #7789ba !important;
+}
+
+.wp_themeSkin select.mceListBox {
+	border-color: #b3c7e1; 
+	background-color: #fff;
+}
+
+/* SplitButton */
+.wp_themeSkin .mceSplitButton a.mceAction, 
+.wp_themeSkin .mceSplitButton a.mceOpen {
+	background-color: #e9e8e8;
+	border-color: #abc0fb;
+}
+
+.wp_themeSkin .mceSplitButton a.mceOpen:hover,
+.wp_themeSkin .mceSplitButtonSelected a.mceOpen,
+.wp_themeSkin table.mceSplitButtonEnabled:hover a.mceAction,
+.wp_themeSkin .mceSplitButton a.mceAction:hover {
+	background-color: #d6d8da;
+	border-color: #7789ba !important;
+} 
+
+.wp_themeSkin .mceSplitButtonActive {
+	background-color: #d6d8da;
+}
+
+/* ColorSplitButton */
+.wp_themeSkin div.mceColorSplitMenu table {
+	background-color: #ebeaeb;
+	border-color: #808080;
+}
+
+.wp_themeSkin .mceColorSplitMenu a {
+	border-color: #808080;
+}
+
+.wp_themeSkin .mceColorSplitMenu a.mceMoreColors {
+	border-color: #fff;
+}
+
+.wp_themeSkin .mceColorSplitMenu a.mceMoreColors:hover {
+	border-color: #0A246A;
+	background-color: #B6BDD2;
+}
+
+.wp_themeSkin a.mceMoreColors:hover {
+	border-color: #0A246A;
+}
+
+/* Menu */
+.wp_themeSkin .mceMenu {
+	border-color: #ddd;
+}
+
+.wp_themeSkin .mceMenu table {
+	background-color: #ebeaeb;
+}
+
+.wp_themeSkin .mceMenu .mceText {
+	color: #000; 
+}
+
+.wp_themeSkin .mceMenu .mceMenuItemEnabled a:hover,
+.wp_themeSkin .mceMenu .mceMenuItemActive {
+	background-color: #CEE1EF;
+}
+.wp_themeSkin td.mceMenuItemSeparator {
+	background-color: #aaa;
+}
+.wp_themeSkin .mceMenuItemTitle a {
+	background-color: #ccc; 
+	border-bottom-color: #aaa;
+}
+.wp_themeSkin .mceMenuItemTitle span.mceText {
+	color: #000;
+}
+.wp_themeSkin .mceMenuItemDisabled .mceText {
+	color: #888;
+}
+
+/* pop-up */
+.clearlooks2 .mceTop .mceLeft, .clearlooks2 .mceTop .mceRight {
+	background-color: #cee1ef;
+	border-color: #c6d9e9;
+}
+
+.clearlooks2 .mceFocus .mceTop .mceLeft, .clearlooks2 .mceFocus .mceTop .mceRight {
+	background-color: #2683ae;
+	border-color: #464646;
+}
+
+#editorcontainer {
+	border-color: #ccc;
+}
+
+#poststuff #titlewrap {
+	border-color: #ccc;
+}
+
+.curtime {
+	color: #666;
+}
+
+#tTips p#tTips_inside {
+	background-color: #ddd;
+	color: #333;
+}
diff -x .svn -aruN 2.2.2.src/wp-admin/css/dashboard-rtl.css 2.5.src/wp-admin/css/dashboard-rtl.css
--- 2.2.2.src/wp-admin/css/dashboard-rtl.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/css/dashboard-rtl.css	2008-03-23 21:51:51.000000000 -0500
@@ -0,0 +1,62 @@
+#rightnow {
+	margin-left: 15px;
+}
+
+#rightnow .reallynow span {
+	text-align: right;
+	float: right;
+}
+
+#rightnow .reallynow a {
+	text-align: left;
+	float: left;
+	margin: 1px 0 0 6px;
+}
+
+h3.dashboard-widget-title span {
+	text-align: right;
+	float: right;
+}
+
+#dashboard-widgets .widget_rss ul li a {
+	float:right;
+	font-weight:bold;
+	margin:0pt 0pt 0.2em 0.5em;
+}
+
+#dashboard-widgets .widget_rss ul li span.rss-date {
+	float: right;
+}
+
+h3.dashboard-widget-title small {
+	text-align: left;
+	float: left;
+}
+div.dashboard-widget-content ul,
+div.dashboard-widget-content ol,
+div.dashboard-widget-content dl {
+	padding-left:0;
+	padding-right:15px;
+}
+div#dashboard-widgets-wrap
+{
+	margin-right:0;
+	margin-left:-10px;
+}
+
+div.dashboard-widget {
+	margin-right:0;
+	margin-left:20px;
+}
+
+#dashboard-widgets .widget_rss ul li span.rss-date {
+	float:right;
+}
+#dashboard-widgets .widget_rss ul li a {
+	float:right;
+	margin:0 0 0.2em 0.5em;
+}
+#dashboard_secondary div.dashboard-widget-content ul li a {
+	border-right:0 none;
+	border-left:1px solid #DADADA;
+}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/css/dashboard.css 2.5.src/wp-admin/css/dashboard.css
--- 2.2.2.src/wp-admin/css/dashboard.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/css/dashboard.css	2008-03-21 12:57:35.000000000 -0500
@@ -0,0 +1,282 @@
+/* Right Now */
+
+#rightnow {
+	border-width: 1px;
+	border-style: solid;
+	padding: 2px;
+	margin-top: 10px;
+	margin-right: 7px;
+}
+
+#rightnow .reallynow {
+	padding: 6px;
+	font-size: 15px;
+	line-height: 2;
+	margin: 0;
+}
+
+#rightnow .rbutton {
+	font-weight: normal;
+	padding: 6px;
+	border-bottom: none;
+	-moz-border-radius: 2px;
+	-khtml-border-radius: 2px;
+	-webkit-border-radius: 2px;
+	border-radius: 2px;
+	text-decoration: none;
+}
+
+#rightnow .reallynow span {
+	display: block;
+	text-align: left;
+	float: left;
+	padding: 0 6px;
+}
+
+#rightnow .reallynow a {
+	display: block;
+	text-align: right;
+	float: right;
+	padding: 0 6px;
+	font-size: 14px;
+	margin: 1px 6px 0 0;
+}
+
+#rightnow .youhave {
+	font-size:  14px;
+	padding: 10px;
+}
+
+#rightnow h3, #rightnow p {
+	padding: 0 10px;
+}
+
+#rightnow a {
+	font-weight: bold;
+}
+
+/* Widgets */
+
+div#dashboard-widgets-wrap {
+	margin-top: -20px;
+	margin-right: -13px; /* 20 (div.dashboard-widget margin-right) - 7 (#rightnow margin-right) */
+}
+
+div#dashboard-widgets {
+	width: 100%;
+}
+
+div.dashboard-widget-holder {	
+	margin-top: 20px;
+	width: 50%;
+	float: left;
+}
+
+div.dashboard-widget-holder.third {
+	width: 33.3%;
+}
+
+div.dashboard-widget-holder.fourth {
+	width: 25%;
+}
+
+div.dashboard-widget-holder.full {
+	width: 100%;
+}
+
+div.dashboard-widget-holder.double div.dashboard-widget {
+	height: 54em;
+	padding-bottom: 28px /* lame */
+}
+
+div.dashboard-widget {
+	position: relative;
+	margin-right: 20px;
+	border-width: 1px;
+	border-style: solid;
+	padding: 2px;
+	height: 27em;
+	overflow: auto;
+	font-size: 11px;
+}
+
+h3.dashboard-widget-title  {
+	margin: 0;
+	padding: 0 7px;
+	font-size: 14px;
+	line-height: 2;
+}
+
+h3.dashboard-widget-title span {
+	display: block;
+	text-align: left;
+	float: left;
+}
+
+h3.dashboard-widget-title small {
+	display: block;
+	text-align: right;
+	float: right;
+	font-size: 75%;
+	line-height: 2.67; /* math: it works, bitches */
+}
+
+h3.dashboard-widget-title img.rss-icon {
+	vertical-align: middle;
+	margin: .5em 0;
+}
+
+div.dashboard-widget-notice {
+	padding: 0 14px;
+	font-size: 1.2em;
+	line-height: 2;
+}
+
+div.dashboard-widget-error {
+	padding: 0 20px;
+	font-size: 1.2em;
+	line-height: 2;
+}
+
+div.dashboard-widget-content {
+	padding: 10px 15px;
+}
+
+div.dashboard-widget-submit {
+	border-top: 1px solid #ccc;
+	padding: 1em 0 0 0;
+	margin: 10px 0 0 0;
+}
+div.dashboard-widget-submit input {
+	font-family: "Lucida Grande", "Lucida Sans Unicode", Tahoma, Verdana, sans-serif;
+	padding: 4px 6px;
+	border: none;
+	font-size: 13px;
+	-moz-border-radius: 3px;
+	-khtml-border-radius: 3px;
+	-webkit-border-radius: 3px;
+	border-radius: 3px;
+	cursor: pointer;
+	text-decoration: none;	
+}
+
+div.dashboard-widget-content ul, div.dashboard-widget-content ol, div.dashboard-widget-content dl {
+	margin: 0;
+	text-indent: 0;
+	padding-left: 15px;
+}
+div.dashboard-widget-content li {
+	margin: .5em 0 1em;
+}
+
+div.dashboard-widget-content blockquote {
+	margin: -1em 0;
+}
+
+div#dashboard_recent_comments p {
+	font-size: 14px;
+}
+
+div.dashboard-widget-content p.comment-meta {
+	font-size: 11px !important;
+}
+
+#dashboard_secondary div.dashboard-widget {
+	height: auto;
+}
+
+#dashboard_secondary div.dashboard-widget-content ul {
+	list-style: none;
+	padding: 0;
+}
+
+#dashboard_secondary div.dashboard-widget-content ul li {
+	display: block;
+	width: 19.95%;
+	padding-bottom: 10px;
+	margin: 0;
+	float: left;
+	font-size: 95%;
+}
+
+#dashboard_secondary div.dashboard-widget-content {
+	margin: 10px 5px;
+	padding: 0;
+}
+
+#dashboard_secondary div.dashboard-widget-content ul li .post {
+	display:block;
+	font-family:Georgia,"Times New Roman",Times,serif;
+	font-size:18px;
+	line-height: 1.2em;
+	height:90px;
+	overflow:hidden;
+}
+
+#dashboard_secondary div.dashboard-widget-content ul li a {
+	display: block;
+	height:100%;
+	overflow:hidden;
+	margin: 5px 10px;
+	text-decoration: none;
+	padding: .5em;
+	border-right: 1px solid #dadada;
+	border-bottom: 1px solid #dadada;
+}
+
+#dashboard_secondary div.dashboard-widget-content ul li a cite {
+	display: block;
+	font-family: "Lucida Sans", "Lucida Grande", "Lucida Sans Unicode", Tahoma, Verdana, sans-serif;
+}
+
+#dashboard-widgets .widget_rss ul {
+	list-style: none;
+	padding: 0;
+}
+
+#dashboard-widgets .widget_rss ul li {
+	clear: both;
+}
+
+#dashboard-widgets .widget_rss ul li span.rss-date {
+	float: left;
+	margin: 0;
+}
+
+#dashboard-widgets .widget_rss ul li a {
+	float: left;
+	margin: 0 .5em .2em 0;
+	font-weight: bold;
+}
+
+#dashboard-widgets .widget_rss ul li div {
+	clear: both;
+	line-height: 1.5em;
+}
+
+#dashboard_primary a.rsswidget, #dashboard_plugins h5 {
+	font-size: 14px;
+}
+
+#dashboard_primary span.rss-date {
+	font-size: 14px;
+}
+
+#dashboard_plugins h4 {
+	font-size: 1em;
+	margin: 0 0 .1em;
+}
+
+#dashboard_plugins h5 {
+	margin: 0;
+	display: inline;
+	line-height: 1.4em;
+}
+
+#dashboard_plugins p {
+	margin: 0 0 1em;
+	line-height: 1.5em;
+}
+
+.widget-loading {
+}
diff -x .svn -aruN 2.2.2.src/wp-admin/css/global.css 2.5.src/wp-admin/css/global.css
--- 2.2.2.src/wp-admin/css/global.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/css/global.css	2008-03-26 17:27:27.000000000 -0500
@@ -0,0 +1,196 @@
+/* styles for use by people extending the WordPress interface */
+
+
+body	{
+	margin: 0;
+	padding: 0;
+}
+
+body, td {
+	font: 13px "Lucida Grande", "Lucida Sans Unicode", Tahoma, Verdana, sans-serif;
+}
+
+form, label input { margin: 0; padding: 0; }
+
+img { border: 0; }
+
+label { cursor: pointer; }
+
+li, dd { margin-bottom: 6px; }
+
+p, li, dl, dd, dt { line-height: 140%; }
+
+textarea, input, select {
+	font: 13px Verdana, Arial, Helvetica, sans-serif;
+	margin: 1px;
+	padding: 3px;
+}
+
+.alignleft { float: left; }
+.alignright { float: right; }
+
+.textleft { text-align: left; }
+.textright { text-align: right; }
+
+.clear { clear: both; height: 2px; }
+
+.hidden { display: none; }
+
+h1 {
+  display: block;
+  font-size: 2em;
+  font-weight: bold;
+  margin: .67em 0;
+}
+
+h2 {
+  display: block;
+  font-size: 1.5em;
+  font-weight: bold;
+  margin: .83em 0;
+}
+
+h3 {
+  display: block;
+  font-size: 1.17em;
+  font-weight: bold;
+  margin: 1em 0;
+}
+
+h4 {
+  display: block;
+  font-weight: bold;
+  margin: 1.33em 0;
+}
+
+h5 {
+  display: block;
+  font-size: 0.83em;
+  font-weight: bold;
+  margin: 1.67em 0;
+}
+
+h6 {
+  display: block;
+  font-size: 0.67em;
+  font-weight: bold;
+  margin: 2.33em 0;
+}
+
+.subsubsub {
+	list-style: none;
+	margin: 14px 0 8px 0;
+	padding: 0;
+	white-space: nowrap;
+	font-size: 12px;
+}
+
+.subsubsub a { line-height: 200%; padding: 3px; text-decoration: none; }
+
+.subsubsub a.current { font-weight: bold; background: none; border: none;}
+
+.subsubsub li { display: inline; margin: 0; padding: 0; }
+
+.widefat {
+	border-width: 1px;
+	border-style: solid;
+	border-collapse: collapse;
+	width: 100%;
+	clear: both;
+	margin: 0;
+}
+
+.widefat a {
+	text-decoration: none;
+}
+
+.widefat abbr {
+	white-space: nowrap;
+}
+
+.widefat td, .widefat th {
+	border-bottom-width: 1px;
+	border-bottom-style: solid;
+	border-bottom-color: #ccc;
+	font-size: 11px;
+	vertical-align: text-top;
+}
+
+.widefat td {
+	padding: 7px 15px 9px 10px;
+	vertical-align: top;
+}
+
+.widefat th {
+	padding: 9px 15px 6px 10px;
+	text-align: left;
+	line-height: 1.3em;
+}
+
+.widefat th input {
+	margin: 0 0 0 8px;
+	padding: 0;
+}
+
+.widefat .check-column {
+	text-align: right;
+	width: 1.5em;
+	padding: 0;
+
+}
+
+.widefat tbody th.check-column {
+	padding: 8px 0 22px;
+}
+/*
+th.check-column + th, th.check-column + td {
+	padding-left: 5px;
+}
+*/
+.widefat .num {
+	text-align: center;
+}
+
+.wrap, .updated, .error {
+	margin: 0;
+	margin-left: 15px;
+	margin-right: 15px;
+	padding: 0;
+	max-width: 980px;
+}
+
+.updated, .error {
+	border-width: 1px;
+	border-style: solid;
+	padding: 0 0.6em;
+	max-width: 950px;
+	margin-bottom: 1em;
+}
+
+.updated p, .error p {
+	margin: 0.6em 0;
+}
+
+.wrap .updated, .wrap .error {
+	margin: auto 0 0;
+}
+
+.updated a, .error a {
+	text-decoration: underline;
+}
+
+.updated a {
+	text-decoration: none;
+	padding-bottom: 2px;
+}
+
+.wrap h2 {
+	border-bottom-width: 1px;
+	border-bottom-style: solid;
+	clear: both;
+	font: 24px Georgia, "Times New Roman", Times, serif;
+	margin: 5px 0 0 -4px;
+	padding: 0;
+	padding-bottom: 7px;
+	padding-right: 280px;
+}
diff -x .svn -aruN 2.2.2.src/wp-admin/css/ie-rtl.css 2.5.src/wp-admin/css/ie-rtl.css
--- 2.2.2.src/wp-admin/css/ie-rtl.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/css/ie-rtl.css	2008-03-27 15:33:56.000000000 -0500
@@ -0,0 +1,53 @@
+/* footer */
+body, td {
+	font-family: Tahoma,Verdana,sans-serif;
+}
+
+.wrap {
+	text-align: right;
+}
+
+.wrap h2 {
+	margin: 5px 0 0 4px;
+}
+
+#footer {
+	padding-left:50px;
+}
+#footer p {
+	background:none;
+	height:auto;
+	padding: 5px 5px 0;
+}
+
+#bh {
+	padding-left: 15px;
+	padding-right: 0px;
+}
+/* write post */
+#poststuff .togbox {
+	margin-right:-16px;
+}
+#poststuff h3 {
+	padding-right:20px;
+}
+
+p#widget-search, p#post-search {
+	padding-left: 15px;
+}
+
+.widefat th {
+	padding-bottom: 8px;
+}
+
+/* template editor */
+#template textarea {
+	float:left;
+}
+
+/* Editor */
+
+.mceToolbar {
+	direction: ltr;
+	text-align: left;
+}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/css/ie.css 2.5.src/wp-admin/css/ie.css
--- 2.2.2.src/wp-admin/css/ie.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/css/ie.css	2008-03-24 11:18:30.000000000 -0500
@@ -0,0 +1,141 @@
+/* Fixes for IE bugs */
+
+#poststuff .postbox h3 {
+	padding-left: 23px;
+}
+
+#submenu li a.current {
+	background:none;
+	border:none;
+}
+
+* html body.minwidth {
+	_width: expression(document.documentElement.clientWidth < 810 ? "808px" : "99.9%");
+}
+
+* html #wpbody {
+	_width: expression(document.documentElement.clientWidth > 982 ? "980px" : "99.9%");
+}
+
+* html #poststuff .postarea, * html #poststuff #titlediv {
+	width: 95%;
+	margin-left: 3%;
+}
+
+.submitbox {
+	margin-top: 10px;
+}
+
+* html div.widget-liquid-left-holder, * html div.widget-liquid-right {
+	display: block;
+	position: relative;
+}
+
+#wpwrap, #wpcontent, #post, #wrap, #postdivrich, #postdiv, #poststuff, #titlediv, #post-body, #editorcontainer, .tablenav, .widget-control-list, li.widget-list-control-item, #dragHelper, li.widget-list-control-item h4, .widget-sortable, .widget-control-actions {
+	display: block;
+	zoom: 100%;
+}
+
+* html #editorcontainer {
+	padding: 0;
+}
+
+* html #editorcontainer #content {
+	position: relative;
+	overflow: auto;
+	padding: 6px;
+	margin: auto;
+	width: 98%;
+}
+
+form#template div {
+	width: 100%;
+}
+
+#ed_toolbar input {
+	overflow: visible;
+	padding: 0 4px;
+}
+
+#poststuff h2 {
+	font-size: 1.6em;
+}
+
+* html #poststuff h2 {
+	margin-left: 0;
+}
+
+#bh {
+	padding-right: 15px;
+}
+
+/* without this dashboard widgets appear in one column for some screen widths */
+div#dashboard-widgets {
+	padding-right: 1px;
+}
+
+#tagchecklist {
+	display: block;
+	zoom: 100%;
+}
+
+#tagchecklist span, #tagchecklist span a {
+	display: inline-block;
+	display: block;
+}
+
+#tagchecklist span a {
+	margin: 4px 0 0 -9px;
+}
+
+#poststuff .togbox {
+	margin-left: -19px;
+}
+
+.tablenav .button-secondary, .nav .button-secondary {
+	padding: 0 1px;
+	vertical-align: middle;
+}
+
+.tablenav select {
+	font-size: 13px;
+	display: inline-block;
+	vertical-align: top;
+	margin-top: 2px;
+}
+
+.tablenav-pages .page-numbers {
+	display: inline-block;
+}
+
+.tablenav-pages {
+	display: block;
+	margin-top: -3px;
+
+}
+
+#post-search .button, #widget-search .button {
+	padding: 1px;
+}
+
+.widefat tr, .widefat th {
+	margin-bottom: 0;
+	border-spacing: 0;
+}
+
+.widefat th input {
+	margin: 0 0 0 5px;
+}
+
+.widefat .check-column {
+	padding: 6px 0 2px;
+}
+
+.widefat tbody th.check-column {
+	padding: 4px 0 22px;
+}
+
+.tablenav a.button-secondary {
+	display: inline-block;
+	padding: 2px 5px;
+}
diff -x .svn -aruN 2.2.2.src/wp-admin/css/install-rtl.css 2.5.src/wp-admin/css/install-rtl.css
--- 2.2.2.src/wp-admin/css/install-rtl.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/css/install-rtl.css	2008-03-19 11:08:03.000000000 -0500
@@ -0,0 +1,19 @@
+body {
+	font-size: 11px;;
+}
+ul, ol {
+	padding: 5px 22px 5px 5px;
+}
+.form-table th {
+	text-align: right;
+}
+input {
+	padding: 1px
+}
+#logo {
+	text-align: left;
+}
+#admin_email {
+	direction: ltr;
+	text-align: left;
+}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/css/install.css 2.5.src/wp-admin/css/install.css
--- 2.2.2.src/wp-admin/css/install.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/css/install.css	2008-03-02 14:17:30.000000000 -0600
@@ -0,0 +1,124 @@
+html { background: #f1f1f1; }
+
+body {
+	background: #fff;
+	color: #333;
+	font-family: "Lucida Grande", "Lucida Sans Unicode", Tahoma, Verdana, sans-serif;
+	margin: 2em auto 0 auto;
+	width: 700px;
+	padding: 1em 2em;
+	-webkit-border-radius: 12px;
+	font-size: 62.5%;
+}
+
+a { color: #2583ad; text-decoration: none; }
+
+a:hover { color: #d54e21; }
+
+
+h1 {
+	font-size: 18px;
+	margin-bottom: 0;
+}
+
+h2 { font-size: 16px; }
+
+p, li {
+	padding-bottom: 2px;
+	font-size: 1.3em;
+	line-height: 1.8em;
+}
+
+code {
+	font-size: 1.3em;
+}
+
+ul, ol { padding: 5px 5px 5px 22px; }
+
+#logo { margin: 6px 0 14px 0px; border-bottom: none;}
+
+.step a, .step input { font-size: 2em; }
+
+td input { font-size: 1.5em; }
+
+.step, th { text-align: left; padding: 0; }
+
+.submit input, .button, .button-secondary {
+	font-family: "Lucida Grande", "Lucida Sans Unicode", Tahoma, Verdana, sans-serif;
+	padding: 6px;
+	border: none;
+	margin-left: 0;
+	font-size: 13px !important;
+	-moz-border-radius: 2px;
+	-khtml-border-radius: 2px;
+	-webkit-border-radius: 2px;
+	border-radius: 2px;
+	color: #246;
+	background: #e5e5e5;
+}
+
+.button-secondary {
+	background: #cee1ef;
+}
+
+.submit input:hover, .button:hover, .button-secondary:hover {
+	color: #d54e21;
+}
+
+.form-table {
+	border-collapse: collapse;
+	margin-top: 1em;
+	width: 100%;
+}
+
+.form-table td {
+	margin-bottom: 9px;
+	padding: 10px;
+	border-bottom: 8px solid #fff;
+}
+
+.form-table th {
+	font-size: 12px;
+	text-align: left;
+	padding: 12px 10px 10px 10px;
+	border-bottom: 8px solid #fff;
+	width: 110px;
+	vertical-align: top;
+}
+
+.form-table tr {
+	background: #eaf3fa;
+}
+
+.form-table code {
+	line-height: 18px;
+	font-size: 18px;
+}
+
+.form-table p {
+	margin: 4px 0 0 0;
+	font-size: 11px;
+}
+
+h1 {
+	border-bottom: 1px solid #dadada;
+	clear: both;
+	color: #666666;
+	font: 24px Georgia, "Times New Roman", Times, serif;
+	margin: 5px 0 0 -4px;
+	padding: 0;
+	padding-bottom: 7px;
+}
+
+#error-page {
+	margin-top: 50px;
+}
+
+#error-page p {
+	font-size: 14px;
+	line-height: 1.6em;
+}
+
+#error-page code {
+	font-size: 1em;
+}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/css/login-rtl.css 2.5.src/wp-admin/css/login-rtl.css
--- 2.2.2.src/wp-admin/css/login-rtl.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/css/login-rtl.css	2008-03-19 11:08:03.000000000 -0500
@@ -0,0 +1,32 @@
+body {
+	font-family: "Lucida Grande", "Lucida Sans Unicode", Tahoma, Verdana, sans-serif;
+	direction: rtl;
+}
+form {
+	margin-left:0;
+	margin-right:8px;
+}
+form .forgetmenot {
+	float:right;
+}
+form .submit {
+	float:left;
+}
+#login_error, .message {
+	margin:0 8px 16px 0;
+}
+#nav {
+	margin: 0 8px 0 0;
+}
+#user_pass, #user_login, #user_email {
+	margin-right:0;
+	margin-left: 6px;
+	direction:ltr;
+}
+h1 a {
+	text-decoration:none;
+}
+#backtoblog a {
+	left: auto;
+	right: 15px;
+}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/css/login.css 2.5.src/wp-admin/css/login.css
--- 2.2.2.src/wp-admin/css/login.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/css/login.css	2008-03-08 16:43:58.000000000 -0600
@@ -0,0 +1,74 @@
+* { margin: 0; padding: 0; }
+
+body {
+	border-top-width: 30px;
+	border-top-style: solid;
+	font: 12px "Lucida Grande", "Lucida Sans Unicode", Tahoma, Verdana, sans-serif;
+}
+
+form {
+	margin-left: 8px;
+	padding: 16px 16px 40px 16px;
+	font-weight: bold;
+	-moz-border-radius: 5px;
+	-khtml-border-radius: 5px;
+	-webkit-border-radius: 5px;
+	border-radius: 5px;
+}
+
+form .forgetmenot { font-weight: normal; float: left; margin-bottom: 0;}
+
+#login form .submit input {
+	font-family: "Lucida Grande", "Lucida Sans Unicode", Tahoma, Verdana, sans-serif;
+	padding: 3px 5px;
+	border: none;
+	font-size: 13px;
+	border-width: 1px;
+	border-style: solid;
+	-moz-border-radius: 3px;
+	-khtml-border-radius: 3px;
+	-webkit-border-radius: 3px;
+	border-radius: 3px;
+	cursor: default;
+	text-decoration: none;	
+	margin-top: -6px;
+}
+
+form .submit { float: right; }
+
+form p { margin-bottom: 24px; }
+
+h1 a {
+	background: url(../images/logo-login.gif) no-repeat;
+	width: 292px;
+	height: 66px;
+	text-indent: -9999px;
+	overflow: hidden;
+	padding-bottom: 15px;
+	display: block;
+}
+
+#backtoblog a {
+	position: absolute;
+	top: 7px;
+	left: 15px;
+	text-decoration: none;
+}
+
+#login { width: 292px; margin: 7em auto; }
+
+#login_error, .message {
+	margin: 0 0 16px 8px;
+	border-width: 1px;
+	border-style: solid;
+	padding: 12px;
+}
+
+#nav { margin: 0 0 0 8px; padding: 16px; }
+
+#user_pass, #user_login, #user_email {
+	font-size: 20px;
+	width: 97%;
+	padding: 3px;
+	margin-right: 6px;
+}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/css/media-rtl.css 2.5.src/wp-admin/css/media-rtl.css
--- 2.2.2.src/wp-admin/css/media-rtl.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/css/media-rtl.css	2008-03-19 11:08:03.000000000 -0500
@@ -0,0 +1,21 @@
+ul#sidemenu {
+	left: auto;
+	right: 0;
+}
+.align .field label {
+	display: block;
+	float: right;
+	padding: 0 25px 0 0;
+	margin: 5px 3px 5px 5px; 
+}
+.align .field input {
+	display: block;
+	float: right;
+	margin: 5px 15px 5px 0;
+}
+.image-align-none-label,
+.image-align-left-label,
+.image-align-center-label,
+.image-align-right-label {
+	background-position: center right;
+}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/css/media.css 2.5.src/wp-admin/css/media.css
--- 2.2.2.src/wp-admin/css/media.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/css/media.css	2008-03-23 21:53:15.000000000 -0500
@@ -0,0 +1,242 @@
+div#media-upload-header {
+	margin: 0;
+	padding: 0 5px;
+	font-weight: bold;
+	position: relative;
+	border-bottom-width: 1px;
+	border-bottom-style: solid;
+	height: 2.5em;
+}
+
+body#media-upload ul#sidemenu {
+	font-weight: normal;
+	margin: 0 5px;
+	position: absolute;
+	left: 0px;
+	bottom: -1px;
+}
+
+div#media-upload-error {
+	margin: 1em;
+	font-weight: bold;
+}
+
+form {
+	margin: 1em;
+}
+
+#search-filter {
+	text-align: right;
+}
+
+.media-upload-form label, .media-upload-form legend {
+	display:block;
+	font-weight: bold;
+	margin-bottom: 0.5em;
+	margin: 0 0 0.5em 0;
+}
+
+th { position: relative; }
+
+.media-upload-form label.form-help, td.help {
+	font-style: italic;
+	font-weight: normal;
+}
+
+.media-upload-form p.help {
+	margin: 0;
+	padding: 0;
+}
+
+.media-upload-form fieldset {
+	width: 100%;
+	border: none;
+	text-align: justify;
+	margin: 0 0 1em 0;
+	padding: 0;
+}
+
+/* specific to the image upload form */
+.align .field label {
+	display: inline;
+	padding: 0 0 0 28px;
+	margin: 0 1em 0 0;
+}
+.image-align-none-label {
+	background: url(../images/align-none.png) no-repeat center left;
+}
+
+.image-align-left-label {
+	background: url(../images/align-left.png) no-repeat center left;
+}
+
+.image-align-center-label {
+	background: url(../images/align-center.png) no-repeat center left;
+}
+
+.image-align-right-label {
+	background: url(../images/align-right.png) no-repeat center left;
+}
+
+#flash-upload-ui, .insert-gallery {
+	display: none;
+}
+
+tr.image-size label {
+	display: inline;
+	margin: 0 1em 0 0;
+}
+.pinkynail {
+	max-width: 40px;
+	max-height: 40px;
+}
+
+.filename {
+	display: none;
+}
+button.dismiss {
+	position: absolute;
+	top: 5px;
+	right: 5px;
+	z-index: 4;
+}
+.file-error {
+	margin: 0 0 5px 50px;
+	font-weight: bold;
+}
+
+.progress {
+	position: absolute;
+	top: 0px;
+	left: 0px;
+	width: 623px;
+	height: 36px;
+}
+.bar {
+	width: 0px;
+	height: 100%;
+	border-right-width: 3px;
+	border-right-style: solid;
+}
+.media-item .thumbnail {
+	max-width: 128px;
+	max-height: 128px;
+}
+.media-item .pinkynail {
+	position: absolute;
+	top: 2px;
+	left: 2px;
+	height: 32px;
+	max-width: 40px;
+}
+
+tbody.media-item-info tr {
+	background-color: transparent;
+}
+tbody.media-item-info th, tbody.media-item-info td {
+	border: none;
+	margin: 0;
+}
+
+.form-table tbody.media-item-info {
+	border: 8px solid #fff;
+}
+
+.describe.startopen, .describe.startclosed {
+	display: none;
+}
+abbr.required {
+	text-decoration: none;
+	border: none;
+}
+.describe label {
+	display: inline;
+}
+.describe td {
+	vertical-align: middle;
+}
+.describe td.A1 {
+	width: 132px;
+}
+.describe input[type="text"], .describe textarea {
+	width: 460px;
+}
+.describe-toggle-on, .describe-toggle-off {
+	display: block;
+	line-height: 36px;
+	z-index: 2;
+	position: absolute;
+	top: 0px;
+	right: 20px;
+}
+.describe-toggle-off {
+	display: none;
+}
+.clickmask {
+	background: transparent;
+	position: absolute;
+	top: 0px;
+	left: 0px;
+	cursor: pointer;
+	border: none;
+	z-index: 3;
+	height: 36px;
+}
+
+.hidden {
+	height: 0px;
+	width: 0px;
+	overflow: hidden;
+	border: none;
+}
+
+/* Specific to Uploader */
+
+#media-upload .media-upload-form p {
+	margin: 0 1em 1em 0;
+}
+#media-upload p.help {
+	font-style: italic;
+	font-weight: normal;
+}
+#media-upload tr.image-size td.field {
+	text-align: center;
+}
+#media-upload #media-items {
+	border-width: 1px;
+	border-style: solid;
+	border-bottom: none;
+	width: 623px;
+}
+
+#media-upload .media-item {
+	border-bottom-width: 1px;
+	border-bottom-style: solid;
+	width: 623px;
+	position: relative;
+	min-height: 36px;
+}
+#media-upload .filename {
+	display: block;
+	line-height: 36px;
+	margin-left: 50px;
+	z-index: 2;
+}
+#media-upload .describe {
+	border-top-width: 1px;
+	border-top-style: solid;
+	padding: 5px;
+	width: 100%;
+	clear: both;
+}
+#media-upload .describe th.label {
+	padding-top: .5em;
+	text-align: left;
+}
+#media-upload tr.align td.field {
+	text-align: center;
+}
+#media-upload tr.image-size {
+	margin-bottom: 1em;
+	height: 3em;
+}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/css/theme-editor-rtl.css 2.5.src/wp-admin/css/theme-editor-rtl.css
--- 2.2.2.src/wp-admin/css/theme-editor-rtl.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/css/theme-editor-rtl.css	2008-03-24 11:16:15.000000000 -0500
@@ -0,0 +1,11 @@
+#templateside {
+	float:left;
+}
+#themeselector {
+	padding-right:0;
+	padding-left:5px;
+}
+div.tablenav {
+	margin-left:210px;
+	margin-right:0;
+}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/css/theme-editor.css 2.5.src/wp-admin/css/theme-editor.css
--- 2.2.2.src/wp-admin/css/theme-editor.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/css/theme-editor.css	2008-03-14 18:58:31.000000000 -0500
@@ -0,0 +1,66 @@
+#template textarea {
+	font-family: 'Courier New', Courier, monospace;
+	font-size: 12px;
+	width: 97%;
+}
+
+#template p {
+	width: 97%;
+}
+
+#templateside {
+	float: right;
+	width: 190px;
+	margin-top:-3.4em;
+}
+
+#templateside h3, #postcustomstuff p.submit {
+	margin: 0;
+}
+
+h3#bordertitle {
+	margin-bottom: 10px;
+}
+
+#templateside h4 {
+	margin-bottom: 0px;
+}
+
+#templateside ol, #templateside ul {
+	list-style: none;
+	margin: .5em;
+	padding: 0;
+}
+
+#templateside ol li, #templateside ul li {
+	margin: 1px 0px;
+}
+
+#themeselector {
+	padding-right: 5px;
+	float: right;
+	position: relative;
+	bottom: 25px;
+}
+
+#themeselector select {
+	margin: 0;
+	padding: 0;
+}
+
+.nonessential {
+	font-size: small;
+}
+
+.highlight {
+	padding: 1px;
+}
+
+div.bordertitle h2 {
+	border: none;
+	padding-bottom: 0px;
+}
+
+div.tablenav {
+	margin-right: 210px;
+}
diff -x .svn -aruN 2.2.2.src/wp-admin/css/upload-rtl.css 2.5.src/wp-admin/css/upload-rtl.css
--- 2.2.2.src/wp-admin/css/upload-rtl.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/css/upload-rtl.css	2008-03-22 12:59:55.000000000 -0500
@@ -0,0 +1,12 @@
+html {
+	direction: ltr;
+	}
+#uploadoptions, table {
+	direction: rtl;
+	}
+td {
+	padding: 1px 6px 0;
+	}
+.submit {
+	text-align: left;
+	}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/css/widgets-rtl.css 2.5.src/wp-admin/css/widgets-rtl.css
--- 2.2.2.src/wp-admin/css/widgets-rtl.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/css/widgets-rtl.css	2008-03-23 21:51:51.000000000 -0500
@@ -0,0 +1,50 @@
+div.widget-liquid-left-holder {
+	clear:right;
+	float:right;
+	margin-right:0;
+	margin-left:-310px;
+}
+div.widget-liquid-left {
+	margin-right:0;
+	margin-left:310px;
+}
+div.widget-liquid-right {
+	clear:left;
+	float:left;
+}
+p#widget-search {
+	left:0;
+	right:auto
+}
+ul#widget-list li.widget-list-item h4.widget-title {
+	float:right;
+	text-align:right;
+}
+ul#widget-list li.widget-list-item div.widget-description {
+	margin:0 200px 0 0;
+	padding:0 4em 0 0;
+}
+.widget-control-save, .widget-control-remove {
+	float:right;
+	margin-right:0;
+	margin-left:8px;
+}
+h4.widget-title a {
+	right:auto;
+	left:1em;
+}
+li.widget-list-control-item h4.widget-title a, #dragHelper li.widget-list-control-item h4.widget-title a, #draghelper li.widget-list-control-item h4.widget-title a:visited {
+	right:auto;
+	left:2em;
+}
+
+li.widget-list-control-item div.widget-control {
+	padding:0 0 0 10px;
+}
+ul.widget-control-list div.widget-control-actions {
+	margin-right:0;
+	margin-left:-10px;
+}
+ul.widget-control-list .widget-title {
+	text-align:right;
+}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/css/widgets.css 2.5.src/wp-admin/css/widgets.css
--- 2.2.2.src/wp-admin/css/widgets.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/css/widgets.css	2008-03-24 11:18:30.000000000 -0500
@@ -0,0 +1,190 @@
+/* 2 column liquid layout */
+div.widget-liquid-left-holder {
+	float: left;
+	clear: left;
+	width: 100%;
+	margin-right: -310px;
+}
+
+div.widget-liquid-left {
+	margin-right: 320px;
+}
+
+div.widget-liquid-right {
+	float: right;
+	clear: right;
+	width: 300px;
+	position: relative;
+}
+
+/* pasitioning etc. */
+form#widgets-filter {
+	position: relative;
+}
+
+div#available-widgets-filter {
+	border-bottom-width: 1px;
+	border-bottom-style: solid;
+}
+
+p#widget-search {
+	position: absolute;
+	right: 0;
+	top: 0;
+	margin: 0;
+}
+
+ul#widget-list {
+	list-style: none;
+	margin: 0;
+	padding: 0;
+}
+
+ul#widget-list li.widget-list-item {
+	padding: .7em 0.9em;
+	margin: 0;
+	border-bottom-width: 1px;
+	border-bottom-style: solid;
+	background-color: transparent;
+	line-height: 1;
+}
+
+ul#widget-list li.widget-list-item h4.widget-title {
+	position: relative;
+	margin: 0;
+	padding: .5em 1em;
+	width: 200px;
+	float: left;
+	font-size: 13px;
+	-moz-border-radius: 3px;
+	-khtml-border-radius: 3px;
+	-webkit-border-radius: 3px;
+	border-radius: 3px;;
+}
+
+#dragHelper h4.widget-title {
+	padding: .5em 1em;
+	margin: 0;
+}
+
+ul#widget-list li.widget-list-item div.widget-description {
+	display: block;
+	margin: 0 0 0 200px;
+	padding: 0 0 0 4em;
+	font-size: 11px;
+}
+
+
+ul#widget-list li.widget-list-item ul.widget-control-info {
+	display: none;
+}
+
+div#sidebar-info {
+	padding: 0 1em;
+	margin-bottom: 1em;
+	font-size: 11px;
+}
+
+ul.widget-control-list {
+	list-style: none;
+	margin: 0;
+	padding: 0 1em;
+}
+
+div#current-widgets p.submit {
+	padding: 1em;
+}
+
+li.widget-list-control-item {
+	margin: 0 0 1em;
+	-moz-border-radius: 3px;
+	-khtml-border-radius: 3px;
+	-webkit-border-radius: 3px;
+	border-radius: 3px;
+}
+
+li.widget-list-control-item h4, #dragHelper li.widget-list-control-item h4, li.widget-sortable h4 {
+	margin: 0;
+	padding: 0.4em 2.5em 0.4em 0.8em;
+	cursor: move;
+	font-size: 13px;
+	-moz-border-radius: 3px;
+	-khtml-border-radius: 3px;
+	-webkit-border-radius: 3px;
+	border-radius: 3px;
+}
+
+.widget-control-save, .widget-control-remove {
+	padding: 3px 5px;
+	-moz-border-radius: 3px;
+	-khtml-border-radius: 3px;
+	-webkit-border-radius: 3px;
+	border-radius: 3px;
+	margin-right: 8px;
+	float: left;
+	text-decoration: none;
+}
+
+h4.widget-title a {
+	position: absolute;
+	right: 1em;
+	text-decoration: underline;
+	border-bottom: none;
+}
+
+li.widget-list-control-item h4.widget-title a,
+#dragHelper li.widget-list-control-item h4.widget-title a,
+#draghelper li.widget-list-control-item h4.widget-title a:visited {
+	right: 2em;
+}
+
+li.widget-list-control-item h4.widget-title a:hover {
+
+	text-decoration: none;
+	border-bottom: none;
+}
+
+li.widget-list-control-item div.widget-control {
+	display: none;
+	margin: 1em;
+	padding: 0 10px 0 7px; /* Correction for padding, margin, border of inputs */
+	font-size: 11px;
+}
+
+li.widget-list-control-item div.widget-control p {
+	margin: 0 0 1em;
+	padding: 0;
+}
+
+ul.widget-control-list div.widget-control-actions {
+	margin-right: -10px; /* Correction for padding, margin, border of inputs */
+	margin-left: -6px;
+	border-top-width: 1px;
+	border-top-style: solid;
+	padding: 0.5em 0 0.8em;
+}
+
+ul.widget-control-list .widget-title {
+	
+}
+
+.widget-control-edit {
+	font-size: 10px;
+	font-weight: normal;
+}
+
+div#current-widgets {
+	padding-top: 1em;
+	border-width: 1px;
+	border-style: solid none none;
+}
+
+#widget-controls .widefat {
+	width: 92%;
+	padding: 3px;
+}
+
+#widget-controls select.widefat {
+	width: auto;
+	display: block;
+}
diff -x .svn -aruN 2.2.2.src/wp-admin/custom-fields.js 2.5.src/wp-admin/custom-fields.js
--- 2.2.2.src/wp-admin/custom-fields.js	2006-11-19 01:56:05.000000000 -0600
+++ 2.5.src/wp-admin/custom-fields.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,26 +0,0 @@
-function customFieldsOnComplete( what, where, update, transport ) {
-	var pidEl = $('post_ID');
-	pidEl.name = 'post_ID';
-	pidEl.value = getNodeValue(transport.responseXML, 'postid');
-	var aEl = $('hiddenaction')
-	if ( aEl.value == 'post' ) aEl.value = 'postajaxpost';
-}
-addLoadEvent(customFieldsAddIn);
-function customFieldsAddIn() {
-	theList.showLink=0;
-	theList.addComplete = customFieldsOnComplete;
-	if (!theList.theList) return false;
-	inputs = theList.theList.getElementsByTagName('input');
-	for ( var i=0; i < inputs.length; i++ ) {
-		if ('text' == inputs[i].type) {
-			inputs[i].setAttribute('autocomplete', 'off');
-			inputs[i].onkeypress = function(e) {return killSubmit('theList.ajaxUpdater("meta", "meta-' + parseInt(this.name.slice(5),10) + '");', e); };
-		}
-		if ('updatemeta' == inputs[i].className) {
-			inputs[i].onclick = function(e) {return killSubmit('theList.ajaxUpdater("meta", "meta-' + parseInt(this.parentNode.parentNode.id.slice(5),10) + '");', e); };
-		}
-	}
-
-	$('metakeyinput').onkeypress = function(e) {return killSubmit('theList.inputData+="&id="+$("post_ID").value;theList.ajaxAdder("meta", "newmeta");', e); };
-	$('updatemetasub').onclick = function(e) {return killSubmit('theList.inputData+="&id="+$("post_ID").value;theList.ajaxAdder("meta", "newmeta");', e); };
-}
diff -x .svn -aruN 2.2.2.src/wp-admin/custom-header.php 2.5.src/wp-admin/custom-header.php
--- 2.2.2.src/wp-admin/custom-header.php	2007-05-15 11:47:07.000000000 -0500
+++ 2.5.src/wp-admin/custom-header.php	2008-02-26 15:07:15.000000000 -0600
@@ -160,7 +160,7 @@
 <h2><?php _e('Your Header Image'); ?></h2>
 <p><?php _e('This is your header image. You can change the text color or upload and crop a new image.'); ?></p>
 
-<div id="headimg" style="background: url(<?php clean_url(header_image()) ?>) no-repeat;">
+<div id="headimg" style="background-image: url(<?php clean_url(header_image()) ?>);">
 <h1><a onclick="return false;" href="<?php bloginfo('url'); ?>" title="<?php bloginfo('name'); ?>" id="name"><?php bloginfo('name'); ?></a></h1>
 <div id="desc"><?php bloginfo('description');?></div>
 </div>
@@ -169,7 +169,7 @@
 <input type="button" value="<?php _e('Hide Text'); ?>" onclick="hide_text()" id="hidetext" />
 <input type="button" value="<?php _e('Select a Text Color'); ?>" onclick="colorSelect($('textcolor'), 'pickcolor')" id="pickcolor" /><input type="button" value="<?php _e('Use Original Color'); ?>" onclick="colorDefault()" id="defaultcolor" />
 <?php wp_nonce_field('custom-header') ?>
-<input type="hidden" name="textcolor" id="textcolor" value="#<?php attribute_escape(header_textcolor()) ?>" /><input name="submit" type="submit" value="<?php _e('Save Changes'); ?> &raquo;" /></form>
+<input type="hidden" name="textcolor" id="textcolor" value="#<?php attribute_escape(header_textcolor()) ?>" /><input name="submit" type="submit" value="<?php _e('Save Changes'); ?>" /></form>
 <?php } ?>
 
 <div id="colorPickerDiv" style="z-index: 100;background:#eee;border:1px solid #ccc;position:absolute;visibility:hidden;"> </div>
@@ -183,7 +183,7 @@
 <input type="hidden" name="action" value="save" />
 <?php wp_nonce_field('custom-header') ?>
 <p class="submit">
-<input type="submit" value="<?php _e('Upload'); ?> &raquo;" />
+<input type="submit" value="<?php _e('Upload'); ?>" />
 </p>
 </form>
 
@@ -211,6 +211,7 @@
 		die( $file['error'] );
 
 		$url = $file['url'];
+		$type = $file['type'];
 		$file = $file['file'];
 		$filename = basename($file);
 
@@ -218,19 +219,20 @@
 		$object = array(
 		'post_title' => $filename,
 		'post_content' => $url,
-		'post_mime_type' => 'import',
+		'post_mime_type' => $type,
 		'guid' => $url);
 
 		// Save the data
 		$id = wp_insert_attachment($object, $file);
 
-		$upload = array('file' => $file, 'id' => $id);
-
 		list($width, $height, $type, $attr) = getimagesize( $file );
 
 		if ( $width == HEADER_IMAGE_WIDTH && $height == HEADER_IMAGE_HEIGHT ) {
+			// Add the meta-data
+			wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) );
+
 			set_theme_mod('header_image', clean_url($url));
-			$header = apply_filters('wp_create_file_in_uploads', $file, $id); // For replication
+			do_action('wp_create_file_in_uploads', $file, $id); // For replication
 			return $this->finished();
 		} elseif ( $width > HEADER_IMAGE_WIDTH ) {
 			$oitar = $width / HEADER_IMAGE_WIDTH;
@@ -264,7 +266,7 @@
 <input type="hidden" name="attachment_id" id="attachment_id" value="<?php echo $id; ?>" />
 <input type="hidden" name="oitar" id="oitar" value="<?php echo $oitar; ?>" />
 <?php wp_nonce_field('custom-header') ?>
-<input type="submit" value="<?php _e('Crop Header &raquo;'); ?>" />
+<input type="submit" value="<?php _e('Crop Header'); ?>" />
 </p>
 
 </form>
@@ -281,22 +283,34 @@
 			$_POST['height'] = $_POST['height'] * $_POST['oitar'];
 		}
 
-		$header = wp_crop_image($_POST['attachment_id'], $_POST['x1'], $_POST['y1'], $_POST['width'], $_POST['height'], HEADER_IMAGE_WIDTH, HEADER_IMAGE_HEIGHT);
-		$header = apply_filters('wp_create_file_in_uploads', $header); // For replication
+		$original = get_attached_file( $_POST['attachment_id'] );
 
-		$parent = get_post($_POST['attachment_id']);
+		$cropped = wp_crop_image($_POST['attachment_id'], $_POST['x1'], $_POST['y1'], $_POST['width'], $_POST['height'], HEADER_IMAGE_WIDTH, HEADER_IMAGE_HEIGHT);
+		$cropped = apply_filters('wp_create_file_in_uploads', $cropped, $_POST['attachment_id']); // For replication
 
+		$parent = get_post($_POST['attachment_id']);
 		$parent_url = $parent->guid;
+		$url = str_replace(basename($parent_url), basename($cropped), $parent_url);
 
-		$url = str_replace(basename($parent_url), basename($header), $parent_url);
+		// Construct the object array
+		$object = array(
+			'ID' => $_POST['attachment_id'],
+			'post_title' => basename($cropped),
+			'post_content' => $url,
+			'post_mime_type' => 'image/jpeg',
+			'guid' => $url
+		);
+
+		// Update the attachment
+		wp_insert_attachment($object, $cropped);
+		wp_update_attachment_metadata( $_POST['attachment_id'], wp_generate_attachment_metadata( $_POST['attachment_id'], $cropped ) );
 
 		set_theme_mod('header_image', $url);
 
 		// cleanup
-		$file = get_attached_file( $_POST['attachment_id'] );
-		$medium = str_replace(basename($file), 'midsize-'.basename($file), $file);
+		$medium = str_replace(basename($original), 'midsize-'.basename($original), $original);
 		@unlink( apply_filters( 'wp_delete_file', $medium ) );
-		wp_delete_attachment( $_POST['attachment_id'] );
+		@unlink( apply_filters( 'wp_delete_file', $original ) );
 
 		return $this->finished();
 	}
diff -x .svn -aruN 2.2.2.src/wp-admin/dbx-admin-key.js 2.5.src/wp-admin/dbx-admin-key.js
--- 2.2.2.src/wp-admin/dbx-admin-key.js	2007-04-17 15:56:41.000000000 -0500
+++ 2.5.src/wp-admin/dbx-admin-key.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,47 +0,0 @@
-addLoadEvent( function() {var manager = new dbxManager( dbxL10n.manager );} );
-
-addLoadEvent( function()
-{
-	//create new docking boxes group
-	var meta = new dbxGroup(
-		'grabit', 		// container ID [/-_a-zA-Z0-9/]
-		'vertical', 		// orientation ['vertical'|'horizontal']
-		'10', 			// drag threshold ['n' pixels]
-		'no',			// restrict drag movement to container axis ['yes'|'no']
-		'10', 			// animate re-ordering [frames per transition, or '0' for no effect]
-		'yes', 			// include open/close toggle buttons ['yes'|'no']
-		'closed', 		// default state ['open'|'closed']
-		dbxL10n.open, 		// word for "open", as in "open this box"
-		dbxL10n.close, 		// word for "close", as in "close this box"
-		dbxL10n.moveMouse,	// sentence for "move this box" by mouse
-		dbxL10n.toggleMouse,	// pattern-match sentence for "(open|close) this box" by mouse
-		dbxL10n.moveKey,	// sentence for "move this box" by keyboard
-		dbxL10n.toggleKey,	// pattern-match sentence-fragment for "(open|close) this box" by keyboard
-		'%mytitle%  [%dbxtitle%]' // pattern-match syntax for title-attribute conflicts
-		);
-
-	// Boxes are closed by default. Open the Category box if the cookie isn't already set.
-	var catdiv = document.getElementById('categorydiv');
-	if ( catdiv ) {
-		var button = catdiv.getElementsByTagName('A')[0];
-		if ( dbx.cookiestate == null && /dbx\-toggle\-closed/.test(button.className) )
-			meta.toggleBoxState(button, true);
-	}
-
-	var advanced = new dbxGroup(
-		'advancedstuff',
-		'vertical',
-		'10',
-		'yes',			// restrict drag movement to container axis ['yes'|'no']
-		'10',
-		'yes',
-		'closed',
-		dbxL10n.open,
-		dbxL10n.close,
-		dbxL10n.moveMouse,
-		dbxL10n.toggleMouse,
-		dbxL10n.moveKey,
-		dbxL10n.toggleKey,
-		'%mytitle%  [%dbxtitle%]' // pattern-match syntax for title-attribute conflicts
-		);
-});
diff -x .svn -aruN 2.2.2.src/wp-admin/edit-attachment-rows.php 2.5.src/wp-admin/edit-attachment-rows.php
--- 2.2.2.src/wp-admin/edit-attachment-rows.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/edit-attachment-rows.php	2008-03-26 21:50:01.000000000 -0500
@@ -0,0 +1,148 @@
+<?php if ( ! defined('ABSPATH') ) die(); ?>
+<table class="widefat">
+	<thead>
+	<tr>
+
+<?php $posts_columns = wp_manage_media_columns(); ?>
+<?php foreach($posts_columns as $post_column_key => $column_display_name) {
+	if ( 'cb' === $post_column_key )
+		$class = ' class="check-column"';
+	elseif ( 'comments' === $post_column_key )
+		$class = ' class="num"';
+	else
+		$class = '';
+?>
+	<th scope="col"<?php echo $class; ?>><?php echo $column_display_name; ?></th>
+<?php } ?>
+
+	</tr>
+	</thead>
+	<tbody id="the-list" class="list:post">
+<?php
+if ( have_posts() ) {
+$bgcolor = '';
+add_filter('the_title','wp_specialchars');
+while (have_posts()) : the_post();
+$class = 'alternate' == $class ? '' : 'alternate';
+global $current_user;
+$post_owner = ( $current_user->ID == $post->post_author ? 'self' : 'other' );
+?>
+	<tr id='post-<?php echo $id; ?>' class='<?php echo trim( $class . ' author-' . $post_owner . ' status-' . $post->post_status ); ?>' valign="top">
+
+<?php
+
+foreach($posts_columns as $column_name=>$column_display_name) {
+
+	switch($column_name) {
+
+	case 'cb':
+		?>
+		<th scope="row" class="check-column"><input type="checkbox" name="delete[]" value="<?php the_ID(); ?>" /></th>
+		<?php
+		break;
+
+	case 'icon':
+		?>
+		<td class="media-icon"><?php echo wp_get_attachment_link($post->ID, array(80, 60), false, true); ?></td>
+		<?php
+		// TODO
+		break;
+
+	case 'media':
+		?>
+		<td><strong><a href="media.php?action=edit&amp;attachment_id=<?php the_ID(); ?>" title="<?php echo attribute_escape(sprintf(__('Edit "%s"'), get_the_title())); ?>"><?php the_title(); ?></a></strong><br />
+		<?php echo strtoupper(preg_replace('/^.*?\.(\w+)$/', '$1', get_attached_file($post->ID))); ?>
+		<?php do_action('manage_media_media_column', $post->ID); ?>
+		</td>
+		<?php
+		break;
+
+	case 'desc':
+		?>
+		<td><?php echo has_excerpt() ? $post->post_excerpt : ''; ?></td>
+		<?php
+		break;
+
+	case 'date':
+		if ( '0000-00-00 00:00:00' == $post->post_date && 'date' == $column_name ) {
+			$t_time = $h_time = __('Unpublished');
+		} else {
+			$t_time = get_the_time(__('Y/m/d g:i:s A'));
+			$m_time = $post->post_date;
+			$time = get_post_time( 'G', true );
+			if ( ( abs($t_diff = time() - $time) ) < 86400 ) {
+				if ( $t_diff < 0 )
+					$h_time = sprintf( __('%s from now'), human_time_diff( $time ) );
+				else
+					$h_time = sprintf( __('%s ago'), human_time_diff( $time ) );
+			} else {
+				$h_time = mysql2date(__('Y/m/d'), $m_time);
+			}
+		}
+		?>
+		<td><?php echo $h_time ?></td>
+		<?php
+		break;
+
+	case 'parent':
+		$title = __('(no title)'); // override below
+		if ( $post->post_parent > 0 ) {
+			if ( get_post($post->post_parent) ) {
+				$parent_title = get_the_title($post->post_parent);
+				if ( !empty($parent_title) )
+					$title = $parent_title;
+			}
+			?>
+			<td><strong><a href="post.php?action=edit&amp;post=<?php echo $post->post_parent; ?>"><?php echo $title ?></a></strong></td>
+			<?php
+		} else {
+			?>
+			<td>&nbsp;</td>
+			<?php
+		}
+
+		break;
+
+	case 'comments':
+		?>
+		<td class="num"><div class="post-com-count-wrapper">
+		<?php
+		$left = get_pending_comments_num( $post->ID );
+		$pending_phrase = sprintf( __('%s pending'), number_format( $left ) );
+		if ( $left )
+			echo '<strong>';
+		comments_number("<a href='upload.php?attachment_id=$id' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . __('0') . '</span></a>', "<a href='upload.php?attachment_id=$id' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . __('1') . '</span></a>', "<a href='upload.php?attachment_id=$id' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . __('%') . '</span></a>');
+		if ( $left )
+			echo '</strong>';
+		?>
+		</div></td>
+		<?php
+		break;
+
+	case 'location':
+		?>
+		<td><a href="<?php the_permalink(); ?>"><?php _e('Permalink'); ?></a></td>
+		<?php
+		break;
+
+	default:
+		?>
+		<td><?php do_action('manage_media_custom_column', $column_name, $id); ?></td>
+		<?php
+		break;
+	}
+}
+?>
+	</tr>
+<?php
+endwhile;
+} else {
+?>
+  <tr style='background-color: <?php echo $bgcolor; ?>'>
+    <td colspan="8"><?php _e('No posts found.') ?></td>
+  </tr>
+<?php
+} // end if ( have_posts() )
+?>
+	</tbody>
+</table>
diff -x .svn -aruN 2.2.2.src/wp-admin/edit-category-form.php 2.5.src/wp-admin/edit-category-form.php
--- 2.2.2.src/wp-admin/edit-category-form.php	2007-02-25 07:41:38.000000000 -0600
+++ 2.5.src/wp-admin/edit-category-form.php	2008-03-18 14:20:18.000000000 -0500
@@ -1,15 +1,15 @@
 <?php
 if ( ! empty($cat_ID) ) {
 	$heading = __('Edit Category');
-	$submit_text = __('Edit Category &raquo;');
-	$form = '<form name="editcat" id="editcat" method="post" action="categories.php">';
+	$submit_text = __('Edit Category');
+	$form = '<form name="editcat" id="editcat" method="post" action="categories.php" class="validate">';
 	$action = 'editedcat';
 	$nonce_action = 'update-category_' . $cat_ID;
 	do_action('edit_category_form_pre', $category);
 } else {
 	$heading = __('Add Category');
-	$submit_text = __('Add Category &raquo;');
-	$form = '<form name="addcat" id="addcat" method="post" action="categories.php">';
+	$submit_text = __('Add Category');
+	$form = '<form name="addcat" id="addcat" method="post" action="categories.php" class="add:the-list: validate">';
 	$action = 'addcat';
 	$nonce_action = 'add-category';
 	do_action('add_category_form_pre', $category);
@@ -21,29 +21,33 @@
 <div id="ajax-response"></div>
 <?php echo $form ?>
 <input type="hidden" name="action" value="<?php echo $action ?>" />
-<input type="hidden" name="cat_ID" value="<?php echo $category->cat_ID ?>" />
+<input type="hidden" name="cat_ID" value="<?php echo $category->term_id ?>" />
 <?php wp_nonce_field($nonce_action); ?>
-	<table class="editform" width="100%" cellspacing="2" cellpadding="5">
-		<tr>
-			<th width="33%" scope="row" valign="top"><label for="cat_name"><?php _e('Category name:') ?></label></th>
-			<td width="67%"><input name="cat_name" id="cat_name" type="text" value="<?php echo attribute_escape($category->cat_name); ?>" size="40" /></td>
+	<table class="form-table">
+		<tr class="form-field form-required">
+			<th scope="row" valign="top"><label for="cat_name"><?php _e('Category Name') ?></label></th>
+			<td><input name="cat_name" id="cat_name" type="text" value="<?php echo attribute_escape($category->name); ?>" size="40" /><br />
+            <?php _e('The name is used to identify the category almost everywhere, for example under the post or in the category widget.'); ?></td>
 		</tr>
-		<tr>
-			<th scope="row" valign="top"><label for="category_nicename"><?php _e('Category slug:') ?></label></th>
-			<td><input name="category_nicename" id="category_nicename" type="text" value="<?php echo attribute_escape($category->category_nicename); ?>" size="40" /></td>
+		<tr class="form-field">
+			<th scope="row" valign="top"><label for="category_nicename"><?php _e('Category Slug') ?></label></th>
+			<td><input name="category_nicename" id="category_nicename" type="text" value="<?php echo attribute_escape($category->slug); ?>" size="40" /><br />
+            <?php _e('The &#8220;slug&#8221; is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens.'); ?></td>
 		</tr>
-		<tr>
-			<th scope="row" valign="top"><label for="category_parent"><?php _e('Category parent:') ?></label></th>
-			<td>        
-	  			<?php wp_dropdown_categories('hide_empty=0&name=category_parent&orderby=name&selected=' . $category->category_parent . '&hierarchical=1&show_option_none=' . __('None')); ?>
+		<tr class="form-field">
+			<th scope="row" valign="top"><label for="category_parent"><?php _e('Category Parent') ?></label></th>
+			<td>
+	  			<?php wp_dropdown_categories('hide_empty=0&name=category_parent&orderby=name&selected=' . $category->parent . '&hierarchical=1&show_option_none=' . __('None')); ?><br />
+                <?php _e('Categories, unlike tags, can have a hierarchy. You might have a Jazz category, and under that have children categories for Bebop and Big Band. Totally optional.'); ?>
 	  		</td>
 		</tr>
-		<tr>
-			<th scope="row" valign="top"><label for="category_description"><?php _e('Description: (optional)') ?></label></th>
-			<td><textarea name="category_description" id="category_description" rows="5" cols="50" style="width: 97%;"><?php echo wp_specialchars($category->category_description); ?></textarea></td>
+		<tr class="form-field">
+			<th scope="row" valign="top"><label for="category_description"><?php _e('Description') ?></label></th>
+			<td><textarea name="category_description" id="category_description" rows="5" cols="50" style="width: 97%;"><?php echo wp_specialchars($category->description); ?></textarea><br />
+            <?php _e('The description is not prominent by default, however some themes may show it.'); ?></td>
 		</tr>
 	</table>
-<p class="submit"><input type="submit" name="submit" value="<?php echo $submit_text ?>" /></p>
+<p class="submit"><input type="submit" class="button" name="submit" value="<?php echo $submit_text ?>" /></p>
 <?php do_action('edit_category_form', $category); ?>
 </form>
 </div>
diff -x .svn -aruN 2.2.2.src/wp-admin/edit-comments.js 2.5.src/wp-admin/edit-comments.js
--- 2.2.2.src/wp-admin/edit-comments.js	2007-03-27 18:49:15.000000000 -0500
+++ 2.5.src/wp-admin/edit-comments.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,59 +0,0 @@
-addLoadEvent(function() {
-	theCommentList = new listMan('the-comment-list');
-	if ( !theCommentList )
-		return false;
-
-	theExtraCommentList = new listMan('the-extra-comment-list');
-	if ( theExtraCommentList ) {
-		theExtraCommentList.showLink = 0;
-		theExtraCommentList.altOffset = 1;
-		if ( theExtraCommentList.theList && theExtraCommentList.theList.childNodes )
-			var commentNum = $A(theExtraCommentList.theList.childNodes).findAll( function(i) { return Element.visible(i) } ).length;
-		else
-			var commentNum = 0;
-		var urlQ   = document.location.href.split('?');
-		var params = urlQ[1] ? urlQ[1].toQueryParams() : [];
-		var search = params['s'] ? params['s'] : '';
-		var page   = params['apage'] ? params['apage'] : 1;
-	}
-
-	theCommentList.dimComplete = function(what,id,dimClass) {
-		var m = document.getElementById('awaitmod');
-		if ( document.getElementById(what + '-' + id).className.match(dimClass) )
-			m.innerHTML = parseInt(m.innerHTML,10) + 1;
-		else
-			m.innerHTML = parseInt(m.innerHTML,10) - 1;
-	}
-
-	theCommentList.delComplete = function(what,id) {
-		var m = document.getElementById('awaitmod');
-		what = what.split('-')[0];
-		if ( document.getElementById(what + '-' + id).className.match('unapproved') )
-			m.innerHTML = parseInt(m.innerHTML,10) - 1;
-		if ( theExtraCommentList && commentNum ) {
-			var theMover = theExtraCommentList.theList.childNodes[0];
-			Element.removeClassName(theMover,'alternate');
-			theCommentList.theList.appendChild(theMover);
-			theExtraCommentList.inputData += '&page=' + page;
-			if ( search )
-				theExtraCommentList.inputData += '&s=' + search; // trust the URL not the search box
-			theExtraCommentList.addComplete = function() {
-				if ( theExtraCommentList.theList.childNodes )
-					var commentNum = $A(theExtraCommentList.theList.childNodes).findAll( function(i) { return Element.visible(i) } ).length;
-				else
-					var commentNum = 0;
-			}
-			theExtraCommentList.ajaxAdder( 'comment', 'ajax-response' ); // Dummy Request
-		}
-	}
-
-	if ( theList ) // the post list: edit.php
-		theList.delComplete = function() {
-			var comments = document.getElementById('comments');
-			var commdel = encloseFunc(function(a){a.parentNode.removeChild(a);},comments);
-			var listdel = encloseFunc(function(a){a.parentNode.removeChild(a);},theCommentList.theList);
-			setTimeout(commdel,705);
-			setTimeout(listdel,705);
-		}
-});
-
diff -x .svn -aruN 2.2.2.src/wp-admin/edit-comments.php 2.5.src/wp-admin/edit-comments.php
--- 2.2.2.src/wp-admin/edit-comments.php	2007-08-02 09:58:15.000000000 -0500
+++ 2.5.src/wp-admin/edit-comments.php	2008-03-20 15:28:17.000000000 -0500
@@ -4,76 +4,133 @@
 $title = __('Edit Comments');
 $parent_file = 'edit-comments.php';
 wp_enqueue_script( 'admin-comments' );
+wp_enqueue_script('admin-forms');
+
+if ( !empty( $_REQUEST['delete_comments'] ) ) {
+	check_admin_referer('bulk-comments');
+
+	$comments_deleted = $comments_approved = $comments_unapproved = $comments_spammed = 0;
+	foreach ($_REQUEST['delete_comments'] as $comment) : // Check the permissions on each
+		$comment = (int) $comment;
+		$post_id = (int) $wpdb->get_var("SELECT comment_post_ID FROM $wpdb->comments WHERE comment_ID = $comment");
+		// $authordata = get_userdata( $wpdb->get_var("SELECT post_author FROM $wpdb->posts WHERE ID = $post_id") );
+		if ( !current_user_can('edit_post', $post_id) )
+			continue;
+		if ( !empty( $_REQUEST['spamit'] ) ) {
+			wp_set_comment_status($comment, 'spam');
+			$comments_spammed++;
+		} elseif ( !empty( $_REQUEST['deleteit'] ) ) {
+			wp_set_comment_status($comment, 'delete');
+			$comments_deleted++;
+		} elseif ( !empty( $_REQUEST['approveit'] ) ) {
+			wp_set_comment_status($comment, 'approve');
+			$comments_approved++;
+		} elseif ( !empty( $_REQUEST['unapproveit'] ) ) {
+			wp_set_comment_status($comment, 'hold');
+			$comments_unapproved++;
+		}
+	endforeach;
+	$redirect_to = basename( __FILE__ ) . '?deleted=' . $comments_deleted . '&approved=' . $comments_approved . '&spam=' . $comments_spammed . '&unapproved=' . $comments_unapproved;
+	if ( !empty($_REQUEST['mode']) )
+		$redirect_to = add_query_arg('mode', $_REQUEST['mode'], $redirect_to);
+	if ( !empty($_REQUEST['comment_status']) )
+		$redirect_to = add_query_arg('comment_status', $_REQUEST['comment_status'], $redirect_to);
+	if ( !empty($_REQUEST['s']) )
+		$redirect_to = add_query_arg('s', $_REQUEST['s'], $redirect_to);
+	wp_redirect( $redirect_to );
+} elseif ( !empty($_GET['_wp_http_referer']) ) {
+	 wp_redirect(remove_query_arg(array('_wp_http_referer', '_wpnonce'), stripslashes($_SERVER['REQUEST_URI'])));
+	 exit;
+}
 
 require_once('admin-header.php');
-if (empty($_GET['mode'])) $mode = 'view';
-else $mode = attribute_escape($_GET['mode']);
+
+if ( empty($_GET['mode']) )
+	$mode = 'detail';
+else
+	$mode = attribute_escape($_GET['mode']);
+
+if ( isset($_GET['comment_status']) )
+	$comment_status = attribute_escape($_GET['comment_status']);
+else
+	$comment_status = '';
+
+if ( isset($_GET['s']) )
+	$search_dirty = $_GET['s'];
+else
+	$search_dirty = '';
+$search = attribute_escape( $search_dirty );
 ?>
+<?php
+if ( isset( $_GET['approved'] ) || isset( $_GET['deleted'] ) || isset( $_GET['spam'] ) ) {
+	$approved = isset( $_GET['approved'] ) ? (int) $_GET['approved'] : 0;
+	$deleted = isset( $_GET['deleted'] ) ? (int) $_GET['deleted'] : 0;
+	$spam = isset( $_GET['spam'] ) ? (int) $_GET['spam'] : 0;
+
+	if ( $approved > 0 || $deleted > 0 || $spam > 0 ) {
+		echo '<div id="moderated" class="updated fade"><p>';
+
+		if ( $approved > 0 ) {
+			printf( __ngettext( '%s comment approved', '%s comments approved', $approved ), $approved );
+			echo '<br />';
+		}
 
-<script type="text/javascript">
-<!--
-function checkAll(form)
-{
-	for (i = 0, n = form.elements.length; i < n; i++) {
-		if(form.elements[i].type == "checkbox") {
-			if(form.elements[i].checked == true)
-				form.elements[i].checked = false;
-			else
-				form.elements[i].checked = true;
+		if ( $deleted > 0 ) {
+			printf( __ngettext( '%s comment deleted', '%s comments deleted', $deleted ), $deleted );
+			echo '<br />';
 		}
-	}
-}
 
-function getNumChecked(form)
-{
-	var num = 0;
-	for (i = 0, n = form.elements.length; i < n; i++) {
-		if(form.elements[i].type == "checkbox") {
-			if(form.elements[i].checked == true)
-				num++;
+		if ( $spam > 0 ) {
+			printf( __ngettext( '%s comment marked as spam', '%s comments marked as spam', $spam ), $spam );
+			echo '<br />';
 		}
+
+		echo '</p></div>';
 	}
-	return num;
 }
-//-->
-</script>
+?>
 <div class="wrap">
-<h2><?php _e('Comments'); ?></h2>
-<form name="searchform" action="" method="get" id="editcomments"> 
-  <fieldset> 
-  <legend><?php _e('Show Comments That Contain...') ?></legend> 
-  <input type="text" name="s" value="<?php if (isset($_GET['s'])) echo attribute_escape($_GET['s']); ?>" size="17" /> 
-  <input type="submit" name="submit" value="<?php _e('Search') ?>"  />  
-  <input type="hidden" name="mode" value="<?php echo $mode; ?>" />
-  <?php _e('(Searches within comment text, e-mail, URL, and IP address.)') ?>
-  </fieldset> 
-</form>
-<p><a href="?mode=view"><?php _e('View Mode') ?></a> | <a href="?mode=edit"><?php _e('Mass Edit Mode') ?></a></p>
+<form id="posts-filter" action="" method="get">
+<h2><?php _e('Manage Comments'); ?></h2>
+
+<ul class="subsubsub">
 <?php
-if ( !empty( $_POST['delete_comments'] ) ) :
-	check_admin_referer('bulk-comments');
+$status_links = array();
+$num_comments = wp_count_comments();
+$stati = array('moderated' => sprintf(__ngettext('Awaiting Moderation (%s)', 'Awaiting Moderation (%s)', $num_comments->moderated), "<span class='comment-count'>$num_comments->moderated</span>"), 'approved' => _c('Approved|plural'));
+$class = ( '' === $comment_status ) ? ' class="current"' : '';
+$status_links[] = "<li><a href=\"edit-comments.php\"$class>".__('Show All Comments')."</a>";
+foreach ( $stati as $status => $label ) {
+	$class = '';
 
-	$i = 0;
-	foreach ($_POST['delete_comments'] as $comment) : // Check the permissions on each
-		$comment = (int) $comment;
-		$post_id = (int) $wpdb->get_var("SELECT comment_post_ID FROM $wpdb->comments WHERE comment_ID = $comment");
-		// $authordata = get_userdata( $wpdb->get_var("SELECT post_author FROM $wpdb->posts WHERE ID = $post_id") );
-		if ( current_user_can('edit_post', $post_id) ) {
-			if ( !empty( $_POST['spam_button'] ) )
-				wp_set_comment_status($comment, 'spam');
-			else
-				wp_set_comment_status($comment, 'delete');
-			++$i;
-		}
-	endforeach;
-	echo '<div style="background-color: rgb(207, 235, 247);" id="message" class="updated fade"><p>';
-	if ( !empty( $_POST['spam_button'] ) ) {
-		printf(__ngettext('%s comment marked as spam', '%s comments marked as spam.', $i), $i);
-	} else {
-		printf(__ngettext('%s comment deleted.', '%s comments deleted.', $i), $i);
-	}
-	echo '</p></div>';
-endif;
+	if ( $status == $comment_status )
+		$class = ' class="current"';
+
+	$status_links[] = "<li><a href=\"edit-comments.php?comment_status=$status\"$class>" . $label . '</a>';
+}
+
+$status_links = apply_filters( 'comment_status_links', $status_links );
+
+echo implode(' | </li>', $status_links) . '</li>';
+unset($status_links);
+?>
+</ul>
+
+<p id="post-search">
+	<input type="text" id="post-search-input" name="s" value="<?php echo $search; ?>" />
+	<input type="submit" value="<?php _e( 'Search Comments' ); ?>" class="button" />
+</p>
+
+<input type="hidden" name="mode" value="<?php echo $mode; ?>" />
+<input type="hidden" name="comment_status" value="<?php echo $comment_status; ?>" />
+</form>
+
+<ul class="view-switch">
+	<li <?php if ( 'detail' == $mode ) echo "class='current'" ?>><a href="<?php echo clean_url(add_query_arg('mode', 'detail', $_SERVER['REQUEST_URI'])) ?>"><?php _e('Detail View') ?></a></li>
+	<li <?php if ( 'list' == $mode ) echo "class='current'" ?>><a href="<?php echo clean_url(add_query_arg('mode', 'list', $_SERVER['REQUEST_URI'])) ?>"><?php _e('List View') ?></a></li>
+</ul>
+
+<?php
 
 if ( isset( $_GET['apage'] ) )
 	$page = abs( (int) $_GET['apage'] );
@@ -82,120 +139,106 @@
 
 $start = $offset = ( $page - 1 ) * 20;
 
-list($_comments, $total) = _wp_get_comment_list( isset($_GET['s']) ? $_GET['s'] : false, $start, 25 ); // Grab a few extra
+list($_comments, $total) = _wp_get_comment_list( $comment_status, $search_dirty, $start, 25 ); // Grab a few extra
 
 $comments = array_slice($_comments, 0, 20);
 $extra_comments = array_slice($_comments, 20);
 
 $page_links = paginate_links( array(
-	'base' => add_query_arg( 'apage', '%#%' ), 
+	'base' => add_query_arg( 'apage', '%#%' ),
 	'format' => '',
 	'total' => ceil($total / 20),
 	'current' => $page
 ));
 
-if ( $page_links )
-	echo "<p class='pagenav'>$page_links</p>";
+?>
 
-if ('view' == $mode) {
-	if ($comments) {
-		$offset = $offset + 1;
-		$start = " start='$offset'";
-
-		echo "<ol id='the-comment-list' class='commentlist' $start>\n";
-		$i = 0;
-		foreach ( $comments as $comment ) {
-			get_comment( $comment ); // Cache it
-			_wp_comment_list_item( $comment->comment_ID, ++$i );
-		}
-		echo "</ol>\n\n";
+<form id="comments-form" action="" method="post">
 
-if ( $extra_comments ) : ?>
-<div id="extra-comments" style="display:none">
-<ul id="the-extra-comment-list" class="commentlist">
-<?php
-	foreach ( $extra_comments as $comment ) {
-		get_comment( $comment ); // Cache it
-		_wp_comment_list_item( $comment->comment_ID, ++$i );
-	}
+<div class="tablenav">
+
+<?php
+if ( $page_links )
+	echo "<div class='tablenav-pages'>$page_links</div>";
 ?>
-</ul>
+
+<div class="alignleft">
+<?php if ( 'approved' != $comment_status ): ?>
+<input type="submit" value="<?php _e('Approve'); ?>" name="approveit" class="button-secondary" />
+<?php endif; ?>
+<input type="submit" value="<?php _e('Mark as Spam'); ?>" name="spamit" class="button-secondary" />
+<?php if ( 'moderated' != $comment_status ): ?>
+<input type="submit" value="<?php _e('Unapprove'); ?>" name="unapproveit" class="button-secondary" />
+<?php endif; ?>
+<input type="submit" value="<?php _e('Delete'); ?>" name="deleteit" class="button-secondary delete" />
+<?php do_action('manage_comments_nav', $comment_status); ?>
+<?php wp_nonce_field('bulk-comments'); ?>
 </div>
-<?php endif; // $extra_comments ?>
 
-<div id="ajax-response"></div>
+<br class="clear" />
 
-<?php
-	} else { //no comments to show
+</div>
 
-		?>
-		<p>
-			<strong><?php _e('No comments found.') ?></strong></p>
-
-		<?php
-	} // end if ($comments)
-} elseif ('edit' == $mode) {
-
-	if ($comments) {
-		echo '<form name="deletecomments" id="deletecomments" action="" method="post"> ';
-		wp_nonce_field('bulk-comments');
-		echo '<table class="widefat">
+<br class="clear" />
+<?php
+if ($comments) {
+?>
+<table class="widefat">
 <thead>
   <tr>
-    <th scope="col" style="text-align: center"><input type="checkbox" onclick="checkAll(document.getElementById(\'deletecomments\'));" /></th>
-    <th scope="col">' .  __('Name') . '</th>
-    <th scope="col">' .  __('E-mail') . '</th>
-    <th scope="col">' . __('IP') . '</th>
-    <th scope="col">' . __('Comment Excerpt') . '</th>
-	<th scope="col" colspan="3" style="text-align: center">' .  __('Actions') . '</th>
+    <th scope="col" class="check-column"><input type="checkbox" onclick="checkAll(document.getElementById('comments-form'));" /></th>
+    <th scope="col"><?php _e('Comment') ?></th>
+    <th scope="col"><?php _e('Date') ?></th>
+    <th scope="col" class="action-links"><?php _e('Actions') ?></th>
   </tr>
-</thead>';
-		foreach ($comments as $comment) {
-		$authordata = get_userdata($wpdb->get_var("SELECT post_author FROM $wpdb->posts WHERE ID = $comment->comment_post_ID"));
-		$comment_status = wp_get_comment_status($comment->comment_ID);
-		$class = ('alternate' == $class) ? '' : 'alternate';
-		$class .= ('unapproved' == $comment_status) ? ' unapproved' : '';
-?>
-  <tr id="comment-<?php echo $comment->comment_ID; ?>" class='<?php echo $class; ?>'>
-    <td><?php if ( current_user_can('edit_post', $comment->comment_post_ID) ) { ?><input type="checkbox" name="delete_comments[]" value="<?php echo $comment->comment_ID; ?>" /><?php } ?></td>
-    <td><?php comment_author_link() ?></td>
-    <td><?php comment_author_email_link() ?></td>
-    <td><a href="http://ws.arin.net/cgi-bin/whois.pl?queryinput=<?php comment_author_IP() ?>"><?php comment_author_IP() ?></a></td>
-    <td><?php comment_excerpt(); ?></td>
-    <td>
-    	<?php if ('unapproved' == $comment_status) { ?>
-    		(Unapproved)
-    	<?php } else { ?>
-    		<a href="<?php echo get_permalink($comment->comment_post_ID); ?>#comment-<?php comment_ID() ?>" class="edit"><?php _e('View') ?></a>
-    	<?php } ?>
-    </td>
-    <td><?php if ( current_user_can('edit_post', $comment->comment_post_ID) ) {
-	echo "<a href='comment.php?action=editcomment&amp;c=$comment->comment_ID' class='edit'>" .  __('Edit') . "</a>"; } ?></td>
-    <td><?php if ( current_user_can('edit_post', $comment->comment_post_ID) ) {
-		echo "<a href=\"comment.php?action=deletecomment&amp;p=".$comment->comment_post_ID."&amp;c=".$comment->comment_ID."\" onclick=\"return deleteSomething( 'comment', $comment->comment_ID, '" . js_escape(sprintf(__("You are about to delete this comment by '%s'. \n  'Cancel' to stop, 'OK' to delete."), $comment->comment_author ))  . "', theCommentList );\" class='delete'>" . __('Delete') . "</a> ";
-		} ?></td>
-  </tr>
-		<?php 
-		} // end foreach
-	?></table>
-<p class="submit"><input type="submit" name="delete_button" class="delete" value="<?php _e('Delete Checked Comments &raquo;') ?>" onclick="var numchecked = getNumChecked(document.getElementById('deletecomments')); if(numchecked < 1) { alert('<?php echo js_escape(__("Please select some comments to delete")); ?>'); return false } return confirm('<?php echo sprintf(js_escape(__("You are about to delete %s comments permanently \n  'Cancel' to stop, 'OK' to delete.")), "' + numchecked + '"); ?>')" />
-			<input type="submit" name="spam_button" value="<?php _e('Mark Checked Comments as Spam &raquo;') ?>" onclick="var numchecked = getNumChecked(document.getElementById('deletecomments')); if(numchecked < 1) { alert('<?php echo js_escape(__("Please select some comments to mark as spam")); ?>'); return false } return confirm('<?php echo sprintf(js_escape(__("You are about to mark %s comments as spam \n  'Cancel' to stop, 'OK' to mark as spam.")), "' + numchecked + '"); ?>')" /></p>
-  </form>
+</thead>
+<tbody id="the-comment-list" class="list:comment">
+<?php
+	foreach ($comments as $comment)
+		_wp_comment_row( $comment->comment_ID, $mode, $comment_status );
+?>
+</tbody>
+<tbody id="the-extra-comment-list" class="list:comment" style="display: none;">
+<?php
+	foreach ($extra_comments as $comment)
+		_wp_comment_row( $comment->comment_ID, $mode, $comment_status );
+?>
+</tbody>
+</table>
+
+</form>
+
+<form id="get-extra-comments" method="post" action="" class="add:the-extra-comment-list:" style="display: none;">
+	<input type="hidden" name="s" value="<?php echo $search; ?>" />
+	<input type="hidden" name="mode" value="<?php echo $mode; ?>" />
+	<input type="hidden" name="comment_status" value="<?php echo $comment_status; ?>" />
+	<input type="hidden" name="page" value="<?php echo isset($_REQUEST['page']) ? absint( $_REQUEST['page'] ) : 1; ?>" />
+	<?php wp_nonce_field( 'add-comment', '_ajax_nonce', false ); ?>
+</form>
+
 <div id="ajax-response"></div>
 <?php
-	} else {
+} elseif ( 'moderated' == $_GET['comment_status'] ) {
 ?>
 <p>
-<strong><?php _e('No results found.') ?></strong>
+<?php _e('No comments awaiting moderation&hellip; yet.') ?>
+</p>
+<?php
+} else  {
+?>
+<p>
+<?php _e('No results found.') ?>
 </p>
 <?php
-	} // end if ($comments)
 }
-
+?>
+<div class="tablenav">
+<?php
 if ( $page_links )
-	echo "<p class='pagenav'>$page_links</p>";
-
+	echo "<div class='tablenav-pages'>$page_links</div>";
 ?>
+<br class="clear" />
+</div>
 
 </div>
 
diff -x .svn -aruN 2.2.2.src/wp-admin/edit-form-advanced.php 2.5.src/wp-admin/edit-form-advanced.php
--- 2.2.2.src/wp-admin/edit-form-advanced.php	2007-05-28 23:37:35.000000000 -0500
+++ 2.5.src/wp-admin/edit-form-advanced.php	2008-03-26 22:02:54.000000000 -0500
@@ -1,12 +1,14 @@
 <?php
+$action = isset($action)? $action : '';
 if ( isset($_GET['message']) )
-	  $_GET['message'] = (int) $_GET['message'];
-$messages[1] = __('Post updated');
-$messages[2] = __('Custom field updated');
+	$_GET['message'] = absint( $_GET['message'] );
+$messages[1] = sprintf( __( 'Post updated. Continue editing below or <a href="%s">go back</a>.' ), attribute_escape( stripslashes( $_GET['_wp_original_http_referer'] ) ) );
+$messages[2] = __('Custom field updated.');
 $messages[3] = __('Custom field deleted.');
+$messages[4] = __('Post updated.');
 ?>
 <?php if (isset($_GET['message'])) : ?>
-<div id="message" class="updated fade"><p><?php echo wp_specialchars($messages[$_GET['message']]); ?></p></div>
+<div id="message" class="updated fade"><p><?php echo $messages[$_GET['message']]; ?></p></div>
 <?php endif; ?>
 
 <form name="post" action="post.php" method="post" id="post">
@@ -15,9 +17,10 @@
 <?php endif; ?>
 
 <div class="wrap">
+<h2><?php _e('Write Post') ?></h2>
 <?php
 
-if (0 == $post_ID) {
+if (!isset($post_ID) || 0 == $post_ID) {
 	$form_action = 'post';
 	$temp_ID = -1 * time(); // don't change this formula without looking at wp_write_post()
 	$form_extra = "<input type='hidden' id='post_ID' name='temp_ID' value='$temp_ID' />";
@@ -44,195 +47,236 @@
 	$pings .= '</ul>';
 }
 
-$saveasdraft = '<input name="save" type="submit" id="save" tabindex="3" value="' . attribute_escape( __('Save and Continue Editing') ) . '" />';
-
-if (empty($post->post_status)) $post->post_status = 'draft';
+$saveasdraft = '<input name="save" type="submit" id="save" class="button" tabindex="3" value="' . attribute_escape( __('Save and Continue Editing') ) . '" />';
 
 ?>
 
-<input type="hidden" name="user_ID" value="<?php echo (int) $user_ID ?>" />
+<input type="hidden" id="user-id" name="user_ID" value="<?php echo (int) $user_ID ?>" />
 <input type="hidden" id="hiddenaction" name="action" value="<?php echo $form_action ?>" />
 <input type="hidden" id="originalaction" name="originalaction" value="<?php echo $form_action ?>" />
 <input type="hidden" name="post_author" value="<?php echo attribute_escape( $post->post_author ); ?>" />
-<input type="hidden" id="post_type" name="post_type" value="post" />
+<input type="hidden" id="post_type" name="post_type" value="<?php echo $post->post_type ?>" />
+<input type="hidden" id="original_post_status" name="original_post_status" value="<?php echo $post->post_status ?>" />
+<input name="referredby" type="hidden" id="referredby" value="<?php
+if ( !empty($_REQUEST['popupurl']) )
+	echo clean_url(stripslashes($_REQUEST['popupurl']));
+else if ( url_to_postid(wp_get_referer()) == $post_ID && strpos( wp_get_referer(), '/wp-admin/' ) === false )
+	echo 'redo';
+else
+	echo clean_url(stripslashes(wp_get_referer()));
+?>" />
+<?php if ( 'draft' != $post->post_status ) wp_original_referer_field(true, 'previous'); ?>
 
 <?php echo $form_extra ?>
-<?php if (isset($_GET['message']) && 2 > $_GET['message']) : ?>
-<script type="text/javascript">
-function focusit() {
-	// focus on first input field
-	document.post.title.focus();
-}
-addLoadEvent(focusit);
-</script>
-<?php endif; ?>
+
 <div id="poststuff">
 
-<div id="moremeta">
-<div id="grabit" class="dbx-group">
+<div class="submitbox" id="submitpost">
 
-<fieldset id="categorydiv" class="dbx-box">
-<h3 class="dbx-handle"><?php _e('Categories') ?></h3>
-<div class="dbx-content">
-<p id="jaxcat"></p>
-<ul id="categorychecklist"><?php dropdown_categories(); ?></ul></div>
-</fieldset>
-
-<fieldset id="commentstatusdiv" class="dbx-box">
-<h3 class="dbx-handle"><?php _e('Discussion') ?></h3>
-<div class="dbx-content">
-<input name="advanced_view" type="hidden" value="1" />
-<label for="comment_status" class="selectit">
-<input name="comment_status" type="checkbox" id="comment_status" value="open" <?php checked($post->comment_status, 'open'); ?> />
-<?php _e('Allow Comments') ?></label> 
-<label for="ping_status" class="selectit"><input name="ping_status" type="checkbox" id="ping_status" value="open" <?php checked($post->ping_status, 'open'); ?> /> <?php _e('Allow Pings') ?></label>
+<div id="previewview">
+<?php if ( 'publish' == $post->post_status ) { ?>
+<a href="<?php echo clean_url(get_permalink($post->ID)); ?>" target="_blank" tabindex="4"><?php _e('View this Post'); ?></a>
+<?php } elseif ( 'edit' == $action ) { ?>
+<a href="<?php echo clean_url(apply_filters('preview_post_link', add_query_arg('preview', 'true', get_permalink($post->ID)))); ?>" target="_blank"  tabindex="4"><?php _e('Preview this Post'); ?></a>
+<?php } ?>
 </div>
-</fieldset>
 
-<fieldset id="passworddiv" class="dbx-box">
-<h3 class="dbx-handle"><?php _e('Post Password') ?></h3> 
-<div class="dbx-content"><input name="post_password" type="text" size="13" id="post_password" value="<?php echo attribute_escape( $post->post_password ); ?>" /></div>
-</fieldset>
-
-<fieldset id="slugdiv" class="dbx-box">
-<h3 class="dbx-handle"><?php _e('Post Slug') ?></h3> 
-<div class="dbx-content"><input name="post_name" type="text" size="13" id="post_name" value="<?php echo attribute_escape( $post->post_name ); ?>" /></div>
-</fieldset>
-
-<fieldset id="poststatusdiv" class="dbx-box">
-<h3 class="dbx-handle"><?php _e('Post Status') ?></h3> 
-<div class="dbx-content"><?php if ( current_user_can('publish_posts') ) : ?>
-<label for="post_status_publish" class="selectit"><input id="post_status_publish" name="post_status" type="radio" value="publish" <?php checked($post->post_status, 'publish'); checked($post->post_status, 'future'); ?> /> <?php _e('Published') ?></label>
-<?php endif; ?>
-	  <label for="post_status_draft" class="selectit"><input id="post_status_draft" name="post_status" type="radio" value="draft" <?php checked($post->post_status, 'draft'); ?> /> <?php _e('Draft') ?></label>
-	  <label for="post_status_private" class="selectit"><input id="post_status_private" name="post_status" type="radio" value="private" <?php checked($post->post_status, 'private'); ?> /> <?php _e('Private') ?></label></div>
-</fieldset>
-
-<?php if ( current_user_can('edit_posts') ) : ?>
-<fieldset id="posttimestampdiv" class="dbx-box">
-<h3 class="dbx-handle"><?php _e('Post Timestamp'); ?></h3>
-<div class="dbx-content"><?php touch_time(($action == 'edit')); ?></div>
-</fieldset>
+<div class="inside">
+
+<p><strong><?php _e('Publish Status') ?></strong></p>
+<p>
+<select name='post_status' tabindex='4'>
+<?php if ( current_user_can('publish_posts') ) : // Contributors only get "Unpublished" and "Pending Review" ?>
+<option<?php selected( $post->post_status, 'publish' ); selected( $post->post_status, 'private' );?> value='publish'><?php _e('Published') ?></option>
+<?php if ( 'future' == $post->post_status ) : ?>
+<option<?php selected( $post->post_status, 'future' ); ?> value='future'><?php _e('Scheduled') ?></option>
 <?php endif; ?>
+<?php endif; ?>
+<option<?php selected( $post->post_status, 'pending' ); ?> value='pending'><?php _e('Pending Review') ?></option>
+<option<?php selected( $post->post_status, 'draft' ); ?> value='draft'><?php _e('Unpublished') ?></option>
+</select>
+</p>
 
-<?php 
-$authors = get_editable_authors( $current_user->id ); // TODO: ROLE SYSTEM
-if ( $authors && count( $authors ) > 1 ) :
-?>
-<fieldset id="authordiv" class="dbx-box">
-<h3 class="dbx-handle"><?php _e('Post Author'); ?></h3>
-<div class="dbx-content">
-<select name="post_author_override" id="post_author_override">
+<?php if ( current_user_can( 'publish_posts' ) ) : ?>
+<p><label for="post_status_private" class="selectit"><input id="post_status_private" name="post_status" type="checkbox" value="private" <?php checked($post->post_status, 'private'); ?> tabindex="4" /> <?php _e('Keep this post private') ?></label></p>
+<?php endif; ?>
 <?php
-foreach ($authors as $o) :
-$o = get_userdata( $o->ID );
-if ( $post->post_author == $o->ID || ( empty($post_ID) && $user_ID == $o->ID ) ) $selected = 'selected="selected"';
-else $selected = '';
-echo "<option value='" . (int) $o->ID . "' $selected>" . wp_specialchars( $o->display_name ) . "</option>";
-endforeach;
+if ($post_ID) {
+	if ( 'future' == $post->post_status ) { // scheduled for publishing at a future date
+		$stamp = __('Scheduled for:<br />%1$s at %2$s');
+	} else if ( 'publish' == $post->post_status ) { // already published
+		$stamp = __('Published on:<br />%1$s at %2$s');
+	} else if ( '0000-00-00 00:00:00' == $post->post_date ) { // draft, 1 or more saves, no date specified
+		$stamp = __('Publish immediately');
+	} else { // draft, 1 or more saves, date specified
+		$stamp = __('Publish on:<br />%1$s at %2$s');
+	}
+	$date = mysql2date(get_option('date_format'), $post->post_date);
+	$time = mysql2date(get_option('time_format'), $post->post_date);
+} else { // draft (no saves, and thus no date specified)
+	$stamp = __('Publish immediately');
+	$date = mysql2date(get_option('date_format'), current_time('mysql'));
+	$time = mysql2date(get_option('time_format'), current_time('mysql'));
+}
 ?>
-</select>
-</div>
-</fieldset>
-<?php endif; ?>
+<?php if ( current_user_can( 'publish_posts' ) ) : // Contributors don't get to choose the date of publish ?>
+<p class="curtime"><?php printf($stamp, $date, $time); ?>
+&nbsp;<a href="#edit_timestamp" class="edit-timestamp hide-if-no-js" tabindex='4'><?php _e('Edit') ?></a></p>
 
-<?php do_action('dbx_post_sidebar'); ?>
+<div id='timestampdiv' class='hide-if-js'><?php touch_time(($action == 'edit'),1,4); ?></div>
+<?php endif; ?>
 
 </div>
-</div>
 
-<fieldset id="titlediv">
-	<legend><?php _e('Title') ?></legend>
-	<div><input type="text" name="post_title" size="30" tabindex="1" value="<?php echo attribute_escape($post->post_title); ?>" id="title" /></div>
-</fieldset>
+<p class="submit">
+<input type="submit" name="save" id="save-post" value="<?php _e('Save'); ?>" tabindex="4" class="button button-highlighted" />
+<?php
+if ( !in_array( $post->post_status, array('publish', 'future') ) || 0 == $post_ID ) {
+?>
+<?php if ( current_user_can('publish_posts') ) : ?>
+	<input name="publish" type="submit" class="button" id="publish" tabindex="5" accesskey="p" value="<?php _e('Publish') ?>" />
+<?php else : ?>
+	<input name="publish" type="submit" class="button" id="publish" tabindex="5" accesskey="p" value="<?php _e('Submit for Review') ?>" />
+<?php endif; ?>
+<?php
+}
 
-<fieldset id="<?php echo user_can_richedit() ? 'postdivrich' : 'postdiv'; ?>">
-<legend><?php _e('Post') ?>
+if ( ( 'edit' == $action) && current_user_can('delete_post', $post_ID) )
+	echo "<a class='submitdelete' href='" . wp_nonce_url("post.php?action=delete&amp;post=$post_ID", 'delete-post_' . $post_ID) . "' onclick=\"if ( confirm('" . js_escape(sprintf( ('draft' == $post->post_status) ? __("You are about to delete this draft '%s'\n  'Cancel' to stop, 'OK' to delete.") : __("You are about to delete this post '%s'\n  'Cancel' to stop, 'OK' to delete."), $post->post_title )) . "') ) { return true;}return false;\">" . __('Delete&nbsp;post') . "</a>";
+?>
+<br class="clear" />
+<?php if ($post_ID): ?>
+<?php if ( $last_id = get_post_meta($post_ID, '_edit_last', true) ) {
+	$last_user = get_userdata($last_id);
+	printf(__('Last edited by %1$s on %2$s at %3$s'), wp_specialchars( $last_user->display_name ), mysql2date(get_option('date_format'), $post->post_modified), mysql2date(get_option('time_format'), $post->post_modified));
+} else {
+	printf(__('Last edited on %1$s at %2$s'), mysql2date(get_option('date_format'), $post->post_modified), mysql2date(get_option('time_format'), $post->post_modified));
+}
+?>
+<br class="clear" />
+<?php endif; ?>
+<span id="autosave"></span>
+</p>
 
-<?php if ( 'publish' == $post->post_status ) { ?>
-<a href="<?php echo clean_url(get_permalink($post->ID)); ?>" class="view-link" target="_blank"><?php _e('View &raquo;'); ?></a>
-<?php } elseif ( 'edit' == $action ) { ?>
-<a href="<?php echo clean_url(apply_filters('preview_post_link', add_query_arg('preview', 'true', get_permalink($post->ID)))); ?>" class="view-link" target="_blank"><?php _e('Preview &raquo;'); ?></a>
-<?php } ?>
-</legend>
+<div class="side-info">
+<h5><?php _e('Related') ?></h5>
+
+<ul>
+<?php if ($post_ID): ?>
+<li><a href="edit.php?p=<?php echo $post_ID ?>"><?php _e('See Comments on this Post') ?></a></li>
+<?php endif; ?>
+<li><a href="edit-comments.php"><?php _e('Manage All Comments') ?></a></li>
+<li><a href="edit.php"><?php _e('Manage All Posts') ?></a></li>
+<li><a href="categories.php"><?php _e('Manage All Categories') ?></a></li>
+<li><a href="edit-tags.php"><?php _e('Manage All Tags') ?></a></li>
+<li><a href="edit.php?post_status=draft"><?php _e('View Drafts'); ?></a></li>
+<?php do_action('post_relatedlinks_list'); ?>
+</ul>
+</div>
+
+<?php do_action('submitpost_box'); ?>
+</div>
+
+<div id="post-body">
+<div id="titlediv">
+<h3><?php _e('Title') ?></h3>
+<div id="titlewrap">
+	<input type="text" name="post_title" size="30" tabindex="1" value="<?php echo attribute_escape($post->post_title); ?>" id="title" autocomplete="off" />
+</div>
+<div class="inside">
+<?php $sample_permalink_html = get_sample_permalink_html($post->ID); ?>
+	<div id="edit-slug-box">
+<?php if ( ! empty($post->ID) && ! empty($sample_permalink_html) ) :
+	echo $sample_permalink_html;
+endif; ?>
+	</div>
+</div>
+</div>
 
-	<?php the_editor($post->post_content); ?>
-</fieldset>
+<div id="<?php echo user_can_richedit() ? 'postdivrich' : 'postdiv'; ?>" class="postarea">
+<h3><?php _e('Post') ?></h3>
+<?php the_editor($post->post_content); ?>
+<?php wp_nonce_field( 'autosave', 'autosavenonce', false ); ?>
+<?php wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false ); ?>
+<?php wp_nonce_field( 'getpermalink', 'getpermalinknonce', false ); ?>
+<?php wp_nonce_field( 'samplepermalink', 'samplepermalinknonce', false ); ?>
+</div>
 
 <?php echo $form_pingback ?>
 <?php echo $form_prevstatus ?>
 
+<div id="tagsdiv" class="postbox <?php echo postbox_classes('tagsdiv', 'post'); ?>">
+<h3><?php _e('Tags'); ?></h3>
+<div class="inside">
+<p id="jaxtag"><input type="text" name="tags_input" class="tags-input" id="tags-input" size="40" tabindex="3" value="<?php echo get_tags_to_edit( $post_ID ); ?>" /></p>
+<div id="tagchecklist"></div>
+</div>
+</div>
 
-<p class="submit">
-<span id="autosave"></span>
-<?php echo $saveasdraft; ?>
-<input type="submit" name="submit" value="<?php _e('Save') ?>" style="font-weight: bold;" tabindex="4" /> 
-<?php 
-if ('publish' != $post->post_status || 0 == $post_ID) {
-?>
-<?php if ( current_user_can('publish_posts') ) : ?>
-	<input name="publish" type="submit" id="publish" tabindex="5" accesskey="p" value="<?php _e('Publish'); ?>" /> 
-<?php endif; ?>
-<?php
-}
-?>
-<input name="referredby" type="hidden" id="referredby" value="<?php 
-if ( !empty($_REQUEST['popupurl']) )
-	echo clean_url(stripslashes($_REQUEST['popupurl']));
-else if ( url_to_postid(wp_get_referer()) == $post_ID )
-	echo 'redo';
-else
-	echo clean_url(stripslashes(wp_get_referer()));
-?>" /></p>
+<div id="categorydiv" class="postbox <?php echo postbox_classes('categorydiv', 'post'); ?>">
+<h3><?php _e('Categories') ?></h3>
+<div class="inside">
 
-<?php do_action('edit_form_advanced'); ?>
+<div id="category-adder" class="wp-hidden-children">
+	<h4><a id="category-add-toggle" href="#category-add" class="hide-if-no-js" tabindex="3"><?php _e( '+ Add New Category' ); ?></a></h4>
+	<p id="category-add" class="wp-hidden-child">
+		<input type="text" name="newcat" id="newcat" class="form-required form-input-tip" value="<?php _e( 'New category name' ); ?>" tabindex="3" />
+		<?php wp_dropdown_categories( array( 'hide_empty' => 0, 'name' => 'newcat_parent', 'orderby' => 'name', 'hierarchical' => 1, 'show_option_none' => __('Parent category'), 'tab_index' => 3 ) ); ?>
+		<input type="button" id="category-add-sumbit" class="add:categorychecklist:categorydiv button" value="<?php _e( 'Add' ); ?>" tabindex="3" />
+		<?php wp_nonce_field( 'add-category', '_ajax_nonce', false ); ?>
+		<span id="category-ajax-response"></span>
+	</p>
+</div>
 
-<?php
-if (current_user_can('upload_files')) {
-	$uploading_iframe_ID = (int) (0 == $post_ID ? $temp_ID : $post_ID);
-	$uploading_iframe_src = wp_nonce_url("upload.php?style=inline&amp;tab=upload&amp;post_id=$uploading_iframe_ID", 'inlineuploading');
-	$uploading_iframe_src = apply_filters('uploading_iframe_src', $uploading_iframe_src);
-	if ( false != $uploading_iframe_src )
-		echo '<iframe id="uploading" frameborder="0" src="' . $uploading_iframe_src . '">' . __('This feature requires iframe support.') . '</iframe>';
-}
-?>
+<ul id="category-tabs">
+	<li class="ui-tabs-selected"><a href="#categories-all" tabindex="3"><?php _e( 'All Categories' ); ?></a></li>
+	<li class="wp-no-js-hidden"><a href="#categories-pop" tabindex="3"><?php _e( 'Most Used' ); ?></a></li>
+</ul>
 
-<div id="advancedstuff" class="dbx-group" >
+<div id="categories-all" class="ui-tabs-panel">
+	<ul id="categorychecklist" class="list:category categorychecklist form-no-clear">
+		<?php dropdown_categories(); ?>
+	</ul>
+</div>
 
-<div class="dbx-b-ox-wrapper">
-<fieldset id="postexcerpt" class="dbx-box">
-<div class="dbx-h-andle-wrapper">
-<h3 class="dbx-handle"><?php _e('Optional Excerpt') ?></h3>
+<div id="categories-pop" class="ui-tabs-panel" style="display: none;">
+	<ul id="categorychecklist-pop" class="categorychecklist form-no-clear" >
+		<?php wp_popular_terms_checklist('category'); ?>
+	</ul>
 </div>
-<div class="dbx-c-ontent-wrapper">
-<div class="dbx-content"><textarea rows="1" cols="40" name="excerpt" tabindex="6" id="excerpt"><?php echo $post->post_excerpt ?></textarea></div>
+
 </div>
-</fieldset>
 </div>
 
-<div class="dbx-b-ox-wrapper">
-<fieldset id="trackbacksdiv" class="dbx-box">
-<div class="dbx-h-andle-wrapper">
-<h3 class="dbx-handle"><?php _e('Trackbacks') ?></h3>
+<?php do_meta_boxes('post', 'normal', $post); ?>
+
+<?php do_action('edit_form_advanced'); ?>
+
+<h2><?php _e('Advanced Options'); ?></h2>
+
+<div id="postexcerpt" class="postbox <?php echo postbox_classes('postexcerpt', 'post'); ?>">
+<h3><?php _e('Excerpt') ?></h3>
+<div class="inside"><textarea rows="1" cols="40" name="excerpt" tabindex="6" id="excerpt"><?php echo $post->post_excerpt ?></textarea>
+<p><?php _e('Excerpts are optional hand-crafted summaries of your content. You can <a href="http://codex.wordpress.org/Template_Tags/the_excerpt" target="_blank">use them in your template</a>'); ?></p>
 </div>
-<div class="dbx-c-ontent-wrapper">
-<div class="dbx-content"><?php _e('Send trackbacks to:'); ?> <?php echo $form_trackback; ?> (<?php _e('Separate multiple URLs with spaces'); ?>)
+</div>
+
+<div id="trackbacksdiv" class="postbox <?php echo postbox_classes('trackbacksdiv', 'post'); ?>">
+<h3><?php _e('Trackbacks') ?></h3>
+<div class="inside">
+<p><?php _e('Send trackbacks to:'); ?> <?php echo $form_trackback; ?><br /> (<?php _e('Separate multiple URLs with spaces'); ?>)</p>
+<p><?php _e('Trackbacks are a way to notify legacy blog systems that you&#8217;ve linked to them. If you link other WordPress blogs they&#8217;ll be notified automatically using <a href="http://codex.wordpress.org/Introduction_to_Blogging#Managing_Comments" target="_blank">pingbacks</a>, no other action necessary.'); ?></p>
 <?php
 if ( ! empty($pings) )
 	echo $pings;
 ?>
 </div>
 </div>
-</fieldset>
-</div>
 
-<div class="dbx-b-ox-wrapper">
-<fieldset id="postcustom" class="dbx-box">
-<div class="dbx-h-andle-wrapper">
-<h3 class="dbx-handle"><?php _e('Custom Fields') ?></h3>
-</div>
-<div class="dbx-c-ontent-wrapper">
-<div id="postcustomstuff" class="dbx-content">
+<div id="postcustom" class="postbox <?php echo postbox_classes('postcustom', 'post'); ?>">
+<h3><?php _e('Custom Fields') ?></h3>
+<div class="inside">
+<div id="postcustomstuff">
 <table cellpadding="3">
 <?php
 $metadata = has_meta($post_ID);
@@ -245,20 +289,65 @@
 ?>
 <div id="ajax-response"></div>
 </div>
+<p><?php _e('Custom fields can be used to add extra metadata to a post that you can <a href="http://codex.wordpress.org/Using_Custom_Fields" target="_blank">use in your theme</a>.'); ?></p>
 </div>
-</fieldset>
 </div>
 
 <?php do_action('dbx_post_advanced'); ?>
 
+<div id="commentstatusdiv" class="postbox <?php echo postbox_classes('commentstatusdiv', 'post'); ?>">
+<h3><?php _e('Comments &amp; Pings') ?></h3>
+<div class="inside">
+<input name="advanced_view" type="hidden" value="1" />
+<p><label for="comment_status" class="selectit">
+<input name="comment_status" type="checkbox" id="comment_status" value="open" <?php checked($post->comment_status, 'open'); ?> />
+<?php _e('Allow Comments') ?></label></p>
+<p><label for="ping_status" class="selectit"><input name="ping_status" type="checkbox" id="ping_status" value="open" <?php checked($post->ping_status, 'open'); ?> /> <?php _e('Allow Pings') ?></label></p>
+<p><?php _e('These settings apply to this post only. &#8220;Pings&#8221; are <a href="http://codex.wordpress.org/Introduction_to_Blogging#Managing_Comments" target="_blank">trackbacks and pingbacks</a>.'); ?></p>
+</div>
+</div>
+
+<div id="passworddiv" class="postbox <?php echo postbox_classes('passworddiv', 'post'); ?>">
+<h3><?php _e('Password Protect This Post') ?></h3>
+<div class="inside">
+<p><input name="post_password" type="text" size="25" id="post_password" value="<?php echo attribute_escape( $post->post_password ); ?>" /></p>
+<p><?php _e('Setting a password will require people who visit your blog to enter the above password to view this post and its comments.'); ?></p>
+</div>
+</div>
+
+<div id="slugdiv" class="postbox <?php echo postbox_classes('slugdiv', 'post'); ?>">
+<h3><?php _e('Post Slug') ?></h3>
+<div class="inside">
+<input name="post_name" type="text" size="13" id="post_name" value="<?php echo attribute_escape( $post->post_name ); ?>" />
+</div>
 </div>
 
-<?php if ('edit' == $action) : $delete_nonce = wp_create_nonce( 'delete-post_' . $post_ID ); ?>
-<input name="deletepost" class="button delete" type="submit" id="deletepost" tabindex="10" value="<?php echo ( 'draft' == $post->post_status ) ? __('Delete this draft') : __('Delete this post'); ?>" <?php echo "onclick=\"if ( confirm('" . js_escape(sprintf( ('draft' == $post->post_status) ? __("You are about to delete this draft '%s'\n  'Cancel' to stop, 'OK' to delete.") : __("You are about to delete this post '%s'\n  'Cancel' to stop, 'OK' to delete."), $post->post_title )) . "') ) { document.forms.post._wpnonce.value = '$delete_nonce'; return true;}return false;\""; ?> />
+<?php
+$authors = get_editable_user_ids( $current_user->id ); // TODO: ROLE SYSTEM
+if ( $post->post_author && !in_array($post->post_author, $authors) )
+	$authors[] = $post->post_author;
+if ( $authors && count( $authors ) > 1 ) :
+?>
+<div id="authordiv" class="postbox <?php echo postbox_classes('authordiv', 'post'); ?>">
+<h3><?php _e('Post Author'); ?></h3>
+<div class="inside">
+<?php wp_dropdown_users( array('include' => $authors, 'name' => 'post_author_override', 'selected' => empty($post_ID) ? $user_ID : $post->post_author) ); ?>
+</div>
+</div>
 <?php endif; ?>
 
+<?php do_meta_boxes('post', 'advanced', $post); ?>
+
+<?php do_action('dbx_post_sidebar'); ?>
+</div>
 </div>
 
 </div>
 
 </form>
+
+<?php if ((isset($post->post_title) && '' == $post->post_title) || (isset($_GET['message']) && 2 > $_GET['message'])) : ?>
+<script type="text/javascript">
+try{document.post.title.focus();}catch(e){}
+</script>
+<?php endif; ?>
diff -x .svn -aruN 2.2.2.src/wp-admin/edit-form-comment.php 2.5.src/wp-admin/edit-form-comment.php
--- 2.2.2.src/wp-admin/edit-form-comment.php	2007-05-28 23:37:35.000000000 -0500
+++ 2.5.src/wp-admin/edit-form-comment.php	2008-03-26 15:15:52.000000000 -0500
@@ -1,5 +1,5 @@
 <?php
-$submitbutton_text = __('Edit Comment &raquo;');
+$submitbutton_text = __('Edit Comment');
 $toprow_title = sprintf(__('Editing Comment # %s'), $comment->comment_ID);
 $form_action = 'editedcomment';
 $form_extra = "' />\n<input type='hidden' name='comment_ID' value='" . $comment->comment_ID . "' />\n<input type='hidden' name='comment_post_ID' value='" . $comment->comment_post_ID;
@@ -8,73 +8,100 @@
 <form name="post" action="comment.php" method="post" id="post">
 <?php wp_nonce_field('update-comment_' . $comment->comment_ID) ?>
 <div class="wrap">
+<h2><?php echo $toprow_title; ?></h2>
 <input type="hidden" name="user_ID" value="<?php echo (int) $user_ID ?>" />
 <input type="hidden" name="action" value='<?php echo $form_action . $form_extra ?>' />
 
-<script type="text/javascript">
-function focusit() { // focus on first input field
-	document.post.name.focus();
-}
-addLoadEvent(focusit);
-</script>
-<fieldset id="namediv">
-    <legend><label for="name"><?php _e('Name:') ?></label></legend>
-	<div>
-	  <input type="text" name="newcomment_author" size="25" value="<?php echo attribute_escape( $comment->comment_author ); ?>" tabindex="1" id="name" />
-    </div>
-</fieldset>
-<fieldset id="emaildiv">
-        <legend><label for="email"><?php _e('E-mail:') ?></label></legend>
-		<div>
-		  <input type="text" name="newcomment_author_email" size="20" value="<?php echo attribute_escape( $comment->comment_author_email ); ?>" tabindex="2" id="email" />
-    </div>
-</fieldset>
-<fieldset id="uridiv">
-        <legend><label for="newcomment_author_url"><?php _e('URL:') ?></label></legend>
-		<div>
-		  <input type="text" id="newcomment_author_url" name="newcomment_author_url" size="35" value="<?php echo attribute_escape( $comment->comment_author_url ); ?>" tabindex="3" />
-    </div>
-</fieldset>
-
-<fieldset style="clear: both;">
-        <legend><?php _e('Comment') ?></legend>
-	<?php the_editor($comment->comment_content, 'content', 'newcomment_author_url'); ?>
-</fieldset>
+<div id="poststuff">
+
+<div class="submitbox" id="submitcomment">
+
+<div id="previewview">
+<a href="<?php echo get_comment_link(); ?>" target="_blank"><?php _e('View this Comment'); ?></a>
+</div>
 
-<p class="submit"><input type="submit" name="editcomment" id="editcomment" value="<?php echo $submitbutton_text ?>" style="font-weight: bold;" tabindex="6" />
-  <input name="referredby" type="hidden" id="referredby" value="<?php echo wp_get_referer(); ?>" />
+<div class="inside">
+
+<p><strong><?php _e('Approval Status') ?></strong></p>
+<p>
+<select name='comment_status'>
+<option<?php selected( $comment->comment_approved, '1' ); ?> value='1'><?php _e('Approved') ?></option>
+<option<?php selected( $comment->comment_approved, '0' ); ?> value='0'><?php _e('Moderated') ?></option>
+<option<?php selected( $comment->comment_approved, 'spam' ); ?> value='spam'><?php _e('Spam') ?></option>
+</select>
 </p>
 
+<?php
+$stamp = __('%1$s at %2$s');
+$date = mysql2date(get_option('date_format'), $comment->comment_date);
+$time = mysql2date(get_option('time_format'), $comment->comment_date);
+?>
+<p class="curtime"><?php printf($stamp, $date, $time); ?>
+&nbsp;<a href="#edit_timestamp" class="edit-timestamp hide-if-no-js"><?php _e('Edit') ?></a></p>
+
+<div id='timestampdiv' class='hide-if-js'><?php touch_time(('editcomment' == $action), 0, 5); ?></div>
+
 </div>
 
-<div class="wrap">
-<h2><?php _e('Advanced'); ?></h2>
+<p class="submit">
+<input type="submit" name="save" value="<?php _e('Save'); ?>" tabindex="4" class="button button-highlighted" />
+<?php
+echo "<a class='submitdelete' href='" . wp_nonce_url("comment.php?action=deletecomment&amp;c=$comment->comment_ID", 'delete-comment_' . $comment->comment_ID) . "' onclick=\"if ( confirm('" . js_escape(__("You are about to delete this comment. \n  'Cancel' to stop, 'OK' to delete.")) . "') ) { return true;}return false;\">" . __('Delete comment') . "</a>";
+?>
+</p>
+
+<div class="side-info">
+<h5><?php _e('Related') ?></h5>
+
+<ul>
+<li><a href="edit-comments.php"><?php _e('Manage All Comments') ?></a></li>
+<li><a href="edit-comments.php?comment_status=moderated"><?php _e('Moderate Comments') ?></a></li>
+<?php do_action('comment_relatedlinks_list'); ?>
+</ul>
+</div>
+<?php do_action('submitcomment_box'); ?>
+</div>
 
-<table width="100%" cellspacing="2" cellpadding="5" class="editform">
-	<tr>
-		<th scope="row" valign="top"><?php _e('Comment Status') ?>:</th>
-		<td><label for="comment_status_approved" class="selectit"><input id="comment_status_approved" name="comment_status" type="radio" value="1" <?php checked($comment->comment_approved, '1'); ?> /> <?php _e('Approved') ?></label><br />
-		<label for="comment_status_moderated" class="selectit"><input id="comment_status_moderated" name="comment_status" type="radio" value="0" <?php checked($comment->comment_approved, '0'); ?> /> <?php _e('Moderated') ?></label><br />
-		<label for="comment_status_spam" class="selectit"><input id="comment_status_spam" name="comment_status" type="radio" value="spam" <?php checked($comment->comment_approved, 'spam'); ?> /> <?php _e('Spam') ?></label></td>
-	</tr>
-
-<?php if ( current_user_can('edit_posts') ) : ?>
-	<tr>
-		<th scope="row" valign="top"><?php _e('Edit time'); ?>:</th>
-		<td><?php touch_time(('editcomment' == $action), 0); ?> </td>
-	</tr>
-<?php endif; ?>
-
-	<tr>
-		<th scope="row" valign="top"><?php _e('Delete'); $delete_nonce = wp_create_nonce( 'delete-comment_' . $comment->comment_ID ); ?>:</th>
-		<td><input name="deletecomment" class="button delete" type="submit" id="deletecomment" tabindex="10" value="<?php _e('Delete this comment') ?>" <?php echo "onclick=\"if ( confirm('" . js_escape(__("You are about to delete this comment. \n  'Cancel' to stop, 'OK' to delete.")) . "') ) { document.forms.post._wpnonce.value = '$delete_nonce'; return true; } return false;\""; ?> /> 
-		<input type="hidden" name="c" value="<?php echo $comment->comment_ID ?>" />
-		<input type="hidden" name="p" value="<?php echo $comment->comment_post_ID ?>" />
-		<input type="hidden" name="noredir" value="1" />
-	</td>
-	</tr>
-</table>
+<div id="post-body">
+<div id="namediv" class="stuffbox">
+<h3><?php _e('Name') ?></h3>
+<div class="inside">
+<input type="text" name="newcomment_author" size="30" value="<?php echo attribute_escape( $comment->comment_author ); ?>" tabindex="1" id="name" />
+</div>
+</div>
+
+<div id="emaildiv" class="stuffbox">
+<h3><?php _e('E-mail') ?></h3>
+<div class="inside">
+<input type="text" name="newcomment_author_email" size="30" value="<?php echo attribute_escape( $comment->comment_author_email ); ?>" tabindex="2" id="email" />
+</div>
+</div>
+
+<div id="uridiv" class="stuffbox">
+<h3><?php _e('URL') ?></h3>
+<div class="inside">
+<input type="text" id="newcomment_author_url" name="newcomment_author_url" size="30" value="<?php echo attribute_escape( $comment->comment_author_url ); ?>" tabindex="3" />
+</div>
+</div>
 
+<div id="postdiv" class="postarea">
+<h3><?php _e('Comment') ?></h3>
+<?php the_editor($comment->comment_content, 'content', 'newcomment_author_url', false, 4); ?>
+<?php wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false ); ?>
+</div>
+
+<?php do_meta_boxes('comment', 'normal', $comment); ?>
+
+<input type="hidden" name="c" value="<?php echo $comment->comment_ID ?>" />
+<input type="hidden" name="p" value="<?php echo $comment->comment_post_ID ?>" />
+<input name="referredby" type="hidden" id="referredby" value="<?php echo wp_get_referer(); ?>" />
+<input type="hidden" name="noredir" value="1" />
+</div>
+</div>
 </div>
 
 </form>
+
+<script type="text/javascript">
+try{document.post.name.focus();}catch(e){}
+</script>
diff -x .svn -aruN 2.2.2.src/wp-admin/edit-form.php 2.5.src/wp-admin/edit-form.php
--- 2.2.2.src/wp-admin/edit-form.php	2007-05-28 23:37:35.000000000 -0500
+++ 2.5.src/wp-admin/edit-form.php	2008-03-15 17:57:47.000000000 -0500
@@ -6,33 +6,23 @@
 <?php if (isset($mode) && 'bookmarklet' == $mode) : ?>
 <input type="hidden" name="mode" value="bookmarklet" />
 <?php endif; ?>
-<input type="hidden" name="user_ID" value="<?php echo (int) $user_ID ?>" />
+<input type="hidden" id="user-id" name="user_ID" value="<?php echo (int) $user_ID ?>" />
 <input type="hidden" name="action" value='post' />
 
-<script type="text/javascript">
-<!--
-function focusit() { // focus on first input field
-	document.getElementById('title').focus();
-}
-addLoadEvent(focusit);
-//-->
-</script>
-
 <div id="poststuff">
     <fieldset id="titlediv">
-      <legend><a href="http://wordpress.org/docs/reference/post/#title" title="<?php _e('Help on titles') ?>"><?php _e('Title') ?></a></legend> 
+      <legend><a href="http://wordpress.org/docs/reference/post/#title" title="<?php _e('Help on titles') ?>"><?php _e('Title') ?></a></legend>
 	  <div><input type="text" name="post_title" size="30" tabindex="1" value="<?php echo attribute_escape( $post->post_title ); ?>" id="title" /></div>
     </fieldset>
 
     <fieldset id="categorydiv">
-      <legend><a href="http://wordpress.org/docs/reference/post/#category" title="<?php _e('Help on categories') ?>"><?php _e('Categories') ?></a></legend> 
+      <legend><a href="http://wordpress.org/docs/reference/post/#category" title="<?php _e('Help on categories') ?>"><?php _e('Categories') ?></a></legend>
 	  <div><?php dropdown_categories($post->post_category); ?></div>
     </fieldset>
 
 <br />
 <fieldset id="postdiv">
     <legend><a href="http://wordpress.org/docs/reference/post/#post" title="<?php _e('Help with post field') ?>"><?php _e('Post') ?></a></legend>
-<?php the_quicktags(); ?>
 <?php
  $rows = get_option('default_post_edit_rows');
  if (($rows < 3) || ($rows > 100)) {
@@ -40,6 +30,7 @@
  }
 ?>
 <div><textarea rows="<?php echo $rows; ?>" cols="40" name="content" tabindex="4" id="content"><?php echo $post->post_content ?></textarea></div>
+<?php wp_nonce_field( 'autosave', 'autosavenonce', false ); ?>
 </fieldset>
 
 
@@ -58,11 +49,11 @@
 	<input name="saveasprivate" type="submit" id="saveasprivate" tabindex="10" value="<?php _e('Save as Private') ?>" />
 
 	 <?php if ( current_user_can('edit_posts') ) : ?>
-	<input name="publish" type="submit" id="publish" tabindex="6" style="font-weight: bold;" value="<?php _e('Publish') ?>" />
+	<input name="publish" type="submit" id="publish" tabindex="6" value="<?php _e('Publish') ?>" class="button button-highlighted" />
 <?php endif; ?>
 
 <?php if ('bookmarklet' != $mode) {
-		echo '<input name="advanced" type="submit" id="advancededit" tabindex="7" value="' .  __('Advanced Editing &raquo;') . '" />';
+		echo '<input name="advanced" type="submit" id="advancededit" tabindex="7" value="' .  __('Advanced Editing') . '" />';
 	} ?>
 	<input name="referredby" type="hidden" id="referredby" value="<?php if ( $refby = wp_get_referer() ) echo urlencode($refby); ?>" />
 </p>
@@ -72,4 +63,7 @@
 </div>
 </form>
 
+<script type="text/javascript">
+try{document.getElementById('title').focus();}catch(e){}
+</script>
 </div>
diff -x .svn -aruN 2.2.2.src/wp-admin/edit-link-categories.php 2.5.src/wp-admin/edit-link-categories.php
--- 2.2.2.src/wp-admin/edit-link-categories.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/edit-link-categories.php	2008-03-26 17:21:01.000000000 -0500
@@ -0,0 +1,155 @@
+<?php
+require_once('admin.php');
+
+// Handle bulk deletes
+if ( isset($_GET['deleteit']) && isset($_GET['delete']) ) {
+	check_admin_referer('bulk-link-categories');
+
+	if ( !current_user_can('manage_categories') )
+		wp_die(__('Cheatin&#8217; uh?'));
+
+	foreach( (array) $_GET['delete'] as $cat_ID ) {
+		$cat_name = get_term_field('name', $cat_ID, 'link_category');
+
+		// Don't delete the default cats.
+		if ( $cat_ID == get_option('default_link_category') )
+			wp_die(sprintf(__("Can&#8217;t delete the <strong>%s</strong> category: this is the default one"), $cat_name));
+
+		wp_delete_term($cat_ID, 'link_category');
+	}
+
+	$location = 'edit-link-categories.php';
+	if ( $referer = wp_get_referer() ) {
+		if ( false !== strpos($referer, 'edit-link-categories.php') )
+			$location = $referer;
+	}
+
+	$location = add_query_arg('message', 6, $location);
+	wp_redirect($location);
+	exit();
+} elseif ( !empty($_GET['_wp_http_referer']) ) {
+	 wp_redirect(remove_query_arg(array('_wp_http_referer', '_wpnonce'), stripslashes($_SERVER['REQUEST_URI'])));
+	 exit;
+}
+
+$title = __('Link Categories');
+$parent_file = 'edit.php';
+
+wp_enqueue_script( 'admin-categories' );
+wp_enqueue_script('admin-forms');
+
+require_once ('admin-header.php');
+
+$messages[1] = __('Category added.');
+$messages[2] = __('Category deleted.');
+$messages[3] = __('Category updated.');
+$messages[4] = __('Category not added.');
+$messages[5] = __('Category not updated.');
+$messages[6] = __('Categories deleted.');
+
+if (isset($_GET['message'])) : ?>
+<div id="message" class="updated fade"><p><?php echo $messages[$_GET['message']]; ?></p></div>
+<?php $_SERVER['REQUEST_URI'] = remove_query_arg(array('message'), $_SERVER['REQUEST_URI']);
+endif; ?>
+
+<div class="wrap">
+
+<form id="posts-filter" action="" method="get">
+<?php if ( current_user_can('manage_categories') ) : ?>
+	<h2><?php printf(__('Manage Link Categories (<a href="%s">add new</a>)'), '#addcat') ?> </h2>
+<?php else : ?>
+	<h2><?php _e('Manage Link Categories') ?> </h2>
+<?php endif; ?>
+
+<p id="post-search">
+	<input type="text" id="post-search-input" name="s" value="<?php echo attribute_escape(stripslashes($_GET['s'])); ?>" />
+	<input type="submit" value="<?php _e( 'Search Categories' ); ?>" class="button" />
+</p>
+
+<br class="clear" />
+
+<div class="tablenav">
+
+<?php
+$pagenum = absint( $_GET['pagenum'] );
+if ( empty($pagenum) )
+	$pagenum = 1;
+if( !$catsperpage || $catsperpage < 0 )
+	$catsperpage = 20;
+
+$page_links = paginate_links( array(
+	'base' => add_query_arg( 'pagenum', '%#%' ),
+	'format' => '',
+	'total' => ceil(wp_count_terms('link_category') / $catsperpage),
+	'current' => $pagenum
+));
+
+if ( $page_links )
+	echo "<div class='tablenav-pages'>$page_links</div>";
+?>
+
+<div class="alignleft">
+<input type="submit" value="<?php _e('Delete'); ?>" name="deleteit" class="button-secondary delete" />
+<?php wp_nonce_field('bulk-link-categories'); ?>
+</div>
+
+<br class="clear" />
+</div>
+
+<br class="clear" />
+
+<table class="widefat">
+	<thead>
+	<tr>
+        <th scope="col" class="check-column"><input type="checkbox" onclick="checkAll(document.getElementById('posts-filter'));" /></th>
+        <th scope="col"><?php _e('Name') ?></th>
+        <th scope="col"><?php _e('Description') ?></th>
+        <th scope="col" class="num" style="width: 90px;"><?php _e('Links') ?></th>
+	</tr>
+	</thead>
+	<tbody id="the-list" class="list:link-cat">
+<?php
+$start = ($pagenum - 1) * $catsperpage;
+$args = array('offset' => $start, 'number' => $catsperpage, 'hide_empty' => 0);
+if ( !empty( $_GET['s'] ) )
+	$args['search'] = $_GET['s'];
+
+$categories = get_terms( 'link_category', $args );
+if ( $categories ) {
+	$output = '';
+	foreach ( $categories as $category ) {
+		$category = sanitize_term($category, 'link_category', 'display');
+		$output .= link_cat_row($category);
+	}
+	$output = apply_filters('cat_rows', $output);
+	echo $output;
+	unset($category);
+}
+
+?>
+	</tbody>
+</table>
+</form>
+
+<div class="tablenav">
+
+<?php
+if ( $page_links )
+	echo "<div class='tablenav-pages'>$page_links</div>";
+?>
+<br class="clear" />
+</div>
+<br class="clear" />
+
+</div>
+
+<?php if ( current_user_can('manage_categories') ) : ?>
+<div class="wrap">
+<p><?php printf(__('<strong>Note:</strong><br />Deleting a category does not delete the links in that category. Instead, links that were only assigned to the deleted category are set to the category <strong>%s</strong>.'), get_term_field('name', get_option('default_link_category'), 'link_category')) ?></p>
+</div>
+
+<?php include('edit-link-category-form.php'); ?>
+
+<?php endif; ?>
+
+<?php include('admin-footer.php'); ?>
diff -x .svn -aruN 2.2.2.src/wp-admin/edit-link-category-form.php 2.5.src/wp-admin/edit-link-category-form.php
--- 2.2.2.src/wp-admin/edit-link-category-form.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/edit-link-category-form.php	2008-03-26 17:21:01.000000000 -0500
@@ -0,0 +1,44 @@
+<?php
+if ( ! empty($cat_ID) ) {
+	$heading = __('Edit Category');
+	$submit_text = __('Edit Category');
+	$form = '<form name="editcat" id="editcat" method="post" action="link-category.php" class="validate">';
+	$action = 'editedcat';
+	$nonce_action = 'update-link-category_' . $cat_ID;
+	do_action('edit_link_category_form_pre', $category);
+} else {
+	$heading = __('Add Category');
+	$submit_text = __('Add Category');
+	$form = '<form name="addcat" id="addcat" class="add:the-list: validate" method="post" action="link-category.php">';
+	$action = 'addcat';
+	$nonce_action = 'add-link-category';
+	do_action('add_link_category_form_pre', $category);
+}
+?>
+
+<div class="wrap">
+<h2><?php echo $heading ?></h2>
+<div id="ajax-response"></div>
+<?php echo $form ?>
+<input type="hidden" name="action" value="<?php echo $action ?>" />
+<input type="hidden" name="cat_ID" value="<?php echo $category->term_id ?>" />
+<?php wp_original_referer_field(true, 'previous'); wp_nonce_field($nonce_action); ?>
+	<table class="form-table">
+		<tr class="form-field form-required">
+			<th scope="row" valign="top"><label for="name"><?php _e('Category name') ?></label></th>
+			<td><input name="name" id="name" type="text" value="<?php echo $category->name; ?>" size="40" /></td>
+		</tr>
+		<tr class="form-field">
+			<th scope="row" valign="top"><label for="slug"><?php _e('Category slug') ?></label></th>
+			<td><input name="slug" id="slug" type="text" value="<?php echo $category->slug; ?>" size="40" />
+            <?php _e('The &#8220;slug&#8221; is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens.'); ?></td>
+		</tr>
+		<tr class="form-field">
+			<th scope="row" valign="top"><label for="description"><?php _e('Description (optional)') ?></label></th>
+			<td><textarea name="description" id="description" rows="5" cols="50" style="width: 97%;"><?php echo $category->description; ?></textarea></td>
+		</tr>
+	</table>
+<p class="submit"><input type="submit" class="button" name="submit" value="<?php echo $submit_text ?>" /></p>
+<?php do_action('edit_link_category_form', $category); ?>
+</form>
+</div>
diff -x .svn -aruN 2.2.2.src/wp-admin/edit-link-form.php 2.5.src/wp-admin/edit-link-form.php
--- 2.2.2.src/wp-admin/edit-link-form.php	2007-03-06 23:29:15.000000000 -0600
+++ 2.5.src/wp-admin/edit-link-form.php	2008-03-18 14:37:31.000000000 -0500
@@ -1,17 +1,17 @@
 <?php
 if ( ! empty($link_id) ) {
 	$heading = __('Edit Link');
-	$submit_text = __('Save Changes &raquo;');
+	$submit_text = __('Save Changes');
 	$form = '<form name="editlink" id="editlink" method="post" action="link.php">';
 	$nonce_action = 'update-bookmark_' . $link_id;
 } else {
 	$heading = __('Add Link');
-	$submit_text = __('Add Link &raquo;');
+	$submit_text = __('Add Link');
 	$form = '<form name="addlink" id="addlink" method="post" action="link.php">';
 	$nonce_action = 'add-bookmark';
 }
 
-function xfn_check($class, $value = '', $type = 'check') {
+function xfn_check($class, $value = '', $deprecated = '') {
 	global $link;
 
 	$link_rel = $link->link_rel;
@@ -30,86 +30,138 @@
 }
 ?>
 
-<div class="wrap">
-<h2><?php echo $heading ?></h2>
 <?php echo $form ?>
 <?php wp_nonce_field($nonce_action); ?>
+<?php wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false ); ?>
+
+<div class="wrap">
+<h2><?php echo $heading; ?></h2>
 
 <div id="poststuff">
-<div id="moremeta">
-<div id="grabit" class="dbx-group">
 
-<fieldset id="categorydiv" class="dbx-box">
-<h3 class="dbx-handle"><?php _e('Categories') ?></h3>
-<div class="dbx-content">
-<p id="jaxcat"></p>
-<ul id="categorychecklist"><?php dropdown_link_categories(get_option('default_link_category')); ?></ul>
-</div>
-</fieldset>
-
-<fieldset class="dbx-box">
-<h3 class="dbx-handle"><?php _e('Target') ?></h3>
-<div class="dbx-content">
+<div class="submitbox" id="submitlink">
+
+<div id="previewview">
+<?php if ( !empty($link_id) ) { ?>
+<a href="<?php echo $link->link_url; ?>" target="_blank"><?php _e('Visit Link'); ?></a>
+<?php } ?>
+</div>
+
+<div class="inside">
+<p><label for="link_private" class="selectit"><input id="link_private" name="link_visible" type="checkbox" value="N" <?php checked($link->link_visible, 'N'); ?> /> <?php _e('Keep this link private') ?></label></p>
+</div>
+
+<p class="submit">
+<input type="submit" class="button button-highlighted" name="save" value="<?php _e('Save'); ?>" tabindex="4" />
+<?php
+if ( ( 'edit' == $action) && current_user_can('manage_links') )
+	echo "<a class='submitdelete' href='" . wp_nonce_url("link.php?action=delete&amp;link_id=$link_id", 'delete-bookmark_' . $link_id) . "' onclick=\"if ( confirm('" . js_escape( sprintf( __("You are about to delete this link '%s'\n'Cancel' to stop, 'OK' to delete."), $link->link_name )) . "') ) { return true;}return false;\">" . __('Delete&nbsp;link') . "</a>";
+?>
+</p>
+
+<div class="side-info">
+<h5><?php _e('Related') ?></h5>
+
+<ul>
+<li><a href="link-manager.php"><?php _e('Manage All Links') ?></a></li>
+<li><a href="edit-link-categories.php"><?php _e('Manage All Link Categories') ?></a></li>
+<li><a href="link-import.php"><?php _e('Import Links') ?></a></li>
+<?php do_action('link_relatedlinks_list'); ?>
+</ul>
+</div>
+<?php do_action('submitlink_box'); ?>
+</div>
+
+<div id="post-body">
+<div id="namediv" class="stuffbox">
+<h3><?php _e('Name') ?></h3>
+<div class="inside">
+	<input type="text" name="link_name" size="30" tabindex="1" value="<?php echo $link->link_name; ?>" id="link_name" /><br />
+    <?php _e('Example: Nifty blogging software'); ?>
+</div>
+</div>
+
+<div id="addressdiv" class="stuffbox">
+<h3><?php _e('Web Address') ?></h3>
+<div class="inside">
+	<input type="text" name="link_url" size="30" tabindex="1" value="<?php echo $link->link_url; ?>" id="link_url" /><br />
+    <?php _e('Example: <code>http://wordpress.org/</code> &#8212; don&#8217;t forget the <code>http://</code>'); ?>
+</div>
+</div>
+
+<div id="descriptiondiv" class="stuffbox">
+<h3><?php _e('Description') ?></h3>
+<div class="inside">
+	<input type="text" name="link_description" size="30" tabindex="1" value="<?php echo $link->link_description; ?>" id="link_description" /><br />
+    <?php _e('This will be shown when someone hovers over the link in the blogroll, or optionally below the link.'); ?>
+</div>
+</div>
+
+<div id="linkcategorydiv" class="postbox <?php echo postbox_classes('linkcategorydiv', 'link'); ?>">
+<h3><?php _e('Categories') ?></h3>
+<div class="inside">
+
+<div id="category-adder" class="wp-hidden-children">
+	<h4><a id="category-add-toggle" href="#category-add"><?php _e( '+ Add New Category' ); ?></a></h4>
+	<p id="link-category-add" class="wp-hidden-child">
+		<input type="text" name="newcat" id="newcat" class="form-required form-input-tip" value="<?php _e( 'New category name' ); ?>" />
+		<input type="button" id="category-add-sumbit" class="add:categorychecklist:linkcategorydiv button" value="<?php _e( 'Add' ); ?>" />
+		<?php wp_nonce_field( 'add-link-category', '_ajax_nonce', false ); ?>
+		<span id="category-ajax-response"></span>
+	</p>
+</div>
+
+<ul id="category-tabs">
+	<li class="ui-tabs-selected"><a href="#categories-all"><?php _e( 'All Categories' ); ?></a></li>
+	<li class="wp-no-js-hidden"><a href="#categories-pop"><?php _e( 'Most Used' ); ?></a></li>
+</ul>
+
+<div id="categories-all" class="ui-tabs-panel">
+	<ul id="categorychecklist" class="list:category categorychecklist form-no-clear">
+		<?php dropdown_link_categories(); ?>
+	</ul>
+</div>
+
+<div id="categories-pop" class="ui-tabs-panel" style="display: none;">
+	<ul id="categorychecklist-pop" class="categorychecklist form-no-clear">
+		<?php wp_popular_terms_checklist('link_category'); ?>
+	</ul>
+</div>
+
+</div>
+</div>
+
+<?php do_meta_boxes('link', 'normal', $link); ?>
+
+<h2><?php _e('Advanced Options'); ?></h2>
+
+<div id="linktargetdiv" class="postbox <?php echo postbox_classes('linktargetdiv', 'link'); ?>">
+<h3><?php _e('Target') ?></h3>
+<div class="inside">
 <label for="link_target_blank" class="selectit">
 <input id="link_target_blank" type="radio" name="link_target" value="_blank" <?php echo(($link->link_target == '_blank') ? 'checked="checked"' : ''); ?> />
-<code>_blank</code></label>
+<code>_blank</code></label><br />
 <label for="link_target_top" class="selectit">
 <input id="link_target_top" type="radio" name="link_target" value="_top" <?php echo(($link->link_target == '_top') ? 'checked="checked"' : ''); ?> />
-<code>_top</code></label>
+<code>_top</code></label><br />
 <label for="link_target_none" class="selectit">
 <input id="link_target_none" type="radio" name="link_target" value="" <?php echo(($link->link_target == '') ? 'checked="checked"' : ''); ?> />
 <?php _e('none') ?></label>
-</div>
-</fieldset>
-
-<fieldset class="dbx-box">
-<h3 class="dbx-handle"><?php _e('Visible') ?></h3>
-<div class="dbx-content">
-<label for="link_visible_yes" class="selectit">
-<input id="link_visible_yes" type="radio" name="link_visible" <?php if ($link->link_visible == 'Y') echo "checked='checked'"; ?> value="Y" />
-<?php _e('Yes') ?></label>
-<label for="link_visible_no" class="selectit">
-<input id="link_visible_no" type="radio" name="link_visible" <?php if ($link->link_visible == 'N') echo "checked='checked'"; ?> value="N" />
-<?php _e('No') ?></label>
-</div>
-</fieldset>
-
+<p><?php _e('Choose the frame your link targets. Essentially this means if you choose <code>_blank</code> your link will open in a new window.'); ?></p>
 </div>
 </div>
 
-<table class="editform" width="100%" cellspacing="2" cellpadding="5">
-<tr>
-<th scope="row" valign="top"><label for="link_name"><?php _e('Name:') ?></label></th>
-<td><input type="text" name="link_name" value="<?php echo $link->link_name; ?>" style="width: 95%" /></td>
-</tr>
-<tr>
-<th width="20%" scope="row" valign="top"><label for="link_url"><?php _e('Address:') ?></label></th>
-<td width="80%"><input type="text" name="link_url" value="<?php echo $link->link_url; if ( empty( $link->link_url ) ) echo 'http://'; ?>" style="width: 95%" /></td>
-</tr>
-<tr>
-<th scope="row" valign="top"><label for="link_description"><?php _e('Description:') ?></label></th>
-<td><input type="text" name="link_description" value="<?php echo $link->link_description; ?>" style="width: 95%" /></td>
-</tr>
-</table>
-
-<p class="submit">
-<input type="submit" name="submit" value="<?php echo $submit_text ?>" />
-</p>
-
-<div id="advancedstuff" class="dbx-group" >
-
-<fieldset id="xfn" class="dbx-box">
-<h3 class="dbx-handle"><?php _e('Link Relationship (XFN)') ?></h3>
-<div class="dbx-content">
-<table class="editform" width="100%" cellspacing="2" cellpadding="5">
+<div id="linkxfndiv" class="postbox <?php echo postbox_classes('linkxfndiv', 'link'); ?>">
+<h3><?php _e('Link Relationship (XFN)') ?></h3>
+<div class="inside">
+<table class="editform" style="width: 100%;" cellspacing="2" cellpadding="5">
 	<tr>
-		<th width="20%" scope="row"><?php _e('rel:') ?></th>
-		<td width="80%"><input type="text" name="link_rel" id="link_rel" size="50" value="<?php echo $link->link_rel; ?>" /></td>
+		<th style="width: 20%;" scope="row"><?php _e('rel:') ?></th>
+		<td style="width: 80%;"><input type="text" name="link_rel" id="link_rel" size="50" value="<?php echo $link->link_rel; ?>" /></td>
 	</tr>
 	<tr>
-		<th scope="row"><?php _e('<a href="http://gmpg.org/xfn/">XFN</a> Creator:') ?></th>
-		<td>
-			<table cellpadding="3" cellspacing="5">
+		<td colspan="2">
+			<table cellpadding="3" cellspacing="5" class="form-table">
 				<tr>
 					<th scope="row"> <?php _e('identity') ?> </th>
 					<td>
@@ -208,28 +260,29 @@
 		</td>
 	</tr>
 </table>
+<p><?php _e('If the link is to a person, you can specify your relationship with them using the above form. If you would like to learn more about the idea check out <a href="http://gmpg.org/xfn/">XFN</a>.'); ?></p>
+</div>
 </div>
-</fieldset>
 
-<fieldset id="advanced" class="dbx-box">
-<h3 class="dbx-handle"><?php _e('Advanced') ?></h3>
-<div class="dbx-content">
-<table class="editform" width="100%" cellspacing="2" cellpadding="5">
-	<tr>
-		<th width="20%" scope="row"><?php _e('Image Address:') ?></th>
-		<td width="80%"><input type="text" name="link_image" size="50" value="<?php echo $link->link_image; ?>" style="width: 95%" /></td>
+<div id="linkadvanceddiv" class="postbox <?php echo postbox_classes('linkadvanceddiv', 'link'); ?>">
+<h3><?php _e('Advanced') ?></h3>
+<div class="inside">
+<table class="form-table" style="width: 100%;" cellspacing="2" cellpadding="5">
+	<tr class="form-field">
+		<th valign="top"  scope="row"><label for="link_image"><?php _e('Image Address') ?></label></th>
+		<td><input type="text" name="link_image" id="link_image" size="50" value="<?php echo $link->link_image; ?>" style="width: 95%" /></td>
 	</tr>
-	<tr>
-		<th scope="row"><?php _e('RSS Address:') ?> </th>
+	<tr class="form-field">
+		<th valign="top"  scope="row"><label for="rss_uri"><?php _e('RSS Address') ?></label></th>
 		<td><input name="link_rss" type="text" id="rss_uri" value="<?php echo $link->link_rss; ?>" size="50" style="width: 95%" /></td>
 	</tr>
-	<tr>
-		<th scope="row"><?php _e('Notes:') ?></th>
-		<td><textarea name="link_notes" cols="50" rows="10" style="width: 95%"><?php echo $link->link_notes; ?></textarea></td>
+	<tr class="form-field">
+		<th valign="top"  scope="row"><label for="link_notes"><?php _e('Notes') ?></label></th>
+		<td><textarea name="link_notes" id="link_notes" cols="50" rows="10" style="width: 95%"><?php echo $link->link_notes; ?></textarea></td>
 	</tr>
-	<tr>
-		<th scope="row"><?php _e('Rating:') ?></th>
-		<td><select name="link_rating" size="1">
+	<tr class="form-field">
+		<th valign="top"  scope="row"><label for="link_rating"><?php _e('Rating') ?></label></th>
+		<td><select name="link_rating" id="link_rating" size="1">
 		<?php
 			for ($r = 0; $r < 10; $r++) {
 				echo('            <option value="'.$r.'" ');
@@ -241,9 +294,11 @@
 		</td>
 	</tr>
 </table>
-</fieldset>
+</div>
 </div>
 
+<?php do_meta_boxes('link', 'advanced', $link); ?>
+
 <?php if ( $link_id ) : ?>
 <input type="hidden" name="action" value="save" />
 <input type="hidden" name="link_id" value="<?php echo (int) $link_id; ?>" />
@@ -252,6 +307,10 @@
 <?php else: ?>
 <input type="hidden" name="action" value="add" />
 <?php endif; ?>
+
 </div>
-</form>
 </div>
+
+</div>
+
+</form>
diff -x .svn -aruN 2.2.2.src/wp-admin/edit-page-form.php 2.5.src/wp-admin/edit-page-form.php
--- 2.2.2.src/wp-admin/edit-page-form.php	2007-05-28 23:37:35.000000000 -0500
+++ 2.5.src/wp-admin/edit-page-form.php	2008-03-26 15:06:18.000000000 -0500
@@ -1,9 +1,16 @@
-
-<div class="wrap">
-<h2 id="write-post"><?php _e('Write Page'); ?></h2>
 <?php
+if ( isset($_GET['message']) )
+	$_GET['message'] = absint( $_GET['message'] );
+$messages[1] = sprintf( __( 'Page updated. Continue editing below or <a href="%s">go back</a>.' ), attribute_escape( stripslashes( $_GET['_wp_original_http_referer'] ) ) );
+$messages[2] = __('Custom field updated.');
+$messages[3] = __('Custom field deleted.');
+$messages[4] = __('Page updated.');
+?>
+<?php if (isset($_GET['message'])) : ?>
+<div id="message" class="updated fade"><p><?php echo $messages[$_GET['message']]; ?></p></div>
+<?php endif;
 
-if (0 == $post_ID) {
+if (!isset($post_ID) || 0 == $post_ID) {
 	$form_action = 'post';
 	$nonce_action = 'add-page';
 	$temp_ID = -1 * time(); // don't change this formula without looking at wp_write_post()
@@ -25,160 +32,166 @@
 ?>
 
 <form name="post" action="page.php" method="post" id="post">
+<div class="wrap">
+<h2><?php _e('Write Page') ?></h2>
 
 <?php
 wp_nonce_field($nonce_action);
 
-if (isset($mode) && 'bookmarklet' == $mode) {
+if (isset($mode) && 'bookmarklet' == $mode)
 	echo '<input type="hidden" name="mode" value="bookmarklet" />';
-}
 ?>
-<input type="hidden" name="user_ID" value="<?php echo $user_ID ?>" />
+<input type="hidden" id="user-id" name="user_ID" value="<?php echo $user_ID ?>" />
 <input type="hidden" id="hiddenaction" name="action" value='<?php echo $form_action ?>' />
 <input type="hidden" id="originalaction" name="originalaction" value="<?php echo $form_action ?>" />
 <?php echo $form_extra ?>
-<input type="hidden" id="post_type" name="post_type" value="page" />
+<input type="hidden" id="post_type" name="post_type" value="<?php echo $post->post_type ?>" />
+<input type="hidden" id="original_post_status" name="original_post_status" value="<?php echo $post->post_status ?>" />
+<input name="referredby" type="hidden" id="referredby" value="<?php
+if ( url_to_postid(wp_get_referer()) == $post_ID && strpos( wp_get_referer(), '/wp-admin/' ) === false )
+	echo 'redo';
+else
+	echo clean_url(stripslashes(wp_get_referer()));
+?>" />
+<?php if ( 'draft' != $post->post_status ) wp_original_referer_field(true, 'previous'); ?>
 
-<script type="text/javascript">
-// <![CDATA[
-function focusit() { // focus on first input field
-	document.post.title.focus();
-}
-addLoadEvent(focusit);
-// ]]>
-</script>
 <div id="poststuff">
 
-<div id="moremeta">
-<div id="grabit" class="dbx-group">
-<fieldset id="commentstatusdiv" class="dbx-box">
-<h3 class="dbx-handle"><?php _e('Discussion') ?></h3>
-<div class="dbx-content">
-<input name="advanced_view" type="hidden" value="1" />
-<label for="comment_status" class="selectit">
-<input name="comment_status" type="checkbox" id="comment_status" value="open" <?php checked($post->comment_status, 'open'); ?> />
-<?php _e('Allow Comments') ?></label>
-<label for="ping_status" class="selectit"><input name="ping_status" type="checkbox" id="ping_status" value="open" <?php checked($post->ping_status, 'open'); ?> /> <?php _e('Allow Pings') ?></label>
-</div>
-</fieldset>
+<div class="submitbox" id="submitpage">
 
-<fieldset class="dbx-box">
-<h3 class="dbx-handle"><?php _e('Page Status') ?></h3>
-<div class="dbx-content"><?php if ( current_user_can('publish_pages') ) : ?>
-<label for="post_status_publish" class="selectit"><input id="post_status_publish" name="post_status" type="radio" value="publish" <?php checked($post->post_status, 'publish'); checked($post->post_status, 'future'); ?> /> <?php _e('Published') ?></label>
-<?php endif; ?>
-	  <label for="post_status_draft" class="selectit"><input id="post_status_draft" name="post_status" type="radio" value="draft" <?php checked($post->post_status, 'draft'); ?> /> <?php _e('Draft') ?></label>
-	  <label for="post_status_private" class="selectit"><input id="post_status_private" name="post_status" type="radio" value="private" <?php checked($post->post_status, 'private'); ?> /> <?php _e('Private') ?></label></div>
-</fieldset>
-
-<fieldset id="passworddiv" class="dbx-box">
-<h3 class="dbx-handle"><?php _e('Page Password') ?></h3>
-<div class="dbx-content"><input name="post_password" type="text" size="13" id="post_password" value="<?php echo attribute_escape( $post->post_password ); ?>" /></div>
-</fieldset>
-
-<fieldset id="pageparent" class="dbx-box">
-<h3 class="dbx-handle"><?php _e('Page Parent') ?></h3>
-<div class="dbx-content"><p><select name="parent_id">
-<option value='0'><?php _e('Main Page (no parent)'); ?></option>
-<?php parent_dropdown($post->post_parent); ?>
-</select></p>
+<div id="previewview">
+<?php if ( 'publish' == $post->post_status ) { ?>
+<a href="<?php echo clean_url(get_permalink($post->ID)); ?>" target="_blank"  tabindex="4"><?php _e('View this Page'); ?></a>
+<?php } elseif ( 'edit' == $action ) { ?>
+<a href="<?php echo clean_url(apply_filters('preview_post_link', add_query_arg('preview', 'true', get_permalink($post->ID)))); ?>" target="_blank" tabindex="4"><?php _e('Preview this Page'); ?></a>
+<?php } ?>
 </div>
-</fieldset>
 
-<?php if ( 0 != count( get_page_templates() ) ) { ?>
-<fieldset id="pagetemplate" class="dbx-box">
-<h3 class="dbx-handle"><?php _e('Page Template') ?></h3>
-<div class="dbx-content"><p><select name="page_template">
-		<option value='default'><?php _e('Default Template'); ?></option>
-		<?php page_template_dropdown($post->page_template); ?>
-		</select></p>
-</div>
-</fieldset>
-<?php } ?>
+<div class="inside">
 
-<fieldset id="slugdiv" class="dbx-box">
-<h3 class="dbx-handle"><?php _e('Page Slug') ?></h3>
-<div class="dbx-content"><input name="post_name" type="text" size="13" id="post_name" value="<?php echo attribute_escape( $post->post_name ); ?>" /></div>
-</fieldset>
-
-<?php if ( $authors = get_editable_authors( $current_user->id ) ) : // TODO: ROLE SYSTEM ?>
-<fieldset id="authordiv" class="dbx-box">
-<h3 class="dbx-handle"><?php _e('Page Author'); ?></h3>
-<div class="dbx-content">
-<select name="post_author_override" id="post_author_override">
-<?php
-foreach ($authors as $o) :
-$o = get_userdata( $o->ID );
-if ( $post->post_author == $o->ID || ( empty($post_ID) && $user_ID == $o->ID ) ) $selected = 'selected="selected"';
-else $selected = '';
-$o->ID = (int) $o->ID;
-$o->display_name = wp_specialchars( $o->display_name );
-echo "<option value='$o->ID' $selected>$o->display_name</option>";
-endforeach;
-?>
-</select>
-</div>
-</fieldset>
+<p><strong><?php _e('Publish Status') ?></strong></p>
+<p>
+<select name='post_status' tabindex='4'>
+<?php if ( current_user_can('publish_posts') ) : ?>
+<option<?php selected( $post->post_status, 'publish' ); selected( $post->post_status, 'private' );?> value='publish'><?php _e('Published') ?></option>
+<?php else: ?>
+<option<?php selected( $post->post_status, 'private' ); ?> value='private'><?php _e('Published') ?></option>
+<?php endif; ?>
+<?php if ( 'future' == $post->post_status ) : ?>
+<option<?php selected( $post->post_status, 'future' ); ?> value='future'><?php _e('Pending') ?></option>
 <?php endif; ?>
+<option<?php selected( $post->post_status, 'pending' ); ?> value='pending'><?php _e('Pending Review') ?></option>
+<option<?php selected( $post->post_status, 'draft' ); ?> value='draft'><?php _e('Unpublished') ?></option>
+</select>
+</p>
 
-<fieldset id="pageorder" class="dbx-box">
-<h3 class="dbx-handle"><?php _e('Page Order') ?></h3>
-<div class="dbx-content"><p><input name="menu_order" type="text" size="4" id="menu_order" value="<?php echo $post->menu_order ?>" /></p></div>
-</fieldset>
+<p><label for="post_status_private" class="selectit"><input id="post_status_private" name="post_status" type="checkbox" value="private" <?php checked($post->post_status, 'private'); ?> tabindex='4' /> <?php _e('Keep this page private') ?></label></p>
+<?php
+if ($post_ID) {
+	if ( 'future' == $post->post_status ) { // scheduled for publishing at a future date
+		$stamp = __('Scheduled for:<br />%1$s at %2$s');
+	} else if ( 'publish' == $post->post_status ) { // already published
+		$stamp = __('Published on:<br />%1$s at %2$s');
+	} else if ( '0000-00-00 00:00:00' == $post->post_date ) { // draft, 1 or more saves, no date specified
+		$stamp = __('Publish immediately');
+	} else { // draft, 1 or more saves, date specified
+		$stamp = __('Publish on:<br />%1$s at %2$s');
+	}
+	$date = mysql2date(get_option('date_format'), $post->post_date);
+	$time = mysql2date(get_option('time_format'), $post->post_date);
+} else { // draft (no saves, and thus no date specified)
+	$stamp = __('Publish immediately');
+	$date = mysql2date(get_option('date_format'), current_time('mysql'));
+	$time = mysql2date(get_option('time_format'), current_time('mysql'));
+}
+?>
+<p class="curtime"><?php printf($stamp, $date, $time); ?>
+&nbsp;<a href="#edit_timestamp" class="edit-timestamp hide-if-no-js" tabindex='4'><?php _e('Edit') ?></a></p>
 
-<?php do_action('dbx_page_sidebar'); ?>
+<div id='timestampdiv' class='hide-if-js'><?php touch_time(($action == 'edit'),1,4); ?></div>
 
 </div>
-</div>
-
-<fieldset id="titlediv">
-  <legend><?php _e('Page Title') ?></legend>
-  <div><input type="text" name="post_title" size="30" tabindex="1" value="<?php echo attribute_escape( $post->post_title ); ?>" id="title" /></div>
-</fieldset>
-
-
-<fieldset id="<?php echo user_can_richedit() ? 'postdivrich' : 'postdiv'; ?>">
-<legend><?php _e('Page Content') ?>
-
-<?php if ( 'publish' == $post->post_status ) { ?>
-<a href="<?php echo clean_url(get_permalink($post->ID)); ?>" style="position: absolute; right: 2em; margin-right: 19em; text-decoration: underline;" target="_blank"><?php _e('View &raquo;'); ?></a>
-<?php } elseif ( 'edit' == $action ) { ?>
-<a href="<?php echo clean_url(apply_filters('preview_post_link', add_query_arg('preview', 'true', get_permalink($post->ID)))); ?>" style="position: absolute; right: 2em; margin-right: 19em; text-decoration: underline;" target="_blank"><?php _e('Preview &raquo;'); ?></a>
-<?php } ?>
-</legend>
-	<?php the_editor($post->post_content); ?>
-</fieldset>
 
 <p class="submit">
-<span id="autosave"></span>
-<input name="save" type="submit" id="save" tabindex="3" value="<?php _e('Save and Continue Editing'); ?>" />
-<input type="submit" name="submit" value="<?php _e('Save') ?>" style="font-weight: bold;" tabindex="4" />
+<input type="submit" name="save" class="button button-highlighted" value="<?php _e('Save'); ?>" tabindex="4" />
 <?php
-if ('publish' != $post->post_status || 0 == $post_ID):
+if ( !in_array( $post->post_status, array('publish', 'future') ) || 0 == $post_ID ) {
 ?>
 <?php if ( current_user_can('publish_pages') ) : ?>
-	<input name="publish" type="submit" id="publish" tabindex="5" accesskey="p" value="<?php _e('Publish') ?>" />
-<?php endif; endif;?>
-<input name="referredby" type="hidden" id="referredby" value="<?php echo $sendto; ?>" />
-</p>
-
-<?php do_action('edit_page_form'); ?>
-
+	<input name="publish" type="submit" class="button" id="publish" tabindex="5" accesskey="p" value="<?php _e('Publish') ?>" />
+<?php else : ?>
+	<input name="publish" type="submit" class="button" id="publish" tabindex="5" accesskey="p" value="<?php _e('Submit for Review') ?>" />
+<?php endif; ?>
 <?php
-if (current_user_can('upload_files')) {
-	$uploading_iframe_ID = (0 == $post_ID ? $temp_ID : $post_ID);
-	$uploading_iframe_src = wp_nonce_url("upload.php?style=inline&amp;tab=upload&amp;post_id=$uploading_iframe_ID", 'inlineuploading');
-	$uploading_iframe_src = apply_filters('uploading_iframe_src', $uploading_iframe_src);
-	if ( false != $uploading_iframe_src )
-		echo '<iframe id="uploading" frameborder="0" src="' . $uploading_iframe_src . '">' . __('This feature requires iframe support.') . '</iframe>';
+}
+
+if ( ('edit' == $action) && current_user_can('delete_page', $post_ID) )
+	echo "<a class='submitdelete' href='" . wp_nonce_url("page.php?action=delete&amp;post=$post_ID", 'delete-page_' . $post_ID) . "' onclick=\"if ( confirm('" . js_escape(sprintf( ('draft' == $post->post_status) ? __("You are about to delete this draft '%s'\n  'Cancel' to stop, 'OK' to delete.") : __("You are about to delete this page '%s'\n  'Cancel' to stop, 'OK' to delete."), $post->post_title )) . "') ) { return true;}return false;\">" . __('Delete&nbsp;page') . "</a>";
+?>
+<br class="clear" />
+<?php if ($post_ID): ?>
+<?php if ( $last_id = get_post_meta($post_ID, '_edit_last', true) ) {
+	$last_user = get_userdata($last_id);
+	printf(__('Last edited by %1$s on %2$s at %3$s'), wp_specialchars( $last_user->display_name ), mysql2date(get_option('date_format'), $post->post_modified), mysql2date(get_option('time_format'), $post->post_modified));
+} else {
+	printf(__('Last edited on %1$s at %2$s'), mysql2date(get_option('date_format'), $post->post_modified), mysql2date(get_option('time_format'), $post->post_modified));
 }
 ?>
+<br class="clear" />
+<?php endif; ?>
+<span id="autosave"></span>
+</p>
+
+<div class="side-info">
+<h5><?php _e('Related') ?></h5>
+
+<ul>
+<?php if ($post_ID): ?>
+<li><a href="edit-pages.php?page_id=<?php echo $post_ID ?>"><?php _e('See Comments on this Page') ?></a></li>
+<?php endif; ?>
+<li><a href="edit-comments.php"><?php _e('Manage All Comments') ?></a></li>
+<li><a href="edit-pages.php"><?php _e('Manage All Pages') ?></a></li>
+<?php do_action('page_relatedlinks_list'); ?>
+</ul>
+</div>
+<?php do_action('submitpage_box'); ?>
+</div>
 
-<div id="advancedstuff" class="dbx-group">
+<div id="post-body">
+<div id="titlediv">
+<h3><?php _e('Title') ?></h3>
+<div id="titlewrap">
+  <input type="text" name="post_title" size="30" tabindex="1" value="<?php echo attribute_escape( $post->post_title ); ?>" id="title" autocomplete="off" />
+</div>
+<div class="inside">
+<?php $sample_permalink_html = get_sample_permalink_html($post->ID); ?>
+	<div id="edit-slug-box">
+<?php if ( ! empty($post->ID) && ! empty($sample_permalink_html) ) :
+	echo $sample_permalink_html;
+endif; ?>
+	</div>
+</div>
+</div>
 
-<fieldset id="postcustom" class="dbx-box">
-<h3 class="dbx-handle"><?php _e('Custom Fields') ?></h3>
-<div id="postcustomstuff" class="dbx-content">
+<div id="<?php echo user_can_richedit() ? 'postdivrich' : 'postdiv'; ?>" class="postarea">
+<h3><?php _e('Page') ?></h3>
+<?php the_editor($post->post_content); ?>
+<?php wp_nonce_field( 'autosave', 'autosavenonce', false ); ?>
+<?php wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false ); ?>
+<?php wp_nonce_field( 'getpermalink', 'getpermalinknonce', false ); ?>
+<?php wp_nonce_field( 'samplepermalink', 'samplepermalinknonce', false ); ?>
+</div>
+
+<?php do_meta_boxes('page', 'normal', $post); ?>
+
+<?php do_action('edit_page_form'); ?>
+
+<h2><?php _e('Advanced Options'); ?></h2>
+
+<div id="pagepostcustom" class="postbox <?php echo postbox_classes('pagepostcustom', 'page'); ?>">
+<h3><?php _e('Custom Fields') ?></h3>
+<div class="inside">
+<div id="postcustomstuff">
 <table cellpadding="3">
 <?php
 $metadata = has_meta($post_ID);
@@ -189,21 +202,94 @@
 <?php
 	meta_form();
 ?>
-</div>
 <div id="ajax-response"></div>
-</fieldset>
+</div>
+<p><?php _e('Custom fields can be used to add extra metadata to a post that you can <a href="http://codex.wordpress.org/Using_Custom_Fields" target="_blank">use in your theme</a>.'); ?></p>
+</div>
+</div>
 
-<?php do_action('dbx_page_advanced'); ?>
+<div id="pagecommentstatusdiv" class="postbox <?php echo postbox_classes('pagecommentstatusdiv', 'page'); ?>">
+<h3><?php _e('Comments &amp; Pings') ?></h3>
+<div class="inside">
+<input name="advanced_view" type="hidden" value="1" />
+<p><label for="comment_status" class="selectit">
+<input name="comment_status" type="checkbox" id="comment_status" value="open" <?php checked($post->comment_status, 'open'); ?> />
+<?php _e('Allow Comments') ?></label></p>
+<p><label for="ping_status" class="selectit"><input name="ping_status" type="checkbox" id="ping_status" value="open" <?php checked($post->ping_status, 'open'); ?> /> <?php _e('Allow Pings') ?></label></p>
+<p><?php _e('These settings apply to this page only. &#8220;Pings&#8221; are <a href="http://codex.wordpress.org/Introduction_to_Blogging#Managing_Comments" target="_blank">trackbacks and pingbacks</a>.'); ?></p>
+</div>
+</div>
 
+<div id="pagepassworddiv" class="postbox <?php echo postbox_classes('pagepassworddiv', 'page'); ?>">
+<h3><?php _e('Password Protect This Page') ?></h3>
+<div class="inside">
+<p><input name="post_password" type="text" size="25" id="post_password" value="<?php echo attribute_escape( $post->post_password ); ?>" /></p>
+<p><?php _e('Setting a password will require people who visit your blog to enter the above password to view this page and its comments.'); ?></p>
+</div>
+</div>
+
+<div id="pageslugdiv" class="postbox <?php echo postbox_classes('pageslugdiv', 'page'); ?>">
+<h3><?php _e('Page Slug') ?></h3>
+<div class="inside">
+<input name="post_name" type="text" size="13" id="post_name" value="<?php echo attribute_escape( $post->post_name ); ?>" />
+</div>
 </div>
 
-<?php if ('edit' == $action) :
-	$delete_nonce = wp_create_nonce( 'delete-page_' . $post_ID );
-	if ( current_user_can('delete_page', $post->ID) ) ?>
-		<input name="deletepost" class="button delete" type="submit" id="deletepost" tabindex="10" value="<?php _e('Delete this page') ?>" <?php echo "onclick=\"if ( confirm('" . js_escape(sprintf(__("You are about to delete this page '%s'\n  'Cancel' to stop, 'OK' to delete."), $post->post_title )) . "') ) { document.forms.post._wpnonce.value = '$delete_nonce'; return true;}return false;\""; ?> />
+<div id="pageparentdiv" class="postbox <?php echo postbox_classes('pageparentdiv', 'page'); ?>">
+<h3><?php _e('Page Parent') ?></h3>
+<div class="inside">
+<select name="parent_id">
+<option value='0'><?php _e('Main Page (no parent)'); ?></option>
+<?php parent_dropdown($post->post_parent); ?>
+</select>
+<p><?php _e('You can arrange your pages in hierarchies, for example you could have an &#8220;About&#8221; page that has &#8220;Life Story&#8221; and &#8220;My Dog&#8221; pages under it. There are no limits to how deeply nested you can make pages.'); ?></p>
+</div>
+</div>
+
+<?php if ( 0 != count( get_page_templates() ) ) { ?>
+<div id="pagetemplatediv" class="postbox <?php echo postbox_classes('pagetemplatediv', 'page'); ?>">
+<h3><?php _e('Page Template') ?></h3>
+<div class="inside">
+<select name="page_template">
+<option value='default'><?php _e('Default Template'); ?></option>
+<?php page_template_dropdown($post->page_template); ?>
+</select>
+<p><?php _e('Some themes have custom templates you can use for certain pages that might have additional features or custom layouts. If so, you&#8217;ll see them above.'); ?></p>
+</div>
+</div>
+<?php } ?>
+
+<div id="pageorderdiv" class="postbox <?php echo postbox_classes('pageorderdiv', 'page'); ?>">
+<h3><?php _e('Page Order') ?></h3>
+<div class="inside">
+<p><input name="menu_order" type="text" size="4" id="menu_order" value="<?php echo $post->menu_order ?>" /></p>
+<p><?php _e('Pages are usually ordered alphabetically, but you can put a number above to change the order pages appear in. (We know this is a little janky, it&#8217;ll be better in future releases.)'); ?></p>
+</div>
+</div>
+
+<?php
+$authors = get_editable_user_ids( $current_user->id ); // TODO: ROLE SYSTEM
+if ( $post->post_author && !in_array($post->post_author, $authors) )
+	$authors[] = $post->post_author;
+if ( $authors && count( $authors ) > 1 ) :
+?>
+<div id="pageauthordiv" class="postbox <?php echo postbox_classes('pageauthordiv', 'page'); ?>">
+<h3><?php _e('Page Author'); ?></h3>
+<div class="inside">
+<?php wp_dropdown_users( array('include' => $authors, 'name' => 'post_author_override', 'selected' => empty($post_ID) ? $user_ID : $post->post_author) ); ?>
+</div>
+</div>
 <?php endif; ?>
+
+<?php do_meta_boxes('page', 'advanced', $post); ?>
+
+</div>
+</div>
+
 </div>
 
 </form>
 
-</div>
+<script type="text/javascript">
+try{document.post.title.focus();}catch(e){}
+</script>
diff -x .svn -aruN 2.2.2.src/wp-admin/edit-pages.php 2.5.src/wp-admin/edit-pages.php
--- 2.2.2.src/wp-admin/edit-pages.php	2007-02-21 19:59:33.000000000 -0600
+++ 2.5.src/wp-admin/edit-pages.php	2008-03-23 02:10:17.000000000 -0500
@@ -1,61 +1,212 @@
 <?php
 require_once('admin.php');
+
+// Handle bulk deletes
+if ( isset($_GET['deleteit']) && isset($_GET['delete']) ) {
+	check_admin_referer('bulk-pages');
+	foreach( (array) $_GET['delete'] as $post_id_del ) {
+		$post_del = & get_post($post_id_del);
+
+		if ( !current_user_can('delete_page', $post_id_del) )
+			wp_die( __('You are not allowed to delete this page.') );
+
+		if ( $post_del->post_type == 'attachment' ) {
+			if ( ! wp_delete_attachment($post_id_del) )
+				wp_die( __('Error in deleting...') );
+		} else {
+			if ( !wp_delete_post($post_id_del) )
+				wp_die( __('Error in deleting...') );
+		}
+	}
+
+	$sendback = wp_get_referer();
+	if (strpos($sendback, 'page.php') !== false) $sendback = get_option('siteurl') .'/wp-admin/page-new.php';
+	elseif (strpos($sendback, 'attachments.php') !== false) $sendback = get_option('siteurl') .'/wp-admin/attachments.php';
+	$sendback = preg_replace('|[^a-z0-9-~+_.?#=&;,/:]|i', '', $sendback);
+
+	wp_redirect($sendback);
+	exit();
+} elseif ( !empty($_GET['_wp_http_referer']) ) {
+	 wp_redirect(remove_query_arg(array('_wp_http_referer', '_wpnonce'), stripslashes($_SERVER['REQUEST_URI'])));
+	 exit;
+}
+
 $title = __('Pages');
 $parent_file = 'edit.php';
-wp_enqueue_script( 'listman' );
+wp_enqueue_script('admin-forms');
+
+$post_stati  = array(	//	array( adj, noun )
+		'publish' => array(__('Published'), __('Published pages'), __ngettext_noop('Published (%s)', 'Published (%s)')),
+		'future' => array(__('Scheduled'), __('Scheduled pages'), __ngettext_noop('Scheduled (%s)', 'Scheduled (%s)')),
+		'pending' => array(__('Pending Review'), __('Pending pages'), __ngettext_noop('Pending Review (%s)', 'Pending Review (%s)')),
+		'draft' => array(__('Draft'), _c('Drafts|manage posts header'), __ngettext_noop('Draft (%s)', 'Drafts (%s)')),
+		'private' => array(__('Private'), __('Private pages'), __ngettext_noop('Private (%s)', 'Private (%s)'))
+	);
+
+$post_status_label = __('Manage Pages');
+$post_status_q = '';
+if ( isset($_GET['post_status']) && in_array( $_GET['post_status'], array_keys($post_stati) ) ) {
+	$post_status_label = $post_stati[$_GET['post_status']][1];
+	$post_status_q = '&post_status=' . $_GET['post_status'];
+	$post_status_q .= '&perm=readable';
+}
+
+$query_str = "post_type=page&orderby=menu_order title&what_to_show=posts$post_status_q&posts_per_page=-1&posts_per_archive_page=-1&order=asc";
+
+$query_str = apply_filters('manage_pages_query', $query_str);
+wp($query_str);
+
+if ( is_singular() )
+	wp_enqueue_script( 'admin-comments' );
 require_once('admin-header.php');
-?>
 
+?>
 <div class="wrap">
-<h2><?php _e('Page Management'); ?></h2>
-<p><?php _e('Pages are like posts except they live outside of the normal blog chronology and can be hierarchical. You can use pages to organize and manage any amount of content.'); ?> <a href="page-new.php"><?php _e('Create a new page &raquo;'); ?></a></p>
+<form id="posts-filter" action="" method="get">
+<h2><?php
+// Use $_GET instead of is_ since they can override each other
+$h2_search = isset($_GET['s']) && $_GET['s'] ? ' ' . sprintf(__('matching &#8220;%s&#8221;'), wp_specialchars( stripslashes( $_GET['s'] ) ) ) : '';
+$h2_author = '';
+if ( isset($_GET['author']) && $_GET['author'] ) {
+	$author_user = get_userdata( (int) $_GET['author'] );
+	$h2_author = ' ' . sprintf(__('by %s'), wp_specialchars( $author_user->display_name ));
+}
+printf( _c( '%1$s%2$s%3$s|You can reorder these: 1: Pages, 2: by {s}, 3: matching {s}' ), $post_status_label, $h2_author, $h2_search );
+?></h2>
 
-<form name="searchform" action="" method="get">
-	<fieldset>
-	<legend><?php _e('Search Pages&hellip;') ?></legend>
-	<input type="text" name="s" value="<?php if (isset($_GET['s'])) echo attribute_escape($_GET['s']); ?>" size="17" />
-	<input type="submit" name="submit" value="<?php _e('Search') ?>"  />
-	</fieldset>
-</form>
+<ul class="subsubsub">
+<?php
+
+$avail_post_stati = get_available_post_statuses('page');
 
+$status_links = array();
+$num_posts = wp_count_posts('page', 'readable');
+$class = empty($_GET['post_status']) ? ' class="current"' : '';
+$status_links[] = "<li><a href=\"edit-pages.php\"$class>".__('All Pages')."</a>";
+foreach ( $post_stati as $status => $label ) {
+	$class = '';
+
+	if ( !in_array($status, $avail_post_stati) )
+		continue;
+
+	if ( $status == $_GET['post_status'] )
+		$class = ' class="current"';
+
+	$status_links[] = "<li><a href=\"edit-pages.php?post_status=$status\"$class>" .
+	sprintf(__ngettext($label[2][0], $label[2][1], $num_posts->$status), number_format_i18n( $num_posts->$status ) ) . '</a>';
+}
+echo implode(' |</li>', $status_links) . '</li>';
+unset($status_links);
+?>
+</ul>
+
+<?php if ( isset($_GET['post_status'] ) ) : ?>
+<input type="hidden" name="post_status" value="<?php echo attribute_escape($_GET['post_status']) ?>" />
 <?php
-wp('post_type=page&orderby=menu_order&what_to_show=posts&posts_per_page=-1&posts_per_archive_page=-1&order=asc');
+endif;
+if ( isset($_GET['posted']) && $_GET['posted'] ) : $_GET['posted'] = (int) $_GET['posted']; ?>
+<div id="message" class="updated fade"><p><strong><?php _e('Your page has been saved.'); ?></strong> <a href="<?php echo get_permalink( $_GET['posted'] ); ?>"><?php _e('View page'); ?></a> | <a href="page.php?action=edit&amp;post=<?php echo $_GET['posted']; ?>"><?php _e('Edit page'); ?></a></p></div>
+<?php $_SERVER['REQUEST_URI'] = remove_query_arg(array('posted'), $_SERVER['REQUEST_URI']);
+endif;
+?>
 
-if ( $_GET['s'] )
-	$all = false;
-else
-	$all = true;
+<p id="post-search">
+	<input type="text" id="post-search-input" name="s" value="<?php echo attribute_escape(stripslashes($_GET['s'])); ?>" />
+	<input type="submit" value="<?php _e( 'Search Pages' ); ?>" class="button" />
+</p>
+
+<div class="tablenav">
+
+<div class="alignleft">
+<input type="submit" value="<?php _e('Delete'); ?>" name="deleteit" class="button-secondary delete" />
+<?php wp_nonce_field('bulk-pages'); ?>
+</div>
+
+<br class="clear" />
+</div>
+
+<br class="clear" />
+
+<?php
+
+$all = !( $h2_search || $post_status_q );
 
 if ($posts) {
 ?>
-<table class="widefat"> 
+<table class="widefat">
   <thead>
   <tr>
-    <th scope="col" style="text-align: center"><?php _e('ID') ?></th>
-    <th scope="col"><?php _e('Title') ?></th>
-    <th scope="col"><?php _e('Owner') ?></th>
-	<th scope="col"><?php _e('Updated') ?></th>
-	<th scope="col" colspan="3" style="text-align: center"><?php _e('Action'); ?></th>
+<?php $posts_columns = wp_manage_pages_columns(); ?>
+<?php foreach($posts_columns as $post_column_key => $column_display_name) {
+	if ( 'cb' === $post_column_key )
+		$class = ' class="check-column"';
+	elseif ( 'comments' === $post_column_key )
+		$class = ' class="num"';
+	else
+		$class = '';
+?>
+	<th scope="col"<?php echo $class; ?>><?php echo $column_display_name; ?></th>
+<?php } ?>
   </tr>
   </thead>
-  <tbody id="the-list">
-<?php
-page_rows(0, 0, $posts, $all);
-?>
+  <tbody>
+  <?php page_rows($posts); ?>
   </tbody>
 </table>
 
+</form>
+
 <div id="ajax-response"></div>
 
 <?php
 } else {
 ?>
-<p><?php _e('No pages yet.') ?></p>
+</form>
+<p><?php _e('No pages found.') ?></p>
 <?php
 } // end if ($posts)
 ?>
 
-<h3><a href="page-new.php"><?php _e('Create New Page &raquo;'); ?></a></h3>
+<div class="tablenav">
+<br class="clear" />
+</div>
+
+<?php
+
+if ( 1 == count($posts) && is_singular() ) :
+
+	$comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_post_ID = $id AND comment_approved != 'spam' ORDER BY comment_date");
+	if ( $comments ) :
+		// Make sure comments, post, and post_author are cached
+		update_comment_cache($comments);
+		$post = get_post($id);
+		$authordata = get_userdata($post->post_author);
+	?>
+
+<br class="clear" />
+
+<table class="widefat" style="margin-top: .5em">
+<thead>
+  <tr>
+    <th scope="col"><?php _e('Comment') ?></th>
+    <th scope="col"><?php _e('Date') ?></th>
+    <th scope="col"><?php _e('Actions') ?></th>
+  </tr>
+</thead>
+<tbody id="the-comment-list" class="list:comment">
+<?php
+	foreach ($comments as $comment)
+		_wp_comment_row( $comment->comment_ID, 'detail', false, false );
+?>
+</tbody>
+</table>
+
+<?php
+
+endif; // comments
+endif; // posts;
+
+?>
 
 </div>
 
diff -x .svn -aruN 2.2.2.src/wp-admin/edit-post-rows.php 2.5.src/wp-admin/edit-post-rows.php
--- 2.2.2.src/wp-admin/edit-post-rows.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/edit-post-rows.php	2008-03-20 16:40:17.000000000 -0500
@@ -0,0 +1,198 @@
+<?php if ( ! defined('ABSPATH') ) die(); ?>
+<table class="widefat">
+	<thead>
+	<tr>
+
+<?php $posts_columns = wp_manage_posts_columns(); ?>
+<?php foreach($posts_columns as $post_column_key => $column_display_name) {
+	if ( 'cb' === $post_column_key )
+		$class = ' class="check-column"';
+	elseif ( 'comments' === $post_column_key )
+		$class = ' class="num"';
+	else
+		$class = '';
+?>
+	<th scope="col"<?php echo $class; ?>><?php echo $column_display_name; ?></th>
+<?php } ?>
+
+	</tr>
+	</thead>
+	<tbody>
+<?php
+if ( have_posts() ) {
+$bgcolor = '';
+add_filter('the_title','wp_specialchars');
+while (have_posts()) : the_post();
+$class = 'alternate' == $class ? '' : 'alternate';
+global $current_user;
+$post_owner = ( $current_user->ID == $post->post_author ? 'self' : 'other' );
+$title = get_the_title();
+if ( empty($title) )
+	$title = __('(no title)');
+?>
+	<tr id='post-<?php echo $id; ?>' class='<?php echo trim( $class . ' author-' . $post_owner . ' status-' . $post->post_status ); ?>' valign="top">
+
+<?php
+
+foreach($posts_columns as $column_name=>$column_display_name) {
+
+	switch($column_name) {
+
+	case 'cb':
+		?>
+		<th scope="row" class="check-column"><?php if ( current_user_can( 'edit_post', $post->ID ) ) { ?><input type="checkbox" name="delete[]" value="<?php the_ID(); ?>" /><?php } ?></th>
+		<?php
+		break;
+	case 'modified':
+	case 'date':
+		if ( '0000-00-00 00:00:00' == $post->post_date && 'date' == $column_name ) {
+			$t_time = $h_time = __('Unpublished');
+		} else {
+			if ( 'modified' == $column_name ) {
+				$t_time = get_the_modified_time(__('Y/m/d g:i:s A'));
+				$m_time = $post->post_modified;
+				$time = get_post_modified_time('G', true);
+			} else {
+				$t_time = get_the_time(__('Y/m/d g:i:s A'));
+				$m_time = $post->post_date;
+				$time = get_post_time('G', true);
+			}
+			if ( ( abs(time() - $time) ) < 86400 ) {
+				if ( ( 'future' == $post->post_status) )
+					$h_time = sprintf( __('%s from now'), human_time_diff( $time ) );
+				else
+					$h_time = sprintf( __('%s ago'), human_time_diff( $time ) );
+			} else {
+				$h_time = mysql2date(__('Y/m/d'), $m_time);
+			}
+		}
+		?>
+		<td><abbr title="<?php echo $t_time ?>"><?php echo $h_time ?></abbr></td>
+		<?php
+		break;
+	case 'title':
+		?>
+		<td><strong><?php if ( current_user_can( 'edit_post', $post->ID ) ) { ?><a class="row-title" href="post.php?action=edit&amp;post=<?php the_ID(); ?>" title="<?php echo attribute_escape(sprintf(__('Edit "%s"'), $title)); ?>"><?php echo $title ?></a><?php } else { echo $title; } ?></strong>
+		<?php if ( !empty($post->post_password) ) { _e(' &#8212; <strong>Protected</strong>'); } elseif ('private' == $post->post_status) { _e(' &#8212; <strong>Private</strong>'); } ?></td>
+		<?php
+		break;
+
+	case 'categories':
+		?>
+		<td><?php
+		$categories = get_the_category();
+		if ( !empty( $categories ) ) {
+			$out = array();
+			foreach ( $categories as $c )
+				$out[] = "<a href='edit.php?category_name=$c->slug'> " . wp_specialchars(sanitize_term_field('name', $c->name, $c->term_id, 'category', 'display')) . "</a>";
+			echo join( ', ', $out );
+		} else {
+			_e('Uncategorized');
+		}
+		?></td>
+		<?php
+		break;
+
+	case 'tags':
+		?>
+		<td><?php
+		$tags = get_the_tags();
+		if ( !empty( $tags ) ) {
+			$out = array();
+			foreach ( $tags as $c )
+				$out[] = "<a href='edit.php?tag=$c->slug'> " . wp_specialchars(sanitize_term_field('name', $c->name, $c->term_id, 'post_tag', 'display')) . "</a>";
+			echo join( ', ', $out );
+		} else {
+			_e('No Tags');
+		}
+		?></td>
+		<?php
+		break;
+
+	case 'comments':
+		?>
+		<td class="num"><div class="post-com-count-wrapper">
+		<?php
+		$left = get_pending_comments_num( $post->ID );
+		$pending_phrase = sprintf( __('%s pending'), number_format( $left ) );
+		if ( $left )
+			echo '<strong>';
+		comments_number("<a href='edit.php?p=$id' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . __('0') . '</span></a>', "<a href='edit.php?p=$id' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . __('1') . '</span></a>', "<a href='edit.php?p=$id' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . __('%') . '</span></a>');
+		if ( $left )
+			echo '</strong>';
+		?>
+		</div></td>
+		<?php
+		break;
+
+	case 'author':
+		?>
+		<td><a href="edit.php?author=<?php the_author_ID(); ?>"><?php the_author() ?></a></td>
+		<?php
+		break;
+
+	case 'status':
+		?>
+		<td>
+		<a href="<?php the_permalink(); ?>" title="<?php echo attribute_escape(sprintf(__('View "%s"'), $title)); ?>" rel="permalink">
+		<?php
+		switch ( $post->post_status ) {
+			case 'publish' :
+			case 'private' :
+				_e('Published');
+				break;
+			case 'future' :
+				_e('Scheduled');
+				break;
+			case 'pending' :
+				_e('Pending Review');
+				break;
+			case 'draft' :
+				_e('Unpublished');
+				break;
+		}
+		?>
+		</a>
+		</td>
+		<?php
+		break;
+
+	case 'control_view':
+		?>
+		<td><a href="<?php the_permalink(); ?>" rel="permalink" class="view"><?php _e('View'); ?></a></td>
+		<?php
+		break;
+
+	case 'control_edit':
+		?>
+		<td><?php if ( current_user_can('edit_post',$post->ID) ) { echo "<a href='post.php?action=edit&amp;post=$id' class='edit'>" . __('Edit') . "</a>"; } ?></td>
+		<?php
+		break;
+
+	case 'control_delete':
+		?>
+		<td><?php if ( current_user_can('delete_post',$post->ID) ) { echo "<a href='" . wp_nonce_url("post.php?action=delete&amp;post=$id", 'delete-post_' . $post->ID) . "' class='delete'>" . __('Delete') . "</a>"; } ?></td>
+		<?php
+		break;
+
+	default:
+		?>
+		<td><?php do_action('manage_posts_custom_column', $column_name, $id); ?></td>
+		<?php
+		break;
+	}
+}
+?>
+	</tr>
+<?php
+endwhile;
+} else {
+?>
+  <tr style='background-color: <?php echo $bgcolor; ?>'>
+    <td colspan="8"><?php _e('No posts found.') ?></td>
+  </tr>
+<?php
+} // end if ( have_posts() )
+?>
+	</tbody>
+</table>
diff -x .svn -aruN 2.2.2.src/wp-admin/edit-tag-form.php 2.5.src/wp-admin/edit-tag-form.php
--- 2.2.2.src/wp-admin/edit-tag-form.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/edit-tag-form.php	2008-03-26 16:54:02.000000000 -0500
@@ -0,0 +1,41 @@
+<?php
+if ( ! empty($tag_ID) ) {
+	$heading = __('Edit Tag');
+	$submit_text = __('Edit Tag');
+	$form = '<form name="edittag" id="edittag" method="post" action="edit-tags.php" class="validate">';
+	$action = 'editedtag';
+	$nonce_action = 'update-tag_' . $tag_ID;
+	do_action('edit_tag_form_pre', $tag);
+} else {
+	$heading = __('Add Tag');
+	$submit_text = __('Add Tag');
+	$form = '<form name="addtag" id="addtag" method="post" action="edit-tags.php" class="add:the-list: validate">';
+	$action = 'addtag';
+	$nonce_action = 'add-tag';
+	do_action('add_tag_form_pre', $tag);
+}
+?>
+
+<div class="wrap">
+<h2><?php echo $heading ?></h2>
+<div id="ajax-response"></div>
+<?php echo $form ?>
+<input type="hidden" name="action" value="<?php echo $action ?>" />
+<input type="hidden" name="tag_ID" value="<?php echo $tag->term_id ?>" />
+<?php wp_original_referer_field(true, 'previous'); wp_nonce_field($nonce_action); ?>
+	<table class="form-table">
+		<tr class="form-field form-required">
+			<th scope="row" valign="top"><label for="name"><?php _e('Tag name') ?></label></th>
+			<td><input name="name" id="name" type="text" value="<?php echo attribute_escape($tag->name); ?>" size="40" />
+            <p><?php _e('The name is how the tag appears on your site.'); ?></p></td>
+		</tr>
+		<tr class="form-field">
+			<th scope="row" valign="top"><label for="slug"><?php _e('Tag slug') ?></label></th>
+			<td><input name="slug" id="slug" type="text" value="<?php echo attribute_escape($tag->slug); ?>" size="40" />
+            <p><?php _e('The &#8220;slug&#8221; is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens.'); ?></p></td>
+		</tr>
+	</table>
+<p class="submit"><input type="submit" class="button" name="submit" value="<?php echo $submit_text ?>" /></p>
+<?php do_action('edit_tag_form', $tag); ?>
+</form>
+</div>
diff -x .svn -aruN 2.2.2.src/wp-admin/edit-tags.php 2.5.src/wp-admin/edit-tags.php
--- 2.2.2.src/wp-admin/edit-tags.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/edit-tags.php	2008-03-26 16:54:02.000000000 -0500
@@ -0,0 +1,216 @@
+<?php
+require_once('admin.php');
+
+$title = __('Tags');
+$parent_file = 'edit.php';
+
+wp_reset_vars(array('action', 'tag'));
+
+if ( isset($_GET['deleteit']) && isset($_GET['delete_tags']) )
+	$action = 'bulk-delete';
+
+switch($action) {
+
+case 'addtag':
+
+	check_admin_referer('add-tag');
+
+	if ( !current_user_can('manage_categories') )
+		wp_die(__('Cheatin&#8217; uh?'));
+
+	$ret = wp_insert_term($_POST['name'], 'post_tag', $_POST);
+	if ( $ret && !is_wp_error( $ret ) ) {
+		wp_redirect('edit-tags.php?message=1#addtag');
+	} else {
+		wp_redirect('edit-tags.php?message=4#addtag');
+	}
+	exit;
+break;
+
+case 'delete':
+	$tag_ID = (int) $_GET['tag_ID'];
+	check_admin_referer('delete-tag_' .  $tag_ID);
+
+	if ( !current_user_can('manage_categories') )
+		wp_die(__('Cheatin&#8217; uh?'));
+
+	wp_delete_term( $tag_ID, 'post_tag');
+
+	wp_redirect('edit-tags.php?message=2');
+	exit;
+
+break;
+
+case 'bulk-delete':
+	check_admin_referer('bulk-tags');
+
+	if ( !current_user_can('manage_categories') )
+		wp_die(__('Cheatin&#8217; uh?'));
+
+	$tags = $_GET['delete_tags'];
+	foreach( (array) $tags as $tag_ID ) {
+		wp_delete_term( $tag_ID, 'post_tag');
+	}
+
+	$location = 'edit-tags.php';
+	if ( $referer = wp_get_referer() ) {
+		if ( false !== strpos($referer, 'edit-tags.php') )
+			$location = $referer;
+	}
+
+	$location = add_query_arg('message', 6, $location);
+	wp_redirect($location);
+	exit;
+
+break;
+
+case 'edit':
+
+	require_once ('admin-header.php');
+	$tag_ID = (int) $_GET['tag_ID'];
+
+	$tag = get_term($tag_ID, 'post_tag', OBJECT, 'edit');
+	include('edit-tag-form.php');
+
+break;
+
+case 'editedtag':
+	$tag_ID = (int) $_POST['tag_ID'];
+	check_admin_referer('update-tag_' . $tag_ID);
+
+	if ( !current_user_can('manage_categories') )
+		wp_die(__('Cheatin&#8217; uh?'));
+
+	$ret = wp_update_term($tag_ID, 'post_tag', $_POST);
+
+	$location = 'edit-tags.php';
+	if ( $referer = wp_get_original_referer() ) {
+		if ( false !== strpos($referer, 'edit-tags.php') )
+			$location = $referer;
+	}
+
+	if ( $ret && !is_wp_error( $ret ) )
+		$location = add_query_arg('message', 3, $location);
+	else
+		$location = add_query_arg('message', 5, $location);
+
+	wp_redirect($location);
+	exit;
+break;
+
+default:
+
+if ( !empty($_GET['_wp_http_referer']) ) {
+	 wp_redirect(remove_query_arg(array('_wp_http_referer', '_wpnonce'), stripslashes($_SERVER['REQUEST_URI'])));
+	 exit;
+}
+
+wp_enqueue_script( 'admin-tags' );
+wp_enqueue_script('admin-forms');
+
+require_once ('admin-header.php');
+
+$messages[1] = __('Tag added.');
+$messages[2] = __('Tag deleted.');
+$messages[3] = __('Tag updated.');
+$messages[4] = __('Tag not added.');
+$messages[5] = __('Tag not updated.');
+$messages[6] = __('Tags deleted.');
+?>
+
+<?php if (isset($_GET['message'])) : ?>
+<div id="message" class="updated fade"><p><?php echo $messages[$_GET['message']]; ?></p></div>
+<?php $_SERVER['REQUEST_URI'] = remove_query_arg(array('message'), $_SERVER['REQUEST_URI']);
+endif; ?>
+
+<div class="wrap">
+
+<form id="posts-filter" action="" method="get">
+<?php if ( current_user_can('manage_categories') ) : ?>
+	<h2><?php printf(__('Manage Tags (<a href="%s">add new</a>)'), '#addtag') ?> </h2>
+<?php else : ?>
+	<h2><?php _e('Manage Tags') ?> </h2>
+<?php endif; ?>
+
+<p id="post-search">
+	<input type="text" id="post-search-input" name="s" value="<?php echo attribute_escape(stripslashes($_GET['s'])); ?>" />
+	<input type="submit" value="<?php _e( 'Search Tags' ); ?>" class="button" />
+</p>
+
+<br class="clear" />
+
+<div class="tablenav">
+
+<?php
+$pagenum = absint( $_GET['pagenum'] );
+if ( empty($pagenum) )
+	$pagenum = 1;
+if( !$tagsperpage || $tagsperpage < 0 )
+	$tagsperpage = 20;
+
+$page_links = paginate_links( array(
+	'base' => add_query_arg( 'pagenum', '%#%' ),
+	'format' => '',
+	'total' => ceil(wp_count_terms('post_tag') / $tagsperpage),
+	'current' => $pagenum
+));
+
+if ( $page_links )
+	echo "<div class='tablenav-pages'>$page_links</div>";
+?>
+
+<div class="alignleft">
+<input type="submit" value="<?php _e('Delete'); ?>" name="deleteit" class="button-secondary delete" />
+<?php wp_nonce_field('bulk-tags'); ?>
+</div>
+
+<br class="clear" />
+</div>
+
+<br class="clear" />
+
+<table class="widefat">
+	<thead>
+	<tr>
+	<th scope="col" class="check-column"><input type="checkbox" onclick="checkAll(document.getElementById('posts-filter'));" /></th>
+        <th scope="col"><?php _e('Name') ?></th>
+        <th scope="col" class="num" style="width: 90px"><?php _e('Posts') ?></th>
+	</tr>
+	</thead>
+	<tbody id="the-list" class="list:tag">
+<?php
+
+$searchterms = trim( $_GET['s'] );
+
+$count = tag_rows( $pagenum, $tagsperpage, $searchterms );
+?>
+	</tbody>
+</table>
+</form>
+
+<div class="tablenav">
+
+<?php
+if ( $page_links )
+	echo "<div class='tablenav-pages'>$page_links</div>";
+?>
+<br class="clear" />
+</div>
+<br class="clear" />
+
+</div>
+
+<?php if ( current_user_can('manage_categories') ) : ?>
+
+<br />
+<?php include('edit-tag-form.php'); ?>
+
+<?php endif; ?>
+
+<?php
+break;
+}
+
+include('admin-footer.php');
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/edit.php 2.5.src/wp-admin/edit.php
--- 2.2.2.src/wp-admin/edit.php	2007-03-23 18:06:45.000000000 -0500
+++ 2.5.src/wp-admin/edit.php	2008-03-23 02:10:17.000000000 -0500
@@ -1,306 +1,239 @@
 <?php
 require_once('admin.php');
 
+// Handle bulk deletes
+if ( isset($_GET['deleteit']) && isset($_GET['delete']) ) {
+	check_admin_referer('bulk-posts');
+	foreach( (array) $_GET['delete'] as $post_id_del ) {
+		$post_del = & get_post($post_id_del);
+
+		if ( !current_user_can('delete_post', $post_id_del) )
+			wp_die( __('You are not allowed to delete this post.') );
+
+		if ( $post_del->post_type == 'attachment' ) {
+			if ( ! wp_delete_attachment($post_id_del) )
+				wp_die( __('Error in deleting...') );
+		} else {
+			if ( !wp_delete_post($post_id_del) )
+				wp_die( __('Error in deleting...') );
+		}
+	}
+
+	$sendback = wp_get_referer();
+	if (strpos($sendback, 'post.php') !== false) $sendback = get_option('siteurl') .'/wp-admin/post-new.php';
+	elseif (strpos($sendback, 'attachments.php') !== false) $sendback = get_option('siteurl') .'/wp-admin/attachments.php';
+	$sendback = preg_replace('|[^a-z0-9-~+_.?#=&;,/:]|i', '', $sendback);
+
+	wp_redirect($sendback);
+	exit();
+} elseif ( !empty($_GET['_wp_http_referer']) ) {
+	 wp_redirect(remove_query_arg(array('_wp_http_referer', '_wpnonce'), stripslashes($_SERVER['REQUEST_URI'])));
+	 exit;
+}
+
 $title = __('Posts');
 $parent_file = 'edit.php';
-wp_enqueue_script( 1 == $_GET['c'] ? 'admin-comments' : 'listman' );
-require_once('admin-header.php');
+wp_enqueue_script('admin-forms');
+
+list($post_stati, $avail_post_stati) = wp_edit_posts_query();
 
-$_GET['m'] = (int) $_GET['m'];
+if ( 1 == count($posts) && is_singular() )
+	wp_enqueue_script( 'admin-comments' );
+require_once('admin-header.php');
 
-$drafts = get_users_drafts( $user_ID );
-$other_drafts = get_others_drafts( $user_ID);
+if ( !isset( $_GET['paged'] ) )
+	$_GET['paged'] = 1;
 
-if ($drafts || $other_drafts) {
 ?>
+
 <div class="wrap">
-<?php if ($drafts) { ?>
-	<p><strong><?php _e('Your Drafts:') ?></strong>
-	<?php
-	$i = 0;
-	foreach ($drafts as $draft) {
-		if (0 != $i)
-			echo ', ';
-		$draft->post_title = apply_filters('the_title', stripslashes($draft->post_title));
-		if ($draft->post_title == '')
-			$draft->post_title = sprintf(__('Post #%s'), $draft->ID);
-		echo "<a href='post.php?action=edit&amp;post=$draft->ID' title='" . __('Edit this draft') . "'>$draft->post_title</a>";
-		++$i;
-		}
-	?>
-.</p>
-<?php } ?>
 
-<?php if ($other_drafts) { ?>
-	<p><strong><?php _e('Other&#8217;s Drafts:') ?></strong>
-	<?php
-	$i = 0;
-	foreach ($other_drafts as $draft) {
-		if (0 != $i)
-			echo ', ';
-		$draft->post_title = apply_filters('the_title', stripslashes($draft->post_title));
-		if ($draft->post_title == '')
-			$draft->post_title = sprintf(__('Post #%s'), $draft->ID);
-		echo "<a href='post.php?action=edit&amp;post=$draft->ID' title='" . __('Edit this draft') . "'>$draft->post_title</a>";
-		++$i;
+<form id="posts-filter" action="" method="get">
+<h2><?php
+if ( is_single() ) {
+	printf(__('Comments on %s'), apply_filters( "the_title", $post->post_title));
+} else {
+	$post_status_label = _c('Manage Posts|manage posts header');
+	if ( isset($_GET['post_status']) && in_array( $_GET['post_status'], array_keys($post_stati) ) )
+        $post_status_label = $post_stati[$_GET['post_status']][1];
+	if ( $post_listing_pageable && !is_archive() && !is_search() )
+		$h2_noun = is_paged() ? sprintf(__( 'Previous %s' ), $post_status_label) : sprintf(__('Latest %s'), $post_status_label);
+	else
+		$h2_noun = $post_status_label;
+	// Use $_GET instead of is_ since they can override each other
+	$h2_author = '';
+	$_GET['author'] = (int) $_GET['author'];
+	if ( $_GET['author'] != 0 ) {
+		if ( $_GET['author'] == '-' . $user_ID ) { // author exclusion
+			$h2_author = ' ' . __('by other authors');
+		} else {
+			$author_user = get_userdata( get_query_var( 'author' ) );
+			$h2_author = ' ' . sprintf(__('by %s'), wp_specialchars( $author_user->display_name ));
 		}
-	?>
-	.</p>
-
-<?php } ?>
-
-</div>
-<?php } ?>
+	}
+	$h2_search = isset($_GET['s'])   && $_GET['s']   ? ' ' . sprintf(__('matching &#8220;%s&#8221;'), wp_specialchars( get_search_query() ) ) : '';
+	$h2_cat    = isset($_GET['cat']) && $_GET['cat'] ? ' ' . sprintf( __('in &#8220;%s&#8221;'), single_cat_title('', false) ) : '';
+	$h2_tag    = isset($_GET['tag']) && $_GET['tag'] ? ' ' . sprintf( __('tagged with &#8220;%s&#8221;'), single_tag_title('', false) ) : '';
+	$h2_month  = isset($_GET['m'])   && $_GET['m']   ? ' ' . sprintf( __('during %s'), single_month_title(' ', false) ) : '';
+	printf( _c( '%1$s%2$s%3$s%4$s%5$s%6$s|You can reorder these: 1: Posts, 2: by {s}, 3: matching {s}, 4: in {s}, 5: tagged with {s}, 6: during {s}' ), $h2_noun, $h2_author, $h2_search, $h2_cat, $h2_tag, $h2_month );
+}
+?></h2>
 
-<div class="wrap">
-<h2>
+<ul class="subsubsub">
 <?php
+$status_links = array();
+$num_posts = wp_count_posts( 'post', 'readable' );
+$class = empty( $_GET['post_status'] ) ? ' class="current"' : '';
+$status_links[] = "<li><a href='edit.php' $class>" . __('All Posts') . '</a>';
+foreach ( $post_stati as $status => $label ) {
+	$class = '';
+
+	if ( !in_array( $status, $avail_post_stati ) )
+		continue;
+
+	if ( empty( $num_posts->$status ) )
+		continue;
+	if ( $status == $_GET['post_status'] )
+		$class = ' class="current"';
 
-wp('what_to_show=posts&posts_per_page=15&posts_per_archive_page=-1');
-
-if ( is_month() ) {
-	single_month_title(' ');
-} elseif ( is_search() ) {
-	printf(__('Search for &#8220;%s&#8221;'), wp_specialchars($_GET['s']) );
-} else {
-	if ( is_single() )
-		printf(__('Comments on %s'), apply_filters( "the_title", $post->post_title));
-	elseif ( ! is_paged() || get_query_var('paged') == 1 )
-		_e('Last 15 Posts');
-	else
-		_e('Previous Posts');
+	$status_links[] = "<li><a href='edit.php?post_status=$status' $class>" .
+	sprintf( __ngettext( $label[2][0], $label[2][1], $num_posts->$status ), number_format_i18n( $num_posts->$status ) ) . '</a>';
 }
+echo implode( ' |</li>', $status_links ) . '</li>';
+unset( $status_links );
 ?>
-</h2>
+</ul>
 
-<form name="searchform" id="searchform" action="" method="get">
-  <fieldset> 
-  <legend><?php _e('Search Posts&hellip;') ?></legend> 
-  <input type="text" name="s" value="<?php if (isset($s)) echo attribute_escape($s); ?>" size="17" /> 
-  <input type="submit" name="submit" value="<?php _e('Search') ?>" class="button" /> 
-  </fieldset>
-</form>
+<?php if ( isset($_GET['post_status'] ) ) : ?>
+<input type="hidden" name="post_status" value="<?php echo attribute_escape($_GET['post_status']) ?>" />
+<?php
+endif;
+
+if ( isset($_GET['posted']) && $_GET['posted'] ) : $_GET['posted'] = (int) $_GET['posted']; ?>
+<div id="message" class="updated fade"><p><strong><?php _e('Your post has been saved.'); ?></strong> <a href="<?php echo get_permalink( $_GET['posted'] ); ?>"><?php _e('View post'); ?></a> | <a href="post.php?action=edit&amp;post=<?php echo $_GET['posted']; ?>"><?php _e('Edit post'); ?></a></p></div>
+<?php $_SERVER['REQUEST_URI'] = remove_query_arg(array('posted'), $_SERVER['REQUEST_URI']);
+endif;
+?>
 
-<?php $arc_result = $wpdb->get_results("SELECT DISTINCT YEAR(post_date) AS yyear, MONTH(post_date) AS mmonth FROM $wpdb->posts WHERE post_type = 'post' ORDER BY post_date DESC");
+<p id="post-search">
+	<input type="text" id="post-search-input" name="s" value="<?php the_search_query(); ?>" />
+	<input type="submit" value="<?php _e( 'Search Posts' ); ?>" class="button" />
+</p>
 
-if ( count($arc_result) ) { ?>
+<div class="tablenav">
 
-<form name="viewarc" id="viewarc" action="" method="get">
-	<fieldset>
-	<legend><?php _e('Browse Month&hellip;') ?></legend>
-	<select name='m'>
-	<?php
-		foreach ($arc_result as $arc_row) {
-			if ( $arc_row->yyear == 0 )
-				continue;
-			$arc_row->mmonth = zeroise($arc_row->mmonth, 2);
-
-			if( isset($_GET['m']) && $arc_row->yyear . $arc_row->mmonth == (int) $_GET['m'] )
-				$default = 'selected="selected"';
-			else
-				$default = null;
-
-			echo "<option $default value='$arc_row->yyear$arc_row->mmonth'>";
-			echo $wp_locale->get_month($arc_row->mmonth) . " $arc_row->yyear";
-			echo "</option>\n";
-		}
-	?>
-	</select>
-		<input type="submit" name="submit" value="<?php _e('Show Month') ?>" class="button" /> 
-	</fieldset>
-</form>
+<?php
+$page_links = paginate_links( array(
+	'base' => add_query_arg( 'paged', '%#%' ),
+	'format' => '',
+	'total' => $wp_query->max_num_pages,
+	'current' => $_GET['paged']
+));
 
-<?php } ?>
+if ( $page_links )
+	echo "<div class='tablenav-pages'>$page_links</div>";
+?>
 
-<form name="viewcat" id="viewcat" action="" method="get">
-	<fieldset>
-	<legend><?php _e('Browse Category&hellip;') ?></legend>
-	<?php wp_dropdown_categories('show_option_all='.__('All').'&hide_empty=1&hierarchical=1&show_count=1&selected='.$cat);?>
-	<input type="submit" name="submit" value="<?php _e('Show Category') ?>" class="button" /> 
-	</fieldset>
-</form>
+<div class="alignleft">
+<input type="submit" value="<?php _e('Delete'); ?>" name="deleteit" class="button-secondary delete" />
+<?php wp_nonce_field('bulk-posts'); ?>
+<?php
+if ( !is_singular() ) {
+$arc_query = "SELECT DISTINCT YEAR(post_date) AS yyear, MONTH(post_date) AS mmonth FROM $wpdb->posts WHERE post_type = 'post' ORDER BY post_date DESC";
 
-<?php do_action('restrict_manage_posts'); ?>
+$arc_result = $wpdb->get_results( $arc_query );
 
-<br style="clear:both;" />
+$month_count = count($arc_result);
 
+if ( $month_count && !( 1 == $month_count && 0 == $arc_result[0]->mmonth ) ) { ?>
+<select name='m'>
+<option<?php selected( @$_GET['m'], 0 ); ?> value='0'><?php _e('Show all dates'); ?></option>
 <?php
-// define the columns to display, the syntax is 'internal name' => 'display name'
-$posts_columns = array(
-	'id'         => '<div style="text-align: center">' . __('ID') . '</div>',
-	'date'       => __('When'),
-	'title'      => __('Title'),
-	'categories' => __('Categories'),
-	'comments'   => '<div style="text-align: center">' . __('Comments') . '</div>',
-	'author'     => __('Author')
-);
-$posts_columns = apply_filters('manage_posts_columns', $posts_columns);
-
-// you can not edit these at the moment
-$posts_columns['control_view']   = '';
-$posts_columns['control_edit']   = '';
-$posts_columns['control_delete'] = '';
+foreach ($arc_result as $arc_row) {
+	if ( $arc_row->yyear == 0 )
+		continue;
+	$arc_row->mmonth = zeroise( $arc_row->mmonth, 2 );
 
+	if ( $arc_row->yyear . $arc_row->mmonth == $_GET['m'] )
+		$default = ' selected="selected"';
+	else
+		$default = '';
+
+	echo "<option$default value='$arc_row->yyear$arc_row->mmonth'>";
+	echo $wp_locale->get_month($arc_row->mmonth) . " $arc_row->yyear";
+	echo "</option>\n";
+}
 ?>
+</select>
+<?php } ?>
 
-<table class="widefat">
-	<thead>
-	<tr>
+<?php wp_dropdown_categories('show_option_all='.__('View all categories').'&hide_empty=1&hierarchical=1&show_count=1&selected='.$cat);?>
+<?php do_action('restrict_manage_posts'); ?>
+<input type="submit" id="post-query-submit" value="<?php _e('Filter'); ?>" class="button-secondary" />
 
-<?php foreach($posts_columns as $column_display_name) { ?>
-	<th scope="col"><?php echo $column_display_name; ?></th>
 <?php } ?>
+</div>
 
-	</tr>
-	</thead>
-	<tbody id="the-list">
-<?php
-if ($posts) {
-$bgcolor = '';
-while (have_posts()) : the_post();
-add_filter('the_title','wp_specialchars');
-$class = ('alternate' == $class) ? '' : 'alternate';
-?>
-	<tr id='post-<?php echo $id; ?>' class='<?php echo $class; ?>'>
+<br class="clear" />
+</div>
 
-<?php
+<br class="clear" />
 
-foreach($posts_columns as $column_name=>$column_display_name) {
+<?php include( 'edit-post-rows.php' ); ?>
 
-	switch($column_name) {
+</form>
+
+<div id="ajax-response"></div>
+
+<div class="tablenav">
 
-	case 'id':
-		?>
-		<th scope="row" style="text-align: center"><?php echo $id ?></th>
-		<?php
-		break;
-
-	case 'date':
-		?>
-		<td><?php if ( '0000-00-00 00:00:00' ==$post->post_modified ) _e('Unpublished'); else the_time(__('Y-m-d \<\b\r \/\> g:i:s a')); ?></td>
-		<?php
-		break;
-	case 'title':
-		?>
-		<td><?php the_title() ?>
-		<?php if ('private' == $post->post_status) _e(' - <strong>Private</strong>'); ?></td>
-		<?php
-		break;
-
-	case 'categories':
-		?>
-		<td><?php the_category(','); ?></td>
-		<?php
-		break;
-
-	case 'comments':
-		?>
-		<td style="text-align: center">
-			<?php comments_number(__('0'), "<a href='edit.php?p=$id&amp;c=1'>" . __('1') . '</a>', "<a href='edit.php?p=$id&amp;c=1'>" . __('%') . '</a>') ?>
-			</td>
-		<?php
-		break;
-
-	case 'author':
-		?>
-		<td><?php the_author() ?></td>
-		<?php
-		break;
-
-	case 'control_view':
-		?>
-		<td><a href="<?php the_permalink(); ?>" rel="permalink" class="edit"><?php _e('View'); ?></a></td>
-		<?php
-		break;
-
-	case 'control_edit':
-		?>
-		<td><?php if ( current_user_can('edit_post',$post->ID) ) { echo "<a href='post.php?action=edit&amp;post=$id' class='edit'>" . __('Edit') . "</a>"; } ?></td>
-		<?php
-		break;
-
-	case 'control_delete':
-		?>
-		<td><?php if ( current_user_can('delete_post',$post->ID) ) { echo "<a href='" . wp_nonce_url("post.php?action=delete&amp;post=$id", 'delete-post_' . $post->ID) . "' class='delete' onclick=\"return deleteSomething( 'post', " . $id . ", '" . js_escape(sprintf(__("You are about to delete this post '%s'.\n'OK' to delete, 'Cancel' to stop."), get_the_title())) . "' );\">" . __('Delete') . "</a>"; } ?></td>
-		<?php
-		break;
-
-	default:
-		?>
-		<td><?php do_action('manage_posts_custom_column', $column_name, $id); ?></td>
-		<?php
-		break;
-	}
-}
-?>
-	</tr> 
-<?php
-endwhile;
-} else {
-?>
-  <tr style='background-color: <?php echo $bgcolor; ?>'> 
-    <td colspan="8"><?php _e('No posts found.') ?></td> 
-  </tr> 
 <?php
-} // end if ($posts)
+if ( $page_links )
+	echo "<div class='tablenav-pages'>$page_links</div>";
 ?>
-	</tbody>
-</table>
-
-<div id="ajax-response"></div>
 
-<div class="navigation">
-<div class="alignleft"><?php next_posts_link(__('&laquo; Previous Entries')) ?></div>
-<div class="alignright"><?php previous_posts_link(__('Next Entries &raquo;')) ?></div>
+<br class="clear" />
 </div>
 
+<br class="clear" />
+
 <?php
-if ( 1 == count($posts) ) {
+
+if ( 1 == count($posts) && is_singular() ) :
 
 	$comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_post_ID = $id AND comment_approved != 'spam' ORDER BY comment_date");
-	if ($comments) {
+	if ( $comments ) :
+		// Make sure comments, post, and post_author are cached
+		update_comment_cache($comments);
+		$post = get_post($id);
+		$authordata = get_userdata($post->post_author);
 	?>
-<h3 id="comments"><?php _e('Comments') ?></h3>
-<ol id="the-comment-list" class="commentlist">
-<?php
-$i = 0;
-foreach ($comments as $comment) {
-
-		++$i; $class = '';
-		$authordata = get_userdata($wpdb->get_var("SELECT post_author FROM $wpdb->posts WHERE ID = $comment->comment_post_ID"));
-			$comment_status = wp_get_comment_status($comment->comment_ID);
-			if ('unapproved' == $comment_status)
-				$class .= ' unapproved';
-			if ($i % 2)
-				$class .= ' alternate';
-			echo "<li id='comment-$comment->comment_ID' class='$class'>";
-?>
-<p><strong><?php comment_author() ?></strong> <?php if ($comment->comment_author_email) { ?>| <?php comment_author_email_link() ?> <?php } if ($comment->comment_author_url && 'http://' != $comment->comment_author_url) { ?> | <?php comment_author_url_link() ?> <?php } ?>| <?php _e('IP:') ?> <a href="http://ws.arin.net/cgi-bin/whois.pl?queryinput=<?php comment_author_IP() ?>"><?php comment_author_IP() ?></a></p>
 
-<?php comment_text() ?>
+<br class="clear" />
 
-<p><?php comment_date(__('M j, g:i A'));  ?> &#8212; [
+<table class="widefat" style="margin-top: .5em">
+<thead>
+  <tr>
+    <th scope="col"><?php _e('Comment') ?></th>
+    <th scope="col"><?php _e('Date') ?></th>
+    <th scope="col"><?php _e('Actions') ?></th>
+  </tr>
+</thead>
+<tbody id="the-comment-list" class="list:comment">
 <?php
-if ( current_user_can('edit_post', $comment->comment_post_ID) ) {
-	echo " <a href='comment.php?action=editcomment&amp;c=".$comment->comment_ID."'>" .  __('Edit') . '</a>';
-	echo ' | <a href="' . wp_nonce_url('comment.php?action=deletecomment&amp;p=' . $comment->comment_post_ID . '&amp;c=' . $comment->comment_ID, 'delete-comment_' . $comment->comment_ID) . '" onclick="return deleteSomething( \'comment\', ' . $comment->comment_ID . ', \'' . js_escape(sprintf(__("You are about to delete this comment by '%s'.\n'Cancel' to stop, 'OK' to delete."), $comment->comment_author)) . "', theCommentList );\">" . __('Delete') . '</a> ';
-	if ( ('none' != $comment_status) && ( current_user_can('moderate_comments') ) ) {
-		echo '<span class="unapprove"> | <a href="' . wp_nonce_url('comment.php?action=unapprovecomment&amp;p=' . $comment->comment_post_ID . '&amp;c=' . $comment->comment_ID, 'unapprove-comment_' . $comment->comment_ID) . '" onclick="return dimSomething( \'comment\', ' . $comment->comment_ID . ', \'unapproved\', theCommentList );">' . __('Unapprove') . '</a> </span>';
-		echo '<span class="approve"> | <a href="' . wp_nonce_url('comment.php?action=approvecomment&amp;p=' . $comment->comment_post_ID . '&amp;c=' . $comment->comment_ID, 'approve-comment_' . $comment->comment_ID) . '" onclick="return dimSomething( \'comment\', ' . $comment->comment_ID . ', \'unapproved\', theCommentList );">' . __('Approve') . '</a> </span>';
-	}
-	echo " | <a href=\"" . wp_nonce_url("comment.php?action=deletecomment&amp;dt=spam&amp;p=" . $comment->comment_post_ID . "&amp;c=" . $comment->comment_ID, 'delete-comment_' . $comment->comment_ID) . "\" onclick=\"return deleteSomething( 'comment-as-spam', $comment->comment_ID, '" . js_escape(sprintf(__("You are about to mark as spam this comment by '%s'.\n'Cancel' to stop, 'OK' to mark as spam."), $comment->comment_author))  . "', theCommentList );\">" . __('Spam') . "</a> ";
-}
+	foreach ($comments as $comment)
+		_wp_comment_row( $comment->comment_ID, 'detail', false, false );
 ?>
-</p>
-		</li>
+</tbody>
+</table>
 
-<?php //end of the loop, don't delete
-		} // end foreach
-	echo '</ol>';
-	}//end if comments
-	?>
-<?php } ?>
-</div>
 <?php
- include('admin-footer.php');
+
+endif; // comments
+endif; // posts;
+
 ?>
+
+</div>
+
+<?php include('admin-footer.php'); ?>
diff -x .svn -aruN 2.2.2.src/wp-admin/export.php 2.5.src/wp-admin/export.php
--- 2.2.2.src/wp-admin/export.php	2007-08-03 09:51:20.000000000 -0500
+++ 2.5.src/wp-admin/export.php	2008-03-09 17:14:49.000000000 -0500
@@ -1,31 +1,33 @@
 <?php
 require_once ('admin.php');
+require_once('includes/export.php');
 $title = __('Export');
 $parent_file = 'edit.php';
 
-if ( isset( $_GET['download'] ) )
-	export_wp();
+if ( isset( $_GET['download'] ) ) {
+	export_wp( $_GET['author'] );
+	die();
+}
 
 require_once ('admin-header.php');
 ?>
 
 <div class="wrap">
 <h2><?php _e('Export'); ?></h2>
-<div class="narrow">
 <p><?php _e('When you click the button below WordPress will create an XML file for you to save to your computer.'); ?></p>
-<p><?php _e('This format, which we call WordPress eXtended RSS or WXR, will contain your posts, comments, custom fields, and categories.'); ?></p>
+<p><?php _e('This format, which we call WordPress eXtended RSS or WXR, will contain your posts, pages, comments, custom fields, categories, and tags.'); ?></p>
 <p><?php _e('Once you&#8217;ve saved the download file, you can use the Import function on another WordPress blog to import this blog.'); ?></p>
 <form action="" method="get">
-<h3><?php _e('Optional options'); ?></h3>
+<h3><?php _e('Options'); ?></h3>
 
-<table>
+<table class="form-table">
 <tr>
-<th><?php _e('Restrict Author:'); ?></th>
+<th><?php _e('Restrict Author'); ?></th>
 <td>
 <select name="author">
-<option value="all" selected="selected"><?php _e('All'); ?></option>
+<option value="all" selected="selected"><?php _e('All Authors'); ?></option>
 <?php
-$authors = $wpdb->get_col( "SELECT post_author FROM $wpdb->posts GROUP BY post_author" );  
+$authors = $wpdb->get_col( "SELECT post_author FROM $wpdb->posts GROUP BY post_author" );
 foreach ( $authors as $id ) {
 	$o = get_userdata( $id );
 	echo "<option value='$o->ID'>$o->display_name</option>";
@@ -35,193 +37,14 @@
 </td>
 </tr>
 </table>
-<p class="submit"><input type="submit" name="submit" value="<?php _e('Download Export File'); ?> &raquo;" />
+<p class="submit"><input type="submit" name="submit" value="<?php _e('Download Export File'); ?>" />
 <input type="hidden" name="download" value="true" />
 </p>
 </form>
 </div>
-</div>
 
 <?php
 
-function export_wp() {
-global $wpdb, $posts, $post;
-
-$filename = 'wordpress.' . date('Y-m-d') . '.xml';
-
-header('Content-Description: File Transfer');
-header("Content-Disposition: attachment; filename=$filename");
-header('Content-type: text/xml; charset=' . get_option('blog_charset'), true);
-
-$where = '';
-if ( isset( $_GET['author'] ) && $_GET['author'] != 'all' ) {
-	$author_id = (int) $_GET['author'];
-	$where = " WHERE post_author = '$author_id' ";
-}
-
-$posts = $wpdb->get_results("SELECT * FROM $wpdb->posts $where ORDER BY post_date_gmt ASC");
-
-$categories = (array) $wpdb->get_results("SELECT cat_ID, cat_name, category_nicename, category_description, category_parent, posts_private, links_private FROM $wpdb->categories LEFT JOIN $wpdb->post2cat ON (category_id = cat_id) LEFT JOIN $wpdb->posts ON (post_id <=> id) $where GROUP BY cat_id");
-
-function wxr_missing_parents($categories) {
-	if ( !is_array($categories) || empty($categories) )
-		return array();
-
-	foreach ( $categories as $category )
-		$parents[$category->cat_ID] = $category->category_parent;
-
-	$parents = array_unique(array_diff($parents, array_keys($parents)));
-
-	if ( $zero = array_search('0', $parents) )
-		unset($parents[$zero]);
-
-	return $parents;
-}
-
-while ( $parents = wxr_missing_parents($categories) ) {
-	$found_parents = $wpdb->get_results("SELECT cat_ID, cat_name, category_nicename, category_description, category_parent, posts_private, links_private FROM $wpdb->categories WHERE cat_ID IN (" . join(', ', $parents) . ")");
-	if ( is_array($found_parents) && count($found_parents) )
-		$categories = array_merge($categories, $found_parents);
-	else
-		break;
-}
-
-// Put them in order to be inserted with no child going before its parent
-$pass = 0;
-$passes = 1000 + count($categories);
-while ( ( $cat = array_shift($categories) ) && ++$pass < $passes ) {
-	if ( $cat->category_parent == 0 || isset($cats[$cat->category_parent]) ) {
-		$cats[$cat->cat_ID] = $cat;
-	} else {
-		$categories[] = $cat;
-	}
-}
-unset($categories);
-
-function wxr_cdata($str) {
-	if ( seems_utf8($str) == false )
-		$str = utf8_encode($str);
-
-	// $str = ent2ncr(wp_specialchars($str));
-
-	$str = "<![CDATA[$str" . ( ( substr($str, -1) == ']' ) ? ' ' : '') . "]]>";
-
-	return $str;
-}
-
-function wxr_cat_name($c) {
-	if ( empty($c->cat_name) )
-		return;
-
-	echo '<wp:cat_name>' . wxr_cdata($c->cat_name) . '</wp:cat_name>';
-}
-
-function wxr_category_description($c) {
-	if ( empty($c->category_description) )
-		return;
-
-	echo '<wp:category_description>' . wxr_cdata($c->category_description) . '</wp:category_description>';
-}
-
-print '<?xml version="1.0" encoding="' . get_bloginfo('charset') . '"?' . ">\n";
-
-?>
-
-<!--
-	This is a WordPress eXtended RSS file generated by WordPress as an export of 
-	your blog. It contains information about your blog's posts, comments, and 
-	categories. You may use this file to transfer that content from one site to 
-	another. This file is not intended to serve as a complete backup of your 
-	blog.
-	
-	To import this information into a WordPress blog follow these steps:
-	
-	1.	Log into that blog as an administrator.
-	2.	Go to Manage > Import in the blog's admin.
-	3.	Choose "WordPress" from the list of importers.
-	4.	Upload this file using the form provided on that page.
-	5.	You will first be asked to map the authors in this export file to users 
-		on the blog. For each author, you may choose to map an existing user on 
-		the blog or to create a new user.
-	6.	WordPress will then import each of the posts, comments, and categories 
-		contained in this file onto your blog.
--->
-
-<!-- generator="wordpress/<?php bloginfo_rss('version') ?>" created="<?php echo date('Y-m-d H:i'); ?>"-->
-<rss version="2.0"
-	xmlns:content="http://purl.org/rss/1.0/modules/content/"
-	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
-	xmlns:dc="http://purl.org/dc/elements/1.1/"
-	xmlns:wp="http://wordpress.org/export/1.0/"
->
-
-<channel>
-	<title><?php bloginfo_rss('name'); ?></title>
-	<link><?php bloginfo_rss('url') ?></link>
-	<description><?php bloginfo_rss("description") ?></description>
-	<pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_lastpostmodified('GMT'), false); ?></pubDate>
-	<generator>http://wordpress.org/?v=<?php bloginfo_rss('version'); ?></generator>
-	<language><?php echo get_option('rss_language'); ?></language>
-<?php if ( $cats ) : foreach ( $cats as $c ) : ?>
-	<wp:category><wp:category_nicename><?php echo $c->category_nicename; ?></wp:category_nicename><wp:category_parent><?php echo $c->category_parent ? $cats[$c->category_parent]->cat_name : ''; ?></wp:category_parent><wp:posts_private><?php echo $c->posts_private ? '1' : '0'; ?></wp:posts_private><wp:links_private><?php echo $c->links_private ? '1' : '0'; ?></wp:links_private><?php wxr_cat_name($c); ?><?php wxr_category_description($c); ?></wp:category>
-<?php endforeach; endif; ?>
-	<?php do_action('rss2_head'); ?>
-	<?php if ($posts) { foreach ($posts as $post) { start_wp(); ?>
-<item>
-<title><?php the_title_rss() ?></title>
-<link><?php permalink_single_rss() ?></link>
-<pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_post_time('Y-m-d H:i:s', true), false); ?></pubDate>
-<dc:creator><?php the_author() ?></dc:creator>
-<?php the_category_rss() ?>
-
-<guid isPermaLink="false"><?php the_guid(); ?></guid>
-<description></description>
-<content:encoded><![CDATA[<?php echo $post->post_content ?>]]></content:encoded>
-<wp:post_id><?php echo $post->ID; ?></wp:post_id>
-<wp:post_date><?php echo $post->post_date; ?></wp:post_date>
-<wp:post_date_gmt><?php echo $post->post_date_gmt; ?></wp:post_date_gmt>
-<wp:comment_status><?php echo $post->comment_status; ?></wp:comment_status>
-<wp:ping_status><?php echo $post->ping_status; ?></wp:ping_status>
-<wp:post_name><?php echo $post->post_name; ?></wp:post_name>
-<wp:status><?php echo $post->post_status; ?></wp:status>
-<wp:post_parent><?php echo $post->post_parent; ?></wp:post_parent>
-<wp:menu_order><?php echo $post->menu_order; ?></wp:menu_order>
-<wp:post_type><?php echo $post->post_type; ?></wp:post_type>
-<?php
-$postmeta = $wpdb->get_results("SELECT * FROM $wpdb->postmeta WHERE post_id = $post->ID");
-if ( $postmeta ) {
-?>
-<?php foreach( $postmeta as $meta ) { ?>
-<wp:postmeta>
-<wp:meta_key><?php echo $meta->meta_key; ?></wp:meta_key>
-<wp:meta_value><?Php echo $meta->meta_value; ?></wp:meta_value>
-</wp:postmeta>
-<?php } ?>
-<?php } ?>
-<?php
-$comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_post_ID = $post->ID");
-if ( $comments ) { foreach ( $comments as $c ) { ?>
-<wp:comment>
-<wp:comment_id><?php echo $c->comment_ID; ?></wp:comment_id>
-<wp:comment_author><?php echo $c->comment_author; ?></wp:comment_author>
-<wp:comment_author_email><?php echo $c->comment_author_email; ?></wp:comment_author_email>
-<wp:comment_author_url><?php echo $c->comment_author_url; ?></wp:comment_author_url>
-<wp:comment_author_IP><?php echo $c->comment_author_IP; ?></wp:comment_author_IP>
-<wp:comment_date><?php echo $c->comment_date; ?></wp:comment_date>
-<wp:comment_date_gmt><?php echo $c->comment_date_gmt; ?></wp:comment_date_gmt>
-<wp:comment_content><?php echo $c->comment_content; ?></wp:comment_content>
-<wp:comment_approved><?php echo $c->comment_approved; ?></wp:comment_approved>
-<wp:comment_type><?php echo $c->comment_type; ?></wp:comment_type>
-<wp:comment_parent><?php echo $c->comment_parent; ?></wp:comment_parent>
-</wp:comment>
-<?php } } ?>
-	</item>
-<?php } } ?>
-</channel>
-</rss>
-<?php
-	die();
-}
 
 include ('admin-footer.php');
 ?>
diff -x .svn -aruN 2.2.2.src/wp-admin/images/align-center.png 2.5.src/wp-admin/images/align-center.png
--- 2.2.2.src/wp-admin/images/align-center.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/images/align-center.png	2008-01-09 02:14:29.000000000 -0600
@@ -0,0 +1,3 @@
+PNG
+
+   
IHDR         8<   	pHYs       IDAT(OkAūkgc"݋~
®1$Az$%$tUк?+
T{	ȗ $%@d($C
`f9rQEN,qSڂc雏DU{_VOnp9J~	RsMvEϋp}a8g">=fp'SSe"Oft@9WtvMD9s"]B׮z_xK@2զS7݋1yc@D \TP;^|M& g`}noX"-P j׊tm۶ms s>99Suc AJxQFя:tvvvW?ڇ#t*"MӔ+Ο32pttt7?f @d.%_U= SSz|B9u's;ǫb    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/align-left.png 2.5.src/wp-admin/images/align-left.png
--- 2.2.2.src/wp-admin/images/align-left.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/images/align-left.png	2008-01-09 02:14:29.000000000 -0600
@@ -0,0 +1,3 @@
+PNG
+
+   
IHDR         o?   	pHYs       IDAT(}R=oAMBdj:*"_HAd	:~ -=R9}bHٝٙAKdɞdӨ2LL$U$I3ph+hdo4';@ I	j:Vj4N
!o?V7Oj75 "{UUf&v6TU֍OJţ]/4_Ll6 dk>i8D:u]79єc1Oa2IDr"̜s@AoZGmM
Ok$ql+H  HJ}M֛g{W!D׏_Z_E$EB9l6C	nTfH.*c{3[,Spb$UuZBA5PJH$c$`f!U󜳪P.jrhTu\.I+lJ{#H:ίs뺇YiQdfRl!eHyY    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/align-none.png 2.5.src/wp-admin/images/align-none.png
--- 2.2.2.src/wp-admin/images/align-none.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/images/align-none.png	2008-01-09 02:14:29.000000000 -0600
@@ -0,0 +1,5 @@
+PNG
+
+   
IHDR         8<   	pHYs       wIDAT(=nA_!"R+Cp2KDtW=Y&mɥJZWB23I 4*.TyfNӴm.Q%T3]ONxtu]8I=|Ƞjf/47#`.tY1}ڟn|΀(m^_ о37m/ETUO`(PP<37q .?QP T=!xςk[
+w"Pv5
+r fp7 ="V@xzpo\{^5eEvD~/&Jl9"wX!vK    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/align-right.png 2.5.src/wp-admin/images/align-right.png
--- 2.2.2.src/wp-admin/images/align-right.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/images/align-right.png	2008-01-09 02:14:29.000000000 -0600
@@ -0,0 +1,5 @@
+PNG
+
+   
IHDR         o?   	pHYs       IDAT(AnAE=I)RV,8ΐ, Q|
+ؒ,tW}EFB`[GSfwgfz 1y&ڥJɸ媞HKQ@wogs/;C
+鉈D̦Ry<py+>{'ul-]( 5U`fJD,m.Km8+9b3#eZJ!qTUff曛>OjH3?%dxtr~ODfREȿt1+Ca7nejf93)#!	%#j`f Zkx!l68*-K:BD[kM)3ފȯ?mmZk
qԔRDW<cݧ죛dfǙ,R8; cN]Zk8Pl6^Cbޢ(Ow?baO`y    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/box-bg-left.gif 2.5.src/wp-admin/images/box-bg-left.gif
--- 2.2.2.src/wp-admin/images/box-bg-left.gif	2006-07-06 01:14:17.000000000 -0500
+++ 2.5.src/wp-admin/images/box-bg-left.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF87a   ,        ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/box-bg-right.gif 2.5.src/wp-admin/images/box-bg-right.gif
--- 2.2.2.src/wp-admin/images/box-bg-right.gif	2006-07-06 01:14:17.000000000 -0500
+++ 2.5.src/wp-admin/images/box-bg-right.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF87a  ,      dH0I8ͻ`(dihlp,ϴ3P|pH,ȤrШtJZجv8uݰxL.z|NJ7~T_	 ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/box-bg.gif 2.5.src/wp-admin/images/box-bg.gif
--- 2.2.2.src/wp-admin/images/box-bg.gif	2005-11-05 19:57:59.000000000 -0600
+++ 2.5.src/wp-admin/images/box-bg.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a             !     ,       4A0I8tdih2_8p,ϴӊK|/pH4sŤr ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/box-butt-left.gif 2.5.src/wp-admin/images/box-butt-left.gif
--- 2.2.2.src/wp-admin/images/box-butt-left.gif	2006-07-06 01:14:17.000000000 -0500
+++ 2.5.src/wp-admin/images/box-butt-left.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF87a 
-  ,     
-  .6ld	BInSR̥ H20
DH͡H ! ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/box-butt-right.gif 2.5.src/wp-admin/images/box-butt-right.gif
--- 2.2.2.src/wp-admin/images/box-butt-right.gif	2006-07-06 01:14:17.000000000 -0500
+++ 2.5.src/wp-admin/images/box-butt-right.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,6 +0,0 @@
-GIF89a
-  ,    
-  &dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~Nk
 	 
-H*\ȰÇ#JH
-(PǏ CIɓ(S\ɲ˗0eQ@ ɳϟ@
-ѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿LÈ+^̸ǐ#KL˘3k̹ϠCMD
D 
ȞM۲3ͻNȓ+_μУKNسkνËOӫ_Ͼ˟OϿ (h&6F(Vhf%@& $h(,0(4h8<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6r8 ( ?" 馜v駠*jjꩨꪬ꫰*무j뭸뮼+k&6F+HVkfv+k覫+k ,  G#  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/box-butt.gif 2.5.src/wp-admin/images/box-butt.gif
--- 2.2.2.src/wp-admin/images/box-butt.gif	2005-11-05 19:57:59.000000000 -0600
+++ 2.5.src/wp-admin/images/box-butt.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,5 +0,0 @@
-GIF89a 
-               !     ,     
-  ؠ6ldihlp,t{eBpH !:Шtq$ 0z`by0EncQP"$ =L%	

	& 
-
-Y)wJ )rD ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/box-head-left.gif 2.5.src/wp-admin/images/box-head-left.gif
--- 2.2.2.src/wp-admin/images/box-head-left.gif	2006-07-06 01:14:17.000000000 -0500
+++ 2.5.src/wp-admin/images/box-head-left.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF87a  4 &&%#|$$!w!vd#w.7UW%#{'#}%!x'"x&"z$"y u,       s@`,"\"qdH21a00ASUEg<L.|4&&((//))%%  --++''A ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/box-head-right.gif 2.5.src/wp-admin/images/box-head-right.gif
--- 2.2.2.src/wp-admin/images/box-head-right.gif	2006-07-06 01:14:17.000000000 -0500
+++ 2.5.src/wp-admin/images/box-head-right.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,10 +0,0 @@
-GIF89a 4 &&%#|$$!w!vd#w.7UW%#{'#}%!x'"x&"z$"y u,      @pH,ȤrDʞШtJZجvzxL.zn|N~C44

1 
-H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\_(Xp͛8sɳϟ@
-JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿LÈ+^̸ǐ#KL1&HAƌϠCMӨS^ͺװc˞M۸sͻNȓ+_μУKNسkνËOӫ_Ͼ˟OϿ Ly6F(Vhfv ($h(,0(cyxP(<@)DiH&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜vj&	p0`ꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k ,lb@
-G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlpǽ3
T,|߀.n'7G.Wngw砇.褗n騧ꬷ.n/o'7G/Wog=4 B
- o觯/o  HL:'H
-Z̠7z GH(L
-W0gH8̡w@@$ 
&:PH*ZX̢.z`H2hL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz(GIRL*WJ;1	fIZ̥.w^0IbL2f:Ќ4IjZ̦6nz8IrL:v<Iz̧>~ 
@JЂMBІ:D'JQo2ȨF7юz 
HGJҒ(MJWҖ0LgJӚ8ͩNwӞ@
PJԢHMRԦ:PTJժZXͪVծz`
XJֲhMZֶp\J׺xͫ^zQீ
`KMb:d'KZͬf7z
hGKҚMjWֺlgKͭnw
pKMr:ЍtKZͮvzUm_	@Mz|Kͯ~ LN;'L
-[ΰ7{ GL(NW0gL8αw@L"?/H&;PL*[Xβ.{`L2hN6pL:xγ>πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNհgMZָεw^MbNf;ЎMj[ζn{MrNvMzη~ NO; &N[ϸ7{ GN(OW0gN8Ϲw@ЇNHOҗ;PԧN[XϺַ{`NhOpNw5xϻOO;񐏼'O[ϼ7{GOқOWֻgOϽwOO;ЏO[Z{OOOϿ 8Xx
-8Xx؁ "8$X&x(*,؂.0284X6x8:<؃>} B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8mW-p؊8Xx؋8XxȘʸ،8Xxؘڸ؍8Xx蘎긎؎8Xx؏ 9Yy)} ِ9Yyّ "9$Y&y(*,ْ.0294Y6y8:<ٓ>@B9DYFyHJLٔNPR9TYVyXZ\ٕ^`b9dYfyhjlٖ7W+r9tYvyxz|ٗ~9Yy٘9Yyٙ9Yyٚ9Yyٛ9Yyșʹٜə}uyؙڹٝ9Yy虞깞ٞ9Yyٟ :ZzK
-ڠ:Zzڡ ":$Z&z(*,ڢ.02:4Z6zWA  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/box-head.gif 2.5.src/wp-admin/images/box-head.gif
--- 2.2.2.src/wp-admin/images/box-head.gif	2005-11-05 19:57:59.000000000 -0600
+++ 2.5.src/wp-admin/images/box-head.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,6 +0,0 @@
-GIF89a    &&%#|$$!w!vd#w.7UW%#{'#}%!x'"x&"z$"y u                                 !     ,       @`,Hrl:ШtJZXh4bzn|Nui221C33
-!
-E}$FFtp
*\ȰÇ#JHŋP4XIɓ(S\ɲ˗0cLIC
-d@
-JѣH*]t((AÅիXjʵׯ`ÊKٮOĘJÄ۷pʝKݻx˷ߺiʠ:È+^̸ǐ#KL2lQh̹ϠCMӨSy0
c˞M۸sͻoȓ+_μУKN:4
-hνËOӫ]˟OϿإ h&6F(aؕ`fv ($hb,0(4h8cص@)DiH&L6d TViXf\v`)fح`hlp)tig؝|矀*蠄j衈&h ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/bubble_bg.gif 2.5.src/wp-admin/images/bubble_bg.gif
--- 2.2.2.src/wp-admin/images/bubble_bg.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/images/bubble_bg.gif	2008-03-23 01:41:43.000000000 -0500
@@ -0,0 +1,2 @@
+GIF89a d   &GaiN!%꧐𿿿d=3̡jgΠ4SkȺY/@A^uuｬwN                                                                  ! ) ,     d  pH,Ȥrl:ШtJ.X쁙ł]k)f6Ӓ~D L
+' MNO PPQ&L#MNOPP!{L$(M	OPIA ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/comment-grey-bubble.png 2.5.src/wp-admin/images/comment-grey-bubble.png
--- 2.2.2.src/wp-admin/images/comment-grey-bubble.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/images/comment-grey-bubble.png	2008-02-10 02:10:11.000000000 -0600
@@ -0,0 +1,3 @@
+PNG
+
+   
IHDR         a   tEXtSoftware Adobe ImageReadyqe<   PLTEFFFrrrM   tRNS @f   !IDATxb``$6G]=``9H` ( oÚ~    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/comment-pill.gif 2.5.src/wp-admin/images/comment-pill.gif
--- 2.2.2.src/wp-admin/images/comment-pill.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/images/comment-pill.gif	2007-12-22 03:46:13.000000000 -0600
@@ -0,0 +1 @@
+GIF89a    N!!    ,       Dkڋ޼צHIʎGj ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/comment-stalk-classic.gif 2.5.src/wp-admin/images/comment-stalk-classic.gif
--- 2.2.2.src/wp-admin/images/comment-stalk-classic.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/images/comment-stalk-classic.gif	2008-03-11 23:46:17.000000000 -0500
@@ -0,0 +1,4 @@
+GIF89a@P  '>N!%&Ga&Ga&Ga&Ga!   ,    @P  0I8ͻ`x	dihlC,tmxq  *l:&oJZgv%p-ޫzr+=~ߚ:sqstww|[Ifk?!MT,9
'4Яߝꥺ/dg@L0!KE|X(ĉF<Z|1#%xȑ{V2囕,[Y	SΙpԄSgKzA
+СA4R(R^
+ԩ Kٳg^uUk]}|ݻs2vܸҽK0 z]C0`^
K\Wp*,3N˃)96@{v :hɭKhFCZ]eّhז߮yW
1G\YͩCzuc>j_}mѧ.˟{?~F`b2Fa_va]օn]ՅU jP HXJT6]2JL2$hӎ8Ў<^EDDD:"H&YCeQЕSRiN.;WJ!O蔉zWYh2&s9j9geBsbg:~ei&@ڣa)E"#*餎lʨlxЦʧ$ꩨBj:
+*j+VjkG++ł+>*=e$Vk-}mt{Ӹʍm>;nꆖﺦkZ;T<Uz1e[AUVD 2[ 5\ Բ/2--r/{͊,rρ\"ݘr M#-Ґ9#Ҷbr6XG7_5_C3g
gvavvjm7sv+wmw}7YyG8}/x"_7q~X_9y;7%[~yd.	  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/comment-stalk-fresh.gif 2.5.src/wp-admin/images/comment-stalk-fresh.gif
--- 2.2.2.src/wp-admin/images/comment-stalk-fresh.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/images/comment-stalk-fresh.gif	2008-03-11 23:46:17.000000000 -0500
@@ -0,0 +1,5 @@
+GIF89a@P  %&GaN!         !   ,    @P  80I8ͻ`xdihlA,tmxq  *l:&oJZgv%p-ޫzr+=~ߚ:sqstww| [Ifk?!MT,9
'4Яߝꥺ/dg@L0!KE|X(ĉF<Z|1#%xȑ{V2囕,[Y	SΙpԄSgKzA
+СA4R(R^
+ԩT|*_
+([L؞V-m[xޤ|U,Xb6"?vY2ΕQt\!8tѤe>g`];mڶo:xৃq7+_hzУN]_1s]5g.}.DdxVP(`H*V
+"L@MhӄaOf!Gv#8S$S鍣bF0>hэ4Xύ8V#?@2@Nd,ϒ,XK#<Rr#e>R2)JdNuIMRdF&<h=hvX܉̝t։۝My˝YD/j衮$(6h&闒)D2EjiGveZɪZݪ$z*$檫w+ Ev$k1"MѶՎ)|RSj!Ի+Ļ/VnoTN0l^
|3k18LK\!r< WD#1#5K52`)j#OZǙ,ܬύ8=4=.9ѾPͤQK݌9R-X5Bz8!jmvhcjK%=޵}I߀Qkz[x ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/comment-stalk-rtl.gif 2.5.src/wp-admin/images/comment-stalk-rtl.gif
--- 2.2.2.src/wp-admin/images/comment-stalk-rtl.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/images/comment-stalk-rtl.gif	2008-03-19 11:08:03.000000000 -0500
@@ -0,0 +1,2 @@
+GIF89a@P   %&GaN!         !   ,    @P  0I8ͻ`x	dihlC,tmx1QAdj:PGZ3ovʰxh-vnk޸<7zoۀ:opssx }CbglGNU,9'4ͬݚٻEW9<BQz1"qJ;zl2䝔$<)(ʕtRc34ټӗ͝z434(EEd(P:bh ]"I׭Vz-VeEKEڕv݆ׅ];ލ(X0}WL
+9ȌoDn
-؜f<pZҥeFk]fK,\ioJ:䱓+?$sKKس3=OéW.\K% ZDT[%"%%,1H1mlm!m8I*rHR,W1ʨP+ģFϏ;Џ@DHLLyϔT"de5\fe7\vI`IOdŔ#.rXg0u)g2urgyg@}眖,&9fᨢnr)Fz)ufZUhX+J"oȮJx+/*k:KB);zmںT&ƺWeJn[\+D. :|0 H7\Wara|1Ɛi,*1$^$Er`)O3 3K0;3sc9=_3;@f2m60Ԕ9=QKdҠI}5Hmaڲ
]qݸ-	ޗE7	  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/date-button.gif 2.5.src/wp-admin/images/date-button.gif
--- 2.2.2.src/wp-admin/images/date-button.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/images/date-button.gif	2008-03-14 03:17:59.000000000 -0500
@@ -0,0 +1 @@
+GIF89a
 
  ǘddd͖!   ,    
 
  4x*ۧH!+;'yZ؝ᾰL;_ᆫt\e,$  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/login-bkg-bottom.gif 2.5.src/wp-admin/images/login-bkg-bottom.gif
--- 2.2.2.src/wp-admin/images/login-bkg-bottom.gif	2006-08-10 03:43:58.000000000 -0500
+++ 2.5.src/wp-admin/images/login-bkg-bottom.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF89a   򧴾>Y!C]o4Q=Zq)JcYr7Sw˪͏
2O                                                !     ,      @p		rl:ШtJZجvz8:BYȀ̪|N~Mk. 
f'|x&f
 .-jG"_"f-.f#$u$#fk̻k 	kvk	
-GKk 
-ok20.0uZ 
@ ȱ6pI@0˗0cʜI͛8sɳݟ>MR&@	<]ʴӧPJ:u@	-ά,`ÊK٥D(w Pzݻxu9 	I A B@wǐ#K7 Ъ 	@X AS^ͺװc˞M۸sͻ߹( B		ZHNسkνËOӗO ˟OϿ  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/login-bkg-tile.gif 2.5.src/wp-admin/images/login-bkg-tile.gif
--- 2.2.2.src/wp-admin/images/login-bkg-tile.gif	2006-08-10 03:43:58.000000000 -0500
+++ 2.5.src/wp-admin/images/login-bkg-tile.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,58 +0,0 @@
-GIF89a  <_R&k\Jt=`%_T*eLx@eO|VLveYTS[!ZN{⁝Hq YPzU~%`X5kKv(bW$]GyPyT~9Z$`GpJtV-eDk!["_T(d'cVOxXP}(`LwNz!^LvNyuZR|WT*hIrS|Lt"^VP|X \mXHqNzP|"]]S~R'aJsYVP|,j"i g=qaVOzUVPQYMv}#`&`S|ZQ~YKuMxNx#^Q{NwZUhNyU_/gY-l
4R
3Q
3PT
5T6UBh7W8X;]T:\:[
5S?c>b0hFnCiEm7VCjAgEl8YAfSS>a
4S
2P6V?dIsP~QFo;^9YDkDlHrGoP}Fm
6T
4Q7XBi;\Bg@fIrGpMyRQUIr%aItKt%bPIsRJtWQ}XKsZR~SO{W&b#[%_"]Q}T:x+cUVW\
2O!     ,      	H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0"b!8sɳϟ@
-JѣH*]ʴӧKm`̚6E#ׯ`ÊKٳhӪ]˶۷pʝKn\04*F&
-[oÈ+^\fbfbъb
-`̹Ϡ^I߈P(װc,T؈i
ʹwμE:&,c/ËOۨ_Ͼ{l˟O~|Ͽ (`X{&z6cLrt6vPjd&@($|0Ƹ(F8 aP$ŬaAL"Lh3TV	c>`\v kmh6leXgtֹ_`|CA6qBEFR>]>|裐F*餔VjdX駟 ꨢ6aꩨª 
-k#檫ꫯ`+k,&벹J*V{*%v{+%SPieT\k5w3ۂV;B,.,6찱7Rpگn$_?߱ AfP.w[8;r[1:ų<1?F|t-A_o%nYJsU3N}0D=)ۈ2>L@VDpIc?=va騛Nz}TMǆg픢kAӮ@+Akփ
wtW5
->{#/~=92k">s|_?ltO{bm+|;&0Aɩ@v`ns<.YK
FHS7ÙB3Wā fep~A ,z&Lh=pb,x5i[BCM4VuVS6{ hMqcU6-ސ@vGap[dX嬧aH|$G=YuOɰ[@pH	\;93σS#$8ZJzrU mEMr[*&JRl!3U
-teKYd.WX^yYbs :";I&F",hMcaS@YK\6eEE`Q$;LS*3#s3I|aƁ޼e8:NL*Tlh/l)mz/&#GJ<6Ԧ.*߱+ڑxLg!qᴋ]fWSգCEcJ,pN\:PJb-]U5ՀiՓ\+Z
-\eg4j0"a<:ZVnTr´+{XK-mXk	1Zk?*ْԲl@3{:
-*h9ЇrJ:-<S8ЍtKZ>'V~BUbܺײeoZ,BYXvwg
L`*w}a-`׻x]*lrۇz/}eujEU0uA86b	oLr,ؚ&&{^f[:Z1
؊[N	2x]RF6a|s:Yɹ
{WYXβ`/3bNmFgw_\V+j^X5l;{CXM^Wj9\g]13ֳY#<iJE=PVΡNmF|W
VZ.pk['ۍF3w%X
-7؏}sPvˎARaϨ&;k1^ho7+^6[8>jI8{w-_hu*QTeF
>AY YB<Þ׋g޸\|N]C<,s
-ȿ~x0bNe2Ǯq&ϕ'jJ&uS>u+;ub^Yw3uw\?ρ]NE;8Y߭o>p8dcׯcOx9wgO{q꥙u9-maL4~5}/5kqGiW;g?r	]r/ݗfV/p^n6E
%~8H{eg~GyvytrGm8`^wnZ7dV:WB&o H*8{8t
-HBѦoHw_J'|E|
-z;@B8DXFxHCX;buRPXwsVxvx'l)Ȃ\	hjE'~5H~n*QX^L)Jpr>8vxs؆℧wiV}T}ׅȂ_oKb}vђkȆzGX؉MSnz$8d(x,(	dP t|+xAwocȀV+8h胶0XxؘڸhBJX1['=38$WKXl hV`PF@@w8aH  fHW5BxWS13<-ҍ&y((*ْ.8hOdhp?؎5yxw ("V  F 	(@e8sdbβ	3")%jȒlk#IeēTX(	t0|	"И	*(	V0	0	d0yATB)Uy0b*h*f	*2Ii	nٚirTPxhix}M) p20vdp*Ft`	  n 	:M$cVU9yX)2Iuyw?|TA9* 
(KpFpzx V``i{R72IY\4jY9I@d! ʛDZYxdiZz IPW\9Dɞ-ꢃs135zpښ:
-Q@Z^ڛ=9B?

-jhY>0Vڨw   7Yٕ6Gɑik
-C2sJroY3QYAjM
-)Ù`
2 :d \ *	yfhe	n
->x:Zzzbj
-Ky#CGJ꫾ K@:x`UɬκJ9*!jl)Ꚛڱ {$[ɣz*DȫJ@<ktd`^ʰT*k	(;&;TK#[X;Q-,?|
-=۳Ћj:eRʴMkW[_+7)mFip\@mK8;+@ڬxk+Zi贁+zۻߺ{:[/ 5K'GK {jxv˺麝	ʷK۾*;*a;ck~ڗ8Īp+	 t
ַi˾+]Kkj4"p`*6jp`Ì`@L6Lw  +GDۺaz[+,[\ ܸS{s2kgx3\r
-		" n{̘xp302*PwKy;[K{Qźװɜɞɠʢ<ʤpʨ|[ˣp*\$̊(>`VKy<z-@t:L 9$Q˹lX0˂J*ʥ }
]Ϩʰj&(˳\˷λ(9 
@	|Jl	@y,ko͙  !M
θ\lܦ(`HԡNPR=T]VF[
*ss@bWP
j f`\$  )m`yG|FVp]vMs plmj|e}-T s *\YWڬڮ Lڲ=۬}`-d}֙}:or=׏ | 0tkKx[	 jMsmqM9ӗٛٞ],ڤmڧm۩LSߴmߩۺռʟۂ] 3 Lp!: ؙp`ǙL 3-]ٖ?b=ߟ B^V cmf}	>n
n@	|Џ-z| " <ݍJܭ;.S0,ڣ]?nnDHB~
-
>7t.|*}ݨ
-FAm瓍z}~~օHԋF觭-=Zh ϗUW~[իyl^V\:
-\E\},;6M~ 썾NnRMV `\@y,KUM| `y>4
 	]=nSN|p
?lᐐ,OHpnUʹ{	)^6ｬ58=E?MNO^R_~Yoՙ	=ҵH	Y z'
-w ?nq/8:C)>~/0ď۸T /S0PƍYa GJ
-dn*' a^0Ι 	"&.Ґ$Nht5fG!E$Y%T;Vlʕ+!M9snx"E qHeBW!(H  IbŪDY
l3aI%;vR{=`vq嶘.[(Xfݶ]Qʖ
k+[
dMt*U,R@$ҤG:'Dyj+[O&͕6_=ruNOZTK>:eʒx1ٳi@\;a [d{m8Vʖ`s; mAMjmB3pC;G
-.5J+(*Q1)-Z$3j3ⱑcƬ#!r.
+:{`,2qI'0#PC,z4cG?r2㹊*k*Z")A!#BmċFqO>A\
-4PCEӢ3N]|g|LsK3RAL &L|PXJ'QpXA&'OL1ɴL,\6[S94E-Qjk#47kVE5rH/0JLxxr,Fp2Tc<+2`g.2qF|m5s?4e<67:VZ5ZlՖܰqecyfkq"D*);G3m7Lsn^4`B`V#g`׻iJ$H> crd>H	
$+x-*O4d;J
'|pS
mUځpo\g<8B衉6]xcH@9Ȳ"Z}2Vbp6aά-g҆&ǛwfeY_z~{p?v"+tJ+ɶǱ$y $a#kp/p1z.*	'}%~~#d 1hW,#LxB0z+
RBI39!hk?̏~"@R-[(L-Pֱ 
-
"D@N=f 6x|/scVcuc0(8tϒCJ9G?_F{nȟBlFvA2th`%?2ZƌgL>o"K:1&y#0?'#JtxHhF~?!Y,A1 Ia `*Uv CB0- &8qx`SԈK6*p1
jBa$qz<hC	R\s2vsL3	>dd"Mh 
-U*7-
-Nɯ*.3xCxwF`XAY?&<te*:2M(H'fr<,s ipwNxlxaE(A}Gy+p{ hO{SĒX?i\"""Tԅ
GJȐt
-sjZ{u G.<C(	 9dܥcYYW2 7M"(H;نBߠnu{]fWnwۧpYk"=W<(
K10:M=¥ߴ<eA<;Hܴ,95dm\T{bXҍ|bX3qm|c=|g9ļW@z~ӄ yj)!ߴx2A)Xiǘ%b	nrg@Zо`qM}hDzxȏ\rzXyM4fp:0ڥ"0؎(=$!$څcQ#f?؜[+|yD'[4.tnle/zDSi7u5( kRVvJz-ܡ"
-0a0Vӆ,;N޳Glh'V=E)-hȖJ{in]˟w:`
-UjXp|tq=`y)'=ףҝNci_Uώ2'n $aor6`ֲj3&s7|3gݱ;NzAtǘ.<.ѩS?oƍY$_[yͰQ-H:PjQ*IޥF(I͹Ywz{%RbxW|07߮忙daV/ݖ0<˓GƲ?FapwbЇwOq_ ̿	,@2H2p4ŋƓ43>KYZ>	sP!7pJ7,k,CF@8̃\s=_8g1,h1ܞ B",B#\;B%\"@ <E!˶Ǜ@
-<7盇0HAX0#{ :C${3E~Ļs9г'B&DB$,DDD'BT)̬#ǫ{
>	8=@3d+/ õK/;AT@@BALD^Tc `FaFb,Fc<FdLFaflFg|'A)3j2HlLT+,>= pū8r,KRa7# ;	\@ r,G˰Cp omdlLF?|gHgTFHHEHHH  BtDd9ƃdn,CGr<Gt~`CV/u$
#JFЀ	x8@
	x+
@JtG<ȁ,H7Il$t|HIHKcH<KˈɮKȃt찖tIIt7Ra~
L7{+bz~'J$Hlƅʮ, TˉDKHLTFtFIkƔ\IGDPL D6I~O\;H PLIǤL-L̒M MϼN\FƮ,ɡmFפA4Gٌ	h rB G	``		{iOrŁ;pN3ϮHNΐ,M1`@Ƀ<LPX4м$PHJ$
P$%LP
-=T5O|>FM
]R-QLM,Q<ѺdOUL0}J/5EPpLOu#$L'&SRQ+F,҂R.5@5XMHTE]D}'@ 2}L4=!]S6P$-@(SSOK;jQ-O?]{xC]G{  BC}0|U3 mP5lS7T
UUhQ5)S=ҔdR	G ŜNhױHW0@ Z	"T!=ȄT'`V
-ΔVH5HXU*hX'Xi4L8XX` M}-wPY}HZ}_uTx%TG2mO-YHcPu<TX}u؅}ڃ ZZZZګ=Fu[
ۦUZy E[tX[tXj|8Z=ϞYp,Y@vYa݊ pTM\E{%GB\4Y۞[Z[]e[tH[5ۦ۱=F=]M]եک]]}5Fۦ]u[=G[\
Y5ԁ`-G?(TUWۿUGś%Gx0^(GɝܒQ]r݇ݰ5F}_֍__ڽ]e[1ݍ޼^v(Gxh0ޛB^	Fv5WEޝ%`ܡ%_OܴUe__~maF%UZ]l[(~`3h#n?^b&ց"6b"ކ Y `\E_vX^.c}a3N]_\ `%` >xx*KN1(>bA~`wb1(a0VbTcMZ44a.[㶕9[XcDDc0q3YeeF\-b6R/^JKdbdhdhaf7&RQdofN堵cd偄w%[,>DbpJg
affb
ㆵjMffanclagr`V/ȓʜ%YXeLgp|E~6f耮hJ>a݆Vci抶苦cqg%
f&ޑvgGEd+GjiHoNI&hf%j3j~_]>ꉎ^jX~js۪j.lG>OZNNkm湎2<kllllm!(m>m.mvX/h־ah]qmm.5l6laqmhlrp֦lMm>ўnnl̾nnn^en/f6Gm6~o%FG@n>_&]npp7~XVwp%p%0kf[qm~pqNj	WwpN>pqnOm_p>og6l#mq-q6_qEhGq-ξqgn) Nr6os]'Gr*sr>l.s>seOq
-'"wsG7r8's:p;gn[A/m@tksOMsCpD?o.V~tWHoIJK*rAu@u^Q_p.uE0sTOEgVG_r&Y?[onq=u>um7Jvp#wr'wtOwb/S(xwipzgg_r7XX{wixwnq_qNwropJ.<xxxxx&?.PxOwhrv7x	({gt~yvxyKro_y?yoxzzxzo_Oz?zyww|yo~N/{[_q Wxyzz/|W{{{y{{o{g|t{>||O}֗zƿ/G{͗wvw}9 __}'7~/sȧy}^l}|g|OӇ~x~oxr7~9H%b 
-?0l!ć&R8."ƌ*<x HFLa򤜔*W<KB2gҬYSΜ:w'Р@+XF0lRR&V0_$X$C#jײe6(dA-	6׮[_f;*q5TRM:1~u]umڶGk|͙/|drȲg^z8bPik*3،緤6}͊VoY7.z;b#Ɠ/o<׳gToP xH8 F*8 Ym~q}YwA!z^%[x}x")aEa}Bu 2#
HҌH!P**${!6"x$Up$.W=xeAH7x&i
-#	^Y$VYi%K:KXy
-zvGdpzde&jI 'Fz䠝vQ}2%%ަXep(gF:ksZWy~'
-,b_sei63Bל.{a
-+jQ.BUpAf>ye;.b2V%p.BM,PR箿p¦Lbǆ))2-sB59s}<':rK M;4QK=5U[t{h5׃da"em5	a_3=wb۝eyox5}H~8YvMh3:Xy6y@;6ދs⥛n*魻8{3cC"ی9<s/y{. {|驗[2!ZY@={&=Ї`<K>:[a^7^OsjWOv>s.tW(e/`0x#^T	\ L@z,A/maGC*4!
-CP.^cȽ*
-,L7@
-j>H8,&+C%>Pbh<"nбv#=~ģ8)A2<$"9"0t#	(Rl#3&$$(QՋU|%,c)YҲ%.=6j2$K2mԥ'qJ[2|,Si,hRּ2ANq|0)_~f"Ikϔ)yRD"yYF>M|~Ҟ'B
-τ2T$AȀ2$EAD=hCCjͅh ;jȍz3E(LR4(IsL괧iMcҖ4t&7ԛ'5*թRV*Vխjj!ֱcZӪֵըc+\jֹ7*^׽|+`U=k\*h=aURg22r,hC+ђ=-jSZ(}k Ҷ,nsڶ-p᪖=.r\*}ni+]p-virװ+^(Lw=/z-p+^=,}+_W/;O>03~p!	S|]sp0Cb
յ0S
.~1ӸV1'lX"p{6>2,$3.r S2b's	^e-S25l,b~9׸e^uӬٺv2]cx І>4E3ю~4-PҖ43>cXӞQԦ>u	Uգv2c-Mxֶ]]5j.ߺ>63ea3ٌl1'NmgC{-qSz>wuZ 7?nvӛT}7..p}p8#{K8+[8C.&?9S򕳼.9c.sW69s>9Ѓ.tϼF?:ғ>+N:W>SVzϣs]L:.vfӮvón;.ӽv;~.?|+ڎ3;#SG/s|;/ы>?=5z_/7^=Of=/?>3>/S|s>/??ӯ?ӿ?埿   . 6> <V^ fn v~  		 
-
-  Ơ 
֠
 ` 
 !&.! <FN!V^!fn!v~!!!~!!ơ!a0!!  "!!""&"."#6#>"$F""$V%^"&f&n"'v'"<р("))"**"++",Ƣ,"-֢-"..b(/"00#11+"2.#363>#4F#1*4V5^#6f6"<ł7~#88#99#::#;;#<ƣ<#=֣=c7ޣ>#??#@@:#A$B&B.$C6$@CFDN$EVE#<Fn$GvG~$HH$II$JJ$KK$LƤLdFΤM$NN$OOI$P%QQ%R&%O
-R6S>%TFT$<AU^%VfVn%WvW~%XX%YY%ZZ%[[%<\%]֥]%^^%__%``&aa&b&bf\.c>&dFdN&eVe^_6&fn&gvg~&h&ejhi&jj&ik&lƦlFfkΦm&nl4o&pp'qq'r&r.'s6s>'tFtN'uV'sJSȂvn'wvw~'xx'yy'zz'{{'|Ƨ|'vΧ}'~~''z'((&h
-6>(F'vւ^(fn(v~((((h(֨(樎(())&.)6(vNN)V^)fn)v~))))=HR)֩)橞))**&.铼(2*V^*fn*v*:*@ĩ**jL**֪*"*+bꮒ˨j.+6:jV^+jjf~+nk)/+++ƫ++櫾+*,&.,6֫jQV^,fnlFlƩ*Ȏ,ɖɞ,ʦʮ,˶˾,Ƭ,֬,,zlN,--Ҿ,j6>-FN.R-fn-v-Zz؎-ٖ-*-۶۾-ƭ-֭---ަ.&..6>.FnJ^.fn.B.Ct.閮鞮~n.붮.:֮...//&./6/FN/V^/fo>v~/n///Ư/֯/// 00'/0ӯ 70GO0W'_o0wf00		0
-0
-0
ǰ
0/0ðrk '/17?1GO1W_1go1w1_111Ǳ1ױ111 w2!!2" '2#7#?r"/2$O2%W%$_&o2'wrn0(2))2**2++2,ǲ,2-ײ-2.2,./200311ꖂ2/3373?34G4O35W5_36g6o37w7388gs293::3;;53<3=׳=3>3;˳>?3@@{3?A4B'BsA/C?4DGBn4TE_4FgFo4GwG4HH4II4JJ4K4I)ĴL4M״M4NN4OO4PP5QQ5R'5PôR7S?5TGTO5UWU4S_Vo5WwW5XOuV5YY5ZuQZ[5\5T.*Ե]5^^5__5``6aa6b'b/6c76aӵcGdO6eWe_6fgf6dog6hh6i_vg6jj6kvbkǶl6m6en6oo6pp7qq7r'r/7s7s?7tG7rtWu_7vgvo7www7ux7yy7zowx7{{7|ws|׷}7~7vӷ~778xv0,87?8GO8W_8go8w8+8888c׸8縎8899'/979GO9W_9gy?w9s999#ǹ9׹9繞99::':7?:GO:Wz/go:wc:::::?:׺:3::;;'/;7?;GOn	go;w;;;;;;׻;绾;ϻ<</<7?<ķG<W_<g<w|[;,<ɗɟ<ʧʯ<˷˿<Ǽ<׼<̋<<==ü'=7?=GO_=go[.|=؇؏=ٟٗ=ڧگ=۷ۿ=ǽ=׽߽o@Q =>>ⷽ?}?>GO>W/~6~Q@(t>臾>闾>ꧾ>뷾>Ǿ>>cj?p>?>7??GO'?So?w[*M?~?ǿ?o>?D(	4x
;VlEÆ+!XYF9vdH#I4yeJ+YtfL>(E
KhPC5ziRK6ujTSVڔ&C8sVxlXcɖ5{mZYBZsֵ{Y[qp`	m_
7vrdoJ˰d͛9wLb̞I6}Z-h;1rvlٳi׶}wnݻyxpÉ7[eJwztөW~w˛c|xW2ٷw~]Y~O_" 
<\|%
--!;
=EM<A]|eD/uܑ} "<$\&|#m)*,ܒ.4rJ̾2<495|8I6K<ܓO.@t?	=DE}HlTJ-PRnEg<PERM=TU]V]}XeZmmNtݕ^}`b=d]f}hM6ilݖnjr=tWv}xuy|Ͷ}W
>am	N~W;=-5ޘ=EM>U^YdY~emg]Ι}蠅y硍>餕^䢙~ꨥZf묵ꭽgZ>ԅ~垛ޛ._>\-5q;EM?U_]emuqߝ}xu/_祟ꭿ~ߞw^_O域G_8h w?	@>t)@	V5AB3a
-YB2YiXCІ9ԡ`A^W@!aH%6(|b)Vb-v$xF3gT#ҸF7Ưo8G;w#G?p24	I>7$zHGIAN݋d&9IMvd(IJd(Uбҕe,U9KZҖe.uI^2$9GӘDf2Lfљc4yGjVs5vӛgg88Nrvќb:YEv3g9$ӞGg>O~Пa@ZCԅE(P)eC%:BVԊ!F[yQjУբF/)]&%J1ҕLKAR:Ц7U`Nu*FƐ)1Yʜ%8*&y 6թjT٘T:rW_V
-Gv\+$:iլDkZVrӭof\*Nֵw+:uկl`9XӰgbO6,@%;فVֲlfY2Գ}O}XR.Ei(V.ϵM^le[<vxSKƖVnB;
-
-׸Cnro\ιboe[:ivS4.	;֕׼CozS^ν w囿Wt/w ƯK`f`:xKZX~zظ Kݚ(e׺0>EKژ8ά-@nKH:PJZXNz`J櫚h楺p{Jgx]g٤?Jh%h:zFJiZ槦i{zzIju&jozƦIkifkcz{Il]{MfٲTNdnxW	Z6=;~wjn&Omw[8-wgoT[(+p=
9Iq\j5>=3ǉw&7r/men[<79o]ړ\=Wʁ>Ky{t.ʅzԛ;uCW}kTavDc'{Ծvn'v,wo>_+zux>D|?Gwh.ۀ  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/logo-ghost.png 2.5.src/wp-admin/images/logo-ghost.png
--- 2.2.2.src/wp-admin/images/logo-ghost.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/images/logo-ghost.png	2007-12-22 03:46:13.000000000 -0600
@@ -0,0 +1,4 @@
+PNG
+
+   
IHDR         ǲ5   tEXtSoftware Adobe ImageReadyqe<   PLTEOOOGGGhhh{{{TTTHHHqqqQQQSSSyyy[[[lllnnnIIILLLMMMbbbiii]]]KKKgggVVVzzzaaaJJJ}}}ddduuukkk```xxxsssNNNfff^^^PPPXXXjjj|||___WWWeeepppRRRrrr~~~UUU\\\vvvtttZZZcccwwwmmmoooFFFg"\  
IDATxڄSgs@]p{BBH#i~S}zbxz9(J.'3IDCҩlUBXLm,ҷZ<KM=o>e]e>jhwVpMŬ$_Pxpq8^7Pĩ)N|
I#dcPh{'2J,:D;9Dʍ1k63D4Y>7*QWme$Ko`1$g6"&@qjVP`{tð9e%$$:kc_ 7jY!ub٫ /h)s25
+PDj4k=K"@7*oJAks8ӧIs7qjj!v!̀0@bK?3JAmG(l Т֘ˉb io6#<Dw'VnM7;P;ŶX/ݗYk}=+T5T+:Gp#)\\\I-ĴWׅ` ΞrN    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/logo-login.gif 2.5.src/wp-admin/images/logo-login.gif
--- 2.2.2.src/wp-admin/images/logo-login.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/images/logo-login.gif	2008-02-19 18:19:01.000000000 -0600
@@ -0,0 +1,26 @@
+GIF89a"B   FFF%ѢtttRRR]]]󹹹iii藗֌Ůw3iN@兹\$FGGIGF%i2[                                                   !     ,    "B  @pH,D)8ZجvzxLN("zf"yN^;TELk{V
+Z
+CjHU}jZ	D
+mjB
	Р۱r_
+im 	D
+jC7 8ǰ3IHC HǏ hu9\2H!	4{-sssHrsΣH$@/&PH.U:}j1B]^9;?\-<Bط6f/,&O
+8 @`ךa,|*2^)KR}_T$$GLT3H/2
+9߾+YA&^ΜIAUa4wH0!?  4FB"ױqta,xp|tgTy8RUR>7v@wBLwAw#R D&E!EM3	ab25] qeP{wYeZ^'?X"7 e,l&;Ex~J=Tk	 5U4z"A8Д'f9zpPXA|GI-f &Sc0N80v[/ԙ'<R	Q 3ѣyz^Et_yW㢗T@flKT Ln36l4klD ^	͹͖P 
+!|߂Z^CkT@eyKDo|/V/.澍 i%MFO
*tD<PgʗE6
+pDh$A
+A\6}^r ,An]DUs-s.TDk@jhE9|p  U$lP(<k7Pw296jl6U^7 gmddplAD8yg~>TnaFνj*0[ϓK~,
2 *,LW&
+xBP`y#P@1^d+eB2|E,"xJHQf:" }iFos27
++gs5cJDBK2
9ғ-j|Cp >P,q;PP2<Rlaf;Q VP<P	3A 8B tWW PE#t`Z!J
+( 2X
I S  M
+6<qq F##*<c3w9
+@
+@IpD%7פQ0ra<Y?zGǍ4}$B A <^ i%-\KPCf#BQ KyT0NnEEz4
K(-N5N,E@Xp]
+beV4s{FHjiyLlРM{C#JP`Ymc{H04t"{C,]4?ϢB\ft~(RS"<S  է* h!P(3*
+C$TXQGv*j
+^A  ZB4Jn,d* Z 4^kН2<EQ%.YAFgyUZuA$ F6"qbVH 4jۨ,^ 	h۠;6dd 
+!;P0E&tgx@3 \w[E.yZ6~
+p@IjuwuU
ڥo@kG}ͳ+%BV `/trMI2i( z^^YV򞐏ӮYmT"@-1\6N
m޲T"؏>q5*6
FApSGU/[Y֗b\]CK	gOY{eV@!&E̬}lP) `inL}B"d#O؟icmdIYp@q[W[5MC]pzӴ3뉓-T?OZ]LH'##`eUeh5<(	Gv!iLNq>}/B
X
 `_8]"frhwG5,B &L"[jmVаe4EpP5Ӂ&_QuQyfx!;cV EDJoԺ6]EMys#K :
+, }[4Jh=s< \-J0n)h"ϩ<,&V )
+~<ܝъ!or0Y
~U|FEXУEjtf(J,> bI HI]5u{
,`ށ+XF'-?$¹La_+LZ es.mfwWQ$X y`H
+؀xSwCRE%Y`&vKz][7*'ҡCPð{i C#9۱~/x0Ђ\D׷fV8
+~ 9^J5߀?vdAPgRf&Eje8pRO]F@wF0	nPW
(p78Ј1lH?hY0A
X +mDЉ؊d0 :Mb- 0 *ኼxp U1Q&BՋH7!G`m A
L8	p@ 
aXH{!7h
`T8  y[J\d F 9
0%YFF9vF3Yr ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/media-button-gallery.gif 2.5.src/wp-admin/images/media-button-gallery.gif
--- 2.2.2.src/wp-admin/images/media-button-gallery.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/images/media-button-gallery.gif	2008-02-11 01:44:21.000000000 -0600
@@ -0,0 +1 @@
+GIF89a
    !     ,    
   mRp3FB{vUeeR@ ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/media-button-image.gif 2.5.src/wp-admin/images/media-button-image.gif
--- 2.2.2.src/wp-admin/images/media-button-image.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/images/media-button-image.gif	2008-02-11 01:44:21.000000000 -0600
@@ -0,0 +1 @@
+GIF89a    !     ,       	˽"3kU"v$%1hjfH ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/media-button-music.gif 2.5.src/wp-admin/images/media-button-music.gif
--- 2.2.2.src/wp-admin/images/media-button-music.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/images/media-button-music.gif	2008-02-11 01:44:21.000000000 -0600
@@ -0,0 +1 @@
+GIF89a   穫󟟠ɸ߰                                             !   ,       9 $BJ`<#L	\K$]3ñp<`#6d: ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/media-button-other.gif 2.5.src/wp-admin/images/media-button-other.gif
--- 2.2.2.src/wp-admin/images/media-button-other.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/images/media-button-other.gif	2008-02-11 01:44:21.000000000 -0600
@@ -0,0 +1,3 @@
+GIF89a
  
+ ܷʣ螟            !  
+ ,    
   :PI@،C9K!"	kw"<OA	s-6B9U
a(k ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/media-button-video.gif 2.5.src/wp-admin/images/media-button-video.gif
--- 2.2.2.src/wp-admin/images/media-button-video.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/images/media-button-video.gif	2008-02-11 01:44:21.000000000 -0600
@@ -0,0 +1 @@
+GIF89a
    !     ,    
   `SVGmr%HnЉT ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/media-buttons.gif 2.5.src/wp-admin/images/media-buttons.gif
--- 2.2.2.src/wp-admin/images/media-buttons.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/images/media-buttons.gif	2008-02-11 01:44:21.000000000 -0600
@@ -0,0 +1,5 @@
+GIF89av   贷߰粵Ը                                                                                                                                                                                                                                                                                                                  !   ,    v   

+
+		ȫ  όˮ֓֒L@;P$|!Kle.Z
+zǱEUh㤏b=iV3t'4FJaBk>sƌf%;Y*@Tx'1Ss6)ފ5Af(O7o0Z6#}$ɞ7K-[
S0bhAE;.h*
+<Xe%Q ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/notice.gif 2.5.src/wp-admin/images/notice.gif
--- 2.2.2.src/wp-admin/images/notice.gif	2005-11-05 18:37:51.000000000 -0600
+++ 2.5.src/wp-admin/images/notice.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89a
 
  :z	JY ;zy!   ,    
 
  IIu=JꄖlW
-9g!gR0Z<A`sJu9hDAM''L*$ ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/tail.gif 2.5.src/wp-admin/images/tail.gif
--- 2.2.2.src/wp-admin/images/tail.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/images/tail.gif	2008-03-15 11:53:36.000000000 -0500
@@ -0,0 +1,2 @@
+GIF89a       !  ,       3fsmn}#Y
+番gkqfaS<"B D* ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/toggle-arrow-rtl.gif 2.5.src/wp-admin/images/toggle-arrow-rtl.gif
--- 2.2.2.src/wp-admin/images/toggle-arrow-rtl.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/images/toggle-arrow-rtl.gif	2008-03-19 11:08:03.000000000 -0500
@@ -0,0 +1 @@
+GIF89a    %   !   ,       a{lE6)9޷#DA ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/toggle-arrow.gif 2.5.src/wp-admin/images/toggle-arrow.gif
--- 2.2.2.src/wp-admin/images/toggle-arrow.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/images/toggle-arrow.gif	2008-01-09 01:52:30.000000000 -0600
@@ -0,0 +1 @@
+GIF89a   %   !   ,       D	:bt1vKh* ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/toggle.gif 2.5.src/wp-admin/images/toggle.gif
--- 2.2.2.src/wp-admin/images/toggle.gif	2005-11-18 03:07:57.000000000 -0600
+++ 2.5.src/wp-admin/images/toggle.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a 2  BB&~^>=D?)?   !   ,     2  I8ͻ`(`9 `R s`HBS 8"t j*>C!(e!<-8Qf@HHJMUUWZ`bdiek ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/wordpress-logo.png 2.5.src/wp-admin/images/wordpress-logo.png
--- 2.2.2.src/wp-admin/images/wordpress-logo.png	2005-11-29 08:59:29.000000000 -0600
+++ 2.5.src/wp-admin/images/wordpress-logo.png	2008-02-18 17:06:13.000000000 -0600
@@ -1,9 +1,12 @@
 PNG
 
    
IHDR      D   
-   gAMA  7   tEXtSoftware Adobe ImageReadyqe<   iPLTE@@@000   ```PPPppp܏R_&7}CR5E`m}oz*t   \   #tRNS f)  IDATx[ْ(싻{&?r@HBtuKG'.KoY3]E\
-Zك+ z8<U8[ơ֘qiNUbtЕj][mUyfJ7$Z؞&I	H;H3I>1WS;_^եi2Iu[®yg~2+sQۂykJaMA/M[N+߱=Aе)pkʌbΝYQ\b?K z"Gh'p8헋L_84rXŨ/q\?[n[l[úU)ީ1ɤYXa񆗎#nG{~ϯW 刍{ t-]Hc\mSsxp}5'Oc0eM^0ve'T17Qt4}ă}vs3/Xt/GOBk[R0O)tYAp5i`=UPѫUM(9:{Bckc?z`|d|MZ-ɑ
$zx0vLMJ/^H 	A)Vћ^lE4y}?wy:
Ɂ;:H ⿃	>n-ЕN;@)OҪ%9LXlnߍɘ.;71zd--\zև	~D#DL03DKxvԿDڹ!_}X-i[F	@J?{Jg#/W!;--;N.ûdV/}ypDebt Xb<r:?~>^J
aӐ%yZCA$i`[Y wI]bx !/,L$Ws-+7@a_cMݭ2JBBx?B7q蟉S;A>uUs]zσFG~$
WQM.3r,UB1'm*{~YЛzNw<BKNס^{{>x}
0wiAo4,t{jLU+uwS*=j¬уt\
Z%)]R	'XC\!V
-sD9E3݂9%9O1+G ~*_>J_Ga9%DʴqGZSZM1n%CqPIEb#+Ͳ҅{BBE|H҇H(dHC+8U<ckz("+)4K%F?xLـDubSx~
$ZtS->s3QPd3>-"NpEBD}tl>_YQ.~	&A:$(*D.<Сsta%ҵw^oXIgNw{xt>2)I.Y55A{Ut,ej(Ywsys(Qb,{|}txDgUF5ʛ<%}	FUwLRd1(MQ";Lヒw_F}4ޛ#K). ^kjo%bb˒Y=YdD?.^ 2/4{e;b=_
-.r$j,)DE1:5RK"#U(FƋ"Km&/$W$,~{l9G[lz^xrR]hˍmEn^#+E?ZPLmrC	;Yթ2|kJ6Gվ2mm<;W981eZQtkHQ4lW|agۃa
-œm
- FYsi? =,3KI%    IENDB`
\ No newline at end of file
+   tEXtSoftware Adobe ImageReadyqe<   cPLTE\\\$fff{{{ppp[̷2Mv˭儺i?L4   !tRNS !  $IDATxٖ:E
fL ɲCWU]Oq;$Ŷ%Y8-EEEE@tJ$UL?]&n M+OV^&;=Mqt5$X,e= av[[J [EWE5*	[:Ed6UNJjO"z%~Y{ɵa*seņ]Y6Kj{\͆"B/:yVOTI!6?_ӛ,SAWzg#ݠKЫp
'F+=kLc2őDl]2#igXR^]
+h>1Y{}ﶔUFT^\j]w{}߾?땮s7SDY>{.`VO$0w3PI 6G2=#3>QFj4V|:Xw0e3wX3&@7^=S|+n@gbݠ;fW#y:߼CË>5YԻm;=V"~sxgooPjwg;);<njݼ5@.|2J+(7O@"2GW)>V0k!w"_0"^v2N'뼆n=L{~e\4N^nv% b@I#7oEX_}]gƽlx'҃O&NW	@'@KBHHi͞/@s^ݓw0{9o஼1Ũi$ tWIA9ob#nӻ5䝤;zN?</=1}suST7po+YbtT~z W>{^ngi
+]r)Z3볧2@o>^@=#@Gߌ@JяЧutgvBRJ1	Do	d{蘭
q߻AGoN{]Nn>g%w
+b VT+G/"WK)^:b+T~GWgzzC=}}dbxWyN
+v֢[iHV`qG-}*>]4z]g//qp+ayF{J)0 >Aŗ
+R~דݘtp]2W{*P
+]}pu
+WҶes>Q9%˕fO=@t\Bѻ;(ks֠Is"F%Nk)F5Q7t♼9usl@lAHx2uwX۩Vy.Mf~JzjUɰuԸW|L.r{E͊ycttW'-b
lN#OJxTi>m,_\_a6	d#x1\a%۴/xx-#q)=Ӓ6O
沠 g4V\@{3S9Lw~O6O}q{YwAbɍV,Wg#WepwRP(4n*EP
rLD^_̓ρW
sϏ#z|pӁwIL)zI^l8]
ᨑ]|"#`sLh*7P`ޢ:\rrEv)ccY7A<~`?}+h^6+O-i]eսO{Ί5LFv)sx486hE q@?sd&@rK܂'XqW½֓V|_X3(Sm=_NU<pWC֩
+~{Nokgi	*a2l?7WFuYp}VͱӒCwBӒl\VѱodOB}߾X/c///g ~f    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/images/xit.gif 2.5.src/wp-admin/images/xit.gif
--- 2.2.2.src/wp-admin/images/xit.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/images/xit.gif	2008-01-02 19:34:11.000000000 -0600
@@ -0,0 +1,3 @@
+GIF89a 
+            !     ,     
+  bb0EJ",d	H00KA(L&BB0DR!$ఓgJVsPH4"sKAn೏1*NJՒP,  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/import/blogger.php 2.5.src/wp-admin/import/blogger.php
--- 2.2.2.src/wp-admin/import/blogger.php	2007-05-07 10:57:15.000000000 -0500
+++ 2.5.src/wp-admin/import/blogger.php	2008-02-27 16:05:50.000000000 -0600
@@ -12,7 +12,7 @@
 		$auth_url = "https://www.google.com/accounts/AuthSubRequest";
 		$title = __('Import Blogger');
 		$welcome = __('Howdy! This importer allows you to import posts and comments from your Blogger account into your WordPress blog.');
-		$prereqs = __('To use this importer, you must have a Google account, an upgraded (New, was Beta) blog, and it must be on blogspot or a custom domain (not FTP).');
+		$prereqs = __('To use this importer, you must have a Google account and an upgraded (New, was Beta) blog hosted on blogspot.com or a custom domain (not FTP).');
 		$stepone = __('The first thing you need to do is tell Blogger to let WordPress access your account. You will be sent back here after providing authorization.');
 		$auth = __('Authorize');
 
@@ -20,7 +20,7 @@
 		<div class='wrap'><h2>$title</h2><p>$welcome</p><p>$prereqs</p><p>$stepone</p>
 			<form action='$auth_url' method='get'>
 				<p class='submit' style='text-align:left;'>
-					<input type='submit' value='$auth' />
+					<input type='submit' class='button' value='$auth' />
 					<input type='hidden' name='scope' value='http://www.blogger.com/feeds/' />
 					<input type='hidden' name='session' value='1' />
 					<input type='hidden' name='secure' value='0' />
@@ -84,7 +84,7 @@
 		if ( empty($this->blogs) ) {
 			$headers = array(
 				"GET /feeds/default/blogs HTTP/1.0",
-				"Host: www2.blogger.com",
+				"Host: www.blogger.com",
 				"Authorization: AuthSub token=\"$this->token\""
 			);
 			$request = join( "\r\n", $headers ) . "\r\n\r\n";
@@ -178,7 +178,7 @@
 			$init .= "blogs[$i]=new blog($i,'$blogtitle','{$blog['mode']}'," . $this->get_js_status($i) . ');';
 			$pstat = "<div class='ind' id='pind$i'>&nbsp;</div><div id='pstat$i' class='stat'>$pdone/{$blog['total_posts']}</div>";
 			$cstat = "<div class='ind' id='cind$i'>&nbsp;</div><div id='cstat$i' class='stat'>$cdone/{$blog['total_comments']}</div>";
-			$rows .= "<tr id='blog$i'><td class='blogtitle'>$blogtitle</td><td class='bloghost'>{$blog['host']}</td><td class='bar'>$pstat</td><td class='bar'>$cstat</td><td class='submit'><input type='submit' id='submit$i' value='$value' /><input type='hidden' name='blog' value='$i' /></td></tr>\n";
+			$rows .= "<tr id='blog$i'><td class='blogtitle'>$blogtitle</td><td class='bloghost'>{$blog['host']}</td><td class='bar'>$pstat</td><td class='bar'>$cstat</td><td class='submit'><input type='submit' class='button' id='submit$i' value='$value' /><input type='hidden' name='blog' value='$i' /></td></tr>\n";
 		}
 
 		echo "<div class='wrap'><h2>$title</h2><noscript>$noscript</noscript><table cellpadding='5px'><thead><td>$name</td><td>$url</td><td>$posts</td><td>$comments</td><td>$action</td></thead>\n$rows</table></form></div>";
@@ -380,7 +380,9 @@
 						$entry = "<feed>$entry</feed>";
 						$AtomParser = new AtomParser();
 						$AtomParser->parse( $entry );
-						$this->import_post($AtomParser->entry);
+						$result = $this->import_post($AtomParser->entry);
+						if ( is_wp_error( $result ) )
+							return $result;
 						unset($AtomParser);
 					}
 				} else break;
@@ -509,15 +511,17 @@
 		$post_content = str_replace('<hr>', '<hr />', $post_content);
 
 		// Checks for duplicates
-		if (
-			isset( $this->blogs[$importing_blog]['posts'][$entry->old_permalink] ) ||
-			post_exists( $post_title, $post_content, $post_date )
-		) {
+		if ( isset( $this->blogs[$importing_blog]['posts'][$entry->old_permalink] ) ) {
+			++$this->blogs[$importing_blog]['posts_skipped'];
+		} elseif ( $post_id = post_exists( $post_title, $post_content, $post_date ) ) {
+			$this->blogs[$importing_blog]['posts'][$entry->old_permalink] = $post_id;
 			++$this->blogs[$importing_blog]['posts_skipped'];
 		} else {
 			$post = compact('post_date', 'post_content', 'post_title', 'post_status');
 
 			$post_id = wp_insert_post($post);
+			if ( is_wp_error( $post_id ) )
+				return $post_id;
 
 			wp_create_categories( array_map( 'addslashes', $entry->categories ), $post_id );
 
@@ -531,6 +535,7 @@
 			++$this->blogs[$importing_blog]['posts_done'];
 		}
 		$this->save_vars();
+		return;
 	}
 
 	function import_comment( $entry ) {
@@ -608,12 +613,12 @@
 		$blogtitle = "{$blog['title']} ({$blog['host']})";
 		$mapthis = __('Blogger username');
 		$tothis = __('WordPress login');
-		$submit = js_escape( __('Save Changes &raquo;') );
+		$submit = js_escape( __('Save Changes') );
 
 		foreach ( $blog['authors'] as $i => $author )
 			$rows .= "<tr><td><label for='authors[$i]'>{$author[0]}</label></td><td><select name='authors[$i]' id='authors[$i]'>" . $this->get_user_options($author[1]) . "</select></td></tr>";
 
-		return "<div class='wrap'><h2>$heading</h2><h3>$blogtitle</h3><p>$directions</p><form action='index.php?import=blogger&noheader=true&saveauthors=1' method='post'><input type='hidden' name='blog' value='$importing_blog' /><table cellpadding='5'><thead><td>$mapthis</td><td>$tothis</td></thead>$rows<tr><td></td><td class='submit'><input type='submit' class='authorsubmit' value='$submit' /></td></tr></table></form></div>";
+		return "<div class='wrap'><h2>$heading</h2><h3>$blogtitle</h3><p>$directions</p><form action='index.php?import=blogger&noheader=true&saveauthors=1' method='post'><input type='hidden' name='blog' value='$importing_blog' /><table cellpadding='5'><thead><td>$mapthis</td><td>$tothis</td></thead>$rows<tr><td></td><td class='submit'><input type='submit' class='button authorsubmit' value='$submit' /></td></tr></table></form></div>";
 	}
 
 	function get_user_options($current) {
@@ -767,7 +772,9 @@
 		if ( isset( $_REQUEST['blog'] ) ) {
 			$blog = is_array($_REQUEST['blog']) ? array_shift( array_keys( $_REQUEST['blog'] ) ) : $_REQUEST['blog'];
 			$blog = (int) $blog;
-			$this->import_blog( $blog );
+			$result = $this->import_blog( $blog );
+			if ( is_wp_error( $result ) )
+				echo $result->get_error_message();
 		} elseif ( isset($_GET['token']) )
 			$this->auth();
 		elseif ( $this->token && $this->token_is_valid() )
@@ -781,7 +788,7 @@
 			$restart = __('Restart');
 			$message = __('We have saved some information about your Blogger account in your WordPress database. Clearing this information will allow you to start over. Restarting will not affect any posts you have already imported. If you attempt to re-import a blog, duplicate posts and comments will be skipped.');
 			$submit = __('Clear account information');
-			echo "<div class='wrap'><h2>$restart</h2><p>$message</p><form method='post' action='?import=blogger&noheader=true'><p class='submit' style='text-align:left;'><input type='submit' value='$submit' name='restart' /></p></form></div>";
+			echo "<div class='wrap'><h2>$restart</h2><p>$message</p><form method='post' action='?import=blogger&noheader=true'><p class='submit' style='text-align:left;'><input type='submit' class='button' value='$submit' name='restart' /></p></form></div>";
 		}
 	}
 
@@ -814,9 +821,6 @@
 	position: relative;
 	text-align: center;
 }
-.submit {
-	text-align: center !important;
-}
 </style>
 <?php
 	}
@@ -833,7 +837,7 @@
 
 $blogger_import = new Blogger_Import();
 
-register_importer('blogger', __('Blogger'), __('Import posts, comments, and users from a Blogger blog'), array ($blogger_import, 'start'));
+register_importer('blogger', __('Blogger'), __('Import posts, comments, and users from a Blogger blog.'), array ($blogger_import, 'start'));
 
 class AtomEntry {
 	var $links = array();
@@ -915,11 +919,11 @@
 			if(count($this->in_content) == 2) {
 				array_push($this->in_content, ">");
 			}
-		 
+
 			array_push($this->in_content, "<". $this->ns_to_prefix($name) ."{$xmlns_str}{$attrs_str}");
 		} else if(in_array($tag, $this->ATOM_CONTENT_ELEMENTS) || in_array($tag, $this->ATOM_SIMPLE_ELEMENTS)) {
 			$this->in_content = array();
-			$this->is_xhtml = $attrs['type'] == 'xhtml'; 
+			$this->is_xhtml = $attrs['type'] == 'xhtml';
 			array_push($this->in_content, array($tag,$this->depth));
 		} else if($tag == 'link') {
 			array_push($this->entry->links, $attrs);
@@ -935,7 +939,7 @@
 		$tag = array_pop(split(":", $name));
 
 		if(!empty($this->in_content)) {
-			if($this->in_content[0][0] == $tag && 
+			if($this->in_content[0][0] == $tag &&
 			$this->in_content[0][1] == $this->depth) {
 				array_shift($this->in_content);
 				if($this->is_xhtml) {
@@ -998,14 +1002,14 @@
 					}
 				}
 			}
-		} 
+		}
 		return $name;
 	}
 
 	function xml_escape($string)
 	{
-			 return str_replace(array('&','"',"'",'<','>'), 
-				array('&amp;','&quot;','&apos;','&lt;','&gt;'), 
+			 return str_replace(array('&','"',"'",'<','>'),
+				array('&amp;','&quot;','&apos;','&lt;','&gt;'),
 				$string );
 	}
 }
diff -x .svn -aruN 2.2.2.src/wp-admin/import/blogware.php 2.5.src/wp-admin/import/blogware.php
--- 2.2.2.src/wp-admin/import/blogware.php	2007-03-22 19:59:21.000000000 -0500
+++ 2.5.src/wp-admin/import/blogware.php	2008-02-29 11:09:44.000000000 -0600
@@ -86,11 +86,14 @@
 
 			echo '<li>';
 			if ($post_id = post_exists($post_title, $post_content, $post_date)) {
-				printf(__('Post <i>%s</i> already exists.'), stripslashes($post_title));
+				printf(__('Post <em>%s</em> already exists.'), stripslashes($post_title));
 			} else {
-				printf(__('Importing post <i>%s</i>...'), stripslashes($post_title));
+				printf(__('Importing post <em>%s</em>...'), stripslashes($post_title));
 				$postdata = compact('post_author', 'post_date', 'post_content', 'post_title', 'post_status');
 				$post_id = wp_insert_post($postdata);
+				if ( is_wp_error( $post_id ) ) {
+					return $post_id;
+				}
 				if (!$post_id) {
 					_e("Couldn't get post ID");
 					echo '</li>';
@@ -138,7 +141,7 @@
 			}
 			if ( $num_comments ) {
 				echo ' ';
-				printf(__('(%s comments)'), $num_comments);
+				printf( __ngettext('%s comment', '%s comments', $num_comments), $num_comments );
 			}
 			echo '</li>';
 			flush();
@@ -155,9 +158,11 @@
 		}
 
 		$this->file = $file['file'];
-		$this->import_posts();
+		$result = $this->import_posts();
+		if ( is_wp_error( $result ) )
+			return $result;
 		wp_import_cleanup($file['id']);
-
+		do_action('import_done', 'blogware');
 		echo '<h3>';
 		printf(__('All done. <a href="%s">Have fun!</a>'), get_option('home'));
 		echo '</h3>';
@@ -176,7 +181,9 @@
 				$this->greet();
 				break;
 			case 1 :
-				$this->import();
+				$result = $this->import();
+				if ( is_wp_error( $result ) )
+					$result->get_error_message();
 				break;
 		}
 
@@ -190,5 +197,5 @@
 
 $blogware_import = new BW_Import();
 
-register_importer('blogware', __('Blogware'), __('Import posts from Blogware'), array ($blogware_import, 'dispatch'));
+register_importer('blogware', __('Blogware'), __('Import posts from Blogware.'), array ($blogware_import, 'dispatch'));
 ?>
diff -x .svn -aruN 2.2.2.src/wp-admin/import/btt.php 2.5.src/wp-admin/import/btt.php
--- 2.2.2.src/wp-admin/import/btt.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/import/btt.php	2008-02-27 15:47:52.000000000 -0600
@@ -0,0 +1,115 @@
+<?php
+
+class BunnyTags_Import {
+
+	function header() {
+		echo '<div class="wrap">';
+		echo '<h2>'.__('Import Bunny&#8217;s Technorati Tags').'</h2>';
+		echo '<p>'.__('Steps may take a few minutes depending on the size of your database. Please be patient.').'<br /><br /></p>';
+	}
+
+	function footer() {
+		echo '</div>';
+	}
+
+	function greet() {
+		echo '<div class="narrow">';
+		echo '<p>'.__('Howdy! This imports tags from Bunny&#8217;s Technorati Tags into WordPress tags.').'</p>';
+		echo '<p>'.__('This is suitable for Bunny&#8217;s Technorati Tags version 0.6.').'</p>';
+		echo '<p><strong>'.__('All existing Bunny&#8217;s Technorati Tags will be removed after import.').'</strong></p>';
+		echo '<p><strong>'.__('Don&#8217;t be stupid - backup your database before proceeding!').'</strong></p>';
+		echo '<form action="admin.php?import=btt&amp;step=1" method="post">';
+		wp_nonce_field('import-btt');
+		echo '<p class="submit"><input type="submit" name="submit" value="'.__('Import Tags').'" /></p>';
+		echo '</form>';
+		echo '</div>';
+	}
+
+	function dispatch() {
+		if ( empty($_GET['step']) )
+			$step = 0;
+		else
+			$step = absint($_GET['step']);
+
+		// load the header
+		$this->header();
+
+		switch ( $step ) {
+			case 0 :
+				$this->greet();
+				break;
+			case 1 :
+				check_admin_referer('import-btt');
+				$this->check_post_keyword( true );
+				break;
+			case 2 :
+				check_admin_referer('import-btt');
+				$this->check_post_keyword( false );
+				break;
+			case 3:
+				$this->done();
+				break;
+		}
+
+		// load the footer
+		$this->footer();
+	}
+
+	function check_post_keyword($precheck = true) {
+		global $wpdb;
+
+		echo '<div class="narrow">';
+		echo '<p><h3>'.__('Reading Bunny&#8217;s Technorati Tags&#8230;').'</h3></p>';
+
+		// import Bunny's Keywords tags
+		$metakeys = $wpdb->get_results("SELECT post_id, meta_id, meta_key, meta_value FROM $wpdb->postmeta WHERE $wpdb->postmeta.meta_key = 'tags'");
+		if ( !is_array($metakeys)) {
+			echo '<p>' . __('No Tags Found!') . '</p>';
+			return false;
+		} else {
+			$count = count($metakeys);
+			echo '<p>' . sprintf( __ngettext('Done! <strong>%s</strong> post with tags were read.', 'Done! <strong>%s</strong> posts with tags were read.', $count), $count ) . '<br /></p>';
+			echo '<ul>';
+			foreach ( $metakeys as $post_meta ) {
+				if ( $post_meta->meta_value != '' ) {
+					$post_keys = explode(' ', $post_meta->meta_value);
+					foreach ( $post_keys as $keyword ) {
+						$keyword = addslashes(trim(str_replace('+',' ',$keyword)));
+						if ( '' != $keyword ) {
+							echo '<li>' . $post_meta->post_id . '&nbsp;-&nbsp;' . $keyword . '</li>';
+							if ( !$precheck )
+								wp_add_post_tags($post_meta->post_id, $keyword);
+						}
+					}
+				}
+				if ( !$precheck )
+					delete_post_meta($post_meta->post_id, 'tags');
+			}
+			echo '</ul>';
+		}
+
+		echo '<form action="admin.php?import=btt&amp;step='.($precheck? 2:3).'" method="post">';
+		wp_nonce_field('import-btt');
+		echo '<p class="submit"><input type="submit" name="submit" value="'.__('Next').'" /></p>';
+		echo '</form>';
+		echo '</div>';
+	}
+
+	function done() {
+		echo '<div class="narrow">';
+		echo '<p><h3>'.__('Import Complete!').'</h3></p>';
+		echo '</div>';
+	}
+
+	function BunnyTags_Import() {
+	}
+
+}
+
+// create the import object
+$btt_import = new BunnyTags_Import();
+
+// add it to the import page!
+register_importer('btt', 'Bunny&#8217;s Technorati Tags', __('Import Bunny&#8217;s Technorati Tags into WordPress tags.'), array($btt_import, 'dispatch'));
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/import/dotclear.php 2.5.src/wp-admin/import/dotclear.php
--- 2.2.2.src/wp-admin/import/dotclear.php	2007-05-07 10:57:15.000000000 -0500
+++ 2.5.src/wp-admin/import/dotclear.php	2008-03-19 11:00:09.000000000 -0500
@@ -7,18 +7,6 @@
 /**
 	Add These Functions to make our lives easier
 **/
-if(!function_exists('get_catbynicename'))
-{
-	function get_catbynicename($category_nicename)
-	{
-	global $wpdb;
-
-	$cat_id -= 0; 	// force numeric
-	$name = $wpdb->get_var('SELECT cat_ID FROM '.$wpdb->categories.' WHERE category_nicename="'.$category_nicename.'"');
-
-	return $name;
-	}
-}
 
 if(!function_exists('get_comment_count'))
 {
@@ -29,15 +17,6 @@
 	}
 }
 
-if(!function_exists('link_cat_exists'))
-{
-	function link_cat_exists($catname)
-	{
-		global $wpdb;
-		return $wpdb->get_var('SELECT cat_id FROM '.$wpdb->linkcategories.' WHERE cat_name = "'.$wpdb->escape($catname).'"');
-	}
-}
-
 if(!function_exists('link_exists'))
 {
 	function link_exists($linkname)
@@ -130,26 +109,26 @@
 **/
 class Dotclear_Import {
 
-	function header() 
+	function header()
 	{
 		echo '<div class="wrap">';
 		echo '<h2>'.__('Import DotClear').'</h2>';
 		echo '<p>'.__('Steps may take a few minutes depending on the size of your database. Please be patient.').'</p>';
 	}
 
-	function footer() 
+	function footer()
 	{
 		echo '</div>';
 	}
 
-	function greet() 
+	function greet()
 	{
 		echo '<div class="narrow"><p>'.__('Howdy! This importer allows you to extract posts from a DotClear database into your blog.  Mileage may vary.').'</p>';
 		echo '<p>'.__('Your DotClear Configuration settings are as follows:').'</p>';
 		echo '<form action="admin.php?import=dotclear&amp;step=1" method="post">';
 		wp_nonce_field('import-dotclear');
 		$this->db_form();
-		echo '<p class="submit"><input type="submit" name="submit" value="'.attribute_escape(__('Import Categories &raquo;')).'" /></p>';
+		echo '<p class="submit"><input type="submit" name="submit" value="'.attribute_escape(__('Import Categories')).'" /></p>';
 		echo '</form></div>';
 	}
 
@@ -246,7 +225,7 @@
 
 			// Store category translation for future use
 			add_option('dccat2wpcat',$dccat2wpcat);
-			echo '<p>'.sprintf(__('Done! <strong>%1$s</strong> categories imported.'), $count).'<br /><br /></p>';
+			echo '<p>'.sprintf(__ngettext('Done! <strong>%1$s</strong> category imported.', 'Done! <strong>%1$s</strong> categories imported.', $count), $count).'<br /><br /></p>';
 			return true;
 		}
 		echo __('No Categories to Import!');
@@ -385,6 +364,8 @@
 							'ping_status'		=> $comment_status_map[$post_open_tb],
 							'comment_count'		=> $post_nb_comment + $post_nb_trackback)
 							);
+					if ( is_wp_error( $ret_id ) )
+						return $ret_id;
 				}
 				else
 				{
@@ -403,12 +384,17 @@
 							'ping_status'		=> $comment_status_map[$post_open_tb],
 							'comment_count'		=> $post_nb_comment + $post_nb_trackback)
 							);
+					if ( is_wp_error( $ret_id ) )
+						return $ret_id;
 				}
 				$dcposts2wpposts[$post_id] = $ret_id;
 
 				// Make Post-to-Category associations
 				$cats = array();
-				if($cat1 = get_catbynicename($post_cat_name)) { $cats[1] = $cat1; }
+				$category1 = get_category_by_slug($post_cat_name);
+				$category1 = $category1->term_id;
+
+				if($cat1 = $category1) { $cats[1] = $cat1; }
 
 				if(!empty($cats)) { wp_set_post_categories($ret_id, $cats); }
 			}
@@ -509,12 +495,11 @@
 				extract($link);
 
 				if ($title != "") {
-					if ($cinfo = link_cat_exists (csc ($title))) {
-						$category = $cinfo;
+					if ($cinfo = is_term(csc ($title), 'link_category')) {
+						$category = $cinfo['term_id'];
 					} else {
-						$wpdb->query ("INSERT INTO $wpdb->linkcategories (cat_name) VALUES ('".
-							$wpdb->escape (csc ($title))."')");
-						$category = $wpdb->insert_id;
+						$category = wp_insert_term($wpdb->escape (csc ($title)), 'link_category');
+						$category = $category['term_id'];
 					}
 				} else {
 					$linkname = $wpdb->escape(csc ($label));
@@ -541,7 +526,7 @@
 			}
 			add_option('dclinks2wplinks',$dclinks2wplinks);
 			echo '<p>';
-			printf(__('Done! <strong>%s</strong> links or link categories imported'), $count);
+			printf(__ngettext('Done! <strong>%s</strong> link or link category imported.', 'Done! <strong>%s</strong> links or link categories imported.', $count), $count);
 			echo '<br /><br /></p>';
 			return true;
 		}
@@ -581,7 +566,9 @@
 	{
 		// Post Import
 		$posts = $this->get_dc_posts();
-		$this->posts2wp($posts);
+		$result = $this->posts2wp($posts);
+		if ( is_wp_error( $result ) )
+			return $result;
 
 		echo '<form action="admin.php?import=dotclear&amp;step=4" method="post">';
 		wp_nonce_field('import-dotclear');
@@ -628,6 +615,7 @@
 		delete_option('dcname');
 		delete_option('dchost');
 		delete_option('dccharset');
+		do_action('import_done', 'dotclear');
 		$this->tips();
 	}
 
@@ -652,7 +640,7 @@
 
 	function db_form()
 	{
-		echo '<table class="editform">';
+		echo '<table class="form-table">';
 		printf('<tr><th><label for="dbuser">%s</label></th><td><input type="text" name="dbuser" id="dbuser" /></td></tr>', __('DotClear Database User:'));
 		printf('<tr><th><label for="dbpass">%s</label></th><td><input type="password" name="dbpass" id="dbpass" /></td></tr>', __('DotClear Database Password:'));
 		printf('<tr><th><label for="dbname">%s</label></th><td><input type="text" name="dbname" id="dbname" /></td></tr>', __('DotClear Database Name:'));
@@ -729,7 +717,9 @@
 				$this->import_users();
 				break;
 			case 3 :
-				$this->import_posts();
+				$result = $this->import_posts();
+				if ( is_wp_error( $result ) )
+					echo $result->get_error_message();
 				break;
 			case 4 :
 				$this->import_comments();
@@ -752,5 +742,5 @@
 }
 
 $dc_import = new Dotclear_Import();
-register_importer('dotclear', __('DotClear'), __('Import categories, users, posts, comments, and links from a DotClear blog'), array ($dc_import, 'dispatch'));
+register_importer('dotclear', __('DotClear'), __('Import categories, users, posts, comments, and links from a DotClear blog.'), array ($dc_import, 'dispatch'));
 ?>
diff -x .svn -aruN 2.2.2.src/wp-admin/import/greymatter.php 2.5.src/wp-admin/import/greymatter.php
--- 2.2.2.src/wp-admin/import/greymatter.php	2007-05-07 10:57:15.000000000 -0500
+++ 2.5.src/wp-admin/import/greymatter.php	2008-03-19 11:00:09.000000000 -0500
@@ -36,7 +36,7 @@
 <input type="hidden" name="step" value="1" />
 <?php wp_nonce_field('import-greymatter'); ?>
 <h3><?php _e('Second step: GreyMatter details:') ?></h3>
-<p><table cellpadding="0">
+<table class="form-table">
 <tr>
 <td><?php _e('Path to GM files:') ?></td>
 <td><input type="text" style="width:300px" name="gmpath" value="/home/my/site/cgi-bin/greymatter/" /></td>
@@ -46,17 +46,14 @@
 <td><input type="text" style="width:300px" name="archivespath" value="/home/my/site/cgi-bin/greymatter/archives/" /></td>
 </tr>
 <tr>
-<td colspan="2"><br /><?php _e("This importer will search for files 00000001.cgi to 000-whatever.cgi,<br />so you need to enter the number of the last GM post here.<br />(if you don't know that number, just log into your FTP and look it out<br />in the entries' folder)") ?></td>
-</tr>
-<tr>
 <td><?php _e("Last entry's number:") ?></td>
-<td><input type="text" name="lastentry" value="00000001" /></td>
+<td><input type="text" name="lastentry" value="00000001" /><br />
+	<?php _e("This importer will search for files 00000001.cgi to 000-whatever.cgi,<br />so you need to enter the number of the last GM post here.<br />(if you don't know that number, just log into your FTP and look it out<br />in the entries' folder)") ?></td>
 </tr>
 </table>
 </p>
-<p><?php _e("When you're ready, click OK to start importing: ") ?><input type="submit" name="submit" value="<?php _e('OK') ?>" class="search" /></p>
+<p><input type="submit" name="submit" value="<?php _e('Start Importing') ?>" class="button" /></p>
 </form>
-<p>&nbsp</p>
 <?php
 		$this->footer();
 	}
@@ -233,6 +230,8 @@
 
 				$postdata = compact('post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_excerpt', 'post_status', 'comment_status', 'ping_status', 'post_modified', 'post_modified_gmt');
 				$post_ID = wp_insert_post($postdata);
+				if ( is_wp_error( $post_ID ) )
+					return $post_ID;
 			}
 
 			$c=count($entry);
@@ -270,23 +269,25 @@
 				}
 				if ($numAddedComments > 0) {
 					echo ': ';
-					printf(__('imported %d comment(s)'), $numAddedComments);
+				printf( __ngettext('imported %s comment', 'imported %s comments', $numAddedComments) , $numAddedComments);
 				}
 				$preExisting = $numComments - numAddedComments;
 				if ($preExisting > 0) {
 					echo ' ';
-					printf(__('ignored %d pre-existing comments'), $preExisting);
+					printf( __ngettext( 'ignored %s pre-existing comment', 'ignored %s pre-existing comments', $preExisting ) , $preExisting);
 				}
 			}
 			echo '... <strong>'.__('Done').'</strong></li>';
 		}
 	}
+	do_action('import_done', 'greymatter');
 	?>
 </ul><strong><?php _e('Done') ?></strong></li></ul>
 <p>&nbsp;</p>
 <p><?php _e('Completed GreyMatter import!') ?></p>
 <?php
 	$this->footer();
+	return;
 	}
 
 	function dispatch() {
@@ -301,7 +302,9 @@
 				break;
 			case 1:
 				check_admin_referer('import-greymatter');
-				$this->import();
+				$result = $this->import();
+				if ( is_wp_error( $result ) )
+					echo $result->get_error_message();
 				break;
 		}
 	}
@@ -313,5 +316,5 @@
 
 $gm_import = new GM_Import();
 
-register_importer('greymatter', __('GreyMatter'), __('Import users, posts, and comments from a Greymatter blog'), array ($gm_import, 'dispatch'));
+register_importer('greymatter', __('GreyMatter'), __('Import users, posts, and comments from a Greymatter blog.'), array ($gm_import, 'dispatch'));
 ?>
diff -x .svn -aruN 2.2.2.src/wp-admin/import/jkw.php 2.5.src/wp-admin/import/jkw.php
--- 2.2.2.src/wp-admin/import/jkw.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/import/jkw.php	2008-02-27 15:47:52.000000000 -0600
@@ -0,0 +1,178 @@
+<?php
+
+class JeromesKeyword_Import {
+
+	function header() {
+		echo '<div class="wrap">';
+		echo '<h2>'.__('Import Jerome&#8217;s Keywords').'</h2>';
+		echo '<p>'.__('Steps may take a few minutes depending on the size of your database. Please be patient.').'<br /><br /></p>';
+	}
+
+	function footer() {
+		echo '</div>';
+	}
+
+	function greet() {
+		echo '<div class="narrow">';
+		echo '<p>'.__('Howdy! This imports tags from Jerome&#8217;s Keywords into WordPress tags.').'</p>';
+		echo '<p>'.__('This is suitable for Jerome&#8217;s Keywords version 1.x and 2.0a.').'</p>';
+		echo '<p><strong>'.__('All existing Jerome&#8217;s Keywords will be removed after import.').'</strong></p>';
+		echo '<p><strong>'.__('Don&#8217;t be stupid - backup your database before proceeding!').'</strong></p>';
+		echo '<form action="admin.php?import=jkw&amp;step=1" method="post">';
+		wp_nonce_field('import-jkw');
+		echo '<p class="submit"><input type="submit" name="submit" class="button" value="'.__('Import Version 1.x').'" /></p>';
+		echo '</form>';
+		echo '<form action="admin.php?import=jkw&amp;step=3" method="post">';
+		wp_nonce_field('import-jkw');
+		echo '<p class="submit"><input type="submit" name="submit" class="button" value="'.__('Import Version 2.0a').'" /></p>';
+		echo '</form>';
+		echo '</div>';
+	}
+
+	function dispatch() {
+		if ( empty($_GET['step']) )
+			$step = 0;
+		else
+			$step = absint($_GET['step']);
+
+		// load the header
+		$this->header();
+
+		switch ( $step ) {
+			case 0 :
+				$this->greet();
+				break;
+			case 1 :
+				check_admin_referer('import-jkw');
+				$this->check_V1_post_keyword( true );
+				break;
+			case 2 :
+				check_admin_referer('import-jkw');
+				$this->check_V1_post_keyword( false );
+				break;
+			case 3 :
+				check_admin_referer('import-jkw');
+				$this->check_V2_post_keyword( true );
+				break;
+			case 4 :
+				check_admin_referer('import-jkw');
+				$this->check_V2_post_keyword( false );
+				break;
+			case 5:
+				check_admin_referer('import-jkw');
+				$this->cleanup_V2_import();
+				break;
+			case 6:
+				$this->done();
+				break;
+		}
+
+		// load the footer
+		$this->footer();
+	}
+
+	function check_V1_post_keyword($precheck = true) {
+		global $wpdb;
+
+		echo '<div class="narrow">';
+		echo '<p><h3>'.__('Reading Jerome&#8217;s Keywords Tags&#8230;').'</h3></p>';
+
+		// import Jerome's Keywords tags
+		$metakeys = $wpdb->get_results("SELECT post_id, meta_id, meta_key, meta_value FROM $wpdb->postmeta WHERE $wpdb->postmeta.meta_key = 'keywords'");
+		if ( !is_array($metakeys)) {
+			echo '<p>' . __('No Tags Found!') . '</p>';
+			return false;
+		} else {
+			$count = count($metakeys);
+			echo '<p>' . sprintf( __ngettext('Done! <strong>%s</strong> post with tags were read.', 'Done! <strong>%s</strong> posts with tags were read.', $count), $count ) . '<br /></p>';
+			echo '<ul>';
+			foreach ( $metakeys as $post_meta ) {
+				if ( $post_meta->meta_value != '' ) {
+					$post_keys = explode(',', $post_meta->meta_value);
+					foreach ( $post_keys as $keyword ) {
+						$keyword = addslashes(trim($keyword));
+						if ( '' != $keyword ) {
+							echo '<li>' . $post_meta->post_id . '&nbsp;-&nbsp;' . $keyword . '</li>';
+							if ( !$precheck )
+								wp_add_post_tags($post_meta->post_id, $keyword);
+						}
+					}
+				}
+				if ( !$precheck )
+					delete_post_meta($post_meta->post_id, 'keywords');
+			}
+			echo '</ul>';
+		}
+
+		echo '<form action="admin.php?import=jkw&amp;step='.($precheck? 2:6).'" method="post">';
+		wp_nonce_field('import-jkw');
+		echo '<p class="submit"><input type="submit" name="submit" value="'.__('Next').'" /></p>';
+		echo '</form>';
+		echo '</div>';
+	}
+
+	function check_V2_post_keyword($precheck = true) {
+		global $wpdb;
+
+		echo '<div class="narrow">';
+		echo '<p><h3>'.__('Reading Jerome&#8217;s Keywords Tags&#8230;').'</h3></p>';
+
+		// import Jerome's Keywords tags
+		$tablename = $wpdb->prefix . substr(get_option('jkeywords_keywords_table'), 1, -1);
+		$metakeys = $wpdb->get_results("SELECT post_id, tag_name FROM $tablename");
+		if ( !is_array($metakeys) ) {
+			echo '<p>' . __('No Tags Found!') . '</p>';
+			return false;
+		} else {
+			$count = count($metakeys);
+			echo '<p>' . sprintf( __ngettext('Done! <strong>%s</strong> tag were read.', 'Done! <strong>%s</strong> tags were read.', $count), $count ) . '<br /></p>';
+			echo '<ul>';
+			foreach ( $metakeys as $post_meta ) {
+				$keyword = addslashes(trim($post_meta->tag_name));
+				if ( $keyword != '' ) {
+					echo '<li>' . $post_meta->post_id . '&nbsp;-&nbsp;' . $keyword . '</li>';
+					if ( !$precheck )
+						wp_add_post_tags($post_meta->post_id, $keyword);
+				}
+			}
+		echo '</ul>';
+		}
+		echo '<form action="admin.php?import=jkw&amp;step='.($precheck? 4:5).'" method="post">';
+		wp_nonce_field('import-jkw');
+		echo '<p class="submit"><input type="submit" name="submit" value="'.__('Next').'" /></p>';
+		echo '</form>';
+		echo '</div>';
+	}
+
+	function cleanup_V2_import() {
+		global $wpdb;
+
+		/* options from V2.0a (jeromes-keywords.php) */
+		$options = array('version', 'keywords_table', 'query_varname', 'template', 'meta_always_include', 'meta_includecats', 'meta_autoheader', 'search_strict', 'use_feed_cats', 'post_linkformat', 'post_tagseparator', 'post_includecats', 'post_notagstext', 'cloud_linkformat', 'cloud_tagseparator', 'cloud_includecats', 'cloud_sortorder', 'cloud_displaymax', 'cloud_displaymin', 'cloud_scalemax', 'cloud_scalemin');
+
+		$wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . substr(get_option('jkeywords_keywords_table'), 1, -1));
+
+		foreach ( $options as $o )
+			delete_option('jkeywords_' . $o);
+
+		$this->done();
+	}
+
+	function done() {
+		echo '<div class="narrow">';
+		echo '<p><h3>'.__('Import Complete!').'</h3></p>';
+		echo '</div>';
+	}
+
+	function JeromesKeyword_Import() {
+	}
+
+}
+
+// create the import object
+$jkw_import = new JeromesKeyword_Import();
+
+// add it to the import page!
+register_importer('jkw', 'Jerome&#8217;s Keywords', __('Import Jerome&#8217;s Keywords into WordPress tags.'), array($jkw_import, 'dispatch'));
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/import/livejournal.php 2.5.src/wp-admin/import/livejournal.php
--- 2.2.2.src/wp-admin/import/livejournal.php	2007-05-07 10:57:15.000000000 -0500
+++ 2.5.src/wp-admin/import/livejournal.php	2008-02-29 11:09:44.000000000 -0600
@@ -49,7 +49,7 @@
 
 			preg_match('|<eventtime>(.*?)</eventtime>|is', $post, $post_date);
 			$post_date = strtotime($post_date[1]);
-			$post_date = gmdate('Y-m-d H:i:s', $post_date);
+			$post_date = date('Y-m-d H:i:s', $post_date);
 
 			preg_match('|<event>(.*?)</event>|is', $post, $post_content);
 			$post_content = str_replace(array ('<![CDATA[', ']]>'), '', trim($post_content[1]));
@@ -66,11 +66,13 @@
 
 			echo '<li>';
 			if ($post_id = post_exists($post_title, $post_content, $post_date)) {
-				printf(__('Post <i>%s</i> already exists.'), stripslashes($post_title));
+				printf(__('Post <em>%s</em> already exists.'), stripslashes($post_title));
 			} else {
-				printf(__('Importing post <i>%s</i>...'), stripslashes($post_title));
+				printf(__('Importing post <em>%s</em>...'), stripslashes($post_title));
 				$postdata = compact('post_author', 'post_date', 'post_content', 'post_title', 'post_status');
 				$post_id = wp_insert_post($postdata);
+				if ( is_wp_error( $post_id ) )
+					return $post_id;
 				if (!$post_id) {
 					_e("Couldn't get post ID");
 					echo '</li>';
@@ -117,7 +119,7 @@
 			}
 			if ( $num_comments ) {
 				echo ' ';
-				printf(__('(%s comments)'), $num_comments);
+				printf(__ngettext('(%s comment)', '(%s comments)', $num_comments), $num_comments);
 			}
 			echo '</li>';
 		}
@@ -132,8 +134,11 @@
 		}
 
 		$this->file = $file['file'];
-		$this->import_posts();
+		$result = $this->import_posts();
+		if ( is_wp_error( $result ) )
+			return $result;
 		wp_import_cleanup($file['id']);
+		do_action('import_done', 'livejournal');
 
 		echo '<h3>';
 		printf(__('All done. <a href="%s">Have fun!</a>'), get_option('home'));
@@ -154,7 +159,9 @@
 				break;
 			case 1 :
 				check_admin_referer('import-upload');
-				$this->import();
+				$result = $this->import();
+				if ( is_wp_error( $result ) )
+					echo $result->get_error_message();
 				break;
 		}
 
@@ -168,5 +175,5 @@
 
 $livejournal_import = new LJ_Import();
 
-register_importer('livejournal', __('LiveJournal'), __('Import posts from a LiveJournal XML export file'), array ($livejournal_import, 'dispatch'));
+register_importer('livejournal', __('LiveJournal'), __('Import posts from a LiveJournal XML export file.'), array ($livejournal_import, 'dispatch'));
 ?>
diff -x .svn -aruN 2.2.2.src/wp-admin/import/mt.php 2.5.src/wp-admin/import/mt.php
--- 2.2.2.src/wp-admin/import/mt.php	2007-05-07 10:57:15.000000000 -0500
+++ 2.5.src/wp-admin/import/mt.php	2008-03-15 18:16:28.000000000 -0500
@@ -22,9 +22,20 @@
 		$this->header();
 ?>
 <div class="narrow">
-<p><?php _e('Howdy! We&#8217;re about to begin importing all of your Movable Type or Typepad entries into WordPress. To begin, choose a file to upload and click Upload file and import.'); ?></p>
+<p><?php _e('Howdy! We&#8217;re about to begin importing all of your Movable Type or Typepad entries into WordPress. To begin, either choose a file to upload and click "Upload file and import," or use FTP to upload your MT export file as <code>mt-export.txt</code> in your <code>/wp-content/</code> directory and then click "Import mt-export.txt"'); ?></p>
+
 <?php wp_import_upload_form( add_query_arg('step', 1) ); ?>
-	<p><?php _e('The importer is smart enough not to import duplicates, so you can run this multiple times without worry if&#8212;for whatever reason&#8212;it doesn\'t finish. If you get an <strong>out of memory</strong> error try splitting up the import file into pieces.'); ?> </p>
+<form method="post" action="<?php echo add_query_arg('step', 1); ?>" class="import-upload-form">
+
+<?php wp_nonce_field('import-upload'); ?>
+<p>
+	<input type="hidden" name="upload_type" value="ftp" />
+<?php _e('Or use <code>mt-export.txt</code> in your <code>/wp-content/</code> directory'); ?></p>
+<p class="submit">
+<input type="submit" value="<?php echo attribute_escape(__('Import mt-export.txt')); ?>" />
+</p>
+</form>
+<p><?php _e('The importer is smart enough not to import duplicates, so you can run this multiple times without worry if&#8212;for whatever reason&#8212;it doesn\'t finish. If you get an <strong>out of memory</strong> error try splitting up the import file into pieces.'); ?> </p>
 </div>
 <?php
 		$this->footer();
@@ -52,7 +63,7 @@
 	function checkauthor($author) {
 		global $wpdb;
 		//mtnames is an array with the names in the mt import file
-		$pass = 'changeme';
+		$pass = wp_generate_password();
 		if (!(in_array($author, $this->mtnames))) { //a new mt author name is found
 			++ $this->j;
 			$this->mtnames[$this->j] = $author; //add that new mt author name to an array
@@ -75,25 +86,27 @@
 		return $user_id;
 	}
 
-	function get_entries() {
-		set_magic_quotes_runtime(0);
-		$importdata = file($this->file); // Read the file into an array
-		$importdata = implode('', $importdata); // squish it
-		$importdata = preg_replace("/(\r\n|\n|\r)/", "\n", $importdata);
-		$importdata = preg_replace("/\n--------\n/", "--MT-ENTRY--\n", $importdata);
-		$this->posts = explode("--MT-ENTRY--", $importdata);
-	}
-
 	function get_mt_authors() {
-		$temp = array ();
-		$i = -1;
-		foreach ($this->posts as $post) {
-			if ('' != trim($post)) {
-				++ $i;
-				preg_match("|AUTHOR:(.*)|", $post, $thematch);
-				$thematch = trim($thematch[1]);
-				array_push($temp, "$thematch"); //store the extracted author names in a temporary array
-			}
+		$temp = array();
+		$authors = array();
+
+		$handle = fopen($this->file, 'r');
+		if ( $handle == null )
+			return false;
+
+		$in_comment = false;
+		while ( $line = fgets($handle) ) {
+			$line = trim($line);
+
+			if ( 'COMMENT:' == $line )
+				$in_comment = true;
+			else if ( '-----' == $line )
+				$in_comment = false;
+
+			if ( $in_comment || 0 !== strpos($line,"AUTHOR:") )
+				continue;
+
+			$temp[] = trim( substr($line, strlen("AUTHOR:")) );
 		}
 
 		//we need to find unique values of author names, while preserving the order, so this function emulates the unique_value(); php function, without the sorting.
@@ -105,6 +118,8 @@
 				array_push($authors, "$next");
 		}
 
+		fclose($handle);
+
 		return $authors;
 	}
 
@@ -138,9 +153,9 @@
 ?>
 <div class="wrap">
 <h2><?php _e('Assign Authors'); ?></h2>
-<p><?php _e('To make it easier for you to edit and save the imported posts and drafts, you may want to change the name of the author of the posts. For example, you may want to import all the entries as <code>admin</code>s entries.'); ?></p>
-<p><?php _e('Below, you can see the names of the authors of the MovableType posts in <i>italics</i>. For each of these names, you can either pick an author in your WordPress installation from the menu, or enter a name for the author in the textbox.'); ?></p>
-<p><?php _e('If a new user is created by WordPress, the password will be set, by default, to "changeme". Quite suggestive, eh? ;)'); ?></p>
+<p><?php _e('To make it easier for you to edit and save the imported posts and drafts, you may want to change the name of the author of the posts. For example, you may want to import all the entries as admin\'s entries.'); ?></p>
+<p><?php _e('Below, you can see the names of the authors of the MovableType posts in <em>italics</em>. For each of these names, you can either pick an author in your WordPress installation from the menu, or enter a name for the author in the textbox.'); ?></p>
+<p><?php _e('If a new user is created by WordPress, a password will be randomly generated. Manually change the user\'s details if necessary.'); ?></p>
 	<?php
 
 
@@ -156,14 +171,20 @@
 			echo '</li>';
 		}
 
-		echo '<input type="submit" value="'.__('Submit').'">'.'<br/>';
+		echo '<input type="submit" value="'.__('Submit').'">'.'<br />';
 		echo '</form>';
 		echo '</ol></div>';
 
 	}
 
 	function select_authors() {
-		$file = wp_import_handle_upload();
+		if ( $_POST['upload_type'] === 'ftp' ) {
+			$file['file'] = ABSPATH . 'wp-content/mt-export.txt';
+			if ( !file_exists($file['file']) )
+				$file['error'] = __('<code>mt-export.txt</code> does not exist');
+		} else {
+			$file = wp_import_handle_upload();
+		}
 		if ( isset($file['error']) ) {
 			$this->header();
 			echo '<p>'.__('Sorry, there has been an error').'.</p>';
@@ -174,237 +195,244 @@
 		$this->file = $file['file'];
 		$this->id = (int) $file['id'];
 
-		$this->get_entries();
 		$this->mt_authors_form();
 	}
 
+	function save_post(&$post, &$comments, &$pings) {
+		// Reset the counter
+		set_time_limit(30);
+		$post = get_object_vars($post);
+		$post = add_magic_quotes($post);
+		$post = (object) $post;
+
+		if ( $post_id = post_exists($post->post_title, '', $post->post_date) ) {
+			echo '<li>';
+			printf(__('Post <em>%s</em> already exists.'), stripslashes($post->post_title));
+		} else {
+			echo '<li>';
+			printf(__('Importing post <em>%s</em>...'), stripslashes($post->post_title));
+
+			if ( '' != trim( $post->extended ) )
+					$post->post_content .= "\n<!--more-->\n$post->extended";
+
+			$post->post_author = $this->checkauthor($post->post_author); //just so that if a post already exists, new users are not created by checkauthor
+			$post_id = wp_insert_post($post);
+			if ( is_wp_error( $post_id ) )
+				return $post_id;
+
+			// Add categories.
+			if ( 0 != count($post->categories) ) {
+				wp_create_categories($post->categories, $post_id);
+			}
+			
+			 // Add tags or keywords
+			if ( 1 < strlen($post->post_keywords) ) {
+			 	// Keywords exist. 
+				printf(__('<br />Adding tags <i>%s</i>...'), stripslashes($post->post_keywords));
+				wp_add_post_tags($post_id, $post->post_keywords);
+			}
+		}
+
+		$num_comments = 0;
+		foreach ( $comments as $comment ) {
+			$comment = get_object_vars($comment);
+			$comment = add_magic_quotes($comment);
+
+			if ( !comment_exists($comment['comment_author'], $comment['comment_date'])) {
+				$comment['comment_post_ID'] = $post_id;
+				$comment = wp_filter_comment($comment);
+				wp_insert_comment($comment);
+				$num_comments++;
+			}
+		}
+
+		if ( $num_comments )
+			printf(' '.__ngettext('(%s comment)', '(%s comments)', $num_comments), $num_comments);
+
+		$num_pings = 0;
+		foreach ( $pings as $ping ) {
+			$ping = get_object_vars($ping);
+			$ping = add_magic_quotes($ping);
+
+			if ( !comment_exists($ping['comment_author'], $ping['comment_date'])) {
+				$ping['comment_content'] = "<strong>{$ping['title']}</strong>\n\n{$ping['comment_content']}";
+				$ping['comment_post_ID'] = $post_id;
+				$ping = wp_filter_comment($ping);
+				wp_insert_comment($ping);
+				$num_pings++;
+			}
+		}
+
+		if ( $num_pings )
+			printf(' '.__ngettext('(%s ping)', '(%s pings)', $num_pings), $num_pings);
+
+		echo "</li>";
+		//ob_flush();flush();
+	}
+
 	function process_posts() {
 		global $wpdb;
-		$i = -1;
-		echo "<div class='wrap'><ol>";
-		foreach ($this->posts as $post) {
-			if ('' != trim($post)) {
-				++ $i;
-				unset ($post_categories);
-
-				// Take the pings out first
-				preg_match("|(-----\n\nPING:.*)|s", $post, $pings);
-				$post = preg_replace("|(-----\n\nPING:.*)|s", '', $post);
-
-				// Then take the comments out
-				preg_match("|(-----\nCOMMENT:.*)|s", $post, $comments);
-				$post = preg_replace("|(-----\nCOMMENT:.*)|s", '', $post);
-
-				// We ignore the keywords
-				$post = preg_replace("|(-----\nKEYWORDS:.*)|s", '', $post);
-
-				// We want the excerpt
-				preg_match("|-----\nEXCERPT:(.*)|s", $post, $excerpt);
-				$post_excerpt = $wpdb->escape(trim($excerpt[1]));
-				$post = preg_replace("|(-----\nEXCERPT:.*)|s", '', $post);
-
-				// We're going to put extended body into main body with a more tag
-				preg_match("|-----\nEXTENDED BODY:(.*)|s", $post, $extended);
-				$extended = trim($extended[1]);
-				if ('' != $extended)
-					$extended = "\n<!--more-->\n$extended";
-				$post = preg_replace("|(-----\nEXTENDED BODY:.*)|s", '', $post);
-
-				// Now for the main body
-				preg_match("|-----\nBODY:(.*)|s", $post, $body);
-				$body = trim($body[1]);
-				$post_content = $wpdb->escape($body.$extended);
-				$post = preg_replace("|(-----\nBODY:.*)|s", '', $post);
-
-				// Grab the metadata from what's left
-				$metadata = explode("\n", $post);
-				foreach ($metadata as $line) {
-					preg_match("/^(.*?):(.*)/", $line, $token);
-					$key = trim($token[1]);
-					$value = trim($token[2]);
-					// Now we decide what it is and what to do with it
-					switch ($key) {
-						case '' :
-							break;
-						case 'AUTHOR' :
-							$post_author = $value;
-							break;
-						case 'TITLE' :
-							$post_title = $wpdb->escape($value);
-							break;
-						case 'STATUS' :
-							// "publish" and "draft" enumeration items match up; no change required
-							$post_status = $value;
-							if (empty ($post_status))
-								$post_status = 'publish';
-							break;
-						case 'ALLOW COMMENTS' :
-							$post_allow_comments = $value;
-							if ($post_allow_comments == 1) {
-								$comment_status = 'open';
-							} else {
-								$comment_status = 'closed';
-							}
-							break;
-						case 'CONVERT BREAKS' :
-							$post_convert_breaks = $value;
-							break;
-						case 'ALLOW PINGS' :
-							$ping_status = trim($meta[2][0]);
-							if ($ping_status == 1) {
-								$ping_status = 'open';
-							} else {
-								$ping_status = 'closed';
-							}
-							break;
-						case 'PRIMARY CATEGORY' :
-							if (! empty ($value) )
-								$post_categories[] = $wpdb->escape($value);
-							break;
-						case 'CATEGORY' :
-							if (! empty ($value) )
-								$post_categories[] = $wpdb->escape($value);
-							break;
-						case 'DATE' :
-							$post_modified = strtotime($value);
-							$post_modified = date('Y-m-d H:i:s', $post_modified);
-							$post_modified_gmt = get_gmt_from_date("$post_modified");
-							$post_date = $post_modified;
-							$post_date_gmt = $post_modified_gmt;
-							break;
-						default :
-							// echo "\n$key: $value";
-							break;
-					} // end switch
-				} // End foreach
-
-				// Let's check to see if it's in already
-				if ($post_id = post_exists($post_title, '', $post_date)) {
-					echo '<li>';
-					printf(__('Post <i>%s</i> already exists.'), stripslashes($post_title));
-				} else {
-					echo '<li>';
-					printf(__('Importing post <i>%s</i>...'), stripslashes($post_title));
 
-					$post_author = $this->checkauthor($post_author); //just so that if a post already exists, new users are not created by checkauthor
+		$handle = fopen($this->file, 'r');
+		if ( $handle == null )
+			return false;
+
+		$context = '';
+		$post = new StdClass();
+		$comment = new StdClass();
+		$comments = array();
+		$ping = new StdClass();
+		$pings = array();
 
-					$postdata = compact('post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_excerpt', 'post_status', 'comment_status', 'ping_status', 'post_modified', 'post_modified_gmt');
-					$post_id = wp_insert_post($postdata);
-					// Add categories.
-					if (0 != count($post_categories)) {
-						wp_create_categories($post_categories, $post_id);
-					}
-				}
+		echo "<div class='wrap'><ol>";
 
-				$comment_post_ID = (int) $post_id;
-				$comment_approved = 1;
+		while ( $line = fgets($handle) ) {
+			$line = trim($line);
 
-				// Now for comments
-				$comments = explode("-----\nCOMMENT:", $comments[0]);
-				$num_comments = 0;
-				foreach ($comments as $comment) {
-					if ('' != trim($comment)) {
-						// Author
-						preg_match("|AUTHOR:(.*)|", $comment, $comment_author);
-						$comment_author = $wpdb->escape(trim($comment_author[1]));
-						$comment = preg_replace('|(\n?AUTHOR:.*)|', '', $comment);
-						preg_match("|EMAIL:(.*)|", $comment, $comment_author_email);
-						$comment_author_email = $wpdb->escape(trim($comment_author_email[1]));
-						$comment = preg_replace('|(\n?EMAIL:.*)|', '', $comment);
-
-						preg_match("|IP:(.*)|", $comment, $comment_author_IP);
-						$comment_author_IP = trim($comment_author_IP[1]);
-						$comment = preg_replace('|(\n?IP:.*)|', '', $comment);
-
-						preg_match("|URL:(.*)|", $comment, $comment_author_url);
-						$comment_author_url = $wpdb->escape(trim($comment_author_url[1]));
-						$comment = preg_replace('|(\n?URL:.*)|', '', $comment);
-
-						preg_match("|DATE:(.*)|", $comment, $comment_date);
-						$comment_date = trim($comment_date[1]);
-						$comment_date = date('Y-m-d H:i:s', strtotime($comment_date));
-						$comment = preg_replace('|(\n?DATE:.*)|', '', $comment);
-
-						$comment_content = $wpdb->escape(trim($comment));
-						$comment_content = str_replace('-----', '', $comment_content);
-						// Check if it's already there
-						if (!comment_exists($comment_author, $comment_date)) {
-							$commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_url', 'comment_author_email', 'comment_author_IP', 'comment_date', 'comment_content', 'comment_approved');
-							$commentdata = wp_filter_comment($commentdata);
-							wp_insert_comment($commentdata);
-							$num_comments++;
-						}
-					}
+			if ( '-----' == $line ) {
+				// Finishing a multi-line field
+				if ( 'comment' == $context ) {
+					$comments[] = $comment;
+					$comment = new StdClass();
+				} else if ( 'ping' == $context ) {
+					$pings[] = $ping;
+					$ping = new StdClass();
 				}
-				if ( $num_comments )
-					printf(' '.__('(%s comments)'), $num_comments);
-
-				// Finally the pings
-				// fix the double newline on the first one
-				$pings[0] = str_replace("-----\n\n", "-----\n", $pings[0]);
-				$pings = explode("-----\nPING:", $pings[0]);
-				$num_pings = 0;
-				foreach ($pings as $ping) {
-					if ('' != trim($ping)) {
-						// 'Author'
-						preg_match("|BLOG NAME:(.*)|", $ping, $comment_author);
-						$comment_author = $wpdb->escape(trim($comment_author[1]));
-						$ping = preg_replace('|(\n?BLOG NAME:.*)|', '', $ping);
-
-						preg_match("|IP:(.*)|", $ping, $comment_author_IP);
-						$comment_author_IP = trim($comment_author_IP[1]);
-						$ping = preg_replace('|(\n?IP:.*)|', '', $ping);
-
-						preg_match("|URL:(.*)|", $ping, $comment_author_url);
-						$comment_author_url = $wpdb->escape(trim($comment_author_url[1]));
-						$ping = preg_replace('|(\n?URL:.*)|', '', $ping);
-
-						preg_match("|DATE:(.*)|", $ping, $comment_date);
-						$comment_date = trim($comment_date[1]);
-						$comment_date = date('Y-m-d H:i:s', strtotime($comment_date));
-						$ping = preg_replace('|(\n?DATE:.*)|', '', $ping);
-
-						preg_match("|TITLE:(.*)|", $ping, $ping_title);
-						$ping_title = $wpdb->escape(trim($ping_title[1]));
-						$ping = preg_replace('|(\n?TITLE:.*)|', '', $ping);
-
-						$comment_content = $wpdb->escape(trim($ping));
-						$comment_content = str_replace('-----', '', $comment_content);
-
-						$comment_content = "<strong>$ping_title</strong>\n\n$comment_content";
-
-						$comment_type = 'trackback';
-
-						// Check if it's already there
-						if (!comment_exists($comment_author, $comment_date)) {
-							$commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_url', 'comment_author_email', 'comment_author_IP', 'comment_date', 'comment_content', 'comment_type', 'comment_approved');
-							$commentdata = wp_filter_comment($commentdata);
-							wp_insert_comment($commentdata);
-							$num_pings++;
-						}
-					}
+				$context = '';
+			} else if ( '--------' == $line ) {
+				// Finishing a post.
+				$context = '';
+				$result = $this->save_post($post, $comments, $pings);
+				if ( is_wp_error( $result ) )
+					return $result;
+				$post = new StdClass;
+				$comment = new StdClass();
+				$ping = new StdClass();
+				$comments = array();
+				$pings = array();
+			} else if ( 'BODY:' == $line ) {
+				$context = 'body';
+			} else if ( 'EXTENDED BODY:' == $line ) {
+				$context = 'extended';
+			} else if ( 'EXCERPT:' == $line ) {
+				$context = 'excerpt';
+			} else if ( 'KEYWORDS:' == $line ) {
+				$context = 'keywords';
+			} else if ( 'COMMENT:' == $line ) {
+				$context = 'comment';
+			} else if ( 'PING:' == $line ) {
+				$context = 'ping';
+			} else if ( 0 === strpos($line, "AUTHOR:") ) {
+				$author = trim( substr($line, strlen("AUTHOR:")) );
+				if ( '' == $context )
+					$post->post_author = $author;
+				else if ( 'comment' == $context )
+					 $comment->comment_author = $author;
+			} else if ( 0 === strpos($line, "TITLE:") ) {
+				$title = trim( substr($line, strlen("TITLE:")) );
+				if ( '' == $context )
+					$post->post_title = $title;
+				else if ( 'ping' == $context )
+					$ping->title = $title;
+			} else if ( 0 === strpos($line, "STATUS:") ) {
+				$status = trim( substr($line, strlen("STATUS:")) );
+				if ( empty($status) )
+					$status = 'publish';
+				$post->post_status = $status;
+			} else if ( 0 === strpos($line, "ALLOW COMMENTS:") ) {
+				$allow = trim( substr($line, strlen("ALLOW COMMENTS:")) );
+				if ( $allow == 1 )
+					$post->comment_status = 'open';
+				else
+					$post->comment_status = 'closed';
+			} else if ( 0 === strpos($line, "ALLOW PINGS:") ) {
+				$allow = trim( substr($line, strlen("ALLOW PINGS:")) );
+				if ( $allow == 1 )
+					$post->ping_status = 'open';
+				else
+					$post->ping_status = 'closed';
+			} else if ( 0 === strpos($line, "CATEGORY:") ) {
+				$category = trim( substr($line, strlen("CATEGORY:")) );
+				if ( '' != $category )
+					$post->categories[] = $category;
+			} else if ( 0 === strpos($line, "PRIMARY CATEGORY:") ) {
+				$category = trim( substr($line, strlen("PRIMARY CATEGORY:")) );
+				if ( '' != $category )
+					$post->categories[] = $category;
+			} else if ( 0 === strpos($line, "DATE:") ) {
+				$date = trim( substr($line, strlen("DATE:")) );
+				$date = strtotime($date);
+				$date = date('Y-m-d H:i:s', $date);
+				$date_gmt = get_gmt_from_date($date);
+				if ( '' == $context ) {
+					$post->post_modified = $date;
+					$post->post_modified_gmt = $date_gmt;
+					$post->post_date = $date;
+					$post->post_date_gmt = $date_gmt;
+				} else if ( 'comment' == $context ) {
+					$comment->comment_date = $date;
+				} else if ( 'ping' == $context ) {
+					$ping->comment_date = $date;
 				}
-				if ( $num_pings )
-					printf(' '.__('(%s pings)'), $num_pings);
+			} else if ( 0 === strpos($line, "EMAIL:") ) {
+				$email = trim( substr($line, strlen("EMAIL:")) );
+				if ( 'comment' == $context )
+					$comment->comment_author_email = $email;
+				else
+					$ping->comment_author_email = '';
+			} else if ( 0 === strpos($line, "IP:") ) {
+				$ip = trim( substr($line, strlen("IP:")) );
+				if ( 'comment' == $context )
+					$comment->comment_author_IP = $ip;
+				else
+					$ping->comment_author_IP = $ip;
+			} else if ( 0 === strpos($line, "URL:") ) {
+				$url = trim( substr($line, strlen("URL:")) );
+				if ( 'comment' == $context )
+					$comment->comment_author_url = $url;
+				else
+					$ping->comment_author_url = $url;
+			} else if ( 0 === strpos($line, "BLOG NAME:") ) {
+				$blog = trim( substr($line, strlen("BLOG NAME:")) );
+				$ping->comment_author = $blog;
+			} else {
+				// Processing multi-line field, check context.
 
-				echo "</li>";
+				$line .= "\n";
+				if ( 'body' == $context ) {
+					$post->post_content .= $line;
+				} else if ( 'extended' ==  $context ) {
+					$post->extended .= $line;
+				} else if ( 'excerpt' == $context ) {
+					$post->post_excerpt .= $line;
+				} else if ( 'keywords' == $context ) {
+					$post->post_keywords .= $line;
+				} else if ( 'comment' == $context ) {
+					$comment->comment_content .= $line;
+				} else if ( 'ping' == $context ) {
+					$ping->comment_content .= $line;
+				}
 			}
 		}
 
 		echo '</ol>';
 
 		wp_import_cleanup($this->id);
+		do_action('import_done', 'mt');
 
 		echo '<h3>'.sprintf(__('All done. <a href="%s">Have fun!</a>'), get_option('home')).'</h3></div>';
 	}
 
 	function import() {
 		$this->id = (int) $_GET['id'];
-
-		$this->file = get_attached_file($this->id);
+		if ( $this->id == 0 )
+			$this->file = ABSPATH . 'wp-content/mt-export.txt';
+		else
+			$this->file = get_attached_file($this->id);
 		$this->get_authors_from_post();
-		$this->get_entries();
-		$this->process_posts();
+		$result = $this->process_posts();
+		if ( is_wp_error( $result ) )
+			return $result;
 	}
 
 	function dispatch() {
@@ -423,7 +451,9 @@
 				break;
 			case 2:
 				check_admin_referer('import-mt');
-				$this->import();
+				$result = $this->import();
+				if ( is_wp_error( $result ) )
+					echo $result->get_error_message();
 				break;
 		}
 	}
@@ -435,5 +465,5 @@
 
 $mt_import = new MT_Import();
 
-register_importer('mt', __('Movable Type and TypePad'), __('Import posts and comments from a Movable Type or Typepad blog'), array ($mt_import, 'dispatch'));
-?>
\ No newline at end of file
+register_importer('mt', __('Movable Type and TypePad'), __('Import posts and comments from a Movable Type or Typepad blog.'), array ($mt_import, 'dispatch'));
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/import/rss.php 2.5.src/wp-admin/import/rss.php
--- 2.2.2.src/wp-admin/import/rss.php	2007-05-07 10:57:15.000000000 -0500
+++ 2.5.src/wp-admin/import/rss.php	2008-02-27 16:05:50.000000000 -0600
@@ -71,7 +71,7 @@
 				$cat_index++;
 			}
 
-			preg_match('|<guid.+?>(.*?)</guid>|is', $post, $guid);
+			preg_match('|<guid.*?>(.*?)</guid>|is', $post, $guid);
 			if ($guid)
 				$guid = $wpdb->escape(trim($guid[1]));
 			else
@@ -110,6 +110,8 @@
 				_e('Post already imported');
 			} else {
 				$post_id = wp_insert_post($post);
+				if ( is_wp_error( $post_id ) )
+					return $post_id;
 				if (!$post_id) {
 					_e("Couldn't get post ID");
 					return;
@@ -135,8 +137,11 @@
 
 		$this->file = $file['file'];
 		$this->get_posts();
-		$this->import_posts();
+		$result = $this->import_posts();
+		if ( is_wp_error( $result ) )
+			return $result;
 		wp_import_cleanup($file['id']);
+		do_action('import_done', 'rss');
 
 		echo '<h3>';
 		printf(__('All done. <a href="%s">Have fun!</a>'), get_option('home'));
@@ -157,7 +162,9 @@
 				break;
 			case 1 :
 				check_admin_referer('import-upload');
-				$this->import();
+				$result = $this->import();
+				if ( is_wp_error( $result ) )
+					echo $result->get_error_message();
 				break;
 		}
 
@@ -171,5 +178,5 @@
 
 $rss_import = new RSS_Import();
 
-register_importer('rss', __('RSS'), __('Import posts from an RSS feed'), array ($rss_import, 'dispatch'));
+register_importer('rss', __('RSS'), __('Import posts from an RSS feed.'), array ($rss_import, 'dispatch'));
 ?>
diff -x .svn -aruN 2.2.2.src/wp-admin/import/stp.php 2.5.src/wp-admin/import/stp.php
--- 2.2.2.src/wp-admin/import/stp.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/import/stp.php	2008-03-01 14:54:00.000000000 -0600
@@ -0,0 +1,155 @@
+<?php
+class STP_Import {
+	function header()  {
+		echo '<div class="wrap">';
+		echo '<h2>'.__('Import Simple Tagging').'</h2>';
+		echo '<p>'.__('Steps may take a few minutes depending on the size of your database. Please be patient.').'<br /><br /></p>';
+	}
+
+	function footer() {
+		echo '</div>';
+	}
+
+	function greet() {
+		echo '<div class="narrow">';
+		echo '<p>'.__('Howdy! This imports tags from Simple Tagging 1.6.2 into WordPress tags.').'</p>';
+		echo '<p>'.__('This has not been tested on any other versions of Simple Tagging. Mileage may vary.').'</p>';
+		echo '<p>'.__('To accommodate larger databases for those tag-crazy authors out there, we have made this into an easy 4-step program to help you kick that nasty Simple Tagging habit. Just keep clicking along and we will let you know when you are in the clear!').'</p>';
+		echo '<p><strong>'.__('Don&#8217;t be stupid - backup your database before proceeding!').'</strong></p>';
+		echo '<form action="admin.php?import=stp&amp;step=1" method="post">';
+		wp_nonce_field('import-stp');
+		echo '<p class="submit"><input type="submit" name="submit" value="'.__('Step 1').'" /></p>';
+		echo '</form>';
+		echo '</div>';
+	}
+
+	function dispatch () {
+		if ( empty( $_GET['step'] ) ) {
+			$step = 0;
+		} else {
+			$step = (int) $_GET['step'];
+		}
+		// load the header
+		$this->header();
+		switch ( $step ) {
+			case 0 :
+				$this->greet();
+				break;
+			case 1 :
+				check_admin_referer('import-stp');
+				$this->import_posts();
+				break;
+			case 2:
+				check_admin_referer('import-stp');
+				$this->import_t2p();
+				break;
+			case 3:
+				check_admin_referer('import-stp');
+				$this->cleanup_import();
+				break;
+		}
+		// load the footer
+		$this->footer();
+	}
+
+
+	function import_posts ( ) {
+		echo '<div class="narrow">';
+		echo '<p><h3>'.__('Reading STP Post Tags&#8230;').'</h3></p>';
+
+		// read in all the STP tag -> post settings
+		$posts = $this->get_stp_posts();
+
+		// if we didn't get any tags back, that's all there is folks!
+		if ( !is_array($posts) ) {
+			echo '<p>' . __('No posts were found to have tags!') . '</p>';
+			return false;
+		}
+		else {
+			// if there's an existing entry, delete it
+			if ( get_option('stpimp_posts') ) {
+				delete_option('stpimp_posts');
+			}
+
+			add_option('stpimp_posts', $posts);
+			$count = count($posts);
+			echo '<p>' . sprintf( __ngettext('Done! <strong>%s</strong> tag to post relationships were read.', 'Done! <strong>%s</strong> tags to post relationships were read.', $count), $count ) . '<br /></p>';
+		}
+
+		echo '<form action="admin.php?import=stp&amp;step=2" method="post">';
+		wp_nonce_field('import-stp');
+		echo '<p class="submit"><input type="submit" name="submit" value="'.__('Step 2').'" /></p>';
+		echo '</form>';
+		echo '</div>';
+	}
+
+
+	function import_t2p ( ) {
+		echo '<div class="narrow">';
+		echo '<p><h3>'.__('Adding Tags to Posts&#8230;').'</h3></p>';
+
+		// run that funky magic!
+		$tags_added = $this->tag2post();
+
+		echo '<p>' . sprintf( __ngettext('Done! <strong>%s</strong> tag was added!', 'Done! <strong>%s</strong> tags were added!', $tags_added), $tags_added ) . '<br /></p>';
+		echo '<form action="admin.php?import=stp&amp;step=3" method="post">';
+		wp_nonce_field('import-stp');
+		echo '<p class="submit"><input type="submit" name="submit" value="'.__('Step 3').'" /></p>';
+		echo '</form>';
+		echo '</div>';
+	}
+
+	function get_stp_posts ( ) {
+		global $wpdb;
+		// read in all the posts from the STP post->tag table: should be wp_post2tag
+		$posts_query = "SELECT post_id, tag_name FROM " . $wpdb->prefix . "stp_tags";
+		$posts = $wpdb->get_results($posts_query);
+		return $posts;
+	}
+
+	function tag2post ( ) {
+		global $wpdb;
+
+		// get the tags and posts we imported in the last 2 steps
+		$posts = get_option('stpimp_posts');
+
+		// null out our results
+		$tags_added = 0;
+
+		// loop through each post and add its tags to the db
+		foreach ( $posts as $this_post ) {
+			$the_post = (int) $this_post->post_id;
+			$the_tag = $wpdb->escape($this_post->tag_name);
+			// try to add the tag
+			wp_add_post_tags($the_post, $the_tag);
+			$tags_added++;
+		}
+
+		// that's it, all posts should be linked to their tags properly, pending any errors we just spit out!
+		return $tags_added;
+	}
+
+	function cleanup_import ( ) {
+		delete_option('stpimp_posts');
+		$this->done();
+	}
+
+	function done ( ) {
+		echo '<div class="narrow">';
+		echo '<p><h3>'.__('Import Complete!').'</h3></p>';
+		echo '<p>' . __('OK, so we lied about this being a 4-step program! You&#8217;re done!') . '</p>';
+		echo '<p>' . __('Now wasn&#8217;t that easy?') . '</p>';
+		echo '</div>';
+	}
+
+	function STP_Import ( ) {
+		// Nothing.
+	}
+}
+
+// create the import object
+$stp_import = new STP_Import();
+
+// add it to the import page!
+register_importer('stp', 'Simple Tagging', __('Import Simple Tagging tags into WordPress tags.'), array($stp_import, 'dispatch'));
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/import/textpattern.php 2.5.src/wp-admin/import/textpattern.php
--- 2.2.2.src/wp-admin/import/textpattern.php	2007-05-07 10:57:15.000000000 -0500
+++ 2.5.src/wp-admin/import/textpattern.php	2008-03-19 11:00:09.000000000 -0500
@@ -2,18 +2,6 @@
 /**
 	Add These Functions to make our lives easier
 **/
-if(!function_exists('get_catbynicename'))
-{
-	function get_catbynicename($category_nicename)
-	{
-	global $wpdb;
-
-	$cat_id -= 0; 	// force numeric
-	$name = $wpdb->get_var('SELECT cat_ID FROM '.$wpdb->categories.' WHERE category_nicename="'.$category_nicename.'"');
-
-	return $name;
-	}
-}
 
 if(!function_exists('get_comment_count'))
 {
@@ -38,14 +26,14 @@
 **/
 class Textpattern_Import {
 
-	function header() 
+	function header()
 	{
 		echo '<div class="wrap">';
 		echo '<h2>'.__('Import Textpattern').'</h2>';
 		echo '<p>'.__('Steps may take a few minutes depending on the size of your database. Please be patient.').'</p>';
 	}
 
-	function footer() 
+	function footer()
 	{
 		echo '</div>';
 	}
@@ -58,7 +46,7 @@
 		echo '<form action="admin.php?import=textpattern&amp;step=1" method="post">';
 		wp_nonce_field('import-textpattern');
 		$this->db_form();
-		echo '<p class="submit"><input type="submit" name="submit" value="'.attribute_escape(__('Import Categories &raquo;')).'" /></p>';
+		echo '<p class="submit"><input type="submit" class="button" name="submit" value="'.attribute_escape(__('Import')).'" /></p>';
 		echo '</form>';
 		echo '</div>';
 	}
@@ -189,7 +177,7 @@
 
 			// Store category translation for future use
 			add_option('txpcat2wpcat',$txpcat2wpcat);
-			echo '<p>'.sprintf(__('Done! <strong>%1$s</strong> categories imported.'), $count).'<br /><br /></p>';
+			echo '<p>'.sprintf(__ngettext('Done! <strong>%1$s</strong> category imported.', 'Done! <strong>%1$s</strong> categories imported.', $count), $count).'<br /><br /></p>';
 			return true;
 		}
 		echo __('No Categories to Import!');
@@ -317,6 +305,8 @@
 						'post_name'			=> $url_title,
 						'comment_count'		=> $comments_count)
 						);
+					if ( is_wp_error( $ret_id ) )
+						return $ret_id;
 				}
 				else
 				{
@@ -333,13 +323,19 @@
 						'post_name'			=> $url_title,
 						'comment_count'		=> $comments_count)
 						);
+					if ( is_wp_error( $ret_id ) )
+						return $ret_id;
 				}
 				$txpposts2wpposts[$ID] = $ret_id;
 
 				// Make Post-to-Category associations
 				$cats = array();
-				if($cat1 = get_catbynicename($Category1)) { $cats[1] = $cat1; }
-				if($cat2 = get_catbynicename($Category2)) { $cats[2] = $cat2; }
+				$category1 = get_category_by_slug($Category1);
+				$category1 = $category1->term_id;
+				$category2 = get_category_by_slug($Category2);
+				$category2 = $category1->term_id;
+				if($cat1 = $category1) { $cats[1] = $cat1; }
+				if($cat2 = $category2) { $cats[2] = $cat2; }
 
 				if(!empty($cats)) { wp_set_post_categories($ret_id, $cats); }
 			}
@@ -466,7 +462,7 @@
 			}
 			add_option('txplinks2wplinks',$txplinks2wplinks);
 			echo '<p>';
-			printf(__('Done! <strong>%s</strong> Links imported'), $count);
+			printf(__ngettext('Done! <strong>%s</strong> link imported', 'Done! <strong>%s</strong> links imported', $count), $count);
 			echo '<br /><br /></p>';
 			return true;
 		}
@@ -485,7 +481,7 @@
 
 		echo '<form action="admin.php?import=textpattern&amp;step=2" method="post">';
 		wp_nonce_field('import-textpattern');
-		printf('<input type="submit" name="submit" value="%s" />', attribute_escape(__('Import Users')));
+		printf('<input type="submit" class="button" name="submit" value="%s" />', attribute_escape(__('Import Users')));
 		echo '</form>';
 
 	}
@@ -498,7 +494,7 @@
 
 		echo '<form action="admin.php?import=textpattern&amp;step=3" method="post">';
 		wp_nonce_field('import-textpattern');
-		printf('<input type="submit" name="submit" value="%s" />', attribute_escape(__('Import Posts')));
+		printf('<input type="submit" class="button" name="submit" value="%s" />', attribute_escape(__('Import Posts')));
 		echo '</form>';
 	}
 
@@ -506,11 +502,13 @@
 	{
 		// Post Import
 		$posts = $this->get_txp_posts();
-		$this->posts2wp($posts);
+		$result = $this->posts2wp($posts);
+		if ( is_wp_error( $result ) )
+			return $result;
 
 		echo '<form action="admin.php?import=textpattern&amp;step=4" method="post">';
 		wp_nonce_field('import-textpattern');
-		printf('<input type="submit" name="submit" value="%s" />', attribute_escape(__('Import Comments')));
+		printf('<input type="submit" class="button" name="submit" value="%s" />', attribute_escape(__('Import Comments')));
 		echo '</form>';
 	}
 
@@ -522,7 +520,7 @@
 
 		echo '<form action="admin.php?import=textpattern&amp;step=5" method="post">';
 		wp_nonce_field('import-textpattern');
-		printf('<input type="submit" name="submit" value="%s" />', attribute_escape(__('Import Links')));
+		printf('<input type="submit" class="button" name="submit" value="%s" />', attribute_escape(__('Import Links')));
 		echo '</form>';
 	}
 
@@ -535,7 +533,7 @@
 
 		echo '<form action="admin.php?import=textpattern&amp;step=6" method="post">';
 		wp_nonce_field('import-textpattern');
-		printf('<input type="submit" name="submit" value="%s" />', attribute_escape(__('Finish')));
+		printf('<input type="submit" class="button" name="submit" value="%s" />', attribute_escape(__('Finish')));
 		echo '</form>';
 	}
 
@@ -552,6 +550,7 @@
 		delete_option('txppass');
 		delete_option('txpname');
 		delete_option('txphost');
+		do_action('import_done', 'textpattern');
 		$this->tips();
 	}
 
@@ -559,11 +558,11 @@
 	{
 		echo '<p>'.__('Welcome to WordPress.  We hope (and expect!) that you will find this platform incredibly rewarding!  As a new WordPress user coming from Textpattern, there are some things that we would like to point out.  Hopefully, they will help your transition go as smoothly as possible.').'</p>';
 		echo '<h3>'.__('Users').'</h3>';
-		echo '<p>'.sprintf(__('You have already setup WordPress and have been assigned an administrative login and password.  Forget it.  You didn\'t have that login in Textpattern, why should you have it here?  Instead we have taken care to import all of your users into our system.  Unfortunately there is one downside.  Because both WordPress and Textpattern uses a strong encryption hash with passwords, it is impossible to decrypt it and we are forced to assign temporary passwords to all your users.  <strong>Every user has the same username, but their passwords are reset to password123.</strong>  So <a href="%1$s">Login</a> and change it.'), '/wp-login.php').'</p>';
+		echo '<p>'.sprintf(__('You have already setup WordPress and have been assigned an administrative login and password.  Forget it.  You didn&#8217;t have that login in Textpattern, why should you have it here?  Instead we have taken care to import all of your users into our system.  Unfortunately there is one downside.  Because both WordPress and Textpattern uses a strong encryption hash with passwords, it is impossible to decrypt it and we are forced to assign temporary passwords to all your users.  <strong>Every user has the same username, but their passwords are reset to password123.</strong>  So <a href="%1$s">Login</a> and change it.'), get_bloginfo( 'wpurl' ) . '/wp-login.php').'</p>';
 		echo '<h3>'.__('Preserving Authors').'</h3>';
 		echo '<p>'.__('Secondly, we have attempted to preserve post authors.  If you are the only author or contributor to your blog, then you are safe.  In most cases, we are successful in this preservation endeavor.  However, if we cannot ascertain the name of the writer due to discrepancies between database tables, we assign it to you, the administrative user.').'</p>';
 		echo '<h3>'.__('Textile').'</h3>';
-		echo '<p>'.__('Also, since you\'re coming from Textpattern, you probably have been using Textile to format your comments and posts.  If this is the case, we recommend downloading and installing <a href="http://www.huddledmasses.org/category/development/wordpress/textile/">Textile for WordPress</a>.  Trust me... You\'ll want it.').'</p>';
+		echo '<p>'.__('Also, since you&#8217;re coming from Textpattern, you probably have been using Textile to format your comments and posts.  If this is the case, we recommend downloading and installing <a href="http://www.huddledmasses.org/category/development/wordpress/textile/">Textile for WordPress</a>.  Trust me... You&#8217;ll want it.').'</p>';
 		echo '<h3>'.__('WordPress Resources').'</h3>';
 		echo '<p>'.__('Finally, there are numerous WordPress resources around the internet.  Some of them are:').'</p>';
 		echo '<ul>';
@@ -571,12 +570,12 @@
 		echo '<li>'.__('<a href="http://wordpress.org/support/">The WordPress support forums</a>').'</li>';
 		echo '<li>'.__('<a href="http://codex.wordpress.org">The Codex (In other words, the WordPress Bible)</a>').'</li>';
 		echo '</ul>';
-		echo '<p>'.sprintf(__('That\'s it! What are you waiting for? Go <a href="%1$s">login</a>!'), '/wp-login.php').'</p>';
+		echo '<p>'.sprintf(__('That&#8217;s it! What are you waiting for? Go <a href="%1$s">login</a>!'), get_bloginfo( 'wpurl' ) . '/wp-login.php').'</p>';
 	}
 
 	function db_form()
 	{
-		echo '<table class="editform">';
+		echo '<table class="form-table">';
 		printf('<tr><th scope="row"><label for="dbuser">%s</label></th><td><input type="text" name="dbuser" id="dbuser" /></td></tr>', __('Textpattern Database User:'));
 		printf('<tr><th scope="row"><label for="dbpass">%s</label></th><td><input type="password" name="dbpass" id="dbpass" /></td></tr>', __('Textpattern Database Password:'));
 		printf('<tr><th scope="row"><label for="dbname">%s</label></th><td><input type="text" id="dbname" name="dbname" /></td></tr>', __('Textpattern Database Name:'));
@@ -646,7 +645,9 @@
 				$this->import_users();
 				break;
 			case 3 :
-				$this->import_posts();
+				$result = $this->import_posts();
+				if ( is_wp_error( $result ) )
+					echo $result->get_error_message();
 				break;
 			case 4 :
 				$this->import_comments();
@@ -669,5 +670,5 @@
 }
 
 $txp_import = new Textpattern_Import();
-register_importer('textpattern', __('Textpattern'), __('Import categories, users, posts, comments, and links from a Textpattern blog'), array ($txp_import, 'dispatch'));
+register_importer('textpattern', __('Textpattern'), __('Import categories, users, posts, comments, and links from a Textpattern blog.'), array ($txp_import, 'dispatch'));
 ?>
diff -x .svn -aruN 2.2.2.src/wp-admin/import/utw.php 2.5.src/wp-admin/import/utw.php
--- 2.2.2.src/wp-admin/import/utw.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/import/utw.php	2008-02-27 15:47:52.000000000 -0600
@@ -0,0 +1,276 @@
+<?php
+
+class UTW_Import {
+
+	function header()  {
+		echo '<div class="wrap">';
+		echo '<h2>'.__('Import Ultimate Tag Warrior').'</h2>';
+		echo '<p>'.__('Steps may take a few minutes depending on the size of your database. Please be patient.').'<br /><br /></p>';
+	}
+
+	function footer() {
+		echo '</div>';
+	}
+
+	function greet() {
+		echo '<div class="narrow">';
+		echo '<p>'.__('Howdy! This imports tags from Ultimate Tag Warrior 3 into WordPress tags.').'</p>';
+		echo '<p>'.__('This has not been tested on any other versions of Ultimate Tag Warrior. Mileage may vary.').'</p>';
+		echo '<p>'.__('To accommodate larger databases for those tag-crazy authors out there, we have made this into an easy 5-step program to help you kick that nasty UTW habit. Just keep clicking along and we will let you know when you are in the clear!').'</p>';
+		echo '<p><strong>'.__('Don&#8217;t be stupid - backup your database before proceeding!').'</strong></p>';
+		echo '<form action="admin.php?import=utw&amp;step=1" method="post">';
+		echo '<p class="submit"><input type="submit" name="submit" value="'.__('Step 1').'" /></p>';
+		echo '</form>';
+		echo '</div>';
+	}
+
+
+	function dispatch () {
+		if ( empty( $_GET['step'] ) ) {
+			$step = 0;
+		} else {
+			$step = (int) $_GET['step'];
+		}
+
+		if ( $step > 1 )
+			check_admin_referer('import-utw');
+
+		// load the header
+		$this->header();
+
+		switch ( $step ) {
+			case 0 :
+				$this->greet();
+				break;
+			case 1 :
+				$this->import_tags();
+				break;
+			case 2 :
+				$this->import_posts();
+				break;
+			case 3:
+				$this->import_t2p();
+				break;
+			case 4:
+				$this->cleanup_import();
+				break;
+		}
+
+		// load the footer
+		$this->footer();
+	}
+
+
+	function import_tags ( ) {
+		echo '<div class="narrow">';
+		echo '<p><h3>'.__('Reading UTW Tags&#8230;').'</h3></p>';
+
+		$tags = $this->get_utw_tags();
+
+		// if we didn't get any tags back, that's all there is folks!
+		if ( !is_array($tags) ) {
+			echo '<p>' . __('No Tags Found!') . '</p>';
+			return false;
+		}
+		else {
+
+			// if there's an existing entry, delete it
+			if ( get_option('utwimp_tags') ) {
+				delete_option('utwimp_tags');
+			}
+
+			add_option('utwimp_tags', $tags);
+
+
+			$count = count($tags);
+
+			echo '<p>' . sprintf( __ngettext('Done! <strong>%s</strong> tag were read.', 'Done! <strong>%s</strong> tags were read.', $count), $count ) . '<br /></p>';
+			echo '<p>' . __('The following tags were found:') . '</p>';
+
+			echo '<ul>';
+
+			foreach ( $tags as $tag_id => $tag_name ) {
+
+				echo '<li>' . $tag_name . '</li>';
+
+			}
+
+			echo '</ul>';
+
+			echo '<br />';
+
+			echo '<p>' . __('If you don&#8217;t want to import any of these tags, you should delete them from the UTW tag management page and then re-run this import.') . '</p>';
+
+
+		}
+
+		echo '<form action="admin.php?import=utw&amp;step=2" method="post">';
+		wp_nonce_field('import-utw');
+		echo '<p class="submit"><input type="submit" name="submit" value="'.__('Step 2').'" /></p>';
+		echo '</form>';
+		echo '</div>';
+	}
+
+
+	function import_posts ( ) {
+		echo '<div class="narrow">';
+		echo '<p><h3>'.__('Reading UTW Post Tags&#8230;').'</h3></p>';
+
+		// read in all the UTW tag -> post settings
+		$posts = $this->get_utw_posts();
+
+		// if we didn't get any tags back, that's all there is folks!
+		if ( !is_array($posts) ) {
+			echo '<p>' . __('No posts were found to have tags!') . '</p>';
+			return false;
+		}
+		else {
+
+			// if there's an existing entry, delete it
+			if ( get_option('utwimp_posts') ) {
+				delete_option('utwimp_posts');
+			}
+
+			add_option('utwimp_posts', $posts);
+
+
+			$count = count($posts);
+
+			echo '<p>' . sprintf( __ngettext('Done! <strong>%s</strong> tag to post relationships were read.', 'Done! <strong>%s</strong> tags to post relationships were read.', $count), $count ) . '<br /></p>';
+
+		}
+
+		echo '<form action="admin.php?import=utw&amp;step=3" method="post">';
+		wp_nonce_field('import-utw');
+		echo '<p class="submit"><input type="submit" name="submit" value="'.__('Step 3').'" /></p>';
+		echo '</form>';
+		echo '</div>';
+
+	}
+
+
+	function import_t2p ( ) {
+
+		echo '<div class="narrow">';
+		echo '<p><h3>'.__('Adding Tags to Posts&#8230;').'</h3></p>';
+
+		// run that funky magic!
+		$tags_added = $this->tag2post();
+
+		echo '<p>' . sprintf( __ngettext( 'Done! <strong>%s</strong> tag were added!', 'Done! <strong>%s</strong> tags were added!', $tags_added ), $tags_added ) . '<br /></p>';
+
+		echo '<form action="admin.php?import=utw&amp;step=4" method="post">';
+		wp_nonce_field('import-utw');
+		echo '<p class="submit"><input type="submit" name="submit" value="'.__('Step 4').'" /></p>';
+		echo '</form>';
+		echo '</div>';
+
+	}
+
+
+	function get_utw_tags ( ) {
+
+		global $wpdb;
+
+		// read in all the tags from the UTW tags table: should be wp_tags
+		$tags_query = "SELECT tag_id, tag FROM " . $wpdb->prefix . "tags";
+
+		$tags = $wpdb->get_results($tags_query);
+
+		// rearrange these tags into something we can actually use
+		foreach ( $tags as $tag ) {
+
+			$new_tags[$tag->tag_id] = $tag->tag;
+
+		}
+
+		return $new_tags;
+
+	}
+
+	function get_utw_posts ( ) {
+
+		global $wpdb;
+
+		// read in all the posts from the UTW post->tag table: should be wp_post2tag
+		$posts_query = "SELECT tag_id, post_id FROM " . $wpdb->prefix . "post2tag";
+
+		$posts = $wpdb->get_results($posts_query);
+
+		return $posts;
+
+	}
+
+
+	function tag2post ( ) {
+
+		// get the tags and posts we imported in the last 2 steps
+		$tags = get_option('utwimp_tags');
+		$posts = get_option('utwimp_posts');
+
+		// null out our results
+		$tags_added = 0;
+
+		// loop through each post and add its tags to the db
+		foreach ( $posts as $this_post ) {
+
+			$the_post = (int) $this_post->post_id;
+			$the_tag = (int) $this_post->tag_id;
+
+			// what's the tag name for that id?
+			$the_tag = $tags[$the_tag];
+
+			// screw it, just try to add the tag
+			wp_add_post_tags($the_post, $the_tag);
+
+			$tags_added++;
+
+		}
+
+		// that's it, all posts should be linked to their tags properly, pending any errors we just spit out!
+		return $tags_added;
+
+
+	}
+
+
+	function cleanup_import ( ) {
+
+		delete_option('utwimp_tags');
+		delete_option('utwimp_posts');
+
+		$this->done();
+
+	}
+
+
+	function done ( ) {
+
+		echo '<div class="narrow">';
+		echo '<p><h3>'.__('Import Complete!').'</h3></p>';
+
+		echo '<p>' . __('OK, so we lied about this being a 5-step program! You&#8217;re done!') . '</p>';
+
+		echo '<p>' . __('Now wasn&#8217;t that easy?') . '</p>';
+
+		echo '</div>';
+
+	}
+
+
+	function UTW_Import ( ) {
+
+		// Nothing.
+
+	}
+
+}
+
+
+// create the import object
+$utw_import = new UTW_Import();
+
+// add it to the import page!
+register_importer('utw', 'Ultimate Tag Warrior', __('Import Ultimate Tag Warrior tags into WordPress tags.'), array($utw_import, 'dispatch'));
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/import/wordpress.php 2.5.src/wp-admin/import/wordpress.php
--- 2.2.2.src/wp-admin/import/wordpress.php	2007-07-30 11:08:30.000000000 -0500
+++ 2.5.src/wp-admin/import/wordpress.php	2008-03-27 02:20:53.000000000 -0500
@@ -2,14 +2,21 @@
 
 class WP_Import {
 
-	var $posts = array ();
-	var $posts_processed = array ();
-    // Array of arrays. [[0] => XML fragment, [1] => New post ID]
+	var $post_ids_processed = array ();
+	var $orphans = array ();
 	var $file;
 	var $id;
 	var $mtnames = array ();
 	var $newauthornames = array ();
+	var $allauthornames = array ();
+
+	var $author_ids = array ();
+	var $tags = array ();
+	var $categories = array ();
+
 	var $j = -1;
+	var $fetch_attachments = false;
+	var $url_remap = array ();
 
 	function header() {
 		echo '<div class="wrap">';
@@ -42,97 +49,85 @@
 		return $return;
 	}
 
-	function users_form($n) {
-		global $wpdb, $testing;
-		$users = $wpdb->get_results("SELECT * FROM $wpdb->users ORDER BY ID");
-?><select name="userselect[<?php echo $n; ?>]">
-	<option value="#NONE#">- Select -</option>
-	<?php
-		foreach ($users as $user) {
-			echo '<option value="'.$user->user_login.'">'.$user->user_login.'</option>';
-		}
-?>
-	</select>
-	<?php
+	function has_gzip() {
+		return is_callable('gzopen');
 	}
 
-	//function to check the authorname and do the mapping
-	function checkauthor($author) {
-		global $wpdb;
-		//mtnames is an array with the names in the mt import file
-		$pass = 'changeme';
-		if (!(in_array($author, $this->mtnames))) { //a new mt author name is found
-			++ $this->j;
-			$this->mtnames[$this->j] = $author; //add that new mt author name to an array
-			$user_id = username_exists($this->newauthornames[$this->j]); //check if the new author name defined by the user is a pre-existing wp user
-			if (!$user_id) { //banging my head against the desk now.
-				if ($this->newauthornames[$this->j] == 'left_blank') { //check if the user does not want to change the authorname
-					$user_id = wp_create_user($author, $pass);
-					$this->newauthornames[$this->j] = $author; //now we have a name, in the place of left_blank.
-				} else {
-					$user_id = wp_create_user($this->newauthornames[$this->j], $pass);
-				}
-			} else {
-				return $user_id; // return pre-existing wp username if it exists
-			}
-		} else {
-			$key = array_search($author, $this->mtnames); //find the array key for $author in the $mtnames array
-			$user_id = username_exists($this->newauthornames[$key]); //use that key to get the value of the author's name from $newauthornames
-		}
+	function fopen($filename, $mode='r') {
+		if ( $this->has_gzip() )
+			return gzopen($filename, $mode);
+		return fopen($filename, $mode);
+	}
 
-		return $user_id;
+	function feof($fp) {
+		if ( $this->has_gzip() )
+			return gzeof($fp);
+		return feof($fp);
 	}
 
-	function get_entries() {
+	function fgets($fp, $len=8192) {
+		if ( $this->has_gzip() )
+			return gzgets($fp, $len);
+		return fgets($fp, $len);
+	}
+
+	function fclose($fp) {
+		if ( $this->has_gzip() )
+			return gzclose($fp);
+		return fclose($fp);
+	}
+
+	function get_entries($process_post_func=NULL) {
 		set_magic_quotes_runtime(0);
-		$importdata = array_map('rtrim', file($this->file)); // Read the file into an array
 
-		$this->posts = array();
-		$this->categories = array();
-		$num = 0;
 		$doing_entry = false;
-		foreach ($importdata as $importline) {
-			if ( false !== strpos($importline, '<wp:category>') ) {
-				preg_match('|<wp:category>(.*?)</wp:category>|is', $importline, $category);
-				$this->categories[] = $category[1];
-				continue;
-			}
-			if ( false !== strpos($importline, '<item>') ) {
-				$this->posts[$num] = '';
-				$doing_entry = true;
-				continue;	
-			}
-			if ( false !== strpos($importline, '</item>') ) {
-				$num++;
-				$doing_entry = false;
-				continue;	
-			}
-			if ( $doing_entry ) {
-				$this->posts[$num] .= $importline . "\n";
-			}
-		}
+		$is_wxr_file = false;
 
-		foreach ($this->posts as $post) {
-			$post_ID = (int) $this->get_tag( $post, 'wp:post_id' );
-			if ($post_ID) {
-				$this->posts_processed[$post_ID][0] = &$post;
-				$this->posts_processed[$post_ID][1] = 0;
+		$fp = $this->fopen($this->file, 'r');
+		if ($fp) {
+			while ( !$this->feof($fp) ) {
+				$importline = rtrim($this->fgets($fp));
+
+				// this doesn't check that the file is perfectly valid but will at least confirm that it's not the wrong format altogether
+				if ( !$is_wxr_file && preg_match('|xmlns:wp="http://wordpress[.]org/export/\d+[.]\d+/"|', $importline) )
+					$is_wxr_file = true;
+
+				if ( false !== strpos($importline, '<wp:category>') ) {
+					preg_match('|<wp:category>(.*?)</wp:category>|is', $importline, $category);
+					$this->categories[] = $category[1];
+					continue;
+				}
+				if ( false !== strpos($importline, '<wp:tag>') ) {
+					preg_match('|<wp:tag>(.*?)</wp:tag>|is', $importline, $tag);
+					$this->tags[] = $tag[1];
+					continue;
+				}
+				if ( false !== strpos($importline, '<item>') ) {
+					$this->post = '';
+					$doing_entry = true;
+					continue;
+				}
+				if ( false !== strpos($importline, '</item>') ) {
+					$doing_entry = false;
+					if ($process_post_func)
+						call_user_func($process_post_func, $this->post);
+					continue;
+				}
+				if ( $doing_entry ) {
+					$this->post .= $importline . "\n";
+				}
 			}
+
+			$this->fclose($fp);
 		}
+
+		return $is_wxr_file;
+
 	}
 
 	function get_wp_authors() {
-		$temp = array ();
-		$i = -1;
-		foreach ($this->posts as $post) {
-			if ('' != trim($post)) {
-				++ $i;
-				$author = $this->get_tag( $post, 'dc:creator' );
-				array_push($temp, "$author"); //store the extracted author names in a temporary array
-			}
-		}
-
 		// We need to find unique values of author names, while preserving the order, so this function emulates the unique_value(); php function, without the sorting.
+		$temp = $this->allauthornames;
 		$authors[0] = array_shift($temp);
 		$y = count($temp) + 1;
 		for ($x = 1; $x < $y; $x ++) {
@@ -145,37 +140,50 @@
 	}
 
 	function get_authors_from_post() {
-		$formnames = array ();
-		$selectnames = array ();
+		global $current_user;
 
-		foreach ($_POST['user'] as $key => $line) {
-			$newname = trim(stripslashes($line));
-			if ($newname == '')
-				$newname = 'left_blank'; //passing author names from step 1 to step 2 is accomplished by using POST. left_blank denotes an empty entry in the form.
-			array_push($formnames, "$newname");
-		} // $formnames is the array with the form entered names
-
-		foreach ($_POST['userselect'] as $user => $key) {
-			$selected = trim(stripslashes($key));
-			array_push($selectnames, "$selected");
-		}
-
-		$count = count($formnames);
-		for ($i = 0; $i < $count; $i ++) {
-			if ($selectnames[$i] != '#NONE#') { //if no name was selected from the select menu, use the name entered in the form
-				array_push($this->newauthornames, "$selectnames[$i]");
-			} else {
-				array_push($this->newauthornames, "$formnames[$i]");
+		// this will populate $this->author_ids with a list of author_names => user_ids
+
+		foreach ( $_POST['author_in'] as $i => $in_author_name ) {
+
+			if ( !empty($_POST['user_select'][$i]) ) {
+				// an existing user was selected in the dropdown list
+				$user = get_userdata( intval($_POST['user_select'][$i]) );
+				if ( isset($user->ID) )
+					$this->author_ids[$in_author_name] = $user->ID;
+			}
+			elseif ( $this->allow_create_users() ) {
+				// nothing was selected in the dropdown list, so we'll use the name in the text field
+
+				$new_author_name = trim($_POST['user_create'][$i]);
+				// if the user didn't enter a name, assume they want to use the same name as in the import file
+				if ( empty($new_author_name) )
+					$new_author_name = $in_author_name;
+
+				$user_id = username_exists($new_author_name);
+				if ( !$user_id ) {
+					$user_id = wp_create_user($new_author_name, wp_generate_password());
+				}
+
+				$this->author_ids[$in_author_name] = $user_id;
+			}
+
+			// failsafe: if the user_id was invalid, default to the current user
+			if ( empty($this->author_ids[$in_author_name]) ) {
+				$this->author_ids[$in_author_name] = intval($current_user->ID);
 			}
 		}
+
 	}
 
 	function wp_authors_form() {
 ?>
 <h2><?php _e('Assign Authors'); ?></h2>
 <p><?php _e('To make it easier for you to edit and save the imported posts and drafts, you may want to change the name of the author of the posts. For example, you may want to import all the entries as <code>admin</code>s entries.'); ?></p>
-<p><?php _e('If a new user is created by WordPress, the password will be set, by default, to "changeme". Quite suggestive, eh? ;)'); ?></p>
-	<?php
+<?php
+	if ( $this->allow_create_users() ) {
+		echo '<p>'.__('If a new user is created by WordPress, a password will be randomly generated. Manually change the user\'s details if necessary.')."</p>\n";
+	}
 
 
 		$authors = $this->get_wp_authors();
@@ -185,35 +193,80 @@
 		$j = -1;
 		foreach ($authors as $author) {
 			++ $j;
-			echo '<li>'.__('Current author:').' <strong>'.$author.'</strong><br />'.sprintf(__('Create user %1$s or map to existing'), ' <input type="text" value="'.$author.'" name="'.'user[]'.'" maxlength="30"> <br />');
-			$this->users_form($j);
+			echo '<li>'.__('Import author:').' <strong>'.$author.'</strong><br />';
+			$this->users_form($j, $author);
 			echo '</li>';
 		}
 
-		echo '<input type="submit" value="Submit">'.'<br/>';
+		if ( $this->allow_fetch_attachments() ) {
+?>
+</ol>
+<h2><?php _e('Import Attachments'); ?></h2>
+<p>
+	<input type="checkbox" value="1" name="attachments" id="import-attachments" />
+	<label for="import-attachments"><?php _e('Download and import file attachments') ?></label>
+</p>
+
+<?php
+		}
+
+		echo '<input type="submit" value="'.attribute_escape( __('Submit') ).'">'.'<br />';
 		echo '</form>';
-		echo '</ol>';
 
 	}
 
+	function users_form($n, $author) {
+
+		if ( $this->allow_create_users() ) {
+			printf(__('Create user %1$s or map to existing'), ' <input type="text" value="'.$author.'" name="'.'user_create['.intval($n).']'.'" maxlength="30"> <br />');
+		}
+		else {
+			echo __('Map to existing').'<br />';
+		}
+
+		// keep track of $n => $author name
+		echo '<input type="hidden" name="author_in['.intval($n).']" value="'.htmlspecialchars($author).'" />';
+
+		$users = get_users_of_blog();
+?><select name="user_select[<?php echo $n; ?>]">
+	<option value="0"><?php _e('- Select -'); ?></option>
+	<?php
+		foreach ($users as $user) {
+			echo '<option value="'.$user->user_id.'">'.$user->user_login.'</option>';
+		}
+?>
+	</select>
+	<?php
+	}
+
 	function select_authors() {
-		$file = wp_import_handle_upload();
-		if ( isset($file['error']) ) {
-			echo '<p>'.__('Sorry, there has been an error.').'</p>';
-			echo '<p><strong>' . $file['error'] . '</strong></p>';
-			return;
+		$is_wxr_file = $this->get_entries(array(&$this, 'process_author'));
+		if ( $is_wxr_file ) {
+			$this->wp_authors_form();
 		}
-		$this->file = $file['file'];
-		$this->id = (int) $file['id'];
+		else {
+			echo '<h2>'.__('Invalid file').'</h2>';
+			echo '<p>'.__('Please upload a valid WXR (WordPress eXtended RSS) export file.').'</p>';
+		}
+	}
 
-		$this->get_entries();
-		$this->wp_authors_form();
+	// fetch the user ID for a given author name, respecting the mapping preferences
+	function checkauthor($author) {
+		global $current_user;
+
+		if ( !empty($this->author_ids[$author]) )
+			return $this->author_ids[$author];
+
+		// failsafe: map to the current user
+		return $current_user->ID;
 	}
 
+
+
 	function process_categories() {
 		global $wpdb;
 
-		$cat_names = (array) $wpdb->get_col("SELECT cat_name FROM $wpdb->categories");
+		$cat_names = (array) get_terms('category', 'fields=names');
 
 		while ( $c = array_shift($this->categories) ) {
 			$cat_name = trim($this->get_tag( $c, 'wp:cat_name' ));
@@ -239,27 +292,56 @@
 		}
 	}
 
+	function process_tags() {
+		global $wpdb;
+
+		$tag_names = (array) get_terms('post_tag', 'fields=names');
+
+		while ( $c = array_shift($this->tags) ) {
+			$tag_name = trim($this->get_tag( $c, 'wp:tag_name' ));
+
+			// If the category exists we leave it alone
+			if ( in_array($tag_name, $tag_names) )
+				continue;
+
+			$slug = $this->get_tag( $c, 'wp:tag_slug' );
+			$description = $this->get_tag( $c, 'wp:tag_description' );
+
+			$tagarr = compact('slug', 'description');
+
+			$tag_ID = wp_insert_term($tag_name, 'post_tag', $tagarr);
+		}
+	}
+
+	function process_author($post) {
+		$author = $this->get_tag( $post, 'dc:creator' );
+		if ($author)
+			$this->allauthornames[] = $author;
+	}
+
 	function process_posts() {
 		$i = -1;
 		echo '<ol>';
 
-		foreach ($this->posts as $post)
-			$this->process_post($post);
+		$this->get_entries(array(&$this, 'process_post'));
 
 		echo '</ol>';
 
 		wp_import_cleanup($this->id);
+		do_action('import_done', 'wordpress');
 
 		echo '<h3>'.sprintf(__('All done.').' <a href="%s">'.__('Have fun!').'</a>', get_option('home')).'</h3>';
 	}
-  
+
 	function process_post($post) {
 		global $wpdb;
 
 		$post_ID = (int) $this->get_tag( $post, 'wp:post_id' );
-  		if ( $post_ID && !empty($this->posts_processed[$post_ID][1]) ) // Processed already
+  		if ( $post_ID && !empty($this->post_ids_processed[$post_ID]) ) // Processed already
 			return 0;
-      
+		
+		set_time_limit( 60 );
+
 		// There are only ever one of these
 		$post_title     = $this->get_tag( $post, 'title' );
 		$post_date      = $this->get_tag( $post, 'wp:post_date' );
@@ -271,6 +353,7 @@
 		$post_parent    = $this->get_tag( $post, 'wp:post_parent' );
 		$menu_order     = $this->get_tag( $post, 'wp:menu_order' );
 		$post_type      = $this->get_tag( $post, 'wp:post_type' );
+		$post_password  = $this->get_tag( $post, 'wp:post_password' );
 		$guid           = $this->get_tag( $post, 'guid' );
 		$post_author    = $this->get_tag( $post, 'dc:creator' );
 
@@ -279,6 +362,15 @@
 		$post_content = str_replace('<br>', '<br />', $post_content);
 		$post_content = str_replace('<hr>', '<hr />', $post_content);
 
+		preg_match_all('|<category domain="tag">(.*?)</category>|is', $post, $tags);
+		$tags = $tags[1];
+
+		$tag_index = 0;
+		foreach ($tags as $tag) {
+			$tags[$tag_index] = $wpdb->escape($this->unhtmlentities(str_replace(array ('<![CDATA[', ']]>'), '', $tag)));
+			$tag_index++;
+		}
+
 		preg_match_all('|<category>(.*?)</category>|is', $post, $categories);
 		$categories = $categories[1];
 
@@ -288,42 +380,89 @@
 			$cat_index++;
 		}
 
-		if ($post_id = post_exists($post_title, '', $post_date)) {
+		$post_exists = post_exists($post_title, '', $post_date);
+
+		if ( $post_exists ) {
 			echo '<li>';
-			printf(__('Post <i>%s</i> already exists.'), stripslashes($post_title));
+			printf(__('Post <em>%s</em> already exists.'), stripslashes($post_title));
 		} else {
 
 			// If it has parent, process parent first.
 			$post_parent = (int) $post_parent;
-			if ($parent = $this->posts_processed[$post_parent]) {
-				if (!$parent[1]) $this->process_post($parent[0]); // If not yet, process the parent first.
-				$post_parent = $parent[1]; // New ID of the parent;
+			if ($post_parent) {
+				// if we already know the parent, map it to the local ID
+				if ( $parent = $this->post_ids_processed[$post_parent] ) {
+					$post_parent = $parent;  // new ID of the parent
+				}
+				else {
+					// record the parent for later
+					$this->orphans[intval($post_ID)] = $post_parent;
+				}
 			}
 
 			echo '<li>';
-			printf(__('Importing post <i>%s</i>...'), stripslashes($post_title));
 
 			$post_author = $this->checkauthor($post_author); //just so that if a post already exists, new users are not created by checkauthor
 
-			$postdata = compact('post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_excerpt', 'post_status', 'post_name', 'comment_status', 'ping_status', 'post_modified', 'post_modified_gmt', 'guid', 'post_parent', 'menu_order', 'post_type');
-			$comment_post_ID = $post_id = wp_insert_post($postdata);
+			$postdata = compact('post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_status', 'post_name', 'comment_status', 'ping_status', 'guid', 'post_parent', 'menu_order', 'post_type', 'post_password');
+			if ($post_type == 'attachment') {
+				$remote_url = $this->get_tag( $post, 'wp:attachment_url' );
+				if ( !$remote_url )
+					$remote_url = $guid;
+
+				$comment_post_ID = $post_id = $this->process_attachment($postdata, $remote_url);
+				if ( !$post_id or is_wp_error($post_id) )
+					return $post_id;
+			}
+			else {
+				printf(__('Importing post <em>%s</em>...'), stripslashes($post_title));
+				$comment_post_ID = $post_id = wp_insert_post($postdata);
+			}
+
+			if ( is_wp_error( $post_id ) )
+				return $post_id;
 
 			// Memorize old and new ID.
-			if ( $post_id && $post_ID && $this->posts_processed[$post_ID] )
-				$this->posts_processed[$post_ID][1] = $post_id; // New ID.
-			
+			if ( $post_id && $post_ID ) {
+				$this->post_ids_processed[intval($post_ID)] = intval($post_id);
+			}
+
 			// Add categories.
 			if (count($categories) > 0) {
 				$post_cats = array();
 				foreach ($categories as $category) {
-					$cat_ID = (int) $wpdb->get_var("SELECT cat_ID FROM $wpdb->categories WHERE cat_name = '$category'");
+					$slug = sanitize_term_field('slug', $category, 0, 'category', 'db');
+					$cat = get_term_by('slug', $slug, 'category');
+					$cat_ID = 0;
+					if ( ! empty($cat) )
+						$cat_ID = $cat->term_id;
 					if ($cat_ID == 0) {
+						$category = $wpdb->escape($category);
 						$cat_ID = wp_insert_category(array('cat_name' => $category));
 					}
 					$post_cats[] = $cat_ID;
 				}
 				wp_set_post_categories($post_id, $post_cats);
-			}	
+			}
+
+			// Add tags.
+			if (count($tags) > 0) {
+				$post_tags = array();
+				foreach ($tags as $tag) {
+					$slug = sanitize_term_field('slug', $tag, 0, 'post_tag', 'db');
+					$tag_obj = get_term_by('slug', $slug, 'post_tag');
+					$tag_id = 0;
+					if ( ! empty($tag_obj) )
+						$tag_id = $tag_obj->term_id;
+					if ( $tag_id == 0 ) {
+						$tag = $wpdb->escape($tag);
+						$tag_id = wp_insert_term($tag, 'post_tag');
+						$tag_id = $tag_id['term_id'];
+					}
+					$post_tags[] = intval($tag_id);
+				}
+				wp_set_post_tags($post_id, $post_tags);
+			}
 		}
 
 		// Now for comments
@@ -342,7 +481,8 @@
 			$comment_type         = $this->get_tag( $comment, 'wp:comment_type');
 			$comment_parent       = $this->get_tag( $comment, 'wp:comment_parent');
 
-			if ( !comment_exists($comment_author, $comment_date) ) {
+			// if this is a new post we can skip the comment_exists() check
+			if ( !$post_exists || !comment_exists($comment_author, $comment_date) ) {
 				$commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_url', 'comment_author_email', 'comment_author_IP', 'comment_date', 'comment_date_gmt', 'comment_content', 'comment_approved', 'comment_type', 'comment_parent');
 				wp_insert_comment($commentdata);
 				$num_comments++;
@@ -350,7 +490,7 @@
 		} }
 
 		if ( $num_comments )
-			printf(' '.__('(%s comments)'), $num_comments);
+			printf(' '.__ngettext('(%s comment)', '(%s comments)', $num_comments), $num_comments);
 
 		// Now for post meta
 		preg_match_all('|<wp:postmeta>(.*?)</wp:postmeta>|is', $post, $postmeta);
@@ -359,18 +499,215 @@
 			$key   = $this->get_tag( $p, 'wp:meta_key' );
 			$value = $this->get_tag( $p, 'wp:meta_value' );
 			$value = stripslashes($value); // add_post_meta() will escape.
-			add_post_meta( $post_id, $key, $value );
+
+			$this->process_post_meta($post_id, $key, $value);
+
 		} }
+
+		do_action('import_post_added', $post_id);
+		print "</li>\n";
+	}
+
+	function process_post_meta($post_id, $key, $value) {
+		// the filter can return false to skip a particular metadata key
+		$_key = apply_filters('import_post_meta_key', $key);
+		if ( $_key ) {
+			add_post_meta( $post_id, $_key, $value );
+			do_action('import_post_meta', $post_id, $_key, $value);
+		}
+	}
+
+	function process_attachment($postdata, $remote_url) {
+		if ($this->fetch_attachments and $remote_url) {
+			printf( __('Importing attachment <em>%s</em>... '), htmlspecialchars($remote_url) );
+			$upload = $this->fetch_remote_file($postdata, $remote_url);
+			if ( is_wp_error($upload) ) {
+				printf( __('Remote file error: %s'), htmlspecialchars($upload->get_error_message()) );
+				return $upload;
+			}
+			else {
+				print '('.size_format(filesize($upload['file'])).')';
+			}
+
+			if ( $info = wp_check_filetype($upload['file']) ) {
+				$postdata['post_mime_type'] = $info['type'];
+			}
+			else {
+				print __('Invalid file type');
+				return;
+			}
+
+			$postdata['guid'] = $upload['url'];
+
+			// as per wp-admin/includes/upload.php
+			$post_id = wp_insert_attachment($postdata, $upload['file']);
+			wp_update_attachment_metadata( $post_id, wp_generate_attachment_metadata( $post_id, $upload['file'] ) );
+
+			// remap the thumbnail url.  this isn't perfect because we're just guessing the original url.
+			if ( preg_match('@^image/@', $info['type']) && $thumb_url = wp_get_attachment_thumb_url($post_id) ) {
+				$parts = pathinfo($remote_url);
+				$ext = $parts['extension'];
+				$name = basename($parts['basename'], ".{$ext}");
+				$this->url_remap[$parts['dirname'] . '/' . $name . '.thumbnail.' . $ext] = $thumb_url;
+			}
+
+			return $post_id;
+		}
+		else {
+			printf( __('Skipping attachment <em>%s</em>'), htmlspecialchars($remote_url) );
+		}
+	}
+
+	function fetch_remote_file($post, $url) {
+		$upload = wp_upload_dir($post['post_date']);
+
+		// extract the file name and extension from the url
+		$file_name = basename($url);
+
+		// get placeholder file in the upload dir with a unique sanitized filename
+		$upload = wp_upload_bits( $file_name, 0, '', $post['post_date']);
+		if ( $upload['error'] ) {
+			echo $upload['error'];
+			return new WP_Error( 'upload_dir_error', $upload['error'] );
+		}
+
+		// fetch the remote url and write it to the placeholder file
+		$headers = wp_get_http($url, $upload['file']);
+
+		// make sure the fetch was successful
+		if ( $headers['response'] != '200' ) {
+			@unlink($upload['file']);
+			return new WP_Error( 'import_file_error', sprintf(__('Remote file returned error response %d'), intval($headers['response'])) );
+		}
+		elseif ( isset($headers['content-length']) && filesize($upload['file']) != $headers['content-length'] ) {
+			@unlink($upload['file']);
+			return new WP_Error( 'import_file_error', __('Remote file is incorrect size') );
+		}
+
+		$max_size = $this->max_attachment_size();
+		if ( !empty($max_size) and filesize($upload['file']) > $max_size ) {
+			@unlink($upload['file']);
+			return new WP_Error( 'import_file_error', sprintf(__('Remote file is too large, limit is %s', size_format($max_size))) );
+		}
+
+		// keep track of the old and new urls so we can substitute them later
+		$this->url_remap[$url] = $upload['url'];
+		// if the remote url is redirected somewhere else, keep track of the destination too
+		if ( $headers['x-final-location'] != $url )
+			$this->url_remap[$headers['x-final-location']] = $upload['url'];
+
+		return $upload;
+
+	}
+
+	// sort by strlen, longest string first
+	function cmpr_strlen($a, $b) {
+		return strlen($b) - strlen($a);
+	}
+
+	// update url references in post bodies to point to the new local files
+	function backfill_attachment_urls() {
+
+		// make sure we do the longest urls first, in case one is a substring of another
+		uksort($this->url_remap, array(&$this, 'cmpr_strlen'));
+
+		global $wpdb;
+		foreach ($this->url_remap as $from_url => $to_url) {
+			// remap urls in post_content
+			$wpdb->query( $wpdb->prepare("UPDATE {$wpdb->posts} SET post_content = REPLACE(post_content, '%s', '%s')", $from_url, $to_url) );
+			// remap enclosure urls
+			$result = $wpdb->query( $wpdb->prepare("UPDATE {$wpdb->postmeta} SET meta_value = REPLACE(meta_value, '%s', '%s') WHERE meta_key='enclosure'", $from_url, $to_url) );
+		}
+	}
+
+	// update the post_parent of orphans now that we know the local id's of all parents
+	function backfill_parents() {
+		global $wpdb;
+
+		foreach ($this->orphans as $child_id => $parent_id) {
+			$local_child_id = $this->post_ids_processed[$child_id];
+			$local_parent_id = $this->post_ids_processed[$parent_id];
+			if ($local_child_id and $local_parent_id) {
+				$wpdb->query( $wpdb->prepare("UPDATE {$wpdb->posts} SET post_parent = %d WHERE ID = %d", $local_parent_id, $local_child_id));
+			}
+		}
+	}
+
+	function is_valid_meta_key($key) {
+		// skip _wp_attached_file metadata since we'll regenerate it from scratch
+		if ( $key == '_wp_attached_file' )
+			return false;
+		return $key;
+	}
+
+	// give the user the option of creating new users to represent authors in the import file?
+	function allow_create_users() {
+		return apply_filters('import_allow_create_users', true);
 	}
 
-	function import() {
-		$this->id = (int) $_GET['id'];
+	// give the user the option of downloading and importing attached files
+	function allow_fetch_attachments() {
+		return apply_filters('import_allow_fetch_attachments', true);
+	}
+
+	function max_attachment_size() {
+		// can be overridden with a filter - 0 means no limit
+		return apply_filters('import_attachment_size_limit', 0);
+	}
+
+	function import_start() {
+		wp_defer_term_counting(true);
+		wp_defer_comment_counting(true);
+		do_action('import_start');
+	}
+
+	function import_end() {
+		do_action('import_end');
+
+		// clear the caches after backfilling
+		foreach ($this->post_ids_processed as $post_id)
+			clean_post_cache($post_id);
+
+		wp_defer_term_counting(false);
+		wp_defer_comment_counting(false);
+	}
+
+	function import($id, $fetch_attachments = false) {
+		$this->id = (int) $id;
+		$this->fetch_attachments = ($this->allow_fetch_attachments() && (bool) $fetch_attachments);
+
+		add_filter('import_post_meta_key', array($this, 'is_valid_meta_key'));
+		$file = get_attached_file($this->id);
+		$this->import_file($file);
+	}
 
-		$this->file = get_attached_file($this->id);
+	function import_file($file) {
+		$this->file = $file;
+
+		$this->import_start();
 		$this->get_authors_from_post();
 		$this->get_entries();
 		$this->process_categories();
-		$this->process_posts();
+		$this->process_tags();
+		$result = $this->process_posts();
+		$this->backfill_parents();
+		$this->backfill_attachment_urls();
+		$this->import_end();
+
+		if ( is_wp_error( $result ) )
+			return $result;
+	}
+
+	function handle_upload() {
+		$file = wp_import_handle_upload();
+		if ( isset($file['error']) ) {
+			echo '<p>'.__('Sorry, there has been an error.').'</p>';
+			echo '<p><strong>' . $file['error'] . '</strong></p>';
+			return false;
+		}
+		$this->file = $file['file'];
+		$this->id = (int) $file['id'];
+		return true;
 	}
 
 	function dispatch() {
@@ -386,11 +723,14 @@
 				break;
 			case 1 :
 				check_admin_referer('import-upload');
-				$this->select_authors();
+				if ( $this->handle_upload() )
+					$this->select_authors();
 				break;
 			case 2:
 				check_admin_referer('import-wordpress');
-				$this->import();
+				$result = $this->import( $_GET['id'], $_POST['attachments'] );
+				if ( is_wp_error( $result ) )
+					echo $result->get_error_message();
 				break;
 		}
 		$this->footer();
@@ -403,6 +743,6 @@
 
 $wp_import = new WP_Import();
 
-register_importer('wordpress', 'WordPress', __('Import <strong>posts, comments, custom fields, pages, and categories</strong> from a WordPress export file'), array ($wp_import, 'dispatch'));
+register_importer('wordpress', 'WordPress', __('Import <strong>posts, comments, custom fields, pages, and categories</strong> from a WordPress export file.'), array ($wp_import, 'dispatch'));
 
 ?>
diff -x .svn -aruN 2.2.2.src/wp-admin/import/wp-cat2tag.php 2.5.src/wp-admin/import/wp-cat2tag.php
--- 2.2.2.src/wp-admin/import/wp-cat2tag.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/import/wp-cat2tag.php	2008-02-20 18:27:23.000000000 -0600
@@ -0,0 +1,239 @@
+<?php
+
+class WP_Categories_to_Tags {
+	var $categories_to_convert = array();
+	var $all_categories = array();
+
+	function header() {
+		echo '<div class="wrap">';
+		echo '<h2>' . __('Convert Categories to Tags') . '</h2>';
+	}
+
+	function footer() {
+		echo '</div>';
+	}
+
+	function populate_all_categories() {
+		global $wpdb;
+
+		$categories = get_categories('get=all');
+		foreach ( $categories as $category ) {
+			if ( !tag_exists($wpdb->escape($category->name)) )
+				$this->all_categories[] = $category;
+		}
+	}
+
+	function welcome() {
+		$this->populate_all_categories();
+
+		echo '<div class="narrow">';
+
+		if (count($this->all_categories) > 0) {
+			echo '<p>' . __('Hey there. Here you can selectively converts existing categories to tags. To get started, check the categories you wish to be converted, then click the Convert button.') . '</p>';
+			echo '<p>' . __('Keep in mind that if you convert a category with child categories, the children become top-level orphans.') . '</p>';
+
+			$this->categories_form();
+		} else {
+			echo '<p>'.__('You have no categories to convert!').'</p>';
+		}
+
+		echo '</div>';
+	}
+
+	function categories_form() {
+?>
+<script type="text/javascript">
+<!--
+var checkflag = "false";
+function check_all_rows() {
+	field = document.formlist;
+	if ( 'false' == checkflag ) {
+		for ( i = 0; i < field.length; i++ ) {
+			if ( 'cats_to_convert[]' == field[i].name )
+				field[i].checked = true;
+		}
+		checkflag = 'true';
+		return '<?php _e('Uncheck All') ?>';
+	} else {
+		for ( i = 0; i < field.length; i++ ) {
+			if ( 'cats_to_convert[]' == field[i].name )
+				field[i].checked = false;
+		}
+		checkflag = 'false';
+		return '<?php _e('Check All') ?>';
+	}
+}
+
+//  -->
+</script>
+<?php
+		echo '<form name="formlist" id="formlist" action="admin.php?import=wp-cat2tag&amp;step=2" method="post">
+		<p><input type="button" class="button-secondary" value="' . __('Check All') . '"' . ' onClick="this.value=check_all_rows()"></p>';
+		wp_nonce_field('import-cat2tag');
+		echo '<ul style="list-style:none">';
+
+		$hier = _get_term_hierarchy('category');
+
+		foreach ($this->all_categories as $category) {
+			$category = sanitize_term( $category, 'category', 'display' );
+
+			if ((int) $category->parent == 0) {
+				echo '<li><label><input type="checkbox" name="cats_to_convert[]" value="' . intval($category->term_id) . '" /> ' . $category->name . ' (' . $category->count . ')</label>';
+
+				if (isset($hier[$category->term_id])) {
+					$this->_category_children($category, $hier);
+				}
+
+				echo '</li>';
+			}
+		}
+
+		echo '</ul>';
+
+		echo '<p class="submit"><input type="submit" name="submit" class="button" value="' . __('Convert Tags') . '" /></p>';
+
+		echo '</form>';
+	}
+
+	function _category_children($parent, $hier) {
+		echo '<ul style="list-style:none">';
+
+		foreach ($hier[$parent->term_id] as $child_id) {
+			$child =& get_category($child_id);
+
+			echo '<li><label><input type="checkbox" name="cats_to_convert[]" value="' . intval($child->term_id) . '" /> ' . $child->name . ' (' . $child->count . ')</label>';
+
+			if (isset($hier[$child->term_id])) {
+				$this->_category_children($child, $hier);
+			}
+
+			echo '</li>';
+		}
+
+		echo '</ul>';
+	}
+
+	function _category_exists($cat_id) {
+		$cat_id = (int) $cat_id;
+
+		$maybe_exists = category_exists($cat_id);
+
+		if ( $maybe_exists ) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+	function convert_them() {
+		global $wpdb;
+
+		if ( (!isset($_POST['cats_to_convert']) || !is_array($_POST['cats_to_convert'])) && empty($this->categories_to_convert)) {
+			echo '<div class="narrow">';
+			echo '<p>' . sprintf(__('Uh, oh. Something didn&#8217;t work. Please <a href="%s">try again</a>.'), 'admin.php?import=wp-cat2tag') . '</p>';
+			echo '</div>';
+			return;
+		}
+
+
+		if ( empty($this->categories_to_convert) )
+			$this->categories_to_convert = $_POST['cats_to_convert'];
+		$hier = _get_term_hierarchy('category');
+
+		echo '<ul>';
+
+		foreach ( (array) $this->categories_to_convert as $cat_id) {
+			$cat_id = (int) $cat_id;
+
+			echo '<li>' . sprintf(__('Converting category #%s ... '),  $cat_id);
+
+			if (!$this->_category_exists($cat_id)) {
+				_e('Category doesn\'t exist!');
+			} else {
+				$category =& get_category($cat_id);
+
+				if ( tag_exists($wpdb->escape($category->name)) ) {
+					_e('Category is already a tag.');
+					echo '</li>';
+					continue;
+				}
+
+				// If the category is the default, leave category in place and create tag.
+				if ( get_option('default_category') == $category->term_id ) {
+					$id = wp_insert_term($category->name, 'post_tag', array('slug' => $category->slug));
+					$id = $id['term_taxonomy_id'];
+					$posts = get_objects_in_term($category->term_id, 'category');
+					foreach ( $posts as $post ) {
+						if ( !$wpdb->get_var("SELECT object_id FROM $wpdb->term_relationships WHERE object_id = '$post' AND term_taxonomy_id = '$id'") )
+							$wpdb->query("INSERT INTO $wpdb->term_relationships (object_id, term_taxonomy_id) VALUES ('$post', '$id')");
+						clean_post_cache($post);
+					}
+				} else {
+					$tt_ids = $wpdb->get_col("SELECT term_taxonomy_id FROM $wpdb->term_taxonomy WHERE term_id = '{$category->term_id}' AND taxonomy = 'category'");
+					if ( $tt_ids ) {
+						$posts = $wpdb->get_col("SELECT object_id FROM $wpdb->term_relationships WHERE term_taxonomy_id IN (" . join(',', $tt_ids) . ") GROUP BY object_id");
+						foreach ( (array) $posts as $post )
+							clean_post_cache($post);
+					}
+
+					// Change the category to a tag.
+					$wpdb->query("UPDATE $wpdb->term_taxonomy SET taxonomy = 'post_tag' WHERE term_id = '{$category->term_id}' AND taxonomy = 'category'");
+
+					$terms = $wpdb->get_col("SELECT term_id FROM $wpdb->term_taxonomy WHERE parent = '{$category->term_id}' AND taxonomy = 'category'");
+					foreach ( (array) $terms as $term )
+						clean_category_cache($term);
+
+					// Set all parents to 0 (root-level) if their parent was the converted tag
+					$wpdb->query("UPDATE $wpdb->term_taxonomy SET parent = 0 WHERE parent = '{$category->term_id}' AND taxonomy = 'category'");
+				}
+				// Clean the cache
+				clean_category_cache($category->term_id);
+
+				_e('Converted successfully.');
+			}
+
+			echo '</li>';
+		}
+
+		echo '</ul>';
+		echo '<p>' . sprintf( __('We&#8217;re all done here, but you can always <a href="%s">convert more</a>.'), 'admin.php?import=wp-cat2tag' ) . '</p>';
+	}
+
+	function init() {
+
+		$step = (isset($_GET['step'])) ? (int) $_GET['step'] : 1;
+
+		$this->header();
+
+		if (!current_user_can('manage_categories')) {
+			echo '<div class="narrow">';
+			echo '<p>' . __('Cheatin&#8217; uh?') . '</p>';
+			echo '</div>';
+		} else {
+			if ( $step > 1 )
+				check_admin_referer('import-cat2tag');
+
+			switch ($step) {
+				case 1 :
+					$this->welcome();
+				break;
+
+				case 2 :
+					$this->convert_them();
+				break;
+			}
+		}
+
+		$this->footer();
+	}
+
+	function WP_Categories_to_Tags() {
+		// Do nothing.
+	}
+}
+
+$wp_cat2tag_importer = new WP_Categories_to_Tags();
+
+register_importer('wp-cat2tag', __('Categories to Tags Converter'), __('Convert existing categories to tags, selectively.'), array(&$wp_cat2tag_importer, 'init'));
+
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/import.php 2.5.src/wp-admin/import.php
--- 2.2.2.src/wp-admin/import.php	2007-04-07 10:46:09.000000000 -0500
+++ 2.5.src/wp-admin/import.php	2008-02-23 20:07:51.000000000 -0600
@@ -14,9 +14,9 @@
 // Load all importers so that they can register.
 $import_loc = 'wp-admin/import';
 $import_root = ABSPATH.$import_loc;
-$imports_dir = @ dir($import_root);
+$imports_dir = @ opendir($import_root);
 if ($imports_dir) {
-	while (($file = $imports_dir->read()) !== false) {
+	while (($file = readdir($imports_dir)) !== false) {
 		if ($file{0} == '.') {
 			continue;
 		} elseif (substr($file, -4) == '.php') {
@@ -24,6 +24,7 @@
 		}
 	}
 }
+@closedir($imports_dir);
 
 $importers = get_importers();
 
@@ -43,7 +44,7 @@
 			$style = 'class="'.$style.'"';
 		echo "
 			<tr $style>
-				<td class='import-system'>$action</td>
+				<td class='import-system row-title'>$action</td>
 				<td class='desc'>{$data[1]}</td>
 			</tr>";
 	}
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/admin.php 2.5.src/wp-admin/includes/admin.php
--- 2.2.2.src/wp-admin/includes/admin.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/admin.php	2008-03-06 00:07:53.000000000 -0600
@@ -0,0 +1,23 @@
+<?php
+
+if ( !defined( 'AUTOSAVE_INTERVAL' ) )
+	define( 'AUTOSAVE_INTERVAL', 60 );
+
+require_once(ABSPATH . 'wp-admin/includes/bookmark.php');
+require_once(ABSPATH . 'wp-admin/includes/comment.php');
+require_once(ABSPATH . 'wp-admin/includes/file.php');
+require_once(ABSPATH . 'wp-admin/includes/image.php');
+require_once(ABSPATH . 'wp-admin/includes/media.php');
+require_once(ABSPATH . 'wp-admin/includes/import.php');
+require_once(ABSPATH . 'wp-admin/includes/misc.php');
+require_once(ABSPATH . 'wp-admin/includes/plugin.php');
+require_once(ABSPATH . 'wp-admin/includes/post.php');
+require_once(ABSPATH . 'wp-admin/includes/taxonomy.php');
+require_once(ABSPATH . 'wp-admin/includes/template.php');
+require_once(ABSPATH . 'wp-admin/includes/theme.php');
+require_once(ABSPATH . 'wp-admin/includes/user.php');
+require_once(ABSPATH . 'wp-admin/includes/update.php');
+
+require_once(ABSPATH . WPINC . '/registration.php');
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/bookmark.php 2.5.src/wp-admin/includes/bookmark.php
--- 2.2.2.src/wp-admin/includes/bookmark.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/bookmark.php	2008-03-10 00:28:21.000000000 -0500
@@ -0,0 +1,177 @@
+<?php
+
+function add_link() {
+	return edit_link();
+}
+
+function edit_link( $link_id = '' ) {
+	if (!current_user_can( 'manage_links' ))
+		wp_die( __( 'Cheatin&#8217; uh?' ));
+
+	$_POST['link_url'] = wp_specialchars( $_POST['link_url'] );
+	$_POST['link_url'] = clean_url($_POST['link_url']);
+	$_POST['link_name'] = wp_specialchars( $_POST['link_name'] );
+	$_POST['link_image'] = wp_specialchars( $_POST['link_image'] );
+	$_POST['link_rss'] = clean_url($_POST['link_rss']);
+	if ( 'N' != $_POST['link_visible'] )
+		$_POST['link_visible'] = 'Y';
+
+	if ( !empty( $link_id ) ) {
+		$_POST['link_id'] = $link_id;
+		return wp_update_link( $_POST);
+	} else {
+		return wp_insert_link( $_POST);
+	}
+}
+
+function get_default_link_to_edit() {
+	if ( isset( $_GET['linkurl'] ) )
+		$link->link_url = clean_url( $_GET['linkurl']);
+	else
+		$link->link_url = '';
+
+	if ( isset( $_GET['name'] ) )
+		$link->link_name = attribute_escape( $_GET['name']);
+	else
+		$link->link_name = '';
+
+	$link->link_visible = 'Y';
+
+	return $link;
+}
+
+function wp_delete_link($link_id) {
+	global $wpdb;
+
+	do_action('delete_link', $link_id);
+
+	wp_delete_object_term_relationships($link_id, 'link_category');
+
+	$wpdb->query("DELETE FROM $wpdb->links WHERE link_id = '$link_id'");
+
+	do_action('deleted_link', $link_id);
+
+	return true;
+}
+
+function wp_get_link_cats($link_id = 0) {
+
+	$cats = wp_get_object_terms($link_id, 'link_category', 'fields=ids');
+
+	return array_unique($cats);
+}
+
+function get_link_to_edit( $link_id ) {
+	return get_bookmark( $link_id, OBJECT, 'edit' );
+}
+
+function wp_insert_link($linkdata) {
+	global $wpdb, $current_user;
+
+	$defaults = array('link_id' => 0, 'link_name' => '', 'link_url' => '', 'link_rating' => 0 );
+
+	$linkdata = wp_parse_args($linkdata, $defaults);
+	$linkdata = sanitize_bookmark($linkdata, 'db');
+
+	extract($linkdata, EXTR_SKIP);
+
+	$update = false;
+
+	if ( !empty($link_id) )
+		$update = true;
+
+	if ( trim( $link_name ) == '' )
+		return 0;
+
+	if ( trim( $link_url ) == '' )
+		return 0;
+
+	if ( empty($link_rating) )
+		$link_rating = 0;
+
+	if ( empty($link_image) )
+		$link_image = '';
+
+	if ( empty($link_target) )
+		$link_target = '';
+
+	if ( empty($link_visible) )
+		$link_visible = 'Y';
+
+	if ( empty($link_owner) )
+		$link_owner = $current_user->id;
+
+	if ( empty($link_notes) )
+		$link_notes = '';
+
+	if ( empty($link_description) )
+		$link_description = '';
+
+	if ( empty($link_rss) )
+		$link_rss = '';
+
+	if ( empty($link_rel) )
+		$link_rel = '';
+
+	// Make sure we set a valid category
+	if (0 == count($link_category) || !is_array($link_category)) {
+		$link_category = array(get_option('default_link_category'));
+	}
+
+	if ( $update ) {
+		$wpdb->query("UPDATE $wpdb->links SET link_url='$link_url',
+			link_name='$link_name', link_image='$link_image',
+			link_target='$link_target',
+			link_visible='$link_visible', link_description='$link_description',
+			link_rating='$link_rating', link_rel='$link_rel',
+			link_notes='$link_notes', link_rss = '$link_rss'
+			WHERE link_id='$link_id'");
+	} else {
+		$wpdb->query("INSERT INTO $wpdb->links (link_url, link_name, link_image, link_target, link_description, link_visible, link_owner, link_rating, link_rel, link_notes, link_rss) VALUES('$link_url','$link_name', '$link_image', '$link_target', '$link_description', '$link_visible', '$link_owner', '$link_rating', '$link_rel', '$link_notes', '$link_rss')");
+		$link_id = (int) $wpdb->insert_id;
+	}
+
+	wp_set_link_cats($link_id, $link_category);
+
+	if ( $update )
+		do_action('edit_link', $link_id);
+	else
+		do_action('add_link', $link_id);
+
+	return $link_id;
+}
+
+function wp_set_link_cats($link_id = 0, $link_categories = array()) {
+	// If $link_categories isn't already an array, make it one:
+	if (!is_array($link_categories) || 0 == count($link_categories))
+		$link_categories = array(get_option('default_link_category'));
+
+	$link_categories = array_map('intval', $link_categories);
+	$link_categories = array_unique($link_categories);
+
+	wp_set_object_terms($link_id, $link_categories, 'link_category');
+}	// wp_set_link_cats()
+
+function wp_update_link($linkdata) {
+	$link_id = (int) $linkdata['link_id'];
+
+	$link = get_link($link_id, ARRAY_A);
+
+	// Escape data pulled from DB.
+	$link = add_magic_quotes($link);
+
+	// Passed link category list overwrites existing category list if not empty.
+	if ( isset($linkdata['link_category']) && is_array($linkdata['link_category'])
+			 && 0 != count($linkdata['link_category']) )
+		$link_cats = $linkdata['link_category'];
+	else
+		$link_cats = $link['link_category'];
+
+	// Merge old and new fields with new fields overwriting old ones.
+	$linkdata = array_merge($link, $linkdata);
+	$linkdata['link_category'] = $link_cats;
+
+	return wp_insert_link($linkdata);
+}
+
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/class-ftp-pure.php 2.5.src/wp-admin/includes/class-ftp-pure.php
--- 2.2.2.src/wp-admin/includes/class-ftp-pure.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/class-ftp-pure.php	2008-03-11 18:45:07.000000000 -0500
@@ -0,0 +1,175 @@
+<?php
+/**
+ * PemFTP - A Ftp implementation in pure PHP
+ *
+ * @package PemFTP
+ * @since 2.5
+ *
+ * @version 1.0
+ * @copyright Alexey Dotsenko
+ * @author Alexey Dotsenko
+ * @link http://www.phpclasses.org/browse/package/1743.html Site
+ * @license LGPL License http://www.opensource.org/licenses/lgpl-license.html
+ */
+class ftp extends ftp_base {
+
+	function ftp($verb=FALSE, $le=FALSE) {
+		$this->__construct($verb, $le);
+	}
+
+	function __construct($verb=FALSE, $le=FALSE) {
+		parent::__construct(false, $verb, $le);
+	}
+
+// <!-- --------------------------------------------------------------------------------------- -->
+// <!--       Private functions                                                                 -->
+// <!-- --------------------------------------------------------------------------------------- -->
+
+	function _settimeout($sock) {
+		if(!@stream_set_timeout($sock, $this->_timeout)) {
+			$this->PushError('_settimeout','socket set send timeout');
+			$this->_quit();
+			return FALSE;
+		}
+		return TRUE;
+	}
+
+	function _connect($host, $port) {
+		$this->SendMSG("Creating socket");
+		$sock = @fsockopen($host, $port, $errno, $errstr, $this->_timeout);
+		if (!$sock) {
+			$this->PushError('_connect','socket connect failed', $errstr." (".$errno.")");
+			return FALSE;
+		}
+		$this->_connected=true;
+		return $sock;
+	}
+
+	function _readmsg($fnction="_readmsg"){
+		if(!$this->_connected) {
+			$this->PushError($fnction, 'Connect first');
+			return FALSE;
+		}
+		$result=true;
+		$this->_message="";
+		$this->_code=0;
+		$go=true;
+		do {
+			$tmp=@fgets($this->_ftp_control_sock, 512);
+			if($tmp===false) {
+				$go=$result=false;
+				$this->PushError($fnction,'Read failed');
+			} else {
+				$this->_message.=$tmp;
+				if(preg_match("/^([0-9]{3})(-(.*[".CRLF."]{1,2})+\\1)? [^".CRLF."]+[".CRLF."]{1,2}$/", $this->_message, $regs)) $go=false;
+			}
+		} while($go);
+		if($this->LocalEcho) echo "GET < ".rtrim($this->_message, CRLF).CRLF;
+		$this->_code=(int)$regs[1];
+		return $result;
+	}
+
+	function _exec($cmd, $fnction="_exec") {
+		if(!$this->_ready) {
+			$this->PushError($fnction,'Connect first');
+			return FALSE;
+		}
+		if($this->LocalEcho) echo "PUT > ",$cmd,CRLF;
+		$status=@fputs($this->_ftp_control_sock, $cmd.CRLF);
+		if($status===false) {
+			$this->PushError($fnction,'socket write failed');
+			return FALSE;
+		}
+		$this->_lastaction=time();
+		if(!$this->_readmsg($fnction)) return FALSE;
+		return TRUE;
+	}
+
+	function _data_prepare($mode=FTP_ASCII) {
+		if(!$this->_settype($mode)) return FALSE;
+		if($this->_passive) {
+			if(!$this->_exec("PASV", "pasv")) {
+				$this->_data_close();
+				return FALSE;
+			}
+			if(!$this->_checkCode()) {
+				$this->_data_close();
+				return FALSE;
+			}
+			$ip_port = explode(",", ereg_replace("^.+ \\(?([0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+)\\)?.*".CRLF."$", "\\1", $this->_message));
+			$this->_datahost=$ip_port[0].".".$ip_port[1].".".$ip_port[2].".".$ip_port[3];
+            $this->_dataport=(((int)$ip_port[4])<<8) + ((int)$ip_port[5]);
+			$this->SendMSG("Connecting to ".$this->_datahost.":".$this->_dataport);
+			$this->_ftp_data_sock=@fsockopen($this->_datahost, $this->_dataport, $errno, $errstr, $this->_timeout);
+			if(!$this->_ftp_data_sock) {
+				$this->PushError("_data_prepare","fsockopen fails", $errstr." (".$errno.")");
+				$this->_data_close();
+				return FALSE;
+			}
+			else $this->_ftp_data_sock;
+		} else {
+			$this->SendMSG("Only passive connections available!");
+			return FALSE;
+		}
+		return TRUE;
+	}
+
+	function _data_read($mode=FTP_ASCII, $fp=NULL) {
+		if(is_resource($fp)) $out=0;
+		else $out="";
+		if(!$this->_passive) {
+			$this->SendMSG("Only passive connections available!");
+			return FALSE;
+		}
+		while (!feof($this->_ftp_data_sock)) {
+			$block=fread($this->_ftp_data_sock, $this->_ftp_buff_size);
+			if($mode!=FTP_BINARY) $block=preg_replace("/\r\n|\r|\n/", $this->_eol_code[$this->OS_local], $block);
+			if(is_resource($fp)) $out+=fwrite($fp, $block, strlen($block));
+			else $out.=$block;
+		}
+		return $out;
+	}
+
+	function _data_write($mode=FTP_ASCII, $fp=NULL) {
+		if(is_resource($fp)) $out=0;
+		else $out="";
+		if(!$this->_passive) {
+			$this->SendMSG("Only passive connections available!");
+			return FALSE;
+		}
+		if(is_resource($fp)) {
+			while(!feof($fp)) {
+				$block=fread($fp, $this->_ftp_buff_size);
+				if(!$this->_data_write_block($mode, $block)) return false;
+			}
+		} elseif(!$this->_data_write_block($mode, $fp)) return false;
+		return TRUE;
+	}
+
+	function _data_write_block($mode, $block) {
+		if($mode!=FTP_BINARY) $block=preg_replace("/\r\n|\r|\n/", $this->_eol_code[$this->OS_remote], $block);
+		do {
+			if(($t=@fwrite($this->_ftp_data_sock, $block))===FALSE) {
+				$this->PushError("_data_write","Can't write to socket");
+				return FALSE;
+			}
+			$block=substr($block, $t);
+		} while(!empty($block));
+		return true;
+	}
+
+	function _data_close() {
+		@fclose($this->_ftp_data_sock);
+		$this->SendMSG("Disconnected data from remote host");
+		return TRUE;
+	}
+
+	function _quit($force=FALSE) {
+		if($this->_connected or $force) {
+			@fclose($this->_ftp_control_sock);
+			$this->_connected=false;
+			$this->SendMSG("Socket closed");
+		}
+	}
+}
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/class-ftp-sockets.php 2.5.src/wp-admin/includes/class-ftp-sockets.php
--- 2.2.2.src/wp-admin/includes/class-ftp-sockets.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/class-ftp-sockets.php	2008-03-11 18:45:07.000000000 -0500
@@ -0,0 +1,236 @@
+<?php
+/**
+ * PemFTP - A Ftp implementation in pure PHP
+ *
+ * @package PemFTP
+ * @since 2.5
+ *
+ * @version 1.0
+ * @copyright Alexey Dotsenko
+ * @author Alexey Dotsenko
+ * @link http://www.phpclasses.org/browse/package/1743.html Site
+ * @license LGPL License http://www.opensource.org/licenses/lgpl-license.html
+ */
+class ftp extends ftp_base {
+
+	function ftp($verb=FALSE, $le=FALSE) {
+		$this->__construct($verb, $le);
+	}
+
+	function __construct($verb=FALSE, $le=FALSE) {
+		parent::__construct(true, $verb, $le);
+	}
+
+// <!-- --------------------------------------------------------------------------------------- -->
+// <!--       Private functions                                                                 -->
+// <!-- --------------------------------------------------------------------------------------- -->
+
+	function _settimeout($sock) {
+		if(!@socket_set_option($sock, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>$this->_timeout, "usec"=>0))) {
+			$this->PushError('_connect','socket set receive timeout',socket_strerror(socket_last_error($sock)));
+			@socket_close($sock);
+			return FALSE;
+		}
+		if(!@socket_set_option($sock, SOL_SOCKET , SO_SNDTIMEO, array("sec"=>$this->_timeout, "usec"=>0))) {
+			$this->PushError('_connect','socket set send timeout',socket_strerror(socket_last_error($sock)));
+			@socket_close($sock);
+			return FALSE;
+		}
+		return true;
+	}
+
+	function _connect($host, $port) {
+		$this->SendMSG("Creating socket");
+		if(!($sock = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP))) {
+			$this->PushError('_connect','socket create failed',socket_strerror(socket_last_error($sock)));
+			return FALSE;
+		}
+		if(!$this->_settimeout($sock)) return FALSE;
+		$this->SendMSG("Connecting to \"".$host.":".$port."\"");
+		if (!($res = @socket_connect($sock, $host, $port))) {
+			$this->PushError('_connect','socket connect failed',socket_strerror(socket_last_error($sock)));
+			@socket_close($sock);
+			return FALSE;
+		}
+		$this->_connected=true;
+		return $sock;
+	}
+
+	function _readmsg($fnction="_readmsg"){
+		if(!$this->_connected) {
+			$this->PushError($fnction,'Connect first');
+			return FALSE;
+		}
+		$result=true;
+		$this->_message="";
+		$this->_code=0;
+		$go=true;
+		do {
+			$tmp=@socket_read($this->_ftp_control_sock, 4096, PHP_BINARY_READ);
+			if($tmp===false) {
+				$go=$result=false;
+				$this->PushError($fnction,'Read failed', socket_strerror(socket_last_error($this->_ftp_control_sock)));
+			} else {
+				$this->_message.=$tmp;
+				$go = !preg_match("/^([0-9]{3})(-.+\\1)? [^".CRLF."]+".CRLF."$/Us", $this->_message, $regs);
+			}
+		} while($go);
+		if($this->LocalEcho) echo "GET < ".rtrim($this->_message, CRLF).CRLF;
+		$this->_code=(int)$regs[1];
+		return $result;
+	}
+
+	function _exec($cmd, $fnction="_exec") {
+		if(!$this->_ready) {
+			$this->PushError($fnction,'Connect first');
+			return FALSE;
+		}
+		if($this->LocalEcho) echo "PUT > ",$cmd,CRLF;
+		$status=@socket_write($this->_ftp_control_sock, $cmd.CRLF);
+		if($status===false) {
+			$this->PushError($fnction,'socket write failed', socket_strerror(socket_last_error($this->stream)));
+			return FALSE;
+		}
+		$this->_lastaction=time();
+		if(!$this->_readmsg($fnction)) return FALSE;
+		return TRUE;
+	}
+
+	function _data_prepare($mode=FTP_ASCII) {
+		if(!$this->_settype($mode)) return FALSE;
+		$this->SendMSG("Creating data socket");
+		$this->_ftp_data_sock = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
+		if ($this->_ftp_data_sock < 0) {
+			$this->PushError('_data_prepare','socket create failed',socket_strerror(socket_last_error($this->_ftp_data_sock)));
+			return FALSE;
+		}
+		if(!$this->_settimeout($this->_ftp_data_sock)) {
+			$this->_data_close();
+			return FALSE;
+		}
+		if($this->_passive) {
+			if(!$this->_exec("PASV", "pasv")) {
+				$this->_data_close();
+				return FALSE;
+			}
+			if(!$this->_checkCode()) {
+				$this->_data_close();
+				return FALSE;
+			}
+			$ip_port = explode(",", ereg_replace("^.+ \\(?([0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+)\\)?.*".CRLF."$", "\\1", $this->_message));
+			$this->_datahost=$ip_port[0].".".$ip_port[1].".".$ip_port[2].".".$ip_port[3];
+            $this->_dataport=(((int)$ip_port[4])<<8) + ((int)$ip_port[5]);
+			$this->SendMSG("Connecting to ".$this->_datahost.":".$this->_dataport);
+			if(!@socket_connect($this->_ftp_data_sock, $this->_datahost, $this->_dataport)) {
+				$this->PushError("_data_prepare","socket_connect", socket_strerror(socket_last_error($this->_ftp_data_sock)));
+				$this->_data_close();
+				return FALSE;
+			}
+			else $this->_ftp_temp_sock=$this->_ftp_data_sock;
+		} else {
+			if(!@socket_getsockname($this->_ftp_control_sock, $addr, $port)) {
+				$this->PushError("_data_prepare","can't get control socket information", socket_strerror(socket_last_error($this->_ftp_control_sock)));
+				$this->_data_close();
+				return FALSE;
+			}
+			if(!@socket_bind($this->_ftp_data_sock,$addr)){
+				$this->PushError("_data_prepare","can't bind data socket", socket_strerror(socket_last_error($this->_ftp_data_sock)));
+				$this->_data_close();
+				return FALSE;
+			}
+			if(!@socket_listen($this->_ftp_data_sock)) {
+				$this->PushError("_data_prepare","can't listen data socket", socket_strerror(socket_last_error($this->_ftp_data_sock)));
+				$this->_data_close();
+				return FALSE;
+			}
+			if(!@socket_getsockname($this->_ftp_data_sock, $this->_datahost, $this->_dataport)) {
+				$this->PushError("_data_prepare","can't get data socket information", socket_strerror(socket_last_error($this->_ftp_data_sock)));
+				$this->_data_close();
+				return FALSE;
+			}
+			if(!$this->_exec('PORT '.str_replace('.',',',$this->_datahost.'.'.($this->_dataport>>8).'.'.($this->_dataport&0x00FF)), "_port")) {
+				$this->_data_close();
+				return FALSE;
+			}
+			if(!$this->_checkCode()) {
+				$this->_data_close();
+				return FALSE;
+			}
+		}
+		return TRUE;
+	}
+
+	function _data_read($mode=FTP_ASCII, $fp=NULL) {
+		$NewLine=$this->_eol_code[$this->OS_local];
+		if(is_resource($fp)) $out=0;
+		else $out="";
+		if(!$this->_passive) {
+			$this->SendMSG("Connecting to ".$this->_datahost.":".$this->_dataport);
+			$this->_ftp_temp_sock=socket_accept($this->_ftp_data_sock);
+			if($this->_ftp_temp_sock===FALSE) {
+				$this->PushError("_data_read","socket_accept", socket_strerror(socket_last_error($this->_ftp_temp_sock)));
+				$this->_data_close();
+				return FALSE;
+			}
+		}
+
+		while(($block=@socket_read($this->_ftp_temp_sock, $this->_ftp_buff_size, PHP_BINARY_READ))!==false) {
+			if($block==="") break;
+			if($mode!=FTP_BINARY) $block=preg_replace("/\r\n|\r|\n/", $this->_eol_code[$this->OS_local], $block);
+			if(is_resource($fp)) $out+=fwrite($fp, $block, strlen($block));
+			else $out.=$block;
+		}
+		return $out;
+	}
+
+	function _data_write($mode=FTP_ASCII, $fp=NULL) {
+		$NewLine=$this->_eol_code[$this->OS_local];
+		if(is_resource($fp)) $out=0;
+		else $out="";
+		if(!$this->_passive) {
+			$this->SendMSG("Connecting to ".$this->_datahost.":".$this->_dataport);
+			$this->_ftp_temp_sock=socket_accept($this->_ftp_data_sock);
+			if($this->_ftp_temp_sock===FALSE) {
+				$this->PushError("_data_write","socket_accept", socket_strerror(socket_last_error($this->_ftp_temp_sock)));
+				$this->_data_close();
+				return false;
+			}
+		}
+		if(is_resource($fp)) {
+			while(!feof($fp)) {
+				$block=fread($fp, $this->_ftp_buff_size);
+				if(!$this->_data_write_block($mode, $block)) return false;
+			}
+		} elseif(!$this->_data_write_block($mode, $fp)) return false;
+		return true;
+	}
+
+	function _data_write_block($mode, $block) {
+		if($mode!=FTP_BINARY) $block=preg_replace("/\r\n|\r|\n/", $this->_eol_code[$this->OS_remote], $block);
+		do {
+			if(($t=@socket_write($this->_ftp_temp_sock, $block))===FALSE) {
+				$this->PushError("_data_write","socket_write", socket_strerror(socket_last_error($this->_ftp_temp_sock)));
+				$this->_data_close();
+				return FALSE;
+			}
+			$block=substr($block, $t);
+		} while(!empty($block));
+		return true;
+	}
+
+	function _data_close() {
+		@socket_close($this->_ftp_temp_sock);
+		@socket_close($this->_ftp_data_sock);
+		$this->SendMSG("Disconnected data from remote host");
+		return TRUE;
+	}
+
+	function _quit() {
+		if($this->_connected) {
+			@socket_close($this->_ftp_control_sock);
+			$this->_connected=false;
+			$this->SendMSG("Socket closed");
+		}
+	}
+}
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/class-ftp.php 2.5.src/wp-admin/includes/class-ftp.php
--- 2.2.2.src/wp-admin/includes/class-ftp.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/class-ftp.php	2008-03-16 04:49:10.000000000 -0500
@@ -0,0 +1,842 @@
+<?php
+/**
+ * PemFTP - A Ftp implementation in pure PHP
+ *
+ * @package PemFTP
+ * @since 2.5
+ *
+ * @version 1.0
+ * @copyright Alexey Dotsenko
+ * @author Alexey Dotsenko
+ * @link http://www.phpclasses.org/browse/package/1743.html Site
+ * @license LGPL License http://www.opensource.org/licenses/lgpl-license.html
+ */
+if(!defined('CRLF')) define('CRLF',"\r\n");
+if(!defined("FTP_AUTOASCII")) define("FTP_AUTOASCII", -1);
+if(!defined("FTP_BINARY")) define("FTP_BINARY", 1);
+if(!defined("FTP_ASCII")) define("FTP_ASCII", 0);
+if(!defined('FTP_FORCE')) define('FTP_FORCE', TRUE);
+define('FTP_OS_Unix','u');
+define('FTP_OS_Windows','w');
+define('FTP_OS_Mac','m');
+
+class ftp_base {
+	/* Public variables */
+	var $LocalEcho;
+	var $Verbose;
+	var $OS_local;
+	var $OS_remote;
+
+	/* Private variables */
+	var $_lastaction;
+	var $_errors;
+	var $_type;
+	var $_umask;
+	var $_timeout;
+	var $_passive;
+	var $_host;
+	var $_fullhost;
+	var $_port;
+	var $_datahost;
+	var $_dataport;
+	var $_ftp_control_sock;
+	var $_ftp_data_sock;
+	var $_ftp_temp_sock;
+	var $_ftp_buff_size;
+	var $_login;
+	var $_password;
+	var $_connected;
+	var $_ready;
+	var $_code;
+	var $_message;
+	var $_can_restore;
+	var $_port_available;
+	var $_curtype;
+	var $_features;
+
+	var $_error_array;
+	var $AuthorizedTransferMode;
+	var $OS_FullName;
+	var $_eol_code;
+	var $AutoAsciiExt;
+
+	/* Constructor */
+	function ftp_base($port_mode=FALSE) {
+		$this->__construct($port_mode);
+	}
+
+	function __construct($port_mode=FALSE, $verb=FALSE, $le=FALSE) {
+		$this->LocalEcho=$le;
+		$this->Verbose=$verb;
+		$this->_lastaction=NULL;
+		$this->_error_array=array();
+		$this->_eol_code=array(FTP_OS_Unix=>"\n", FTP_OS_Mac=>"\r", FTP_OS_Windows=>"\r\n");
+		$this->AuthorizedTransferMode=array(FTP_AUTOASCII, FTP_ASCII, FTP_BINARY);
+		$this->OS_FullName=array(FTP_OS_Unix => 'UNIX', FTP_OS_Windows => 'WINDOWS', FTP_OS_Mac => 'MACOS');
+		$this->AutoAsciiExt=array("ASP","BAT","C","CPP","CSS","CSV","JS","H","HTM","HTML","SHTML","INI","LOG","PHP3","PHTML","PL","PERL","SH","SQL","TXT");
+		$this->_port_available=($port_mode==TRUE);
+		$this->SendMSG("Staring FTP client class".($this->_port_available?"":" without PORT mode support"));
+		$this->_connected=FALSE;
+		$this->_ready=FALSE;
+		$this->_can_restore=FALSE;
+		$this->_code=0;
+		$this->_message="";
+		$this->_ftp_buff_size=4096;
+		$this->_curtype=NULL;
+		$this->SetUmask(0022);
+		$this->SetType(FTP_AUTOASCII);
+		$this->SetTimeout(30);
+		$this->Passive(!$this->_port_available);
+		$this->_login="anonymous";
+		$this->_password="anon@ftp.com";
+		$this->_features=array();
+	    $this->OS_local=FTP_OS_Unix;
+		$this->OS_remote=FTP_OS_Unix;
+		$this->features=array();
+		if(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') $this->OS_local=FTP_OS_Windows;
+		elseif(strtoupper(substr(PHP_OS, 0, 3)) === 'MAC') $this->OS_local=FTP_OS_Mac;
+	}
+
+// <!-- --------------------------------------------------------------------------------------- -->
+// <!--       Public functions                                                                  -->
+// <!-- --------------------------------------------------------------------------------------- -->
+
+	function parselisting($line) {
+		$is_windows = ($this->OS_remote == FTP_OS_Windows);
+		if ($is_windows && preg_match("/([0-9]{2})-([0-9]{2})-([0-9]{2}) +([0-9]{2}):([0-9]{2})(AM|PM) +([0-9]+|<DIR>) +(.+)/",$line,$lucifer)) {
+			$b = array();
+			if ($lucifer[3]<70) { $lucifer[3]+=2000; } else { $lucifer[3]+=1900; } // 4digit year fix
+			$b['isdir'] = ($lucifer[7]=="<DIR>");
+			if ( $b['isdir'] )
+				$b['type'] = 'd';
+			else
+				$b['type'] = 'f';
+			$b['size'] = $lucifer[7];
+			$b['month'] = $lucifer[1];
+			$b['day'] = $lucifer[2];
+			$b['year'] = $lucifer[3];
+			$b['hour'] = $lucifer[4];
+			$b['minute'] = $lucifer[5];
+			$b['time'] = @mktime($lucifer[4]+(strcasecmp($lucifer[6],"PM")==0?12:0),$lucifer[5],0,$lucifer[1],$lucifer[2],$lucifer[3]);
+			$b['am/pm'] = $lucifer[6];
+			$b['name'] = $lucifer[8];
+		} else if (!$is_windows && $lucifer=preg_split("/[ ]/",$line,9,PREG_SPLIT_NO_EMPTY)) {
+			//echo $line."\n";
+			$lcount=count($lucifer);
+			if ($lcount<8) return '';
+			$b = array();
+			$b['isdir'] = $lucifer[0]{0} === "d";
+			$b['islink'] = $lucifer[0]{0} === "l";
+			if ( $b['isdir'] )
+				$b['type'] = 'd';
+			elseif ( $b['islink'] )
+				$b['type'] = 'l';
+			else
+				$b['type'] = 'f';
+			$b['perms'] = $lucifer[0];
+			$b['number'] = $lucifer[1];
+			$b['owner'] = $lucifer[2];
+			$b['group'] = $lucifer[3];
+			$b['size'] = $lucifer[4];
+			if ($lcount==8) {
+				sscanf($lucifer[5],"%d-%d-%d",$b['year'],$b['month'],$b['day']);
+				sscanf($lucifer[6],"%d:%d",$b['hour'],$b['minute']);
+				$b['time'] = @mktime($b['hour'],$b['minute'],0,$b['month'],$b['day'],$b['year']);
+				$b['name'] = $lucifer[7];
+			} else {
+				$b['month'] = $lucifer[5];
+				$b['day'] = $lucifer[6];
+				if (preg_match("/([0-9]{2}):([0-9]{2})/",$lucifer[7],$l2)) {
+					$b['year'] = date("Y");
+					$b['hour'] = $l2[1];
+					$b['minute'] = $l2[2];
+				} else {
+					$b['year'] = $lucifer[7];
+					$b['hour'] = 0;
+					$b['minute'] = 0;
+				}
+				$b['time'] = strtotime(sprintf("%d %s %d %02d:%02d",$b['day'],$b['month'],$b['year'],$b['hour'],$b['minute']));
+				$b['name'] = $lucifer[8];
+			}
+		}
+
+		return $b;
+	}
+
+	function SendMSG($message = "", $crlf=true) {
+		if ($this->Verbose) {
+			echo $message.($crlf?CRLF:"");
+			flush();
+		}
+		return TRUE;
+	}
+
+	function SetType($mode=FTP_AUTOASCII) {
+		if(!in_array($mode, $this->AuthorizedTransferMode)) {
+			$this->SendMSG("Wrong type");
+			return FALSE;
+		}
+		$this->_type=$mode;
+		$this->SendMSG("Transfer type: ".($this->_type==FTP_BINARY?"binary":($this->_type==FTP_ASCII?"ASCII":"auto ASCII") ) );
+		return TRUE;
+	}
+
+	function _settype($mode=FTP_ASCII) {
+		if($this->_ready) {
+			if($mode==FTP_BINARY) {
+				if($this->_curtype!=FTP_BINARY) {
+					if(!$this->_exec("TYPE I", "SetType")) return FALSE;
+					$this->_curtype=FTP_BINARY;
+				}
+			} elseif($this->_curtype!=FTP_ASCII) {
+				if(!$this->_exec("TYPE A", "SetType")) return FALSE;
+				$this->_curtype=FTP_ASCII;
+			}
+		} else return FALSE;
+		return TRUE;
+	}
+
+	function Passive($pasv=NULL) {
+		if(is_null($pasv)) $this->_passive=!$this->_passive;
+		else $this->_passive=$pasv;
+		if(!$this->_port_available and !$this->_passive) {
+			$this->SendMSG("Only passive connections available!");
+			$this->_passive=TRUE;
+			return FALSE;
+		}
+		$this->SendMSG("Passive mode ".($this->_passive?"on":"off"));
+		return TRUE;
+	}
+
+	function SetServer($host, $port=21, $reconnect=true) {
+		if(!is_long($port)) {
+	        $this->verbose=true;
+    	    $this->SendMSG("Incorrect port syntax");
+			return FALSE;
+		} else {
+			$ip=@gethostbyname($host);
+	        $dns=@gethostbyaddr($host);
+	        if(!$ip) $ip=$host;
+	        if(!$dns) $dns=$host;
+			if(ip2long($ip) === -1) {
+				$this->SendMSG("Wrong host name/address \"".$host."\"");
+				return FALSE;
+			}
+	        $this->_host=$ip;
+	        $this->_fullhost=$dns;
+	        $this->_port=$port;
+	        $this->_dataport=$port-1;
+		}
+		$this->SendMSG("Host \"".$this->_fullhost."(".$this->_host."):".$this->_port."\"");
+		if($reconnect){
+			if($this->_connected) {
+				$this->SendMSG("Reconnecting");
+				if(!$this->quit(FTP_FORCE)) return FALSE;
+				if(!$this->connect()) return FALSE;
+			}
+		}
+		return TRUE;
+	}
+
+	function SetUmask($umask=0022) {
+		$this->_umask=$umask;
+		umask($this->_umask);
+		$this->SendMSG("UMASK 0".decoct($this->_umask));
+		return TRUE;
+	}
+
+	function SetTimeout($timeout=30) {
+		$this->_timeout=$timeout;
+		$this->SendMSG("Timeout ".$this->_timeout);
+		if($this->_connected)
+			if(!$this->_settimeout($this->_ftp_control_sock)) return FALSE;
+		return TRUE;
+	}
+
+	function connect($server=NULL) {
+		if(!empty($server)) {
+			if(!$this->SetServer($server)) return false;
+		}
+		if($this->_ready) return true;
+	    $this->SendMsg('Local OS : '.$this->OS_FullName[$this->OS_local]);
+		if(!($this->_ftp_control_sock = $this->_connect($this->_host, $this->_port))) {
+			$this->SendMSG("Error : Cannot connect to remote host \"".$this->_fullhost." :".$this->_port."\"");
+			return FALSE;
+		}
+		$this->SendMSG("Connected to remote host \"".$this->_fullhost.":".$this->_port."\". Waiting for greeting.");
+		do {
+			if(!$this->_readmsg()) return FALSE;
+			if(!$this->_checkCode()) return FALSE;
+			$this->_lastaction=time();
+		} while($this->_code<200);
+		$this->_ready=true;
+		$syst=$this->systype();
+		if(!$syst) $this->SendMSG("Can't detect remote OS");
+		else {
+			if(preg_match("/win|dos|novell/i", $syst[0])) $this->OS_remote=FTP_OS_Windows;
+			elseif(preg_match("/os/i", $syst[0])) $this->OS_remote=FTP_OS_Mac;
+			elseif(preg_match("/(li|u)nix/i", $syst[0])) $this->OS_remote=FTP_OS_Unix;
+			else $this->OS_remote=FTP_OS_Mac;
+			$this->SendMSG("Remote OS: ".$this->OS_FullName[$this->OS_remote]);
+		}
+		if(!$this->features()) $this->SendMSG("Can't get features list. All supported - disabled");
+		else $this->SendMSG("Supported features: ".implode(", ", array_keys($this->_features)));
+		return TRUE;
+	}
+
+	function quit($force=false) {
+		if($this->_ready) {
+			if(!$this->_exec("QUIT") and !$force) return FALSE;
+			if(!$this->_checkCode() and !$force) return FALSE;
+			$this->_ready=false;
+			$this->SendMSG("Session finished");
+		}
+		$this->_quit();
+		return TRUE;
+	}
+
+	function login($user=NULL, $pass=NULL) {
+		if(!is_null($user)) $this->_login=$user;
+		else $this->_login="anonymous";
+		if(!is_null($pass)) $this->_password=$pass;
+		else $this->_password="anon@anon.com";
+		if(!$this->_exec("USER ".$this->_login, "login")) return FALSE;
+		if(!$this->_checkCode()) return FALSE;
+		if($this->_code!=230) {
+			if(!$this->_exec((($this->_code==331)?"PASS ":"ACCT ").$this->_password, "login")) return FALSE;
+			if(!$this->_checkCode()) return FALSE;
+		}
+		$this->SendMSG("Authentication succeeded");
+		if(empty($this->_features)) {
+			if(!$this->features()) $this->SendMSG("Can't get features list. All supported - disabled");
+			else $this->SendMSG("Supported features: ".implode(", ", array_keys($this->_features)));
+		}
+		return TRUE;
+	}
+
+	function pwd() {
+		if(!$this->_exec("PWD", "pwd")) return FALSE;
+		if(!$this->_checkCode()) return FALSE;
+		return ereg_replace("^[0-9]{3} \"(.+)\".+", "\\1", $this->_message);
+	}
+
+	function cdup() {
+		if(!$this->_exec("CDUP", "cdup")) return FALSE;
+		if(!$this->_checkCode()) return FALSE;
+		return true;
+	}
+
+	function chdir($pathname) {
+		if(!$this->_exec("CWD ".$pathname, "chdir")) return FALSE;
+		if(!$this->_checkCode()) return FALSE;
+		return TRUE;
+	}
+
+	function rmdir($pathname) {
+		if(!$this->_exec("RMD ".$pathname, "rmdir")) return FALSE;
+		if(!$this->_checkCode()) return FALSE;
+		return TRUE;
+	}
+
+	function mkdir($pathname) {
+		if(!$this->_exec("MKD ".$pathname, "mkdir")) return FALSE;
+		if(!$this->_checkCode()) return FALSE;
+		return TRUE;
+	}
+
+	function rename($from, $to) {
+		if(!$this->_exec("RNFR ".$from, "rename")) return FALSE;
+		if(!$this->_checkCode()) return FALSE;
+		if($this->_code==350) {
+			if(!$this->_exec("RNTO ".$to, "rename")) return FALSE;
+			if(!$this->_checkCode()) return FALSE;
+		} else return FALSE;
+		return TRUE;
+	}
+
+	function filesize($pathname) {
+		if(!isset($this->_features["SIZE"])) {
+			$this->PushError("filesize", "not supported by server");
+			return FALSE;
+		}
+		if(!$this->_exec("SIZE ".$pathname, "filesize")) return FALSE;
+		if(!$this->_checkCode()) return FALSE;
+		return ereg_replace("^[0-9]{3} ([0-9]+)".CRLF, "\\1", $this->_message);
+	}
+
+	function abort() {
+		if(!$this->_exec("ABOR", "abort")) return FALSE;
+		if(!$this->_checkCode()) {
+			if($this->_code!=426) return FALSE;
+			if(!$this->_readmsg("abort")) return FALSE;
+			if(!$this->_checkCode()) return FALSE;
+		}
+		return true;
+	}
+
+	function mdtm($pathname) {
+		if(!isset($this->_features["MDTM"])) {
+			$this->PushError("mdtm", "not supported by server");
+			return FALSE;
+		}
+		if(!$this->_exec("MDTM ".$pathname, "mdtm")) return FALSE;
+		if(!$this->_checkCode()) return FALSE;
+		$mdtm = ereg_replace("^[0-9]{3} ([0-9]+)".CRLF, "\\1", $this->_message);
+		$date = sscanf($mdtm, "%4d%2d%2d%2d%2d%2d");
+		$timestamp = mktime($date[3], $date[4], $date[5], $date[1], $date[2], $date[0]);
+		return $timestamp;
+	}
+
+	function systype() {
+		if(!$this->_exec("SYST", "systype")) return FALSE;
+		if(!$this->_checkCode()) return FALSE;
+		$DATA = explode(" ", $this->_message);
+		return array($DATA[1], $DATA[3]);
+	}
+
+	function delete($pathname) {
+		if(!$this->_exec("DELE ".$pathname, "delete")) return FALSE;
+		if(!$this->_checkCode()) return FALSE;
+		return TRUE;
+	}
+
+	function site($command, $fnction="site") {
+		if(!$this->_exec("SITE ".$command, $fnction)) return FALSE;
+		if(!$this->_checkCode()) return FALSE;
+		return TRUE;
+	}
+
+	function chmod($pathname, $mode) {
+		if(!$this->site( sprintf('CHMOD %o %s', $mode, $pathname), "chmod")) return FALSE;
+		return TRUE;
+	}
+
+	function restore($from) {
+		if(!isset($this->_features["REST"])) {
+			$this->PushError("restore", "not supported by server");
+			return FALSE;
+		}
+		if($this->_curtype!=FTP_BINARY) {
+			$this->PushError("restore", "can't restore in ASCII mode");
+			return FALSE;
+		}
+		if(!$this->_exec("REST ".$from, "resore")) return FALSE;
+		if(!$this->_checkCode()) return FALSE;
+		return TRUE;
+	}
+
+	function features() {
+		if(!$this->_exec("FEAT", "features")) return FALSE;
+		if(!$this->_checkCode()) return FALSE;
+		$f=preg_split("/[".CRLF."]+/", preg_replace("/[0-9]{3}[ -].*[".CRLF."]+/", "", $this->_message), -1, PREG_SPLIT_NO_EMPTY);
+		$this->_features=array();
+		foreach($f as $k=>$v) {
+			$v=explode(" ", trim($v));
+			$this->_features[array_shift($v)]=$v;;
+		}
+		return true;
+	}
+
+	function rawlist($pathname="", $arg="") {
+		return $this->_list(($arg?" ".$arg:"").($pathname?" ".$pathname:""), "LIST", "rawlist");
+	}
+
+	function nlist($pathname="") {
+		return $this->_list(($arg?" ".$arg:"").($pathname?" ".$pathname:""), "NLST", "nlist");
+	}
+
+	function is_exists($pathname) {
+		return $this->file_exists($pathname);
+	}
+
+	function file_exists($pathname) {
+		$exists=true;
+		if(!$this->_exec("RNFR ".$pathname, "rename")) $exists=FALSE;
+		else {
+			if(!$this->_checkCode()) $exists=FALSE;
+			$this->abort();
+		}
+		if($exists) $this->SendMSG("Remote file ".$pathname." exists");
+		else $this->SendMSG("Remote file ".$pathname." does not exist");
+		return $exists;
+	}
+
+	function fget($fp, $remotefile,$rest=0) {
+		if($this->_can_restore and $rest!=0) fseek($fp, $rest);
+		$pi=pathinfo($remotefile);
+		if($this->_type==FTP_ASCII or ($this->_type==FTP_AUTOASCII and in_array(strtoupper($pi["extension"]), $this->AutoAsciiExt))) $mode=FTP_ASCII;
+		else $mode=FTP_BINARY;
+		if(!$this->_data_prepare($mode)) {
+			return FALSE;
+		}
+		if($this->_can_restore and $rest!=0) $this->restore($rest);
+		if(!$this->_exec("RETR ".$remotefile, "get")) {
+			$this->_data_close();
+			return FALSE;
+		}
+		if(!$this->_checkCode()) {
+			$this->_data_close();
+			return FALSE;
+		}
+		$out=$this->_data_read($mode, $fp);
+		$this->_data_close();
+		if(!$this->_readmsg()) return FALSE;
+		if(!$this->_checkCode()) return FALSE;
+		return $out;
+	}
+
+	function get($remotefile, $localfile=NULL, $rest=0) {
+		if(is_null($localfile)) $localfile=$remotefile;
+		if (@file_exists($localfile)) $this->SendMSG("Warning : local file will be overwritten");
+		$fp = @fopen($localfile, "w");
+		if (!$fp) {
+			$this->PushError("get","can't open local file", "Cannot create \"".$localfile."\"");
+			return FALSE;
+		}
+		if($this->_can_restore and $rest!=0) fseek($fp, $rest);
+		$pi=pathinfo($remotefile);
+		if($this->_type==FTP_ASCII or ($this->_type==FTP_AUTOASCII and in_array(strtoupper($pi["extension"]), $this->AutoAsciiExt))) $mode=FTP_ASCII;
+		else $mode=FTP_BINARY;
+		if(!$this->_data_prepare($mode)) {
+			fclose($fp);
+			return FALSE;
+		}
+		if($this->_can_restore and $rest!=0) $this->restore($rest);
+		if(!$this->_exec("RETR ".$remotefile, "get")) {
+			$this->_data_close();
+			fclose($fp);
+			return FALSE;
+		}
+		if(!$this->_checkCode()) {
+			$this->_data_close();
+			fclose($fp);
+			return FALSE;
+		}
+		$out=$this->_data_read($mode, $fp);
+		fclose($fp);
+		$this->_data_close();
+		if(!$this->_readmsg()) return FALSE;
+		if(!$this->_checkCode()) return FALSE;
+		return $out;
+	}
+
+	function fput($remotefile, $fp) {
+		if($this->_can_restore and $rest!=0) fseek($fp, $rest);
+		$pi=pathinfo($remotefile);
+		if($this->_type==FTP_ASCII or ($this->_type==FTP_AUTOASCII and in_array(strtoupper($pi["extension"]), $this->AutoAsciiExt))) $mode=FTP_ASCII;
+		else $mode=FTP_BINARY;
+		if(!$this->_data_prepare($mode)) {
+			return FALSE;
+		}
+		if($this->_can_restore and $rest!=0) $this->restore($rest);
+		if(!$this->_exec("STOR ".$remotefile, "put")) {
+			$this->_data_close();
+			return FALSE;
+		}
+		if(!$this->_checkCode()) {
+			$this->_data_close();
+			return FALSE;
+		}
+		$ret=$this->_data_write($mode, $fp);
+		$this->_data_close();
+		if(!$this->_readmsg()) return FALSE;
+		if(!$this->_checkCode()) return FALSE;
+		return $ret;
+	}
+
+	function put($localfile, $remotefile=NULL, $rest=0) {
+		if(is_null($remotefile)) $remotefile=$localfile;
+		if (!file_exists($localfile)) {
+			$this->PushError("put","can't open local file", "No such file or directory \"".$localfile."\"");
+			return FALSE;
+		}
+		$fp = @fopen($localfile, "r");
+
+		if (!$fp) {
+			$this->PushError("put","can't open local file", "Cannot read file \"".$localfile."\"");
+			return FALSE;
+		}
+		if($this->_can_restore and $rest!=0) fseek($fp, $rest);
+		$pi=pathinfo($localfile);
+		if($this->_type==FTP_ASCII or ($this->_type==FTP_AUTOASCII and in_array(strtoupper($pi["extension"]), $this->AutoAsciiExt))) $mode=FTP_ASCII;
+		else $mode=FTP_BINARY;
+		if(!$this->_data_prepare($mode)) {
+			fclose($fp);
+			return FALSE;
+		}
+		if($this->_can_restore and $rest!=0) $this->restore($rest);
+		if(!$this->_exec("STOR ".$remotefile, "put")) {
+			$this->_data_close();
+			fclose($fp);
+			return FALSE;
+		}
+		if(!$this->_checkCode()) {
+			$this->_data_close();
+			fclose($fp);
+			return FALSE;
+		}
+		$ret=$this->_data_write($mode, $fp);
+		fclose($fp);
+		$this->_data_close();
+		if(!$this->_readmsg()) return FALSE;
+		if(!$this->_checkCode()) return FALSE;
+		return $ret;
+	}
+
+	function mput($local=".", $remote=NULL, $continious=false) {
+		$local=realpath($local);
+		if(!@file_exists($local)) {
+			$this->PushError("mput","can't open local folder", "Cannot stat folder \"".$local."\"");
+			return FALSE;
+		}
+		if(!is_dir($local)) return $this->put($local, $remote);
+		if(empty($remote)) $remote=".";
+		elseif(!$this->file_exists($remote) and !$this->mkdir($remote)) return FALSE;
+		if($handle = opendir($local)) {
+			$list=array();
+			while (false !== ($file = readdir($handle))) {
+				if ($file != "." && $file != "..") $list[]=$file;
+			}
+			closedir($handle);
+		} else {
+			$this->PushError("mput","can't open local folder", "Cannot read folder \"".$local."\"");
+			return FALSE;
+		}
+		if(empty($list)) return TRUE;
+		$ret=true;
+		foreach($list as $el) {
+			if(is_dir($local."/".$el)) $t=$this->mput($local."/".$el, $remote."/".$el);
+			else $t=$this->put($local."/".$el, $remote."/".$el);
+			if(!$t) {
+				$ret=FALSE;
+				if(!$continious) break;
+			}
+		}
+		return $ret;
+
+	}
+
+	function mget($remote, $local=".", $continious=false) {
+		$list=$this->rawlist($remote, "-lA");
+		if($list===false) {
+			$this->PushError("mget","can't read remote folder list", "Can't read remote folder \"".$remote."\" contents");
+			return FALSE;
+		}
+		if(empty($list)) return true;
+		if(!@file_exists($local)) {
+			if(!@mkdir($local)) {
+				$this->PushError("mget","can't create local folder", "Cannot create folder \"".$local."\"");
+				return FALSE;
+			}
+		}
+		foreach($list as $k=>$v) {
+			$list[$k]=$this->parselisting($v);
+			if($list[$k]["name"]=="." or $list[$k]["name"]=="..") unset($list[$k]);
+		}
+		$ret=true;
+		foreach($list as $el) {
+			if($el["type"]=="d") {
+				if(!$this->mget($remote."/".$el["name"], $local."/".$el["name"], $continious)) {
+					$this->PushError("mget", "can't copy folder", "Can't copy remote folder \"".$remote."/".$el["name"]."\" to local \"".$local."/".$el["name"]."\"");
+					$ret=false;
+					if(!$continious) break;
+				}
+			} else {
+				if(!$this->get($remote."/".$el["name"], $local."/".$el["name"])) {
+					$this->PushError("mget", "can't copy file", "Can't copy remote file \"".$remote."/".$el["name"]."\" to local \"".$local."/".$el["name"]."\"");
+					$ret=false;
+					if(!$continious) break;
+				}
+			}
+			@chmod($local."/".$el["name"], $el["perms"]);
+			$t=strtotime($el["date"]);
+			if($t!==-1 and $t!==false) @touch($local."/".$el["name"], $t);
+		}
+		return $ret;
+	}
+
+	function mdel($remote, $continious=false) {
+		$list=$this->rawlist($remote, "-la");
+		if($list===false) {
+			$this->PushError("mdel","can't read remote folder list", "Can't read remote folder \"".$remote."\" contents");
+			return false;
+		}
+
+		foreach($list as $k=>$v) {
+			$list[$k]=$this->parselisting($v);
+			if($list[$k]["name"]=="." or $list[$k]["name"]=="..") unset($list[$k]);
+		}
+		$ret=true;
+
+		foreach($list as $el) {
+			if ( empty($el) )
+				continue;
+
+			if($el["type"]=="d") {
+				if(!$this->mdel($remote."/".$el["name"], $continious)) {
+					$ret=false;
+					if(!$continious) break;
+				}
+			} else {
+				if (!$this->delete($remote."/".$el["name"])) {
+					$this->PushError("mdel", "can't delete file", "Can't delete remote file \"".$remote."/".$el["name"]."\"");
+					$ret=false;
+					if(!$continious) break;
+				}
+			}
+		}
+
+		if(!$this->rmdir($remote)) {
+			$this->PushError("mdel", "can't delete folder", "Can't delete remote folder \"".$remote."/".$el["name"]."\"");
+			$ret=false;
+		}
+		return $ret;
+	}
+
+	function mmkdir($dir, $mode = 0777) {
+		if(empty($dir)) return FALSE;
+		if($this->is_exists($dir) or $dir == "/" ) return TRUE;
+		if(!$this->mmkdir(dirname($dir), $mode)) return false;
+		$r=$this->mkdir($dir, $mode);
+		$this->chmod($dir,$mode);
+		return $r;
+	}
+
+	function glob($pattern, $handle=NULL) {
+		$path=$output=null;
+		if(PHP_OS=='WIN32') $slash='\\';
+		else $slash='/';
+		$lastpos=strrpos($pattern,$slash);
+		if(!($lastpos===false)) {
+			$path=substr($pattern,0,-$lastpos-1);
+			$pattern=substr($pattern,$lastpos);
+		} else $path=getcwd();
+		if(is_array($handle) and !empty($handle)) {
+			while($dir=each($handle)) {
+				if($this->glob_pattern_match($pattern,$dir))
+				$output[]=$dir;
+			}
+		} else {
+			$handle=@opendir($path);
+			if($handle===false) return false;
+			while($dir=readdir($handle)) {
+				if($this->glob_pattern_match($pattern,$dir))
+				$output[]=$dir;
+			}
+			closedir($handle);
+		}
+		if(is_array($output)) return $output;
+		return false;
+	}
+
+	function glob_pattern_match($pattern,$string) {
+		$out=null;
+		$chunks=explode(';',$pattern);
+		foreach($chunks as $pattern) {
+			$escape=array('$','^','.','{','}','(',')','[',']','|');
+			while(strpos($pattern,'**')!==false)
+				$pattern=str_replace('**','*',$pattern);
+			foreach($escape as $probe)
+				$pattern=str_replace($probe,"\\$probe",$pattern);
+			$pattern=str_replace('?*','*',
+				str_replace('*?','*',
+					str_replace('*',".*",
+						str_replace('?','.{1,1}',$pattern))));
+			$out[]=$pattern;
+		}
+		if(count($out)==1) return($this->glob_regexp("^$out[0]$",$string));
+		else {
+			foreach($out as $tester)
+				if($this->my_regexp("^$tester$",$string)) return true;
+		}
+		return false;
+	}
+
+	function glob_regexp($pattern,$probe) {
+		$sensitive=(PHP_OS!='WIN32');
+		return ($sensitive?
+			ereg($pattern,$probe):
+			eregi($pattern,$probe)
+		);
+	}
+
+	function dirlist($remote) {
+		$list=$this->rawlist($remote, "-la");
+		if($list===false) {
+			$this->PushError("dirlist","can't read remote folder list", "Can't read remote folder \"".$remote."\" contents");
+			return false;
+		}
+
+		$dirlist = array();
+		foreach($list as $k=>$v) {
+			$entry=$this->parselisting($v);
+			if ( empty($entry) )
+				continue;
+
+			if($entry["name"]=="." or $entry["name"]=="..")
+				continue;
+
+			$dirlist[$entry['name']] = $entry;
+		}
+
+		return $dirlist;
+	}
+// <!-- --------------------------------------------------------------------------------------- -->
+// <!--       Private functions                                                                 -->
+// <!-- --------------------------------------------------------------------------------------- -->
+	function _checkCode() {
+		return ($this->_code<400 and $this->_code>0);
+	}
+
+	function _list($arg="", $cmd="LIST", $fnction="_list") {
+		if(!$this->_data_prepare()) return false;
+		if(!$this->_exec($cmd.$arg, $fnction)) {
+			$this->_data_close();
+			return FALSE;
+		}
+		if(!$this->_checkCode()) {
+			$this->_data_close();
+			return FALSE;
+		}
+		$out="";
+		if($this->_code<200) {
+			$out=$this->_data_read();
+			$this->_data_close();
+			if(!$this->_readmsg()) return FALSE;
+			if(!$this->_checkCode()) return FALSE;
+			if($out === FALSE ) return FALSE;
+			$out=preg_split("/[".CRLF."]+/", $out, -1, PREG_SPLIT_NO_EMPTY);
+//			$this->SendMSG(implode($this->_eol_code[$this->OS_local], $out));
+		}
+		return $out;
+	}
+
+// <!-- --------------------------------------------------------------------------------------- -->
+// <!-- Partie : gestion des erreurs                                                            -->
+// <!-- --------------------------------------------------------------------------------------- -->
+// Gnre une erreur pour traitement externe  la classe
+	function PushError($fctname,$msg,$desc=false){
+		$error=array();
+		$error['time']=time();
+		$error['fctname']=$fctname;
+		$error['msg']=$msg;
+		$error['desc']=$desc;
+		if($desc) $tmp=' ('.$desc.')'; else $tmp='';
+		$this->SendMSG($fctname.': '.$msg.$tmp);
+		return(array_push($this->_error_array,$error));
+	}
+
+// Rcupre une erreur externe
+	function PopError(){
+		if(count($this->_error_array)) return(array_pop($this->_error_array));
+			else return(false);
+	}
+}
+
+$mod_sockets=TRUE;
+if (!extension_loaded('sockets')) {
+	$prefix = (PHP_SHLIB_SUFFIX == 'dll') ? 'php_' : '';
+	if(!@dl($prefix . 'sockets.' . PHP_SHLIB_SUFFIX)) $mod_sockets=FALSE;
+}
+require_once "class-ftp-".($mod_sockets?"sockets":"pure").".php";
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/class-pclzip.php 2.5.src/wp-admin/includes/class-pclzip.php
--- 2.2.2.src/wp-admin/includes/class-pclzip.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/class-pclzip.php	2008-03-15 13:33:16.000000000 -0500
@@ -0,0 +1,5750 @@
+<?php
+// --------------------------------------------------------------------------------
+// PhpConcept Library - Zip Module 2.5
+// --------------------------------------------------------------------------------
+// License GNU/LGPL - Vincent Blavet - March 2006
+// http://www.phpconcept.net
+// --------------------------------------------------------------------------------
+//
+// Presentation :
+//   PclZip is a PHP library that manage ZIP archives.
+//   So far tests show that archives generated by PclZip are readable by
+//   WinZip application and other tools.
+//
+// Description :
+//   See readme.txt and http://www.phpconcept.net
+//
+// Warning :
+//   This library and the associated files are non commercial, non professional
+//   work.
+//   It should not have unexpected results. However if any damage is caused by
+//   this software the author can not be responsible.
+//   The use of this software is at the risk of the user.
+//
+// --------------------------------------------------------------------------------
+// $Id: pclzip.lib.php,v 1.44 2006/03/08 21:23:59 vblavet Exp $
+// --------------------------------------------------------------------------------
+
+  // ----- Constants
+  define( 'PCLZIP_READ_BLOCK_SIZE', 2048 );
+
+  // ----- File list separator
+  // In version 1.x of PclZip, the separator for file list is a space
+  // (which is not a very smart choice, specifically for windows paths !).
+  // A better separator should be a comma (,). This constant gives you the
+  // abilty to change that.
+  // However notice that changing this value, may have impact on existing
+  // scripts, using space separated filenames.
+  // Recommanded values for compatibility with older versions :
+  //define( 'PCLZIP_SEPARATOR', ' ' );
+  // Recommanded values for smart separation of filenames.
+  define( 'PCLZIP_SEPARATOR', ',' );
+
+  // ----- Error configuration
+  // 0 : PclZip Class integrated error handling
+  // 1 : PclError external library error handling. By enabling this
+  //     you must ensure that you have included PclError library.
+  // [2,...] : reserved for futur use
+  define( 'PCLZIP_ERROR_EXTERNAL', 0 );
+
+  // ----- Optional static temporary directory
+  //       By default temporary files are generated in the script current
+  //       path.
+  //       If defined :
+  //       - MUST BE terminated by a '/'.
+  //       - MUST be a valid, already created directory
+  //       Samples :
+  // define( 'PCLZIP_TEMPORARY_DIR', '/temp/' );
+  // define( 'PCLZIP_TEMPORARY_DIR', 'C:/Temp/' );
+  define( 'PCLZIP_TEMPORARY_DIR', '' );
+
+// --------------------------------------------------------------------------------
+// ***** UNDER THIS LINE NOTHING NEEDS TO BE MODIFIED *****
+// --------------------------------------------------------------------------------
+
+  // ----- Global variables
+  $g_pclzip_version = "2.5";
+
+  // ----- Error codes
+  //   -1 : Unable to open file in binary write mode
+  //   -2 : Unable to open file in binary read mode
+  //   -3 : Invalid parameters
+  //   -4 : File does not exist
+  //   -5 : Filename is too long (max. 255)
+  //   -6 : Not a valid zip file
+  //   -7 : Invalid extracted file size
+  //   -8 : Unable to create directory
+  //   -9 : Invalid archive extension
+  //  -10 : Invalid archive format
+  //  -11 : Unable to delete file (unlink)
+  //  -12 : Unable to rename file (rename)
+  //  -13 : Invalid header checksum
+  //  -14 : Invalid archive size
+  define( 'PCLZIP_ERR_USER_ABORTED', 2 );
+  define( 'PCLZIP_ERR_NO_ERROR', 0 );
+  define( 'PCLZIP_ERR_WRITE_OPEN_FAIL', -1 );
+  define( 'PCLZIP_ERR_READ_OPEN_FAIL', -2 );
+  define( 'PCLZIP_ERR_INVALID_PARAMETER', -3 );
+  define( 'PCLZIP_ERR_MISSING_FILE', -4 );
+  define( 'PCLZIP_ERR_FILENAME_TOO_LONG', -5 );
+  define( 'PCLZIP_ERR_INVALID_ZIP', -6 );
+  define( 'PCLZIP_ERR_BAD_EXTRACTED_FILE', -7 );
+  define( 'PCLZIP_ERR_DIR_CREATE_FAIL', -8 );
+  define( 'PCLZIP_ERR_BAD_EXTENSION', -9 );
+  define( 'PCLZIP_ERR_BAD_FORMAT', -10 );
+  define( 'PCLZIP_ERR_DELETE_FILE_FAIL', -11 );
+  define( 'PCLZIP_ERR_RENAME_FILE_FAIL', -12 );
+  define( 'PCLZIP_ERR_BAD_CHECKSUM', -13 );
+  define( 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', -14 );
+  define( 'PCLZIP_ERR_MISSING_OPTION_VALUE', -15 );
+  define( 'PCLZIP_ERR_INVALID_OPTION_VALUE', -16 );
+  define( 'PCLZIP_ERR_ALREADY_A_DIRECTORY', -17 );
+  define( 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', -18 );
+  define( 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION', -19 );
+  define( 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE', -20 );
+  define( 'PCLZIP_ERR_DIRECTORY_RESTRICTION', -21 );
+
+  // ----- Options values
+  define( 'PCLZIP_OPT_PATH', 77001 );
+  define( 'PCLZIP_OPT_ADD_PATH', 77002 );
+  define( 'PCLZIP_OPT_REMOVE_PATH', 77003 );
+  define( 'PCLZIP_OPT_REMOVE_ALL_PATH', 77004 );
+  define( 'PCLZIP_OPT_SET_CHMOD', 77005 );
+  define( 'PCLZIP_OPT_EXTRACT_AS_STRING', 77006 );
+  define( 'PCLZIP_OPT_NO_COMPRESSION', 77007 );
+  define( 'PCLZIP_OPT_BY_NAME', 77008 );
+  define( 'PCLZIP_OPT_BY_INDEX', 77009 );
+  define( 'PCLZIP_OPT_BY_EREG', 77010 );
+  define( 'PCLZIP_OPT_BY_PREG', 77011 );
+  define( 'PCLZIP_OPT_COMMENT', 77012 );
+  define( 'PCLZIP_OPT_ADD_COMMENT', 77013 );
+  define( 'PCLZIP_OPT_PREPEND_COMMENT', 77014 );
+  define( 'PCLZIP_OPT_EXTRACT_IN_OUTPUT', 77015 );
+  define( 'PCLZIP_OPT_REPLACE_NEWER', 77016 );
+  define( 'PCLZIP_OPT_STOP_ON_ERROR', 77017 );
+  // Having big trouble with crypt. Need to multiply 2 long int
+  // which is not correctly supported by PHP ...
+  //define( 'PCLZIP_OPT_CRYPT', 77018 );
+  define( 'PCLZIP_OPT_EXTRACT_DIR_RESTRICTION', 77019 );
+
+  // ----- File description attributes
+  define( 'PCLZIP_ATT_FILE_NAME', 79001 );
+  define( 'PCLZIP_ATT_FILE_NEW_SHORT_NAME', 79002 );
+  define( 'PCLZIP_ATT_FILE_NEW_FULL_NAME', 79003 );
+
+  // ----- Call backs values
+  define( 'PCLZIP_CB_PRE_EXTRACT', 78001 );
+  define( 'PCLZIP_CB_POST_EXTRACT', 78002 );
+  define( 'PCLZIP_CB_PRE_ADD', 78003 );
+  define( 'PCLZIP_CB_POST_ADD', 78004 );
+  /* For futur use
+  define( 'PCLZIP_CB_PRE_LIST', 78005 );
+  define( 'PCLZIP_CB_POST_LIST', 78006 );
+  define( 'PCLZIP_CB_PRE_DELETE', 78007 );
+  define( 'PCLZIP_CB_POST_DELETE', 78008 );
+  */
+
+  // --------------------------------------------------------------------------------
+  // Class : PclZip
+  // Description :
+  //   PclZip is the class that represent a Zip archive.
+  //   The public methods allow the manipulation of the archive.
+  // Attributes :
+  //   Attributes must not be accessed directly.
+  // Methods :
+  //   PclZip() : Object creator
+  //   create() : Creates the Zip archive
+  //   listContent() : List the content of the Zip archive
+  //   extract() : Extract the content of the archive
+  //   properties() : List the properties of the archive
+  // --------------------------------------------------------------------------------
+  class PclZip
+  {
+    // ----- Filename of the zip file
+    var $zipname = '';
+
+    // ----- File descriptor of the zip file
+    var $zip_fd = 0;
+
+    // ----- Internal error handling
+    var $error_code = 1;
+    var $error_string = '';
+
+    // ----- Current status of the magic_quotes_runtime
+    // This value store the php configuration for magic_quotes
+    // The class can then disable the magic_quotes and reset it after
+    var $magic_quotes_status;
+
+  // --------------------------------------------------------------------------------
+  // Function : PclZip()
+  // Description :
+  //   Creates a PclZip object and set the name of the associated Zip archive
+  //   filename.
+  //   Note that no real action is taken, if the archive does not exist it is not
+  //   created. Use create() for that.
+  // --------------------------------------------------------------------------------
+  function PclZip($p_zipname)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::PclZip', "zipname=$p_zipname");
+
+    // ----- Tests the zlib
+    if (!function_exists('gzopen'))
+    {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 1, "zlib extension seems to be missing");
+      die('Abort '.basename(__FILE__).' : Missing zlib extensions');
+    }
+
+    // ----- Set the attributes
+    $this->zipname = $p_zipname;
+    $this->zip_fd = 0;
+    $this->magic_quotes_status = -1;
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 1);
+    return;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function :
+  //   create($p_filelist, $p_add_dir="", $p_remove_dir="")
+  //   create($p_filelist, $p_option, $p_option_value, ...)
+  // Description :
+  //   This method supports two different synopsis. The first one is historical.
+  //   This method creates a Zip Archive. The Zip file is created in the
+  //   filesystem. The files and directories indicated in $p_filelist
+  //   are added in the archive. See the parameters description for the
+  //   supported format of $p_filelist.
+  //   When a directory is in the list, the directory and its content is added
+  //   in the archive.
+  //   In this synopsis, the function takes an optional variable list of
+  //   options. See bellow the supported options.
+  // Parameters :
+  //   $p_filelist : An array containing file or directory names, or
+  //                 a string containing one filename or one directory name, or
+  //                 a string containing a list of filenames and/or directory
+  //                 names separated by spaces.
+  //   $p_add_dir : A path to add before the real path of the archived file,
+  //                in order to have it memorized in the archive.
+  //   $p_remove_dir : A path to remove from the real path of the file to archive,
+  //                   in order to have a shorter path memorized in the archive.
+  //                   When $p_add_dir and $p_remove_dir are set, $p_remove_dir
+  //                   is removed first, before $p_add_dir is added.
+  // Options :
+  //   PCLZIP_OPT_ADD_PATH :
+  //   PCLZIP_OPT_REMOVE_PATH :
+  //   PCLZIP_OPT_REMOVE_ALL_PATH :
+  //   PCLZIP_OPT_COMMENT :
+  //   PCLZIP_CB_PRE_ADD :
+  //   PCLZIP_CB_POST_ADD :
+  // Return Values :
+  //   0 on failure,
+  //   The list of the added files, with a status of the add action.
+  //   (see PclZip::listContent() for list entry format)
+  // --------------------------------------------------------------------------------
+  function create($p_filelist)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::create', "filelist='$p_filelist', ...");
+    $v_result=1;
+
+    // ----- Reset the error handler
+    $this->privErrorReset();
+
+    // ----- Set default values
+    $v_options = array();
+    $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE;
+
+    // ----- Look for variable options arguments
+    $v_size = func_num_args();
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");
+
+    // ----- Look for arguments
+    if ($v_size > 1) {
+      // ----- Get the arguments
+      $v_arg_list = func_get_args();
+
+      // ----- Remove from the options list the first argument
+      array_shift($v_arg_list);
+      $v_size--;
+
+      // ----- Look for first arg
+      if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options detected");
+
+        // ----- Parse the options
+        $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
+                                            array (PCLZIP_OPT_REMOVE_PATH => 'optional',
+                                                   PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
+                                                   PCLZIP_OPT_ADD_PATH => 'optional',
+                                                   PCLZIP_CB_PRE_ADD => 'optional',
+                                                   PCLZIP_CB_POST_ADD => 'optional',
+                                                   PCLZIP_OPT_NO_COMPRESSION => 'optional',
+                                                   PCLZIP_OPT_COMMENT => 'optional'
+                                                   //, PCLZIP_OPT_CRYPT => 'optional'
+                                             ));
+        if ($v_result != 1) {
+          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
+          return 0;
+        }
+      }
+
+      // ----- Look for 2 args
+      // Here we need to support the first historic synopsis of the
+      // method.
+      else {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis");
+
+        // ----- Get the first argument
+        $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0];
+
+        // ----- Look for the optional second argument
+        if ($v_size == 2) {
+          $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1];
+        }
+        else if ($v_size > 2) {
+          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,
+		                       "Invalid number / type of arguments");
+          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+          return 0;
+        }
+      }
+    }
+
+    // ----- Init
+    $v_string_list = array();
+    $v_att_list = array();
+    $v_filedescr_list = array();
+    $p_result_list = array();
+
+    // ----- Look if the $p_filelist is really an array
+    if (is_array($p_filelist)) {
+
+      // ----- Look if the first element is also an array
+      //       This will mean that this is a file description entry
+      if (isset($p_filelist[0]) && is_array($p_filelist[0])) {
+        $v_att_list = $p_filelist;
+      }
+
+      // ----- The list is a list of string names
+      else {
+        $v_string_list = $p_filelist;
+      }
+    }
+
+    // ----- Look if the $p_filelist is a string
+    else if (is_string($p_filelist)) {
+      // ----- Create a list from the string
+      $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);
+    }
+
+    // ----- Invalid variable type for $p_filelist
+    else {
+      PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist");
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
+      return 0;
+    }
+
+    // ----- Reformat the string list
+    if (sizeof($v_string_list) != 0) {
+      foreach ($v_string_list as $v_string) {
+        if ($v_string != '') {
+          $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;
+        }
+        else {
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Ignore an empty filename");
+        }
+      }
+    }
+
+    // ----- For each file in the list check the attributes
+    $v_supported_attributes
+    = array ( PCLZIP_ATT_FILE_NAME => 'mandatory'
+             ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional'
+             ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional'
+						);
+    foreach ($v_att_list as $v_entry) {
+      $v_result = $this->privFileDescrParseAtt($v_entry,
+                                               $v_filedescr_list[],
+                                               $v_options,
+                                               $v_supported_attributes);
+      if ($v_result != 1) {
+        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
+        return 0;
+      }
+    }
+
+    // ----- Expand the filelist (expand directories)
+    $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options);
+    if ($v_result != 1) {
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
+      return 0;
+    }
+
+    // ----- Call the create fct
+    $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options);
+    if ($v_result != 1) {
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
+      return 0;
+    }
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_result_list);
+    return $p_result_list;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function :
+  //   add($p_filelist, $p_add_dir="", $p_remove_dir="")
+  //   add($p_filelist, $p_option, $p_option_value, ...)
+  // Description :
+  //   This method supports two synopsis. The first one is historical.
+  //   This methods add the list of files in an existing archive.
+  //   If a file with the same name already exists, it is added at the end of the
+  //   archive, the first one is still present.
+  //   If the archive does not exist, it is created.
+  // Parameters :
+  //   $p_filelist : An array containing file or directory names, or
+  //                 a string containing one filename or one directory name, or
+  //                 a string containing a list of filenames and/or directory
+  //                 names separated by spaces.
+  //   $p_add_dir : A path to add before the real path of the archived file,
+  //                in order to have it memorized in the archive.
+  //   $p_remove_dir : A path to remove from the real path of the file to archive,
+  //                   in order to have a shorter path memorized in the archive.
+  //                   When $p_add_dir and $p_remove_dir are set, $p_remove_dir
+  //                   is removed first, before $p_add_dir is added.
+  // Options :
+  //   PCLZIP_OPT_ADD_PATH :
+  //   PCLZIP_OPT_REMOVE_PATH :
+  //   PCLZIP_OPT_REMOVE_ALL_PATH :
+  //   PCLZIP_OPT_COMMENT :
+  //   PCLZIP_OPT_ADD_COMMENT :
+  //   PCLZIP_OPT_PREPEND_COMMENT :
+  //   PCLZIP_CB_PRE_ADD :
+  //   PCLZIP_CB_POST_ADD :
+  // Return Values :
+  //   0 on failure,
+  //   The list of the added files, with a status of the add action.
+  //   (see PclZip::listContent() for list entry format)
+  // --------------------------------------------------------------------------------
+  function add($p_filelist)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::add', "filelist='$p_filelist', ...");
+    $v_result=1;
+
+    // ----- Reset the error handler
+    $this->privErrorReset();
+
+    // ----- Set default values
+    $v_options = array();
+    $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE;
+
+    // ----- Look for variable options arguments
+    $v_size = func_num_args();
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");
+
+    // ----- Look for arguments
+    if ($v_size > 1) {
+      // ----- Get the arguments
+      $v_arg_list = func_get_args();
+
+      // ----- Remove form the options list the first argument
+      array_shift($v_arg_list);
+      $v_size--;
+
+      // ----- Look for first arg
+      if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options detected");
+
+        // ----- Parse the options
+        $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
+                                            array (PCLZIP_OPT_REMOVE_PATH => 'optional',
+                                                   PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
+                                                   PCLZIP_OPT_ADD_PATH => 'optional',
+                                                   PCLZIP_CB_PRE_ADD => 'optional',
+                                                   PCLZIP_CB_POST_ADD => 'optional',
+                                                   PCLZIP_OPT_NO_COMPRESSION => 'optional',
+                                                   PCLZIP_OPT_COMMENT => 'optional',
+                                                   PCLZIP_OPT_ADD_COMMENT => 'optional',
+                                                   PCLZIP_OPT_PREPEND_COMMENT => 'optional'
+                                                   //, PCLZIP_OPT_CRYPT => 'optional'
+												   ));
+        if ($v_result != 1) {
+          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
+          return 0;
+        }
+      }
+
+      // ----- Look for 2 args
+      // Here we need to support the first historic synopsis of the
+      // method.
+      else {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis");
+
+        // ----- Get the first argument
+        $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0];
+
+        // ----- Look for the optional second argument
+        if ($v_size == 2) {
+          $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1];
+        }
+        else if ($v_size > 2) {
+          // ----- Error log
+          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");
+
+          // ----- Return
+          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+          return 0;
+        }
+      }
+    }
+
+    // ----- Init
+    $v_string_list = array();
+    $v_att_list = array();
+    $v_filedescr_list = array();
+    $p_result_list = array();
+
+    // ----- Look if the $p_filelist is really an array
+    if (is_array($p_filelist)) {
+
+      // ----- Look if the first element is also an array
+      //       This will mean that this is a file description entry
+      if (isset($p_filelist[0]) && is_array($p_filelist[0])) {
+        $v_att_list = $p_filelist;
+      }
+
+      // ----- The list is a list of string names
+      else {
+        $v_string_list = $p_filelist;
+      }
+    }
+
+    // ----- Look if the $p_filelist is a string
+    else if (is_string($p_filelist)) {
+      // ----- Create a list from the string
+      $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);
+    }
+
+    // ----- Invalid variable type for $p_filelist
+    else {
+      PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist");
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
+      return 0;
+    }
+
+    // ----- Reformat the string list
+    if (sizeof($v_string_list) != 0) {
+      foreach ($v_string_list as $v_string) {
+        $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;
+      }
+    }
+
+    // ----- For each file in the list check the attributes
+    $v_supported_attributes
+    = array ( PCLZIP_ATT_FILE_NAME => 'mandatory'
+             ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional'
+             ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional'
+						);
+    foreach ($v_att_list as $v_entry) {
+      $v_result = $this->privFileDescrParseAtt($v_entry,
+                                               $v_filedescr_list[],
+                                               $v_options,
+                                               $v_supported_attributes);
+      if ($v_result != 1) {
+        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
+        return 0;
+      }
+    }
+
+    // ----- Expand the filelist (expand directories)
+    $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options);
+    if ($v_result != 1) {
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
+      return 0;
+    }
+
+    // ----- Call the create fct
+    $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options);
+    if ($v_result != 1) {
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
+      return 0;
+    }
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_result_list);
+    return $p_result_list;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : listContent()
+  // Description :
+  //   This public method, gives the list of the files and directories, with their
+  //   properties.
+  //   The properties of each entries in the list are (used also in other functions) :
+  //     filename : Name of the file. For a create or add action it is the filename
+  //                given by the user. For an extract function it is the filename
+  //                of the extracted file.
+  //     stored_filename : Name of the file / directory stored in the archive.
+  //     size : Size of the stored file.
+  //     compressed_size : Size of the file's data compressed in the archive
+  //                       (without the headers overhead)
+  //     mtime : Last known modification date of the file (UNIX timestamp)
+  //     comment : Comment associated with the file
+  //     folder : true | false
+  //     index : index of the file in the archive
+  //     status : status of the action (depending of the action) :
+  //              Values are :
+  //                ok : OK !
+  //                filtered : the file / dir is not extracted (filtered by user)
+  //                already_a_directory : the file can not be extracted because a
+  //                                      directory with the same name already exists
+  //                write_protected : the file can not be extracted because a file
+  //                                  with the same name already exists and is
+  //                                  write protected
+  //                newer_exist : the file was not extracted because a newer file exists
+  //                path_creation_fail : the file is not extracted because the folder
+  //                                     does not exists and can not be created
+  //                write_error : the file was not extracted because there was a
+  //                              error while writing the file
+  //                read_error : the file was not extracted because there was a error
+  //                             while reading the file
+  //                invalid_header : the file was not extracted because of an archive
+  //                                 format error (bad file header)
+  //   Note that each time a method can continue operating when there
+  //   is an action error on a file, the error is only logged in the file status.
+  // Return Values :
+  //   0 on an unrecoverable failure,
+  //   The list of the files in the archive.
+  // --------------------------------------------------------------------------------
+  function listContent()
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::listContent', "");
+    $v_result=1;
+
+    // ----- Reset the error handler
+    $this->privErrorReset();
+
+    // ----- Check archive
+    if (!$this->privCheckFormat()) {
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
+      return(0);
+    }
+
+    // ----- Call the extracting fct
+    $p_list = array();
+    if (($v_result = $this->privList($p_list)) != 1)
+    {
+      unset($p_list);
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());
+      return(0);
+    }
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list);
+    return $p_list;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function :
+  //   extract($p_path="./", $p_remove_path="")
+  //   extract([$p_option, $p_option_value, ...])
+  // Description :
+  //   This method supports two synopsis. The first one is historical.
+  //   This method extract all the files / directories from the archive to the
+  //   folder indicated in $p_path.
+  //   If you want to ignore the 'root' part of path of the memorized files
+  //   you can indicate this in the optional $p_remove_path parameter.
+  //   By default, if a newer file with the same name already exists, the
+  //   file is not extracted.
+  //
+  //   If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH aoptions
+  //   are used, the path indicated in PCLZIP_OPT_ADD_PATH is append
+  //   at the end of the path value of PCLZIP_OPT_PATH.
+  // Parameters :
+  //   $p_path : Path where the files and directories are to be extracted
+  //   $p_remove_path : First part ('root' part) of the memorized path
+  //                    (if any similar) to remove while extracting.
+  // Options :
+  //   PCLZIP_OPT_PATH :
+  //   PCLZIP_OPT_ADD_PATH :
+  //   PCLZIP_OPT_REMOVE_PATH :
+  //   PCLZIP_OPT_REMOVE_ALL_PATH :
+  //   PCLZIP_CB_PRE_EXTRACT :
+  //   PCLZIP_CB_POST_EXTRACT :
+  // Return Values :
+  //   0 or a negative value on failure,
+  //   The list of the extracted files, with a status of the action.
+  //   (see PclZip::listContent() for list entry format)
+  // --------------------------------------------------------------------------------
+  function extract()
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::extract", "");
+    $v_result=1;
+
+    // ----- Reset the error handler
+    $this->privErrorReset();
+
+    // ----- Check archive
+    if (!$this->privCheckFormat()) {
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
+      return(0);
+    }
+
+    // ----- Set default values
+    $v_options = array();
+//    $v_path = "./";
+    $v_path = '';
+    $v_remove_path = "";
+    $v_remove_all_path = false;
+
+    // ----- Look for variable options arguments
+    $v_size = func_num_args();
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");
+
+    // ----- Default values for option
+    $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;
+
+    // ----- Look for arguments
+    if ($v_size > 0) {
+      // ----- Get the arguments
+      $v_arg_list = func_get_args();
+
+      // ----- Look for first arg
+      if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options");
+
+        // ----- Parse the options
+        $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
+                                            array (PCLZIP_OPT_PATH => 'optional',
+                                                   PCLZIP_OPT_REMOVE_PATH => 'optional',
+                                                   PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
+                                                   PCLZIP_OPT_ADD_PATH => 'optional',
+                                                   PCLZIP_CB_PRE_EXTRACT => 'optional',
+                                                   PCLZIP_CB_POST_EXTRACT => 'optional',
+                                                   PCLZIP_OPT_SET_CHMOD => 'optional',
+                                                   PCLZIP_OPT_BY_NAME => 'optional',
+                                                   PCLZIP_OPT_BY_EREG => 'optional',
+                                                   PCLZIP_OPT_BY_PREG => 'optional',
+                                                   PCLZIP_OPT_BY_INDEX => 'optional',
+                                                   PCLZIP_OPT_EXTRACT_AS_STRING => 'optional',
+                                                   PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional',
+                                                   PCLZIP_OPT_REPLACE_NEWER => 'optional'
+                                                   ,PCLZIP_OPT_STOP_ON_ERROR => 'optional'
+                                                   ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional'
+												    ));
+        if ($v_result != 1) {
+          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
+          return 0;
+        }
+
+        // ----- Set the arguments
+        if (isset($v_options[PCLZIP_OPT_PATH])) {
+          $v_path = $v_options[PCLZIP_OPT_PATH];
+        }
+        if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {
+          $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];
+        }
+        if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {
+          $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];
+        }
+        if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {
+          // ----- Check for '/' in last path char
+          if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) {
+            $v_path .= '/';
+          }
+          $v_path .= $v_options[PCLZIP_OPT_ADD_PATH];
+        }
+      }
+
+      // ----- Look for 2 args
+      // Here we need to support the first historic synopsis of the
+      // method.
+      else {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis");
+
+        // ----- Get the first argument
+        $v_path = $v_arg_list[0];
+
+        // ----- Look for the optional second argument
+        if ($v_size == 2) {
+          $v_remove_path = $v_arg_list[1];
+        }
+        else if ($v_size > 2) {
+          // ----- Error log
+          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");
+
+          // ----- Return
+          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());
+          return 0;
+        }
+      }
+    }
+
+    // ----- Trace
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "path='$v_path', remove_path='$v_remove_path', remove_all_path='".($v_remove_path?'true':'false')."'");
+
+    // ----- Call the extracting fct
+    $p_list = array();
+    $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path,
+	                                     $v_remove_all_path, $v_options);
+    if ($v_result < 1) {
+      unset($p_list);
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());
+      return(0);
+    }
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list);
+    return $p_list;
+  }
+  // --------------------------------------------------------------------------------
+
+
+  // --------------------------------------------------------------------------------
+  // Function :
+  //   extractByIndex($p_index, $p_path="./", $p_remove_path="")
+  //   extractByIndex($p_index, [$p_option, $p_option_value, ...])
+  // Description :
+  //   This method supports two synopsis. The first one is historical.
+  //   This method is doing a partial extract of the archive.
+  //   The extracted files or folders are identified by their index in the
+  //   archive (from 0 to n).
+  //   Note that if the index identify a folder, only the folder entry is
+  //   extracted, not all the files included in the archive.
+  // Parameters :
+  //   $p_index : A single index (integer) or a string of indexes of files to
+  //              extract. The form of the string is "0,4-6,8-12" with only numbers
+  //              and '-' for range or ',' to separate ranges. No spaces or ';'
+  //              are allowed.
+  //   $p_path : Path where the files and directories are to be extracted
+  //   $p_remove_path : First part ('root' part) of the memorized path
+  //                    (if any similar) to remove while extracting.
+  // Options :
+  //   PCLZIP_OPT_PATH :
+  //   PCLZIP_OPT_ADD_PATH :
+  //   PCLZIP_OPT_REMOVE_PATH :
+  //   PCLZIP_OPT_REMOVE_ALL_PATH :
+  //   PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and
+  //     not as files.
+  //     The resulting content is in a new field 'content' in the file
+  //     structure.
+  //     This option must be used alone (any other options are ignored).
+  //   PCLZIP_CB_PRE_EXTRACT :
+  //   PCLZIP_CB_POST_EXTRACT :
+  // Return Values :
+  //   0 on failure,
+  //   The list of the extracted files, with a status of the action.
+  //   (see PclZip::listContent() for list entry format)
+  // --------------------------------------------------------------------------------
+  //function extractByIndex($p_index, options...)
+  function extractByIndex($p_index)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::extractByIndex", "index='$p_index', ...");
+    $v_result=1;
+
+    // ----- Reset the error handler
+    $this->privErrorReset();
+
+    // ----- Check archive
+    if (!$this->privCheckFormat()) {
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
+      return(0);
+    }
+
+    // ----- Set default values
+    $v_options = array();
+//    $v_path = "./";
+    $v_path = '';
+    $v_remove_path = "";
+    $v_remove_all_path = false;
+
+    // ----- Look for variable options arguments
+    $v_size = func_num_args();
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");
+
+    // ----- Default values for option
+    $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;
+
+    // ----- Look for arguments
+    if ($v_size > 1) {
+      // ----- Get the arguments
+      $v_arg_list = func_get_args();
+
+      // ----- Remove form the options list the first argument
+      array_shift($v_arg_list);
+      $v_size--;
+
+      // ----- Look for first arg
+      if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options");
+
+        // ----- Parse the options
+        $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
+                                            array (PCLZIP_OPT_PATH => 'optional',
+                                                   PCLZIP_OPT_REMOVE_PATH => 'optional',
+                                                   PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
+                                                   PCLZIP_OPT_EXTRACT_AS_STRING => 'optional',
+                                                   PCLZIP_OPT_ADD_PATH => 'optional',
+                                                   PCLZIP_CB_PRE_EXTRACT => 'optional',
+                                                   PCLZIP_CB_POST_EXTRACT => 'optional',
+                                                   PCLZIP_OPT_SET_CHMOD => 'optional',
+                                                   PCLZIP_OPT_REPLACE_NEWER => 'optional'
+                                                   ,PCLZIP_OPT_STOP_ON_ERROR => 'optional'
+                                                   ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional'
+												   ));
+        if ($v_result != 1) {
+          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
+          return 0;
+        }
+
+        // ----- Set the arguments
+        if (isset($v_options[PCLZIP_OPT_PATH])) {
+          $v_path = $v_options[PCLZIP_OPT_PATH];
+        }
+        if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {
+          $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];
+        }
+        if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {
+          $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];
+        }
+        if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {
+          // ----- Check for '/' in last path char
+          if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) {
+            $v_path .= '/';
+          }
+          $v_path .= $v_options[PCLZIP_OPT_ADD_PATH];
+        }
+        if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) {
+          $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Option PCLZIP_OPT_EXTRACT_AS_STRING not set.");
+        }
+        else {
+            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Option PCLZIP_OPT_EXTRACT_AS_STRING set.");
+        }
+      }
+
+      // ----- Look for 2 args
+      // Here we need to support the first historic synopsis of the
+      // method.
+      else {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis");
+
+        // ----- Get the first argument
+        $v_path = $v_arg_list[0];
+
+        // ----- Look for the optional second argument
+        if ($v_size == 2) {
+          $v_remove_path = $v_arg_list[1];
+        }
+        else if ($v_size > 2) {
+          // ----- Error log
+          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");
+
+          // ----- Return
+          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+          return 0;
+        }
+      }
+    }
+
+    // ----- Trace
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "index='$p_index', path='$v_path', remove_path='$v_remove_path', remove_all_path='".($v_remove_path?'true':'false')."'");
+
+    // ----- Trick
+    // Here I want to reuse extractByRule(), so I need to parse the $p_index
+    // with privParseOptions()
+    $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index);
+    $v_options_trick = array();
+    $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick,
+                                        array (PCLZIP_OPT_BY_INDEX => 'optional' ));
+    if ($v_result != 1) {
+        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
+        return 0;
+    }
+    $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX];
+
+    // ----- Call the extracting fct
+    if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) {
+        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());
+        return(0);
+    }
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list);
+    return $p_list;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function :
+  //   delete([$p_option, $p_option_value, ...])
+  // Description :
+  //   This method removes files from the archive.
+  //   If no parameters are given, then all the archive is emptied.
+  // Parameters :
+  //   None or optional arguments.
+  // Options :
+  //   PCLZIP_OPT_BY_INDEX :
+  //   PCLZIP_OPT_BY_NAME :
+  //   PCLZIP_OPT_BY_EREG :
+  //   PCLZIP_OPT_BY_PREG :
+  // Return Values :
+  //   0 on failure,
+  //   The list of the files which are still present in the archive.
+  //   (see PclZip::listContent() for list entry format)
+  // --------------------------------------------------------------------------------
+  function delete()
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::delete", "");
+    $v_result=1;
+
+    // ----- Reset the error handler
+    $this->privErrorReset();
+
+    // ----- Check archive
+    if (!$this->privCheckFormat()) {
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
+      return(0);
+    }
+
+    // ----- Set default values
+    $v_options = array();
+
+    // ----- Look for variable options arguments
+    $v_size = func_num_args();
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method");
+
+    // ----- Look for arguments
+    if ($v_size > 0) {
+      // ----- Get the arguments
+      $v_arg_list = func_get_args();
+
+      // ----- Parse the options
+      $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
+                                        array (PCLZIP_OPT_BY_NAME => 'optional',
+                                               PCLZIP_OPT_BY_EREG => 'optional',
+                                               PCLZIP_OPT_BY_PREG => 'optional',
+                                               PCLZIP_OPT_BY_INDEX => 'optional' ));
+      if ($v_result != 1) {
+          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
+          return 0;
+      }
+    }
+
+    // ----- Magic quotes trick
+    $this->privDisableMagicQuotes();
+
+    // ----- Call the delete fct
+    $v_list = array();
+    if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) {
+      $this->privSwapBackMagicQuotes();
+      unset($v_list);
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo());
+      return(0);
+    }
+
+    // ----- Magic quotes trick
+    $this->privSwapBackMagicQuotes();
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_list);
+    return $v_list;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : deleteByIndex()
+  // Description :
+  //   ***** Deprecated *****
+  //   delete(PCLZIP_OPT_BY_INDEX, $p_index) should be prefered.
+  // --------------------------------------------------------------------------------
+  function deleteByIndex($p_index)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::deleteByIndex", "index='$p_index'");
+
+    $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index);
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list);
+    return $p_list;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : properties()
+  // Description :
+  //   This method gives the properties of the archive.
+  //   The properties are :
+  //     nb : Number of files in the archive
+  //     comment : Comment associated with the archive file
+  //     status : not_exist, ok
+  // Parameters :
+  //   None
+  // Return Values :
+  //   0 on failure,
+  //   An array with the archive properties.
+  // --------------------------------------------------------------------------------
+  function properties()
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::properties", "");
+
+    // ----- Reset the error handler
+    $this->privErrorReset();
+
+    // ----- Magic quotes trick
+    $this->privDisableMagicQuotes();
+
+    // ----- Check archive
+    if (!$this->privCheckFormat()) {
+      $this->privSwapBackMagicQuotes();
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
+      return(0);
+    }
+
+    // ----- Default properties
+    $v_prop = array();
+    $v_prop['comment'] = '';
+    $v_prop['nb'] = 0;
+    $v_prop['status'] = 'not_exist';
+
+    // ----- Look if file exists
+    if (@is_file($this->zipname))
+    {
+      // ----- Open the zip file
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
+      if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0)
+      {
+        $this->privSwapBackMagicQuotes();
+
+        // ----- Error log
+        PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode');
+
+        // ----- Return
+        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), 0);
+        return 0;
+      }
+
+      // ----- Read the central directory informations
+      $v_central_dir = array();
+      if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
+      {
+        $this->privSwapBackMagicQuotes();
+        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
+        return 0;
+      }
+
+      // ----- Close the zip file
+      $this->privCloseFd();
+
+      // ----- Set the user attributes
+      $v_prop['comment'] = $v_central_dir['comment'];
+      $v_prop['nb'] = $v_central_dir['entries'];
+      $v_prop['status'] = 'ok';
+    }
+
+    // ----- Magic quotes trick
+    $this->privSwapBackMagicQuotes();
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_prop);
+    return $v_prop;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : duplicate()
+  // Description :
+  //   This method creates an archive by copying the content of an other one. If
+  //   the archive already exist, it is replaced by the new one without any warning.
+  // Parameters :
+  //   $p_archive : The filename of a valid archive, or
+  //                a valid PclZip object.
+  // Return Values :
+  //   1 on success.
+  //   0 or a negative value on error (error code).
+  // --------------------------------------------------------------------------------
+  function duplicate($p_archive)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::duplicate", "");
+    $v_result = 1;
+
+    // ----- Reset the error handler
+    $this->privErrorReset();
+
+    // ----- Look if the $p_archive is a PclZip object
+    if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip'))
+    {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The parameter is valid PclZip object '".$p_archive->zipname."'");
+
+      // ----- Duplicate the archive
+      $v_result = $this->privDuplicate($p_archive->zipname);
+    }
+
+    // ----- Look if the $p_archive is a string (so a filename)
+    else if (is_string($p_archive))
+    {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The parameter is a filename '$p_archive'");
+
+      // ----- Check that $p_archive is a valid zip file
+      // TBC : Should also check the archive format
+      if (!is_file($p_archive)) {
+        // ----- Error log
+        PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'");
+        $v_result = PCLZIP_ERR_MISSING_FILE;
+      }
+      else {
+        // ----- Duplicate the archive
+        $v_result = $this->privDuplicate($p_archive);
+      }
+    }
+
+    // ----- Invalid variable
+    else
+    {
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add");
+      $v_result = PCLZIP_ERR_INVALID_PARAMETER;
+    }
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : merge()
+  // Description :
+  //   This method merge the $p_archive_to_add archive at the end of the current
+  //   one ($this).
+  //   If the archive ($this) does not exist, the merge becomes a duplicate.
+  //   If the $p_archive_to_add archive does not exist, the merge is a success.
+  // Parameters :
+  //   $p_archive_to_add : It can be directly the filename of a valid zip archive,
+  //                       or a PclZip object archive.
+  // Return Values :
+  //   1 on success,
+  //   0 or negative values on error (see below).
+  // --------------------------------------------------------------------------------
+  function merge($p_archive_to_add)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::merge", "");
+    $v_result = 1;
+
+    // ----- Reset the error handler
+    $this->privErrorReset();
+
+    // ----- Check archive
+    if (!$this->privCheckFormat()) {
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0);
+      return(0);
+    }
+
+    // ----- Look if the $p_archive_to_add is a PclZip object
+    if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip'))
+    {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The parameter is valid PclZip object");
+
+      // ----- Merge the archive
+      $v_result = $this->privMerge($p_archive_to_add);
+    }
+
+    // ----- Look if the $p_archive_to_add is a string (so a filename)
+    else if (is_string($p_archive_to_add))
+    {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The parameter is a filename");
+
+      // ----- Create a temporary archive
+      $v_object_archive = new PclZip($p_archive_to_add);
+
+      // ----- Merge the archive
+      $v_result = $this->privMerge($v_object_archive);
+    }
+
+    // ----- Invalid variable
+    else
+    {
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add");
+      $v_result = PCLZIP_ERR_INVALID_PARAMETER;
+    }
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+
+
+  // --------------------------------------------------------------------------------
+  // Function : errorCode()
+  // Description :
+  // Parameters :
+  // --------------------------------------------------------------------------------
+  function errorCode()
+  {
+    if (PCLZIP_ERROR_EXTERNAL == 1) {
+      return(PclErrorCode());
+    }
+    else {
+      return($this->error_code);
+    }
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : errorName()
+  // Description :
+  // Parameters :
+  // --------------------------------------------------------------------------------
+  function errorName($p_with_code=false)
+  {
+    $v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR',
+                      PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL',
+                      PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL',
+                      PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER',
+                      PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE',
+                      PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG',
+                      PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP',
+                      PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE',
+                      PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL',
+                      PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION',
+                      PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT',
+                      PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL',
+                      PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL',
+                      PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM',
+                      PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP',
+                      PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE',
+                      PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE',
+                      PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION',
+                      PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION'
+                      ,PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE'
+                      ,PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION'
+                    );
+
+    if (isset($v_name[$this->error_code])) {
+      $v_value = $v_name[$this->error_code];
+    }
+    else {
+      $v_value = 'NoName';
+    }
+
+    if ($p_with_code) {
+      return($v_value.' ('.$this->error_code.')');
+    }
+    else {
+      return($v_value);
+    }
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : errorInfo()
+  // Description :
+  // Parameters :
+  // --------------------------------------------------------------------------------
+  function errorInfo($p_full=false)
+  {
+    if (PCLZIP_ERROR_EXTERNAL == 1) {
+      return(PclErrorString());
+    }
+    else {
+      if ($p_full) {
+        return($this->errorName(true)." : ".$this->error_string);
+      }
+      else {
+        return($this->error_string." [code ".$this->error_code."]");
+      }
+    }
+  }
+  // --------------------------------------------------------------------------------
+
+
+// --------------------------------------------------------------------------------
+// ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS *****
+// *****                                                        *****
+// *****       THESES FUNCTIONS MUST NOT BE USED DIRECTLY       *****
+// --------------------------------------------------------------------------------
+
+
+
+  // --------------------------------------------------------------------------------
+  // Function : privCheckFormat()
+  // Description :
+  //   This method check that the archive exists and is a valid zip archive.
+  //   Several level of check exists. (futur)
+  // Parameters :
+  //   $p_level : Level of check. Default 0.
+  //              0 : Check the first bytes (magic codes) (default value))
+  //              1 : 0 + Check the central directory (futur)
+  //              2 : 1 + Check each file header (futur)
+  // Return Values :
+  //   true on success,
+  //   false on error, the error code is set.
+  // --------------------------------------------------------------------------------
+  function privCheckFormat($p_level=0)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCheckFormat", "");
+    $v_result = true;
+
+	// ----- Reset the file system cache
+    clearstatcache();
+
+    // ----- Reset the error handler
+    $this->privErrorReset();
+
+    // ----- Look if the file exits
+    if (!is_file($this->zipname)) {
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'");
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, false, PclZip::errorInfo());
+      return(false);
+    }
+
+    // ----- Check that the file is readeable
+    if (!is_readable($this->zipname)) {
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'");
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, false, PclZip::errorInfo());
+      return(false);
+    }
+
+    // ----- Check the magic code
+    // TBC
+
+    // ----- Check the central header
+    // TBC
+
+    // ----- Check each file header
+    // TBC
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privParseOptions()
+  // Description :
+  //   This internal methods reads the variable list of arguments ($p_options_list,
+  //   $p_size) and generate an array with the options and values ($v_result_list).
+  //   $v_requested_options contains the options that can be present and those that
+  //   must be present.
+  //   $v_requested_options is an array, with the option value as key, and 'optional',
+  //   or 'mandatory' as value.
+  // Parameters :
+  //   See above.
+  // Return Values :
+  //   1 on success.
+  //   0 on failure.
+  // --------------------------------------------------------------------------------
+  function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options=false)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privParseOptions", "");
+    $v_result=1;
+
+    // ----- Read the options
+    $i=0;
+    while ($i<$p_size) {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Looking for table index $i, option = '".PclZipUtilOptionText($p_options_list[$i])."(".$p_options_list[$i].")'");
+
+      // ----- Check if the option is supported
+      if (!isset($v_requested_options[$p_options_list[$i]])) {
+        // ----- Error log
+        PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method");
+
+        // ----- Return
+        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+        return PclZip::errorCode();
+      }
+
+      // ----- Look for next option
+      switch ($p_options_list[$i]) {
+        // ----- Look for options that request a path value
+        case PCLZIP_OPT_PATH :
+        case PCLZIP_OPT_REMOVE_PATH :
+        case PCLZIP_OPT_ADD_PATH :
+          // ----- Check the number of parameters
+          if (($i+1) >= $p_size) {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+
+            // ----- Return
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+            return PclZip::errorCode();
+          }
+
+          // ----- Get the value
+          $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], false);
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
+          $i++;
+        break;
+
+        case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION :
+          // ----- Check the number of parameters
+          if (($i+1) >= $p_size) {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+
+            // ----- Return
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+            return PclZip::errorCode();
+          }
+
+          // ----- Get the value
+          if (   is_string($p_options_list[$i+1])
+              && ($p_options_list[$i+1] != '')) {
+            $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], false);
+            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
+            $i++;
+          }
+          else {
+            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." set with an empty value is ignored.");
+          }
+        break;
+
+        // ----- Look for options that request an array of string for value
+        case PCLZIP_OPT_BY_NAME :
+          // ----- Check the number of parameters
+          if (($i+1) >= $p_size) {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+
+            // ----- Return
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+            return PclZip::errorCode();
+          }
+
+          // ----- Get the value
+          if (is_string($p_options_list[$i+1])) {
+              $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1];
+          }
+          else if (is_array($p_options_list[$i+1])) {
+              $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
+          }
+          else {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+
+            // ----- Return
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+            return PclZip::errorCode();
+          }
+          ////--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
+          $i++;
+        break;
+
+        // ----- Look for options that request an EREG or PREG expression
+        case PCLZIP_OPT_BY_EREG :
+        case PCLZIP_OPT_BY_PREG :
+        //case PCLZIP_OPT_CRYPT :
+          // ----- Check the number of parameters
+          if (($i+1) >= $p_size) {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+
+            // ----- Return
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+            return PclZip::errorCode();
+          }
+
+          // ----- Get the value
+          if (is_string($p_options_list[$i+1])) {
+              $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
+          }
+          else {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+
+            // ----- Return
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+            return PclZip::errorCode();
+          }
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
+          $i++;
+        break;
+
+        // ----- Look for options that takes a string
+        case PCLZIP_OPT_COMMENT :
+        case PCLZIP_OPT_ADD_COMMENT :
+        case PCLZIP_OPT_PREPEND_COMMENT :
+          // ----- Check the number of parameters
+          if (($i+1) >= $p_size) {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE,
+			                     "Missing parameter value for option '"
+								 .PclZipUtilOptionText($p_options_list[$i])
+								 ."'");
+
+            // ----- Return
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+            return PclZip::errorCode();
+          }
+
+          // ----- Get the value
+          if (is_string($p_options_list[$i+1])) {
+              $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
+          }
+          else {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE,
+			                     "Wrong parameter value for option '"
+								 .PclZipUtilOptionText($p_options_list[$i])
+								 ."'");
+
+            // ----- Return
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+            return PclZip::errorCode();
+          }
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
+          $i++;
+        break;
+
+        // ----- Look for options that request an array of index
+        case PCLZIP_OPT_BY_INDEX :
+          // ----- Check the number of parameters
+          if (($i+1) >= $p_size) {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+
+            // ----- Return
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+            return PclZip::errorCode();
+          }
+
+          // ----- Get the value
+          $v_work_list = array();
+          if (is_string($p_options_list[$i+1])) {
+              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is a string '".$p_options_list[$i+1]."'");
+
+              // ----- Remove spaces
+              $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', '');
+
+              // ----- Parse items
+              $v_work_list = explode(",", $p_options_list[$i+1]);
+          }
+          else if (is_integer($p_options_list[$i+1])) {
+              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is an integer '".$p_options_list[$i+1]."'");
+              $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1];
+          }
+          else if (is_array($p_options_list[$i+1])) {
+              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is an array");
+              $v_work_list = $p_options_list[$i+1];
+          }
+          else {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+
+            // ----- Return
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+            return PclZip::errorCode();
+          }
+
+          // ----- Reduce the index list
+          // each index item in the list must be a couple with a start and
+          // an end value : [0,3], [5-5], [8-10], ...
+          // ----- Check the format of each item
+          $v_sort_flag=false;
+          $v_sort_value=0;
+          for ($j=0; $j<sizeof($v_work_list); $j++) {
+              // ----- Explode the item
+              $v_item_list = explode("-", $v_work_list[$j]);
+              $v_size_item_list = sizeof($v_item_list);
+
+              // ----- TBC : Here we might check that each item is a
+              // real integer ...
+
+              // ----- Look for single value
+              if ($v_size_item_list == 1) {
+                  // ----- Set the option value
+                  $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];
+                  $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[0];
+              }
+              elseif ($v_size_item_list == 2) {
+                  // ----- Set the option value
+                  $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];
+                  $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[1];
+              }
+              else {
+                  // ----- Error log
+                  PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Too many values in index range for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+
+                  // ----- Return
+                  //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+                  return PclZip::errorCode();
+              }
+
+              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extracted index item = [".$v_result_list[$p_options_list[$i]][$j]['start'].",".$v_result_list[$p_options_list[$i]][$j]['end']."]");
+
+              // ----- Look for list sort
+              if ($v_result_list[$p_options_list[$i]][$j]['start'] < $v_sort_value) {
+                  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The list should be sorted ...");
+                  $v_sort_flag=true;
+
+                  // ----- TBC : An automatic sort should be writen ...
+                  // ----- Error log
+                  PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Invalid order of index range for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+
+                  // ----- Return
+                  //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+                  return PclZip::errorCode();
+              }
+              $v_sort_value = $v_result_list[$p_options_list[$i]][$j]['start'];
+          }
+
+          // ----- Sort the items
+          if ($v_sort_flag) {
+              // TBC : To Be Completed
+              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "List sorting is not yet write ...");
+          }
+
+          // ----- Next option
+          $i++;
+        break;
+
+        // ----- Look for options that request no value
+        case PCLZIP_OPT_REMOVE_ALL_PATH :
+        case PCLZIP_OPT_EXTRACT_AS_STRING :
+        case PCLZIP_OPT_NO_COMPRESSION :
+        case PCLZIP_OPT_EXTRACT_IN_OUTPUT :
+        case PCLZIP_OPT_REPLACE_NEWER :
+        case PCLZIP_OPT_STOP_ON_ERROR :
+          $v_result_list[$p_options_list[$i]] = true;
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
+        break;
+
+        // ----- Look for options that request an octal value
+        case PCLZIP_OPT_SET_CHMOD :
+          // ----- Check the number of parameters
+          if (($i+1) >= $p_size) {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+
+            // ----- Return
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+            return PclZip::errorCode();
+          }
+
+          // ----- Get the value
+          $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'");
+          $i++;
+        break;
+
+        // ----- Look for options that request a call-back
+        case PCLZIP_CB_PRE_EXTRACT :
+        case PCLZIP_CB_POST_EXTRACT :
+        case PCLZIP_CB_PRE_ADD :
+        case PCLZIP_CB_POST_ADD :
+        /* for futur use
+        case PCLZIP_CB_PRE_DELETE :
+        case PCLZIP_CB_POST_DELETE :
+        case PCLZIP_CB_PRE_LIST :
+        case PCLZIP_CB_POST_LIST :
+        */
+          // ----- Check the number of parameters
+          if (($i+1) >= $p_size) {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+
+            // ----- Return
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+            return PclZip::errorCode();
+          }
+
+          // ----- Get the value
+          $v_function_name = $p_options_list[$i+1];
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "call-back ".PclZipUtilOptionText($p_options_list[$i])." = '".$v_function_name."'");
+
+          // ----- Check that the value is a valid existing function
+          if (!function_exists($v_function_name)) {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+
+            // ----- Return
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+            return PclZip::errorCode();
+          }
+
+          // ----- Set the attribute
+          $v_result_list[$p_options_list[$i]] = $v_function_name;
+          $i++;
+        break;
+
+        default :
+          // ----- Error log
+          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,
+		                       "Unknown parameter '"
+							   .$p_options_list[$i]."'");
+
+          // ----- Return
+          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+          return PclZip::errorCode();
+      }
+
+      // ----- Next options
+      $i++;
+    }
+
+    // ----- Look for mandatory options
+    if ($v_requested_options !== false) {
+      for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) {
+        // ----- Look for mandatory option
+        if ($v_requested_options[$key] == 'mandatory') {
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Detect a mandatory option : ".PclZipUtilOptionText($key)."(".$key.")");
+          // ----- Look if present
+          if (!isset($v_result_list[$key])) {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")");
+
+            // ----- Return
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+            return PclZip::errorCode();
+          }
+        }
+      }
+    }
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privFileDescrParseAtt()
+  // Description :
+  // Parameters :
+  // Return Values :
+  //   1 on success.
+  //   0 on failure.
+  // --------------------------------------------------------------------------------
+  function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options=false)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privFileDescrParseAtt", "");
+    $v_result=1;
+
+    // ----- For each file in the list check the attributes
+    foreach ($p_file_list as $v_key => $v_value) {
+
+      // ----- Check if the option is supported
+      if (!isset($v_requested_options[$v_key])) {
+        // ----- Error log
+        PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '".$v_key."' for this file");
+
+        // ----- Return
+        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+        return PclZip::errorCode();
+      }
+
+      // ----- Look for attribute
+      switch ($v_key) {
+        case PCLZIP_ATT_FILE_NAME :
+          if (!is_string($v_value)) {
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+            return PclZip::errorCode();
+          }
+
+          $p_filedescr['filename'] = PclZipUtilPathReduction($v_value);
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'");
+
+          if ($p_filedescr['filename'] == '') {
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'");
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+            return PclZip::errorCode();
+          }
+
+        break;
+
+        case PCLZIP_ATT_FILE_NEW_SHORT_NAME :
+          if (!is_string($v_value)) {
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+            return PclZip::errorCode();
+          }
+
+          $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value);
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'");
+
+          if ($p_filedescr['new_short_name'] == '') {
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '".PclZipUtilOptionText($v_key)."'");
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+            return PclZip::errorCode();
+          }
+        break;
+
+        case PCLZIP_ATT_FILE_NEW_FULL_NAME :
+          if (!is_string($v_value)) {
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+            return PclZip::errorCode();
+          }
+
+          $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value);
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($v_key)." = '".$v_value."'");
+
+          if ($p_filedescr['new_full_name'] == '') {
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '".PclZipUtilOptionText($v_key)."'");
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+            return PclZip::errorCode();
+          }
+        break;
+
+        default :
+          // ----- Error log
+          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,
+		                           "Unknown parameter '".$v_key."'");
+
+          // ----- Return
+          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+          return PclZip::errorCode();
+      }
+
+      // ----- Look for mandatory options
+      if ($v_requested_options !== false) {
+        for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) {
+          // ----- Look for mandatory option
+          if ($v_requested_options[$key] == 'mandatory') {
+            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Detect a mandatory option : ".PclZipUtilOptionText($key)."(".$key.")");
+            // ----- Look if present
+            if (!isset($p_file_list[$key])) {
+              PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")");
+              //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+              return PclZip::errorCode();
+            }
+          }
+        }
+      }
+
+    // end foreach
+    }
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privFileDescrExpand()
+  // Description :
+  // Parameters :
+  // Return Values :
+  //   1 on success.
+  //   0 on failure.
+  // --------------------------------------------------------------------------------
+  function privFileDescrExpand(&$p_filedescr_list, &$p_options)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privFileDescrExpand", "");
+    $v_result=1;
+
+    // ----- Create a result list
+    $v_result_list = array();
+
+    // ----- Look each entry
+    for ($i=0; $i<sizeof($p_filedescr_list); $i++) {
+      // ----- Get filedescr
+      $v_descr = $p_filedescr_list[$i];
+
+      // ----- Reduce the filename
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filedescr before reduction :'".$v_descr['filename']."'");
+      $v_descr['filename'] = PclZipUtilTranslateWinPath($v_descr['filename']);
+      $v_descr['filename'] = PclZipUtilPathReduction($v_descr['filename']);
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filedescr after reduction :'".$v_descr['filename']."'");
+
+      // ----- Get type of descr
+      if (!file_exists($v_descr['filename'])) {
+        // ----- Error log
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$v_descr['filename']."' does not exists");
+        PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '".$v_descr['filename']."' does not exists");
+
+        // ----- Return
+        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+        return PclZip::errorCode();
+      }
+      if (@is_file($v_descr['filename'])) {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "This is a file");
+        $v_descr['type'] = 'file';
+      }
+      else if (@is_dir($v_descr['filename'])) {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "This is a folder");
+        $v_descr['type'] = 'folder';
+      }
+      else if (@is_link($v_descr['filename'])) {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Unsupported file type : link");
+        // skip
+        continue;
+      }
+      else {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Unsupported file type : unknown type");
+        // skip
+        continue;
+      }
+
+      // ----- Calculate the stored filename
+      $this->privCalculateStoredFilename($v_descr, $p_options);
+
+      // ----- Add the descriptor in result list
+      $v_result_list[sizeof($v_result_list)] = $v_descr;
+
+      // ----- Look for folder
+      if ($v_descr['type'] == 'folder') {
+        // ----- List of items in folder
+        $v_dirlist_descr = array();
+        $v_dirlist_nb = 0;
+        if ($v_folder_handler = @opendir($v_descr['filename'])) {
+          while (($v_item_handler = @readdir($v_folder_handler)) !== false) {
+            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Looking for '".$v_item_handler."' in the directory");
+
+            // ----- Skip '.' and '..'
+            if (($v_item_handler == '.') || ($v_item_handler == '..')) {
+                continue;
+            }
+
+            // ----- Compose the full filename
+            $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler;
+
+            // ----- Look for different stored filename
+            // Because the name of the folder was changed, the name of the
+            // files/sub-folders also change
+            if ($v_descr['stored_filename'] != $v_descr['filename']) {
+              $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler;
+            }
+
+            $v_dirlist_nb++;
+          }
+        }
+        else {
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to open dir '".$v_descr['filename']."' in read mode. Skipped.");
+          // TBC : unable to open folder in read mode
+        }
+
+        // ----- Expand each element of the list
+        if ($v_dirlist_nb != 0) {
+          // ----- Expand
+          if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) {
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+            return $v_result;
+          }
+
+          // ----- Concat the resulting list
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Merging result list (size '".sizeof($v_result_list)."') with dirlist (size '".sizeof($v_dirlist_descr)."')");
+          $v_result_list = array_merge($v_result_list, $v_dirlist_descr);
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "merged result list is size '".sizeof($v_result_list)."'");
+        }
+        else {
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Nothing in this folder to expand.");
+        }
+
+        // ----- Free local array
+        unset($v_dirlist_descr);
+      }
+    }
+
+    // ----- Get the result list
+    $p_filedescr_list = $v_result_list;
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privCreate()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privCreate($p_filedescr_list, &$p_result_list, &$p_options)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCreate", "list");
+    $v_result=1;
+    $v_list_detail = array();
+
+    // ----- Magic quotes trick
+    $this->privDisableMagicQuotes();
+
+    // ----- Open the file in write mode
+    if (($v_result = $this->privOpenFd('wb')) != 1)
+    {
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+    }
+
+    // ----- Add the list of files
+    $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options);
+
+    // ----- Close
+    $this->privCloseFd();
+
+    // ----- Magic quotes trick
+    $this->privSwapBackMagicQuotes();
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privAdd()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privAdd($p_filedescr_list, &$p_result_list, &$p_options)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAdd", "list");
+    $v_result=1;
+    $v_list_detail = array();
+
+    // ----- Look if the archive exists or is empty
+    if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0))
+    {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive does not exist, or is empty, create it.");
+
+      // ----- Do a create
+      $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options);
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+    }
+    // ----- Magic quotes trick
+    $this->privDisableMagicQuotes();
+
+    // ----- Open the zip file
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
+    if (($v_result=$this->privOpenFd('rb')) != 1)
+    {
+      // ----- Magic quotes trick
+      $this->privSwapBackMagicQuotes();
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+    }
+
+    // ----- Read the central directory informations
+    $v_central_dir = array();
+    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
+    {
+      $this->privCloseFd();
+      $this->privSwapBackMagicQuotes();
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+    }
+
+    // ----- Go to beginning of File
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'");
+    @rewind($this->zip_fd);
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'");
+
+    // ----- Creates a temporay file
+    $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';
+
+    // ----- Open the temporary file in write mode
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
+    if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0)
+    {
+      $this->privCloseFd();
+      $this->privSwapBackMagicQuotes();
+
+      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode');
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+      return PclZip::errorCode();
+    }
+
+    // ----- Copy the files from the archive to the temporary file
+    // TBC : Here I should better append the file and go back to erase the central dir
+    $v_size = $v_central_dir['offset'];
+    while ($v_size != 0)
+    {
+      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
+      $v_buffer = fread($this->zip_fd, $v_read_size);
+      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
+      $v_size -= $v_read_size;
+    }
+
+    // ----- Swap the file descriptor
+    // Here is a trick : I swap the temporary fd with the zip fd, in order to use
+    // the following methods on the temporary fil and not the real archive
+    $v_swap = $this->zip_fd;
+    $this->zip_fd = $v_zip_temp_fd;
+    $v_zip_temp_fd = $v_swap;
+
+    // ----- Add the files
+    $v_header_list = array();
+    if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1)
+    {
+      fclose($v_zip_temp_fd);
+      $this->privCloseFd();
+      @unlink($v_zip_temp_name);
+      $this->privSwapBackMagicQuotes();
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+    }
+
+    // ----- Store the offset of the central dir
+    $v_offset = @ftell($this->zip_fd);
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "New offset of central dir : $v_offset");
+
+    // ----- Copy the block of file headers from the old archive
+    $v_size = $v_central_dir['size'];
+    while ($v_size != 0)
+    {
+      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
+      $v_buffer = @fread($v_zip_temp_fd, $v_read_size);
+      @fwrite($this->zip_fd, $v_buffer, $v_read_size);
+      $v_size -= $v_read_size;
+    }
+
+    // ----- Create the Central Dir files header
+    for ($i=0, $v_count=0; $i<sizeof($v_header_list); $i++)
+    {
+      // ----- Create the file header
+      if ($v_header_list[$i]['status'] == 'ok') {
+        if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
+          fclose($v_zip_temp_fd);
+          $this->privCloseFd();
+          @unlink($v_zip_temp_name);
+          $this->privSwapBackMagicQuotes();
+
+          // ----- Return
+          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+          return $v_result;
+        }
+        $v_count++;
+      }
+
+      // ----- Transform the header to a 'usable' info
+      $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
+    }
+
+    // ----- Zip file comment
+    $v_comment = $v_central_dir['comment'];
+    if (isset($p_options[PCLZIP_OPT_COMMENT])) {
+      $v_comment = $p_options[PCLZIP_OPT_COMMENT];
+    }
+    if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) {
+      $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT];
+    }
+    if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) {
+      $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment;
+    }
+
+    // ----- Calculate the size of the central header
+    $v_size = @ftell($this->zip_fd)-$v_offset;
+
+    // ----- Create the central dir footer
+    if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1)
+    {
+      // ----- Reset the file list
+      unset($v_header_list);
+      $this->privSwapBackMagicQuotes();
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+    }
+
+    // ----- Swap back the file descriptor
+    $v_swap = $this->zip_fd;
+    $this->zip_fd = $v_zip_temp_fd;
+    $v_zip_temp_fd = $v_swap;
+
+    // ----- Close
+    $this->privCloseFd();
+
+    // ----- Close the temporary file
+    @fclose($v_zip_temp_fd);
+
+    // ----- Magic quotes trick
+    $this->privSwapBackMagicQuotes();
+
+    // ----- Delete the zip file
+    // TBC : I should test the result ...
+    @unlink($this->zipname);
+
+    // ----- Rename the temporary file
+    // TBC : I should test the result ...
+    //@rename($v_zip_temp_name, $this->zipname);
+    PclZipUtilRename($v_zip_temp_name, $this->zipname);
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privOpenFd()
+  // Description :
+  // Parameters :
+  // --------------------------------------------------------------------------------
+  function privOpenFd($p_mode)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privOpenFd", 'mode='.$p_mode);
+    $v_result=1;
+
+    // ----- Look if already open
+    if ($this->zip_fd != 0)
+    {
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \''.$this->zipname.'\' already open');
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+      return PclZip::errorCode();
+    }
+
+    // ----- Open the zip file
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Open file in '.$p_mode.' mode');
+    if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0)
+    {
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in '.$p_mode.' mode');
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+      return PclZip::errorCode();
+    }
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privCloseFd()
+  // Description :
+  // Parameters :
+  // --------------------------------------------------------------------------------
+  function privCloseFd()
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCloseFd", "");
+    $v_result=1;
+
+    if ($this->zip_fd != 0)
+      @fclose($this->zip_fd);
+    $this->zip_fd = 0;
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privAddList()
+  // Description :
+  //   $p_add_dir and $p_remove_dir will give the ability to memorize a path which is
+  //   different from the real path of the file. This is usefull if you want to have PclTar
+  //   running in any directory, and memorize relative path from an other directory.
+  // Parameters :
+  //   $p_list : An array containing the file or directory names to add in the tar
+  //   $p_result_list : list of added files with their properties (specially the status field)
+  //   $p_add_dir : Path to add in the filename path archived
+  //   $p_remove_dir : Path to remove in the filename path archived
+  // Return Values :
+  // --------------------------------------------------------------------------------
+//  function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options)
+  function privAddList($p_filedescr_list, &$p_result_list, &$p_options)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAddList", "list");
+    $v_result=1;
+
+    // ----- Add the files
+    $v_header_list = array();
+    if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1)
+    {
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+    }
+
+    // ----- Store the offset of the central dir
+    $v_offset = @ftell($this->zip_fd);
+
+    // ----- Create the Central Dir files header
+    for ($i=0,$v_count=0; $i<sizeof($v_header_list); $i++)
+    {
+      // ----- Create the file header
+      if ($v_header_list[$i]['status'] == 'ok') {
+        if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
+          // ----- Return
+          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+          return $v_result;
+        }
+        $v_count++;
+      }
+
+      // ----- Transform the header to a 'usable' info
+      $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
+    }
+
+    // ----- Zip file comment
+    $v_comment = '';
+    if (isset($p_options[PCLZIP_OPT_COMMENT])) {
+      $v_comment = $p_options[PCLZIP_OPT_COMMENT];
+    }
+
+    // ----- Calculate the size of the central header
+    $v_size = @ftell($this->zip_fd)-$v_offset;
+
+    // ----- Create the central dir footer
+    if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1)
+    {
+      // ----- Reset the file list
+      unset($v_header_list);
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+    }
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privAddFileList()
+  // Description :
+  // Parameters :
+  //   $p_filedescr_list : An array containing the file description
+  //                      or directory names to add in the zip
+  //   $p_result_list : list of added files with their properties (specially the status field)
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAddFileList", "filedescr_list");
+    $v_result=1;
+    $v_header = array();
+
+    // ----- Recuperate the current number of elt in list
+    $v_nb = sizeof($p_result_list);
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Before add, list have ".$v_nb." elements");
+
+    // ----- Loop on the files
+    for ($j=0; ($j<sizeof($p_filedescr_list)) && ($v_result==1); $j++) {
+      // ----- Format the filename
+      $p_filedescr_list[$j]['filename']
+      = PclZipUtilTranslateWinPath($p_filedescr_list[$j]['filename'], false);
+
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Looking for file '".$p_filedescr_list[$j]['filename']."'");
+
+      // ----- Skip empty file names
+      // TBC : Can this be possible ? not checked in DescrParseAtt ?
+      if ($p_filedescr_list[$j]['filename'] == "") {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Skip empty filename");
+        continue;
+      }
+
+      // ----- Check the filename
+      if (!file_exists($p_filedescr_list[$j]['filename'])) {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$p_filedescr_list[$j]['filename']."' does not exists");
+        PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '".$p_filedescr_list[$j]['filename']."' does not exists");
+        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+        return PclZip::errorCode();
+      }
+
+      // ----- Look if it is a file or a dir with no all path remove option
+      if (   (is_file($p_filedescr_list[$j]['filename']))
+          || (   is_dir($p_filedescr_list[$j]['filename'])
+              && (   !isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])
+                  || !$p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) {
+
+        // ----- Add the file
+        $v_result = $this->privAddFile($p_filedescr_list[$j], $v_header,
+                                       $p_options);
+        if ($v_result != 1) {
+          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+          return $v_result;
+        }
+
+        // ----- Store the file infos
+        $p_result_list[$v_nb++] = $v_header;
+      }
+    }
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "After add, list have ".$v_nb." elements");
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privAddFile()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privAddFile($p_filedescr, &$p_header, &$p_options)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAddFile", "filename='".$p_filedescr['filename']."'");
+    $v_result=1;
+
+    // ----- Working variable
+    $p_filename = $p_filedescr['filename'];
+
+    // TBC : Already done in the fileAtt check ... ?
+    if ($p_filename == "") {
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)");
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+      return PclZip::errorCode();
+    }
+
+    // ----- Look for a stored different filename
+    if (isset($p_filedescr['stored_filename'])) {
+      $v_stored_filename = $p_filedescr['stored_filename'];
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, 'Stored filename is NOT the same "'.$v_stored_filename.'"');
+    }
+    else {
+      $v_stored_filename = $p_filedescr['stored_filename'];
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, 'Stored filename is the same');
+    }
+
+    // ----- Set the file properties
+    clearstatcache();
+    $p_header['version'] = 20;
+    $p_header['version_extracted'] = 10;
+    $p_header['flag'] = 0;
+    $p_header['compression'] = 0;
+    $p_header['mtime'] = filemtime($p_filename);
+    $p_header['crc'] = 0;
+    $p_header['compressed_size'] = 0;
+    $p_header['size'] = filesize($p_filename);
+    $p_header['filename_len'] = strlen($p_filename);
+    $p_header['extra_len'] = 0;
+    $p_header['comment_len'] = 0;
+    $p_header['disk'] = 0;
+    $p_header['internal'] = 0;
+//    $p_header['external'] = (is_file($p_filename)?0xFE49FFE0:0x41FF0010);
+    $p_header['external'] = (is_file($p_filename)?0x00000000:0x00000010);
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Header external extension '".sprintf("0x%X",$p_header['external'])."'");
+    $p_header['offset'] = 0;
+    $p_header['filename'] = $p_filename;
+    $p_header['stored_filename'] = $v_stored_filename;
+    $p_header['extra'] = '';
+    $p_header['comment'] = '';
+    $p_header['status'] = 'ok';
+    $p_header['index'] = -1;
+
+    // ----- Look for pre-add callback
+    if (isset($p_options[PCLZIP_CB_PRE_ADD])) {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A pre-callback '".$p_options[PCLZIP_CB_PRE_ADD]."()') is defined for the extraction");
+
+      // ----- Generate a local information
+      $v_local_header = array();
+      $this->privConvertHeader2FileInfo($p_header, $v_local_header);
+
+      // ----- Call the callback
+      // Here I do not use call_user_func() because I need to send a reference to the
+      // header.
+      eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);');
+      if ($v_result == 0) {
+        // ----- Change the file status
+        $p_header['status'] = "skipped";
+        $v_result = 1;
+      }
+
+      // ----- Update the informations
+      // Only some fields can be modified
+      if ($p_header['stored_filename'] != $v_local_header['stored_filename']) {
+        $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']);
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "New stored filename is '".$p_header['stored_filename']."'");
+      }
+    }
+
+    // ----- Look for empty stored filename
+    if ($p_header['stored_filename'] == "") {
+      $p_header['status'] = "filtered";
+    }
+
+    // ----- Check the path length
+    if (strlen($p_header['stored_filename']) > 0xFF) {
+      $p_header['status'] = 'filename_too_long';
+    }
+
+    // ----- Look if no error, or file not skipped
+    if ($p_header['status'] == 'ok') {
+
+      // ----- Look for a file
+      if (is_file($p_filename))
+      {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "'".$p_filename."' is a file");
+        // ----- Open the source file
+        if (($v_file = @fopen($p_filename, "rb")) == 0) {
+          PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode");
+          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+          return PclZip::errorCode();
+        }
+
+        if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) {
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File will not be compressed");
+          // ----- Read the file content
+          $v_content_compressed = @fread($v_file, $p_header['size']);
+
+          // ----- Calculate the CRC
+          $p_header['crc'] = @crc32($v_content_compressed);
+
+          // ----- Set header parameters
+          $p_header['compressed_size'] = $p_header['size'];
+          $p_header['compression'] = 0;
+        }
+        else {
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File will be compressed");
+          // ----- Read the file content
+          $v_content = @fread($v_file, $p_header['size']);
+
+          // ----- Calculate the CRC
+          $p_header['crc'] = @crc32($v_content);
+
+          // ----- Compress the file
+          $v_content_compressed = @gzdeflate($v_content);
+
+          // ----- Set header parameters
+          $p_header['compressed_size'] = strlen($v_content_compressed);
+          $p_header['compression'] = 8;
+        }
+
+        // ----- Look for encryption
+        /*
+        if ((isset($p_options[PCLZIP_OPT_CRYPT]))
+		    && ($p_options[PCLZIP_OPT_CRYPT] != "")) {
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File need to be crypted ....");
+
+          // Should be a random header
+          $v_header = 'xxxxxxxxxxxx';
+	      $v_content_compressed = PclZipUtilZipEncrypt($v_content_compressed,
+		                                           $p_header['compressed_size'],
+	                                               $v_header,
+												   $p_header['crc'],
+												   "test");
+
+          $p_header['compressed_size'] += 12;
+          $p_header['flag'] = 1;
+
+          // ----- Add the header to the data
+          $v_content_compressed = $v_header.$v_content_compressed;
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Size after header : ".strlen($v_content_compressed)."");
+        }
+        */
+
+        // ----- Call the header generation
+        if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {
+          @fclose($v_file);
+          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+          return $v_result;
+        }
+
+        // ----- Write the compressed (or not) content
+        @fwrite($this->zip_fd,
+		            $v_content_compressed, $p_header['compressed_size']);
+
+        // ----- Close the file
+        @fclose($v_file);
+      }
+
+      // ----- Look for a directory
+      else {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "'".$p_filename."' is a folder");
+        // ----- Look for directory last '/'
+        if (@substr($p_header['stored_filename'], -1) != '/') {
+          $p_header['stored_filename'] .= '/';
+        }
+
+        // ----- Set the file properties
+        $p_header['size'] = 0;
+        //$p_header['external'] = 0x41FF0010;   // Value for a folder : to be checked
+        $p_header['external'] = 0x00000010;   // Value for a folder : to be checked
+
+        // ----- Call the header generation
+        if (($v_result = $this->privWriteFileHeader($p_header)) != 1)
+        {
+          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+          return $v_result;
+        }
+      }
+    }
+
+    // ----- Look for post-add callback
+    if (isset($p_options[PCLZIP_CB_POST_ADD])) {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A post-callback '".$p_options[PCLZIP_CB_POST_ADD]."()') is defined for the extraction");
+
+      // ----- Generate a local information
+      $v_local_header = array();
+      $this->privConvertHeader2FileInfo($p_header, $v_local_header);
+
+      // ----- Call the callback
+      // Here I do not use call_user_func() because I need to send a reference to the
+      // header.
+      eval('$v_result = '.$p_options[PCLZIP_CB_POST_ADD].'(PCLZIP_CB_POST_ADD, $v_local_header);');
+      if ($v_result == 0) {
+        // ----- Ignored
+        $v_result = 1;
+      }
+
+      // ----- Update the informations
+      // Nothing can be modified
+    }
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privCalculateStoredFilename()
+  // Description :
+  //   Based on file descriptor properties and global options, this method
+  //   calculate the filename that will be stored in the archive.
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privCalculateStoredFilename(&$p_filedescr, &$p_options)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCalculateStoredFilename", "filename='".$p_filedescr['filename']."'");
+    $v_result=1;
+
+    // ----- Working variables
+    $p_filename = $p_filedescr['filename'];
+    if (isset($p_options[PCLZIP_OPT_ADD_PATH])) {
+      $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH];
+    }
+    else {
+      $p_add_dir = '';
+    }
+    if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) {
+      $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH];
+    }
+    else {
+      $p_remove_dir = '';
+    }
+    if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {
+      $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH];
+    }
+    else {
+      $p_remove_all_dir = 0;
+    }
+
+    // ----- Look for full name change
+    if (isset($p_filedescr['new_full_name'])) {
+      $v_stored_filename = $p_filedescr['new_full_name'];
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Changing full name of '".$p_filename."' for '".$v_stored_filename."'");
+    }
+
+    // ----- Look for path and/or short name change
+    else {
+
+      // ----- Look for short name change
+      if (isset($p_filedescr['new_short_name'])) {
+        $v_path_info = pathinfo($p_filename);
+        $v_dir = '';
+        if ($v_path_info['dirname'] != '') {
+          $v_dir = $v_path_info['dirname'].'/';
+        }
+        $v_stored_filename = $v_dir.$p_filedescr['new_short_name'];
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Changing short name of '".$p_filename."' for '".$v_stored_filename."'");
+      }
+      else {
+        // ----- Calculate the stored filename
+        $v_stored_filename = $p_filename;
+      }
+
+      // ----- Look for all path to remove
+      if ($p_remove_all_dir) {
+        $v_stored_filename = basename($p_filename);
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Remove all path selected change '".$p_filename."' for '".$v_stored_filename."'");
+      }
+      // ----- Look for partial path remove
+      else if ($p_remove_dir != "") {
+        if (substr($p_remove_dir, -1) != '/')
+          $p_remove_dir .= "/";
+
+        if (   (substr($p_filename, 0, 2) == "./")
+            || (substr($p_remove_dir, 0, 2) == "./")) {
+
+          if (   (substr($p_filename, 0, 2) == "./")
+              && (substr($p_remove_dir, 0, 2) != "./")) {
+            $p_remove_dir = "./".$p_remove_dir;
+          }
+          if (   (substr($p_filename, 0, 2) != "./")
+              && (substr($p_remove_dir, 0, 2) == "./")) {
+            $p_remove_dir = substr($p_remove_dir, 2);
+          }
+        }
+
+        $v_compare = PclZipUtilPathInclusion($p_remove_dir,
+                                             $v_stored_filename);
+        if ($v_compare > 0) {
+          if ($v_compare == 2) {
+            $v_stored_filename = "";
+            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Path to remove is the current folder");
+          }
+          else {
+            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Remove path '$p_remove_dir' in file '$v_stored_filename'");
+            $v_stored_filename = substr($v_stored_filename,
+                                        strlen($p_remove_dir));
+            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Result is '$v_stored_filename'");
+          }
+        }
+      }
+      // ----- Look for path to add
+      if ($p_add_dir != "") {
+        if (substr($p_add_dir, -1) == "/")
+          $v_stored_filename = $p_add_dir.$v_stored_filename;
+        else
+          $v_stored_filename = $p_add_dir."/".$v_stored_filename;
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Add path '$p_add_dir' in file '$p_filename' = '$v_stored_filename'");
+      }
+    }
+
+    // ----- Filename (reduce the path of stored name)
+    $v_stored_filename = PclZipUtilPathReduction($v_stored_filename);
+    $p_filedescr['stored_filename'] = $v_stored_filename;
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Stored filename will be '".$p_filedescr['stored_filename']."', strlen ".strlen($p_filedescr['stored_filename']));
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privWriteFileHeader()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privWriteFileHeader(&$p_header)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privWriteFileHeader", 'file="'.$p_header['filename'].'", stored as "'.$p_header['stored_filename'].'"');
+    $v_result=1;
+
+    // ----- Store the offset position of the file
+    $p_header['offset'] = ftell($this->zip_fd);
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, 'File offset of the header :'.$p_header['offset']);
+
+    // ----- Transform UNIX mtime to DOS format mdate/mtime
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');
+    $v_date = getdate($p_header['mtime']);
+    $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2;
+    $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday'];
+
+    // ----- Packed data
+    $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50,
+	                      $p_header['version_extracted'], $p_header['flag'],
+                          $p_header['compression'], $v_mtime, $v_mdate,
+                          $p_header['crc'], $p_header['compressed_size'],
+						  $p_header['size'],
+                          strlen($p_header['stored_filename']),
+						  $p_header['extra_len']);
+
+    // ----- Write the first 148 bytes of the header in the archive
+    fputs($this->zip_fd, $v_binary_data, 30);
+
+    // ----- Write the variable fields
+    if (strlen($p_header['stored_filename']) != 0)
+    {
+      fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename']));
+    }
+    if ($p_header['extra_len'] != 0)
+    {
+      fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']);
+    }
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privWriteCentralFileHeader()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privWriteCentralFileHeader(&$p_header)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privWriteCentralFileHeader", 'file="'.$p_header['filename'].'", stored as "'.$p_header['stored_filename'].'"');
+    $v_result=1;
+
+    // TBC
+    //for(reset($p_header); $key = key($p_header); next($p_header)) {
+    //  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "header[$key] = ".$p_header[$key]);
+    //}
+
+    // ----- Transform UNIX mtime to DOS format mdate/mtime
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');
+    $v_date = getdate($p_header['mtime']);
+    $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2;
+    $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday'];
+
+    // ----- Packed data
+    $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50,
+	                      $p_header['version'], $p_header['version_extracted'],
+                          $p_header['flag'], $p_header['compression'],
+						  $v_mtime, $v_mdate, $p_header['crc'],
+                          $p_header['compressed_size'], $p_header['size'],
+                          strlen($p_header['stored_filename']),
+						  $p_header['extra_len'], $p_header['comment_len'],
+                          $p_header['disk'], $p_header['internal'],
+						  $p_header['external'], $p_header['offset']);
+
+    // ----- Write the 42 bytes of the header in the zip file
+    fputs($this->zip_fd, $v_binary_data, 46);
+
+    // ----- Write the variable fields
+    if (strlen($p_header['stored_filename']) != 0)
+    {
+      fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename']));
+    }
+    if ($p_header['extra_len'] != 0)
+    {
+      fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']);
+    }
+    if ($p_header['comment_len'] != 0)
+    {
+      fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']);
+    }
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privWriteCentralHeader()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privWriteCentralHeader", 'nb_entries='.$p_nb_entries.', size='.$p_size.', offset='.$p_offset.', comment="'.$p_comment.'"');
+    $v_result=1;
+
+    // ----- Packed data
+    $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries,
+	                      $p_nb_entries, $p_size,
+						  $p_offset, strlen($p_comment));
+
+    // ----- Write the 22 bytes of the header in the zip file
+    fputs($this->zip_fd, $v_binary_data, 22);
+
+    // ----- Write the variable fields
+    if (strlen($p_comment) != 0)
+    {
+      fputs($this->zip_fd, $p_comment, strlen($p_comment));
+    }
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privList()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privList(&$p_list)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privList", "list");
+    $v_result=1;
+
+    // ----- Magic quotes trick
+    $this->privDisableMagicQuotes();
+
+    // ----- Open the zip file
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
+    if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0)
+    {
+      // ----- Magic quotes trick
+      $this->privSwapBackMagicQuotes();
+
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode');
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+      return PclZip::errorCode();
+    }
+
+    // ----- Read the central directory informations
+    $v_central_dir = array();
+    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
+    {
+      $this->privSwapBackMagicQuotes();
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+    }
+
+    // ----- Go to beginning of Central Dir
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Offset : ".$v_central_dir['offset']."'");
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Position in file : ".ftell($this->zip_fd)."'");
+    @rewind($this->zip_fd);
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Position in file : ".ftell($this->zip_fd)."'");
+    if (@fseek($this->zip_fd, $v_central_dir['offset']))
+    {
+      $this->privSwapBackMagicQuotes();
+
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+      return PclZip::errorCode();
+    }
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Position in file : ".ftell($this->zip_fd)."'");
+
+    // ----- Read each entry
+    for ($i=0; $i<$v_central_dir['entries']; $i++)
+    {
+      // ----- Read the file header
+      if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1)
+      {
+        $this->privSwapBackMagicQuotes();
+        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+        return $v_result;
+      }
+      $v_header['index'] = $i;
+
+      // ----- Get the only interesting attributes
+      $this->privConvertHeader2FileInfo($v_header, $p_list[$i]);
+      unset($v_header);
+    }
+
+    // ----- Close the zip file
+    $this->privCloseFd();
+
+    // ----- Magic quotes trick
+    $this->privSwapBackMagicQuotes();
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privConvertHeader2FileInfo()
+  // Description :
+  //   This function takes the file informations from the central directory
+  //   entries and extract the interesting parameters that will be given back.
+  //   The resulting file infos are set in the array $p_info
+  //     $p_info['filename'] : Filename with full path. Given by user (add),
+  //                           extracted in the filesystem (extract).
+  //     $p_info['stored_filename'] : Stored filename in the archive.
+  //     $p_info['size'] = Size of the file.
+  //     $p_info['compressed_size'] = Compressed size of the file.
+  //     $p_info['mtime'] = Last modification date of the file.
+  //     $p_info['comment'] = Comment associated with the file.
+  //     $p_info['folder'] = true/false : indicates if the entry is a folder or not.
+  //     $p_info['status'] = status of the action on the file.
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privConvertHeader2FileInfo($p_header, &$p_info)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privConvertHeader2FileInfo", "Filename='".$p_header['filename']."'");
+    $v_result=1;
+
+    // ----- Get the interesting attributes
+    $p_info['filename'] = $p_header['filename'];
+    $p_info['stored_filename'] = $p_header['stored_filename'];
+    $p_info['size'] = $p_header['size'];
+    $p_info['compressed_size'] = $p_header['compressed_size'];
+    $p_info['mtime'] = $p_header['mtime'];
+    $p_info['comment'] = $p_header['comment'];
+    $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010);
+    $p_info['index'] = $p_header['index'];
+    $p_info['status'] = $p_header['status'];
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privExtractByRule()
+  // Description :
+  //   Extract a file or directory depending of rules (by index, by name, ...)
+  // Parameters :
+  //   $p_file_list : An array where will be placed the properties of each
+  //                  extracted file
+  //   $p_path : Path to add while writing the extracted files
+  //   $p_remove_path : Path to remove (from the file memorized path) while writing the
+  //                    extracted files. If the path does not match the file path,
+  //                    the file is extracted with its memorized path.
+  //                    $p_remove_path does not apply to 'list' mode.
+  //                    $p_path and $p_remove_path are commulative.
+  // Return Values :
+  //   1 on success,0 or less on error (see error code list)
+  // --------------------------------------------------------------------------------
+  function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privExtractByRule", "path='$p_path', remove_path='$p_remove_path', remove_all_path='".($p_remove_all_path?'true':'false')."'");
+    $v_result=1;
+
+    // ----- Magic quotes trick
+    $this->privDisableMagicQuotes();
+
+    // ----- Check the path
+    if (   ($p_path == "")
+	    || (   (substr($p_path, 0, 1) != "/")
+		    && (substr($p_path, 0, 3) != "../")
+			&& (substr($p_path,1,2)!=":/")))
+      $p_path = "./".$p_path;
+
+    // ----- Reduce the path last (and duplicated) '/'
+    if (($p_path != "./") && ($p_path != "/"))
+    {
+      // ----- Look for the path end '/'
+      while (substr($p_path, -1) == "/")
+      {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Destination path [$p_path] ends by '/'");
+        $p_path = substr($p_path, 0, strlen($p_path)-1);
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Modified to [$p_path]");
+      }
+    }
+
+    // ----- Look for path to remove format (should end by /)
+    if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/'))
+    {
+      $p_remove_path .= '/';
+    }
+    $p_remove_path_size = strlen($p_remove_path);
+
+    // ----- Open the zip file
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
+    if (($v_result = $this->privOpenFd('rb')) != 1)
+    {
+      $this->privSwapBackMagicQuotes();
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+    }
+
+    // ----- Read the central directory informations
+    $v_central_dir = array();
+    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
+    {
+      // ----- Close the zip file
+      $this->privCloseFd();
+      $this->privSwapBackMagicQuotes();
+
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+    }
+
+    // ----- Start at beginning of Central Dir
+    $v_pos_entry = $v_central_dir['offset'];
+
+    // ----- Read each entry
+    $j_start = 0;
+    for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++)
+    {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Read next file header entry : '$i'");
+
+      // ----- Read next Central dir entry
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Position before rewind : ".ftell($this->zip_fd)."'");
+      @rewind($this->zip_fd);
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Position after rewind : ".ftell($this->zip_fd)."'");
+      if (@fseek($this->zip_fd, $v_pos_entry))
+      {
+        // ----- Close the zip file
+        $this->privCloseFd();
+        $this->privSwapBackMagicQuotes();
+
+        // ----- Error log
+        PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
+
+        // ----- Return
+        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+        return PclZip::errorCode();
+      }
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Position after fseek : ".ftell($this->zip_fd)."'");
+
+      // ----- Read the file header
+      $v_header = array();
+      if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1)
+      {
+        // ----- Close the zip file
+        $this->privCloseFd();
+        $this->privSwapBackMagicQuotes();
+
+        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+        return $v_result;
+      }
+
+      // ----- Store the index
+      $v_header['index'] = $i;
+
+      // ----- Store the file position
+      $v_pos_entry = ftell($this->zip_fd);
+
+      // ----- Look for the specific extract rules
+      $v_extract = false;
+
+      // ----- Look for extract by name rule
+      if (   (isset($p_options[PCLZIP_OPT_BY_NAME]))
+          && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByName'");
+
+          // ----- Look if the filename is in the list
+          for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_extract); $j++) {
+              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Compare with file '".$p_options[PCLZIP_OPT_BY_NAME][$j]."'");
+
+              // ----- Look for a directory
+              if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") {
+                  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The searched item is a directory");
+
+                  // ----- Look if the directory is in the filename path
+                  if (   (strlen($v_header['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j]))
+                      && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) {
+                      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The directory is in the file path");
+                      $v_extract = true;
+                  }
+              }
+              // ----- Look for a filename
+              elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {
+                  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The file is the right one.");
+                  $v_extract = true;
+              }
+          }
+      }
+
+      // ----- Look for extract by ereg rule
+      else if (   (isset($p_options[PCLZIP_OPT_BY_EREG]))
+               && ($p_options[PCLZIP_OPT_BY_EREG] != "")) {
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract by ereg '".$p_options[PCLZIP_OPT_BY_EREG]."'");
+
+          if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header['stored_filename'])) {
+              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename match the regular expression");
+              $v_extract = true;
+          }
+      }
+
+      // ----- Look for extract by preg rule
+      else if (   (isset($p_options[PCLZIP_OPT_BY_PREG]))
+               && ($p_options[PCLZIP_OPT_BY_PREG] != "")) {
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByEreg'");
+
+          if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) {
+              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename match the regular expression");
+              $v_extract = true;
+          }
+      }
+
+      // ----- Look for extract by index rule
+      else if (   (isset($p_options[PCLZIP_OPT_BY_INDEX]))
+               && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByIndex'");
+
+          // ----- Look if the index is in the list
+          for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_extract); $j++) {
+              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Look if index '$i' is in [".$p_options[PCLZIP_OPT_BY_INDEX][$j]['start'].",".$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']."]");
+
+              if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {
+                  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Found as part of an index range");
+                  $v_extract = true;
+              }
+              if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {
+                  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Do not look this index range for next loop");
+                  $j_start = $j+1;
+              }
+
+              if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) {
+                  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Index range is greater than index, stop loop");
+                  break;
+              }
+          }
+      }
+
+      // ----- Look for no rule, which means extract all the archive
+      else {
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with no rule (extract all)");
+          $v_extract = true;
+      }
+
+	  // ----- Check compression method
+	  if (   ($v_extract)
+	      && (   ($v_header['compression'] != 8)
+		      && ($v_header['compression'] != 0))) {
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unsupported compression method (".$v_header['compression'].")");
+          $v_header['status'] = 'unsupported_compression';
+
+          // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
+          if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
+		      && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
+              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped");
+
+              $this->privSwapBackMagicQuotes();
+
+              PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION,
+			                       "Filename '".$v_header['stored_filename']."' is "
+				  	    	  	   ."compressed by an unsupported compression "
+				  	    	  	   ."method (".$v_header['compression'].") ");
+
+              //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+              return PclZip::errorCode();
+		  }
+	  }
+
+	  // ----- Check encrypted files
+	  if (($v_extract) && (($v_header['flag'] & 1) == 1)) {
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unsupported file encryption");
+          $v_header['status'] = 'unsupported_encryption';
+
+          // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
+          if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
+		      && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
+              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped");
+
+              $this->privSwapBackMagicQuotes();
+
+              PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION,
+			                       "Unsupported encryption for "
+				  	    	  	   ." filename '".$v_header['stored_filename']
+								   ."'");
+
+              //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+              return PclZip::errorCode();
+		  }
+    }
+
+      // ----- Look for real extraction
+      if (($v_extract) && ($v_header['status'] != 'ok')) {
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "No need for extract");
+          $v_result = $this->privConvertHeader2FileInfo($v_header,
+		                                        $p_file_list[$v_nb_extracted++]);
+          if ($v_result != 1) {
+              $this->privCloseFd();
+              $this->privSwapBackMagicQuotes();
+              //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+              return $v_result;
+          }
+
+          $v_extract = false;
+      }
+
+      // ----- Look for real extraction
+      if ($v_extract)
+      {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file '".$v_header['filename']."', index '$i'");
+
+        // ----- Go to the file position
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position before rewind : ".ftell($this->zip_fd)."'");
+        @rewind($this->zip_fd);
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after rewind : ".ftell($this->zip_fd)."'");
+        if (@fseek($this->zip_fd, $v_header['offset']))
+        {
+          // ----- Close the zip file
+          $this->privCloseFd();
+
+          $this->privSwapBackMagicQuotes();
+
+          // ----- Error log
+          PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
+
+          // ----- Return
+          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+          return PclZip::errorCode();
+        }
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after fseek : ".ftell($this->zip_fd)."'");
+
+        // ----- Look for extraction as string
+        if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) {
+
+          // ----- Extracting the file
+          $v_result1 = $this->privExtractFileAsString($v_header, $v_string);
+          if ($v_result1 < 1) {
+            $this->privCloseFd();
+            $this->privSwapBackMagicQuotes();
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result1);
+            return $v_result1;
+          }
+
+          // ----- Get the only interesting attributes
+          if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1)
+          {
+            // ----- Close the zip file
+            $this->privCloseFd();
+            $this->privSwapBackMagicQuotes();
+
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+            return $v_result;
+          }
+
+          // ----- Set the file content
+          $p_file_list[$v_nb_extracted]['content'] = $v_string;
+
+          // ----- Next extracted file
+          $v_nb_extracted++;
+
+          // ----- Look for user callback abort
+          if ($v_result1 == 2) {
+          	break;
+          }
+        }
+        // ----- Look for extraction in standard output
+        elseif (   (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT]))
+		        && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) {
+          // ----- Extracting the file in standard output
+          $v_result1 = $this->privExtractFileInOutput($v_header, $p_options);
+          if ($v_result1 < 1) {
+            $this->privCloseFd();
+            $this->privSwapBackMagicQuotes();
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result1);
+            return $v_result1;
+          }
+
+          // ----- Get the only interesting attributes
+          if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) {
+            $this->privCloseFd();
+            $this->privSwapBackMagicQuotes();
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+            return $v_result;
+          }
+
+          // ----- Look for user callback abort
+          if ($v_result1 == 2) {
+          	break;
+          }
+        }
+        // ----- Look for normal extraction
+        else {
+          // ----- Extracting the file
+          $v_result1 = $this->privExtractFile($v_header,
+		                                      $p_path, $p_remove_path,
+											  $p_remove_all_path,
+											  $p_options);
+          if ($v_result1 < 1) {
+            $this->privCloseFd();
+            $this->privSwapBackMagicQuotes();
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result1);
+            return $v_result1;
+          }
+
+          // ----- Get the only interesting attributes
+          if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1)
+          {
+            // ----- Close the zip file
+            $this->privCloseFd();
+            $this->privSwapBackMagicQuotes();
+
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+            return $v_result;
+          }
+
+          // ----- Look for user callback abort
+          if ($v_result1 == 2) {
+          	break;
+          }
+        }
+      }
+    }
+
+    // ----- Close the zip file
+    $this->privCloseFd();
+    $this->privSwapBackMagicQuotes();
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privExtractFile()
+  // Description :
+  // Parameters :
+  // Return Values :
+  //
+  // 1 : ... ?
+  // PCLZIP_ERR_USER_ABORTED(2) : User ask for extraction stop in callback
+  // --------------------------------------------------------------------------------
+  function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privExtractFile', "path='$p_path', remove_path='$p_remove_path', remove_all_path='".($p_remove_all_path?'true':'false')."'");
+    $v_result=1;
+
+    // ----- Read the file header
+    if (($v_result = $this->privReadFileHeader($v_header)) != 1)
+    {
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+    }
+
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Found file '".$v_header['filename']."', size '".$v_header['size']."'");
+
+    // ----- Check that the file header is coherent with $p_entry info
+    if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {
+        // TBC
+    }
+
+    // ----- Look for all path to remove
+    if ($p_remove_all_path == true) {
+        // ----- Look for folder entry that not need to be extracted
+        if (($p_entry['external']&0x00000010)==0x00000010) {
+            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The entry is a folder : need to be filtered");
+
+            $p_entry['status'] = "filtered";
+
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+            return $v_result;
+        }
+
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "All path is removed");
+        // ----- Get the basename of the path
+        $p_entry['filename'] = basename($p_entry['filename']);
+    }
+
+    // ----- Look for path to remove
+    else if ($p_remove_path != "")
+    {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Look for some path to remove");
+      if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2)
+      {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The folder is the same as the removed path '".$p_entry['filename']."'");
+
+        // ----- Change the file status
+        $p_entry['status'] = "filtered";
+
+        // ----- Return
+        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+        return $v_result;
+      }
+
+      $p_remove_path_size = strlen($p_remove_path);
+      if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path)
+      {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Found path '$p_remove_path' to remove in file '".$p_entry['filename']."'");
+
+        // ----- Remove the path
+        $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size);
+
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Resulting file is '".$p_entry['filename']."'");
+      }
+    }
+
+    // ----- Add the path
+    if ($p_path != '') {
+      $p_entry['filename'] = $p_path."/".$p_entry['filename'];
+    }
+
+    // ----- Check a base_dir_restriction
+    if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Check the extract directory restriction");
+      $v_inclusion
+      = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION],
+                                $p_entry['filename']);
+      if ($v_inclusion == 0) {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_EXTRACT_DIR_RESTRICTION is selected, file is outside restriction");
+
+        PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION,
+			                     "Filename '".$p_entry['filename']."' is "
+								 ."outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION");
+
+        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+        return PclZip::errorCode();
+      }
+    }
+
+    // ----- Look for pre-extract callback
+    if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A pre-callback '".$p_options[PCLZIP_CB_PRE_EXTRACT]."()') is defined for the extraction");
+
+      // ----- Generate a local information
+      $v_local_header = array();
+      $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
+
+      // ----- Call the callback
+      // Here I do not use call_user_func() because I need to send a reference to the
+      // header.
+      eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);');
+      if ($v_result == 0) {
+        // ----- Change the file status
+        $p_entry['status'] = "skipped";
+        $v_result = 1;
+      }
+
+      // ----- Look for abort result
+      if ($v_result == 2) {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction");
+        // ----- This status is internal and will be changed in 'skipped'
+        $p_entry['status'] = "aborted";
+      	$v_result = PCLZIP_ERR_USER_ABORTED;
+      }
+
+      // ----- Update the informations
+      // Only some fields can be modified
+      $p_entry['filename'] = $v_local_header['filename'];
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "New filename is '".$p_entry['filename']."'");
+    }
+
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file (with path) '".$p_entry['filename']."', size '$v_header[size]'");
+
+    // ----- Look if extraction should be done
+    if ($p_entry['status'] == 'ok') {
+
+    // ----- Look for specific actions while the file exist
+    if (file_exists($p_entry['filename']))
+    {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$p_entry['filename']."' already exists");
+
+      // ----- Look if file is a directory
+      if (is_dir($p_entry['filename']))
+      {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Existing file '".$p_entry['filename']."' is a directory");
+
+        // ----- Change the file status
+        $p_entry['status'] = "already_a_directory";
+
+        // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
+        // For historical reason first PclZip implementation does not stop
+        // when this kind of error occurs.
+        if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
+		    && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
+            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped");
+
+            PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY,
+			                     "Filename '".$p_entry['filename']."' is "
+								 ."already used by an existing directory");
+
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+            return PclZip::errorCode();
+		}
+      }
+      // ----- Look if file is write protected
+      else if (!is_writeable($p_entry['filename']))
+      {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Existing file '".$p_entry['filename']."' is write protected");
+
+        // ----- Change the file status
+        $p_entry['status'] = "write_protected";
+
+        // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
+        // For historical reason first PclZip implementation does not stop
+        // when this kind of error occurs.
+        if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
+		    && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
+            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped");
+
+            PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL,
+			                     "Filename '".$p_entry['filename']."' exists "
+								 ."and is write protected");
+
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+            return PclZip::errorCode();
+		}
+      }
+
+      // ----- Look if the extracted file is older
+      else if (filemtime($p_entry['filename']) > $p_entry['mtime'])
+      {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Existing file '".$p_entry['filename']."' is newer (".date("l dS of F Y h:i:s A", filemtime($p_entry['filename'])).") than the extracted file (".date("l dS of F Y h:i:s A", $p_entry['mtime']).")");
+        // ----- Change the file status
+        if (   (isset($p_options[PCLZIP_OPT_REPLACE_NEWER]))
+		    && ($p_options[PCLZIP_OPT_REPLACE_NEWER]===true)) {
+            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_REPLACE_NEWER is selected, file will be replaced");
+		}
+		else {
+            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File will not be replaced");
+            $p_entry['status'] = "newer_exist";
+
+            // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
+            // For historical reason first PclZip implementation does not stop
+            // when this kind of error occurs.
+            if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
+		        && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
+                //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped");
+
+                PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL,
+			             "Newer version of '".$p_entry['filename']."' exists "
+					    ."and option PCLZIP_OPT_REPLACE_NEWER is not selected");
+
+                //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+                return PclZip::errorCode();
+		    }
+		}
+      }
+      else {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Existing file '".$p_entry['filename']."' is older than the extrated one - will be replaced by the extracted one (".date("l dS of F Y h:i:s A", filemtime($p_entry['filename'])).") than the extracted file (".date("l dS of F Y h:i:s A", $p_entry['mtime']).")");
+      }
+    }
+
+    // ----- Check the directory availability and create it if necessary
+    else {
+      if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/'))
+        $v_dir_to_check = $p_entry['filename'];
+      else if (!strstr($p_entry['filename'], "/"))
+        $v_dir_to_check = "";
+      else
+        $v_dir_to_check = dirname($p_entry['filename']);
+
+      if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to create path for '".$p_entry['filename']."'");
+
+        // ----- Change the file status
+        $p_entry['status'] = "path_creation_fail";
+
+        // ----- Return
+        ////--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+        //return $v_result;
+        $v_result = 1;
+      }
+    }
+    }
+
+    // ----- Look if extraction should be done
+    if ($p_entry['status'] == 'ok') {
+
+      // ----- Do the extraction (if not a folder)
+      if (!(($p_entry['external']&0x00000010)==0x00000010))
+      {
+        // ----- Look for not compressed file
+        if ($p_entry['compression'] == 0) {
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting an un-compressed file");
+
+		  // ----- Opening destination file
+          if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0)
+          {
+            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Error while opening '".$p_entry['filename']."' in write binary mode");
+
+            // ----- Change the file status
+            $p_entry['status'] = "write_error";
+
+            // ----- Return
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+            return $v_result;
+          }
+
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Read '".$p_entry['size']."' bytes");
+
+          // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks
+          $v_size = $p_entry['compressed_size'];
+          while ($v_size != 0)
+          {
+            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
+            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Read $v_read_size bytes");
+            $v_buffer = @fread($this->zip_fd, $v_read_size);
+            /* Try to speed up the code
+            $v_binary_data = pack('a'.$v_read_size, $v_buffer);
+            @fwrite($v_dest_file, $v_binary_data, $v_read_size);
+            */
+            @fwrite($v_dest_file, $v_buffer, $v_read_size);
+            $v_size -= $v_read_size;
+          }
+
+          // ----- Closing the destination file
+          fclose($v_dest_file);
+
+          // ----- Change the file mtime
+          touch($p_entry['filename'], $p_entry['mtime']);
+
+
+        }
+        else {
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting a compressed file (Compression method ".$p_entry['compression'].")");
+          // ----- TBC
+          // Need to be finished
+          if (($p_entry['flag'] & 1) == 1) {
+              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File is encrypted");
+            /*
+              // ----- Read the encryption header
+              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Read 12 encryption header bytes");
+              $v_encryption_header = @fread($this->zip_fd, 12);
+
+              // ----- Read the encrypted & compressed file in a buffer
+              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Read '".($p_entry['compressed_size']-12)."' compressed & encrypted bytes");
+              $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']-12);
+
+              // ----- Decrypt the buffer
+              $this->privDecrypt($v_encryption_header, $v_buffer,
+			                     $p_entry['compressed_size']-12, $p_entry['crc']);
+              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Buffer is '".$v_buffer."'");
+              */
+          }
+          else {
+              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Read '".$p_entry['compressed_size']."' compressed bytes");
+              // ----- Read the compressed file in a buffer (one shot)
+              $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);
+          }
+
+          // ----- Decompress the file
+          $v_file_content = @gzinflate($v_buffer);
+          unset($v_buffer);
+          if ($v_file_content === FALSE) {
+            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to inflate compressed file");
+
+            // ----- Change the file status
+            // TBC
+            $p_entry['status'] = "error";
+
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+            return $v_result;
+          }
+
+          // ----- Opening destination file
+          if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) {
+            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Error while opening '".$p_entry['filename']."' in write binary mode");
+
+            // ----- Change the file status
+            $p_entry['status'] = "write_error";
+
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+            return $v_result;
+          }
+
+          // ----- Write the uncompressed data
+          @fwrite($v_dest_file, $v_file_content, $p_entry['size']);
+          unset($v_file_content);
+
+          // ----- Closing the destination file
+          @fclose($v_dest_file);
+
+          // ----- Change the file mtime
+          @touch($p_entry['filename'], $p_entry['mtime']);
+        }
+
+        // ----- Look for chmod option
+        if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) {
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "chmod option activated '".$p_options[PCLZIP_OPT_SET_CHMOD]."'");
+
+          // ----- Change the mode of the file
+          @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]);
+        }
+
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extraction done");
+      }
+    }
+
+	// ----- Change abort status
+	if ($p_entry['status'] == "aborted") {
+      $p_entry['status'] = "skipped";
+	}
+
+    // ----- Look for post-extract callback
+    elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A post-callback '".$p_options[PCLZIP_CB_POST_EXTRACT]."()') is defined for the extraction");
+
+      // ----- Generate a local information
+      $v_local_header = array();
+      $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
+
+      // ----- Call the callback
+      // Here I do not use call_user_func() because I need to send a reference to the
+      // header.
+      eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);');
+
+      // ----- Look for abort result
+      if ($v_result == 2) {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction");
+      	$v_result = PCLZIP_ERR_USER_ABORTED;
+      }
+    }
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privExtractFileInOutput()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privExtractFileInOutput(&$p_entry, &$p_options)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privExtractFileInOutput', "");
+    $v_result=1;
+
+    // ----- Read the file header
+    if (($v_result = $this->privReadFileHeader($v_header)) != 1) {
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+    }
+
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Found file '".$v_header['filename']."', size '".$v_header['size']."'");
+
+    // ----- Check that the file header is coherent with $p_entry info
+    if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {
+        // TBC
+    }
+
+    // ----- Look for pre-extract callback
+    if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A pre-callback '".$p_options[PCLZIP_CB_PRE_EXTRACT]."()') is defined for the extraction");
+
+      // ----- Generate a local information
+      $v_local_header = array();
+      $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
+
+      // ----- Call the callback
+      // Here I do not use call_user_func() because I need to send a reference to the
+      // header.
+      eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);');
+      if ($v_result == 0) {
+        // ----- Change the file status
+        $p_entry['status'] = "skipped";
+        $v_result = 1;
+      }
+
+      // ----- Look for abort result
+      if ($v_result == 2) {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction");
+        // ----- This status is internal and will be changed in 'skipped'
+        $p_entry['status'] = "aborted";
+      	$v_result = PCLZIP_ERR_USER_ABORTED;
+      }
+
+      // ----- Update the informations
+      // Only some fields can be modified
+      $p_entry['filename'] = $v_local_header['filename'];
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "New filename is '".$p_entry['filename']."'");
+    }
+
+    // ----- Trace
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file (with path) '".$p_entry['filename']."', size '$v_header[size]'");
+
+    // ----- Look if extraction should be done
+    if ($p_entry['status'] == 'ok') {
+
+      // ----- Do the extraction (if not a folder)
+      if (!(($p_entry['external']&0x00000010)==0x00000010)) {
+        // ----- Look for not compressed file
+        if ($p_entry['compressed_size'] == $p_entry['size']) {
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting an un-compressed file");
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Reading '".$p_entry['size']."' bytes");
+
+          // ----- Read the file in a buffer (one shot)
+          $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);
+
+          // ----- Send the file to the output
+          echo $v_buffer;
+          unset($v_buffer);
+        }
+        else {
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting a compressed file");
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Reading '".$p_entry['size']."' bytes");
+
+          // ----- Read the compressed file in a buffer (one shot)
+          $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);
+
+          // ----- Decompress the file
+          $v_file_content = gzinflate($v_buffer);
+          unset($v_buffer);
+
+          // ----- Send the file to the output
+          echo $v_file_content;
+          unset($v_file_content);
+        }
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extraction done");
+      }
+    }
+
+	// ----- Change abort status
+	if ($p_entry['status'] == "aborted") {
+      $p_entry['status'] = "skipped";
+	}
+
+    // ----- Look for post-extract callback
+    elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A post-callback '".$p_options[PCLZIP_CB_POST_EXTRACT]."()') is defined for the extraction");
+
+      // ----- Generate a local information
+      $v_local_header = array();
+      $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
+
+      // ----- Call the callback
+      // Here I do not use call_user_func() because I need to send a reference to the
+      // header.
+      eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);');
+
+      // ----- Look for abort result
+      if ($v_result == 2) {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction");
+      	$v_result = PCLZIP_ERR_USER_ABORTED;
+      }
+    }
+
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privExtractFileAsString()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privExtractFileAsString(&$p_entry, &$p_string)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privExtractFileAsString', "p_entry['filename']='".$p_entry['filename']."'");
+    $v_result=1;
+
+    // ----- Read the file header
+    $v_header = array();
+    if (($v_result = $this->privReadFileHeader($v_header)) != 1)
+    {
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+    }
+
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Found file '".$v_header['filename']."', size '".$v_header['size']."'");
+
+    // ----- Check that the file header is coherent with $p_entry info
+    if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {
+        // TBC
+    }
+
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file in string (with path) '".$p_entry['filename']."', size '$v_header[size]'");
+
+    // ----- Do the extraction (if not a folder)
+    if (!(($p_entry['external']&0x00000010)==0x00000010))
+    {
+      // ----- Look for not compressed file
+//      if ($p_entry['compressed_size'] == $p_entry['size'])
+      if ($p_entry['compression'] == 0) {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting an un-compressed file");
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Reading '".$p_entry['size']."' bytes");
+
+        // ----- Reading the file
+        $p_string = @fread($this->zip_fd, $p_entry['compressed_size']);
+      }
+      else {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting a compressed file (compression method '".$p_entry['compression']."')");
+
+        // ----- Reading the file
+        $v_data = @fread($this->zip_fd, $p_entry['compressed_size']);
+
+        // ----- Decompress the file
+        if (($p_string = @gzinflate($v_data)) === FALSE) {
+            // TBC
+        }
+      }
+
+      // ----- Trace
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extraction done");
+    }
+    else {
+        // TBC : error : can not extract a folder in a string
+    }
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privReadFileHeader()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privReadFileHeader(&$p_header)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privReadFileHeader", "");
+    $v_result=1;
+
+    // ----- Read the 4 bytes signature
+    $v_binary_data = @fread($this->zip_fd, 4);
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary data is : '".sprintf("%08x", $v_binary_data)."'");
+    $v_data = unpack('Vid', $v_binary_data);
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary signature is : '".sprintf("0x%08x", $v_data['id'])."'");
+
+    // ----- Check signature
+    if ($v_data['id'] != 0x04034b50)
+    {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Invalid File header");
+
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure');
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+      return PclZip::errorCode();
+    }
+
+    // ----- Read the first 42 bytes of the header
+    $v_binary_data = fread($this->zip_fd, 26);
+
+    // ----- Look for invalid block size
+    if (strlen($v_binary_data) != 26)
+    {
+      $p_header['filename'] = "";
+      $p_header['status'] = "invalid_header";
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Invalid block size : ".strlen($v_binary_data));
+
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data));
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+      return PclZip::errorCode();
+    }
+
+    // ----- Extract the values
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Header : '".$v_binary_data."'");
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Header (Hex) : '".bin2hex($v_binary_data)."'");
+    $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data);
+
+    // ----- Get filename
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "File name length : ".$v_data['filename_len']);
+    $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']);
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Filename : \''.$p_header['filename'].'\'');
+
+    // ----- Get extra_fields
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extra field length : ".$v_data['extra_len']);
+    if ($v_data['extra_len'] != 0) {
+      $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']);
+    }
+    else {
+      $p_header['extra'] = '';
+    }
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Extra field : \''.bin2hex($p_header['extra']).'\'');
+
+    // ----- Extract properties
+    $p_header['version_extracted'] = $v_data['version'];
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Version need to extract : ('.$p_header['version_extracted'].') \''.($p_header['version_extracted']/10).'.'.($p_header['version_extracted']%10).'\'');
+    $p_header['compression'] = $v_data['compression'];
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Compression method : \''.$p_header['compression'].'\'');
+    $p_header['size'] = $v_data['size'];
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Size : \''.$p_header['size'].'\'');
+    $p_header['compressed_size'] = $v_data['compressed_size'];
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Compressed Size : \''.$p_header['compressed_size'].'\'');
+    $p_header['crc'] = $v_data['crc'];
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'CRC : \''.sprintf("0x%X", $p_header['crc']).'\'');
+    $p_header['flag'] = $v_data['flag'];
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Flag : \''.$p_header['flag'].'\'');
+    $p_header['filename_len'] = $v_data['filename_len'];
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Filename_len : \''.$p_header['filename_len'].'\'');
+
+    // ----- Recuperate date in UNIX format
+    $p_header['mdate'] = $v_data['mdate'];
+    $p_header['mtime'] = $v_data['mtime'];
+    if ($p_header['mdate'] && $p_header['mtime'])
+    {
+      // ----- Extract time
+      $v_hour = ($p_header['mtime'] & 0xF800) >> 11;
+      $v_minute = ($p_header['mtime'] & 0x07E0) >> 5;
+      $v_seconde = ($p_header['mtime'] & 0x001F)*2;
+
+      // ----- Extract date
+      $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;
+      $v_month = ($p_header['mdate'] & 0x01E0) >> 5;
+      $v_day = $p_header['mdate'] & 0x001F;
+
+      // ----- Get UNIX date format
+      $p_header['mtime'] = mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);
+
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');
+    }
+    else
+    {
+      $p_header['mtime'] = time();
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date is actual : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');
+    }
+
+    // TBC
+    //for(reset($v_data); $key = key($v_data); next($v_data)) {
+    //  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Attribut[$key] = ".$v_data[$key]);
+    //}
+
+    // ----- Set the stored filename
+    $p_header['stored_filename'] = $p_header['filename'];
+
+    // ----- Set the status field
+    $p_header['status'] = "ok";
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privReadCentralFileHeader()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privReadCentralFileHeader(&$p_header)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privReadCentralFileHeader", "");
+    $v_result=1;
+
+    // ----- Read the 4 bytes signature
+    $v_binary_data = @fread($this->zip_fd, 4);
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary data is : '".sprintf("%08x", $v_binary_data)."'");
+    $v_data = unpack('Vid', $v_binary_data);
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary signature is : '".sprintf("0x%08x", $v_data['id'])."'");
+
+    // ----- Check signature
+    if ($v_data['id'] != 0x02014b50)
+    {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Invalid Central Dir File signature");
+
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure');
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+      return PclZip::errorCode();
+    }
+
+    // ----- Read the first 42 bytes of the header
+    $v_binary_data = fread($this->zip_fd, 42);
+
+    // ----- Look for invalid block size
+    if (strlen($v_binary_data) != 42)
+    {
+      $p_header['filename'] = "";
+      $p_header['status'] = "invalid_header";
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Invalid block size : ".strlen($v_binary_data));
+
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data));
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+      return PclZip::errorCode();
+    }
+
+    // ----- Extract the values
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Header : '".$v_binary_data."'");
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Header (Hex) : '".bin2hex($v_binary_data)."'");
+    $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data);
+
+    // ----- Get filename
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "File name length : ".$p_header['filename_len']);
+    if ($p_header['filename_len'] != 0)
+      $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']);
+    else
+      $p_header['filename'] = '';
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Filename : \''.$p_header['filename'].'\'');
+
+    // ----- Get extra
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Extra length : ".$p_header['extra_len']);
+    if ($p_header['extra_len'] != 0)
+      $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']);
+    else
+      $p_header['extra'] = '';
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Extra : \''.$p_header['extra'].'\'');
+
+    // ----- Get comment
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Comment length : ".$p_header['comment_len']);
+    if ($p_header['comment_len'] != 0)
+      $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']);
+    else
+      $p_header['comment'] = '';
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Comment : \''.$p_header['comment'].'\'');
+
+    // ----- Extract properties
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Version : \''.($p_header['version']/10).'.'.($p_header['version']%10).'\'');
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Version need to extract : \''.($p_header['version_extracted']/10).'.'.($p_header['version_extracted']%10).'\'');
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Size : \''.$p_header['size'].'\'');
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Compressed Size : \''.$p_header['compressed_size'].'\'');
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'CRC : \''.sprintf("0x%X", $p_header['crc']).'\'');
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Flag : \''.$p_header['flag'].'\'');
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Offset : \''.$p_header['offset'].'\'');
+
+    // ----- Recuperate date in UNIX format
+    if ($p_header['mdate'] && $p_header['mtime'])
+    {
+      // ----- Extract time
+      $v_hour = ($p_header['mtime'] & 0xF800) >> 11;
+      $v_minute = ($p_header['mtime'] & 0x07E0) >> 5;
+      $v_seconde = ($p_header['mtime'] & 0x001F)*2;
+
+      // ----- Extract date
+      $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;
+      $v_month = ($p_header['mdate'] & 0x01E0) >> 5;
+      $v_day = $p_header['mdate'] & 0x001F;
+
+      // ----- Get UNIX date format
+      $p_header['mtime'] = mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);
+
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');
+    }
+    else
+    {
+      $p_header['mtime'] = time();
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Date is actual : \''.date("d/m/y H:i:s", $p_header['mtime']).'\'');
+    }
+
+    // ----- Set the stored filename
+    $p_header['stored_filename'] = $p_header['filename'];
+
+    // ----- Set default status to ok
+    $p_header['status'] = 'ok';
+
+    // ----- Look if it is a directory
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Internal (Hex) : '".sprintf("Ox%04X", $p_header['internal'])."'");
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "External (Hex) : '".sprintf("Ox%04X", $p_header['external'])."' (".(($p_header['external']&0x00000010)==0x00000010?'is a folder':'is a file').')');
+    if (substr($p_header['filename'], -1) == '/') {
+      //$p_header['external'] = 0x41FF0010;
+      $p_header['external'] = 0x00000010;
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Force folder external : \''.sprintf("Ox%04X", $p_header['external']).'\'');
+    }
+
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Header of filename : \''.$p_header['filename'].'\'');
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privCheckFileHeaders()
+  // Description :
+  // Parameters :
+  // Return Values :
+  //   1 on success,
+  //   0 on error;
+  // --------------------------------------------------------------------------------
+  function privCheckFileHeaders(&$p_local_header, &$p_central_header)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCheckFileHeaders", "");
+    $v_result=1;
+
+	// ----- Check the static values
+	// TBC
+	if ($p_local_header['filename'] != $p_central_header['filename']) {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "filename" : TBC To Be Completed');
+	}
+	if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "version_extracted" : TBC To Be Completed');
+	}
+	if ($p_local_header['flag'] != $p_central_header['flag']) {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "flag" : TBC To Be Completed');
+	}
+	if ($p_local_header['compression'] != $p_central_header['compression']) {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "compression" : TBC To Be Completed');
+	}
+	if ($p_local_header['mtime'] != $p_central_header['mtime']) {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "mtime" : TBC To Be Completed');
+	}
+	if ($p_local_header['filename_len'] != $p_central_header['filename_len']) {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "filename_len" : TBC To Be Completed');
+	}
+
+	// ----- Look for flag bit 3
+	if (($p_local_header['flag'] & 8) == 8) {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Purpose bit flag bit 3 set !');
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'File size, compression size and crc found in central header');
+        $p_local_header['size'] = $p_central_header['size'];
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Size : \''.$p_local_header['size'].'\'');
+        $p_local_header['compressed_size'] = $p_central_header['compressed_size'];
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Compressed Size : \''.$p_local_header['compressed_size'].'\'');
+        $p_local_header['crc'] = $p_central_header['crc'];
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'CRC : \''.sprintf("0x%X", $p_local_header['crc']).'\'');
+	}
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privReadEndCentralDir()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privReadEndCentralDir(&$p_central_dir)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privReadEndCentralDir", "");
+    $v_result=1;
+
+    // ----- Go to the end of the zip file
+    $v_size = filesize($this->zipname);
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Size of the file :$v_size");
+    @fseek($this->zip_fd, $v_size);
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Position at end of zip file : \''.ftell($this->zip_fd).'\'');
+    if (@ftell($this->zip_fd) != $v_size)
+    {
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \''.$this->zipname.'\'');
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+      return PclZip::errorCode();
+    }
+
+    // ----- First try : look if this is an archive with no commentaries (most of the time)
+    // in this case the end of central dir is at 22 bytes of the file end
+    $v_found = 0;
+    if ($v_size > 26) {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Look for central dir with no comment');
+      @fseek($this->zip_fd, $v_size-22);
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Position after min central position : \''.ftell($this->zip_fd).'\'');
+      if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22))
+      {
+        // ----- Error log
+        PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\'');
+
+        // ----- Return
+        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+        return PclZip::errorCode();
+      }
+
+      // ----- Read for bytes
+      $v_binary_data = @fread($this->zip_fd, 4);
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Binary data is : '".sprintf("%08x", $v_binary_data)."'");
+      $v_data = @unpack('Vid', $v_binary_data);
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary signature is : '".sprintf("0x%08x", $v_data['id'])."'");
+
+      // ----- Check signature
+      if ($v_data['id'] == 0x06054b50) {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Found central dir at the default position.");
+        $v_found = 1;
+      }
+
+      $v_pos = ftell($this->zip_fd);
+    }
+
+    // ----- Go back to the maximum possible size of the Central Dir End Record
+    if (!$v_found) {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Start extended search of end central dir');
+      $v_maximum_size = 65557; // 0xFFFF + 22;
+      if ($v_maximum_size > $v_size)
+        $v_maximum_size = $v_size;
+      @fseek($this->zip_fd, $v_size-$v_maximum_size);
+      if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size))
+      {
+        // ----- Error log
+        PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\'');
+
+        // ----- Return
+        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+        return PclZip::errorCode();
+      }
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Position after max central position : \''.ftell($this->zip_fd).'\'');
+
+      // ----- Read byte per byte in order to find the signature
+      $v_pos = ftell($this->zip_fd);
+      $v_bytes = 0x00000000;
+      while ($v_pos < $v_size)
+      {
+        // ----- Read a byte
+        $v_byte = @fread($this->zip_fd, 1);
+
+        // -----  Add the byte
+        // Note we mask the old value down such that once shifted we can never end up with more than a 32bit number
+        // Otherwise on systems where we have 64bit integers the check below for the magic number will fail.
+        $v_bytes = ( ($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte);
+
+        // ----- Compare the bytes
+        if ($v_bytes == 0x504b0506)
+        {
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Found End Central Dir signature at position : \''.ftell($this->zip_fd).'\'');
+          $v_pos++;
+          break;
+        }
+
+        $v_pos++;
+      }
+
+      // ----- Look if not found end of central dir
+      if ($v_pos == $v_size)
+      {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to find End of Central Dir Record signature");
+
+        // ----- Error log
+        PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature");
+
+        // ----- Return
+        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+        return PclZip::errorCode();
+      }
+    }
+
+    // ----- Read the first 18 bytes of the header
+    $v_binary_data = fread($this->zip_fd, 18);
+
+    // ----- Look for invalid block size
+    if (strlen($v_binary_data) != 18)
+    {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Invalid End of Central Dir Record size : ".strlen($v_binary_data));
+
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : ".strlen($v_binary_data));
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+      return PclZip::errorCode();
+    }
+
+    // ----- Extract the values
+    ////--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Central Dir Record : '".$v_binary_data."'");
+    ////--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Central Dir Record (Hex) : '".bin2hex($v_binary_data)."'");
+    $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data);
+
+    // ----- Check the global size
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Comment length : ".$v_data['comment_size']);
+    if (($v_pos + $v_data['comment_size'] + 18) != $v_size) {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The central dir is not at the end of the archive. Some trailing bytes exists after the archive.");
+
+	  // ----- Removed in release 2.2 see readme file
+	  // The check of the file size is a little too strict.
+	  // Some bugs where found when a zip is encrypted/decrypted with 'crypt'.
+	  // While decrypted, zip has training 0 bytes
+	  if (0) {
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT,
+	                       'The central dir is not at the end of the archive.'
+						   .' Some trailing bytes exists after the archive.');
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+      return PclZip::errorCode();
+	  }
+    }
+
+    // ----- Get comment
+    if ($v_data['comment_size'] != 0)
+      $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']);
+    else
+      $p_central_dir['comment'] = '';
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Comment : \''.$p_central_dir['comment'].'\'');
+
+    $p_central_dir['entries'] = $v_data['entries'];
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Nb of entries : \''.$p_central_dir['entries'].'\'');
+    $p_central_dir['disk_entries'] = $v_data['disk_entries'];
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Nb of entries for this disk : \''.$p_central_dir['disk_entries'].'\'');
+    $p_central_dir['offset'] = $v_data['offset'];
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Offset of Central Dir : \''.$p_central_dir['offset'].'\'');
+    $p_central_dir['size'] = $v_data['size'];
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Size of Central Dir : \''.$p_central_dir['size'].'\'');
+    $p_central_dir['disk'] = $v_data['disk'];
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Disk number : \''.$p_central_dir['disk'].'\'');
+    $p_central_dir['disk_start'] = $v_data['disk_start'];
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Start disk number : \''.$p_central_dir['disk_start'].'\'');
+
+    // TBC
+    //for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) {
+    //  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "central_dir[$key] = ".$p_central_dir[$key]);
+    //}
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privDeleteByRule()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privDeleteByRule(&$p_result_list, &$p_options)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privDeleteByRule", "");
+    $v_result=1;
+    $v_list_detail = array();
+
+    // ----- Open the zip file
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
+    if (($v_result=$this->privOpenFd('rb')) != 1)
+    {
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+    }
+
+    // ----- Read the central directory informations
+    $v_central_dir = array();
+    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
+    {
+      $this->privCloseFd();
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+    }
+
+    // ----- Go to beginning of File
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'");
+    @rewind($this->zip_fd);
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'");
+
+    // ----- Scan all the files
+    // ----- Start at beginning of Central Dir
+    $v_pos_entry = $v_central_dir['offset'];
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position before rewind : ".ftell($this->zip_fd)."'");
+    @rewind($this->zip_fd);
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after rewind : ".ftell($this->zip_fd)."'");
+    if (@fseek($this->zip_fd, $v_pos_entry))
+    {
+      // ----- Close the zip file
+      $this->privCloseFd();
+
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+      return PclZip::errorCode();
+    }
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after fseek : ".ftell($this->zip_fd)."'");
+
+    // ----- Read each entry
+    $v_header_list = array();
+    $j_start = 0;
+    for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++)
+    {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Read next file header entry (index '$i')");
+
+      // ----- Read the file header
+      $v_header_list[$v_nb_extracted] = array();
+      if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1)
+      {
+        // ----- Close the zip file
+        $this->privCloseFd();
+
+        //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+        return $v_result;
+      }
+
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename (index '$i') : '".$v_header_list[$v_nb_extracted]['stored_filename']."'");
+
+      // ----- Store the index
+      $v_header_list[$v_nb_extracted]['index'] = $i;
+
+      // ----- Look for the specific extract rules
+      $v_found = false;
+
+      // ----- Look for extract by name rule
+      if (   (isset($p_options[PCLZIP_OPT_BY_NAME]))
+          && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByName'");
+
+          // ----- Look if the filename is in the list
+          for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_found); $j++) {
+              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Compare with file '".$p_options[PCLZIP_OPT_BY_NAME][$j]."'");
+
+              // ----- Look for a directory
+              if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") {
+                  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The searched item is a directory");
+
+                  // ----- Look if the directory is in the filename path
+                  if (   (strlen($v_header_list[$v_nb_extracted]['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j]))
+                      && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) {
+                      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The directory is in the file path");
+                      $v_found = true;
+                  }
+                  elseif (   (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) /* Indicates a folder */
+                          && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) {
+                      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The entry is the searched directory");
+                      $v_found = true;
+                  }
+              }
+              // ----- Look for a filename
+              elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {
+                  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The file is the right one.");
+                  $v_found = true;
+              }
+          }
+      }
+
+      // ----- Look for extract by ereg rule
+      else if (   (isset($p_options[PCLZIP_OPT_BY_EREG]))
+               && ($p_options[PCLZIP_OPT_BY_EREG] != "")) {
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract by ereg '".$p_options[PCLZIP_OPT_BY_EREG]."'");
+
+          if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) {
+              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename match the regular expression");
+              $v_found = true;
+          }
+      }
+
+      // ----- Look for extract by preg rule
+      else if (   (isset($p_options[PCLZIP_OPT_BY_PREG]))
+               && ($p_options[PCLZIP_OPT_BY_PREG] != "")) {
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByEreg'");
+
+          if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) {
+              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename match the regular expression");
+              $v_found = true;
+          }
+      }
+
+      // ----- Look for extract by index rule
+      else if (   (isset($p_options[PCLZIP_OPT_BY_INDEX]))
+               && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {
+          //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByIndex'");
+
+          // ----- Look if the index is in the list
+          for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_found); $j++) {
+              //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Look if index '$i' is in [".$p_options[PCLZIP_OPT_BY_INDEX][$j]['start'].",".$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']."]");
+
+              if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {
+                  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Found as part of an index range");
+                  $v_found = true;
+              }
+              if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {
+                  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Do not look this index range for next loop");
+                  $j_start = $j+1;
+              }
+
+              if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) {
+                  //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Index range is greater than index, stop loop");
+                  break;
+              }
+          }
+      }
+      else {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "No argument mean remove all file");
+      	$v_found = true;
+      }
+
+      // ----- Look for deletion
+      if ($v_found)
+      {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$v_header_list[$v_nb_extracted]['stored_filename']."', index '$i' need to be deleted");
+        unset($v_header_list[$v_nb_extracted]);
+      }
+      else
+      {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$v_header_list[$v_nb_extracted]['stored_filename']."', index '$i' will not be deleted");
+        $v_nb_extracted++;
+      }
+    }
+
+    // ----- Look if something need to be deleted
+    if ($v_nb_extracted > 0) {
+
+        // ----- Creates a temporay file
+        $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';
+
+        // ----- Creates a temporary zip archive
+        $v_temp_zip = new PclZip($v_zip_temp_name);
+
+        // ----- Open the temporary zip file in write mode
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary write mode");
+        if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) {
+            $this->privCloseFd();
+
+            // ----- Return
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+            return $v_result;
+        }
+
+        // ----- Look which file need to be kept
+        for ($i=0; $i<sizeof($v_header_list); $i++) {
+            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Keep entry index '$i' : '".$v_header_list[$i]['filename']."'");
+
+            // ----- Calculate the position of the header
+            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Offset='". $v_header_list[$i]['offset']."'");
+            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position before rewind : ".ftell($this->zip_fd)."'");
+            @rewind($this->zip_fd);
+            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after rewind : ".ftell($this->zip_fd)."'");
+            if (@fseek($this->zip_fd,  $v_header_list[$i]['offset'])) {
+                // ----- Close the zip file
+                $this->privCloseFd();
+                $v_temp_zip->privCloseFd();
+                @unlink($v_zip_temp_name);
+
+                // ----- Error log
+                PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
+
+                // ----- Return
+                //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+                return PclZip::errorCode();
+            }
+            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after fseek : ".ftell($this->zip_fd)."'");
+
+            // ----- Read the file header
+            $v_local_header = array();
+            if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) {
+                // ----- Close the zip file
+                $this->privCloseFd();
+                $v_temp_zip->privCloseFd();
+                @unlink($v_zip_temp_name);
+
+                // ----- Return
+                //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+                return $v_result;
+            }
+
+            // ----- Check that local file header is same as central file header
+            if ($this->privCheckFileHeaders($v_local_header,
+			                                $v_header_list[$i]) != 1) {
+                // TBC
+            }
+            unset($v_local_header);
+
+            // ----- Write the file header
+            if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) {
+                // ----- Close the zip file
+                $this->privCloseFd();
+                $v_temp_zip->privCloseFd();
+                @unlink($v_zip_temp_name);
+
+                // ----- Return
+                //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+                return $v_result;
+            }
+            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Offset for this file is '".$v_header_list[$i]['offset']."'");
+
+            // ----- Read/write the data block
+            if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) {
+                // ----- Close the zip file
+                $this->privCloseFd();
+                $v_temp_zip->privCloseFd();
+                @unlink($v_zip_temp_name);
+
+                // ----- Return
+                //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+                return $v_result;
+            }
+        }
+
+        // ----- Store the offset of the central dir
+        $v_offset = @ftell($v_temp_zip->zip_fd);
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "New offset of central dir : $v_offset");
+
+        // ----- Re-Create the Central Dir files header
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Creates the new central directory");
+        for ($i=0; $i<sizeof($v_header_list); $i++) {
+            // ----- Create the file header
+            //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Offset of file : ".$v_header_list[$i]['offset']);
+            if (($v_result = $v_temp_zip->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
+                $v_temp_zip->privCloseFd();
+                $this->privCloseFd();
+                @unlink($v_zip_temp_name);
+
+                // ----- Return
+                //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+                return $v_result;
+            }
+
+            // ----- Transform the header to a 'usable' info
+            $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
+        }
+
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Creates the central directory footer");
+
+        // ----- Zip file comment
+        $v_comment = '';
+        if (isset($p_options[PCLZIP_OPT_COMMENT])) {
+          $v_comment = $p_options[PCLZIP_OPT_COMMENT];
+        }
+
+        // ----- Calculate the size of the central header
+        $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset;
+
+        // ----- Create the central dir footer
+        if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) {
+            // ----- Reset the file list
+            unset($v_header_list);
+            $v_temp_zip->privCloseFd();
+            $this->privCloseFd();
+            @unlink($v_zip_temp_name);
+
+            // ----- Return
+            //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+            return $v_result;
+        }
+
+        // ----- Close
+        $v_temp_zip->privCloseFd();
+        $this->privCloseFd();
+
+        // ----- Delete the zip file
+        // TBC : I should test the result ...
+        @unlink($this->zipname);
+
+        // ----- Rename the temporary file
+        // TBC : I should test the result ...
+        //@rename($v_zip_temp_name, $this->zipname);
+        PclZipUtilRename($v_zip_temp_name, $this->zipname);
+
+        // ----- Destroy the temporary archive
+        unset($v_temp_zip);
+    }
+
+    // ----- Remove every files : reset the file
+    else if ($v_central_dir['entries'] != 0) {
+        $this->privCloseFd();
+
+        if (($v_result = $this->privOpenFd('wb')) != 1) {
+          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+          return $v_result;
+        }
+
+        if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) {
+          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+          return $v_result;
+        }
+
+        $this->privCloseFd();
+    }
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privDirCheck()
+  // Description :
+  //   Check if a directory exists, if not it creates it and all the parents directory
+  //   which may be useful.
+  // Parameters :
+  //   $p_dir : Directory path to check.
+  // Return Values :
+  //    1 : OK
+  //   -1 : Unable to create directory
+  // --------------------------------------------------------------------------------
+  function privDirCheck($p_dir, $p_is_dir=false)
+  {
+    $v_result = 1;
+
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privDirCheck", "entry='$p_dir', is_dir='".($p_is_dir?"true":"false")."'");
+
+    // ----- Remove the final '/'
+    if (($p_is_dir) && (substr($p_dir, -1)=='/'))
+    {
+      $p_dir = substr($p_dir, 0, strlen($p_dir)-1);
+    }
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Looking for entry '$p_dir'");
+
+    // ----- Check the directory availability
+    if ((is_dir($p_dir)) || ($p_dir == ""))
+    {
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, "'$p_dir' is a directory");
+      return 1;
+    }
+
+    // ----- Extract parent directory
+    $p_parent_dir = dirname($p_dir);
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Parent directory is '$p_parent_dir'");
+
+    // ----- Just a check
+    if ($p_parent_dir != $p_dir)
+    {
+      // ----- Look for parent directory
+      if ($p_parent_dir != "")
+      {
+        if (($v_result = $this->privDirCheck($p_parent_dir)) != 1)
+        {
+          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+          return $v_result;
+        }
+      }
+    }
+
+    // ----- Create the directory
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Create directory '$p_dir'");
+    if (!@mkdir($p_dir, 0777))
+    {
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'");
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+      return PclZip::errorCode();
+    }
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result, "Directory '$p_dir' created");
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privMerge()
+  // Description :
+  //   If $p_archive_to_add does not exist, the function exit with a success result.
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privMerge(&$p_archive_to_add)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privMerge", "archive='".$p_archive_to_add->zipname."'");
+    $v_result=1;
+
+    // ----- Look if the archive_to_add exists
+    if (!is_file($p_archive_to_add->zipname))
+    {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive to add does not exist. End of merge.");
+
+      // ----- Nothing to merge, so merge is a success
+      $v_result = 1;
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+    }
+
+    // ----- Look if the archive exists
+    if (!is_file($this->zipname))
+    {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive does not exist, duplicate the archive_to_add.");
+
+      // ----- Do a duplicate
+      $v_result = $this->privDuplicate($p_archive_to_add->zipname);
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+    }
+
+    // ----- Open the zip file
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
+    if (($v_result=$this->privOpenFd('rb')) != 1)
+    {
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+    }
+
+    // ----- Read the central directory informations
+    $v_central_dir = array();
+    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
+    {
+      $this->privCloseFd();
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+    }
+
+    // ----- Go to beginning of File
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in zip : ".ftell($this->zip_fd)."'");
+    @rewind($this->zip_fd);
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in zip : ".ftell($this->zip_fd)."'");
+
+    // ----- Open the archive_to_add file
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open archive_to_add in binary read mode");
+    if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1)
+    {
+      $this->privCloseFd();
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+    }
+
+    // ----- Read the central directory informations
+    $v_central_dir_to_add = array();
+    if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1)
+    {
+      $this->privCloseFd();
+      $p_archive_to_add->privCloseFd();
+
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+    }
+
+    // ----- Go to beginning of File
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in archive_to_add : ".ftell($p_archive_to_add->zip_fd)."'");
+    @rewind($p_archive_to_add->zip_fd);
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in archive_to_add : ".ftell($p_archive_to_add->zip_fd)."'");
+
+    // ----- Creates a temporay file
+    $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';
+
+    // ----- Open the temporary file in write mode
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
+    if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0)
+    {
+      $this->privCloseFd();
+      $p_archive_to_add->privCloseFd();
+
+      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode');
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+      return PclZip::errorCode();
+    }
+
+    // ----- Copy the files from the archive to the temporary file
+    // TBC : Here I should better append the file and go back to erase the central dir
+    $v_size = $v_central_dir['offset'];
+    while ($v_size != 0)
+    {
+      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
+      $v_buffer = fread($this->zip_fd, $v_read_size);
+      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
+      $v_size -= $v_read_size;
+    }
+
+    // ----- Copy the files from the archive_to_add into the temporary file
+    $v_size = $v_central_dir_to_add['offset'];
+    while ($v_size != 0)
+    {
+      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
+      $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size);
+      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
+      $v_size -= $v_read_size;
+    }
+
+    // ----- Store the offset of the central dir
+    $v_offset = @ftell($v_zip_temp_fd);
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "New offset of central dir : $v_offset");
+
+    // ----- Copy the block of file headers from the old archive
+    $v_size = $v_central_dir['size'];
+    while ($v_size != 0)
+    {
+      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
+      $v_buffer = @fread($this->zip_fd, $v_read_size);
+      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
+      $v_size -= $v_read_size;
+    }
+
+    // ----- Copy the block of file headers from the archive_to_add
+    $v_size = $v_central_dir_to_add['size'];
+    while ($v_size != 0)
+    {
+      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
+      $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size);
+      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
+      $v_size -= $v_read_size;
+    }
+
+    // ----- Merge the file comments
+    $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment'];
+
+    // ----- Calculate the size of the (new) central header
+    $v_size = @ftell($v_zip_temp_fd)-$v_offset;
+
+    // ----- Swap the file descriptor
+    // Here is a trick : I swap the temporary fd with the zip fd, in order to use
+    // the following methods on the temporary fil and not the real archive fd
+    $v_swap = $this->zip_fd;
+    $this->zip_fd = $v_zip_temp_fd;
+    $v_zip_temp_fd = $v_swap;
+
+    // ----- Create the central dir footer
+    if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1)
+    {
+      $this->privCloseFd();
+      $p_archive_to_add->privCloseFd();
+      @fclose($v_zip_temp_fd);
+      $this->zip_fd = null;
+
+      // ----- Reset the file list
+      unset($v_header_list);
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+    }
+
+    // ----- Swap back the file descriptor
+    $v_swap = $this->zip_fd;
+    $this->zip_fd = $v_zip_temp_fd;
+    $v_zip_temp_fd = $v_swap;
+
+    // ----- Close
+    $this->privCloseFd();
+    $p_archive_to_add->privCloseFd();
+
+    // ----- Close the temporary file
+    @fclose($v_zip_temp_fd);
+
+    // ----- Delete the zip file
+    // TBC : I should test the result ...
+    @unlink($this->zipname);
+
+    // ----- Rename the temporary file
+    // TBC : I should test the result ...
+    //@rename($v_zip_temp_name, $this->zipname);
+    PclZipUtilRename($v_zip_temp_name, $this->zipname);
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privDuplicate()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privDuplicate($p_archive_filename)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privDuplicate", "archive_filename='$p_archive_filename'");
+    $v_result=1;
+
+    // ----- Look if the $p_archive_filename exists
+    if (!is_file($p_archive_filename))
+    {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive to duplicate does not exist. End of duplicate.");
+
+      // ----- Nothing to duplicate, so duplicate is a success.
+      $v_result = 1;
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+    }
+
+    // ----- Open the zip file
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
+    if (($v_result=$this->privOpenFd('wb')) != 1)
+    {
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+    }
+
+    // ----- Open the temporary file in write mode
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode");
+    if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0)
+    {
+      $this->privCloseFd();
+
+      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \''.$p_archive_filename.'\' in binary write mode');
+
+      // ----- Return
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo());
+      return PclZip::errorCode();
+    }
+
+    // ----- Copy the files from the archive to the temporary file
+    // TBC : Here I should better append the file and go back to erase the central dir
+    $v_size = filesize($p_archive_filename);
+    while ($v_size != 0)
+    {
+      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Read $v_read_size bytes");
+      $v_buffer = fread($v_zip_temp_fd, $v_read_size);
+      @fwrite($this->zip_fd, $v_buffer, $v_read_size);
+      $v_size -= $v_read_size;
+    }
+
+    // ----- Close
+    $this->privCloseFd();
+
+    // ----- Close the temporary file
+    @fclose($v_zip_temp_fd);
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privErrorLog()
+  // Description :
+  // Parameters :
+  // --------------------------------------------------------------------------------
+  function privErrorLog($p_error_code=0, $p_error_string='')
+  {
+    if (PCLZIP_ERROR_EXTERNAL == 1) {
+      PclError($p_error_code, $p_error_string);
+    }
+    else {
+      $this->error_code = $p_error_code;
+      $this->error_string = $p_error_string;
+    }
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privErrorReset()
+  // Description :
+  // Parameters :
+  // --------------------------------------------------------------------------------
+  function privErrorReset()
+  {
+    if (PCLZIP_ERROR_EXTERNAL == 1) {
+      PclErrorReset();
+    }
+    else {
+      $this->error_code = 0;
+      $this->error_string = '';
+    }
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privDecrypt()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privDecrypt($p_encryption_header, &$p_buffer, $p_size, $p_crc)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privDecrypt', "size=".$p_size."");
+    $v_result=1;
+
+    // ----- To Be Modified ;-)
+    $v_pwd = "test";
+
+    $p_buffer = PclZipUtilZipDecrypt($p_buffer, $p_size, $p_encryption_header,
+	                                 $p_crc, $v_pwd);
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privDisableMagicQuotes()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privDisableMagicQuotes()
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privDisableMagicQuotes', "");
+    $v_result=1;
+
+    // ----- Look if function exists
+    if (   (!function_exists("get_magic_quotes_runtime"))
+	    || (!function_exists("set_magic_quotes_runtime"))) {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Functions *et_magic_quotes_runtime are not supported");
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+	}
+
+    // ----- Look if already done
+    if ($this->magic_quotes_status != -1) {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "magic_quote already disabled");
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+	}
+
+	// ----- Get and memorize the magic_quote value
+	$this->magic_quotes_status = @get_magic_quotes_runtime();
+    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Current magic_quotes_runtime status is '".($this->magic_quotes_status==0?'disable':'enable')."'");
+
+	// ----- Disable magic_quotes
+	if ($this->magic_quotes_status == 1) {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Disable magic_quotes");
+	  @set_magic_quotes_runtime(0);
+	}
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privSwapBackMagicQuotes()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privSwapBackMagicQuotes()
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privSwapBackMagicQuotes', "");
+    $v_result=1;
+
+    // ----- Look if function exists
+    if (   (!function_exists("get_magic_quotes_runtime"))
+	    || (!function_exists("set_magic_quotes_runtime"))) {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Functions *et_magic_quotes_runtime are not supported");
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+	}
+
+    // ----- Look if something to do
+    if ($this->magic_quotes_status != -1) {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "magic_quote not modified");
+      //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+      return $v_result;
+	}
+
+	// ----- Swap back magic_quotes
+	if ($this->magic_quotes_status == 1) {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Enable back magic_quotes");
+  	  @set_magic_quotes_runtime($this->magic_quotes_status);
+	}
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  }
+  // End of class
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : PclZipUtilPathReduction()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function PclZipUtilPathReduction($p_dir)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilPathReduction", "dir='$p_dir'");
+    $v_result = "";
+
+    // ----- Look for not empty path
+    if ($p_dir != "") {
+      // ----- Explode path by directory names
+      $v_list = explode("/", $p_dir);
+
+      // ----- Study directories from last to first
+      $v_skip = 0;
+      for ($i=sizeof($v_list)-1; $i>=0; $i--) {
+        // ----- Look for current path
+        if ($v_list[$i] == ".") {
+          // ----- Ignore this directory
+          // Should be the first $i=0, but no check is done
+        }
+        else if ($v_list[$i] == "..") {
+		  $v_skip++;
+        }
+        else if ($v_list[$i] == "") {
+		  // ----- First '/' i.e. root slash
+		  if ($i == 0) {
+            $v_result = "/".$v_result;
+		    if ($v_skip > 0) {
+		        // ----- It is an invalid path, so the path is not modified
+		        // TBC
+		        $v_result = $p_dir;
+                //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Invalid path is unchanged");
+                $v_skip = 0;
+		    }
+		  }
+		  // ----- Last '/' i.e. indicates a directory
+		  else if ($i == (sizeof($v_list)-1)) {
+            $v_result = $v_list[$i];
+		  }
+		  // ----- Double '/' inside the path
+		  else {
+            // ----- Ignore only the double '//' in path,
+            // but not the first and last '/'
+		  }
+        }
+        else {
+		  // ----- Look for item to skip
+		  if ($v_skip > 0) {
+		    $v_skip--;
+		  }
+		  else {
+            $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:"");
+		  }
+        }
+      }
+
+      // ----- Look for skip
+      if ($v_skip > 0) {
+        while ($v_skip > 0) {
+            $v_result = '../'.$v_result;
+            $v_skip--;
+        }
+      }
+    }
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : PclZipUtilPathInclusion()
+  // Description :
+  //   This function indicates if the path $p_path is under the $p_dir tree. Or,
+  //   said in an other way, if the file or sub-dir $p_path is inside the dir
+  //   $p_dir.
+  //   The function indicates also if the path is exactly the same as the dir.
+  //   This function supports path with duplicated '/' like '//', but does not
+  //   support '.' or '..' statements.
+  // Parameters :
+  // Return Values :
+  //   0 if $p_path is not inside directory $p_dir
+  //   1 if $p_path is inside directory $p_dir
+  //   2 if $p_path is exactly the same as $p_dir
+  // --------------------------------------------------------------------------------
+  function PclZipUtilPathInclusion($p_dir, $p_path)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilPathInclusion", "dir='$p_dir', path='$p_path'");
+    $v_result = 1;
+
+    // ----- Look for path beginning by ./
+    if (   ($p_dir == '.')
+        || ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) {
+      $p_dir = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_dir, 1);
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Replacing ./ by full path in p_dir '".$p_dir."'");
+    }
+    if (   ($p_path == '.')
+        || ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) {
+      $p_path = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_path, 1);
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Replacing ./ by full path in p_path '".$p_path."'");
+    }
+
+    // ----- Explode dir and path by directory separator
+    $v_list_dir = explode("/", $p_dir);
+    $v_list_dir_size = sizeof($v_list_dir);
+    $v_list_path = explode("/", $p_path);
+    $v_list_path_size = sizeof($v_list_path);
+
+    // ----- Study directories paths
+    $i = 0;
+    $j = 0;
+    while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Working on dir($i)='".$v_list_dir[$i]."' and path($j)='".$v_list_path[$j]."'");
+
+      // ----- Look for empty dir (path reduction)
+      if ($v_list_dir[$i] == '') {
+        $i++;
+        continue;
+      }
+      if ($v_list_path[$j] == '') {
+        $j++;
+        continue;
+      }
+
+      // ----- Compare the items
+      if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ( $v_list_path[$j] != ''))  {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Items ($i,$j) are different");
+        $v_result = 0;
+      }
+
+      // ----- Next items
+      $i++;
+      $j++;
+    }
+
+    // ----- Look if everything seems to be the same
+    if ($v_result) {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Look for tie break");
+      // ----- Skip all the empty items
+      while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++;
+      while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++;
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Looking on dir($i)='".($i < $v_list_dir_size?$v_list_dir[$i]:'')."' and path($j)='".($j < $v_list_path_size?$v_list_path[$j]:'')."'");
+
+      if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) {
+        // ----- There are exactly the same
+        $v_result = 2;
+      }
+      else if ($i < $v_list_dir_size) {
+        // ----- The path is shorter than the dir
+        $v_result = 0;
+      }
+    }
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : PclZipUtilCopyBlock()
+  // Description :
+  // Parameters :
+  //   $p_mode : read/write compression mode
+  //             0 : src & dest normal
+  //             1 : src gzip, dest normal
+  //             2 : src normal, dest gzip
+  //             3 : src & dest gzip
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode=0)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilCopyBlock", "size=$p_size, mode=$p_mode");
+    $v_result = 1;
+
+    if ($p_mode==0)
+    {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Src offset before read :".(@ftell($p_src)));
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Dest offset before write :".(@ftell($p_dest)));
+      while ($p_size != 0)
+      {
+        $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
+        $v_buffer = @fread($p_src, $v_read_size);
+        @fwrite($p_dest, $v_buffer, $v_read_size);
+        $p_size -= $v_read_size;
+      }
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Src offset after read :".(@ftell($p_src)));
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Dest offset after write :".(@ftell($p_dest)));
+    }
+    else if ($p_mode==1)
+    {
+      while ($p_size != 0)
+      {
+        $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
+        $v_buffer = @gzread($p_src, $v_read_size);
+        @fwrite($p_dest, $v_buffer, $v_read_size);
+        $p_size -= $v_read_size;
+      }
+    }
+    else if ($p_mode==2)
+    {
+      while ($p_size != 0)
+      {
+        $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
+        $v_buffer = @fread($p_src, $v_read_size);
+        @gzwrite($p_dest, $v_buffer, $v_read_size);
+        $p_size -= $v_read_size;
+      }
+    }
+    else if ($p_mode==3)
+    {
+      while ($p_size != 0)
+      {
+        $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes");
+        $v_buffer = @gzread($p_src, $v_read_size);
+        @gzwrite($p_dest, $v_buffer, $v_read_size);
+        $p_size -= $v_read_size;
+      }
+    }
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : PclZipUtilRename()
+  // Description :
+  //   This function tries to do a simple rename() function. If it fails, it
+  //   tries to copy the $p_src file in a new $p_dest file and then unlink the
+  //   first one.
+  // Parameters :
+  //   $p_src : Old filename
+  //   $p_dest : New filename
+  // Return Values :
+  //   1 on success, 0 on failure.
+  // --------------------------------------------------------------------------------
+  function PclZipUtilRename($p_src, $p_dest)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilRename", "source=$p_src, destination=$p_dest");
+    $v_result = 1;
+
+    // ----- Try to rename the files
+    if (!@rename($p_src, $p_dest)) {
+      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Fail to rename file, try copy+unlink");
+
+      // ----- Try to copy & unlink the src
+      if (!@copy($p_src, $p_dest)) {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Fail to copy file");
+        $v_result = 0;
+      }
+      else if (!@unlink($p_src)) {
+        //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Fail to unlink old filename");
+        $v_result = 0;
+      }
+    }
+
+    // ----- Return
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : PclZipUtilOptionText()
+  // Description :
+  //   Translate option value in text. Mainly for debug purpose.
+  // Parameters :
+  //   $p_option : the option value.
+  // Return Values :
+  //   The option text value.
+  // --------------------------------------------------------------------------------
+  function PclZipUtilOptionText($p_option)
+  {
+    //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilOptionText", "option='".$p_option."'");
+
+    $v_list = get_defined_constants();
+    for (reset($v_list); $v_key = key($v_list); next($v_list)) {
+	  $v_prefix = substr($v_key, 0, 10);
+	  if ((   ($v_prefix == 'PCLZIP_OPT')
+         || ($v_prefix == 'PCLZIP_CB_')
+         || ($v_prefix == 'PCLZIP_ATT'))
+	      && ($v_list[$v_key] == $p_option)) {
+          //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_key);
+          return $v_key;
+	    }
+    }
+
+    $v_result = 'Unknown';
+
+    //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : PclZipUtilTranslateWinPath()
+  // Description :
+  //   Translate windows path by replacing '\' by '/' and optionally removing
+  //   drive letter.
+  // Parameters :
+  //   $p_path : path to translate.
+  //   $p_remove_disk_letter : true | false
+  // Return Values :
+  //   The path translated.
+  // --------------------------------------------------------------------------------
+  function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter=true)
+  {
+    if (stristr(php_uname(), 'windows')) {
+      // ----- Look for potential disk letter
+      if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) {
+          $p_path = substr($p_path, $v_position+1);
+      }
+      // ----- Change potential windows directory separator
+      if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) {
+          $p_path = strtr($p_path, '\\', '/');
+      }
+    }
+    return $p_path;
+  }
+  // --------------------------------------------------------------------------------
+
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/class-wp-filesystem-direct.php 2.5.src/wp-admin/includes/class-wp-filesystem-direct.php
--- 2.2.2.src/wp-admin/includes/class-wp-filesystem-direct.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/class-wp-filesystem-direct.php	2008-03-20 12:22:43.000000000 -0500
@@ -0,0 +1,336 @@
+<?php
+
+class WP_Filesystem_Direct{
+	var $permission = null;
+	var $errors = array();
+	function WP_Filesystem_Direct($arg){
+		$this->errors = new WP_Error();
+		$this->permission = umask();
+	}
+	function connect(){
+		return true;
+	}
+	function setDefaultPermissions($perm){
+		$this->permission = $perm;
+	}
+	function find_base_dir($base = '.', $echo = false){
+		return str_replace('\\','/',ABSPATH);
+	}
+	function get_base_dir($base = '.', $echo = false){
+		return $this->find_base_dir($base, $echo);
+	}
+	function get_contents($file){
+		return @file_get_contents($file);
+	}
+	function get_contents_array($file){
+		return @file($file);
+	}
+	function put_contents($file,$contents,$mode=false,$type=''){
+		$fp=@fopen($file,'w'.$type);
+		if (!$fp)
+			return false;
+		@fwrite($fp,$contents);
+		@fclose($fp);
+		$this->chmod($file,$mode);
+		return true;
+	}
+	function cwd(){
+		return @getcwd();
+	}
+	function chgrp($file,$group,$recursive=false){
+		if( ! $this->exists($file) )
+			return false;
+		if( ! $recursive )
+			return @chgrp($file,$group);
+		if( ! $this->is_dir($file) )
+			return @chgrp($file,$group);
+		//Is a directory, and we want recursive
+		$filelist = $this->dirlist($file);
+		foreach($filelist as $filename){
+			$this->chgrp($file.'/'.$filename,$group,$recursive);
+		}
+		return true;
+	}
+	function chmod($file,$mode=false,$recursive=false){
+		if( ! $mode )
+			$mode = $this->permission;
+		if( ! $this->exists($file) )
+			return false;
+		if( ! $recursive )
+			return @chmod($file,$mode);
+		if( ! $this->is_dir($file) )
+			return @chmod($file,$mode);
+		//Is a directory, and we want recursive
+		$filelist = $this->dirlist($file);
+		foreach($filelist as $filename){
+			$this->chmod($file.'/'.$filename,$mode,$recursive);
+		}
+		return true;
+	}
+	function chown($file,$owner,$recursive=false){
+		if( ! $this->exists($file) )
+			return false;
+		if( ! $recursive )
+			return @chown($file,$owner);
+		if( ! $this->is_dir($file) )
+			return @chown($file,$owner);
+		//Is a directory, and we want recursive
+		$filelist = $this->dirlist($file);
+		foreach($filelist as $filename){
+			$this->chown($file.'/'.$filename,$owner,$recursive);
+		}
+		return true;
+	}
+	function owner($file){
+		$owneruid=@fileowner($file);
+		if( ! $owneruid )
+			return false;
+		if( !function_exists('posix_getpwuid') )
+			return $owneruid;
+		$ownerarray=posix_getpwuid($owneruid);
+		return $ownerarray['name'];
+	}
+	function getchmod($file){
+		return @fileperms($file);
+	}
+	function gethchmod($file){
+		//From the PHP.net page for ...?
+		$perms = $this->getchmod($file);
+		if (($perms & 0xC000) == 0xC000) {
+			// Socket
+			$info = 's';
+		} elseif (($perms & 0xA000) == 0xA000) {
+			// Symbolic Link
+			$info = 'l';
+		} elseif (($perms & 0x8000) == 0x8000) {
+			// Regular
+			$info = '-';
+		} elseif (($perms & 0x6000) == 0x6000) {
+			// Block special
+			$info = 'b';
+		} elseif (($perms & 0x4000) == 0x4000) {
+			// Directory
+			$info = 'd';
+		} elseif (($perms & 0x2000) == 0x2000) {
+			// Character special
+			$info = 'c';
+		} elseif (($perms & 0x1000) == 0x1000) {
+			// FIFO pipe
+			$info = 'p';
+		} else {
+			// Unknown
+			$info = 'u';
+		}
+
+		// Owner
+		$info .= (($perms & 0x0100) ? 'r' : '-');
+		$info .= (($perms & 0x0080) ? 'w' : '-');
+		$info .= (($perms & 0x0040) ?
+					(($perms & 0x0800) ? 's' : 'x' ) :
+					(($perms & 0x0800) ? 'S' : '-'));
+
+		// Group
+		$info .= (($perms & 0x0020) ? 'r' : '-');
+		$info .= (($perms & 0x0010) ? 'w' : '-');
+		$info .= (($perms & 0x0008) ?
+					(($perms & 0x0400) ? 's' : 'x' ) :
+					(($perms & 0x0400) ? 'S' : '-'));
+
+		// World
+		$info .= (($perms & 0x0004) ? 'r' : '-');
+		$info .= (($perms & 0x0002) ? 'w' : '-');
+		$info .= (($perms & 0x0001) ?
+					(($perms & 0x0200) ? 't' : 'x' ) :
+					(($perms & 0x0200) ? 'T' : '-'));
+		return $info;
+	}
+	function getnumchmodfromh($mode) {
+		$realmode = "";
+		$legal =  array("","w","r","x","-");
+		$attarray = preg_split("//",$mode);
+		for($i=0;$i<count($attarray);$i++){
+		   if($key = array_search($attarray[$i],$legal)){
+			   $realmode .= $legal[$key];
+		   }
+		}
+		$mode = str_pad($realmode,9,'-');
+		$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
+		$mode = strtr($mode,$trans);
+		$newmode = '';
+		$newmode .= $mode[0]+$mode[1]+$mode[2];
+		$newmode .= $mode[3]+$mode[4]+$mode[5];
+		$newmode .= $mode[6]+$mode[7]+$mode[8];
+		return $newmode;
+	}
+	function group($file){
+		$gid=@filegroup($file);
+		if( ! $gid )
+			return false;
+		if( !function_exists('posix_getgrgid') )
+			return $gid;
+		$grouparray=posix_getgrgid($gid);
+		return $grouparray['name'];
+	}
+
+	function copy($source,$destination,$overwrite=false){
+		if( $overwrite && $this->exists($destination) )
+			return false;
+		return copy($source,$destination);
+	}
+
+	function move($source,$destination,$overwrite=false){
+		//Possible to use rename()
+		if( $this->copy($source,$destination,$overwrite) && $this->exists($destination) ){
+			$this->delete($source);
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+	function delete($file,$recursive=false){
+		$file = str_replace('\\','/',$file); //for win32, occasional problems deleteing files otherwise
+
+		if( $this->is_file($file) )
+			return @unlink($file);
+
+		if( !$recursive && $this->is_dir($file) )
+			return @rmdir($file);
+
+		$filelist = $this->dirlist($file);
+		if( ! $filelist )
+			return true; //No files exist, Say we've deleted them
+
+		$retval = true;
+		foreach($filelist as $filename=>$fileinfo){
+			if( ! $this->delete($file.'/'.$filename,$recursive) )
+				$retval = false;
+		}
+		if( ! @rmdir($file) )
+			return false;
+		return $retval;
+	}
+
+	function exists($file){
+		return @file_exists($file);
+	}
+
+	function is_file($file){
+		return @is_file($file);
+	}
+
+	function is_dir($path){
+		return @is_dir($path);
+	}
+
+	function is_readable($file){
+			return @is_readable($file);
+	}
+
+	function is_writable($file){
+		return @is_writable($file);
+	}
+
+	function atime($file){
+		return @fileatime($file);
+	}
+
+	function mtime($file){
+		return @filemtime($file);
+	}
+	function size($file){
+		return @filesize($file);
+	}
+
+	function touch($file,$time=0,$atime=0){
+		if($time==0)
+			$time = time();
+		if($atime==0)
+			$atime = time();
+		return @touch($file,$time,$atime);
+	}
+
+	function mkdir($path,$chmod=false,$chown=false,$chgrp=false){
+		if( ! $chmod)
+			$chmod = $this->permission;
+
+		if( !@mkdir($path,$chmod) )
+			return false;
+		if( $chown )
+			$this->chown($path,$chown);
+		if( $chgrp )
+			$this->chgrp($path,$chgrp);
+		return true;
+	}
+
+	function rmdir($path,$recursive=false){
+		if( ! $recursive )
+			return @rmdir($path);
+		//recursive:
+		$filelist = $this->dirlist($path);
+		foreach($filelist as $filename=>$det){
+			if ( '/' == substr($filename,-1,1) )
+				$this->rmdir($path.'/'.$filename,$recursive);
+			@rmdir($filename);
+		}
+		return @rmdir($path);
+	}
+
+	function dirlist($path,$incdot=false,$recursive=false){
+		if( $this->is_file($path) ){
+			$limitFile = basename($path);
+			$path = dirname($path);
+		} else {
+			$limitFile = false;
+		}
+		if( ! $this->is_dir($path) )
+			return false;
+
+		$ret = array();
+		$dir = dir($path);
+		while (false !== ($entry = $dir->read())) {
+			$struc = array();
+			$struc['name'] 		= $entry;
+
+			if( '.' == $struc['name'][0] && !$incdot)
+				continue;
+			if( $limitFile && $struc['name'] != $limitFile)
+				continue;
+
+			$struc['perms'] 	= $this->gethchmod($path.'/'.$entry);
+			$struc['permsn']	= $this->getnumchmodfromh($struc['perms']);
+			$struc['number'] 	= false;
+			$struc['owner']    	= $this->owner($path.'/'.$entry);
+			$struc['group']    	= $this->group($path.'/'.$entry);
+			$struc['size']    	= $this->size($path.'/'.$entry);
+			$struc['lastmodunix']= $this->mtime($path.'/'.$entry);
+			$struc['lastmod']   = date('M j',$struc['lastmodunix']);
+			$struc['time']    	= date('h:i:s',$struc['lastmodunix']);
+			$struc['type']		= $this->is_dir($path.'/'.$entry) ? 'd' : 'f';
+			if ('d' == $struc['type'] ){
+				$struc['files'] = array();
+
+				if( $incdot ){
+					//We're including the doted starts
+					if( '.' != $struc['name'] && '..' != $struc['name'] ){ //Ok, It isnt a special folder
+						if ($recursive)
+							$struc['files'] = $this->dirlist($path.'/'.$struc['name'],$incdot,$recursive);
+					}
+				} else { //No dots
+					if ($recursive)
+						$struc['files'] = $this->dirlist($path.'/'.$struc['name'],$incdot,$recursive);
+				}
+			}
+			//File
+			$ret[$struc['name']] = $struc;
+		}
+		$dir->close();
+		unset($dir);
+		return $ret;
+	}
+
+	function __destruct(){
+		return;
+	}
+}
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/class-wp-filesystem-ftpext.php 2.5.src/wp-admin/includes/class-wp-filesystem-ftpext.php
--- 2.2.2.src/wp-admin/includes/class-wp-filesystem-ftpext.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/class-wp-filesystem-ftpext.php	2008-03-21 00:15:21.000000000 -0500
@@ -0,0 +1,507 @@
+<?php
+class WP_Filesystem_FTPext{
+	var $link;
+	var $timeout = 5;
+	var $errors = array();
+	var $options = array();
+
+	var $wp_base = '';
+	var $permission = null;
+
+	var $filetypes = array(
+							'php'=>FTP_ASCII,
+							'css'=>FTP_ASCII,
+							'txt'=>FTP_ASCII,
+							'js'=>FTP_ASCII,
+							'html'=>FTP_ASCII,
+							'htm'=>FTP_ASCII,
+							'xml'=>FTP_ASCII,
+
+							'jpg'=>FTP_BINARY,
+							'png'=>FTP_BINARY,
+							'gif'=>FTP_BINARY,
+							'bmp'=>FTP_BINARY
+							);
+
+	function WP_Filesystem_FTPext($opt='') {
+		$this->errors = new WP_Error();
+
+		//Check if possible to use ftp functions.
+		if ( ! extension_loaded('ftp') ) {
+			$this->errors->add('no_ftp_ext', __('The ftp PHP extension is not available'));
+			return false;
+		}
+
+		// Set defaults:
+		if ( empty($opt['port']) )
+			$this->options['port'] = 21;
+		else
+			$this->options['port'] = $opt['port'];
+
+		if ( empty($opt['hostname']) )
+			$this->errors->add('empty_hostname', __('FTP hostname is required'));
+		else
+			$this->options['hostname'] = $opt['hostname'];
+
+		if ( isset($opt['base']) && ! empty($opt['base']) )
+			$this->wp_base = $opt['base'];
+
+		// Check if the options provided are OK.
+		if ( empty ($opt['username']) )
+			$this->errors->add('empty_username', __('FTP username is required'));
+		else
+			$this->options['username'] = $opt['username'];
+
+		if ( empty ($opt['password']) )
+			$this->errors->add('empty_password', __('FTP password is required'));
+		else
+			$this->options['password'] = $opt['password'];
+
+		$this->options['ssl'] = ( !empty($opt['ssl']) );
+	}
+
+	function connect(){
+		if ( $this->options['ssl'] && function_exists('ftp_ssl_connect') ) {
+			$this->link = @ftp_ssl_connect($this->options['hostname'], $this->options['port'],$this->timeout);
+		} else {
+			$this->link = @ftp_connect($this->options['hostname'], $this->options['port'],$this->timeout);
+		}
+
+		if ( ! $this->link ) {
+			$this->errors->add('connect', sprintf(__('Failed to connect to FTP Server %1$s:%2$s'), $this->options['hostname'], $this->options['port']));
+			return false;
+		}
+
+		if ( ! @ftp_login($this->link,$this->options['username'], $this->options['password']) ) {
+			$this->errors->add('auth', sprintf(__('Username/Password incorrect for %s'), $this->options['username']));
+			return false;
+		}
+
+		return true;
+	}
+
+	function setDefaultPermissions($perm){
+		$this->permission = $perm;
+	}
+
+	function find_base_dir($base = '.',$echo = false, $loop = false) {
+		//Sanitize the Windows path formats, This allows easier conparison and aligns it to FTP output.
+		$abspath = str_replace('\\','/',ABSPATH); //windows: Straighten up the paths..
+		if( strpos($abspath, ':') ){ //Windows, Strip out the driveletter
+			if( preg_match("|.{1}\:(.+)|i", $abspath, $mat) )
+				$abspath = $mat[1];
+		}
+	
+		//Set up the base directory (Which unless specified, is the current one)
+		if( empty( $base ) || '.' == $base ) $base = $this->cwd();
+		$base = trailingslashit($base);
+
+		//Can we see the Current directory as part of the ABSPATH?
+		$location = strpos($abspath, $base);
+		if( false !== $location ) {
+			$newbase = path_join($base, substr($abspath, $location + strlen($base)));
+
+			if( false !== $this->chdir($newbase) ){ //chdir sometimes returns null under certain circumstances, even when its changed correctly, FALSE will be returned if it doesnt change correctly.
+				if($echo) printf( __('Changing to %s') . '<br/>', $newbase );
+				//Check to see if it exists in that folder.
+				if( $this->exists($newbase . 'wp-settings.php') ){
+					if($echo) printf( __('Found %s'),  $newbase . 'wp-settings.php<br/>' );
+					return $newbase;
+				}	
+			}
+		}
+	
+		//Ok, Couldnt do a magic location from that particular folder level
+		
+		//Get a list of the files in the current directory, See if we can locate where we are in the folder stucture.
+		$files = $this->dirlist($base);
+		
+		$arrPath = explode('/', $abspath);
+		foreach($arrPath as $key){
+			//Working from /home/ to /user/ to /wordpress/ see if that file exists within the current folder, 
+			// If its found, change into it and follow through looking for it. 
+			// If it cant find WordPress down that route, it'll continue onto the next folder level, and see if that matches, and so on.
+			// If it reaches the end, and still cant find it, it'll return false for the entire function.
+			if( isset($files[ $key ]) ){
+				//Lets try that folder:
+				$folder = path_join($base, $key);
+				if($echo) printf( __('Changing to %s') . '<br/>', $folder );
+				$ret = $this->find_base_dir( $folder, $echo, $loop);
+				if( $ret )
+					return $ret;
+			}
+		}
+		//Only check this as a last resort, to prevent locating the incorrect install. All above proceeedures will fail quickly if this is the right branch to take.
+		if(isset( $files[ 'wp-settings.php' ]) ){
+			if($echo) printf( __('Found %s'),  $base . 'wp-settings.php<br/>' );
+			return $base;
+		}
+		if( $loop )
+			return false;//Prevent tihs function looping again.
+		//As an extra last resort, Change back to / if the folder wasnt found. This comes into effect when the CWD is /home/user/ but WP is at /var/www/.... mainly dedicated setups.
+		return $this->find_base_dir('/', $echo, true); 
+	}
+
+	function get_base_dir($base = '.', $echo = false){
+		if( defined('FTP_BASE') )
+			$this->wp_base = FTP_BASE;
+		if( empty($this->wp_base) )
+			$this->wp_base = $this->find_base_dir($base,$echo);
+		return $this->wp_base;
+	}
+	function get_contents($file,$type='',$resumepos=0){
+		if( empty($type) ){
+			$extension = substr(strrchr($file, "."), 1);
+			$type = isset($this->filetypes[ $extension ]) ? $this->filetypes[ $extension ] : FTP_ASCII;
+		}
+		$temp = tmpfile();
+		if ( ! $temp )
+			return false;
+		if( ! @ftp_fget($this->link,$temp,$file,$type,$resumepos) )
+			return false;
+		fseek($temp, 0); //Skip back to the start of the file being written to
+		$contents = '';
+		while (!feof($temp)) {
+			$contents .= fread($temp, 8192);
+		}
+		fclose($temp);
+		return $contents;
+	}
+	function get_contents_array($file){
+		return explode("\n",$this->get_contents($file));
+	}
+	function put_contents($file,$contents,$type=''){
+		if( empty($type) ){
+			$extension = substr(strrchr($file, "."), 1);
+			$type = isset($this->filetypes[ $extension ]) ? $this->filetypes[ $extension ] : FTP_ASCII;
+		}
+		$temp = tmpfile();
+		if ( ! $temp )
+			return false;
+		fwrite($temp,$contents);
+		fseek($temp, 0); //Skip back to the start of the file being written to
+		$ret = @ftp_fput($this->link,$file,$temp,$type);
+		fclose($temp);
+		return $ret;
+	}
+	function cwd(){
+		$cwd = ftp_pwd($this->link);
+		if( $cwd )
+			$cwd = trailingslashit($cwd);
+		return $cwd;
+	}
+	function chdir($dir){
+		return @ftp_chdir($dir);
+	}
+	function chgrp($file,$group,$recursive=false){
+		return false;
+	}
+	function chmod($file,$mode=false,$recursive=false){
+		if( ! $mode )
+			$mode = $this->permission;
+		if( ! $mode )
+			return false;
+		if ( ! $this->exists($file) )
+			return false;
+		if ( ! $recursive || ! $this->is_dir($file) ){
+			if (!function_exists('ftp_chmod'))
+				return @ftp_site($this->link, sprintf('CHMOD %o %s', $mode, $file));
+			return @ftp_chmod($this->link,$mode,$file);
+		}
+		//Is a directory, and we want recursive
+		$filelist = $this->dirlist($file);
+		foreach($filelist as $filename){
+			$this->chmod($file.'/'.$filename,$mode,$recursive);
+		}
+		return true;
+	}
+	function chown($file,$owner,$recursive=false){
+		return false;
+	}
+	function owner($file){
+		$dir = $this->dirlist($file);
+		return $dir[$file]['owner'];
+	}
+	function getchmod($file){
+		$dir = $this->dirlist($file);
+		return $dir[$file]['permsn'];
+	}
+	function gethchmod($file){
+		//From the PHP.net page for ...?
+		$perms = $this->getchmod($file);
+		if (($perms & 0xC000) == 0xC000) {
+			// Socket
+			$info = 's';
+		} elseif (($perms & 0xA000) == 0xA000) {
+			// Symbolic Link
+			$info = 'l';
+		} elseif (($perms & 0x8000) == 0x8000) {
+			// Regular
+			$info = '-';
+		} elseif (($perms & 0x6000) == 0x6000) {
+			// Block special
+			$info = 'b';
+		} elseif (($perms & 0x4000) == 0x4000) {
+			// Directory
+			$info = 'd';
+		} elseif (($perms & 0x2000) == 0x2000) {
+			// Character special
+			$info = 'c';
+		} elseif (($perms & 0x1000) == 0x1000) {
+			// FIFO pipe
+			$info = 'p';
+		} else {
+			// Unknown
+			$info = 'u';
+		}
+
+		// Owner
+		$info .= (($perms & 0x0100) ? 'r' : '-');
+		$info .= (($perms & 0x0080) ? 'w' : '-');
+		$info .= (($perms & 0x0040) ?
+					(($perms & 0x0800) ? 's' : 'x' ) :
+					(($perms & 0x0800) ? 'S' : '-'));
+
+		// Group
+		$info .= (($perms & 0x0020) ? 'r' : '-');
+		$info .= (($perms & 0x0010) ? 'w' : '-');
+		$info .= (($perms & 0x0008) ?
+					(($perms & 0x0400) ? 's' : 'x' ) :
+					(($perms & 0x0400) ? 'S' : '-'));
+
+		// World
+		$info .= (($perms & 0x0004) ? 'r' : '-');
+		$info .= (($perms & 0x0002) ? 'w' : '-');
+		$info .= (($perms & 0x0001) ?
+					(($perms & 0x0200) ? 't' : 'x' ) :
+					(($perms & 0x0200) ? 'T' : '-'));
+		return $info;
+	}
+	function getnumchmodfromh($mode) {
+		$realmode = "";
+		$legal =  array("","w","r","x","-");
+		$attarray = preg_split("//",$mode);
+		for($i=0;$i<count($attarray);$i++){
+		   if($key = array_search($attarray[$i],$legal)){
+			   $realmode .= $legal[$key];
+		   }
+		}
+		$mode = str_pad($realmode,9,'-');
+		$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
+		$mode = strtr($mode,$trans);
+		$newmode = '';
+		$newmode .= $mode[0]+$mode[1]+$mode[2];
+		$newmode .= $mode[3]+$mode[4]+$mode[5];
+		$newmode .= $mode[6]+$mode[7]+$mode[8];
+		return $newmode;
+	}
+	function group($file){
+		$dir = $this->dirlist($file);
+		return $dir[$file]['group'];
+	}
+	function copy($source,$destination,$overwrite=false){
+		if( ! $overwrite && $this->exists($destination) )
+			return false;
+		$content = $this->get_contents($source);
+		if( false === $content)
+			return false;
+		return $this->put_contents($destination,$content);
+	}
+	function move($source,$destination,$overwrite=false){
+		return ftp_rename($this->link,$source,$destination);
+	}
+
+	function delete($file,$recursive=false) {
+		if ( $this->is_file($file) )
+			return @ftp_delete($this->link,$file);
+		if ( !$recursive )
+			return @ftp_rmdir($this->link,$file);
+		$filelist = $this->dirlist($file);
+		foreach ((array) $filelist as $filename => $fileinfo) {
+			$this->delete($file.'/'.$filename,$recursive);
+		}
+		return @ftp_rmdir($this->link,$file);
+	}
+
+	function exists($file){
+		$list = ftp_rawlist($this->link,$file,false);
+		if( ! $list )
+			return false;
+		return count($list) == 1 ? true : false;
+	}
+	function is_file($file){
+		return $this->is_dir($file) ? false : true;
+	}
+	function is_dir($path){
+		$cwd = $this->cwd();
+		$result = @ftp_chdir($this->link, $path);
+		if( $result && $path == $this->cwd() ||
+			$this->cwd() != $cwd ) {
+			@ftp_chdir($this->link, $cwd);
+			return true;
+		}
+		return false;
+	}
+	function is_readable($file){
+		//Get dir list, Check if the file is writable by the current user??
+		return true;
+	}
+	function is_writable($file){
+		//Get dir list, Check if the file is writable by the current user??
+		return true;
+	}
+	function atime($file){
+		return false;
+	}
+	function mtime($file){
+		return ftp_mdtm($this->link, $file);
+	}
+	function size($file){
+		return ftp_size($this->link, $file);
+	}
+	function touch($file,$time=0,$atime=0){
+		return false;
+	}
+	function mkdir($path,$chmod=false,$chown=false,$chgrp=false){
+		if( !@ftp_mkdir($this->link, $path) )
+			return false;
+		if( $chmod )
+			$this->chmod($path, $chmod);
+		if( $chown )
+			$this->chown($path, $chown);
+		if( $chgrp )
+			$this->chgrp($path, $chgrp);
+		return true;
+	}
+	function rmdir($path,$recursive=false){
+		if( ! $recursive )
+			return @ftp_rmdir($this->link, $path);
+
+		//TODO: Recursive Directory delete, Have to delete files from the folder first.
+		//$dir = $this->dirlist($path);
+		//foreach($dir as $file)
+
+	}
+
+	function parselisting($line) {
+		$is_windows = ($this->OS_remote == FTP_OS_Windows);
+		if ($is_windows && preg_match("/([0-9]{2})-([0-9]{2})-([0-9]{2}) +([0-9]{2}):([0-9]{2})(AM|PM) +([0-9]+|<DIR>) +(.+)/",$line,$lucifer)) {
+			$b = array();
+			if ($lucifer[3]<70) { $lucifer[3]+=2000; } else { $lucifer[3]+=1900; } // 4digit year fix
+			$b['isdir'] = ($lucifer[7]=="<DIR>");
+			if ( $b['isdir'] )
+				$b['type'] = 'd';
+			else
+				$b['type'] = 'f';
+			$b['size'] = $lucifer[7];
+			$b['month'] = $lucifer[1];
+			$b['day'] = $lucifer[2];
+			$b['year'] = $lucifer[3];
+			$b['hour'] = $lucifer[4];
+			$b['minute'] = $lucifer[5];
+			$b['time'] = @mktime($lucifer[4]+(strcasecmp($lucifer[6],"PM")==0?12:0),$lucifer[5],0,$lucifer[1],$lucifer[2],$lucifer[3]);
+			$b['am/pm'] = $lucifer[6];
+			$b['name'] = $lucifer[8];
+		} else if (!$is_windows && $lucifer=preg_split("/[ ]/",$line,9,PREG_SPLIT_NO_EMPTY)) {
+			//echo $line."\n";
+			$lcount=count($lucifer);
+			if ($lcount<8) return '';
+			$b = array();
+			$b['isdir'] = $lucifer[0]{0} === "d";
+			$b['islink'] = $lucifer[0]{0} === "l";
+			if ( $b['isdir'] )
+				$b['type'] = 'd';
+			elseif ( $b['islink'] )
+				$b['type'] = 'l';
+			else
+				$b['type'] = 'f';
+			$b['perms'] = $lucifer[0];
+			$b['number'] = $lucifer[1];
+			$b['owner'] = $lucifer[2];
+			$b['group'] = $lucifer[3];
+			$b['size'] = $lucifer[4];
+			if ($lcount==8) {
+				sscanf($lucifer[5],"%d-%d-%d",$b['year'],$b['month'],$b['day']);
+				sscanf($lucifer[6],"%d:%d",$b['hour'],$b['minute']);
+				$b['time'] = @mktime($b['hour'],$b['minute'],0,$b['month'],$b['day'],$b['year']);
+				$b['name'] = $lucifer[7];
+			} else {
+				$b['month'] = $lucifer[5];
+				$b['day'] = $lucifer[6];
+				if (preg_match("/([0-9]{2}):([0-9]{2})/",$lucifer[7],$l2)) {
+					$b['year'] = date("Y");
+					$b['hour'] = $l2[1];
+					$b['minute'] = $l2[2];
+				} else {
+					$b['year'] = $lucifer[7];
+					$b['hour'] = 0;
+					$b['minute'] = 0;
+				}
+				$b['time'] = strtotime(sprintf("%d %s %d %02d:%02d",$b['day'],$b['month'],$b['year'],$b['hour'],$b['minute']));
+				$b['name'] = $lucifer[8];
+			}
+		}
+
+		return $b;
+	}
+
+	function dirlist($path='.',$incdot=false,$recursive=false){
+		if( $this->is_file($path) ){
+			$limitFile = basename($path);
+			$path = dirname($path) . '/';
+		} else {
+			$limitFile = false;
+		}
+
+		$list = @ftp_rawlist($this->link , '-a ' . $path, false);
+
+		if ( $list === false )
+			return false;
+
+		$dirlist = array();
+		foreach ( $list as $k => $v ) {
+			$entry = $this->parselisting($v);
+			if ( empty($entry) )
+				continue;
+
+			if ( $entry["name"]=="." or $entry["name"]==".." )
+				continue;
+
+			$dirlist[$entry['name']] = $entry;
+		}
+
+		if ( ! $dirlist )
+			return false;
+		if ( empty($dirlist) )
+			return array();
+
+		$ret = array();
+		foreach ( $dirlist as $struc ) {
+
+			if ( 'd' == $struc['type'] ) {
+				$struc['files'] = array();
+
+				if ( $incdot ){
+					//We're including the doted starts
+					if( '.' != $struc['name'] && '..' != $struc['name'] ){ //Ok, It isnt a special folder
+						if ($recursive)
+							$struc['files'] = $this->dirlist($path.'/'.$struc['name'],$incdot,$recursive);
+					}
+				} else { //No dots
+					if ($recursive)
+						$struc['files'] = $this->dirlist($path.'/'.$struc['name'],$incdot,$recursive);
+				}
+			}
+			//File
+			$ret[$struc['name']] = $struc;
+		}
+		return $ret;
+	}
+
+	function __destruct(){
+		if( $this->link )
+			ftp_close($this->link);
+	}
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/class-wp-filesystem-ftpsockets.php 2.5.src/wp-admin/includes/class-wp-filesystem-ftpsockets.php
--- 2.2.2.src/wp-admin/includes/class-wp-filesystem-ftpsockets.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/class-wp-filesystem-ftpsockets.php	2008-03-21 00:15:21.000000000 -0500
@@ -0,0 +1,450 @@
+<?php
+class WP_Filesystem_ftpsockets{
+	var $ftp = false;
+	var $timeout = 5;
+	var $errors;
+	var $options = array();
+
+	var $wp_base = '';
+	var $permission = null;
+
+	var $filetypes = array(
+							'php'=>FTP_ASCII,
+							'css'=>FTP_ASCII,
+							'txt'=>FTP_ASCII,
+							'js'=>FTP_ASCII,
+							'html'=>FTP_ASCII,
+							'htm'=>FTP_ASCII,
+							'xml'=>FTP_ASCII,
+
+							'jpg'=>FTP_BINARY,
+							'png'=>FTP_BINARY,
+							'gif'=>FTP_BINARY,
+							'bmp'=>FTP_BINARY
+							);
+
+	function WP_Filesystem_ftpsockets($opt='') {
+		$this->errors = new WP_Error();
+
+		//Check if possible to use ftp functions.
+		if( ! @include_once ABSPATH . 'wp-admin/includes/class-ftp.php' )
+				return false;
+		$this->ftp = new ftp();
+
+		//Set defaults:
+		if ( empty($opt['port']) )
+			$this->options['port'] = 21;
+		else
+			$this->options['port'] = $opt['port'];
+
+		if ( empty($opt['hostname']) )
+			$this->errors->add('empty_hostname', __('FTP hostname is required'));
+		else
+			$this->options['hostname'] = $opt['hostname'];
+
+		if ( isset($opt['base']) && ! empty($opt['base']) )
+			$this->wp_base = $opt['base'];
+
+		// Check if the options provided are OK.
+		if ( empty ($opt['username']) )
+			$this->errors->add('empty_username', __('FTP username is required'));
+		else
+			$this->options['username'] = $opt['username'];
+
+		if ( empty ($opt['password']) )
+			$this->errors->add('empty_password', __('FTP password is required'));
+		else
+			$this->options['password'] = $opt['password'];
+	}
+
+	function connect() {
+		if ( ! $this->ftp )
+			return false;
+
+		//$this->ftp->Verbose = true;
+
+		if ( ! $this->ftp->SetServer($this->options['hostname'], $this->options['port']) ) {
+			$this->errors->add('connect', sprintf(__('Failed to connect to FTP Server %1$s:%2$s'), $this->options['hostname'], $this->options['port']));
+			return false;
+		}
+		if ( ! $this->ftp->connect() ) {
+			$this->errors->add('connect', sprintf(__('Failed to connect to FTP Server %1$s:%2$s'), $this->options['hostname'], $this->options['port']));
+			return false;
+		}
+
+		if ( ! $this->ftp->login($this->options['username'], $this->options['password']) ) {
+			$this->errors->add('auth', sprintf(__('Username/Password incorrect for %s'), $this->options['username']));
+			return false;
+		}
+
+		$this->ftp->SetType(FTP_AUTOASCII);
+		$this->ftp->Passive(true);
+		return true;
+	}
+
+	function setDefaultPermissions($perm) {
+		$this->permission = $perm;
+	}
+
+	function find_base_dir($base = '.',$echo = false, $loop = false) {
+		//Sanitize the Windows path formats, This allows easier conparison and aligns it to FTP output.
+		$abspath = str_replace('\\','/',ABSPATH); //windows: Straighten up the paths..
+		if( strpos($abspath, ':') ){ //Windows, Strip out the driveletter
+			if( preg_match("|.{1}\:(.+)|i", $abspath, $mat) )
+				$abspath = $mat[1];
+		}
+	
+		//Set up the base directory (Which unless specified, is the current one)
+		if( empty( $base ) || '.' == $base ) $base = $this->cwd();
+		$base = trailingslashit($base);
+
+		//Can we see the Current directory as part of the ABSPATH?
+		$location = strpos($abspath, $base);
+		if( false !== $location ) {
+			$newbase = path_join($base, substr($abspath, $location + strlen($base)));
+
+			if( false !== $this->chdir($newbase) ){ //chdir sometimes returns null under certain circumstances, even when its changed correctly, FALSE will be returned if it doesnt change correctly.
+				if($echo) printf( __('Changing to %s') . '<br/>', $newbase );
+				//Check to see if it exists in that folder.
+				if( $this->exists($newbase . 'wp-settings.php') ){
+					if($echo) printf( __('Found %s'),  $newbase . 'wp-settings.php<br/>' );
+					return $newbase;
+				}	
+			}
+		}
+	
+		//Ok, Couldnt do a magic location from that particular folder level
+		
+		//Get a list of the files in the current directory, See if we can locate where we are in the folder stucture.
+		$files = $this->dirlist($base);
+		
+		$arrPath = explode('/', $abspath);
+		foreach($arrPath as $key){
+			//Working from /home/ to /user/ to /wordpress/ see if that file exists within the current folder, 
+			// If its found, change into it and follow through looking for it. 
+			// If it cant find WordPress down that route, it'll continue onto the next folder level, and see if that matches, and so on.
+			// If it reaches the end, and still cant find it, it'll return false for the entire function.
+			if( isset($files[ $key ]) ){
+				//Lets try that folder:
+				$folder = path_join($base, $key);
+				if($echo) printf( __('Changing to %s') . '<br/>', $folder );
+				$ret = $this->find_base_dir( $folder, $echo, $loop);
+				if( $ret )
+					return $ret;
+			}
+		}
+		//Only check this as a last resort, to prevent locating the incorrect install. All above proceeedures will fail quickly if this is the right branch to take.
+		if(isset( $files[ 'wp-settings.php' ]) ){
+			if($echo) printf( __('Found %s'),  $base . 'wp-settings.php<br/>' );
+			return $base;
+		}
+		if( $loop )
+			return false;//Prevent tihs function looping again.
+		//As an extra last resort, Change back to / if the folder wasnt found. This comes into effect when the CWD is /home/user/ but WP is at /var/www/.... mainly dedicated setups.
+		return $this->find_base_dir('/', $echo, true); 
+	}
+
+	function get_base_dir($base = '.', $echo = false){
+		if( defined('FTP_BASE') )
+			$this->wp_base = FTP_BASE;
+		if( empty($this->wp_base) )
+			$this->wp_base = $this->find_base_dir($base, $echo);
+		return $this->wp_base;
+	}
+
+	function get_contents($file,$type='',$resumepos=0){
+		if( ! $this->exists($file) )
+			return false;
+
+		if( empty($type) ){
+			$extension = substr(strrchr($file, "."), 1);
+			$type = isset($this->filetypes[ $extension ]) ? $this->filetypes[ $extension ] : FTP_AUTOASCII;
+		}
+		$this->ftp->SetType($type);
+		$temp = tmpfile();
+		if ( ! $temp )
+			return false;
+		if ( ! $this->ftp->fget($temp, $file) ) {
+			fclose($temp);
+			return ''; //Blank document, File does exist, Its just blank.
+		}
+		fseek($temp, 0); //Skip back to the start of the file being written to
+		$contents = '';
+		while ( !feof($temp) )
+			$contents .= fread($temp, 8192);
+		fclose($temp);
+		return $contents;
+	}
+
+	function get_contents_array($file){
+		return explode("\n",$this->get_contents($file));
+	}
+
+	function put_contents($file,$contents,$type=''){
+		if( empty($type) ){
+			$extension = substr(strrchr($file, "."), 1);
+			$type = isset($this->filetypes[ $extension ]) ? $this->filetypes[ $extension ] : FTP_ASCII;
+		}
+		$this->ftp->SetType($type);
+
+		$temp = tmpfile();
+		if ( ! $temp )
+			return false;
+		fwrite($temp,$contents);
+		fseek($temp, 0); //Skip back to the start of the file being written to
+		$ret = $this->ftp->fput($file, $temp);
+		fclose($temp);
+		return $ret;
+	}
+
+	function cwd(){
+		$cwd = $this->ftp->pwd();
+		if( $cwd )
+			$cwd = trailingslashit($cwd);
+		return $cwd;
+	}
+
+	function chdir($file){
+		return $this->ftp->chdir($file);
+	}
+	
+	function chgrp($file,$group,$recursive=false){
+		return false;
+	}
+
+	function chmod($file,$mode=false,$recursive=false){
+		if( ! $mode )
+			$mode = $this->permission;
+		if( ! $mode )
+			return false;
+		//if( ! $this->exists($file) )
+		//	return false;
+		if( ! $recursive || ! $this->is_dir($file) ){
+			return $this->ftp->chmod($file,$mode);
+		}
+		//Is a directory, and we want recursive
+		$filelist = $this->dirlist($file);
+		foreach($filelist as $filename){
+			$this->chmod($file.'/'.$filename,$mode,$recursive);
+		}
+		return true;
+	}
+
+	function chown($file,$owner,$recursive=false){
+		return false;
+	}
+
+	function owner($file){
+		$dir = $this->dirlist($file);
+		return $dir[$file]['owner'];
+	}
+
+	function getchmod($file){
+		$dir = $this->dirlist($file);
+		return $dir[$file]['permsn'];
+	}
+
+	function gethchmod($file){
+		//From the PHP.net page for ...?
+		$perms = $this->getchmod($file);
+		if (($perms & 0xC000) == 0xC000) {
+			// Socket
+			$info = 's';
+		} elseif (($perms & 0xA000) == 0xA000) {
+			// Symbolic Link
+			$info = 'l';
+		} elseif (($perms & 0x8000) == 0x8000) {
+			// Regular
+			$info = '-';
+		} elseif (($perms & 0x6000) == 0x6000) {
+			// Block special
+			$info = 'b';
+		} elseif (($perms & 0x4000) == 0x4000) {
+			// Directory
+			$info = 'd';
+		} elseif (($perms & 0x2000) == 0x2000) {
+			// Character special
+			$info = 'c';
+		} elseif (($perms & 0x1000) == 0x1000) {
+			// FIFO pipe
+			$info = 'p';
+		} else {
+			// Unknown
+			$info = 'u';
+		}
+
+		// Owner
+		$info .= (($perms & 0x0100) ? 'r' : '-');
+		$info .= (($perms & 0x0080) ? 'w' : '-');
+		$info .= (($perms & 0x0040) ?
+					(($perms & 0x0800) ? 's' : 'x' ) :
+					(($perms & 0x0800) ? 'S' : '-'));
+
+		// Group
+		$info .= (($perms & 0x0020) ? 'r' : '-');
+		$info .= (($perms & 0x0010) ? 'w' : '-');
+		$info .= (($perms & 0x0008) ?
+					(($perms & 0x0400) ? 's' : 'x' ) :
+					(($perms & 0x0400) ? 'S' : '-'));
+
+		// World
+		$info .= (($perms & 0x0004) ? 'r' : '-');
+		$info .= (($perms & 0x0002) ? 'w' : '-');
+		$info .= (($perms & 0x0001) ?
+					(($perms & 0x0200) ? 't' : 'x' ) :
+					(($perms & 0x0200) ? 'T' : '-'));
+		return $info;
+	}
+
+	function getnumchmodfromh($mode) {
+		$realmode = "";
+		$legal =  array("","w","r","x","-");
+		$attarray = preg_split("//",$mode);
+		for($i=0;$i<count($attarray);$i++){
+		   if($key = array_search($attarray[$i],$legal)){
+			   $realmode .= $legal[$key];
+		   }
+		}
+		$mode = str_pad($realmode,9,'-');
+		$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
+		$mode = strtr($mode,$trans);
+		$newmode = '';
+		$newmode .= $mode[0]+$mode[1]+$mode[2];
+		$newmode .= $mode[3]+$mode[4]+$mode[5];
+		$newmode .= $mode[6]+$mode[7]+$mode[8];
+		return $newmode;
+	}
+
+	function group($file){
+		$dir = $this->dirlist($file);
+		return $dir[$file]['group'];
+	}
+
+	function copy($source,$destination,$overwrite=false){
+		if( ! $overwrite && $this->exists($destination) )
+			return false;
+
+		$content = $this->get_contents($source);
+		if ( false === $content )
+			return false;
+
+		return $this->put_contents($destination,$content);
+	}
+
+	function move($source,$destination,$overwrite=false){
+		return $this->ftp->rename($source,$destination);
+	}
+
+	function delete($file,$recursive=false) {
+		if ( $this->is_file($file) )
+			return $this->ftp->delete($file);
+		if ( !$recursive )
+			return $this->ftp->rmdir($file);
+
+		return $this->ftp->mdel($file);
+	}
+
+	function exists($file){
+		return $this->ftp->is_exists($file);
+	}
+
+	function is_file($file){
+		return $this->is_dir($file) ? false : true;
+	}
+
+	function is_dir($path){
+		$cwd = $this->cwd();
+		if ( $this->chdir($path) ) {
+			$this->chdir($cwd);
+			return true;
+		}
+		return false;
+	}
+
+	function is_readable($file){
+		//Get dir list, Check if the file is writable by the current user??
+		return true;
+	}
+
+	function is_writable($file){
+		//Get dir list, Check if the file is writable by the current user??
+		return true;
+	}
+
+	function atime($file){
+		return false;
+	}
+
+	function mtime($file){
+		return $this->ftp->mdtm($file);
+	}
+
+	function size($file){
+		return $this->ftp->filesize($file);
+	}
+
+	function touch($file,$time=0,$atime=0){
+		return false;
+	}
+
+	function mkdir($path,$chmod=false,$chown=false,$chgrp=false){
+		if( ! $this->ftp->mkdir($path) )
+			return false;
+		if( $chmod )
+			$this->chmod($path, $chmod);
+		if( $chown )
+			$this->chown($path, $chown);
+		if( $chgrp )
+			$this->chgrp($path, $chgrp);
+		return true;
+	}
+
+	function rmdir($path,$recursive=false){
+		if( ! $recursive )
+			return $this->ftp->rmdir($path);
+
+		return $this->ftp->mdel($path);
+	}
+
+	function dirlist($path='.',$incdot=false,$recursive=false){
+		if( $this->is_file($path) ){
+			$limitFile = basename($path);
+			$path = dirname($path) . '/';
+		} else {
+			$limitFile = false;
+		}
+
+		$list = $this->ftp->dirlist($path);
+		if( ! $list )
+			return false;
+		if( empty($list) )
+			return array();
+
+		$ret = array();
+		foreach ( $list as $struc ) {
+
+			if ( 'd' == $struc['type'] ) {
+				$struc['files'] = array();
+
+				if ( $incdot ){
+					//We're including the doted starts
+					if( '.' != $struc['name'] && '..' != $struc['name'] ){ //Ok, It isnt a special folder
+						if ($recursive)
+							$struc['files'] = $this->dirlist($path.'/'.$struc['name'],$incdot,$recursive);
+					}
+				} else { //No dots
+					if ($recursive)
+						$struc['files'] = $this->dirlist($path.'/'.$struc['name'],$incdot,$recursive);
+				}
+			}
+			//File
+			$ret[$struc['name']] = $struc;
+		}
+		return $ret;
+	}
+
+	function __destruct(){
+		$this->ftp->quit();
+	}
+}
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/comment.php 2.5.src/wp-admin/includes/comment.php
--- 2.2.2.src/wp-admin/includes/comment.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/comment.php	2008-03-18 18:24:04.000000000 -0500
@@ -0,0 +1,96 @@
+<?php
+
+function comment_exists($comment_author, $comment_date) {
+	global $wpdb;
+
+	return $wpdb->get_var("SELECT comment_post_ID FROM $wpdb->comments
+			WHERE comment_author = '$comment_author' AND comment_date = '$comment_date'");
+}
+
+function edit_comment() {
+
+	$comment_post_ID = (int) $_POST['comment_post_ID'];
+
+	if (!current_user_can( 'edit_post', $comment_post_ID ))
+		wp_die( __('You are not allowed to edit comments on this post, so you cannot edit this comment.' ));
+
+	$_POST['comment_author'] = $_POST['newcomment_author'];
+	$_POST['comment_author_email'] = $_POST['newcomment_author_email'];
+	$_POST['comment_author_url'] = $_POST['newcomment_author_url'];
+	$_POST['comment_approved'] = $_POST['comment_status'];
+	$_POST['comment_content'] = $_POST['content'];
+	$_POST['comment_ID'] = (int) $_POST['comment_ID'];
+
+	foreach ( array ('aa', 'mm', 'jj', 'hh', 'mm') as $timeunit ) {
+		if ( !empty( $_POST['hidden_' . $timeunit] ) && $_POST['hidden_' . $timeunit] != $_POST[$timeunit] ) {
+			$_POST['edit_date'] = '1';
+			break;
+		}
+	}
+
+
+	if (!empty ( $_POST['edit_date'] ) ) {
+		$aa = $_POST['aa'];
+		$mm = $_POST['mm'];
+		$jj = $_POST['jj'];
+		$hh = $_POST['hh'];
+		$mn = $_POST['mn'];
+		$ss = $_POST['ss'];
+		$jj = ($jj > 31 ) ? 31 : $jj;
+		$hh = ($hh > 23 ) ? $hh -24 : $hh;
+		$mn = ($mn > 59 ) ? $mn -60 : $mn;
+		$ss = ($ss > 59 ) ? $ss -60 : $ss;
+		$_POST['comment_date'] = "$aa-$mm-$jj $hh:$mn:$ss";
+	}
+
+	wp_update_comment( $_POST);
+}
+
+function get_comment_to_edit( $id ) {
+	if ( !$comment = get_comment($id) )
+		return false;
+
+	$comment->comment_ID = (int) $comment->comment_ID;
+	$comment->comment_post_ID = (int) $comment->comment_post_ID;
+
+	$comment->comment_content = format_to_edit( $comment->comment_content );
+	$comment->comment_content = apply_filters( 'comment_edit_pre', $comment->comment_content);
+
+	$comment->comment_author = format_to_edit( $comment->comment_author );
+	$comment->comment_author_email = format_to_edit( $comment->comment_author_email );
+	$comment->comment_author_url = clean_url($comment->comment_author_url);
+	$comment->comment_author_url = format_to_edit( $comment->comment_author_url );
+
+	return $comment;
+}
+
+function get_pending_comments_num( $post_id ) {
+	global $wpdb;
+	$post_id = (int) $post_id;
+	$pending = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_post_ID = $post_id AND comment_approved = '0'" );
+	return $pending;
+}
+
+// Add avatars to relevant places in admin, or try to
+
+function floated_admin_avatar( $name ) {
+	global $comment;
+
+	$id = $avatar = false;
+	if ( $comment->comment_author_email )
+		$id = $comment->comment_author_email;
+	if ( $comment->user_id )
+		$id = $comment->user_id;
+
+	if ( $id )
+		$avatar = get_avatar( $id, 32 );
+
+	return "$avatar $name";
+}
+
+if ( is_admin() && ('edit-comments.php' == $pagenow || 'edit.php' == $pagenow) ) {
+	if ( get_option('show_avatars') )
+		add_filter( 'comment_author', 'floated_admin_avatar' );
+}
+
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/dashboard.php 2.5.src/wp-admin/includes/dashboard.php
--- 2.2.2.src/wp-admin/includes/dashboard.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/dashboard.php	2008-03-23 11:34:28.000000000 -0500
@@ -0,0 +1,540 @@
+<?php
+
+// Registers dashboard widgets, handles POST data, sets up filters
+function wp_dashboard_setup() {
+	global $wpdb, $wp_dashboard_sidebars;
+	$update = false;
+	if ( !$widget_options = get_option( 'dashboard_widget_options' ) )
+		$widget_options = array();
+
+
+	/* Register WP Dashboard Dynamic Sidebar */
+	register_sidebar( array(
+		'name' => 'WordPress Dashboard',
+		'id' => 'wp_dashboard',
+		'before_widget' => "\t<div class='dashboard-widget-holder %2\$s' id='%1\$s'>\n\n\t\t<div class='dashboard-widget'>\n\n",
+		'after_widget' => "\t\t</div>\n\n\t</div>\n\n",
+		'before_title' => "\t\t\t<h3 class='dashboard-widget-title'>",
+		'after_title' => "</h3>\n\n"
+	) );
+
+
+	/* Register Widgets and Controls */
+
+	// Recent Comments Widget
+	if ( current_user_can( 'moderate_comments' ) && $mod_comments = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = '0'") ) {
+		$notice = sprintf( __ngettext( '%d comment awaiting moderation', '%d comments awaiting moderation', $mod_comments ), $mod_comments );
+		$notice = "<a href='edit-comments.php?comment_status=moderated'>$notice</a>";
+	} else {
+		$notice = '';
+	}
+	wp_register_sidebar_widget( 'dashboard_recent_comments', __( 'Recent Comments' ), 'wp_dashboard_recent_comments',
+		array( 'all_link' => 'edit-comments.php', 'notice' => $notice, 'width' => 'half' )
+	);
+
+	// Incoming Links Widget
+	if ( !isset( $widget_options['dashboard_incoming_links'] ) ) {
+		$update = true;
+		$widget_options['dashboard_incoming_links'] = array(
+			'link' => apply_filters( 'dashboard_incoming_links_link', 'http://blogsearch.google.com/blogsearch?hl=en&scoring=d&partner=wordpress&q=link:' . trailingslashit( get_option('home') ) ),
+			'url' => apply_filters( 'dashboard_incoming_links_feed', 'http://blogsearch.google.com/blogsearch_feeds?hl=en&scoring=d&ie=utf-8&num=10&output=rss&partner=wordpress&q=link:' . trailingslashit( get_option('home') ) ),
+			'items' => 5,
+			'show_date' => 0
+		);
+	}
+	wp_register_sidebar_widget( 'dashboard_incoming_links', __( 'Incoming Links' ), 'wp_dashboard_empty',
+		array( 'all_link' => $widget_options['dashboard_incoming_links']['link'], 'feed_link' => $widget_options['dashboard_incoming_links']['url'], 'width' => 'half' ),
+		'wp_dashboard_cached_rss_widget', 'wp_dashboard_incoming_links_output'
+	);
+	wp_register_widget_control( 'dashboard_incoming_links', __( 'Incoming Links' ), 'wp_dashboard_rss_control', array(),
+		array( 'widget_id' => 'dashboard_incoming_links', 'form_inputs' => array( 'title' => false, 'show_summary' => false, 'show_author' => false ) )
+	);
+
+
+	// WP Plugins Widget
+	wp_register_sidebar_widget( 'dashboard_plugins', __( 'Plugins' ), 'wp_dashboard_empty',
+		array( 'all_link' => 'http://wordpress.org/extend/plugins/', 'feed_link' => 'http://wordpress.org/extend/plugins/rss/topics/', 'width' => 'half' ),
+		'wp_dashboard_cached_rss_widget', 'wp_dashboard_plugins_output',
+		array( 'http://wordpress.org/extend/plugins/rss/browse/popular/', 'http://wordpress.org/extend/plugins/rss/browse/new/', 'http://wordpress.org/extend/plugins/rss/browse/updated/' )
+	);
+
+	// Primary feed (Dev Blog) Widget
+	if ( !isset( $widget_options['dashboard_primary'] ) ) {
+		$update = true;
+		$widget_options['dashboard_primary'] = array(
+			'link' => apply_filters( 'dashboard_primary_link',  __( 'http://wordpress.org/development/' ) ),
+			'url' => apply_filters( 'dashboard_primary_feed',  __( 'http://wordpress.org/development/feed/' ) ),
+			'title' => apply_filters( 'dashboard_primary_title', __( 'WordPress Development Blog' ) ),
+			'items' => 2,
+			'show_summary' => 1,
+			'show_author' => 0,
+			'show_date' => 1
+		);
+	}
+	wp_register_sidebar_widget( 'dashboard_primary', $widget_options['dashboard_primary']['title'], 'wp_dashboard_empty',
+		array( 'all_link' => $widget_options['dashboard_primary']['link'], 'feed_link' => $widget_options['dashboard_primary']['url'], 'width' => 'half', 'class' => 'widget_rss' ),
+		'wp_dashboard_cached_rss_widget', 'wp_dashboard_rss_output'
+	);
+	wp_register_widget_control( 'dashboard_primary', __( 'Primary Feed' ), 'wp_dashboard_rss_control', array(),
+		array( 'widget_id' => 'dashboard_primary' )
+	);
+
+
+	// Secondary Feed (Planet) Widget
+	if ( !isset( $widget_options['dashboard_secondary'] ) ) {
+		$update = true;
+		$widget_options['dashboard_secondary'] = array(
+			'link' => apply_filters( 'dashboard_secondary_link',  __( 'http://planet.wordpress.org/' ) ),
+			'url' => apply_filters( 'dashboard_secondary_feed',  __( 'http://planet.wordpress.org/feed/' ) ),
+			'title' => apply_filters( 'dashboard_secondary_title', __( 'Other WordPress News' ) ),
+			'items' => 15
+		);
+	}
+	wp_register_sidebar_widget( 'dashboard_secondary', $widget_options['dashboard_secondary']['title'], 'wp_dashboard_empty',
+		array( 'all_link' => $widget_options['dashboard_secondary']['link'], 'feed_link' => $widget_options['dashboard_secondary']['url'], 'width' => 'full' ),
+		'wp_dashboard_cached_rss_widget', 'wp_dashboard_secondary_output'
+	);
+	wp_register_widget_control( 'dashboard_secondary', __( 'Secondary Feed' ), 'wp_dashboard_rss_control', array(),
+		array( 'widget_id' => 'dashboard_secondary', 'form_inputs' => array( 'show_summary' => false, 'show_author' => false, 'show_date' => false ) )
+	);
+
+
+		/* Dashboard Widget Template
+		wp_register_sidebar_widget( $widget_id (unique slug) , $widget_title, $output_callback,
+			array(
+				'all_link'  => full url for "See All" link,
+				'feed_link' => full url for "RSS" link,
+				'width'     => 'fourth', 'third', 'half', 'full' (defaults to 'half'),
+				'height'    => 'single', 'double' (defaults to 'single'),
+			),
+			$wp_dashboard_empty_callback (only needed if using 'wp_dashboard_empty' as your $output_callback),
+			$arg, $arg, $arg... (further args passed to callbacks)
+		);
+
+		// optional: if you want users to be able to edit the settings of your widget, you need to register a widget_control
+		wp_register_widget_control( $widget_id, $widget_control_title, $control_output_callback,
+			array(), // leave an empty array here: oddity in widget code
+			array(
+				'widget_id' => $widget_id, // Yes - again.  This is required: oddity in widget code
+				'arg'       => an arg to pass to the $control_output_callback,
+				'another'   => another arg to pass to the $control_output_callback,
+				...
+			)
+		);
+		*/
+
+	// Hook to register new widgets
+	do_action( 'wp_dashboard_setup' );
+
+	// Hard code the sidebar's widgets and order
+	$dashboard_widgets = array();
+	$dashboard_widgets[] = 'dashboard_recent_comments';
+	$dashboard_widgets[] = 'dashboard_incoming_links';
+	$dashboard_widgets[] = 'dashboard_primary';
+	if ( current_user_can( 'activate_plugins' ) )
+		$dashboard_widgets[] = 'dashboard_plugins';
+	$dashboard_widgets[] = 'dashboard_secondary';
+
+	// Filter widget order
+	$dashboard_widgets = apply_filters( 'wp_dashboard_widgets', $dashboard_widgets );
+
+	$wp_dashboard_sidebars = array( 'wp_dashboard' => $dashboard_widgets, 'array_version' => 3.5 );
+
+	add_filter( 'dynamic_sidebar_params', 'wp_dashboard_dynamic_sidebar_params' );
+
+	if ( 'POST' == $_SERVER['REQUEST_METHOD'] && isset($_POST['widget_id']) ) {
+		ob_start(); // hack - but the same hack wp-admin/widgets.php uses
+		wp_dashboard_trigger_widget_control( $_POST['widget_id'] );
+		ob_end_clean();
+		wp_redirect( remove_query_arg( 'edit' ) );
+		exit;
+	}
+
+	if ( $update )
+		update_option( 'dashboard_widget_options', $widget_options );
+}
+
+// Echoes out the dashboard
+function wp_dashboard() {
+	echo "<div id='dashboard-widgets'>\n\n";
+
+	// We're already filtering dynamic_sidebar_params obove
+	add_filter( 'option_sidebars_widgets', 'wp_dashboard_sidebars_widgets' ); // here there be hackery
+	dynamic_sidebar( 'wp_dashboard' );
+	remove_filter( 'option_sidebars_widgets', 'wp_dashboard_sidebars_widgets' );
+
+	echo "<br class='clear' />\n</div>\n\n\n";
+}
+
+// Makes sidebar_widgets option reflect the dashboard settings
+function wp_dashboard_sidebars_widgets() { // hackery
+	return $GLOBALS['wp_dashboard_sidebars'];
+}
+
+// Modifies sidbar params on the fly to set up ids, class names, titles for each widget (called once per widget)
+// Switches widget to edit mode if $_GET['edit']
+function wp_dashboard_dynamic_sidebar_params( $params ) {
+	global $wp_registered_widgets, $wp_registered_widget_controls;
+
+	$sidebar_defaults = array('widget_id' => 0, 'before_widget' => '', 'after_widget' => '', 'before_title' => '', 'after_title' => '');
+	extract( $sidebar_defaults, EXTR_PREFIX_ALL, 'sidebar' );
+	extract( $params[0], EXTR_PREFIX_ALL, 'sidebar' );
+
+	if ( !isset($wp_registered_widgets[$sidebar_widget_id]) || !is_array($wp_registered_widgets[$sidebar_widget_id]) ) {
+		return $params;
+	}
+	$widget_defaults = array('id' => '', 'width' => '', 'height' => '', 'class' => '', 'feed_link' => '', 'all_link' => '', 'notice' => false, 'error' => false);
+	extract( $widget_defaults, EXTR_PREFIX_ALL, 'widget' );
+	extract( $wp_registered_widgets[$sidebar_widget_id], EXTR_PREFIX_ALL, 'widget' );
+
+	$the_classes = array();
+	if ( in_array($widget_width, array( 'third', 'fourth', 'full' ) ) )
+		$the_classes[] = $widget_width;
+
+	if ( 'double' == $widget_height )
+		$the_classes[] = 'double';
+
+	if ( $widget_class )
+		$the_classes[] = $widget_class;
+
+	// Add classes to the widget holder
+	if ( $the_classes )
+		$sidebar_before_widget = str_replace( "<div class='dashboard-widget-holder ", "<div class='dashboard-widget-holder " . join( ' ', $the_classes ) . ' ', $sidebar_before_widget );
+
+	$links = array();
+	if ( $widget_all_link )
+		$links[] = '<a href="' . clean_url( $widget_all_link ) . '">' . __( 'See&nbsp;All' ) . '</a>';
+
+	$content_class = 'dashboard-widget-content';
+	if ( current_user_can( 'edit_dashboard' ) && isset($wp_registered_widget_controls[$widget_id]) && is_callable($wp_registered_widget_controls[$widget_id]['callback']) ) {
+		// Switch this widget to edit mode
+		if ( isset($_GET['edit']) && $_GET['edit'] == $widget_id ) {
+			$content_class .= ' dashboard-widget-control';
+			$wp_registered_widgets[$widget_id]['callback'] = 'wp_dashboard_empty';
+			$sidebar_widget_name = $wp_registered_widget_controls[$widget_id]['name'];
+			$params[1] = 'wp_dashboard_trigger_widget_control';
+			$sidebar_before_widget .= '<form action="' . remove_query_arg( 'edit' )  . '" method="post">';
+			$sidebar_after_widget   = "<div class='dashboard-widget-submit'><input type='hidden' name='sidebar' value='wp_dashboard' /><input type='hidden' name='widget_id' value='$widget_id' /><input type='submit' value='" . __( 'Save' ) . "' /></div></form>$sidebar_after_widget";
+			$links[] = '<a href="' . remove_query_arg( 'edit' ) . '">' . __( 'Cancel' ) . '</a>';
+		} else {
+			$links[] = '<a href="' . add_query_arg( 'edit', $widget_id ) . "#$widget_id" . '">' . __( 'Edit' ) . '</a>';
+		}
+	}
+
+	if ( $widget_feed_link )
+		$links[] = '<img class="rss-icon" src="' . get_option( 'siteurl' ) . '/' . WPINC . '/images/rss.png" alt="' . __( 'rss icon' ) . '" /> <a href="' . clean_url( $widget_feed_link ) . '">' . __( 'RSS' ) . '</a>';
+
+	$links = apply_filters( "wp_dashboard_widget_links_$widget_id", $links );
+
+	// Add links to widget's title bar
+	if ( $links ) {
+		$sidebar_before_title .= '<span>';
+		$sidebar_after_title   = '</span><small>' . join( '&nbsp;|&nbsp;', $links ) . "</small><br class='clear' />$sidebar_after_title";
+	}
+
+	// Could have put this in widget-content.  Doesn't really matter
+	if ( $widget_notice )
+		$sidebar_after_title .= "\t\t\t<div class='dashboard-widget-notice'>$widget_notice</div>\n\n";
+
+	if ( $widget_error )
+		$sidebar_after_title .= "\t\t\t<div class='dashboard-widget-error'>$widget_error</div>\n\n";
+
+	$sidebar_after_title .= "\t\t\t<div class='$content_class'>\n\n";
+
+	$sidebar_after_widget .= "\t\t\t</div>\n\n";
+
+	foreach( array_keys( $params[0] ) as $key )
+		$$key = ${'sidebar_' . $key};
+
+	$params[0] = compact( array_keys( $params[0] ) );
+
+	return $params;
+}
+
+
+/* Dashboard Widgets */
+
+function wp_dashboard_recent_comments( $sidebar_args ) {
+	global $comment;
+	extract( $sidebar_args, EXTR_SKIP );
+
+	echo $before_widget;
+
+	echo $before_title;
+	echo $widget_name;
+	echo $after_title;
+
+	$lambda = create_function( '', 'return 5;' );
+	add_filter( 'option_posts_per_rss', $lambda ); // hack - comments query doesn't accept per_page parameter
+	$comments_query = new WP_Query('feed=rss2&withcomments=1');
+	remove_filter( 'option_posts_per_rss', $lambda );
+
+	$is_first = true;
+
+	if ( $comments_query->have_comments() ) {
+		while ( $comments_query->have_comments() ) { $comments_query->the_comment();
+
+			$comment_post_url = get_permalink( $comment->comment_post_ID );
+			$comment_post_title = get_the_title( $comment->comment_post_ID );
+			$comment_post_link = "<a href='$comment_post_url'>$comment_post_title</a>";
+			$comment_link = '<a class="comment-link" href="' . get_comment_link() . '">#</a>';
+			$comment_meta = sprintf( __( 'From <strong>%1$s</strong> on %2$s %3$s' ), get_comment_author(), $comment_post_link, $comment_link );
+
+			if ( $is_first ) : $is_first = false;
+?>
+				<blockquote><p>&#8220;<?php comment_excerpt(); ?>&#8221;</p></blockquote>
+				<p class='comment-meta'><?php echo $comment_meta; ?></p>
+<?php
+				if ( $comments_query->comment_count > 1 ) : ?>
+				<ul id="dashboard-comments-list">
+<?php
+				endif; // comment_count
+			else : // is_first
+?>
+
+					<li class='comment-meta'><?php echo $comment_meta; ?></li>
+<?php
+			endif; // is_first
+		}
+
+		if ( $comments_query->comment_count > 1 ) : ?>
+				</ul>
+<?php
+		endif; // comment_count;
+
+	}
+
+	echo $after_widget;
+}
+
+// $sidebar_args are handled by wp_dashboard_empty()
+function wp_dashboard_incoming_links_output() {
+	$widgets = get_option( 'dashboard_widget_options' );
+	@extract( @$widgets['dashboard_incoming_links'], EXTR_SKIP );
+	$rss = @fetch_rss( $url );
+	if ( isset($rss->items) && 1 < count($rss->items) )  {// Technorati returns a 1-item feed when it has no results
+
+		echo "<ul>\n";
+
+		$rss->items = array_slice($rss->items, 0, $items);
+		foreach ( $rss->items as $item ) {
+			$publisher = '';
+			$site_link = '';
+			$link = '';
+			$content = '';
+			$date = '';
+			$link = clean_url( strip_tags( $item['link'] ) );
+
+			if ( isset( $item['author_uri'] ) )
+				$site_link = clean_url( strip_tags( $item['author_uri'] ) );
+
+			if ( !$publisher = wp_specialchars( strip_tags( isset($item['dc']['publisher']) ? $item['dc']['publisher'] : $item['author_name'] ) ) )
+				$publisher = __( 'Somebody' );
+			if ( $site_link )
+				$publisher = "<a href='$site_link'>$publisher</a>";
+			else
+				$publisher = "<strong>$publisher</strong>";
+
+			if ( isset($item['description']) )
+				$content = $item['description'];
+			elseif ( isset($item['summary']) )
+				$content = $item['summary'];
+			elseif ( isset($item['atom_content']) )
+				$content = $item['atom_content'];
+			else
+				$content = __( 'something' );
+			$content = wp_html_excerpt($content, 50) . ' ...';
+			if ( $link )
+				$text = _c( '%1$s linked here <a href="%2$s">saying</a>, "%3$s"|feed_display' );
+			else
+				$text = _c( '%1$s linked here saying, "%3$s"|feed_display' );
+
+			if ( $show_date ) {
+				if ( $show_author || $show_summary )
+					$text .= _c( ' on %4$s|feed_display' );
+				$date = wp_specialchars( strip_tags( isset($item['pubdate']) ? $item['pubdate'] : $item['published'] ) );
+				$date = strtotime( $date );
+				$date = gmdate( get_option( 'date_format' ), $date );
+			}
+
+			echo "\t<li>" . sprintf( _c( "$text|feed_display" ), $publisher, $link, $content, $date ) . "</li>\n";
+		}
+
+		echo "</ul>\n";
+
+	} else {
+		echo '<p>' . __('This dashboard widget queries <a href="http://blogsearch.google.com/">Google Blog Search</a> so that when another blog links to your site it will show up here. It has found no incoming links&hellip; yet. It&#8217;s okay &#8212; there is no rush.') . "</p>\n";
+	}
+}
+
+// $sidebar_args are handled by wp_dashboard_empty()
+function wp_dashboard_rss_output( $widget_id ) {
+	$widgets = get_option( 'dashboard_widget_options' );
+	wp_widget_rss_output( $widgets[$widget_id] );
+}
+
+// $sidebar_args are handled by wp_dashboard_empty()
+function wp_dashboard_secondary_output() {
+	$widgets = get_option( 'dashboard_widget_options' );
+	@extract( @$widgets['dashboard_secondary'], EXTR_SKIP );
+	$rss = @fetch_rss( $url );
+	if ( !isset($rss->items) || 0 == count($rss->items) )
+		return false;
+
+	echo "<ul id='planetnews'>\n";
+
+	$rss->items = array_slice($rss->items, 0, $items);
+	foreach ($rss->items as $item ) {
+		$title = wp_specialchars($item['title']);
+		$author = preg_replace( '|(.+?):.+|s', '$1', $item['title'] );
+		$post = preg_replace( '|.+?:(.+)|s', '$1', $item['title'] );
+		$link = clean_url($item['link']);
+
+		echo "\t<li><a href='$link'><span class='post'>$post</span><span class='hidden'> - </span><cite>$author</cite></a></li>\n";
+	}
+
+	echo "</ul>\n<br class='clear' />\n";
+}
+
+// $sidebar_args are handled by wp_dashboard_empty()
+function wp_dashboard_plugins_output() {
+	$popular = @fetch_rss( 'http://wordpress.org/extend/plugins/rss/browse/popular/' );
+	$new     = @fetch_rss( 'http://wordpress.org/extend/plugins/rss/browse/new/' );
+	$updated = @fetch_rss( 'http://wordpress.org/extend/plugins/rss/browse/updated/' );
+
+	foreach ( array( 'popular' => __('Most Popular'), 'new' => __('Newest Plugins'), 'updated' => __('Recently Updated') ) as $feed => $label ) {
+		if ( !isset($$feed->items) || 0 == count($$feed->items) )
+			continue;
+
+		$$feed->items = array_slice($$feed->items, 0, 5);
+		$item_key = array_rand($$feed->items);
+
+		// Eliminate some common badly formed plugin descriptions
+		while ( ( null !== $item_key = array_rand($$feed->items) ) && false !== strpos( $$feed->items[$item_key]['description'], 'Plugin Name:' ) )
+			unset($$feed->items[$item_key]);
+
+		if ( !isset($$feed->items[$item_key]) )
+			continue;
+
+		$item = $$feed->items[$item_key];
+
+		// current bbPress feed item titles are: user on "topic title"
+		if ( preg_match( '/"(.*)"/s', $item['title'], $matches ) )
+			$title = $matches[1];
+		else // but let's make it forward compatible if things change
+			$title = $item['title'];
+		$title = wp_specialchars( $title );
+
+		$description = wp_specialchars( strip_tags(html_entity_decode($item['description'], ENT_QUOTES)) );
+
+		list($link, $frag) = explode( '#', $item['link'] );
+
+		$link = clean_url($link);
+		$dlink = rtrim($link, '/') . '/download/';
+
+		echo "<h4>$label</h4>\n";
+		echo "<h5><a href='$link'>$title</a></h5>&nbsp;<span>(<a href='$dlink'>" . __( 'Download' ) . "</a>)</span>\n";
+		echo "<p>$description</p>\n";
+	}
+}
+
+// Checks to see if all of the feed url in $check_urls are cached.
+// If $check_urls is empty, look for the rss feed url found in the dashboard widget optios of $widget_id.
+// If cached, call $callback, a function that echoes out output for this widget.
+// If not cache, echo a "Loading..." stub which is later replaced by AJAX call (see top of /wp-admin/index.php)
+function wp_dashboard_cached_rss_widget( $widget_id, $callback, $check_urls = array() ) {
+	$loading = '<p class="widget-loading">' . __( 'Loading&#8230;' ) . '</p>';
+
+	if ( empty($check_urls) ) {
+		$widgets = get_option( 'dashboard_widget_options' );
+		if ( empty($widgets[$widget_id]['url']) ) {
+			echo $loading;
+			return false;
+		}
+		$check_urls = array( $widgets[$widget_id]['url'] );
+	}
+
+
+	require_once( ABSPATH . WPINC . '/rss.php' );
+	init(); // initialize rss constants
+
+	$cache = new RSSCache( MAGPIE_CACHE_DIR, MAGPIE_CACHE_AGE );
+
+	foreach ( $check_urls as $check_url ) {
+		$status = $cache->check_cache( $check_url );
+		if ( 'HIT' !== $status ) {
+			echo $loading;
+			return false;
+		}
+	}
+
+	if ( $callback && is_callable( $callback ) ) {
+		$args = array_slice( func_get_args(), 2 );
+		array_unshift( $args, $widget_id );
+		call_user_func_array( $callback, $args );
+	}
+
+	return true;
+}
+
+// Empty widget used for JS/AJAX created output.
+// Callback inserts content between before_widget and after_widget.  Used when widget is in edit mode.  Can also be used for custom widgets.
+function wp_dashboard_empty( $sidebar_args, $callback = false ) {
+	extract( $sidebar_args, EXTR_SKIP );
+
+	echo $before_widget;
+
+	echo $before_title;
+	echo $widget_name;
+	echo $after_title;
+
+	// When in edit mode, the callback passed to this function is the widget_control callback
+	if ( $callback && is_callable( $callback ) ) {
+		$args = array_slice( func_get_args(), 2 );
+		array_unshift( $args, $widget_id );
+		call_user_func_array( $callback, $args );
+	}
+
+	echo $after_widget;
+}
+
+/* Dashboard Widgets Controls. Ssee also wp_dashboard_empty() */
+
+// Calls widget_control callback
+function wp_dashboard_trigger_widget_control( $widget_control_id = false ) {
+	global $wp_registered_widget_controls;
+	if ( is_scalar($widget_control_id) && $widget_control_id && isset($wp_registered_widget_controls[$widget_control_id]) && is_callable($wp_registered_widget_controls[$widget_control_id]['callback']) )
+		call_user_func_array( $wp_registered_widget_controls[$widget_control_id]['callback'], $wp_registered_widget_controls[$widget_control_id]['params'] );
+}
+
+// Sets up $args to be used as input to wp_widget_rss_form(), handles POST data from RSS-type widgets
+function wp_dashboard_rss_control( $args ) {
+	extract( $args );
+	if ( !$widget_id )
+		return false;
+
+	if ( !$widget_options = get_option( 'dashboard_widget_options' ) )
+		$widget_options = array();
+
+	if ( !isset($widget_options[$widget_id]) )
+		$widget_options[$widget_id] = array();
+
+	$number = 1; // Hack to use wp_widget_rss_form()
+	$widget_options[$widget_id]['number'] = $number;
+
+	if ( 'POST' == $_SERVER['REQUEST_METHOD'] && isset($_POST['widget-rss'][$number]) ) {
+		$_POST['widget-rss'][$number] = stripslashes_deep( $_POST['widget-rss'][$number] );
+		$widget_options[$widget_id] = wp_widget_rss_process( $_POST['widget-rss'][$number] );
+		// title is optional.  If black, fill it if possible
+		if ( !$widget_options[$widget_id]['title'] && isset($_POST['widget-rss'][$number]['title']) ) {
+			require_once(ABSPATH . WPINC . '/rss.php');
+			$rss = fetch_rss($widget_options[$widget_id]['url']);
+			$widget_options[$widget_id]['title'] = htmlentities(strip_tags($rss->channel['title']));
+		}
+		update_option( 'dashboard_widget_options', $widget_options );
+	}
+
+	wp_widget_rss_form( $widget_options[$widget_id], $form_inputs );
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/export.php 2.5.src/wp-admin/includes/export.php
--- 2.2.2.src/wp-admin/includes/export.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/export.php	2008-03-14 14:37:18.000000000 -0500
@@ -0,0 +1,255 @@
+<?php
+
+// version number for the export format.  bump this when something changes that might affect compatibility.
+define('WXR_VERSION', '1.0');
+
+function export_wp($author='') {
+global $wpdb, $post_ids, $post;
+
+do_action('export_wp');
+
+$filename = 'wordpress.' . date('Y-m-d') . '.xml';
+
+header('Content-Description: File Transfer');
+header("Content-Disposition: attachment; filename=$filename");
+header('Content-Type: text/xml; charset=' . get_option('blog_charset'), true);
+
+$where = '';
+if ( $author and $author != 'all' ) {
+	$author_id = (int) $author;
+	$where = " WHERE post_author = '$author_id' ";
+}
+
+// grab a snapshot of post IDs, just in case it changes during the export
+$post_ids = $wpdb->get_col("SELECT ID FROM $wpdb->posts $where ORDER BY post_date_gmt ASC");
+
+$categories = (array) get_categories('get=all');
+$tags = (array) get_tags('get=all');
+
+function wxr_missing_parents($categories) {
+	if ( !is_array($categories) || empty($categories) )
+		return array();
+
+	foreach ( $categories as $category )
+		$parents[$category->term_id] = $category->parent;
+
+	$parents = array_unique(array_diff($parents, array_keys($parents)));
+
+	if ( $zero = array_search('0', $parents) )
+		unset($parents[$zero]);
+
+	return $parents;
+}
+
+while ( $parents = wxr_missing_parents($categories) ) {
+	$found_parents = get_categories("include=" . join(', ', $parents));
+	if ( is_array($found_parents) && count($found_parents) )
+		$categories = array_merge($categories, $found_parents);
+	else
+		break;
+}
+
+// Put them in order to be inserted with no child going before its parent
+$pass = 0;
+$passes = 1000 + count($categories);
+while ( ( $cat = array_shift($categories) ) && ++$pass < $passes ) {
+	if ( $cat->parent == 0 || isset($cats[$cat->parent]) ) {
+		$cats[$cat->term_id] = $cat;
+	} else {
+		$categories[] = $cat;
+	}
+}
+unset($categories);
+
+function wxr_cdata($str) {
+	if ( seems_utf8($str) == false )
+		$str = utf8_encode($str);
+
+	// $str = ent2ncr(wp_specialchars($str));
+
+	$str = "<![CDATA[$str" . ( ( substr($str, -1) == ']' ) ? ' ' : '') . "]]>";
+
+	return $str;
+}
+
+function wxr_site_url() {
+	global $current_site;
+
+	// mu: the base url
+	if ( isset($current_site->domain) ) {
+		return 'http://'.$current_site->domain.$current_site->path;
+	}
+	// wp: the blog url
+	else {
+		return get_bloginfo_rss('url');
+	}
+}
+
+function wxr_cat_name($c) {
+	if ( empty($c->name) )
+		return;
+
+	echo '<wp:cat_name>' . wxr_cdata($c->name) . '</wp:cat_name>';
+}
+
+function wxr_category_description($c) {
+	if ( empty($c->description) )
+		return;
+
+	echo '<wp:category_description>' . wxr_cdata($c->description) . '</wp:category_description>';
+}
+
+function wxr_tag_name($t) {
+	if ( empty($t->name) )
+		return;
+
+	echo '<wp:tag_name>' . wxr_cdata($t->name) . '</wp:tag_name>';
+}
+
+function wxr_tag_description($t) {
+	if ( empty($t->description) )
+		return;
+
+	echo '<wp:tag_description>' . wxr_cdata($t->description) . '</wp:tag_description>';
+}
+
+function wxr_post_taxonomy() {
+	$categories = get_the_category();
+	$tags = get_the_tags();
+	$the_list = '';
+	$filter = 'rss';
+
+	if ( !empty($categories) ) foreach ( (array) $categories as $category ) {
+		$cat_name = sanitize_term_field('name', $category->name, $category->term_id, 'category', $filter);
+		// for backwards compatibility
+		$the_list .= "\n\t\t<category><![CDATA[$cat_name]]></category>\n";
+		// forwards compatibility: use a unique identifier for each cat to avoid clashes
+		// http://trac.wordpress.org/ticket/5447
+		$the_list .= "\n\t\t<category domain=\"category\" nicename=\"{$category->slug}\"><![CDATA[$cat_name]]></category>\n";
+	}
+
+	if ( !empty($tags) ) foreach ( (array) $tags as $tag ) {
+		$tag_name = sanitize_term_field('name', $tag->name, $tag->term_id, 'post_tag', $filter);
+		$the_list .= "\n\t\t<category domain=\"tag\"><![CDATA[$tag_name]]></category>\n";
+		// forwards compatibility as above
+		$the_list .= "\n\t\t<category domain=\"tag\" nicename=\"{$tag->slug}\"><![CDATA[$tag_name]]></category>\n";
+	}
+
+	echo $the_list;
+}
+
+echo '<?xml version="1.0" encoding="' . get_bloginfo('charset') . '"?' . ">\n";
+
+?>
+<!-- This is a WordPress eXtended RSS file generated by WordPress as an export of your blog. -->
+<!-- It contains information about your blog's posts, comments, and categories. -->
+<!-- You may use this file to transfer that content from one site to another. -->
+<!-- This file is not intended to serve as a complete backup of your blog. -->
+
+<!-- To import this information into a WordPress blog follow these steps. -->
+<!-- 1. Log into that blog as an administrator. -->
+<!-- 2. Go to Manage: Import in the blog's admin panels. -->
+<!-- 3. Choose "WordPress" from the list. -->
+<!-- 4. Upload this file using the form provided on that page. -->
+<!-- 5. You will first be asked to map the authors in this export file to users -->
+<!--    on the blog.  For each author, you may choose to map to an -->
+<!--    existing user on the blog or to create a new user -->
+<!-- 6. WordPress will then import each of the posts, comments, and categories -->
+<!--    contained in this file into your blog -->
+
+<?php the_generator('export');?>
+<rss version="2.0"
+	xmlns:content="http://purl.org/rss/1.0/modules/content/"
+	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
+	xmlns:dc="http://purl.org/dc/elements/1.1/"
+	xmlns:wp="http://wordpress.org/export/<?php echo WXR_VERSION; ?>/"
+>
+
+<channel>
+	<title><?php bloginfo_rss('name'); ?></title>
+	<link><?php bloginfo_rss('url') ?></link>
+	<description><?php bloginfo_rss("description") ?></description>
+	<pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_lastpostmodified('GMT'), false); ?></pubDate>
+	<generator>http://wordpress.org/?v=<?php bloginfo_rss('version'); ?></generator>
+	<language><?php echo get_option('rss_language'); ?></language>
+	<wp:wxr_version><?php echo WXR_VERSION; ?></wp:wxr_version>
+	<wp:base_site_url><?php echo wxr_site_url(); ?></wp:base_site_url>
+	<wp:base_blog_url><?php bloginfo_rss('url'); ?></wp:base_blog_url>
+<?php if ( $cats ) : foreach ( $cats as $c ) : ?>
+	<wp:category><wp:category_nicename><?php echo $c->slug; ?></wp:category_nicename><wp:category_parent><?php echo $c->parent ? $cats[$c->parent]->name : ''; ?></wp:category_parent><?php wxr_cat_name($c); ?><?php wxr_category_description($c); ?></wp:category>
+<?php endforeach; endif; ?>
+<?php if ( $tags ) : foreach ( $tags as $t ) : ?>
+	<wp:tag><wp:tag_slug><?php echo $t->slug; ?></wp:tag_slug><?php wxr_tag_name($t); ?><?php wxr_tag_description($t); ?></wp:tag>
+<?php endforeach; endif; ?>
+	<?php do_action('rss2_head'); ?>
+	<?php if ($post_ids) {
+		global $wp_query;
+		$wp_query->in_the_loop = true;  // Fake being in the loop.
+		// fetch 20 posts at a time rather than loading the entire table into memory
+		while ( $next_posts = array_splice($post_ids, 0, 20) ) {
+			$where = "WHERE ID IN (".join(',', $next_posts).")";
+			$posts = $wpdb->get_results("SELECT * FROM $wpdb->posts $where ORDER BY post_date_gmt ASC");
+				foreach ($posts as $post) {
+			setup_postdata($post); ?>
+<item>
+<title><?php echo apply_filters('the_title_rss', $post->post_title); ?></title>
+<link><?php the_permalink_rss() ?></link>
+<pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_post_time('Y-m-d H:i:s', true), false); ?></pubDate>
+<dc:creator><?php echo wxr_cdata(get_the_author()); ?></dc:creator>
+<?php wxr_post_taxonomy() ?>
+
+<guid isPermaLink="false"><?php the_guid(); ?></guid>
+<description></description>
+<content:encoded><?php echo wxr_cdata( apply_filters('the_content_export', $post->post_content) ); ?></content:encoded>
+<wp:post_id><?php echo $post->ID; ?></wp:post_id>
+<wp:post_date><?php echo $post->post_date; ?></wp:post_date>
+<wp:post_date_gmt><?php echo $post->post_date_gmt; ?></wp:post_date_gmt>
+<wp:comment_status><?php echo $post->comment_status; ?></wp:comment_status>
+<wp:ping_status><?php echo $post->ping_status; ?></wp:ping_status>
+<wp:post_name><?php echo $post->post_name; ?></wp:post_name>
+<wp:status><?php echo $post->post_status; ?></wp:status>
+<wp:post_parent><?php echo $post->post_parent; ?></wp:post_parent>
+<wp:menu_order><?php echo $post->menu_order; ?></wp:menu_order>
+<wp:post_type><?php echo $post->post_type; ?></wp:post_type>
+<wp:post_password><?php echo $post->post_password; ?></wp:post_password>
+<?php
+if ($post->post_type == 'attachment') { ?>
+<wp:attachment_url><?php echo wp_get_attachment_url($post->ID); ?></wp:attachment_url>
+<?php } ?>
+<?php
+$postmeta = $wpdb->get_results("SELECT * FROM $wpdb->postmeta WHERE post_id = $post->ID");
+if ( $postmeta ) {
+?>
+<?php foreach( $postmeta as $meta ) { ?>
+<wp:postmeta>
+<wp:meta_key><?php echo $meta->meta_key; ?></wp:meta_key>
+<wp:meta_value><?Php echo $meta->meta_value; ?></wp:meta_value>
+</wp:postmeta>
+<?php } ?>
+<?php } ?>
+<?php
+$comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_post_ID = $post->ID");
+if ( $comments ) { foreach ( $comments as $c ) { ?>
+<wp:comment>
+<wp:comment_id><?php echo $c->comment_ID; ?></wp:comment_id>
+<wp:comment_author><?php echo wxr_cdata($c->comment_author); ?></wp:comment_author>
+<wp:comment_author_email><?php echo $c->comment_author_email; ?></wp:comment_author_email>
+<wp:comment_author_url><?php echo $c->comment_author_url; ?></wp:comment_author_url>
+<wp:comment_author_IP><?php echo $c->comment_author_IP; ?></wp:comment_author_IP>
+<wp:comment_date><?php echo $c->comment_date; ?></wp:comment_date>
+<wp:comment_date_gmt><?php echo $c->comment_date_gmt; ?></wp:comment_date_gmt>
+<wp:comment_content><?php echo wxr_cdata($c->comment_content) ?></wp:comment_content>
+<wp:comment_approved><?php echo $c->comment_approved; ?></wp:comment_approved>
+<wp:comment_type><?php echo $c->comment_type; ?></wp:comment_type>
+<wp:comment_parent><?php echo $c->comment_parent; ?></wp:comment_parent>
+<wp:comment_user_id><?php echo $c->user_id; ?></wp:comment_user_id>
+</wp:comment>
+<?php } } ?>
+	</item>
+<?php } } } ?>
+</channel>
+</rss>
+<?php
+}
+
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/file.php 2.5.src/wp-admin/includes/file.php
--- 2.2.2.src/wp-admin/includes/file.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/file.php	2008-03-27 02:36:30.000000000 -0500
@@ -0,0 +1,335 @@
+<?php
+
+$wp_file_descriptions = array ('index.php' => __( 'Main Index Template' ), 'style.css' => __( 'Stylesheet' ), 'rtl.css' => __( 'RTL Stylesheet' ), 'comments.php' => __( 'Comments' ), 'comments-popup.php' => __( 'Popup Comments' ), 'footer.php' => __( 'Footer' ), 'header.php' => __( 'Header' ), 'sidebar.php' => __( 'Sidebar' ), 'archive.php' => __( 'Archives' ), 'category.php' => __( 'Category Template' ), 'page.php' => __( 'Page Template' ), 'search.php' => __( 'Search Results' ), 'searchform.php' => __( 'Search Form' ), 'single.php' => __( 'Single Post' ), '404.php' => __( '404 Template' ), 'link.php' => __( 'Links Template' ), 'functions.php' => __( 'Theme Functions' ), 'attachment.php' => __( 'Attachment Template' ), 'my-hacks.php' => __( 'my-hacks.php (legacy hacks support)' ), '.htaccess' => __( '.htaccess (for rewrite rules )' ),
+	// Deprecated files
+	'wp-layout.css' => __( 'Stylesheet' ), 'wp-comments.php' => __( 'Comments Template' ), 'wp-comments-popup.php' => __( 'Popup Comments Template' ));
+function get_file_description( $file ) {
+	global $wp_file_descriptions;
+
+	if ( isset( $wp_file_descriptions[basename( $file )] ) ) {
+		return $wp_file_descriptions[basename( $file )];
+	}
+	elseif ( file_exists( ABSPATH . $file ) && is_file( ABSPATH . $file ) ) {
+		$template_data = implode( '', file( ABSPATH . $file ) );
+		if ( preg_match( "|Template Name:(.*)|i", $template_data, $name ))
+			return $name[1];
+	}
+
+	return basename( $file );
+}
+
+function get_home_path() {
+	$home = get_option( 'home' );
+	if ( $home != '' && $home != get_option( 'siteurl' ) ) {
+		$home_path = parse_url( $home );
+		$home_path = $home_path['path'];
+		$root = str_replace( $_SERVER["PHP_SELF"], '', $_SERVER["SCRIPT_FILENAME"] );
+		$home_path = trailingslashit( $root.$home_path );
+	} else {
+		$home_path = ABSPATH;
+	}
+
+	return $home_path;
+}
+
+function get_real_file_to_edit( $file ) {
+	if ('index.php' == $file || '.htaccess' == $file ) {
+		$real_file = get_home_path().$file;
+	} else {
+		$real_file = ABSPATH.$file;
+	}
+
+	return $real_file;
+}
+
+function get_temp_dir() {
+	if ( defined('WP_TEMP_DIR') )
+		return trailingslashit(WP_TEMP_DIR);
+
+	$temp = ABSPATH . 'wp-content/';
+	if ( is_dir($temp) && is_writable($temp) )
+		return $temp;
+
+	if  ( function_exists('sys_get_temp_dir') )
+		return trailingslashit(sys_get_temp_dir());
+
+	return '/tmp/';
+}
+
+function validate_file( $file, $allowed_files = '' ) {
+	if ( false !== strpos( $file, '..' ))
+		return 1;
+
+	if ( false !== strpos( $file, './' ))
+		return 1;
+
+	if (':' == substr( $file, 1, 1 ))
+		return 2;
+
+	if (!empty ( $allowed_files ) && (!in_array( $file, $allowed_files ) ) )
+		return 3;
+
+	return 0;
+}
+
+function validate_file_to_edit( $file, $allowed_files = '' ) {
+	$file = stripslashes( $file );
+
+	$code = validate_file( $file, $allowed_files );
+
+	if (!$code )
+		return $file;
+
+	switch ( $code ) {
+		case 1 :
+			wp_die( __('Sorry, can&#8217;t edit files with ".." in the name. If you are trying to edit a file in your WordPress home directory, you can just type the name of the file in.' ));
+
+		case 2 :
+			wp_die( __('Sorry, can&#8217;t call files with their real path.' ));
+
+		case 3 :
+			wp_die( __('Sorry, that file cannot be edited.' ));
+	}
+}
+
+// array wp_handle_upload ( array &file [, array overrides] )
+// file: reference to a single element of $_FILES. Call the function once for each uploaded file.
+// overrides: an associative array of names=>values to override default variables with extract( $overrides, EXTR_OVERWRITE ).
+// On success, returns an associative array of file attributes.
+// On failure, returns $overrides['upload_error_handler'](&$file, $message ) or array( 'error'=>$message ).
+function wp_handle_upload( &$file, $overrides = false ) {
+	// The default error handler.
+	if (! function_exists( 'wp_handle_upload_error' ) ) {
+		function wp_handle_upload_error( &$file, $message ) {
+			return array( 'error'=>$message );
+		}
+	}
+
+	// You may define your own function and pass the name in $overrides['upload_error_handler']
+	$upload_error_handler = 'wp_handle_upload_error';
+
+	// $_POST['action'] must be set and its value must equal $overrides['action'] or this:
+	$action = 'wp_handle_upload';
+
+	// Courtesy of php.net, the strings that describe the error indicated in $_FILES[{form field}]['error'].
+	$upload_error_strings = array( false,
+		__( "The uploaded file exceeds the <code>upload_max_filesize</code> directive in <code>php.ini</code>." ),
+		__( "The uploaded file exceeds the <em>MAX_FILE_SIZE</em> directive that was specified in the HTML form." ),
+		__( "The uploaded file was only partially uploaded." ),
+		__( "No file was uploaded." ),
+		__( "Missing a temporary folder." ),
+		__( "Failed to write file to disk." ));
+
+	// All tests are on by default. Most can be turned off by $override[{test_name}] = false;
+	$test_form = true;
+	$test_size = true;
+
+	// If you override this, you must provide $ext and $type!!!!
+	$test_type = true;
+	$mimes = false;
+
+	// Install user overrides. Did we mention that this voids your warranty?
+	if ( is_array( $overrides ) )
+		extract( $overrides, EXTR_OVERWRITE );
+
+	// A correct form post will pass this test.
+	if ( $test_form && (!isset( $_POST['action'] ) || ($_POST['action'] != $action ) ) )
+		return $upload_error_handler( $file, __( 'Invalid form submission.' ));
+
+	// A successful upload will pass this test. It makes no sense to override this one.
+	if ( $file['error'] > 0 )
+		return $upload_error_handler( $file, $upload_error_strings[$file['error']] );
+
+	// A non-empty file will pass this test.
+	if ( $test_size && !($file['size'] > 0 ) )
+		return $upload_error_handler( $file, __( 'File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your php.ini.' ));
+
+	// A properly uploaded file will pass this test. There should be no reason to override this one.
+	if (! @ is_uploaded_file( $file['tmp_name'] ) )
+		return $upload_error_handler( $file, __( 'Specified file failed upload test.' ));
+
+	// A correct MIME type will pass this test. Override $mimes or use the upload_mimes filter.
+	if ( $test_type ) {
+		$wp_filetype = wp_check_filetype( $file['name'], $mimes );
+
+		extract( $wp_filetype );
+
+		if ( ( !$type || !$ext ) && !current_user_can( 'unfiltered_upload' ) )
+			return $upload_error_handler( $file, __( 'File type does not meet security guidelines. Try another.' ));
+
+		if ( !$ext )
+			$ext = ltrim(strrchr($file['name'], '.'), '.');
+
+		if ( !$type )
+			$type = $file['type'];
+	}
+
+	// A writable uploads dir will pass this test. Again, there's no point overriding this one.
+	if ( ! ( ( $uploads = wp_upload_dir() ) && false === $uploads['error'] ) )
+		return $upload_error_handler( $file, $uploads['error'] );
+
+	$filename = wp_unique_filename( $uploads['path'], $file['name'], $unique_filename_callback );
+
+	// Move the file to the uploads dir
+	$new_file = $uploads['path'] . "/$filename";
+	if ( false === @ move_uploaded_file( $file['tmp_name'], $new_file ) )
+		wp_die( printf( __('The uploaded file could not be moved to %s.' ), $uploads['path'] ));
+
+	// Set correct file permissions
+	$stat = stat( dirname( $new_file ));
+	$perms = $stat['mode'] & 0000666;
+	@ chmod( $new_file, $perms );
+
+	// Compute the URL
+	$url = $uploads['url'] . "/$filename";
+
+	$return = apply_filters( 'wp_handle_upload', array( 'file' => $new_file, 'url' => $url, 'type' => $type ) );
+
+	return $return;
+}
+
+/**
+* Downloads a url to a local file using the Snoopy HTTP Class
+*
+* @param string $url the URL of the file to download
+* @return mixed WP_Error on failure, string Filename on success.
+*/
+function download_url( $url ) {
+	//WARNING: The file is not automatically deleted, The script must unlink() the file.
+	if( ! $url )
+		return new WP_Error('http_no_url', __('Invalid URL Provided'));
+
+	$tmpfname = tempnam(get_temp_dir(), 'wpupdate');
+	if( ! $tmpfname )
+		return new WP_Error('http_no_file', __('Could not create Temporary file'));
+
+	$handle = @fopen($tmpfname, 'w');
+	if( ! $handle )
+		return new WP_Error('http_no_file', __('Could not create Temporary file'));
+
+	require_once( ABSPATH . 'wp-includes/class-snoopy.php' );
+	$snoopy = new Snoopy();
+	$snoopy->fetch($url);
+
+	if( $snoopy->status != '200' ){
+		fclose($handle);
+		unlink($tmpfname);
+		return new WP_Error('http_404', trim($snoopy->response_code));
+	}
+	fwrite($handle, $snoopy->results);
+	fclose($handle);
+
+	return $tmpfname;
+}
+
+function unzip_file($file, $to) {
+	global $wp_filesystem;
+
+	if ( ! $wp_filesystem || !is_object($wp_filesystem) )
+		return new WP_Error('fs_unavailable', __('Could not access filesystem.'));
+
+	$fs =& $wp_filesystem;
+
+	require_once(ABSPATH . 'wp-admin/includes/class-pclzip.php');
+
+	$archive = new PclZip($file);
+
+	// Is the archive valid?
+	if ( false == ($archive_files = $archive->extract(PCLZIP_OPT_EXTRACT_AS_STRING)) )
+		return new WP_Error('incompatible_archive', __('Incompatible archive'), $archive->errorInfo(true));
+
+	if ( 0 == count($archive_files) )
+		return new WP_Error('empty_archive', __('Empty archive'));
+
+	$to = trailingslashit($to);
+	$path = explode('/', $to);
+	$tmppath = '';
+	for ( $j = 0; $j < count($path) - 1; $j++ ) {
+		$tmppath .= $path[$j] . '/';
+		if ( ! $fs->is_dir($tmppath) )
+			$fs->mkdir($tmppath, 0755);
+	}
+
+	foreach ($archive_files as $file) {
+		$path = explode('/', $file['filename']);
+		$tmppath = '';
+
+		// Loop through each of the items and check that the folder exists.
+		for ( $j = 0; $j < count($path) - 1; $j++ ) {
+			$tmppath .= $path[$j] . '/';
+			if ( ! $fs->is_dir($to . $tmppath) )
+				if ( !$fs->mkdir($to . $tmppath, 0755) )
+					return new WP_Error('mkdir_failed', __('Could not create directory'));
+		}
+
+		// We've made sure the folders are there, so let's extract the file now:
+		if ( ! $file['folder'] )
+			if ( !$fs->put_contents( $to . $file['filename'], $file['content']) )
+				return new WP_Error('copy_failed', __('Could not copy file'));
+			$fs->chmod($to . $file['filename'], 0644);
+	}
+
+	return true;
+}
+
+function copy_dir($from, $to) {
+	global $wp_filesystem;
+
+	$dirlist = $wp_filesystem->dirlist($from);
+
+	$from = trailingslashit($from);
+	$to = trailingslashit($to);
+
+	foreach ( (array) $dirlist as $filename => $fileinfo ) {
+		if ( 'f' == $fileinfo['type'] ) {
+			if ( ! $wp_filesystem->copy($from . $filename, $to . $filename, true) )
+				return false;
+			$wp_filesystem->chmod($to . $filename, 0644);
+		} elseif ( 'd' == $fileinfo['type'] ) {
+			if ( !$wp_filesystem->mkdir($to . $filename, 0755) )
+				return false;
+			if ( !copy_dir($from . $filename, $to . $filename) )
+				return false;
+		}
+	}
+
+	return true;
+}
+
+function WP_Filesystem( $args = false, $preference = false ) {
+	global $wp_filesystem;
+
+	$method = get_filesystem_method($preference);
+	if ( ! $method )
+		return false;
+
+	require_once('class-wp-filesystem-'.$method.'.php');
+	$method = "WP_Filesystem_$method";
+
+	$wp_filesystem = new $method($args);
+
+	if ( $wp_filesystem->errors->get_error_code() )
+		return false;
+
+	if ( !$wp_filesystem->connect() )
+		return false; //There was an erorr connecting to the server.
+
+	return true;
+}
+
+function get_filesystem_method() {
+	$tempFile = tempnam(get_temp_dir(), 'WPU');
+
+	if ( getmyuid() == fileowner($tempFile) ) {
+		unlink($tempFile);
+		return 'direct';
+	} else {
+		unlink($tempFile);
+	}
+
+	if ( extension_loaded('ftp') ) return 'ftpext';
+	if ( extension_loaded('sockets') || function_exists('fsockopen') ) return 'ftpsockets'; //Sockets: Socket extension; PHP Mode: FSockopen / fwrite / fread
+	return false;
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/image.php 2.5.src/wp-admin/includes/image.php
--- 2.2.2.src/wp-admin/includes/image.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/image.php	2008-03-27 11:56:56.000000000 -0500
@@ -0,0 +1,282 @@
+<?php
+/**
+ * File contains all the administration image manipulation functions.
+ *
+ * @package WordPress
+ */
+
+/**
+ * wp_create_thumbnail() - Create a thumbnail from an Image given a maximum side size.
+ *
+ * @package WordPress
+ * @param	mixed	$file	Filename of the original image, Or attachment id
+ * @param	int		$max_side	Maximum length of a single side for the thumbnail
+ * @return	string			Thumbnail path on success, Error string on failure
+ *
+ * This function can handle most image file formats which PHP supports.
+ * If PHP does not have the functionality to save in a file of the same format, the thumbnail will be created as a jpeg.
+ */
+function wp_create_thumbnail( $file, $max_side, $deprecated = '' ) {
+	
+	$thumbpath = image_resize( $file, $max_side, $max_side );
+	return apply_filters( 'wp_create_thumbnail', $thumbpath );
+}
+
+/**
+ * wp_crop_image() - Crop an Image to a given size.
+ *
+ * @package WordPress
+ * @internal Missing Long Description
+ * @param	int	$src_file	The source file
+ * @param	int	$src_x		The start x position to crop from
+ * @param	int	$src_y		The start y position to crop from
+ * @param	int	$src_w		The width to crop
+ * @param	int	$src_h		The height to crop
+ * @param	int	$dst_w		The destination width
+ * @param	int	$dst_h		The destination height
+ * @param	int	$src_abs	If the source crop points are absolute
+ * @param	int	$dst_file	The destination file to write to
+ * @return	string			New filepath on success, String error message on failure
+ *
+ */
+function wp_crop_image( $src_file, $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h, $src_abs = false, $dst_file = false ) {
+	if ( is_numeric( $src_file ) ) // Handle int as attachment ID
+		$src_file = get_attached_file( $src_file );
+
+	$src = wp_load_image( $src_file );
+
+	if ( !is_resource( $src ))
+		return $src;
+
+	$dst = imagecreatetruecolor( $dst_w, $dst_h );
+
+	if ( $src_abs ) {
+		$src_w -= $src_x;
+		$src_h -= $src_y;
+	}
+
+	if (function_exists('imageantialias'))
+		imageantialias( $dst, true );
+
+	imagecopyresampled( $dst, $src, 0, 0, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h );
+
+	imagedestroy( $src ); // Free up memory
+
+	if ( ! $dst_file )
+		$dst_file = str_replace( basename( $src_file ), 'cropped-' . basename( $src_file ), $src_file );
+
+	$dst_file = preg_replace( '/\\.[^\\.]+$/', '.jpg', $dst_file );
+
+	if ( imagejpeg( $dst, $dst_file ) )
+		return $dst_file;
+	else
+		return false;
+}
+
+/**
+ * wp_generate_attachment_metadata() - Generate post Image attachment Metadata
+ *
+ * @package WordPress
+ * @internal Missing Long Description
+ * @param	int		$attachment_id	Attachment Id to process
+ * @param	string	$file	Filepath of the Attached image
+ * @return	mixed			Metadata for attachment
+ *
+ */
+function wp_generate_attachment_metadata( $attachment_id, $file ) {
+	$attachment = get_post( $attachment_id );
+
+	$metadata = array();
+	if ( preg_match('!^image/!', get_post_mime_type( $attachment )) && file_is_displayable_image($file) ) {
+		$imagesize = getimagesize( $file );
+		$metadata['width'] = $imagesize[0];
+		$metadata['height'] = $imagesize[1];
+		list($uwidth, $uheight) = wp_shrink_dimensions($metadata['width'], $metadata['height']);
+		$metadata['hwstring_small'] = "height='$uheight' width='$uwidth'";
+		$metadata['file'] = $file;
+
+		// make thumbnails and other intermediate sizes
+		$sizes = array('thumbnail', 'medium');
+		$sizes = apply_filters('intermediate_image_sizes', $sizes);
+		
+		foreach ($sizes as $size) {
+			$resized = image_make_intermediate_size( $file, get_option("{$size}_size_w"), get_option("{$size}_size_h"), get_option("{$size}_crop") );
+			if ( $resized )
+				$metadata['sizes'][$size] = $resized;
+		}
+			
+		// fetch additional metadata from exif/iptc
+		$image_meta = wp_read_image_metadata( $file );
+		if ($image_meta)
+			$metadata['image_meta'] = $image_meta;
+
+	}
+	return apply_filters( 'wp_generate_attachment_metadata', $metadata );
+}
+
+/**
+ * wp_load_image() - Load an image which PHP Supports.
+ *
+ * @package WordPress
+ * @internal Missing Long Description
+ * @param	string	$file	Filename of the image to load
+ * @return	resource		The resulting image resource on success, Error string on failure.
+ *
+ */
+function wp_load_image( $file ) {
+	if ( is_numeric( $file ) )
+		$file = get_attached_file( $file );
+
+	if ( ! file_exists( $file ) )
+		return sprintf(__("File '%s' doesn't exist?"), $file);
+
+	if ( ! function_exists('imagecreatefromstring') )
+		return __('The GD image library is not installed.');
+
+	// Set artificially high because GD uses uncompressed images in memory
+	@ini_set('memory_limit', '256M');
+	$image = imagecreatefromstring( file_get_contents( $file ) );
+
+	if ( !is_resource( $image ) )
+		return sprintf(__("File '%s' is not an image."), $file);
+
+	return $image;
+}
+
+/**
+ * get_udims() - Calculated the new dimentions for downsampled images
+ *
+ * @package WordPress
+ * @internal Missing Description
+ * @see wp_shrink_dimensions()
+ * @param	int		$width	Current width of the image
+ * @param	int 	$height	Current height of the image
+ * @return	mixed			Array(height,width) of shrunk dimensions.
+ *
+ */
+function get_udims( $width, $height) {
+	return wp_shrink_dimensions( $width, $height );
+}
+/**
+ * wp_shrink_dimensions() - Calculates the new dimentions for a downsampled image.
+ *
+ * @package WordPress
+ * @internal Missing Long Description
+ * @param	int		$width	Current width of the image
+ * @param	int 	$height	Current height of the image
+ * @param	int		$wmax	Maximum wanted width
+ * @param	int		$hmax	Maximum wanted height
+ * @return	mixed			Array(height,width) of shrunk dimensions.
+ *
+ */
+function wp_shrink_dimensions( $width, $height, $wmax = 128, $hmax = 96 ) {
+	return wp_constrain_dimensions( $width, $height, $wmax, $hmax );
+}
+
+// convert a fraction string to a decimal
+function wp_exif_frac2dec($str) {
+	@list( $n, $d ) = explode( '/', $str );
+	if ( !empty($d) )
+		return $n / $d;
+	return $str;
+}
+
+// convert the exif date format to a unix timestamp
+function wp_exif_date2ts($str) {
+	// seriously, who formats a date like 'YYYY:MM:DD hh:mm:ss'?
+	@list( $date, $time ) = explode( ' ', trim($str) );
+	@list( $y, $m, $d ) = explode( ':', $date );
+
+	return strtotime( "{$y}-{$m}-{$d} {$time}" );
+}
+
+// get extended image metadata, exif or iptc as available
+function wp_read_image_metadata( $file ) {
+	if ( !file_exists( $file ) )
+		return false;
+
+	list(,,$sourceImageType) = getimagesize( $file );
+
+	// exif contains a bunch of data we'll probably never need formatted in ways that are difficult to use.
+	// We'll normalize it and just extract the fields that are likely to be useful.  Fractions and numbers
+	// are converted to floats, dates to unix timestamps, and everything else to strings.
+	$meta = array(
+		'aperture' => 0,
+		'credit' => '',
+		'camera' => '',
+		'caption' => '',
+		'created_timestamp' => 0,
+		'copyright' => '',
+		'focal_length' => 0,
+		'iso' => 0,
+		'shutter_speed' => 0,
+		'title' => '',
+	);
+
+	// read iptc first, since it might contain data not available in exif such as caption, description etc
+	if ( is_callable('iptcparse') ) {
+		getimagesize($file, $info);
+		if ( !empty($info['APP13']) ) {
+			$iptc = iptcparse($info['APP13']);
+			if ( !empty($iptc['2#110'][0]) ) // credit
+				$meta['credit'] = trim( $iptc['2#110'][0] );
+			elseif ( !empty($iptc['2#080'][0]) ) // byline
+				$meta['credit'] = trim( $iptc['2#080'][0] );
+			if ( !empty($iptc['2#055'][0]) and !empty($iptc['2#060'][0]) ) // created datee and time
+				$meta['created_timestamp'] = strtotime($iptc['2#055'][0] . ' ' . $iptc['2#060'][0]);
+			if ( !empty($iptc['2#120'][0]) ) // caption
+				$meta['caption'] = trim( $iptc['2#120'][0] );
+			if ( !empty($iptc['2#116'][0]) ) // copyright
+				$meta['copyright'] = trim( $iptc['2#116'][0] );
+			if ( !empty($iptc['2#005'][0]) ) // title
+				$meta['title'] = trim( $iptc['2#005'][0] );
+		 }
+	}
+
+	// fetch additional info from exif if available
+	if ( is_callable('exif_read_data') && in_array($sourceImageType, apply_filters('wp_read_image_metadata_types', array(IMAGETYPE_JPEG, IMAGETYPE_TIFF_II, IMAGETYPE_TIFF_MM)) ) ) {
+		$exif = exif_read_data( $file );
+		if (!empty($exif['FNumber']))
+			$meta['aperture'] = round( wp_exif_frac2dec( $exif['FNumber'] ), 2 );
+		if (!empty($exif['Model']))
+			$meta['camera'] = trim( $exif['Model'] );
+		if (!empty($exif['DateTimeDigitized']))
+			$meta['created_timestamp'] = wp_exif_date2ts($exif['DateTimeDigitized']);
+		if (!empty($exif['FocalLength']))
+			$meta['focal_length'] = wp_exif_frac2dec( $exif['FocalLength'] );
+		if (!empty($exif['ISOSpeedRatings']))
+			$meta['iso'] = $exif['ISOSpeedRatings'];
+		if (!empty($exif['ExposureTime']))
+			$meta['shutter_speed'] = wp_exif_frac2dec( $exif['ExposureTime'] );
+	}
+	// FIXME: try other exif libraries if available
+
+	return apply_filters( 'wp_read_image_metadata', $meta, $file, $sourceImageType );
+
+}
+
+// is the file a real image file?
+function file_is_valid_image($path) {
+	$size = @getimagesize($path);
+	return !empty($size);
+}
+
+// is the file an image suitable for displaying within a web page?
+function file_is_displayable_image($path) {
+	$info = @getimagesize($path);
+	if ( empty($info) )
+		$result = false;
+	elseif ( !in_array($info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG)) )
+		// only gif, jpeg and png images can reliably be displayed
+		$result = false;
+	elseif ( $info['channels'] > 0 && $info['channels'] != 3 ) {
+		// some web browsers can't display cmyk or grayscale jpegs
+		$result = false;
+	}
+	else
+		$result = true;
+		
+	return apply_filters('file_is_displayable_image', $result, $path);
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/import.php 2.5.src/wp-admin/includes/import.php
--- 2.2.2.src/wp-admin/includes/import.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/import.php	2007-12-24 00:20:34.000000000 -0600
@@ -0,0 +1,47 @@
+<?php
+
+function get_importers() {
+	global $wp_importers;
+	if ( is_array($wp_importers) )
+		uasort($wp_importers, create_function('$a, $b', 'return strcmp($a[0], $b[0]);'));
+	return $wp_importers;
+}
+
+function register_importer( $id, $name, $description, $callback ) {
+	global $wp_importers;
+	if ( is_wp_error( $callback ) )
+		return $callback;
+	$wp_importers[$id] = array ( $name, $description, $callback );
+}
+
+function wp_import_cleanup( $id ) {
+	wp_delete_attachment( $id );
+}
+
+function wp_import_handle_upload() {
+	$overrides = array( 'test_form' => false, 'test_type' => false );
+	$_FILES['import']['name'] .= '.import';
+	$file = wp_handle_upload( $_FILES['import'], $overrides );
+
+	if ( isset( $file['error'] ) )
+		return $file;
+
+	$url = $file['url'];
+	$type = $file['type'];
+	$file = addslashes( $file['file'] );
+	$filename = basename( $file );
+
+	// Construct the object array
+	$object = array( 'post_title' => $filename,
+		'post_content' => $url,
+		'post_mime_type' => $type,
+		'guid' => $url
+	);
+
+	// Save the data
+	$id = wp_insert_attachment( $object, $file );
+
+	return array( 'file' => $file, 'id' => $id );
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/media.php 2.5.src/wp-admin/includes/media.php
--- 2.2.2.src/wp-admin/includes/media.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/media.php	2008-03-27 22:53:05.000000000 -0500
@@ -0,0 +1,1219 @@
+<?php
+
+function media_upload_tabs() {
+	$_default_tabs = array(
+		'type' => __('Choose File'), // handler action suffix => tab text
+		'gallery' => __('Gallery'),
+		'library' => __('Media Library'),
+	);
+
+	return apply_filters('media_upload_tabs', $_default_tabs);
+}
+
+function update_gallery_tab($tabs) {
+	global $wpdb;
+	if ( !isset($_REQUEST['post_id']) ) {
+		unset($tabs['gallery']);
+		return $tabs;
+	}
+	if ( intval($_REQUEST['post_id']) )
+		$attachments = intval($wpdb->get_var($wpdb->prepare("SELECT count(*) FROM $wpdb->posts WHERE post_type = 'attachment' AND post_parent = %d", $_REQUEST['post_id'])));
+
+	$tabs['gallery'] = sprintf(__('Gallery (%s)'), "<span id='attachments-count'>$attachments</span>");
+
+	return $tabs;
+}
+add_filter('media_upload_tabs', 'update_gallery_tab');
+
+function the_media_upload_tabs() {
+	$tabs = media_upload_tabs();
+
+	if ( !empty($tabs) ) {
+		echo "<ul id='sidemenu'>\n";
+		if ( isset($_GET['tab']) && array_key_exists($_GET['tab'], $tabs) )
+			$current = $_GET['tab'];
+		else {
+			$keys = array_keys($tabs);
+			$current = array_shift($keys);
+		}
+		foreach ( $tabs as $callback => $text ) {
+			$class = '';
+			if ( $current == $callback )
+				$class = " class='current'";
+			$href = add_query_arg(array('tab'=>$callback, 's'=>false, 'paged'=>false, 'post_mime_type'=>false, 'm'=>false));
+			$link = "<a href='$href'$class>$text</a>";
+			echo "\t<li id='tab-$callback'>$link</li>\n";
+		}
+		echo "</ul>\n";
+	}
+}
+
+function get_image_send_to_editor($id, $alt, $title, $align, $url='', $rel = false, $size='medium') {
+
+	$html = get_image_tag($id, $alt, $title, $align, $size);
+
+	$rel = $rel ? ' rel="attachment wp-att-'.attribute_escape($id).'"' : '';
+
+	if ( $url )
+		$html = "<a href='".attribute_escape($url)."'$rel>$html</a>";
+
+	$html = apply_filters( 'image_send_to_editor', $html, $id, $alt, $title, $align, $url );
+
+	return $html;
+}
+
+function media_send_to_editor($html) {
+	?>
+<script type="text/javascript">
+<!--
+top.send_to_editor('<?php echo addslashes($html); ?>');
+top.tb_remove();
+-->
+</script>
+	<?php
+	exit;
+}
+
+// this handles the file upload POST itself, creating the attachment post
+function media_handle_upload($file_id, $post_id, $post_data = array()) {
+	$overrides = array('test_form'=>false);
+	$file = wp_handle_upload($_FILES[$file_id], $overrides);
+
+	if ( isset($file['error']) )
+		return new wp_error( 'upload_error', $file['error'] );
+
+	$url = $file['url'];
+	$type = $file['type'];
+	$file = $file['file'];
+	$title = preg_replace('/\.[^.]+$/', '', basename($file));
+	$content = '';
+
+	// use image exif/iptc data for title and caption defaults if possible
+	if ( $image_meta = @wp_read_image_metadata($file) ) {
+		if ( trim($image_meta['title']) )
+			$title = $image_meta['title'];
+		if ( trim($image_meta['caption']) )
+			$content = $image_meta['caption'];
+	}
+
+	// Construct the attachment array
+	$attachment = array_merge( array(
+		'post_mime_type' => $type,
+		'guid' => $url,
+		'post_parent' => $post_id,
+		'post_title' => $title,
+		'post_content' => $content,
+	), $post_data );
+
+	// Save the data
+	$id = wp_insert_attachment($attachment, $file, $post_parent);
+	if ( !is_wp_error($id) ) {
+		wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) );
+	}
+
+	return $id;
+
+}
+
+
+// wrap iframe content (produced by $content_func) in a doctype, html head/body etc
+// any additional function args will be passed to content_func
+function wp_iframe($content_func /* ... */) {
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" <?php do_action('admin_xml_ns'); ?> <?php language_attributes(); ?>>
+<head>
+<meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php echo get_option('blog_charset'); ?>" />
+<title><?php bloginfo('name') ?> &rsaquo; <?php _e('Uploads'); ?> &#8212; <?php _e('WordPress'); ?></title>
+<?php
+wp_admin_css( 'css/global' );
+wp_admin_css();
+wp_admin_css( 'css/colors' );
+?>
+<script type="text/javascript">
+//<![CDATA[
+function addLoadEvent(func) {if ( typeof wpOnload!='function'){wpOnload=func;}else{ var oldonload=wpOnload;wpOnload=function(){oldonload();func();}}}
+//]]>
+</script>
+<?php
+do_action('admin_print_scripts');
+do_action('admin_head');
+if ( is_string($content_func) )
+	do_action( "admin_head_{$content_func}" );
+?>
+</head>
+<body<?php if ( isset($GLOBALS['body_id']) ) echo ' id="' . $GLOBALS['body_id'] . '"'; ?>>
+<?php
+	$args = func_get_args();
+	$args = array_slice($args, 1);
+	call_user_func_array($content_func, $args);
+?>
+</body>
+</html>
+<?php
+}
+
+function media_buttons() {
+	global $post_ID, $temp_ID;
+	$uploading_iframe_ID = (int) (0 == $post_ID ? $temp_ID : $post_ID);
+	$context = apply_filters('media_buttons_context', __('Add media: %s'));
+	$media_upload_iframe_src = "media-upload.php?post_id=$uploading_iframe_ID";
+	$media_title = __('Add Media');
+	$image_upload_iframe_src = apply_filters('image_upload_iframe_src', "$media_upload_iframe_src&amp;type=image");
+	$image_title = __('Add an Image');
+	$video_upload_iframe_src = apply_filters('video_upload_iframe_src', "$media_upload_iframe_src&amp;type=video");
+	$video_title = __('Add Video');
+	$audio_upload_iframe_src = apply_filters('audio_upload_iframe_src', "$media_upload_iframe_src&amp;type=audio");
+	$audio_title = __('Add Audio');
+	$out = <<<EOF
+
+	<a href="{$image_upload_iframe_src}&amp;TB_iframe=true&amp;height=500&amp;width=640" class="thickbox" title='$image_title'><img src='images/media-button-image.gif' alt='$image_title' /></a>
+	<a href="{$video_upload_iframe_src}&amp;TB_iframe=true&amp;height=500&amp;width=640" class="thickbox" title='$video_title'><img src='images/media-button-video.gif' alt='$video_title' /></a>
+	<a href="{$audio_upload_iframe_src}&amp;TB_iframe=true&amp;height=500&amp;width=640" class="thickbox" title='$audio_title'><img src='images/media-button-music.gif' alt='$audio_title' /></a>
+	<a href="{$media_upload_iframe_src}&amp;TB_iframe=true&amp;height=500&amp;width=640" class="thickbox" title='$media_title'><img src='images/media-button-other.gif' alt='$media_title' /></a>
+
+EOF;
+	printf($context, $out);
+}
+add_action( 'media_buttons', 'media_buttons' );
+
+function media_buttons_head() {
+$siteurl = get_option('siteurl');
+echo "<style type='text/css' media='all'>
+	@import '{$siteurl}/wp-includes/js/thickbox/thickbox.css?1';
+	div#TB_title {
+		background-color: #222222;
+		color: #cfcfcf;
+	}
+	div#TB_title a, div#TB_title a:visited {
+		color: #cfcfcf;
+	}
+</style>\n";
+}
+
+add_action( 'admin_print_scripts', 'media_buttons_head' );
+
+function media_admin_css() {
+	wp_admin_css('css/media');
+}
+
+add_action('media_upload_media', 'media_upload_handler');
+
+function media_upload_form_handler() {
+	check_admin_referer('media-form');
+
+	// Insert media button was clicked
+	if ( isset($_POST['html-upload']) && !empty($_FILES) ) {
+		// Upload File button was clicked
+
+		$id = media_handle_upload('async-upload', $_REQUEST['post_id']);
+
+		if ( is_wp_error($id) ) {
+			$errors['upload_error'] = $id;
+			$id = false;
+		}
+	}
+
+	if ( !empty($_POST['attachments']) ) foreach ( $_POST['attachments'] as $attachment_id => $attachment ) {
+		$post = $_post = get_post($attachment_id, ARRAY_A);
+		if ( isset($attachment['post_content']) )
+			$post['post_content'] = $attachment['post_content'];
+		if ( isset($attachment['post_title']) )
+			$post['post_title'] = $attachment['post_title'];
+		if ( isset($attachment['post_excerpt']) )
+			$post['post_excerpt'] = $attachment['post_excerpt'];
+
+		$post = apply_filters('attachment_fields_to_save', $post, $attachment);
+
+		if ( isset($post['errors']) ) {
+			$errors[$attachment_id] = $post['errors'];
+			unset($post['errors']);
+		}
+
+		if ( $post != $_post )
+			wp_update_post($post);
+
+		foreach ( get_attachment_taxonomies($post) as $t )
+			if ( isset($attachment[$t]) )
+				wp_set_object_terms($attachment_id, array_map('trim', preg_split('/,+/', $attachment[$t])), $t, false);
+	}
+
+	if ( isset($_POST['insert-gallery']) )
+		return media_send_to_editor('[gallery]');
+
+	if ( isset($_POST['send']) ) {
+		$keys = array_keys($_POST['send']);
+		$send_id = (int) array_shift($keys);
+		$attachment = $_POST['attachments'][$send_id];
+		$html = $attachment['post_title'];
+		if ( !empty($attachment['url']) ) {
+			if ( strpos($attachment['url'], 'attachment_id') || false !== strpos($attachment['url'], get_permalink($_POST['post_id'])) )
+				$rel = " rel='attachment wp-att-".attribute_escape($send_id)."'";
+			$html = "<a href='{$attachment['url']}'$rel>$html</a>";
+		}
+		$html = apply_filters('media_send_to_editor', $html, $send_id, $attachment);
+		return media_send_to_editor($html);
+	}
+
+	return $errors;
+}
+
+function media_upload_image() {
+	if ( isset($_POST['html-upload']) && !empty($_FILES) ) {
+		// Upload File button was clicked
+		$id = media_handle_upload('async-upload', $_REQUEST['post_id']);
+		unset($_FILES);
+		if ( is_wp_error($id) ) {
+			$errors['upload_error'] = $id;
+			$id = false;
+		}
+	}
+
+	if ( !empty($_POST['insertonlybutton']) ) {
+		$src = $_POST['insertonly']['src'];
+		if ( !empty($src) && !strpos($src, '://') )
+			$src = "http://$src";
+		$alt = attribute_escape($_POST['insertonly']['alt']);
+		if ( isset($_POST['insertonly']['align']) ) {
+			$align = attribute_escape($_POST['insertonly']['align']);
+			$class = " class='align$align'";
+		}
+		if ( !empty($src) )
+			$html = "<img src='$src' alt='$alt'$class />";
+		return media_send_to_editor($html);
+	}
+
+	if ( !empty($_POST) ) {
+		$return = media_upload_form_handler();
+
+		if ( is_string($return) )
+			return $return;
+		if ( is_array($return) )
+			$errors = $return;
+	}
+
+	if ( isset($_POST['save']) )
+		$errors['upload_notice'] = __('Saved.');
+
+	return wp_iframe( 'media_upload_type_form', 'image', $errors, $id );
+}
+
+function media_upload_audio() {
+	if ( isset($_POST['html-upload']) && !empty($_FILES) ) {
+		// Upload File button was clicked
+		$id = media_handle_upload('async-upload', $_REQUEST['post_id']);
+		unset($_FILES);
+		if ( is_wp_error($id) ) {
+			$errors['upload_error'] = $id;
+			$id = false;
+		}
+	}
+
+	if ( !empty($_POST['insertonlybutton']) ) {
+		$href = $_POST['insertonly']['href'];
+		if ( !empty($href) && !strpos($href, '://') )
+			$href = "http://$href";
+		$title = attribute_escape($_POST['insertonly']['title']);
+		if ( empty($title) )
+			$title = basename($href);
+		if ( !empty($title) && !empty($href) )
+			$html = "<a href='$href' >$title</a>";
+		return media_send_to_editor($html);
+	}
+
+	if ( !empty($_POST) ) {
+		$return = media_upload_form_handler();
+
+		if ( is_string($return) )
+			return $return;
+		if ( is_array($return) )
+			$errors = $return;
+	}
+
+	if ( isset($_POST['save']) )
+		$errors['upload_notice'] = __('Saved.');
+
+	return wp_iframe( 'media_upload_type_form', 'audio', $errors, $id );
+}
+
+function media_upload_video() {
+	if ( isset($_POST['html-upload']) && !empty($_FILES) ) {
+		// Upload File button was clicked
+		$id = media_handle_upload('async-upload', $_REQUEST['post_id']);
+		unset($_FILES);
+		if ( is_wp_error($id) ) {
+			$errors['upload_error'] = $id;
+			$id = false;
+		}
+	}
+
+	if ( !empty($_POST['insertonlybutton']) ) {
+		$href = $_POST['insertonly']['href'];
+		if ( !empty($href) && !strpos($href, '://') )
+			$href = "http://$href";
+		$title = attribute_escape($_POST['insertonly']['title']);
+		if ( empty($title) )
+			$title = basename($href);
+		if ( !empty($title) && !empty($href) )
+			$html = "<a href='$href' >$title</a>";
+		return media_send_to_editor($html);
+	}
+
+	if ( !empty($_POST) ) {
+		$return = media_upload_form_handler();
+
+		if ( is_string($return) )
+			return $return;
+		if ( is_array($return) )
+			$errors = $return;
+	}
+
+	if ( isset($_POST['save']) )
+		$errors['upload_notice'] = __('Saved.');
+
+	return wp_iframe( 'media_upload_type_form', 'video', $errors, $id );
+}
+
+function media_upload_file() {
+	if ( isset($_POST['html-upload']) && !empty($_FILES) ) {
+		// Upload File button was clicked
+		$id = media_handle_upload('async-upload', $_REQUEST['post_id']);
+		unset($_FILES);
+		if ( is_wp_error($id) ) {
+			$errors['upload_error'] = $id;
+			$id = false;
+		}
+	}
+
+	if ( !empty($_POST['insertonlybutton']) ) {
+		$href = $_POST['insertonly']['href'];
+		if ( !empty($href) && !strpos($href, '://') )
+			$href = "http://$href";
+		$title = attribute_escape($_POST['insertonly']['title']);
+		if ( empty($title) )
+			$title = basename($href);
+		if ( !empty($title) && !empty($href) )
+			$html = "<a href='$href' >$title</a>";
+		return media_send_to_editor($html);
+	}
+
+	if ( !empty($_POST) ) {
+		$return = media_upload_form_handler();
+
+		if ( is_string($return) )
+			return $return;
+		if ( is_array($return) )
+			$errors = $return;
+	}
+
+	if ( isset($_POST['save']) )
+		$errors['upload_notice'] = __('Saved.');
+
+	return wp_iframe( 'media_upload_type_form', 'file', $errors, $id );
+}
+
+function media_upload_gallery() {
+	if ( !empty($_POST) ) {
+		$return = media_upload_form_handler();
+
+		if ( is_string($return) )
+			return $return;
+		if ( is_array($return) )
+			$errors = $return;
+	}
+
+	return wp_iframe( 'media_upload_gallery_form', $errors );
+}
+
+function media_upload_library() {
+	if ( !empty($_POST) ) {
+		$return = media_upload_form_handler();
+
+		if ( is_string($return) )
+			return $return;
+		if ( is_array($return) )
+			$errors = $return;
+	}
+
+	return wp_iframe( 'media_upload_library_form', $errors );
+}
+
+function image_attachment_fields_to_edit($form_fields, $post) {
+	if ( substr($post->post_mime_type, 0, 5) == 'image' ) {
+		$form_fields['post_title']['required'] = true;
+		$form_fields['post_excerpt']['label'] = __('Caption');
+		$form_fields['post_excerpt']['helps'][] = __('Alternate text, e.g. "The Mona Lisa"');
+
+		$form_fields['post_content']['label'] = __('Description');
+
+		$thumb = wp_get_attachment_thumb_url($post->ID);
+
+		$form_fields['align'] = array(
+			'label' => __('Alignment'),
+			'input' => 'html',
+			'html'  => "
+				<input type='radio' name='attachments[$post->ID][align]' id='image-align-none-$post->ID' value='none' checked='checked' />
+				<label for='image-align-none-$post->ID' class='align image-align-none-label'>" . __('None') . "</label>
+				<input type='radio' name='attachments[$post->ID][align]' id='image-align-left-$post->ID' value='left' />
+				<label for='image-align-left-$post->ID' class='align image-align-left-label'>" . __('Left') . "</label>
+				<input type='radio' name='attachments[$post->ID][align]' id='image-align-center-$post->ID' value='center' />
+				<label for='image-align-center-$post->ID' class='align image-align-center-label'>" . __('Center') . "</label>
+				<input type='radio' name='attachments[$post->ID][align]' id='image-align-right-$post->ID' value='right' />
+				<label for='image-align-right-$post->ID' class='align image-align-right-label'>" . __('Right') . "</label>\n",
+		);
+		$form_fields['image-size'] = array(
+			'label' => __('Size'),
+			'input' => 'html',
+			'html'  => "
+				" . ( $thumb ? "<input type='radio' name='attachments[$post->ID][image-size]' id='image-size-thumb-$post->ID' value='thumbnail' />
+				<label for='image-size-thumb-$post->ID'>" . __('Thumbnail') . "</label>
+				" : '' ) . "<input type='radio' name='attachments[$post->ID][image-size]' id='image-size-medium-$post->ID' value='medium' checked='checked' />
+				<label for='image-size-medium-$post->ID'>" . __('Medium') . "</label>
+				<input type='radio' name='attachments[$post->ID][image-size]' id='image-size-full-$post->ID' value='full' />
+				<label for='image-size-full-$post->ID'>" . __('Full size') . "</label>",
+		);
+	}
+	return $form_fields;
+}
+
+add_filter('attachment_fields_to_edit', 'image_attachment_fields_to_edit', 10, 2);
+
+function media_single_attachment_fields_to_edit( $form_fields, $post ) {
+	unset($form_fields['url'], $form_fields['align'], $form_fields['image-size']);
+	return $form_fields;
+}
+
+function image_attachment_fields_to_save($post, $attachment) {
+	if ( substr($post['post_mime_type'], 0, 5) == 'image' ) {
+		if ( strlen(trim($post['post_title'])) == 0 ) {
+			$post['post_title'] = preg_replace('/\.\w+$/', '', basename($post['guid']));
+			$post['errors']['post_title']['errors'][] = __('Empty Title filled from filename.');
+		}
+	}
+
+	return $post;
+}
+
+add_filter('attachment_fields_to_save', 'image_attachment_fields_to_save', 10, 2);
+
+function image_media_send_to_editor($html, $attachment_id, $attachment) {
+	$post =& get_post($attachment_id);
+	if ( substr($post->post_mime_type, 0, 5) == 'image' ) {
+		$url = $attachment['url'];
+
+		if ( isset($attachment['align']) )
+			$align = $attachment['align'];
+		else
+			$align = 'none';
+
+		if ( !empty($attachment['image-size']) )
+			$size = $attachment['image-size'];
+		else
+			$size = 'medium';
+
+		$rel = ( $url == get_attachment_link($attachment_id) );
+
+		return get_image_send_to_editor($attachment_id, $attachment['post_excerpt'], $attachment['post_title'], $align, $url, $rel, $size);
+	}
+
+	return $html;
+}
+
+add_filter('media_send_to_editor', 'image_media_send_to_editor', 10, 3);
+
+function get_attachment_fields_to_edit($post, $errors = null) {
+	if ( is_int($post) )
+		$post =& get_post($post);
+	if ( is_array($post) )
+		$post = (object) $post;
+
+	$edit_post = sanitize_post($post, 'edit');
+	$file = wp_get_attachment_url($post->ID);
+	$link = get_attachment_link($post->ID);
+
+	$form_fields = array(
+		'post_title'   => array(
+			'label'      => __('Title'),
+			'value'      => $edit_post->post_title,
+		),
+		'post_excerpt' => array(
+			'label'      => __('Caption'),
+			'value'      => $edit_post->post_excerpt,
+		),
+		'post_content' => array(
+			'label'      => __('Description'),
+			'value'      => $edit_post->post_content,
+			'input'      => 'textarea',
+		),
+		'url'          => array(
+			'label'      => __('Link URL'),
+			'input'      => 'html',
+			'html'       => "
+				<input type='text' name='attachments[$post->ID][url]' value='" . attribute_escape($file) . "' /><br />
+				<button type='button' class='button url-$post->ID' value=''>" . __('None') . "</button>
+				<button type='button' class='button url-$post->ID' value='" . attribute_escape($file) . "'>" . __('File URL') . "</button>
+				<button type='button' class='button url-$post->ID' value='" . attribute_escape($link) . "'>" . __('Post URL') . "</button>
+				<script type='text/javascript'>
+				jQuery('button.url-$post->ID').bind('click', function(){jQuery(this).siblings('input').val(this.value);});
+				</script>\n",
+			'helps'      => __('Enter a link URL or click above for presets.'),
+		),
+	);
+
+	foreach ( get_attachment_taxonomies($post) as $taxonomy ) {
+		$t = (array) get_taxonomy($taxonomy);
+		if ( empty($t['label']) )
+			$t['label'] = $taxonomy;
+		if ( empty($t['args']) )
+			$t['args'] = array();
+
+		$terms = get_object_term_cache($post->ID, $taxonomy);
+		if ( empty($terms) )
+			$terms = wp_get_object_terms($post->ID, $taxonomy, $t['args']);
+
+		$values = array();
+
+		foreach ( $terms as $term )
+			$values[] = $term->name;
+		$t['value'] = join(', ', $values);
+
+		$form_fields[$taxonomy] = $t;
+	}
+
+	// Merge default fields with their errors, so any key passed with the error (e.g. 'error', 'helps', 'value') will replace the default
+	// The recursive merge is easily traversed with array casting: foreach( (array) $things as $thing )
+	$form_fields = array_merge_recursive($form_fields, (array) $errors);
+
+	$form_fields = apply_filters('attachment_fields_to_edit', $form_fields, $post);
+
+	return $form_fields;
+}
+
+function get_media_items( $post_id, $errors ) {
+	if ( $post_id && $post = get_post($post_id) ) {
+		if ( $post->post_type == 'attachment' )
+			$attachments = array($post->ID => $post);
+		else
+			$attachments = get_children("post_parent=$post_id&post_type=attachment&orderby=menu_order ASC, ID&order=DESC");
+	} else {
+		if ( is_array($GLOBALS['wp_the_query']->posts) )
+			foreach ( $GLOBALS['wp_the_query']->posts as $attachment )
+				$attachments[$attachment->ID] = $attachment;
+	}
+
+	if ( empty($attachments) )
+		return '';
+
+	foreach ( $attachments as $id => $attachment )
+		if ( $item = get_media_item( $id, array( 'errors' => isset($errors[$id]) ? $errors[$id] : null) ) )
+			$output .= "\n<div id='media-item-$id' class='media-item child-of-$attachment->post_parent preloaded'><div id='media-upload-error-$id'></div><div class='filename'></div><div class='progress'><div class='bar'></div></div>$item<div class='progress clickmask'></div>\n</div>";
+
+	return $output;
+}
+
+function get_media_item( $attachment_id, $args = null ) {
+	$default_args = array( 'errors' => null, 'send' => true, 'delete' => true, 'toggle' => true );
+	$args = wp_parse_args( $args, $default_args );
+	extract( $args, EXTR_SKIP );
+
+	global $post_mime_types;
+	if ( ( $attachment_id = intval($attachment_id) ) && $thumb_url = get_attachment_icon_src( $attachment_id ) )
+		$thumb_url = $thumb_url[0];
+	else
+		return false;
+
+	$title_label = __('Title');
+	$description_label = __('Description');
+	$tags_label = __('Tags');
+
+	$toggle_on = __('Show');
+	$toggle_off = __('Hide');
+
+	$post = get_post($attachment_id);
+
+	$filename = basename($post->guid);
+	$title = attribute_escape($post->post_title);
+	$description = attribute_escape($post->post_content);
+	if ( $_tags = get_the_tags($attachment_id) ) {
+		foreach ( $_tags as $tag )
+			$tags[] = $tag->name;
+		$tags = attribute_escape(join(', ', $tags));
+	}
+
+	if ( isset($post_mime_types) ) {
+		$keys = array_keys(wp_match_mime_types(array_keys($post_mime_types), $post->post_mime_type));
+		$type = array_shift($keys);
+		$type = "<input type='hidden' id='type-of-$attachment_id' value='$type' />";
+	}
+
+	$form_fields = get_attachment_fields_to_edit($post, $errors);
+
+	if ( $toggle ) {
+		$class = empty($errors) ? 'startclosed' : 'startopen';
+		$toggle_links = "
+	<a class='toggle describe-toggle-on' href='#'>$toggle_on</a>
+	<a class='toggle describe-toggle-off' href='#'>$toggle_off</a>";
+	} else {
+		$class = 'form-table';
+		$toggle_links = '';
+	}
+
+	$display_title = ( !empty( $title ) ) ? $title : $filename; // $title shouldn't ever be empty, but just in case
+
+	$item = "
+	$type
+	$toggle_links
+	<div class='filename new'>$display_title</div>
+	<table class='slidetoggle describe $class'>
+		<tbody class='media-item-info'>
+		<tr>
+			<td class='A1B1' rowspan='4'><img class='thumbnail' src='$thumb_url' alt='' /></td>
+			<td>$filename</td>
+		</tr>
+		<td>$post->post_mime_type</td></tr>
+		<tr><td>" . mysql2date($post->post_date, get_option('time_format')) . "</td></tr>
+		<tr><td>" . apply_filters('media_meta', '', $post) . "</tr></td>
+		</tbody>
+		<tbody>\n";
+
+	$defaults = array(
+		'input'      => 'text',
+		'required'   => false,
+		'value'      => '',
+		'extra_rows' => array(),
+	);
+
+	$delete_href = wp_nonce_url("post.php?action=delete-post&amp;post=$attachment_id", 'delete-post_' . $attachment_id);
+	if ( $send )
+		$send = "<button type='submit' class='button' value='1' name='send[$attachment_id]'>" . __('Insert into Post') . '</button>';
+	if ( $delete )
+		$delete = "<a href='$delete_href' id='del[$attachment_id]' disabled='disabled' class='delete'>" . __('Delete') . "</button>";
+	if ( ( $send || $delete ) && !isset($form_fields['buttons']) )
+		$form_fields['buttons'] = array('tr' => "\t\t<tr class='submit'><td></td><td class='savesend'>$send $delete</td></tr>\n");
+
+	$hidden_fields = array();
+
+	foreach ( $form_fields as $id => $field ) {
+		if ( $id{0} == '_' )
+			continue;
+
+		if ( !empty($field['tr']) ) {
+			$item .= $field['tr'];
+			continue;
+		}
+
+		$field = array_merge($defaults, $field);
+		$name = "attachments[$attachment_id][$id]";
+
+		if ( $field['input'] == 'hidden' ) {
+			$hidden_fields[$name] = $field['value'];
+			continue;
+		}
+
+		$required = $field['required'] ? '<abbr title="required" class="required">*</abbr>' : '';
+		$class  = $id;
+		$class .= $field['required'] ? ' form-required' : '';
+
+		$item .= "\t\t<tr class='$class'>\n\t\t\t<th valign='top' scope='row' class='label'><label for='$name'><span class='alignleft'>{$field['label']}</span><span class='alignright'>$required</span><br class='clear' /></label></th>\n\t\t\t<td class='field'>";
+		if ( !empty($field[$field['input']]) )
+			$item .= $field[$field['input']];
+		elseif ( $field['input'] == 'textarea' ) {
+			$item .= "<textarea type='text' id='$name' name='$name'>" . wp_specialchars($field['value'], 1) . "</textarea>";
+		} else {
+			$item .= "<input type='text' id='$name' name='$name' value='" . wp_specialchars($field['value'], 1) . "' />";
+		}
+		if ( !empty($field['helps']) )
+			$item .= "<p class='help'>" . join( "</p>\n<p class='help'>", array_unique((array) $field['helps']) ) . '</p>';
+		$item .= "</td>\n\t\t</tr>\n";
+
+		$extra_rows = array();
+
+		if ( !empty($field['errors']) )
+			foreach ( array_unique((array) $field['errors']) as $error )
+				$extra_rows['error'][] = $error;
+
+		if ( !empty($field['extra_rows']) )
+			foreach ( $field['extra_rows'] as $class => $rows )
+				foreach ( (array) $rows as $html )
+					$extra_rows[$class][] = $html;
+
+		foreach ( $extra_rows as $class => $rows )
+			foreach ( $rows as $html )
+				$item .= "\t\t<tr><td></td><td class='$class'>$html</td></tr>\n";
+	}
+
+	if ( !empty($form_fields['_final']) )
+		$item .= "\t\t<tr class='final'><td colspan='2'>{$form_fields['_final']}</td></tr>\n";
+	$item .= "\t</table>\n";
+
+	foreach ( $hidden_fields as $name => $value )
+		$item .= "\t<input type='hidden' name='$name' id='$name' value='" . wp_specialchars($value, 1) . "' />\n";
+
+	return $item;
+}
+
+function media_upload_header() {
+	?>
+	<script type="text/javascript">post_id = <?php echo intval($_REQUEST['post_id']); ?>;</script>
+	<div id="media-upload-header">
+	<?php the_media_upload_tabs(); ?>
+	</div>
+	<?php
+}
+
+function media_upload_form( $errors = null ) {
+	global $type, $tab;
+
+	$flash_action_url = get_option('siteurl') . "/wp-admin/async-upload.php";
+
+	// If Mac and mod_security, no Flash. :(
+	$flash = true;
+	if ( false !== strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'mac') && apache_mod_loaded('mod_security') )
+		$flash = false;
+
+	$flash = apply_filters('flash_uploader', $flash);
+	$post_id = intval($_REQUEST['post_id']);
+
+?>
+<input type='hidden' name='post_id' value='<?php echo $post_id; ?>' />
+<div id="media-upload-notice">
+<?php if (isset($errors['upload_notice']) ) { ?>
+	<?php echo $errors['upload_notice']; ?>
+<?php } ?>
+</div>
+<div id="media-upload-error">
+<?php if (isset($errors['upload_error']) && is_wp_error($errors['upload_error'])) { ?>
+	<?php echo $errors['upload_error']->get_error_message(); ?>
+<?php } ?>
+</div>
+<?php if ( $flash ) : ?>
+<script type="text/javascript">
+<!--
+jQuery(function($){
+	swfu = new SWFUpload({
+			upload_url : "<?php echo attribute_escape( $flash_action_url ); ?>",
+			flash_url : "<?php echo get_option('siteurl').'/wp-includes/js/swfupload/swfupload_f9.swf'; ?>",
+			file_post_name: "async-upload",
+			file_types: "*.*",
+			post_params : {
+				"post_id" : "<?php echo $post_id; ?>",
+				"auth_cookie" : "<?php echo $_COOKIE[AUTH_COOKIE]; ?>",
+				"type" : "<?php echo $type; ?>",
+				"tab" : "<?php echo $tab; ?>"
+			},
+			file_size_limit : "<?php echo wp_max_upload_size(); ?>b",
+			swfupload_element_id : "flash-upload-ui", // id of the element displayed when swfupload is available
+			degraded_element_id : "html-upload-ui",   // when swfupload is unavailable
+			file_dialog_start_handler : fileDialogStart,
+			file_queued_handler : fileQueued,
+			upload_start_handler : uploadStart,
+			upload_progress_handler : uploadProgress,
+			upload_error_handler : uploadError,
+			upload_success_handler : uploadSuccess,
+			upload_complete_handler : uploadComplete,
+			file_queue_error_handler : fileQueueError,
+			file_dialog_complete_handler : fileDialogComplete,
+
+			debug: false,
+		});
+	$("#flash-browse-button").bind( "click", function(){swfu.selectFiles();});
+});
+//-->
+</script>
+
+
+<div id="flash-upload-ui">
+	<p><input id="flash-browse-button" type="button" value="<?php _e('Choose files to upload'); ?>" class="button" /></p>
+	<p><?php _e('After a file has been uploaded, you can add titles and descriptions.'); ?></p>
+</div>
+
+<?php endif; // $flash ?>
+
+<div id="html-upload-ui">
+	<p>
+	<input type="file" name="async-upload" id="async-upload" /> <input type="submit" class="button" name="html-upload" value="<?php echo attribute_escape(__('Upload')); ?>" /> <a href="#" onClick="return top.tb_remove();"><?php _e('Cancel'); ?></a>
+	</p>
+	<input type="hidden" name="post_id" id="post_id" value="<?php echo $post_id; ?>" />
+	<br class="clear" />
+	<?php if ( is_lighttpd_before_150() ): ?>
+	<p><?php _e('If you want to use all capabilities of the uploader, like uploading multiple files at once, please upgrade to lighttpd 1.5.'); ?></p>
+	<?php endif;?>
+</div>
+<?php
+}
+
+function media_upload_type_form($type = 'file', $errors = null, $id = null) {
+	media_upload_header();
+
+	$post_id = intval($_REQUEST['post_id']);
+
+	$form_action_url = get_option('siteurl') . "/wp-admin/media-upload.php?type=$type&tab=type&post_id=$post_id";
+
+	$callback = "type_form_$type";
+?>
+
+<form enctype="multipart/form-data" method="post" action="<?php echo attribute_escape($form_action_url); ?>" class="media-upload-form type-form validate" id="<?php echo $type; ?>-form">
+<input type="hidden" name="post_id" id="post_id" value="<?php echo $post_id; ?>" />
+<?php wp_nonce_field('media-form'); ?>
+<h3><?php _e('From Computer'); ?></h3>
+<?php media_upload_form( $errors ); ?>
+
+<script type="text/javascript">
+<!--
+jQuery(function($){
+	var preloaded = $(".media-item.preloaded");
+	if ( preloaded.length > 0 ) {
+		preloaded.each(function(){prepareMediaItem({id:this.id.replace(/[^0-9]/g, '')},'');});
+	}
+	updateMediaForm();
+});
+-->
+</script>
+<?php if ( $id && !is_wp_error($id) ) : ?>
+<div id="media-items">
+<?php echo get_media_items( $id, $errors ); ?>
+</div>
+<input type="submit" class="button savebutton" name="save" value="<?php _e('Save all changes'); ?>" />
+
+<?php elseif ( is_callable($callback) ) : ?>
+
+<div class="media-blank">
+<p style="text-align:center"><?php _e('&mdash; OR &mdash;'); ?></p>
+<h3><?php _e('From URL'); ?></h3>
+</div>
+
+<div id="media-items">
+<div class="media-item media-blank">
+<?php echo call_user_func($callback); ?>
+</div>
+</div>
+<input type="submit" class="button savebutton" name="save" value="<?php _e('Save all changes'); ?>" />
+<?php
+	endif;
+}
+
+function media_upload_gallery_form($errors) {
+	media_upload_header();
+
+	$post_id = intval($_REQUEST['post_id']);
+
+	$form_action_url = get_option('siteurl') . "/wp-admin/media-upload.php?type={$GLOBALS['type']}&tab=gallery&post_id=$post_id";
+
+?>
+
+<script type="text/javascript">
+<!--
+jQuery(function($){
+	var preloaded = $(".media-item.preloaded");
+	if ( preloaded.length > 0 ) {
+		preloaded.each(function(){prepareMediaItem({id:this.id.replace(/[^0-9]/g, '')},'');});
+		updateMediaForm();
+	}
+});
+-->
+</script>
+
+<form enctype="multipart/form-data" method="post" action="<?php echo attribute_escape($form_action_url); ?>" class="media-upload-form validate" id="gallery-form">
+<?php wp_nonce_field('media-form'); ?>
+<?php //media_upload_form( $errors ); ?>
+
+<div id="media-items">
+<?php echo get_media_items($post_id, $errors); ?>
+</div>
+<input type="submit" class="button savebutton" name="save" value="<?php _e('Save all changes'); ?>" />
+<input type="submit" class="button insert-gallery" name="insert-gallery" value="<?php _e('Insert gallery into post'); ?>" />
+<input type="hidden" name="post_id" id="post_id" value="<?php echo $post_id; ?>" />
+<input type="hidden" name="type" value="<?php echo $GLOBALS['type']; ?>" />
+<input type="hidden" name="tab" value="<?php echo $GLOBALS['tab']; ?>" />
+</form>
+<?php
+}
+
+function media_upload_library_form($errors) {
+	global $wpdb, $wp_query, $wp_locale, $type, $tab, $post_mime_types;
+
+	media_upload_header();
+
+	$post_id = intval($_REQUEST['post_id']);
+
+	$form_action_url = get_option('siteurl') . "/wp-admin/media-upload.php?type={$GLOBALS['type']}&tab=library&post_id=$post_id";
+
+	$_GET['paged'] = intval($_GET['paged']);
+	if ( $_GET['paged'] < 1 )
+		$_GET['paged'] = 1;
+	$start = ( $_GET['paged'] - 1 ) * 10;
+	if ( $start < 1 )
+		$start = 0;
+	add_filter( 'post_limits', $limit_filter = create_function( '$a', "return 'LIMIT $start, 10';" ) );
+
+	list($post_mime_types, $avail_post_mime_types) = wp_edit_attachments_query();
+
+?>
+
+<form id="filter" action="" method="get">
+<input type="hidden" name="type" value="<?php echo $type; ?>" />
+<input type="hidden" name="tab" value="<?php echo $tab; ?>" />
+<input type="hidden" name="post_id" value="<?php echo $post_id; ?>" />
+<input type="hidden" name="post_mime_type" value="<?php echo wp_specialchars($_GET['post_mime_type'], true); ?>" />
+
+<div id="search-filter">
+	<input type="text" id="post-search-input" name="s" value="<?php the_search_query(); ?>" />
+	<input type="submit" value="<?php _e( 'Search Media' ); ?>" class="button" />
+</div>
+
+<p>
+<ul class="subsubsub">
+<?php
+$type_links = array();
+$_num_posts = (array) wp_count_attachments();
+$matches = wp_match_mime_types(array_keys($post_mime_types), array_keys($_num_posts));
+foreach ( $matches as $_type => $reals )
+	foreach ( $reals as $real )
+		$num_posts[$_type] += $_num_posts[$real];
+// If available type specified by media button clicked, filter by that type
+if ( empty($_GET['post_mime_type']) && !empty($num_posts[$type]) ) {
+	$_GET['post_mime_type'] = $type;
+	list($post_mime_types, $avail_post_mime_types) = wp_edit_attachments_query();
+}
+if ( empty($_GET['post_mime_type']) || $_GET['post_mime_type'] == 'all' )
+	$class = ' class="current"';
+$type_links[] = "<li><a href='" . add_query_arg(array('post_mime_type'=>'all', 'paged'=>false, 'm'=>false)) . "'$class>".__('All Types')."</a>";
+foreach ( $post_mime_types as $mime_type => $label ) {
+	$class = '';
+
+	if ( !wp_match_mime_types($mime_type, $avail_post_mime_types) )
+		continue;
+
+	if ( wp_match_mime_types($mime_type, $_GET['post_mime_type']) )
+		$class = ' class="current"';
+
+	$type_links[] = "<li><a href='" . add_query_arg(array('post_mime_type'=>$mime_type, 'paged'=>false)) . "'$class>" . sprintf(__ngettext($label[2][0], $label[2][1], $num_posts[$mime_type]), "<span id='$mime_type-counter'>" . number_format_i18n( $num_posts[$mime_type] ) . '</span>') . '</a>';
+}
+echo implode(' | </li>', $type_links) . '</li>';
+unset($type_links);
+?>
+</ul>
+</p>
+
+<div class="tablenav">
+
+<?php
+$page_links = paginate_links( array(
+	'base' => add_query_arg( 'paged', '%#%' ),
+	'format' => '',
+	'total' => ceil($wp_query->found_posts / 10),
+	'current' => $_GET['paged']
+));
+
+if ( $page_links )
+	echo "<div class='tablenav-pages'>$page_links</div>";
+?>
+
+<div class="alignleft">
+<?php
+
+$arc_query = "SELECT DISTINCT YEAR(post_date) AS yyear, MONTH(post_date) AS mmonth FROM $wpdb->posts WHERE post_type = 'attachment' ORDER BY post_date DESC";
+
+$arc_result = $wpdb->get_results( $arc_query );
+
+$month_count = count($arc_result);
+
+if ( $month_count && !( 1 == $month_count && 0 == $arc_result[0]->mmonth ) ) { ?>
+<select name='m'>
+<option<?php selected( @$_GET['m'], 0 ); ?> value='0'><?php _e('Show all dates'); ?></option>
+<?php
+foreach ($arc_result as $arc_row) {
+	if ( $arc_row->yyear == 0 )
+		continue;
+	$arc_row->mmonth = zeroise( $arc_row->mmonth, 2 );
+
+	if ( $arc_row->yyear . $arc_row->mmonth == $_GET['m'] )
+		$default = ' selected="selected"';
+	else
+		$default = '';
+
+	echo "<option$default value='$arc_row->yyear$arc_row->mmonth'>";
+	echo $wp_locale->get_month($arc_row->mmonth) . " $arc_row->yyear";
+	echo "</option>\n";
+}
+?>
+</select>
+<?php } ?>
+
+<input type="submit" id="post-query-submit" value="<?php _e('Filter &#187;'); ?>" class="button-secondary" />
+
+</div>
+
+<br class="clear" />
+</div>
+</form>
+
+<form enctype="multipart/form-data" method="post" action="<?php echo attribute_escape($form_action_url); ?>" class="media-upload-form validate" id="library-form">
+
+<?php wp_nonce_field('media-form'); ?>
+<?php //media_upload_form( $errors ); ?>
+
+<script type="text/javascript">
+<!--
+jQuery(function($){
+	var preloaded = $(".media-item.preloaded");
+	if ( preloaded.length > 0 ) {
+		preloaded.each(function(){prepareMediaItem({id:this.id.replace(/[^0-9]/g, '')},'');});
+		updateMediaForm();
+	}
+});
+-->
+</script>
+
+<div id="media-items">
+<?php echo get_media_items(null, $errors); ?>
+</div>
+<input type="submit" class="button savebutton" name="save" value="<?php _e('Save all changes'); ?>" />
+<input type="hidden" name="post_id" id="post_id" value="<?php echo $post_id; ?>" />
+</form>
+<?php
+}
+
+function type_form_image() {
+	return '
+	<table class="describe"><tbody>
+		<tr>
+			<th valign="top" scope="row" class="label">
+				<span class="alignleft"><label for="insertonly[src]">' . __('Image URL') . '</label></span>
+				<span class="alignright"><abbr title="required" class="required">*</abbr></span>
+			</th>
+			<td class="field"><input id="insertonly[src]" name="insertonly[src]" value="" type="text"></td>
+		</tr>
+		<tr>
+			<th valign="top" scope="row" class="label">
+				<span class="alignleft"><label for="insertonly[alt]">' . __('Description') . '</label></span>
+				<span class="alignright"><abbr title="required" class="required">*</abbr></span>
+			</th>
+			<td class="field"><input id="insertonly[alt]" name="insertonly[alt]" value="" type="text"></td>
+		</tr>
+		<tr><td></td><td class="help">' . __('Alternate text, e.g. "The Mona Lisa"') . '</td></tr>
+		<tr class="align">
+			<th valign="top" scope="row" class="label"><label for="insertonly[align]">' . __('Alignment') . '</label></th>
+			<td class="field">
+				<input name="insertonly[align]" id="image-align-none-0" value="none" type="radio" checked="checked" />
+				<label for="image-align-none-0" class="align image-align-none-label">' . __('None') . '</label>
+				<input name="insertonly[align]" id="image-align-left-0" value="left" type="radio" />
+				<label for="image-align-left-0" class="align image-align-left-label">' . __('Left') . '</label>
+				<input name="insertonly[align]" id="image-align-center-0" value="center" type="radio" />
+				<label for="image-align-center-0" class="align image-align-center-label">' . __('Center') . '</label>
+				<input name="insertonly[align]" id="image-align-right-0" value="right" type="radio" />
+				<label for="image-align-right-0" class="align image-align-right-label">' . __('Right') . '</label>
+			</td>
+		</tr>
+		<tr>
+			<td></td>
+			<td>
+				<input type="submit" class="button" name="insertonlybutton" value="' . attribute_escape(__('Insert into Post')) . '" />
+			</td>
+		</tr>
+	</tbody></table>
+';
+}
+
+function type_form_audio() {
+	return '
+	<table class="describe"><tbody>
+		<tr>
+			<th valign="top" scope="row" class="label">
+				<span class="alignleft"><label for="insertonly[href]">' . __('Audio File URL') . '</label></span>
+				<span class="alignright"><abbr title="required" class="required">*</abbr></span>
+			</th>
+			<td class="field"><input id="insertonly[href]" name="insertonly[href]" value="" type="text"></td>
+		</tr>
+		<tr>
+			<th valign="top" scope="row" class="label">
+				<span class="alignleft"><label for="insertonly[title]">' . __('Title') . '</label></span>
+				<span class="alignright"><abbr title="required" class="required">*</abbr></span>
+			</th>
+			<td class="field"><input id="insertonly[title]" name="insertonly[title]" value="" type="text"></td>
+		</tr>
+		<tr><td></td><td class="help">' . __('Link text, e.g. "Still Alive by Jonathan Coulton"') . '</td></tr>
+		<tr>
+			<td></td>
+			<td>
+				<input type="submit" class="button" name="insertonlybutton" value="' . attribute_escape(__('Insert into Post')) . '" />
+			</td>
+		</tr>
+	</tbody></table>
+';
+}
+
+function type_form_video() {
+	return '
+	<table class="describe"><tbody>
+		<tr>
+			<th valign="top" scope="row" class="label">
+				<span class="alignleft"><label for="insertonly[href]">' . __('Video URL') . '</label></span>
+				<span class="alignright"><abbr title="required" class="required">*</abbr></span>
+			</th>
+			<td class="field"><input id="insertonly[href]" name="insertonly[href]" value="" type="text"></td>
+		</tr>
+		<tr>
+			<th valign="top" scope="row" class="label">
+				<span class="alignleft"><label for="insertonly[title]">' . __('Title') . '</label></span>
+				<span class="alignright"><abbr title="required" class="required">*</abbr></span>
+			</th>
+			<td class="field"><input id="insertonly[title]" name="insertonly[title]" value="" type="text"></td>
+		</tr>
+		<tr><td></td><td class="help">' . __('Link text, e.g. "Lucy on YouTube"') . '</td></tr>
+		<tr>
+			<td></td>
+			<td>
+				<input type="submit" class="button" name="insertonlybutton" value="' . attribute_escape(__('Insert into Post')) . '" />
+			</td>
+		</tr>
+	</tbody></table>
+';
+}
+
+function type_form_file() {
+	return '
+	<table class="describe"><tbody>
+		<tr>
+			<th valign="top" scope="row" class="label">
+				<span class="alignleft"><label for="insertonly[href]">' . __('URL') . '</label></span>
+				<span class="alignright"><abbr title="required" class="required">*</abbr></span>
+			</th>
+			<td class="field"><input id="insertonly[href]" name="insertonly[href]" value="" type="text"></td>
+		</tr>
+		<tr>
+			<th valign="top" scope="row" class="label">
+				<span class="alignleft"><label for="insertonly[title]">' . __('Title') . '</label></span>
+				<span class="alignright"><abbr title="required" class="required">*</abbr></span>
+			</th>
+			<td class="field"><input id="insertonly[title]" name="insertonly[title]" value="" type="text"></td>
+		</tr>
+		<tr><td></td><td class="help">' . __('Link text, e.g. "Ransom Demands (PDF)"') . '</td></tr>
+		<tr>
+			<td></td>
+			<td>
+				<input type="submit" class="button" name="insertonlybutton" value="' . attribute_escape(__('Insert into Post')) . '" />
+			</td>
+		</tr>
+	</tbody></table>
+';
+}
+
+add_filter('async_upload_image', 'get_media_item', 10, 2);
+add_filter('async_upload_audio', 'get_media_item', 10, 2);
+add_filter('async_upload_video', 'get_media_item', 10, 2);
+add_filter('async_upload_file', 'get_media_item', 10, 2);
+
+add_action('media_upload_image', 'media_upload_image');
+add_action('media_upload_audio', 'media_upload_audio');
+add_action('media_upload_video', 'media_upload_video');
+add_action('media_upload_file', 'media_upload_file');
+add_action('admin_head_media_upload_type_form', 'media_admin_css');
+
+add_filter('media_upload_gallery', 'media_upload_gallery');
+add_action('admin_head_media_upload_gallery_form', 'media_admin_css');
+
+add_filter('media_upload_library', 'media_upload_library');
+add_action('admin_head_media_upload_library_form', 'media_admin_css');
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/misc.php 2.5.src/wp-admin/includes/misc.php
--- 2.2.2.src/wp-admin/includes/misc.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/misc.php	2008-03-24 19:22:37.000000000 -0500
@@ -0,0 +1,163 @@
+<?php
+
+function got_mod_rewrite() {
+	$got_rewrite = apache_mod_loaded('mod_rewrite', true);
+	return apply_filters('got_rewrite', $got_rewrite);
+}
+
+// Returns an array of strings from a file (.htaccess ) from between BEGIN
+// and END markers.
+function extract_from_markers( $filename, $marker ) {
+	$result = array ();
+
+	if (!file_exists( $filename ) ) {
+		return $result;
+	}
+
+	if ( $markerdata = explode( "\n", implode( '', file( $filename ) ) ));
+	{
+		$state = false;
+		foreach ( $markerdata as $markerline ) {
+			if (strpos($markerline, '# END ' . $marker) !== false)
+				$state = false;
+			if ( $state )
+				$result[] = $markerline;
+			if (strpos($markerline, '# BEGIN ' . $marker) !== false)
+				$state = true;
+		}
+	}
+
+	return $result;
+}
+
+// Inserts an array of strings into a file (.htaccess ), placing it between
+// BEGIN and END markers.  Replaces existing marked info.  Retains surrounding
+// data.  Creates file if none exists.
+// Returns true on write success, false on failure.
+function insert_with_markers( $filename, $marker, $insertion ) {
+	if (!file_exists( $filename ) || is_writeable( $filename ) ) {
+		if (!file_exists( $filename ) ) {
+			$markerdata = '';
+		} else {
+			$markerdata = explode( "\n", implode( '', file( $filename ) ) );
+		}
+
+		$f = fopen( $filename, 'w' );
+		$foundit = false;
+		if ( $markerdata ) {
+			$state = true;
+			foreach ( $markerdata as $n => $markerline ) {
+				if (strpos($markerline, '# BEGIN ' . $marker) !== false)
+					$state = false;
+				if ( $state ) {
+					if ( $n + 1 < count( $markerdata ) )
+						fwrite( $f, "{$markerline}\n" );
+					else
+						fwrite( $f, "{$markerline}" );
+				}
+				if (strpos($markerline, '# END ' . $marker) !== false) {
+					fwrite( $f, "# BEGIN {$marker}\n" );
+					if ( is_array( $insertion ))
+						foreach ( $insertion as $insertline )
+							fwrite( $f, "{$insertline}\n" );
+					fwrite( $f, "# END {$marker}\n" );
+					$state = true;
+					$foundit = true;
+				}
+			}
+		}
+		if (!$foundit) {
+			fwrite( $f, "# BEGIN {$marker}\n" );
+			foreach ( $insertion as $insertline )
+				fwrite( $f, "{$insertline}\n" );
+			fwrite( $f, "# END {$marker}\n" );
+		}
+		fclose( $f );
+		return true;
+	} else {
+		return false;
+	}
+}
+
+/**
+ * Updates the htaccess file with the current rules if it is writable.
+ *
+ * Always writes to the file if it exists and is writable to ensure that we blank out old rules.
+ */
+
+function save_mod_rewrite_rules() {
+	global $wp_rewrite;
+
+	$home_path = get_home_path();
+	$htaccess_file = $home_path.'.htaccess';
+
+	// If the file doesn't already exists check for write access to the directory and whether of not we have some rules.
+	// else check for write access to the file.
+	if ((!file_exists($htaccess_file) && is_writable($home_path) && $wp_rewrite->using_mod_rewrite_permalinks()) || is_writable($htaccess_file)) {
+		if ( got_mod_rewrite() ) {
+			$rules = explode( "\n", $wp_rewrite->mod_rewrite_rules() );
+			return insert_with_markers( $htaccess_file, 'WordPress', $rules );
+		}
+	}
+
+	return false;
+}
+
+function update_recently_edited( $file ) {
+	$oldfiles = (array ) get_option( 'recently_edited' );
+	if ( $oldfiles ) {
+		$oldfiles = array_reverse( $oldfiles );
+		$oldfiles[] = $file;
+		$oldfiles = array_reverse( $oldfiles );
+		$oldfiles = array_unique( $oldfiles );
+		if ( 5 < count( $oldfiles ))
+			array_pop( $oldfiles );
+	} else {
+		$oldfiles[] = $file;
+	}
+	update_option( 'recently_edited', $oldfiles );
+}
+
+// If siteurl or home changed, flush rewrite rules.
+function update_home_siteurl( $old_value, $value ) {
+	global $wp_rewrite;
+
+	if ( defined( "WP_INSTALLING" ) )
+		return;
+
+	// If home changed, write rewrite rules to new location.
+	$wp_rewrite->flush_rules();
+}
+
+add_action( 'update_option_home', 'update_home_siteurl', 10, 2 );
+add_action( 'update_option_siteurl', 'update_home_siteurl', 10, 2 );
+
+function url_shorten( $url ) {
+	$short_url = str_replace( 'http://', '', stripslashes( $url ));
+	$short_url = str_replace( 'www.', '', $short_url );
+	if ('/' == substr( $short_url, -1 ))
+		$short_url = substr( $short_url, 0, -1 );
+	if ( strlen( $short_url ) > 35 )
+		$short_url = substr( $short_url, 0, 32 ).'...';
+	return $short_url;
+}
+
+function wp_reset_vars( $vars ) {
+	for ( $i=0; $i<count( $vars ); $i += 1 ) {
+		$var = $vars[$i];
+		global $$var;
+
+		if (!isset( $$var ) ) {
+			if ( empty( $_POST["$var"] ) ) {
+				if ( empty( $_GET["$var"] ) )
+					$$var = '';
+				else
+					$$var = $_GET["$var"];
+			} else {
+				$$var = $_POST["$var"];
+			}
+		}
+	}
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/plugin.php 2.5.src/wp-admin/includes/plugin.php
--- 2.2.2.src/wp-admin/includes/plugin.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/plugin.php	2008-03-23 11:36:05.000000000 -0500
@@ -0,0 +1,492 @@
+<?php
+
+function get_plugin_data( $plugin_file ) {
+	$plugin_data = implode( '', file( $plugin_file ));
+	preg_match( '|Plugin Name:(.*)$|mi', $plugin_data, $plugin_name );
+	preg_match( '|Plugin URI:(.*)$|mi', $plugin_data, $plugin_uri );
+	preg_match( '|Description:(.*)$|mi', $plugin_data, $description );
+	preg_match( '|Author:(.*)$|mi', $plugin_data, $author_name );
+	preg_match( '|Author URI:(.*)$|mi', $plugin_data, $author_uri );
+
+	if ( preg_match( "|Version:(.*)|i", $plugin_data, $version ))
+		$version = trim( $version[1] );
+	else
+		$version = '';
+
+	$description = wptexturize( trim( $description[1] ));
+
+	$name = $plugin_name[1];
+	$name = trim( $name );
+	$plugin = $name;
+	if ('' != trim($plugin_uri[1]) && '' != $name ) {
+		$plugin = '<a href="' . trim( $plugin_uri[1] ) . '" title="'.__( 'Visit plugin homepage' ).'">'.$plugin.'</a>';
+	}
+
+	if ('' == $author_uri[1] ) {
+		$author = trim( $author_name[1] );
+	} else {
+		$author = '<a href="' . trim( $author_uri[1] ) . '" title="'.__( 'Visit author homepage' ).'">' . trim( $author_name[1] ) . '</a>';
+	}
+
+	return array('Name' => $name, 'Title' => $plugin, 'Description' => $description, 'Author' => $author, 'Version' => $version);
+}
+
+function get_plugins($plugin_folder = '') {
+	global $wp_plugins;
+
+	if ( isset( $wp_plugins ) ) {
+		return $wp_plugins;
+	}
+
+	$wp_plugins = array ();
+	$plugin_root = ABSPATH . PLUGINDIR;
+	if( !empty($plugin_folder) )
+		$plugin_root .= $plugin_folder;
+
+	// Files in wp-content/plugins directory
+	$plugins_dir = @ opendir( $plugin_root);
+	if ( $plugins_dir ) {
+		while (($file = readdir( $plugins_dir ) ) !== false ) {
+			if ( substr($file, 0, 1) == '.' )
+				continue;
+			if ( is_dir( $plugin_root.'/'.$file ) ) {
+				$plugins_subdir = @ opendir( $plugin_root.'/'.$file );
+				if ( $plugins_subdir ) {
+					while (($subfile = readdir( $plugins_subdir ) ) !== false ) {
+						if ( substr($subfile, 0, 1) == '.' )
+							continue;
+						if ( substr($subfile, -4) == '.php' )
+							$plugin_files[] = "$file/$subfile";
+					}
+				}
+			} else {
+				if ( substr($file, -4) == '.php' )
+					$plugin_files[] = $file;
+			}
+		}
+	}
+	@closedir( $plugins_dir );
+	@closedir( $plugins_subdir );
+
+	if ( !$plugins_dir || !$plugin_files )
+		return $wp_plugins;
+
+	foreach ( $plugin_files as $plugin_file ) {
+		if ( !is_readable( "$plugin_root/$plugin_file" ) )
+			continue;
+
+		$plugin_data = get_plugin_data( "$plugin_root/$plugin_file" );
+
+		if ( empty ( $plugin_data['Name'] ) )
+			continue;
+
+		$wp_plugins[plugin_basename( $plugin_file )] = $plugin_data;
+	}
+
+	uasort( $wp_plugins, create_function( '$a, $b', 'return strnatcasecmp( $a["Name"], $b["Name"] );' ));
+
+	return $wp_plugins;
+}
+
+function is_plugin_active($plugin){
+	return in_array($plugin, get_option('active_plugins'));
+}
+
+function activate_plugin($plugin, $redirect = '') {
+		$current = get_option('active_plugins');
+		$plugin = trim($plugin);
+
+		$valid = validate_plugin($plugin);
+		if ( is_wp_error($valid) )
+			return $valid;
+
+		if ( !in_array($plugin, $current) ) {
+			if ( !empty($redirect) )
+				wp_redirect(add_query_arg('_error_nonce', wp_create_nonce('plugin-activation-error_' . $plugin), $redirect)); // we'll override this later if the plugin can be included without fatal error
+			ob_start();
+			@include(ABSPATH . PLUGINDIR . '/' . $plugin);
+			$current[] = $plugin;
+			sort($current);
+			update_option('active_plugins', $current);
+			do_action('activate_' . $plugin);
+			ob_end_clean();
+		}
+
+		return null;
+}
+
+function deactivate_plugins($plugins, $silent= false) {
+	$current = get_option('active_plugins');
+
+	if ( !is_array($plugins) )
+		$plugins = array($plugins);
+
+	foreach ( $plugins as $plugin ) {
+		if( ! is_plugin_active($plugin) )
+			continue;
+		array_splice($current, array_search( $plugin, $current), 1 ); // Fixed Array-fu!
+		if ( ! $silent ) //Used by Plugin updater to internally deactivate plugin, however, not to notify plugins of the fact to prevent plugin output.
+			do_action('deactivate_' . trim( $plugin ));
+	}
+
+	update_option('active_plugins', $current);
+}
+
+function deactivate_all_plugins() {
+	$current = get_option('active_plugins');
+	if ( empty($current) )
+		return;
+
+	deactivate_plugins($current);
+
+	update_option('deactivated_plugins', $current);
+}
+
+function reactivate_all_plugins($redirect = '') {
+	$plugins = get_option('deactivated_plugins');
+
+	if ( empty($plugins) )
+		return;
+
+	if ( !empty($redirect) )
+		wp_redirect(add_query_arg('_error_nonce', wp_create_nonce('plugin-activation-error_' . $plugin), $redirect));
+
+	$errors = array();
+	foreach ( (array) $plugins as $plugin ) {
+		$result = activate_plugin($plugin);
+		if ( is_wp_error($result) )
+			$errors[$plugin] = $result;
+	}
+
+	delete_option('deactivated_plugins');
+
+	if ( !empty($errors) )
+		return new WP_Error('plugins_invalid', __('One of the plugins is invalid.'), $errors);
+
+	return true;
+}
+
+function validate_active_plugins() {
+	$check_plugins = get_option('active_plugins');
+
+	// Sanity check.  If the active plugin list is not an array, make it an
+	// empty array.
+	if ( !is_array($check_plugins) ) {
+		update_option('active_plugins', array());
+		return;
+	}
+
+	// If a plugin file does not exist, remove it from the list of active
+	// plugins.
+	foreach ( $check_plugins as $check_plugin ) {
+		if ( !file_exists(ABSPATH . PLUGINDIR . '/' . $check_plugin) ) {
+			$current = get_option('active_plugins');
+			$key = array_search($check_plugin, $current);
+			if ( false !== $key && NULL !== $key ) {
+				unset($current[$key]);
+				update_option('active_plugins', $current);
+			}
+		}
+	}
+}
+
+function validate_plugin($plugin) {
+	if ( validate_file($plugin) )
+		return new WP_Error('plugin_invalid', __('Invalid plugin.'));
+	if ( ! file_exists(ABSPATH . PLUGINDIR . '/' . $plugin) )
+		return new WP_Error('plugin_not_found', __('Plugin file does not exist.'));
+
+	return 0;
+}
+
+//
+// Menu
+//
+
+function add_menu_page( $page_title, $menu_title, $access_level, $file, $function = '' ) {
+	global $menu, $admin_page_hooks;
+
+	$file = plugin_basename( $file );
+
+	$menu[] = array ( $menu_title, $access_level, $file, $page_title );
+
+	$admin_page_hooks[$file] = sanitize_title( $menu_title );
+
+	$hookname = get_plugin_page_hookname( $file, '' );
+	if (!empty ( $function ) && !empty ( $hookname ))
+		add_action( $hookname, $function );
+
+	return $hookname;
+}
+
+function add_submenu_page( $parent, $page_title, $menu_title, $access_level, $file, $function = '' ) {
+	global $submenu;
+	global $menu;
+	global $_wp_real_parent_file;
+	global $_wp_submenu_nopriv;
+
+	$file = plugin_basename( $file );
+
+	$parent = plugin_basename( $parent);
+	if ( isset( $_wp_real_parent_file[$parent] ) )
+		$parent = $_wp_real_parent_file[$parent];
+
+	if ( !current_user_can( $access_level ) ) {
+		$_wp_submenu_nopriv[$parent][$file] = true;
+		return false;
+	}
+
+	// If the parent doesn't already have a submenu, add a link to the parent
+	// as the first item in the submenu.  If the submenu file is the same as the
+	// parent file someone is trying to link back to the parent manually.  In
+	// this case, don't automatically add a link back to avoid duplication.
+	if (!isset( $submenu[$parent] ) && $file != $parent  ) {
+		foreach ( $menu as $parent_menu ) {
+			if ( $parent_menu[2] == $parent && current_user_can( $parent_menu[1] ) )
+				$submenu[$parent][] = $parent_menu;
+		}
+	}
+
+	$submenu[$parent][] = array ( $menu_title, $access_level, $file, $page_title );
+
+	$hookname = get_plugin_page_hookname( $file, $parent);
+	if (!empty ( $function ) && !empty ( $hookname ))
+		add_action( $hookname, $function );
+
+	return $hookname;
+}
+
+function add_management_page( $page_title, $menu_title, $access_level, $file, $function = '' ) {
+	return add_submenu_page( 'edit.php', $page_title, $menu_title, $access_level, $file, $function );
+}
+
+function add_options_page( $page_title, $menu_title, $access_level, $file, $function = '' ) {
+	return add_submenu_page( 'options-general.php', $page_title, $menu_title, $access_level, $file, $function );
+}
+
+function add_theme_page( $page_title, $menu_title, $access_level, $file, $function = '' ) {
+	return add_submenu_page( 'themes.php', $page_title, $menu_title, $access_level, $file, $function );
+}
+
+function add_users_page( $page_title, $menu_title, $access_level, $file, $function = '' ) {
+	if ( current_user_can('edit_users') )
+		$parent = 'users.php';
+	else
+		$parent = 'profile.php';
+	return add_submenu_page( $parent, $page_title, $menu_title, $access_level, $file, $function );
+}
+
+//
+// Pluggable Menu Support -- Private
+//
+
+function get_admin_page_parent() {
+	global $parent_file;
+	global $menu;
+	global $submenu;
+	global $pagenow;
+	global $plugin_page;
+	global $_wp_real_parent_file;
+	global $_wp_menu_nopriv;
+	global $_wp_submenu_nopriv;
+
+	if ( !empty ( $parent_file ) ) {
+		if ( isset( $_wp_real_parent_file[$parent_file] ) )
+			$parent_file = $_wp_real_parent_file[$parent_file];
+
+		return $parent_file;
+	}
+
+	if ( $pagenow == 'admin.php' && isset( $plugin_page ) ) {
+		foreach ( $menu as $parent_menu ) {
+			if ( $parent_menu[2] == $plugin_page ) {
+				$parent_file = $plugin_page;
+				if ( isset( $_wp_real_parent_file[$parent_file] ) )
+					$parent_file = $_wp_real_parent_file[$parent_file];
+				return $parent_file;
+			}
+		}
+		if ( isset( $_wp_menu_nopriv[$plugin_page] ) ) {
+			$parent_file = $plugin_page;
+			if ( isset( $_wp_real_parent_file[$parent_file] ) )
+					$parent_file = $_wp_real_parent_file[$parent_file];
+			return $parent_file;
+		}
+	}
+
+	if ( isset( $plugin_page ) && isset( $_wp_submenu_nopriv[$pagenow][$plugin_page] ) ) {
+		$parent_file = $pagenow;
+		if ( isset( $_wp_real_parent_file[$parent_file] ) )
+			$parent_file = $_wp_real_parent_file[$parent_file];
+		return $parent_file;
+	}
+
+	foreach (array_keys( $submenu ) as $parent) {
+		foreach ( $submenu[$parent] as $submenu_array ) {
+			if ( isset( $_wp_real_parent_file[$parent] ) )
+				$parent = $_wp_real_parent_file[$parent];
+			if ( $submenu_array[2] == $pagenow ) {
+				$parent_file = $parent;
+				return $parent;
+			} else
+				if ( isset( $plugin_page ) && ($plugin_page == $submenu_array[2] ) ) {
+					$parent_file = $parent;
+					return $parent;
+				}
+		}
+	}
+
+	$parent_file = '';
+	return '';
+}
+
+function get_admin_page_title() {
+	global $title;
+	global $menu;
+	global $submenu;
+	global $pagenow;
+	global $plugin_page;
+
+	if ( isset( $title ) && !empty ( $title ) ) {
+		return $title;
+	}
+
+	$hook = get_plugin_page_hook( $plugin_page, $pagenow );
+
+	$parent = $parent1 = get_admin_page_parent();
+	if ( empty ( $parent) ) {
+		foreach ( $menu as $menu_array ) {
+			if ( isset( $menu_array[3] ) ) {
+				if ( $menu_array[2] == $pagenow ) {
+					$title = $menu_array[3];
+					return $menu_array[3];
+				} else
+					if ( isset( $plugin_page ) && ($plugin_page == $menu_array[2] ) && ($hook == $menu_array[3] ) ) {
+						$title = $menu_array[3];
+						return $menu_array[3];
+					}
+			} else {
+				$title = $menu_array[0];
+				return $title;
+			}
+		}
+	} else {
+		foreach (array_keys( $submenu ) as $parent) {
+			foreach ( $submenu[$parent] as $submenu_array ) {
+				if ( isset( $plugin_page ) &&
+					($plugin_page == $submenu_array[2] ) &&
+					(($parent == $pagenow ) || ($parent == $plugin_page ) || ($plugin_page == $hook ) || (($pagenow == 'admin.php' ) && ($parent1 != $submenu_array[2] ) ) )
+					) {
+						$title = $submenu_array[3];
+						return $submenu_array[3];
+					}
+
+				if ( $submenu_array[2] != $pagenow || isset( $_GET['page'] ) ) // not the current page
+					continue;
+
+				if ( isset( $submenu_array[3] ) ) {
+					$title = $submenu_array[3];
+					return $submenu_array[3];
+				} else {
+					$title = $submenu_array[0];
+					return $title;
+				}
+			}
+		}
+	}
+
+	return $title;
+}
+
+function get_plugin_page_hook( $plugin_page, $parent_page ) {
+	$hook = get_plugin_page_hookname( $plugin_page, $parent_page );
+	if ( has_action($hook) )
+		return $hook;
+	else
+		return null;
+}
+
+function get_plugin_page_hookname( $plugin_page, $parent_page ) {
+	global $admin_page_hooks;
+
+	$parent = get_admin_page_parent();
+
+	if ( empty ( $parent_page ) || 'admin.php' == $parent_page ) {
+		if ( isset( $admin_page_hooks[$plugin_page] ))
+			$page_type = 'toplevel';
+		else
+			if ( isset( $admin_page_hooks[$parent] ))
+				$page_type = $admin_page_hooks[$parent];
+	} else
+		if ( isset( $admin_page_hooks[$parent_page] ) ) {
+			$page_type = $admin_page_hooks[$parent_page];
+		} else {
+			$page_type = 'admin';
+		}
+
+	$plugin_name = preg_replace( '!\.php!', '', $plugin_page );
+
+	return $page_type.'_page_'.$plugin_name;
+}
+
+function user_can_access_admin_page() {
+	global $pagenow;
+	global $menu;
+	global $submenu;
+	global $_wp_menu_nopriv;
+	global $_wp_submenu_nopriv;
+	global $plugin_page;
+
+	$parent = get_admin_page_parent();
+
+	if ( isset( $_wp_submenu_nopriv[$parent][$pagenow] ) )
+		return false;
+
+	if ( isset( $plugin_page ) && isset( $_wp_submenu_nopriv[$parent][$plugin_page] ) )
+		return false;
+
+	if ( empty( $parent) ) {
+		if ( isset( $_wp_menu_nopriv[$pagenow] ) )
+			return false;
+		if ( isset( $_wp_submenu_nopriv[$pagenow][$pagenow] ) )
+			return false;
+		if ( isset( $plugin_page ) && isset( $_wp_submenu_nopriv[$pagenow][$plugin_page] ) )
+			return false;
+		foreach (array_keys( $_wp_submenu_nopriv ) as $key ) {
+			if ( isset( $_wp_submenu_nopriv[$key][$pagenow] ) )
+				return false;
+			if ( isset( $plugin_page ) && isset( $_wp_submenu_nopriv[$key][$plugin_page] ) )
+			return false;
+		}
+		return true;
+	}
+
+	if ( isset( $submenu[$parent] ) ) {
+		foreach ( $submenu[$parent] as $submenu_array ) {
+			if ( isset( $plugin_page ) && ( $submenu_array[2] == $plugin_page ) ) {
+				if ( current_user_can( $submenu_array[1] ))
+					return true;
+				else
+					return false;
+			} else if ( $submenu_array[2] == $pagenow ) {
+				if ( current_user_can( $submenu_array[1] ))
+					return true;
+				else
+					return false;
+			}
+		}
+	}
+
+	foreach ( $menu as $menu_array ) {
+		if ( $menu_array[2] == $parent) {
+			if ( current_user_can( $menu_array[1] ))
+				return true;
+			else
+				return false;
+		}
+	}
+
+	return true;
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/post.php 2.5.src/wp-admin/includes/post.php
--- 2.2.2.src/wp-admin/includes/post.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/post.php	2008-03-26 15:06:18.000000000 -0500
@@ -0,0 +1,695 @@
+<?php
+
+// Update an existing post with values provided in $_POST.
+function edit_post() {
+
+	$post_ID = (int) $_POST['post_ID'];
+
+	if ( 'page' == $_POST['post_type'] ) {
+		if ( !current_user_can( 'edit_page', $post_ID ) )
+			wp_die( __('You are not allowed to edit this page.' ));
+	} else {
+		if ( !current_user_can( 'edit_post', $post_ID ) )
+			wp_die( __('You are not allowed to edit this post.' ));
+	}
+
+	// Autosave shouldn't save too soon after a real save
+	if ( 'autosave' == $_POST['action'] ) {
+		$post =& get_post( $post_ID );
+		$now = time();
+		$then = strtotime($post->post_date_gmt . ' +0000');
+		$delta = AUTOSAVE_INTERVAL / 2;
+		if ( ($now - $then) < $delta )
+			return $post_ID;
+	}
+
+	// Rename.
+	$_POST['ID'] = (int) $_POST['post_ID'];
+	$_POST['post_content'] = $_POST['content'];
+	$_POST['post_excerpt'] = $_POST['excerpt'];
+	$_POST['post_parent'] = isset($_POST['parent_id'])? $_POST['parent_id'] : '';
+	$_POST['to_ping'] = $_POST['trackback_url'];
+
+	if (!empty ( $_POST['post_author_override'] ) ) {
+		$_POST['post_author'] = (int) $_POST['post_author_override'];
+	} else
+		if (!empty ( $_POST['post_author'] ) ) {
+			$_POST['post_author'] = (int) $_POST['post_author'];
+		} else {
+			$_POST['post_author'] = (int) $_POST['user_ID'];
+		}
+
+	if ( $_POST['post_author'] != $_POST['user_ID'] ) {
+		if ( 'page' == $_POST['post_type'] ) {
+			if ( !current_user_can( 'edit_others_pages' ) )
+				wp_die( __('You are not allowed to edit pages as this user.' ));
+		} else {
+			if ( !current_user_can( 'edit_others_posts' ) )
+				wp_die( __('You are not allowed to edit posts as this user.' ));
+
+		}
+	}
+
+	// What to do based on which button they pressed
+	if ( isset($_POST['saveasdraft']) && '' != $_POST['saveasdraft'] )
+		$_POST['post_status'] = 'draft';
+	if ( isset($_POST['saveasprivate']) && '' != $_POST['saveasprivate'] )
+		$_POST['post_status'] = 'private';
+	if ( isset($_POST['publish']) && ( '' != $_POST['publish'] ) && ( $_POST['post_status'] != 'private' ) )
+		$_POST['post_status'] = 'publish';
+	if ( isset($_POST['advanced']) && '' != $_POST['advanced'] )
+		$_POST['post_status'] = 'draft';
+
+	if ( 'page' == $_POST['post_type'] ) {
+		if ('publish' == $_POST['post_status'] && !current_user_can( 'publish_pages' ))
+			$_POST['post_status'] = 'pending';
+	} else {
+		if ('publish' == $_POST['post_status'] && !current_user_can( 'publish_posts' ))
+			$_POST['post_status'] = 'pending';
+	}
+
+	if (!isset( $_POST['comment_status'] ))
+		$_POST['comment_status'] = 'closed';
+
+	if (!isset( $_POST['ping_status'] ))
+		$_POST['ping_status'] = 'closed';
+
+	foreach ( array ('aa', 'mm', 'jj', 'hh', 'mm') as $timeunit ) {
+		if ( !empty( $_POST['hidden_' . $timeunit] ) && $_POST['hidden_' . $timeunit] != $_POST[$timeunit] ) {
+			$_POST['edit_date'] = '1';
+			break;
+		}
+	}
+
+	if (!empty ( $_POST['edit_date'] ) ) {
+		$aa = $_POST['aa'];
+		$mm = $_POST['mm'];
+		$jj = $_POST['jj'];
+		$hh = $_POST['hh'];
+		$mn = $_POST['mn'];
+		$ss = $_POST['ss'];
+		$jj = ($jj > 31 ) ? 31 : $jj;
+		$hh = ($hh > 23 ) ? $hh -24 : $hh;
+		$mn = ($mn > 59 ) ? $mn -60 : $mn;
+		$ss = ($ss > 59 ) ? $ss -60 : $ss;
+		$_POST['post_date'] = "$aa-$mm-$jj $hh:$mn:$ss";
+		$_POST['post_date_gmt'] = get_gmt_from_date( "$aa-$mm-$jj $hh:$mn:$ss" );
+	}
+
+	// Meta Stuff
+	if ( isset($_POST['meta']) && $_POST['meta'] ) {
+		foreach ( $_POST['meta'] as $key => $value )
+			update_meta( $key, $value['key'], $value['value'] );
+	}
+
+	if ( isset($_POST['deletemeta']) && $_POST['deletemeta'] ) {
+		foreach ( $_POST['deletemeta'] as $key => $value )
+			delete_meta( $key );
+	}
+
+	add_meta( $post_ID );
+
+	wp_update_post( $_POST );
+
+	// Reunite any orphaned attachments with their parent
+	if ( !$draft_ids = get_user_option( 'autosave_draft_ids' ) )
+		$draft_ids = array();
+	if ( $draft_temp_id = (int) array_search( $post_ID, $draft_ids ) )
+		_relocate_children( $draft_temp_id, $post_ID );
+
+	// Now that we have an ID we can fix any attachment anchor hrefs
+	_fix_attachment_links( $post_ID );
+
+	wp_set_post_lock( $post_ID, $GLOBALS['current_user']->ID );
+
+	return $post_ID;
+}
+
+// Default post information to use when populating the "Write Post" form.
+function get_default_post_to_edit() {
+	if ( !empty( $_REQUEST['post_title'] ) )
+		$post_title = wp_specialchars( stripslashes( $_REQUEST['post_title'] ));
+	else if ( !empty( $_REQUEST['popuptitle'] ) ) {
+		$post_title = wp_specialchars( stripslashes( $_REQUEST['popuptitle'] ));
+		$post_title = funky_javascript_fix( $post_title );
+	} else {
+		$post_title = '';
+	}
+
+	$post_content = '';
+	if ( !empty( $_REQUEST['content'] ) )
+		$post_content = wp_specialchars( stripslashes( $_REQUEST['content'] ));
+	else if ( !empty( $post_title ) ) {
+		$text       = wp_specialchars( stripslashes( urldecode( $_REQUEST['text'] ) ) );
+		$text       = funky_javascript_fix( $text);
+		$popupurl   = clean_url($_REQUEST['popupurl']);
+        $post_content = '<a href="'.$popupurl.'">'.$post_title.'</a>'."\n$text";
+    }
+
+	if ( !empty( $_REQUEST['excerpt'] ) )
+		$post_excerpt = wp_specialchars( stripslashes( $_REQUEST['excerpt'] ));
+	else
+		$post_excerpt = '';
+
+	$post->ID = 0;
+	$post->post_name = '';
+	$post->post_author = '';
+	$post->post_date = '';
+	$post->post_status = 'draft';
+	$post->post_type = 'post';
+	$post->to_ping = '';
+	$post->pinged = '';
+	$post->comment_status = get_option( 'default_comment_status' );
+	$post->ping_status = get_option( 'default_ping_status' );
+	$post->post_pingback = get_option( 'default_pingback_flag' );
+	$post->post_category = get_option( 'default_category' );
+	$post->post_content = apply_filters( 'default_content', $post_content);
+	$post->post_title = apply_filters( 'default_title', $post_title );
+	$post->post_excerpt = apply_filters( 'default_excerpt', $post_excerpt);
+	$post->page_template = 'default';
+	$post->post_parent = 0;
+	$post->menu_order = 0;
+
+	return $post;
+}
+
+function get_default_page_to_edit() {
+ 	$page = get_default_post_to_edit();
+ 	$page->post_type = 'page';
+ 	return $page;
+}
+
+// Get an existing post and format it for editing.
+function get_post_to_edit( $id ) {
+
+	$post = get_post( $id, OBJECT, 'edit' );
+
+	if ( $post->post_type == 'page' )
+		$post->page_template = get_post_meta( $id, '_wp_page_template', true );
+
+	return $post;
+}
+
+function post_exists($title, $content = '', $post_date = '') {
+	global $wpdb;
+
+	if (!empty ($post_date))
+		$post_date = "AND post_date = '$post_date'";
+
+	if (!empty ($title))
+		return $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_title = '$title' $post_date");
+	else
+		if (!empty ($content))
+			return $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_content = '$content' $post_date");
+
+	return 0;
+}
+
+// Creates a new post from the "Write Post" form using $_POST information.
+function wp_write_post() {
+	global $user_ID;
+
+	if ( 'page' == $_POST['post_type'] ) {
+		if ( !current_user_can( 'edit_pages' ) )
+			return new WP_Error( 'edit_pages', __( 'You are not allowed to create pages on this blog.' ) );
+	} else {
+		if ( !current_user_can( 'edit_posts' ) )
+			return new WP_Error( 'edit_posts', __( 'You are not allowed to create posts or drafts on this blog.' ) );
+	}
+
+
+	// Check for autosave collisions
+	$temp_id = false;
+	if ( isset($_POST['temp_ID']) ) {
+		$temp_id = (int) $_POST['temp_ID'];
+		if ( !$draft_ids = get_user_option( 'autosave_draft_ids' ) )
+			$draft_ids = array();
+		foreach ( $draft_ids as $temp => $real )
+			if ( time() + $temp > 86400 ) // 1 day: $temp is equal to -1 * time( then )
+				unset($draft_ids[$temp]);
+
+		if ( isset($draft_ids[$temp_id]) ) { // Edit, don't write
+			$_POST['post_ID'] = $draft_ids[$temp_id];
+			unset($_POST['temp_ID']);
+			update_user_option( $user_ID, 'autosave_draft_ids', $draft_ids );
+			return edit_post();
+		}
+	}
+
+	// Rename.
+	$_POST['post_content'] = $_POST['content'];
+	$_POST['post_excerpt'] = $_POST['excerpt'];
+	$_POST['post_parent'] = isset($_POST['parent_id'])? $_POST['parent_id'] : '';
+	$_POST['to_ping'] = $_POST['trackback_url'];
+
+	if (!empty ( $_POST['post_author_override'] ) ) {
+		$_POST['post_author'] = (int) $_POST['post_author_override'];
+	} else {
+		if (!empty ( $_POST['post_author'] ) ) {
+			$_POST['post_author'] = (int) $_POST['post_author'];
+		} else {
+			$_POST['post_author'] = (int) $_POST['user_ID'];
+		}
+
+	}
+
+	if ( $_POST['post_author'] != $_POST['user_ID'] ) {
+		if ( 'page' == $_POST['post_type'] ) {
+			if ( !current_user_can( 'edit_others_pages' ) )
+				return new WP_Error( 'edit_others_pages', __( 'You are not allowed to create pages as this user.' ) );
+		} else {
+			if ( !current_user_can( 'edit_others_posts' ) )
+				return new WP_Error( 'edit_others_posts', __( 'You are not allowed to post as this user.' ) );
+
+		}
+	}
+
+	// What to do based on which button they pressed
+	if ( isset($_POST['saveasdraft']) && '' != $_POST['saveasdraft'] )
+		$_POST['post_status'] = 'draft';
+	if ( isset($_POST['saveasprivate']) && '' != $_POST['saveasprivate'] )
+		$_POST['post_status'] = 'private';
+	if ( isset($_POST['publish']) && ( '' != $_POST['publish'] ) && ( $_POST['post_status'] != 'private' ) )
+		$_POST['post_status'] = 'publish';
+	if ( isset($_POST['advanced']) && '' != $_POST['advanced'] )
+		$_POST['post_status'] = 'draft';
+
+	if ( 'page' == $_POST['post_type'] ) {
+		if ('publish' == $_POST['post_status'] && !current_user_can( 'publish_pages' ) )
+			$_POST['post_status'] = 'pending';
+	} else {
+		if ('publish' == $_POST['post_status'] && !current_user_can( 'publish_posts' ) )
+			$_POST['post_status'] = 'pending';
+	}
+
+	if (!isset( $_POST['comment_status'] ))
+		$_POST['comment_status'] = 'closed';
+
+	if (!isset( $_POST['ping_status'] ))
+		$_POST['ping_status'] = 'closed';
+
+	foreach ( array ('aa', 'mm', 'jj', 'hh', 'mm') as $timeunit ) {
+		if ( !empty( $_POST['hidden_' . $timeunit] ) && $_POST['hidden_' . $timeunit] != $_POST[$timeunit] ) {
+			$_POST['edit_date'] = '1';
+			break;
+		}
+	}
+
+	if (!empty ( $_POST['edit_date'] ) ) {
+		$aa = $_POST['aa'];
+		$mm = $_POST['mm'];
+		$jj = $_POST['jj'];
+		$hh = $_POST['hh'];
+		$mn = $_POST['mn'];
+		$ss = $_POST['ss'];
+		$jj = ($jj > 31 ) ? 31 : $jj;
+		$hh = ($hh > 23 ) ? $hh -24 : $hh;
+		$mn = ($mn > 59 ) ? $mn -60 : $mn;
+		$ss = ($ss > 59 ) ? $ss -60 : $ss;
+		$_POST['post_date'] = sprintf( "%04d-%02d-%02d %02d:%02d:%02d", $aa, $mm, $jj, $hh, $mn, $ss );
+		$_POST['post_date_gmt'] = get_gmt_from_date( $_POST['post_date'] );
+	}
+
+	// Create the post.
+	$post_ID = wp_insert_post( $_POST );
+	if ( is_wp_error( $post_ID ) )
+		return $post_ID;
+
+	if ( empty($post_ID) )
+		return 0;
+
+	add_meta( $post_ID );
+
+	// Reunite any orphaned attachments with their parent
+	if ( !$draft_ids = get_user_option( 'autosave_draft_ids' ) )
+		$draft_ids = array();
+	if ( $draft_temp_id = (int) array_search( $post_ID, $draft_ids ) )
+		_relocate_children( $draft_temp_id, $post_ID );
+	if ( $temp_id && $temp_id != $draft_temp_id )
+		_relocate_children( $temp_id, $post_ID );
+
+	// Update autosave collision detection
+	if ( $temp_id ) {
+		$draft_ids[$temp_id] = $post_ID;
+		update_user_option( $user_ID, 'autosave_draft_ids', $draft_ids );
+	}
+
+	// Now that we have an ID we can fix any attachment anchor hrefs
+	_fix_attachment_links( $post_ID );
+
+	wp_set_post_lock( $post_ID, $GLOBALS['current_user']->ID );
+
+	return $post_ID;
+}
+
+function write_post() {
+	$result = wp_write_post();
+	if( is_wp_error( $result ) )
+		wp_die( $result->get_error_message() );
+	else
+		return $result;
+}
+
+//
+// Post Meta
+//
+
+function add_meta( $post_ID ) {
+	global $wpdb;
+	$post_ID = (int) $post_ID;
+
+	$protected = array( '_wp_attached_file', '_wp_attachment_metadata', '_wp_old_slug', '_wp_page_template' );
+
+	$metakeyselect = $wpdb->escape( stripslashes( trim( $_POST['metakeyselect'] ) ) );
+	$metakeyinput = $wpdb->escape( stripslashes( trim( $_POST['metakeyinput'] ) ) );
+	$metavalue = maybe_serialize( stripslashes( (trim( $_POST['metavalue'] ) ) ));
+	$metavalue = $wpdb->escape( $metavalue );
+
+	if ( ('0' === $metavalue || !empty ( $metavalue ) ) && ((('#NONE#' != $metakeyselect) && !empty ( $metakeyselect) ) || !empty ( $metakeyinput) ) ) {
+		// We have a key/value pair. If both the select and the
+		// input for the key have data, the input takes precedence:
+
+ 		if ('#NONE#' != $metakeyselect)
+			$metakey = $metakeyselect;
+
+		if ( $metakeyinput)
+			$metakey = $metakeyinput; // default
+
+		if ( in_array($metakey, $protected) )
+			return false;
+
+		wp_cache_delete($post_ID, 'post_meta');
+
+		$wpdb->query( "
+				INSERT INTO $wpdb->postmeta
+				(post_id,meta_key,meta_value )
+				VALUES ('$post_ID','$metakey','$metavalue' )
+			" );
+		return $wpdb->insert_id;
+	}
+	return false;
+} // add_meta
+
+function delete_meta( $mid ) {
+	global $wpdb;
+	$mid = (int) $mid;
+
+	$post_id = $wpdb->get_var("SELECT post_id FROM $wpdb->postmeta WHERE meta_id = '$mid'");
+	wp_cache_delete($post_id, 'post_meta');
+
+	return $wpdb->query( "DELETE FROM $wpdb->postmeta WHERE meta_id = '$mid'" );
+}
+
+// Get a list of previously defined keys
+function get_meta_keys() {
+	global $wpdb;
+
+	$keys = $wpdb->get_col( "
+			SELECT meta_key
+			FROM $wpdb->postmeta
+			GROUP BY meta_key
+			ORDER BY meta_key" );
+
+	return $keys;
+}
+
+function get_post_meta_by_id( $mid ) {
+	global $wpdb;
+	$mid = (int) $mid;
+
+	$meta = $wpdb->get_row( "SELECT * FROM $wpdb->postmeta WHERE meta_id = '$mid'" );
+	if ( is_serialized_string( $meta->meta_value ) )
+		$meta->meta_value = maybe_unserialize( $meta->meta_value );
+	return $meta;
+}
+
+// Some postmeta stuff
+function has_meta( $postid ) {
+	global $wpdb;
+
+	return $wpdb->get_results( "
+			SELECT meta_key, meta_value, meta_id, post_id
+			FROM $wpdb->postmeta
+			WHERE post_id = '$postid'
+			ORDER BY meta_key,meta_id", ARRAY_A );
+
+}
+
+function update_meta( $mid, $mkey, $mvalue ) {
+	global $wpdb;
+
+	$protected = array( '_wp_attached_file', '_wp_attachment_metadata', '_wp_old_slug', '_wp_page_template' );
+
+	if ( in_array($mkey, $protected) )
+		return false;
+
+	$post_id = $wpdb->get_var("SELECT post_id FROM $wpdb->postmeta WHERE meta_id = '$mid'");
+	wp_cache_delete($post_id, 'post_meta');
+
+	$mvalue = maybe_serialize( stripslashes( $mvalue ));
+	$mvalue = $wpdb->escape( $mvalue );
+	$mid = (int) $mid;
+	return $wpdb->query( "UPDATE $wpdb->postmeta SET meta_key = '$mkey', meta_value = '$mvalue' WHERE meta_id = '$mid'" );
+}
+
+//
+// Private
+//
+
+// Replace hrefs of attachment anchors with up-to-date permalinks.
+function _fix_attachment_links( $post_ID ) {
+
+	$post = & get_post( $post_ID, ARRAY_A );
+
+	$search = "#<a[^>]+rel=('|\")[^'\"]*attachment[^>]*>#ie";
+
+	// See if we have any rel="attachment" links
+	if ( 0 == preg_match_all( $search, $post['post_content'], $anchor_matches, PREG_PATTERN_ORDER ) )
+		return;
+
+	$i = 0;
+	$search = "#[\s]+rel=(\"|')(.*?)wp-att-(\d+)\\1#i";
+	foreach ( $anchor_matches[0] as $anchor ) {
+		if ( 0 == preg_match( $search, $anchor, $id_matches ) )
+			continue;
+
+		$id = (int) $id_matches[3];
+
+		// While we have the attachment ID, let's adopt any orphans.
+		$attachment = & get_post( $id, ARRAY_A );
+		if ( ! empty( $attachment) && ! is_object( get_post( $attachment['post_parent'] ) ) ) {
+			$attachment['post_parent'] = $post_ID;
+			// Escape data pulled from DB.
+			$attachment = add_magic_quotes( $attachment);
+			wp_update_post( $attachment);
+		}
+
+		$post_search[$i] = $anchor;
+		$post_replace[$i] = preg_replace( "#href=(\"|')[^'\"]*\\1#e", "stripslashes( 'href=\\1' ).get_attachment_link( $id ).stripslashes( '\\1' )", $anchor );
+		++$i;
+	}
+
+	$post['post_content'] = str_replace( $post_search, $post_replace, $post['post_content'] );
+
+	// Escape data pulled from DB.
+	$post = add_magic_quotes( $post);
+
+	return wp_update_post( $post);
+}
+
+// Move child posts to a new parent
+function _relocate_children( $old_ID, $new_ID ) {
+	global $wpdb;
+	$old_ID = (int) $old_ID;
+	$new_ID = (int) $new_ID;
+	return $wpdb->query( "UPDATE $wpdb->posts SET post_parent = $new_ID WHERE post_parent = $old_ID" );
+}
+
+function get_available_post_statuses($type = 'post') {
+	global $wpdb;
+
+	$stati = $wpdb->get_col($wpdb->prepare("SELECT DISTINCT post_status FROM $wpdb->posts WHERE post_type = %s", $type));
+	return $stati;
+}
+
+function wp_edit_posts_query( $q = false ) {
+	global $wpdb;
+	if ( false === $q )
+		$q = $_GET;
+	$q['m']   = (int) $q['m'];
+	$q['cat'] = (int) $q['cat'];
+	$post_stati  = array(	//	array( adj, noun )
+				'publish' => array(__('Published'), __('Published posts'), __ngettext_noop('Published (%s)', 'Published (%s)')),
+				'future' => array(__('Scheduled'), __('Scheduled posts'), __ngettext_noop('Scheduled (%s)', 'Scheduled (%s)')),
+				'pending' => array(__('Pending Review'), __('Pending posts'), __ngettext_noop('Pending Review (%s)', 'Pending Review (%s)')),
+				'draft' => array(__('Draft'), _c('Drafts|manage posts header'), __ngettext_noop('Draft (%s)', 'Drafts (%s)')),
+				'private' => array(__('Private'), __('Private posts'), __ngettext_noop('Private (%s)', 'Private (%s)')),
+			);
+
+	$post_stati = apply_filters('post_stati', $post_stati);
+
+	$avail_post_stati = get_available_post_statuses('post');
+
+	$post_status_q = '';
+	if ( isset($q['post_status']) && in_array( $q['post_status'], array_keys($post_stati) ) ) {
+		$post_status_q = '&post_status=' . $q['post_status'];
+		$post_status_q .= '&perm=readable';
+	}
+
+	if ( 'pending' === $q['post_status'] ) {
+		$order = 'ASC';
+		$orderby = 'modified';
+	} elseif ( 'draft' === $q['post_status'] ) {
+		$order = 'DESC';
+		$orderby = 'modified';
+	} else {
+		$order = 'DESC';
+		$orderby = 'date';
+	}
+
+	wp("post_type=post&what_to_show=posts$post_status_q&posts_per_page=15&order=$order&orderby=$orderby");
+
+	return array($post_stati, $avail_post_stati);
+}
+
+function get_available_post_mime_types($type = 'attachment') {
+	global $wpdb;
+
+	$types = $wpdb->get_col($wpdb->prepare("SELECT DISTINCT post_mime_type FROM $wpdb->posts WHERE post_type = %s", $type));
+	return $types;
+}
+
+function wp_edit_attachments_query( $q = false ) {
+	global $wpdb;
+	if ( false === $q )
+		$q = $_GET;
+	$q['m']   = (int) $q['m'];
+	$q['cat'] = (int) $q['cat'];
+	$q['post_type'] = 'attachment';
+	$q['post_status'] = 'any';
+	$q['posts_per_page'] = 15;
+	$post_mime_types = array(	//	array( adj, noun )
+				'image' => array(__('Images'), __('Manage Images'), __ngettext_noop('Image (%s)', 'Images (%s)')),
+				'audio' => array(__('Audio'), __('Manage Audio'), __ngettext_noop('Audio (%s)', 'Audio (%s)')),
+				'video' => array(__('Video'), __('Manage Video'), __ngettext_noop('Video (%s)', 'Video (%s)')),
+			);
+	$post_mime_types = apply_filters('post_mime_types', $post_mime_types);
+
+	$avail_post_mime_types = get_available_post_mime_types('attachment');
+
+	if ( isset($q['post_mime_type']) && !array_intersect( (array) $q['post_mime_type'], array_keys($post_mime_types) ) )
+		unset($q['post_mime_type']);
+
+	wp($q);
+
+	return array($post_mime_types, $avail_post_mime_types);
+}
+
+function postbox_classes( $id, $page ) {
+	$current_user = wp_get_current_user();
+	if ( $closed = get_usermeta( $current_user->ID, 'closedpostboxes_'.$page ) ) {
+		if ( !is_array( $closed ) ) return '';
+		return in_array( $id, $closed )? 'if-js-closed' : '';
+	} else {
+		if ( 'tagsdiv' == $id || 'categorydiv' == $id ) return '';
+		else return 'if-js-closed';
+	}
+}
+
+function get_sample_permalink($id, $title=null, $name = null) {
+	$post = &get_post($id);
+	if (!$post->ID) {
+		return array('', '');
+	}
+	$original_status = $post->post_status;
+	$original_date = $post->post_date;
+	$original_name = $post->post_name;
+
+	// Hack: get_permalink would return ugly permalink for
+	// drafts, so we will fake, that our post is published
+	if (in_array($post->post_status, array('draft', 'pending'))) {
+		$post->post_status = 'publish';
+		$post->post_date = date('Y-m-d H:i:s');
+		$post->post_name = sanitize_title($post->post_name? $post->post_name : $post->post_title, $post->ID); 
+	}
+
+	// If the user wants to set a new name -- override the current one
+	// Note: if empty name is supplied -- use the title instead, see #6072
+	if (!is_null($name)) {
+		$post->post_name = sanitize_title($name? $name : $title, $post->ID);
+	}
+
+	$permalink = get_permalink($post, true);
+
+	// Handle page hierarchy
+	if ( 'page' == $post->post_type ) {
+		$uri = get_page_uri($post->ID);
+		$uri = untrailingslashit($uri);
+		$uri = strrev( stristr( strrev( $uri ), '/' ) );
+		$uri = untrailingslashit($uri);
+		if ( !empty($uri) )
+			$uri .='/';
+		$permalink = str_replace('%pagename%', "${uri}%pagename%", $permalink);
+	}
+
+	$permalink = array($permalink, $post->post_name);
+	$post->post_status = $original_status;
+	$post->post_date = $original_date;
+	$post->post_name = $original_name;
+	$post->post_title = $original_title;
+	return $permalink;
+}
+
+function get_sample_permalink_html($id, $new_title=null, $new_slug=null) {
+	$post = &get_post($id);
+	list($permalink, $post_name) = get_sample_permalink($post->ID, $new_title, $new_slug);
+	if (false === strpos($permalink, '%postname%') && false === strpos($permalink, '%pagename%')) {
+		return '';
+	}
+	$title = __('Click to edit this part of the permalink');
+	if (strlen($post_name) > 30) {
+		$post_name_abridged = substr($post_name, 0, 14). '&hellip;' . substr($post_name, -14);
+	} else {
+		$post_name_abridged = $post_name;
+	}
+	$post_name_html = '<span id="editable-post-name" title="'.$title.'">'.$post_name_abridged.'</span><span id="editable-post-name-full">'.$post_name.'</span>';
+	$display_link = str_replace(array('%pagename%','%postname%'), $post_name_html, $permalink);
+	$return = '<strong>' . __('Permalink:') . "</strong>\n" . '<span id="sample-permalink">' . $display_link . "</span>\n";
+	$return .= '<span id="edit-slug-buttons"><a href="#post_name" class="edit-slug" onclick="edit_permalink(' . $id . '); return false;">' . __('Edit') . "</a></span>\n";
+	return $return;
+}
+
+// false: not locked or locked by current user
+// int: user ID of user with lock
+function wp_check_post_lock( $post_id ) {
+	global $current_user;
+
+	if ( !$post = get_post( $post_id ) )
+		return false;
+
+	$lock = get_post_meta( $post->ID, '_edit_lock', true );
+	$last = get_post_meta( $post->ID, '_edit_last', true );
+
+	$time_window = apply_filters( 'wp_check_post_lock_window', AUTOSAVE_INTERVAL * 2 );
+
+	if ( $lock && $lock > time() - $time_window && $last != $current_user->ID )
+		return $last;
+	return false;
+}
+
+function wp_set_post_lock( $post_id ) {
+	global $current_user;
+	if ( !$post = get_post( $post_id ) )
+		return false;
+	if ( !$current_user || !$current_user->ID )
+		return false;
+
+	$now = time();
+
+	if ( !add_post_meta( $post->ID, '_edit_lock', $now, true ) )
+		update_post_meta( $post->ID, '_edit_lock', $now );
+	if ( !add_post_meta( $post->ID, '_edit_last', $current_user->ID, true ) )
+		update_post_meta( $post->ID, '_edit_last', $current_user->ID );
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/schema.php 2.5.src/wp-admin/includes/schema.php
--- 2.2.2.src/wp-admin/includes/schema.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/schema.php	2008-03-06 00:07:53.000000000 -0600
@@ -0,0 +1,426 @@
+<?php
+// Here we keep the DB structure and option values
+
+$charset_collate = '';
+
+// Declare these as global in case schema.php is included from a function.
+global $wpdb, $wp_queries;
+
+if ( $wpdb->supports_collation() ) {
+	if ( ! empty($wpdb->charset) )
+		$charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
+	if ( ! empty($wpdb->collate) )
+		$charset_collate .= " COLLATE $wpdb->collate";
+}
+
+$wp_queries="CREATE TABLE $wpdb->terms (
+ term_id bigint(20) NOT NULL auto_increment,
+ name varchar(55) NOT NULL default '',
+ slug varchar(200) NOT NULL default '',
+ term_group bigint(10) NOT NULL default 0,
+ PRIMARY KEY  (term_id),
+ UNIQUE KEY slug (slug)
+) $charset_collate;
+CREATE TABLE $wpdb->term_taxonomy (
+ term_taxonomy_id bigint(20) NOT NULL auto_increment,
+ term_id bigint(20) NOT NULL default 0,
+ taxonomy varchar(32) NOT NULL default '',
+ description longtext NOT NULL,
+ parent bigint(20) NOT NULL default 0,
+ count bigint(20) NOT NULL default 0,
+ PRIMARY KEY  (term_taxonomy_id),
+ UNIQUE KEY term_id_taxonomy (term_id,taxonomy)
+) $charset_collate;
+CREATE TABLE $wpdb->term_relationships (
+ object_id bigint(20) NOT NULL default 0,
+ term_taxonomy_id bigint(20) NOT NULL default 0,
+ term_order int(11) NOT NULL default 0,
+ PRIMARY KEY  (object_id,term_taxonomy_id),
+ KEY term_taxonomy_id (term_taxonomy_id)
+) $charset_collate;
+CREATE TABLE $wpdb->comments (
+  comment_ID bigint(20) unsigned NOT NULL auto_increment,
+  comment_post_ID int(11) NOT NULL default '0',
+  comment_author tinytext NOT NULL,
+  comment_author_email varchar(100) NOT NULL default '',
+  comment_author_url varchar(200) NOT NULL default '',
+  comment_author_IP varchar(100) NOT NULL default '',
+  comment_date datetime NOT NULL default '0000-00-00 00:00:00',
+  comment_date_gmt datetime NOT NULL default '0000-00-00 00:00:00',
+  comment_content text NOT NULL,
+  comment_karma int(11) NOT NULL default '0',
+  comment_approved varchar(20) NOT NULL default '1',
+  comment_agent varchar(255) NOT NULL default '',
+  comment_type varchar(20) NOT NULL default '',
+  comment_parent bigint(20) NOT NULL default '0',
+  user_id bigint(20) NOT NULL default '0',
+  PRIMARY KEY  (comment_ID),
+  KEY comment_approved (comment_approved),
+  KEY comment_post_ID (comment_post_ID),
+  KEY comment_approved_date_gmt (comment_approved,comment_date_gmt),
+  KEY comment_date_gmt (comment_date_gmt)
+) $charset_collate;
+CREATE TABLE $wpdb->links (
+  link_id bigint(20) NOT NULL auto_increment,
+  link_url varchar(255) NOT NULL default '',
+  link_name varchar(255) NOT NULL default '',
+  link_image varchar(255) NOT NULL default '',
+  link_target varchar(25) NOT NULL default '',
+  link_category bigint(20) NOT NULL default '0',
+  link_description varchar(255) NOT NULL default '',
+  link_visible varchar(20) NOT NULL default 'Y',
+  link_owner int(11) NOT NULL default '1',
+  link_rating int(11) NOT NULL default '0',
+  link_updated datetime NOT NULL default '0000-00-00 00:00:00',
+  link_rel varchar(255) NOT NULL default '',
+  link_notes mediumtext NOT NULL,
+  link_rss varchar(255) NOT NULL default '',
+  PRIMARY KEY  (link_id),
+  KEY link_category (link_category),
+  KEY link_visible (link_visible)
+) $charset_collate;
+CREATE TABLE $wpdb->options (
+  option_id bigint(20) NOT NULL auto_increment,
+  blog_id int(11) NOT NULL default '0',
+  option_name varchar(64) NOT NULL default '',
+  option_value longtext NOT NULL,
+  autoload varchar(20) NOT NULL default 'yes',
+  PRIMARY KEY  (option_id,blog_id,option_name),
+  KEY option_name (option_name)
+) $charset_collate;
+CREATE TABLE $wpdb->postmeta (
+  meta_id bigint(20) NOT NULL auto_increment,
+  post_id bigint(20) NOT NULL default '0',
+  meta_key varchar(255) default NULL,
+  meta_value longtext,
+  PRIMARY KEY  (meta_id),
+  KEY post_id (post_id),
+  KEY meta_key (meta_key)
+) $charset_collate;
+CREATE TABLE $wpdb->posts (
+  ID bigint(20) unsigned NOT NULL auto_increment,
+  post_author bigint(20) NOT NULL default '0',
+  post_date datetime NOT NULL default '0000-00-00 00:00:00',
+  post_date_gmt datetime NOT NULL default '0000-00-00 00:00:00',
+  post_content longtext NOT NULL,
+  post_title text NOT NULL,
+  post_category int(4) NOT NULL default '0',
+  post_excerpt text NOT NULL,
+  post_status varchar(20) NOT NULL default 'publish',
+  comment_status varchar(20) NOT NULL default 'open',
+  ping_status varchar(20) NOT NULL default 'open',
+  post_password varchar(20) NOT NULL default '',
+  post_name varchar(200) NOT NULL default '',
+  to_ping text NOT NULL,
+  pinged text NOT NULL,
+  post_modified datetime NOT NULL default '0000-00-00 00:00:00',
+  post_modified_gmt datetime NOT NULL default '0000-00-00 00:00:00',
+  post_content_filtered text NOT NULL,
+  post_parent bigint(20) NOT NULL default '0',
+  guid varchar(255) NOT NULL default '',
+  menu_order int(11) NOT NULL default '0',
+  post_type varchar(20) NOT NULL default 'post',
+  post_mime_type varchar(100) NOT NULL default '',
+  comment_count bigint(20) NOT NULL default '0',
+  PRIMARY KEY  (ID),
+  KEY post_name (post_name),
+  KEY type_status_date (post_type,post_status,post_date,ID)
+) $charset_collate;
+CREATE TABLE $wpdb->users (
+  ID bigint(20) unsigned NOT NULL auto_increment,
+  user_login varchar(60) NOT NULL default '',
+  user_pass varchar(64) NOT NULL default '',
+  user_nicename varchar(50) NOT NULL default '',
+  user_email varchar(100) NOT NULL default '',
+  user_url varchar(100) NOT NULL default '',
+  user_registered datetime NOT NULL default '0000-00-00 00:00:00',
+  user_activation_key varchar(60) NOT NULL default '',
+  user_status int(11) NOT NULL default '0',
+  display_name varchar(250) NOT NULL default '',
+  PRIMARY KEY  (ID),
+  KEY user_login_key (user_login),
+  KEY user_nicename (user_nicename)
+) $charset_collate;
+CREATE TABLE $wpdb->usermeta (
+  umeta_id bigint(20) NOT NULL auto_increment,
+  user_id bigint(20) NOT NULL default '0',
+  meta_key varchar(255) default NULL,
+  meta_value longtext,
+  PRIMARY KEY  (umeta_id),
+  KEY user_id (user_id),
+  KEY meta_key (meta_key)
+) $charset_collate;";
+
+function populate_options() {
+	global $wpdb, $wp_db_version;
+
+	$schema = ( isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on' ) ? 'https://' : 'http://';
+	$guessurl = preg_replace('|/wp-admin/.*|i', '', $schema . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
+	add_option('siteurl', $guessurl);
+	add_option('blogname', __('My Blog'));
+	add_option('blogdescription', __('Just another WordPress weblog'));
+	add_option('users_can_register', 0);
+	add_option('admin_email', 'you@example.com');
+	add_option('start_of_week', 1);
+	add_option('use_balanceTags', 0);
+	add_option('use_smilies', 1);
+	add_option('require_name_email', 1);
+	add_option('comments_notify', 1);
+	add_option('posts_per_rss', 10);
+	add_option('rss_excerpt_length', 50);
+	add_option('rss_use_excerpt', 0);
+	add_option('mailserver_url', 'mail.example.com');
+	add_option('mailserver_login', 'login@example.com');
+	add_option('mailserver_pass', 'password');
+	add_option('mailserver_port', 110);
+	add_option('default_category', 1);
+	add_option('default_comment_status', 'open');
+	add_option('default_ping_status', 'open');
+	add_option('default_pingback_flag', 1);
+	add_option('default_post_edit_rows', 10);
+	add_option('posts_per_page', 10);
+	add_option('what_to_show', 'posts');
+	add_option('date_format', __('F j, Y'));
+	add_option('time_format', __('g:i a'));
+	add_option('links_updated_date_format', __('F j, Y g:i a'));
+	add_option('links_recently_updated_prepend', '<em>');
+	add_option('links_recently_updated_append', '</em>');
+	add_option('links_recently_updated_time', 120);
+	add_option('comment_moderation', 0);
+	add_option('moderation_notify', 1);
+	add_option('permalink_structure');
+	add_option('gzipcompression', 0);
+	add_option('hack_file', 0);
+	add_option('blog_charset', 'UTF-8');
+	add_option('moderation_keys');
+	add_option('active_plugins');
+	add_option('home', $guessurl);
+	// in case it is set, but blank, update "home"
+	if ( !__get_option('home') ) update_option('home', $guessurl);
+	add_option('category_base');
+	add_option('ping_sites', 'http://rpc.pingomatic.com/');
+	add_option('advanced_edit', 0);
+	add_option('comment_max_links', 2);
+	add_option('gmt_offset', date('Z') / 3600);
+	// 1.5
+	add_option('default_email_category', 1);
+	add_option('recently_edited');
+	add_option('use_linksupdate', 0);
+	add_option('template', 'default');
+	add_option('stylesheet', 'default');
+	add_option('comment_whitelist', 1);
+	add_option('page_uris');
+	add_option('blacklist_keys');
+	add_option('comment_registration', 0);
+	add_option('rss_language', 'en');
+	add_option('html_type', 'text/html');
+	// 1.5.1
+	add_option('use_trackback', 0);
+	// 2.0
+	add_option('default_role', 'subscriber');
+	add_option('db_version', $wp_db_version);
+	// 2.0.1
+	if ( ini_get('safe_mode') ) {
+		// Safe mode screws up mkdir(), so we must use a flat structure.
+		add_option('uploads_use_yearmonth_folders', 0);
+		add_option('upload_path', 'wp-content');
+	} else {
+		add_option('uploads_use_yearmonth_folders', 1);
+		add_option('upload_path', 'wp-content/uploads');
+	}
+
+	// 2.0.3
+	add_option('secret', wp_generate_password());
+
+	// 2.1
+	add_option('blog_public', '1');
+	add_option('default_link_category', 2);
+	add_option('show_on_front', 'posts');
+
+	// 2.2
+	add_option('tag_base');
+
+	// 2.5
+	add_option('show_avatars', '1');
+	add_option('avatar_rating', 'G');
+	add_option('upload_url_path', '');
+	add_option('thumbnail_size_w', 150);
+	add_option('thumbnail_size_h', 150);
+	add_option('thumbnail_crop', 1);
+	add_option('medium_size_w', 300);
+	add_option('medium_size_h', 300);
+
+	// Delete unused options
+	$unusedoptions = array ('blodotgsping_url', 'bodyterminator', 'emailtestonly', 'phoneemail_separator', 'smilies_directory', 'subjectprefix', 'use_bbcode', 'use_blodotgsping', 'use_phoneemail', 'use_quicktags', 'use_weblogsping', 'weblogs_cache_file', 'use_preview', 'use_htmltrans', 'smilies_directory', 'fileupload_allowedusers', 'use_phoneemail', 'default_post_status', 'default_post_category', 'archive_mode', 'time_difference', 'links_minadminlevel', 'links_use_adminlevels', 'links_rating_type', 'links_rating_char', 'links_rating_ignore_zero', 'links_rating_single_image', 'links_rating_image0', 'links_rating_image1', 'links_rating_image2', 'links_rating_image3', 'links_rating_image4', 'links_rating_image5', 'links_rating_image6', 'links_rating_image7', 'links_rating_image8', 'links_rating_image9', 'weblogs_cacheminutes', 'comment_allowed_tags', 'search_engine_friendly_urls', 'default_geourl_lat', 'default_geourl_lon', 'use_default_geourl', 'weblogs_xml_url', 'new_users_can_blog', '_wpnonce', '_wp_http_referer', 'Update', 'action', 'rich_editing', 'autosave_interval');
+	foreach ($unusedoptions as $option) :
+		delete_option($option);
+	endforeach;
+
+	// Set up a few options not to load by default
+	$fatoptions = array( 'moderation_keys', 'recently_edited', 'blacklist_keys' );
+	foreach ($fatoptions as $fatoption) :
+		$wpdb->query("UPDATE $wpdb->options SET `autoload` = 'no' WHERE option_name = '$fatoption'");
+	endforeach;
+}
+
+function populate_roles() {
+	populate_roles_160();
+	populate_roles_210();
+	populate_roles_230();
+	populate_roles_250();
+}
+
+function populate_roles_160() {
+	// Add roles
+
+	// Dummy gettext calls to get strings in the catalog.
+	_c('Administrator|User role');
+	_c('Editor|User role');
+	_c('Author|User role');
+	_c('Contributor|User role');
+	_c('Subscriber|User role');
+
+	add_role('administrator', 'Administrator|User role');
+	add_role('editor', 'Editor|User role');
+	add_role('author', 'Author|User role');
+	add_role('contributor', 'Contributor|User role');
+	add_role('subscriber', 'Subscriber|User role');
+
+	// Add caps for Administrator role
+	$role = get_role('administrator');
+	$role->add_cap('switch_themes');
+	$role->add_cap('edit_themes');
+	$role->add_cap('activate_plugins');
+	$role->add_cap('edit_plugins');
+	$role->add_cap('edit_users');
+	$role->add_cap('edit_files');
+	$role->add_cap('manage_options');
+	$role->add_cap('moderate_comments');
+	$role->add_cap('manage_categories');
+	$role->add_cap('manage_links');
+	$role->add_cap('upload_files');
+	$role->add_cap('import');
+	$role->add_cap('unfiltered_html');
+	$role->add_cap('edit_posts');
+	$role->add_cap('edit_others_posts');
+	$role->add_cap('edit_published_posts');
+	$role->add_cap('publish_posts');
+	$role->add_cap('edit_pages');
+	$role->add_cap('read');
+	$role->add_cap('level_10');
+	$role->add_cap('level_9');
+	$role->add_cap('level_8');
+	$role->add_cap('level_7');
+	$role->add_cap('level_6');
+	$role->add_cap('level_5');
+	$role->add_cap('level_4');
+	$role->add_cap('level_3');
+	$role->add_cap('level_2');
+	$role->add_cap('level_1');
+	$role->add_cap('level_0');
+
+	// Add caps for Editor role
+	$role = get_role('editor');
+	$role->add_cap('moderate_comments');
+	$role->add_cap('manage_categories');
+	$role->add_cap('manage_links');
+	$role->add_cap('upload_files');
+	$role->add_cap('unfiltered_html');
+	$role->add_cap('edit_posts');
+	$role->add_cap('edit_others_posts');
+	$role->add_cap('edit_published_posts');
+	$role->add_cap('publish_posts');
+	$role->add_cap('edit_pages');
+	$role->add_cap('read');
+	$role->add_cap('level_7');
+	$role->add_cap('level_6');
+	$role->add_cap('level_5');
+	$role->add_cap('level_4');
+	$role->add_cap('level_3');
+	$role->add_cap('level_2');
+	$role->add_cap('level_1');
+	$role->add_cap('level_0');
+
+	// Add caps for Author role
+	$role = get_role('author');
+	$role->add_cap('upload_files');
+	$role->add_cap('edit_posts');
+	$role->add_cap('edit_published_posts');
+	$role->add_cap('publish_posts');
+	$role->add_cap('read');
+	$role->add_cap('level_2');
+	$role->add_cap('level_1');
+	$role->add_cap('level_0');
+
+	// Add caps for Contributor role
+	$role = get_role('contributor');
+	$role->add_cap('edit_posts');
+	$role->add_cap('read');
+	$role->add_cap('level_1');
+	$role->add_cap('level_0');
+
+	// Add caps for Subscriber role
+	$role = get_role('subscriber');
+	$role->add_cap('read');
+	$role->add_cap('level_0');
+}
+
+function populate_roles_210() {
+	$roles = array('administrator', 'editor');
+	foreach ($roles as $role) {
+		$role = get_role($role);
+		if ( empty($role) )
+			continue;
+
+		$role->add_cap('edit_others_pages');
+		$role->add_cap('edit_published_pages');
+		$role->add_cap('publish_pages');
+		$role->add_cap('delete_pages');
+		$role->add_cap('delete_others_pages');
+		$role->add_cap('delete_published_pages');
+		$role->add_cap('delete_posts');
+		$role->add_cap('delete_others_posts');
+		$role->add_cap('delete_published_posts');
+		$role->add_cap('delete_private_posts');
+		$role->add_cap('edit_private_posts');
+		$role->add_cap('read_private_posts');
+		$role->add_cap('delete_private_pages');
+		$role->add_cap('edit_private_pages');
+		$role->add_cap('read_private_pages');
+	}
+
+	$role = get_role('administrator');
+	if ( ! empty($role) ) {
+		$role->add_cap('delete_users');
+		$role->add_cap('create_users');
+	}
+
+	$role = get_role('author');
+	if ( ! empty($role) ) {
+		$role->add_cap('delete_posts');
+		$role->add_cap('delete_published_posts');
+	}
+
+	$role = get_role('contributor');
+	if ( ! empty($role) ) {
+		$role->add_cap('delete_posts');
+	}
+}
+
+function populate_roles_230() {
+	$role = get_role( 'administrator' );
+
+	if ( !empty( $role ) ) {
+		$role->add_cap( 'unfiltered_upload' );
+	}
+}
+
+function populate_roles_250() {
+	$role = get_role( 'administrator' );
+
+	if ( !empty( $role ) ) {
+		$role->add_cap( 'edit_dashboard' );
+	}
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/taxonomy.php 2.5.src/wp-admin/includes/taxonomy.php
--- 2.2.2.src/wp-admin/includes/taxonomy.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/taxonomy.php	2008-03-22 20:10:46.000000000 -0500
@@ -0,0 +1,153 @@
+<?php
+
+//
+// Category
+//
+
+function category_exists($cat_name) {
+	$id = is_term($cat_name, 'category');
+	if ( is_array($id) )
+		$id = $id['term_id'];
+	return $id;
+}
+
+function get_category_to_edit( $id ) {
+	$category = get_category( $id, OBJECT, 'edit' );
+	return $category;
+}
+
+function wp_create_category( $cat_name, $parent = 0 ) {
+	if ( $id = category_exists($cat_name) )
+		return $id;
+
+	return wp_insert_category( array('cat_name' => $cat_name, 'category_parent' => $parent) );
+}
+
+function wp_create_categories($categories, $post_id = '') {
+	$cat_ids = array ();
+	foreach ($categories as $category) {
+		if ($id = category_exists($category))
+			$cat_ids[] = $id;
+		else
+			if ($id = wp_create_category($category))
+				$cat_ids[] = $id;
+	}
+
+	if ($post_id)
+		wp_set_post_categories($post_id, $cat_ids);
+
+	return $cat_ids;
+}
+
+function wp_delete_category($cat_ID) {
+	$cat_ID = (int) $cat_ID;
+	$default = get_option('default_category');
+
+	// Don't delete the default cat
+	if ( $cat_ID == $default )
+		return 0;
+
+	return wp_delete_term($cat_ID, 'category', "default=$default");
+}
+
+function wp_insert_category($catarr, $wp_error = false) {
+	$cat_defaults = array('cat_ID' => 0, 'cat_name' => '', 'category_description' => '', 'category_nicename' => '', 'category_parent' => '');
+	$cat_arr = wp_parse_args($cat_arr, $cat_defaults);
+	extract($catarr, EXTR_SKIP);
+
+	if ( trim( $cat_name ) == '' ) {
+		if ( ! $wp_error )
+			return 0;
+		else
+			return new WP_Error( 'cat_name', __('You did not enter a category name.') );
+	}
+
+	$cat_ID = (int) $cat_ID;
+
+	// Are we updating or creating?
+	if ( !empty ($cat_ID) )
+		$update = true;
+	else
+		$update = false;
+
+	$name = $cat_name;
+	$description = $category_description;
+	$slug = $category_nicename;
+	$parent = $category_parent;
+
+	$parent = (int) $parent;
+	if ( $parent < 0 )
+		$parent = 0;
+
+	if ( empty($parent) || !category_exists( $parent ) || ($cat_ID && cat_is_ancestor_of($cat_ID, $parent) ) )
+		$parent = 0;
+
+	$args = compact('name', 'slug', 'parent', 'description');
+
+	if ( $update )
+		$cat_ID = wp_update_term($cat_ID, 'category', $args);
+	else
+		$cat_ID = wp_insert_term($cat_name, 'category', $args);
+
+	if ( is_wp_error($cat_ID) ) {
+		if ( $wp_error )
+			return $cat_ID;
+		else
+			return 0;
+	}
+
+	return $cat_ID['term_id'];
+}
+
+function wp_update_category($catarr) {
+	$cat_ID = (int) $catarr['cat_ID'];
+
+	if ( $cat_ID == $catarr['category_parent'] )
+		return false;
+
+	// First, get all of the original fields
+	$category = get_category($cat_ID, ARRAY_A);
+
+	// Escape data pulled from DB.
+	$category = add_magic_quotes($category);
+
+	// Merge old and new fields with new fields overwriting old ones.
+	$catarr = array_merge($category, $catarr);
+
+	return wp_insert_category($catarr);
+}
+
+//
+// Tags
+//
+
+function get_tags_to_edit( $post_id ) {
+	$post_id = (int) $post_id;
+	if ( !$post_id )
+		return false;
+
+	$tags = wp_get_post_tags($post_id);
+
+	if ( !$tags )
+		return false;
+
+	foreach ( $tags as $tag )
+		$tag_names[] = $tag->name;
+	$tags_to_edit = join( ', ', $tag_names );
+	$tags_to_edit = attribute_escape( $tags_to_edit );
+	$tags_to_edit = apply_filters( 'tags_to_edit', $tags_to_edit );
+	return $tags_to_edit;
+}
+
+function tag_exists($tag_name) {
+	return is_term($tag_name, 'post_tag');
+}
+
+function wp_create_tag($tag_name) {
+	if ( $id = tag_exists($tag_name) )
+		return $id;
+
+	return wp_insert_term($tag_name, 'post_tag');
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/template.php 2.5.src/wp-admin/includes/template.php
--- 2.2.2.src/wp-admin/includes/template.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/template.php	2008-03-26 14:35:42.000000000 -0500
@@ -0,0 +1,1071 @@
+<?php
+
+//
+// Big Mess
+//
+
+// Dandy new recursive multiple category stuff.
+function cat_rows( $parent = 0, $level = 0, $categories = 0 ) {
+	if ( !$categories ) {
+		$args = array('hide_empty' => 0);
+		if ( !empty($_GET['s']) )
+			$args['search'] = $_GET['s'];
+		$categories = get_categories( $args );
+	}
+
+	$children = _get_term_hierarchy('category');
+
+	if ( $categories ) {
+		ob_start();
+		foreach ( $categories as $category ) {
+			if ( $category->parent == $parent) {
+				echo "\t" . _cat_row( $category, $level );
+				if ( isset($children[$category->term_id]) )
+					cat_rows( $category->term_id, $level +1, $categories );
+			}
+		}
+		$output = ob_get_contents();
+		ob_end_clean();
+
+		$output = apply_filters('cat_rows', $output);
+
+		echo $output;
+	} else {
+		return false;
+	}
+}
+
+function _cat_row( $category, $level, $name_override = false ) {
+	global $class;
+
+	$category = get_category( $category );
+
+	$pad = str_repeat( '&#8212; ', $level );
+	$name = ( $name_override ? $name_override : $pad . ' ' . $category->name );
+	if ( current_user_can( 'manage_categories' ) ) {
+		$edit = "<a class='row-title' href='categories.php?action=edit&amp;cat_ID=$category->term_id' title='" . attribute_escape(sprintf(__('Edit "%s"'), $category->name)) . "'>$name</a>";
+	} else {
+		$edit = $name;
+	}
+
+	$class = " class='alternate'" == $class ? '' : " class='alternate'";
+
+	$category->count = number_format_i18n( $category->count );
+	$posts_count = ( $category->count > 0 ) ? "<a href='edit.php?cat=$category->term_id'>$category->count</a>" : $category->count;
+	$output = "<tr id='cat-$category->term_id'$class>
+			   <th scope='row' class='check-column'>";
+	if ( absint(get_option( 'default_category' ) ) != $category->term_id ) {
+		$output .= "<input type='checkbox' name='delete[]' value='$category->term_id' /></th>";
+	} else {
+		$output .= "&nbsp;";
+	}
+	$output .= "<td>$edit</td>
+				<td>$category->description</td>
+				<td class='num'>$posts_count</td>\n\t</tr>\n";
+
+	return apply_filters('cat_row', $output);
+}
+
+function link_cat_row( $category ) {
+	global $class;
+
+	if ( !$category = get_term( $category, 'link_category' ) )
+		return false;
+	if ( is_wp_error( $category ) )
+		return $category;
+
+	$name = ( $name_override ? $name_override : $category->name );
+	if ( current_user_can( 'manage_categories' ) ) {
+		$edit = "<a class='row-title' href='link-category.php?action=edit&amp;cat_ID=$category->term_id' title='" . attribute_escape(sprintf(__('Edit "%s"'), $category->name)) . "' class='edit'>$name</a>";
+		$default_cat_id = (int) get_option( 'default_link_category' );
+	} else {
+		$edit = $name;
+	}
+
+	$class = " class='alternate'" == $class ? '' : " class='alternate'";
+
+	$category->count = number_format_i18n( $category->count );
+	$count = ( $category->count > 0 ) ? "<a href='link-manager.php?cat_id=$category->term_id'>$category->count</a>" : $category->count;
+	$output = "<tr id='link-cat-$category->term_id'$class>" .
+		'<th scope="row" class="check-column"> <input type="checkbox" name="delete[]" value="' . $category->term_id . '" /></th>' .
+		"<td>$edit</td>
+		<td>$category->description</td>
+		<td class='num'>$count</td></tr>";
+
+	return apply_filters( 'link_cat_row', $output );
+}
+
+function checked( $checked, $current) {
+	if ( $checked == $current)
+		echo ' checked="checked"';
+}
+
+function selected( $selected, $current) {
+	if ( $selected == $current)
+		echo ' selected="selected"';
+}
+
+//
+// Nasty Category Stuff
+//
+
+function sort_cats( $cat1, $cat2 ) {
+	if ( $cat1['checked'] || $cat2['checked'] )
+		return ( $cat1['checked'] && !$cat2['checked'] ) ? -1 : 1;
+	else
+		return strcasecmp( $cat1['cat_name'], $cat2['cat_name'] );
+}
+
+function wp_set_checked_post_categories( $default = 0 ) {
+	global $post_ID, $checked_categories;
+
+	if ( empty($checked_categories) ) {
+		if ( $post_ID ) {
+			$checked_categories = wp_get_post_categories($post_ID);
+
+			if ( count( $checked_categories ) == 0 ) {
+				// No selected categories, strange
+			$checked_categories[] = $default;
+			}
+		} else {
+			$checked_categories[] = $default;
+		}
+	}
+
+}
+function get_nested_categories( $default = 0, $parent = 0 ) {
+	global $checked_categories;
+
+	wp_set_checked_post_categories( $default = 0 );
+
+	if ( is_object($parent) ) { // Hack: if passed a category object, will return nested cats with parent as root
+		$root = array(
+			'children' => get_nested_categories( $default, $parent->term_id ),
+			'cat_ID' => $parent->term_id,
+			'checked' => in_array( $parent->term_id, $checked_categories ),
+			'cat_name' => get_the_category_by_ID( $parent->term_id )
+		);
+		$result = array( $parent->term_id => $root );
+	} else {
+		$parent = (int) $parent;
+
+		$cats = get_categories("parent=$parent&hide_empty=0&fields=ids");
+
+		$result = array();
+		if ( is_array( $cats ) ) {
+			foreach ( $cats as $cat ) {
+				$result[$cat]['children'] = get_nested_categories( $default, $cat );
+				$result[$cat]['cat_ID'] = $cat;
+				$result[$cat]['checked'] = in_array( $cat, $checked_categories );
+				$result[$cat]['cat_name'] = get_the_category_by_ID( $cat );
+			}
+		}
+	}
+
+	$result = apply_filters('get_nested_categories', $result);
+	usort( $result, 'sort_cats' );
+
+	return $result;
+}
+
+function write_nested_categories( $categories ) {
+	foreach ( $categories as $category ) {
+		echo "\n", '<li id="category-', $category['cat_ID'], '"><label for="in-category-', $category['cat_ID'], '" class="selectit"><input value="', $category['cat_ID'], '" type="checkbox" name="post_category[]" id="in-category-', $category['cat_ID'], '"', ($category['checked'] ? ' checked="checked"' : "" ), '/> ', wp_specialchars( apply_filters('the_category', $category['cat_name'] )), '</label>';
+
+		if ( $category['children'] ) {
+			echo "\n<ul>";
+			write_nested_categories( $category['children'] );
+			echo "\n</ul>";
+		}
+		echo '</li>';
+	}
+}
+
+function dropdown_categories( $default = 0, $parent = 0 ) {
+	write_nested_categories( get_nested_categories( $default, $parent ) );
+}
+
+function wp_popular_terms_checklist( $taxonomy, $default = 0, $number = 10 ) {
+	$categories = get_terms( $taxonomy, array( 'orderby' => 'count', 'order' => 'DESC', 'number' => $number ) );
+
+	foreach ( (array) $categories as $category ) {
+		$id = "popular-category-$category->term_id";
+		?>
+
+		<li id="<?php echo $id; ?>" >
+			<label class="selectit" for="in-<?php echo $id; ?>">
+			<input id="in-<?php echo $id; ?>" type="checkbox" value="<?php echo (int) $category->term_id; ?>" />
+				<?php echo wp_specialchars( apply_filters( 'the_category', $category->name ) ); ?>
+			</label>
+		</li>
+
+		<?php
+	}
+}
+
+function dropdown_link_categories( $default = 0 ) {
+	global $link_id;
+
+	if ( $link_id ) {
+		$checked_categories = wp_get_link_cats($link_id);
+
+		if ( count( $checked_categories ) == 0 ) {
+			// No selected categories, strange
+			$checked_categories[] = $default;
+		}
+	} else {
+		$checked_categories[] = $default;
+	}
+
+	$categories = get_terms('link_category', 'orderby=count&hide_empty=0');
+
+	if ( empty($categories) )
+		return;
+
+	foreach ( $categories as $category ) {
+		$cat_id = $category->term_id;
+		$name = wp_specialchars( apply_filters('the_category', $category->name));
+		$checked = in_array( $cat_id, $checked_categories );
+		echo '<li id="link-category-', $cat_id, '"><label for="in-link-category-', $cat_id, '" class="selectit"><input value="', $cat_id, '" type="checkbox" name="link_category[]" id="in-link-category-', $cat_id, '"', ($checked ? ' checked="checked"' : "" ), '/> ', $name, "</label></li>";
+	}
+}
+
+// Tag stuff
+
+// Returns a single tag row (see tag_rows below)
+// Note: this is also used in admin-ajax.php!
+function _tag_row( $tag, $class = '' ) {
+		$count = number_format_i18n( $tag->count );
+		$count = ( $count > 0 ) ? "<a href='edit.php?tag=$tag->slug'>$count</a>" : $count;
+
+		$name = apply_filters( 'term_name', $tag->name );
+		$out = '';
+		$out .= '<tr id="tag-' . $tag->term_id . '"' . $class . '>';
+		$out .= '<th scope="row" class="check-column"> <input type="checkbox" name="delete_tags[]" value="' . $tag->term_id . '" /></th>';
+		$out .= '<td><strong><a class="row-title" href="edit-tags.php?action=edit&amp;tag_ID=' . $tag->term_id . '" title="' . attribute_escape(sprintf(__('Edit "%s"'), $name)) . '">' .
+			$name . '</a></td>';
+
+		$out .= "<td class='num'>$count</td>";
+		$out .= '</tr>';
+
+		return $out;
+}
+
+// Outputs appropriate rows for the Nth page of the Tag Management screen,
+// assuming M tags displayed at a time on the page
+// Returns the number of tags displayed
+function tag_rows( $page = 1, $pagesize = 20, $searchterms = '' ) {
+
+	// Get a page worth of tags
+	$start = ($page - 1) * $pagesize;
+
+	$args = array('offset' => $start, 'number' => $pagesize, 'hide_empty' => 0);
+
+	if ( !empty( $searchterms ) ) {
+		$args['search'] = $searchterms;
+	}
+
+	$tags = get_terms( 'post_tag', $args );
+
+	// convert it to table rows
+	$out = '';
+	$class = '';
+	$count = 0;
+	foreach( $tags as $tag )
+		$out .= _tag_row( $tag, ++$count % 2 ? ' class="alternate"' : '' );
+
+	// filter and send to screen
+	$out = apply_filters('tag_rows', $out);
+	echo $out;
+	return $count;
+}
+
+// define the columns to display, the syntax is 'internal name' => 'display name'
+function wp_manage_posts_columns() {
+	$posts_columns = array();
+	$posts_columns['cb'] = '<input type="checkbox" onclick="checkAll(document.getElementById(\'posts-filter\'));" />';
+	if ( 'draft' === $_GET['post_status'] )
+		$posts_columns['modified'] = __('Modified');
+	elseif ( 'pending' === $_GET['post_status'] )
+		$posts_columns['modified'] = __('Submitted');
+	else
+		$posts_columns['date'] = __('Date');
+	$posts_columns['title'] = __('Title');
+	$posts_columns['author'] = __('Author');
+	$posts_columns['categories'] = __('Categories');
+	$posts_columns['tags'] = __('Tags');
+	if ( !in_array($_GET['post_status'], array('pending', 'draft', 'future')) )
+		$posts_columns['comments'] = '<div class="vers"><img alt="Comments" src="images/comment-grey-bubble.png" /></div>';
+	$posts_columns['status'] = __('Status');
+	$posts_columns = apply_filters('manage_posts_columns', $posts_columns);
+
+	return $posts_columns;
+}
+
+// define the columns to display, the syntax is 'internal name' => 'display name'
+function wp_manage_media_columns() {
+	$posts_columns = array();
+	$posts_columns['cb'] = '<input type="checkbox" onclick="checkAll(document.getElementById(\'posts-filter\'));" />';
+	$posts_columns['icon'] = '';
+	$posts_columns['media'] = _c('Media|media column header');
+	$posts_columns['desc'] = _c('Description|media column header');
+	$posts_columns['date'] = _c('Date Added|media column header');
+	$posts_columns['parent'] = _c('Appears with|media column header');
+	$posts_columns['comments'] = '<div class="vers"><img alt="Comments" src="images/comment-grey-bubble.png" /></div>';
+	$posts_columns['location'] = _c('Location|media column header');
+	$posts_columns = apply_filters('manage_media_columns', $posts_columns);
+
+	return $posts_columns;
+}
+
+function wp_manage_pages_columns() {
+	$posts_columns = array();
+	$posts_columns['cb'] = '<input type="checkbox" onclick="checkAll(document.getElementById(\'posts-filter\'));" />';
+	if ( 'draft' === $_GET['post_status'] )
+		$posts_columns['modified'] = __('Modified');
+	elseif ( 'pending' === $_GET['post_status'] )
+		$posts_columns['modified'] = __('Submitted');
+	else
+		$posts_columns['date'] = __('Date');
+	$posts_columns['title'] = __('Title');
+	$posts_columns['author'] = __('Author');
+	if ( !in_array($_GET['post_status'], array('pending', 'draft', 'future')) )
+		$posts_columns['comments'] = '<div class="vers"><img alt="" src="images/comment-grey-bubble.png" /></div>';
+	$posts_columns['status'] = __('Status');
+	$posts_columns = apply_filters('manage_pages_columns', $posts_columns);
+
+	return $posts_columns;
+}
+
+/*
+ * display one row if the page doesn't have any children
+ * otherwise, display the row and its children in subsequent rows
+ */
+function display_page_row( $page, &$children_pages, $level = 0 ) {
+	global $post;
+	static $class;
+
+	$post = $page;
+	setup_postdata($page);
+
+	$page->post_title = wp_specialchars( $page->post_title );
+	$pad = str_repeat( '&#8212; ', $level );
+	$id = (int) $page->ID;
+	$class = ('alternate' == $class ) ? '' : 'alternate';
+	$posts_columns = wp_manage_pages_columns();
+	$title = get_the_title();
+	if ( empty($title) )
+		$title = __('(no title)');
+?>
+  <tr id='page-<?php echo $id; ?>' class='<?php echo $class; ?>'>
+
+
+ <?php
+
+foreach ($posts_columns as $column_name=>$column_display_name) {
+
+	switch ($column_name) {
+
+	case 'cb':
+		?>
+		<th scope="row" class="check-column"><input type="checkbox" name="delete[]" value="<?php the_ID(); ?>" /></th>
+		<?php
+		break;
+	case 'modified':
+	case 'date':
+		if ( '0000-00-00 00:00:00' == $page->post_date && 'date' == $column_name ) {
+			$t_time = $h_time = __('Unpublished');
+		} else {
+			if ( 'modified' == $column_name ) {
+				$t_time = get_the_modified_time(__('Y/m/d g:i:s A'));
+				$m_time = $page->post_modified;
+				$time = get_post_modified_time('G', true);
+			} else {
+				$t_time = get_the_time(__('Y/m/d g:i:s A'));
+				$m_time = $page->post_date;
+				$time = get_post_time('G', true);
+			}
+			if ( ( abs(time() - $time) ) < 86400 ) {
+				if ( ( 'future' == $page->post_status) )
+					$h_time = sprintf( __('%s from now'), human_time_diff( $time ) );
+				else
+					$h_time = sprintf( __('%s ago'), human_time_diff( $time ) );
+			} else {
+				$h_time = mysql2date(__('Y/m/d'), $m_time);
+			}
+		}
+		?>
+		<td><abbr title="<?php echo $t_time ?>"><?php echo $h_time ?></abbr></td>
+		<?php
+		break;
+	case 'title':
+		?>
+		<td><strong><a class="row-title" href="page.php?action=edit&amp;post=<?php the_ID(); ?>" title="<?php echo attribute_escape(sprintf(__('Edit "%s"'), $title)); ?>"><?php echo $pad; echo $title ?></a></strong>
+		<?php if ('private' == $page->post_status) _e(' &#8212; <strong>Private</strong>'); ?></td>
+		<?php
+		break;
+
+	case 'comments':
+		?>
+		<td class="num"><div class="post-com-count-wrapper">
+		<?php
+		$left = get_pending_comments_num( $page->ID );
+		$pending_phrase = sprintf( __('%s pending'), number_format( $left ) );
+		if ( $left )
+			echo '<strong>';
+		comments_number("<a href='edit-pages.php?page_id=$id' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . __('0') . '</span></a>', "<a href='edit-pages.php?page_id=$id' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . __('1') . '</span></a>', "<a href='edit-pages.php?page_id=$id' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . __('%') . '</span></a>');
+		if ( $left )
+			echo '</strong>';
+		?>
+		</div></td>
+		<?php
+		break;
+
+	case 'author':
+		?>
+		<td><a href="edit-pages.php?author=<?php the_author_ID(); ?>"><?php the_author() ?></a></td>
+		<?php
+		break;
+
+	case 'status':
+		?>
+		<td>
+		<a href="<?php the_permalink(); ?>" title="<?php echo attribute_escape(sprintf(__('View "%s"'), $title)); ?>" rel="permalink">
+		<?php
+		switch ( $page->post_status ) {
+			case 'publish' :
+			case 'private' :
+				_e('Published');
+				break;
+			case 'future' :
+				_e('Scheduled');
+				break;
+			case 'pending' :
+				_e('Pending Review');
+				break;
+			case 'draft' :
+				_e('Unpublished');
+				break;
+		}
+		?>
+		</a>
+		</td>
+		<?php
+		break;
+
+	default:
+		?>
+		<td><?php do_action('manage_pages_custom_column', $column_name, $id); ?></td>
+		<?php
+		break;
+	}
+}
+ ?>
+
+   </tr>
+
+<?php
+
+	if ( ! $children_pages )
+		return true;
+
+	for ( $i = 0; $i < count($children_pages); $i++ ) {
+
+		$child = $children_pages[$i];
+
+		if ( $child->post_parent == $id ) {
+			array_splice($children_pages, $i, 1);
+			display_page_row($child, $children_pages, $level+1);
+			$i = -1; //as numeric keys in $children_pages are not preserved after splice
+		}
+	}
+}
+
+/*
+ * displays pages in hierarchical order
+ */
+function page_rows( $pages ) {
+	if ( ! $pages )
+		$pages = get_pages( 'sort_column=menu_order' );
+
+	if ( ! $pages )
+		return false;
+
+	// splice pages into two parts: those without parent and those with parent
+
+	$top_level_pages = array();
+	$children_pages  = array();
+
+	foreach ( $pages as $page ) {
+
+		// catch and repair bad pages
+		if ( $page->post_parent == $page->ID ) {
+			$page->post_parent = 0;
+			$wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET post_parent = '0' WHERE ID = %d", $page->ID) );
+			clean_page_cache( $page->ID );
+		}
+
+		if ( 0 == $page->post_parent )
+			$top_level_pages[] = $page;
+		else
+			$children_pages[] = $page;
+	}
+
+	foreach ( $top_level_pages as $page )
+		display_page_row($page, $children_pages, 0);
+
+	/*
+	 * display the remaining children_pages which are orphans
+	 * having orphan requires parental attention
+	 */
+	 if ( count($children_pages) > 0 ) {
+	 	$empty_array = array();
+	 	foreach ( $children_pages as $orphan_page ) {
+			clean_page_cache( $orphan_page->ID);
+			display_page_row( $orphan_page, $empty_array, 0 );
+		}
+	 }
+}
+
+function user_row( $user_object, $style = '', $role = '' ) {
+	global $wp_roles;
+
+	$current_user = wp_get_current_user();
+	
+	if ( !( is_object( $user_object) && is_a( $user_object, 'WP_User' ) ) )
+		$user_object = new WP_User( (int) $user_object );
+	$email = $user_object->user_email;
+	$url = $user_object->user_url;
+	$short_url = str_replace( 'http://', '', $url );
+	$short_url = str_replace( 'www.', '', $short_url );
+	if ('/' == substr( $short_url, -1 ))
+		$short_url = substr( $short_url, 0, -1 );
+	if ( strlen( $short_url ) > 35 )
+		$short_url =  substr( $short_url, 0, 32 ).'...';
+	$numposts = get_usernumposts( $user_object->ID );
+	if ( current_user_can( 'edit_user', $user_object->ID ) ) {
+		if ($current_user->ID == $user_object->ID) {
+			$edit = 'profile.php';
+		} else {
+			$edit = clean_url( add_query_arg( 'wp_http_referer', urlencode( clean_url( stripslashes( $_SERVER['REQUEST_URI'] ) ) ), "user-edit.php?user_id=$user_object->ID" ) );
+		}
+		$edit = "<a href=\"$edit\">$user_object->user_login</a>";
+	} else {
+		$edit = $user_object->user_login;
+	}
+	$role_name = translate_with_context($wp_roles->role_names[$role]);
+	$r = "<tr id='user-$user_object->ID'$style>
+		<th scope='row' class='check-column'><input type='checkbox' name='users[]' id='user_{$user_object->ID}' class='$role' value='{$user_object->ID}' /></th>
+		<td><strong>$edit</strong></td>
+		<td>$user_object->first_name $user_object->last_name</td>
+		<td><a href='mailto:$email' title='" . sprintf( __('e-mail: %s' ), $email ) . "'>$email</a></td>
+		<td>$role_name</td>";
+	$r .= "\n\t\t<td class='num'>";
+	if ( $numposts > 0 ) {
+		$r .= "<a href='edit.php?author=$user_object->ID' title='" . __( 'View posts by this author' ) . "' class='edit'>";
+		$r .= $numposts;
+		$r .= '</a>';
+	} else {
+		$r .= 0;
+	}
+	$r .= "</td>\n\t</tr>";
+	return $r;
+}
+
+function _wp_get_comment_list( $status = '', $s = false, $start, $num ) {
+	global $wpdb;
+
+	$start = abs( (int) $start );
+	$num = (int) $num;
+
+	if ( 'moderated' == $status )
+		$approved = "comment_approved = '0'";
+	elseif ( 'approved' == $status )
+		$approved = "comment_approved = '1'";
+	elseif ( 'spam' == $status )
+		$approved = "comment_approved = 'spam'";
+	else
+		$approved = "comment_approved != 'spam'";
+
+	if ( $s ) {
+		$s = $wpdb->escape($s);
+		$comments = $wpdb->get_results("SELECT SQL_CALC_FOUND_ROWS * FROM $wpdb->comments WHERE
+			(comment_author LIKE '%$s%' OR
+			comment_author_email LIKE '%$s%' OR
+			comment_author_url LIKE ('%$s%') OR
+			comment_author_IP LIKE ('%$s%') OR
+			comment_content LIKE ('%$s%') ) AND
+			$approved
+			ORDER BY comment_date_gmt DESC LIMIT $start, $num");
+	} else {
+		$comments = $wpdb->get_results( "SELECT SQL_CALC_FOUND_ROWS * FROM $wpdb->comments USE INDEX (comment_date_gmt) WHERE $approved ORDER BY comment_date_gmt DESC LIMIT $start, $num" );
+	}
+
+	update_comment_cache($comments);
+
+	$total = $wpdb->get_var( "SELECT FOUND_ROWS()" );
+
+	return array($comments, $total);
+}
+
+function _wp_comment_row( $comment_id, $mode, $comment_status, $checkbox = true ) {
+	global $comment, $post;
+	$comment = get_comment( $comment_id );
+	$post = get_post($comment->comment_post_ID);
+	$authordata = get_userdata($post->post_author);
+	$the_comment_status = wp_get_comment_status($comment->comment_ID);
+	$class = ('unapproved' == $the_comment_status) ? 'unapproved' : '';
+
+	if ( current_user_can( 'edit_post', $post->ID ) ) {
+		$post_link = "<a href='" . get_comment_link() . "'>";
+
+		$post_link .= get_the_title($comment->comment_post_ID) . '</a>';
+			
+		$edit_link_start = "<a class='row-title' href='comment.php?action=editcomment&amp;c={$comment->comment_ID}' title='" . __('Edit comment') . "'>";
+		$edit_link_end = '</a>';
+	} else {
+		$post_link = get_the_title($comment->comment_post_ID);
+		$edit_link_start = $edit_link_end ='';
+	}
+	
+	$author_url = get_comment_author_url();
+	if ( 'http://' == $author_url )
+		$author_url = '';
+	$author_url_display = $author_url;
+	if ( strlen($author_url_display) > 50 )
+		$author_url_display = substr($author_url_display, 0, 49) . '...';
+
+	$ptime = date('G', strtotime( $comment->comment_date ) );
+	if ( ( abs(time() - $ptime) ) < 86400 )
+		$ptime = sprintf( __('%s ago'), human_time_diff( $ptime ) );
+	else
+		$ptime = mysql2date(__('Y/m/d \a\t g:i A'), $comment->comment_date );
+
+	$delete_url    = clean_url( wp_nonce_url( "comment.php?action=deletecomment&p=$comment->comment_post_ID&c=$comment->comment_ID", "delete-comment_$comment->comment_ID" ) );
+	$approve_url   = clean_url( wp_nonce_url( "comment.php?action=approvecomment&p=$comment->comment_post_ID&c=$comment->comment_ID", "approve-comment_$comment->comment_ID" ) );
+	$unapprove_url = clean_url( wp_nonce_url( "comment.php?action=unapprovecomment&p=$comment->comment_post_ID&c=$comment->comment_ID", "unapprove-comment_$comment->comment_ID" ) );
+	$spam_url      = clean_url( wp_nonce_url( "comment.php?action=deletecomment&dt=spam&p=$comment->comment_post_ID&c=$comment->comment_ID", "delete-comment_$comment->comment_ID" ) );
+
+?>
+  <tr id="comment-<?php echo $comment->comment_ID; ?>" class='<?php echo $class; ?>'>
+<?php if ( $checkbox ) : ?>
+    <td class="check-column"><?php if ( current_user_can('edit_post', $comment->comment_post_ID) ) { ?><input type="checkbox" name="delete_comments[]" value="<?php echo $comment->comment_ID; ?>" /><?php } ?></td>
+<?php endif; ?>
+    <td class="comment">
+    <p class="comment-author"><strong><?php echo $edit_link_start; comment_author(); echo $edit_link_end; ?></strong><br />
+    <?php if ( !empty($author_url) ) : ?>
+    <a href="<?php echo $author_url ?>"><?php echo $author_url_display; ?></a> |
+    <?php endif; ?>
+    <?php if ( current_user_can( 'edit_post', $post->ID ) ) : ?>
+    <?php if ( !empty($comment->comment_author_email) ): ?>
+    <?php comment_author_email_link() ?> |
+    <?php endif; ?>
+    <a href="edit-comments.php?s=<?php comment_author_IP() ?>&amp;mode=detail"><?php comment_author_IP() ?></a>
+	<?php endif; //current_user_can?>    
+    </p>
+   	<?php if ( 'detail' == $mode ) comment_text(); ?>
+   	<p><?php printf(__('From %1$s, %2$s'), $post_link, $ptime) ?></p>
+    </td>
+    <td><?php comment_date(__('Y/m/d')); ?></td>
+    <td class="action-links">
+<?php
+
+	$actions = array();
+
+		$actions['approve']   = "<a href='$approve_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3' title='" . __( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a> | ';
+		$actions['unapprove'] = "<a href='$unapprove_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3' title='" . __( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a> | ';
+
+		// we're looking at list of only approved or only unapproved comments
+		if ( 'moderated' == $comment_status ) {
+			$actions['approve'] = "<a href='$approve_url' class='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment' title='" . __( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a> | ';
+			unset($actions['unapprove']);
+		} elseif ( 'approved' == $comment_status ) {
+			$actions['unapprove'] = "<a href='$unapprove_url' class='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment' title='" . __( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a> | ';
+			unset($actions['approve']);
+		}
+
+	if ( current_user_can('edit_post', $comment->comment_post_ID) ) {
+		$actions['spam']      = "<a href='$spam_url' class='delete:the-comment-list:comment-$comment->comment_ID::spam=1' title='" . __( 'Mark this comment as spam' ) . "'>" . __( 'Spam' ) . '</a> | ';
+		$actions['delete']    = "<a href='$delete_url' class='delete:the-comment-list:comment-$comment->comment_ID delete'>" . __('Delete') . '</a>';
+		foreach ( $actions as $action => $link )
+			echo "<span class='$action'>$link</span>";
+	}
+	?>
+	</td>
+  </tr>
+	<?php
+}
+
+function wp_dropdown_cats( $currentcat = 0, $currentparent = 0, $parent = 0, $level = 0, $categories = 0 ) {
+	if (!$categories )
+		$categories = get_categories( 'hide_empty=0' );
+
+	if ( $categories ) {
+		foreach ( $categories as $category ) {
+			if ( $currentcat != $category->term_id && $parent == $category->parent) {
+				$pad = str_repeat( '&#8211; ', $level );
+				$category->name = wp_specialchars( $category->name );
+				echo "\n\t<option value='$category->term_id'";
+				if ( $currentparent == $category->term_id )
+					echo " selected='selected'";
+				echo ">$pad$category->name</option>";
+				wp_dropdown_cats( $currentcat, $currentparent, $category->term_id, $level +1, $categories );
+			}
+		}
+	} else {
+		return false;
+	}
+}
+
+function list_meta( $meta ) {
+	// Exit if no meta
+	if (!$meta ) {
+		echo '<tbody id="the-list" class="list:meta"><tr style="display: none;"><td>&nbsp;</td></tr></tbody>'; //TBODY needed for list-manipulation JS
+		return;
+	}
+	$count = 0;
+?>
+	<thead>
+	<tr>
+		<th><?php _e( 'Key' ) ?></th>
+		<th><?php _e( 'Value' ) ?></th>
+		<th colspan='2'><?php _e( 'Action' ) ?></th>
+	</tr>
+	</thead>
+	<tbody id='the-list' class='list:meta'>
+<?php
+	foreach ( $meta as $entry )
+		echo _list_meta_row( $entry, $count );
+	echo "\n\t</tbody>";
+}
+
+function _list_meta_row( $entry, &$count ) {
+	static $update_nonce = false;
+	if ( !$update_nonce )
+		$update_nonce = wp_create_nonce( 'add-meta' );
+
+	$r = '';
+	++ $count;
+	if ( $count % 2 )
+		$style = 'alternate';
+	else
+		$style = '';
+	if ('_' == $entry['meta_key'] { 0 } )
+		$style .= ' hidden';
+
+	if ( is_serialized( $entry['meta_value'] ) ) {
+		if ( is_serialized_string( $entry['meta_value'] ) ) {
+			// this is a serialized string, so we should display it
+			$entry['meta_value'] = maybe_unserialize( $entry['meta_value'] );
+		} else {
+			// this is a serialized array/object so we should NOT display it
+			--$count;
+			return;
+		}
+	}
+
+	$entry['meta_key']   = attribute_escape($entry['meta_key']);
+	$entry['meta_value'] = htmlspecialchars($entry['meta_value']); // using a <textarea />
+	$entry['meta_id'] = (int) $entry['meta_id'];
+
+	$delete_nonce = wp_create_nonce( 'delete-meta_' . $entry['meta_id'] );
+
+	$r .= "\n\t<tr id='meta-{$entry['meta_id']}' class='$style'>";
+	$r .= "\n\t\t<td valign='top'><input name='meta[{$entry['meta_id']}][key]' tabindex='6' type='text' size='20' value='{$entry['meta_key']}' /></td>";
+	$r .= "\n\t\t<td><textarea name='meta[{$entry['meta_id']}][value]' tabindex='6' rows='2' cols='30'>{$entry['meta_value']}</textarea></td>";
+	$r .= "\n\t\t<td style='text-align: center;'><input name='updatemeta' type='submit' tabindex='6' value='".attribute_escape(__( 'Update' ))."' class='add:the-list:meta-{$entry['meta_id']}::_ajax_nonce=$update_nonce updatemeta' /><br />";
+	$r .= "\n\t\t<input name='deletemeta[{$entry['meta_id']}]' type='submit' ";
+	$r .= "class='delete:the-list:meta-{$entry['meta_id']}::_ajax_nonce=$delete_nonce deletemeta' tabindex='6' value='".attribute_escape(__( 'Delete' ))."' />";
+	$r .= wp_nonce_field( 'change-meta', '_ajax_nonce', false, false );
+	$r .= "</td>\n\t</tr>";
+	return $r;
+}
+
+function meta_form() {
+	global $wpdb;
+	$limit = (int) apply_filters( 'postmeta_form_limit', 30 );
+	$keys = $wpdb->get_col( "
+		SELECT meta_key
+		FROM $wpdb->postmeta
+		WHERE meta_key NOT LIKE '\_%'
+		GROUP BY meta_key
+		ORDER BY meta_id DESC
+		LIMIT $limit" );
+	if ( $keys )
+		natcasesort($keys);
+?>
+<p><strong><?php _e( 'Add a new custom field:' ) ?></strong></p>
+<table id="newmeta" cellspacing="3" cellpadding="3">
+	<tr>
+<th colspan="2"><?php _e( 'Key' ) ?></th>
+<th><?php _e( 'Value' ) ?></th>
+</tr>
+	<tr valign="top">
+		<td style="width: 18%;" class="textright">
+<?php if ( $keys ) : ?>
+<select id="metakeyselect" name="metakeyselect" tabindex="7">
+<option value="#NONE#"><?php _e( '- Select -' ); ?></option>
+<?php
+
+	foreach ( $keys as $key ) {
+		$key = attribute_escape( $key );
+		echo "\n\t<option value='$key'>$key</option>";
+	}
+?>
+</select> <?php _e( 'or' ); ?>
+<?php endif; ?>
+</td>
+<td><input type="text" id="metakeyinput" name="metakeyinput" tabindex="7" /></td>
+		<td><textarea id="metavalue" name="metavalue" rows="3" cols="25" tabindex="8"></textarea></td>
+	</tr>
+<tr class="submit"><td colspan="3">
+	<?php wp_nonce_field( 'add-meta', '_ajax_nonce', false ); ?>
+	<input type="submit" id="addmetasub" name="addmeta" class="add:the-list:newmeta::post_id=<?php echo $GLOBALS['post_ID'] ? $GLOBALS['post_ID'] : $GLOBALS['temp_ID']; ?>" tabindex="9" value="<?php _e( 'Add Custom Field' ) ?>" />
+</td></tr>
+</table>
+<?php
+
+}
+
+function touch_time( $edit = 1, $for_post = 1, $tab_index = 0 ) {
+	global $wp_locale, $post, $comment;
+
+	if ( $for_post )
+		$edit = ( in_array($post->post_status, array('draft', 'pending') ) && (!$post->post_date || '0000-00-00 00:00:00' == $post->post_date ) ) ? false : true;
+
+	$tab_index_attribute = '';
+	if ( (int) $tab_index > 0 )
+		$tab_index_attribute = " tabindex=\"$tab_index\"";
+
+	// echo '<label for="timestamp" style="display: block;"><input type="checkbox" class="checkbox" name="edit_date" value="1" id="timestamp"'.$tab_index_attribute.' /> '.__( 'Edit timestamp' ).'</label><br />';
+
+	$time_adj = time() + (get_option( 'gmt_offset' ) * 3600 );
+	$post_date = ($for_post) ? $post->post_date : $comment->comment_date;
+	$jj = ($edit) ? mysql2date( 'd', $post_date ) : gmdate( 'd', $time_adj );
+	$mm = ($edit) ? mysql2date( 'm', $post_date ) : gmdate( 'm', $time_adj );
+	$aa = ($edit) ? mysql2date( 'Y', $post_date ) : gmdate( 'Y', $time_adj );
+	$hh = ($edit) ? mysql2date( 'H', $post_date ) : gmdate( 'H', $time_adj );
+	$mn = ($edit) ? mysql2date( 'i', $post_date ) : gmdate( 'i', $time_adj );
+	$ss = ($edit) ? mysql2date( 's', $post_date ) : gmdate( 's', $time_adj );
+
+	$month = "<select id=\"mm\" name=\"mm\"$tab_index_attribute>\n";
+	for ( $i = 1; $i < 13; $i = $i +1 ) {
+		$month .= "\t\t\t" . '<option value="' . zeroise($i, 2) . '"';
+		if ( $i == $mm )
+			$month .= ' selected="selected"';
+		$month .= '>' . $wp_locale->get_month( $i ) . "</option>\n";
+	}
+	$month .= '</select>';
+
+	$day = '<input type="text" id="jj" name="jj" value="' . $jj . '" size="2" maxlength="2"' . $tab_index_attribute . ' autocomplete="off"  />';
+	$year = '<input type="text" id="aa" name="aa" value="' . $aa . '" size="4" maxlength="5"' . $tab_index_attribute . ' autocomplete="off"  />';
+	$hour = '<input type="text" id="hh" name="hh" value="' . $hh . '" size="2" maxlength="2"' . $tab_index_attribute . ' autocomplete="off"  />';
+	$minute = '<input type="text" id="mn" name="mn" value="' . $mn . '" size="2" maxlength="2"' . $tab_index_attribute . ' autocomplete="off"  />';
+	printf(_c('%1$s%2$s, %3$s <br />@ %4$s : %5$s|1: month input, 2: day input, 3: year input, 4: hour input, 5: minute input'), $month, $day, $year, $hour, $minute);
+	echo "\n\n";
+	foreach ( array('mm', 'jj', 'aa', 'hh', 'mn') as $timeunit )
+		echo '<input type="hidden" id="hidden_' . $timeunit . '" name="hidden_' . $timeunit . '" value="' . $$timeunit . '" />' . "\n";
+?>
+
+<input type="hidden" id="ss" name="ss" value="<?php echo $ss ?>" size="2" maxlength="2" />
+<?php
+}
+
+function page_template_dropdown( $default = '' ) {
+	$templates = get_page_templates();
+	ksort( $templates );
+	foreach (array_keys( $templates ) as $template )
+		: if ( $default == $templates[$template] )
+			$selected = " selected='selected'";
+		else
+			$selected = '';
+	echo "\n\t<option value='".$templates[$template]."' $selected>$template</option>";
+	endforeach;
+}
+
+function parent_dropdown( $default = 0, $parent = 0, $level = 0 ) {
+	global $wpdb, $post_ID;
+	$items = $wpdb->get_results( "SELECT ID, post_parent, post_title FROM $wpdb->posts WHERE post_parent = $parent AND post_type = 'page' ORDER BY menu_order" );
+
+	if ( $items ) {
+		foreach ( $items as $item ) {
+			// A page cannot be its own parent.
+			if (!empty ( $post_ID ) ) {
+				if ( $item->ID == $post_ID ) {
+					continue;
+				}
+			}
+			$pad = str_repeat( '&nbsp;', $level * 3 );
+			if ( $item->ID == $default)
+				$current = ' selected="selected"';
+			else
+				$current = '';
+
+			echo "\n\t<option value='$item->ID'$current>$pad " . wp_specialchars($item->post_title) . "</option>";
+			parent_dropdown( $default, $item->ID, $level +1 );
+		}
+	} else {
+		return false;
+	}
+}
+
+function browse_happy() {
+	$getit = __( 'WordPress recommends a better browser' );
+	echo '
+		<span id="bh" class="alignright"><a href="http://browsehappy.com/" title="'.$getit.'"><img src="images/browse-happy.gif" alt="Browse Happy" /></a></span>
+		';
+}
+
+if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false)
+	add_action( 'in_admin_footer', 'browse_happy' );
+
+function the_attachment_links( $id = false ) {
+	$id = (int) $id;
+	$post = & get_post( $id );
+
+	if ( $post->post_type != 'attachment' )
+		return false;
+
+	$icon = get_attachment_icon( $post->ID );
+	$attachment_data = wp_get_attachment_metadata( $id );
+	$thumb = isset( $attachment_data['thumb'] );
+?>
+<form id="the-attachment-links">
+<table>
+	<col />
+	<col class="widefat" />
+	<tr>
+		<th scope="row"><?php _e( 'URL' ) ?></th>
+		<td><textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><?php echo wp_get_attachment_url(); ?></textarea></td>
+	</tr>
+<?php if ( $icon ) : ?>
+	<tr>
+		<th scope="row"><?php $thumb ? _e( 'Thumbnail linked to file' ) : _e( 'Image linked to file' ); ?></th>
+		<td><textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><a href="<?php echo wp_get_attachment_url(); ?>"><?php echo $icon ?></a></textarea></td>
+	</tr>
+	<tr>
+		<th scope="row"><?php $thumb ? _e( 'Thumbnail linked to page' ) : _e( 'Image linked to page' ); ?></th>
+		<td><textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><a href="<?php echo get_attachment_link( $post->ID ) ?>" rel="attachment wp-att-<?php echo $post->ID; ?>"><?php echo $icon ?></a></textarea></td>
+	</tr>
+<?php else : ?>
+	<tr>
+		<th scope="row"><?php _e( 'Link to file' ) ?></th>
+		<td><textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><a href="<?php echo wp_get_attachment_url(); ?>" class="attachmentlink"><?php echo basename( wp_get_attachment_url() );  ?></a></textarea></td>
+	</tr>
+	<tr>
+		<th scope="row"><?php _e( 'Link to page' ) ?></th>
+		<td><textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><a href="<?php echo get_attachment_link( $post->ID ) ?>" rel="attachment wp-att-<?php echo $post->ID ?>"><?php the_title(); ?></a></textarea></td>
+	</tr>
+<?php endif; ?>
+</table>
+</form>
+<?php
+}
+
+function wp_dropdown_roles( $default = false ) {
+	global $wp_roles;
+	$r = '';
+	foreach( $wp_roles->role_names as $role => $name ) {
+		$name = translate_with_context($name);
+		if ( $default == $role ) // Make default first in list
+			$p = "\n\t<option selected='selected' value='$role'>$name</option>";
+		else
+			$r .= "\n\t<option value='$role'>$name</option>";
+	}
+	echo $p . $r;
+}
+
+function wp_convert_hr_to_bytes( $size ) {
+	$size = strtolower($size);
+	$bytes = (int) $size;
+	if ( strpos($size, 'k') !== false )
+		$bytes = intval($size) * 1024;
+	elseif ( strpos($size, 'm') !== false )
+		$bytes = intval($size) * 1024 * 1024;
+	elseif ( strpos($size, 'g') !== false )
+		$bytes = intval($size) * 1024 * 1024 * 1024;
+	return $bytes;
+}
+
+function wp_convert_bytes_to_hr( $bytes ) {
+	$units = array( 0 => 'B', 1 => 'kB', 2 => 'MB', 3 => 'GB' );
+	$log = log( $bytes, 1024 );
+	$power = (int) $log;
+	$size = pow(1024, $log - $power);
+	return $size . $units[$power];
+}
+
+function wp_max_upload_size() {
+	$u_bytes = wp_convert_hr_to_bytes( ini_get( 'upload_max_filesize' ) );
+	$p_bytes = wp_convert_hr_to_bytes( ini_get( 'post_max_size' ) );
+	$bytes = apply_filters( 'upload_size_limit', min($u_bytes, $p_bytes), $u_bytes, $p_bytes );
+	return $bytes;
+}
+
+function wp_import_upload_form( $action ) {
+	$bytes = apply_filters( 'import_upload_size_limit', wp_max_upload_size() );
+	$size = wp_convert_bytes_to_hr( $bytes );
+?>
+<form enctype="multipart/form-data" id="import-upload-form" method="post" action="<?php echo attribute_escape($action) ?>">
+<p>
+<?php wp_nonce_field('import-upload'); ?>
+<label for="upload"><?php _e( 'Choose a file from your computer:' ); ?></label> (<?php printf( __('Maximum size: %s' ), $size ); ?>)
+<input type="file" id="upload" name="import" size="25" />
+<input type="hidden" name="action" value="save" />
+<input type="hidden" name="max_file_size" value="<?php echo $bytes; ?>" />
+</p>
+<p class="submit">
+<input type="submit" class="button" value="<?php _e( 'Upload file and import' ); ?>" />
+</p>
+</form>
+<?php
+}
+
+function wp_remember_old_slug() {
+	global $post;
+	$name = attribute_escape($post->post_name); // just in case
+	if ( strlen($name) )
+		echo '<input type="hidden" id="wp-old-slug" name="wp-old-slug" value="' . $name . '" />';
+}
+
+/**
+ * add_meta_box() - Add a meta box to an edit form
+ *
+ * @since 2.5
+ *
+ * @param string $id String for use in the 'id' attribute of tags.
+ * @param string $title Title of the meta box
+ * @param string $callback Function that fills the box with the desired content.  The function should echo its output.
+ * @param string $page The type of edit page on which to show the box (post, page, link)
+ * @param string $context The context within the page where the boxes should show ('normal', 'advanced')
+ */
+function add_meta_box($id, $title, $callback, $page, $context = 'advanced') {
+	global $wp_meta_boxes;
+
+	if  ( !isset($wp_meta_boxes) )
+		$wp_meta_boxes = array();
+	if ( !isset($wp_meta_boxes[$page]) )
+		$wp_meta_boxes[$page] = array();
+	if ( !isset($wp_meta_boxes[$page][$context]) )
+		$wp_meta_boxes[$page][$context] = array();
+
+	$wp_meta_boxes[$page][$context][] = array('id' => $id, 'title' => $title, 'callback' => $callback);
+}
+
+function do_meta_boxes($page, $context, $object) {
+	global $wp_meta_boxes;
+
+	if ( !isset($wp_meta_boxes) || !isset($wp_meta_boxes[$page]) || !isset($wp_meta_boxes[$page][$context]) )
+		return;
+
+	foreach ( (array) $wp_meta_boxes[$page][$context] as $box ) {
+		echo '<div id="' . $box['id'] . '" class="postbox ' . postbox_classes($box['id'], $page) . '">' . "\n";
+		echo "<h3>{$box['title']}</h3>\n";
+		echo '<div class="inside">' . "\n";
+		call_user_func($box['callback'], $object, $box);
+		echo "</div>\n";
+		echo "</div>\n";
+	}
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/theme.php 2.5.src/wp-admin/includes/theme.php
--- 2.2.2.src/wp-admin/includes/theme.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/theme.php	2007-12-31 12:39:43.000000000 -0600
@@ -0,0 +1,53 @@
+<?php
+
+function current_theme_info() {
+	$themes = get_themes();
+	$current_theme = get_current_theme();
+	$ct->name = $current_theme;
+	$ct->title = $themes[$current_theme]['Title'];
+	$ct->version = $themes[$current_theme]['Version'];
+	$ct->parent_theme = $themes[$current_theme]['Parent Theme'];
+	$ct->template_dir = $themes[$current_theme]['Template Dir'];
+	$ct->stylesheet_dir = $themes[$current_theme]['Stylesheet Dir'];
+	$ct->template = $themes[$current_theme]['Template'];
+	$ct->stylesheet = $themes[$current_theme]['Stylesheet'];
+	$ct->screenshot = $themes[$current_theme]['Screenshot'];
+	$ct->description = $themes[$current_theme]['Description'];
+	$ct->author = $themes[$current_theme]['Author'];
+	$ct->tags = $themes[$current_theme]['Tags'];
+	return $ct;
+}
+
+function get_broken_themes() {
+	global $wp_broken_themes;
+
+	get_themes();
+	return $wp_broken_themes;
+}
+
+function get_page_templates() {
+	$themes = get_themes();
+	$theme = get_current_theme();
+	$templates = $themes[$theme]['Template Files'];
+	$page_templates = array ();
+
+	if ( is_array( $templates ) ) {
+		foreach ( $templates as $template ) {
+			$template_data = implode( '', file( ABSPATH.$template ));
+
+			preg_match( '|Template Name:(.*)$|mi', $template_data, $name );
+			preg_match( '|Description:(.*)$|mi', $template_data, $description );
+
+			$name = $name[1];
+			$description = $description[1];
+
+			if ( !empty( $name ) ) {
+				$page_templates[trim( $name )] = basename( $template );
+			}
+		}
+	}
+
+	return $page_templates;
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/update.php 2.5.src/wp-admin/includes/update.php
--- 2.2.2.src/wp-admin/includes/update.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/update.php	2008-03-27 02:36:30.000000000 -0500
@@ -0,0 +1,248 @@
+<?php
+
+// The admin side of our 1.1 update system
+
+function core_update_footer( $msg = '' ) {
+	if ( !current_user_can('manage_options') )
+		return sprintf( '| '.__( 'Version %s' ), $GLOBALS['wp_version'] );
+
+	$cur = get_option( 'update_core' );
+
+	switch ( $cur->response ) {
+	case 'development' :
+		return sprintf( '| '.__( 'You are using a development version (%s). Cool! Please <a href="%s">stay updated</a>.' ), $GLOBALS['wp_version'], $cur->url, $cur->current );
+	break;
+
+	case 'upgrade' :
+		if ( current_user_can('manage_options') ) {
+			return sprintf( '| <strong>'.__( '<a href="%2$s">Get Version %3$s</a>' ).'</strong>', $GLOBALS['wp_version'], $cur->url, $cur->current );
+			break;
+		}
+
+	case 'latest' :
+	default :
+		return sprintf( '| '.__( 'Version %s' ), $GLOBALS['wp_version'], $cur->url, $cur->current );
+	break;
+	}
+}
+add_filter( 'update_footer', 'core_update_footer' );
+
+function update_nag() {
+	$cur = get_option( 'update_core' );
+
+	if ( ! isset( $cur->response ) || $cur->response != 'upgrade' )
+		return false;
+
+	if ( current_user_can('manage_options') )
+		$msg = sprintf( __('WordPress %2$s is available! <a href="%1$s">Please update now</a>.'), $cur->url, $cur->current );
+	else
+		$msg = sprintf( __('WordPress %2$s is available! Please notify the site administrator.'), $cur->url, $cur->current );
+
+	echo "<div id='update-nag'>$msg</div>";
+}
+add_action( 'admin_notices', 'update_nag', 3 );
+
+// Called directly from dashboard
+function update_right_now_message() {
+	$cur = get_option( 'update_core' );
+
+	$msg = sprintf( __('This is WordPress version %s.'), $GLOBALS['wp_version'] );
+	if ( isset( $cur->response ) && $cur->response == 'upgrade' && current_user_can('manage_options') )
+		$msg .= " <a href='$cur->url' class='rbutton'>" . sprintf( __('Update to %s'), $cur->current ? $cur->current : __( 'Latest' ) ) . '</a>';
+
+	echo "<span id='wp-version-message'>$msg</span>";
+}
+
+function wp_update_plugins() {
+	global $wp_version;
+
+	if ( !function_exists('fsockopen') )
+		return false;
+
+	$plugins = get_plugins();
+	$active  = get_option( 'active_plugins' );
+	$current = get_option( 'update_plugins' );
+
+	$new_option = '';
+	$new_option->last_checked = time();
+
+	$plugin_changed = false;
+	foreach ( $plugins as $file => $p ) {
+		$new_option->checked[ $file ] = $p['Version'];
+
+		if ( !isset( $current->checked[ $file ] ) ) {
+			$plugin_changed = true;
+			continue;
+		}
+
+		if ( strval($current->checked[ $file ]) !== strval($p['Version']) )
+			$plugin_changed = true;
+	}
+
+	if (
+		isset( $current->last_checked ) &&
+		43200 > ( time() - $current->last_checked ) &&
+		!$plugin_changed
+	)
+		return false;
+
+	$to_send->plugins = $plugins;
+	$to_send->active = $active;
+	$send = serialize( $to_send );
+
+	$request = 'plugins=' . urlencode( $send );
+	$http_request  = "POST /plugins/update-check/1.0/ HTTP/1.0\r\n";
+	$http_request .= "Host: api.wordpress.org\r\n";
+	$http_request .= "Content-Type: application/x-www-form-urlencoded; charset=" . get_option('blog_charset') . "\r\n";
+	$http_request .= "Content-Length: " . strlen($request) . "\r\n";
+	$http_request .= 'User-Agent: WordPress/' . $wp_version . '; ' . get_bloginfo('url') . "\r\n";
+	$http_request .= "\r\n";
+	$http_request .= $request;
+
+	$response = '';
+	if( false != ( $fs = @fsockopen( 'api.wordpress.org', 80, $errno, $errstr, 3) ) && is_resource($fs) ) {
+		fwrite($fs, $http_request);
+
+		while ( !feof($fs) )
+			$response .= fgets($fs, 1160); // One TCP-IP packet
+		fclose($fs);
+		$response = explode("\r\n\r\n", $response, 2);
+	}
+
+	$response = unserialize( $response[1] );
+
+	if ( $response )
+		$new_option->response = $response;
+
+	update_option( 'update_plugins', $new_option );
+}
+add_action( 'load-plugins.php', 'wp_update_plugins' );
+
+function wp_plugin_update_row( $file ) {
+	global $plugin_data;
+	$current = get_option( 'update_plugins' );
+	if ( !isset( $current->response[ $file ] ) )
+		return false;
+
+	$r = $current->response[ $file ];
+
+	echo "<tr><td colspan='5' class='plugin-update'>";
+	if ( !current_user_can('edit_plugins') )
+		printf( __('There is a new version of %1$s available. <a href="%2$s">Download version %3$s here</a>.'), $plugin_data['Name'], $r->url, $r->new_version);
+	else if ( empty($r->package) )
+		printf( __('There is a new version of %1$s available. <a href="%2$s">Download version %3$s here</a> <em>automatic upgrade unavailable for this plugin</em>.'), $plugin_data['Name'], $r->url, $r->new_version);
+	else
+		printf( __('There is a new version of %1$s available. <a href="%2$s">Download version %3$s here</a> or <a href="%4$s">upgrade automatically</a>.'), $plugin_data['Name'], $r->url, $r->new_version, wp_nonce_url("update.php?action=upgrade-plugin&amp;plugin=$file", 'upgrade-plugin_' . $file) );
+	
+	echo "</td></tr>";
+}
+add_action( 'after_plugin_row', 'wp_plugin_update_row' );
+
+function wp_update_plugin($plugin, $feedback = '') {
+	global $wp_filesystem;
+
+	if ( !empty($feedback) )
+		add_filter('update_feedback', $feedback);
+
+	// Is an update available?
+	$current = get_option( 'update_plugins' );
+	if ( !isset( $current->response[ $plugin ] ) )
+		return new WP_Error('up_to_date', __('The plugin is at the latest version.'));
+
+	// Is a filesystem accessor setup?
+	if ( ! $wp_filesystem || !is_object($wp_filesystem) )
+		WP_Filesystem();
+
+	if ( ! is_object($wp_filesystem) )
+		return new WP_Error('fs_unavailable', __('Could not access filesystem.'));
+
+	if ( $wp_filesystem->errors->get_error_code() )
+		return new WP_Error('fs_error', __('Filesystem error'), $wp_filesystem->errors);
+
+	//Get the Base folder
+	$base = $wp_filesystem->get_base_dir();
+	
+	if ( empty($base) )
+		return new WP_Error('fs_nowordpress', __('Unable to locate WordPress directory.'));
+
+	// Get the URL to the zip file
+	$r = $current->response[ $plugin ];
+
+	if ( empty($r->package) )
+		return new WP_Error('no_package', __('Upgrade package not available.'));
+
+	// Download the package
+	$package = $r->package;
+	apply_filters('update_feedback', sprintf(__('Downloading update from %s'), $package));
+	$file = download_url($package);
+
+	if ( is_wp_error($file) )
+		return new WP_Error('download_failed', __('Download failed.'), $file->get_error_message());
+
+	$working_dir = $base . 'wp-content/upgrade/' . basename($plugin, '.php');
+
+	// Clean up working directory
+	if ( $wp_filesystem->is_dir($working_dir) )
+		$wp_filesystem->delete($working_dir, true);
+
+	apply_filters('update_feedback', __('Unpacking the update'));
+	// Unzip package to working directory
+	$result = unzip_file($file, $working_dir);
+	if ( is_wp_error($result) ) {
+		unlink($file);
+		$wp_filesystem->delete($working_dir, true);
+		return $result;
+	}
+
+	// Once extracted, delete the package
+	unlink($file);
+
+	if ( is_plugin_active($plugin) ) {
+		//Deactivate the plugin silently, Prevent deactivation hooks from running.
+		apply_filters('update_feedback', __('Deactivating the plugin'));
+		deactivate_plugins($plugin, true);
+	}
+
+	// Remove the existing plugin.
+	apply_filters('update_feedback', __('Removing the old version of the plugin'));
+	$plugin_dir = dirname($base . PLUGINDIR . "/$plugin");
+	$plugin_dir = trailingslashit($plugin_dir);
+	
+	// If plugin is in its own directory, recursively delete the directory.
+	if ( strpos($plugin, '/') && $plugin_dir != $base . PLUGINDIR . '/' ) //base check on if plugin includes directory seperator AND that its not the root plugin folder
+		$deleted = $wp_filesystem->delete($plugin_dir, true);
+	else
+		$deleted = $wp_filesystem->delete($base . PLUGINDIR . "/$plugin");
+
+	if ( !$deleted ) {
+		$wp_filesystem->delete($working_dir, true);
+		return new WP_Error('delete_failed', __('Could not remove the old plugin'));
+	}
+
+	apply_filters('update_feedback', __('Installing the latest version'));
+	// Copy new version of plugin into place.
+	if ( !copy_dir($working_dir, $base . PLUGINDIR) ) {
+		//$wp_filesystem->delete($working_dir, true); //TODO: Uncomment? This DOES mean that the new files are available in the upgrade folder if it fails.
+		return new WP_Error('install_failed', __('Installation failed'));
+	}
+
+	//Get a list of the directories in the working directory before we delete it, We need to know the new folder for the plugin
+	$filelist = array_keys( $wp_filesystem->dirlist($working_dir) );
+
+	// Remove working directory
+	$wp_filesystem->delete($working_dir, true);
+
+	// Force refresh of plugin update information
+	delete_option('update_plugins');
+	
+	if( empty($filelist) )
+		return false; //We couldnt find any files in the working dir
+	
+	$folder = $filelist[0];
+	$plugin = get_plugins('/' . $folder); //Pass it with a leading slash, search out the plugins in the folder, 
+	$pluginfiles = array_keys($plugin); //Assume the requested plugin is the first in the list
+
+	return  $folder . '/' . $pluginfiles[0]; //Pass it without a leading slash as WP requires
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/upgrade.php 2.5.src/wp-admin/includes/upgrade.php
--- 2.2.2.src/wp-admin/includes/upgrade.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/upgrade.php	2008-03-24 11:09:25.000000000 -0500
@@ -0,0 +1,1278 @@
+<?php
+
+if ( file_exists(ABSPATH . 'wp-content/install.php') )
+	require (ABSPATH . 'wp-content/install.php');
+require_once(ABSPATH . 'wp-admin/includes/admin.php');
+require_once(ABSPATH . 'wp-admin/includes/schema.php');
+
+if ( !function_exists('wp_install') ) :
+function wp_install($blog_title, $user_name, $user_email, $public, $deprecated='') {
+	global $wp_rewrite;
+
+	wp_check_mysql_version();
+	wp_cache_flush();
+	make_db_current_silent();
+	populate_options();
+	populate_roles();
+
+	update_option('blogname', $blog_title);
+	update_option('admin_email', $user_email);
+	update_option('blog_public', $public);
+	$schema = ( isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on' ) ? 'https://' : 'http://';
+
+	if ( defined('WP_SITEURL') && '' != WP_SITEURL )
+		$guessurl = WP_SITEURL;
+	else
+		$guessurl = preg_replace('|/wp-admin/.*|i', '', $schema . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
+
+	update_option('siteurl', $guessurl);
+
+	// If not a public blog, don't ping.
+	if ( ! $public )
+		update_option('default_pingback_flag', 0);
+
+	// Create default user.  If the user already exists, the user tables are
+	// being shared among blogs.  Just set the role in that case.
+	$user_id = username_exists($user_name);
+	if ( !$user_id ) {
+		$random_password = wp_generate_password();
+		$user_id = wp_create_user($user_name, $random_password, $user_email);
+	} else {
+		$random_password = __('User already exists.  Password inherited.');
+	}
+
+	$user = new WP_User($user_id);
+	$user->set_role('administrator');
+
+	wp_install_defaults($user_id);
+
+	$wp_rewrite->flush_rules();
+
+	wp_new_blog_notification($blog_title, $guessurl, $user_id, $random_password);
+
+	wp_cache_flush();
+
+	return array('url' => $guessurl, 'user_id' => $user_id, 'password' => $random_password);
+}
+endif;
+
+if ( !function_exists('wp_install_defaults') ) :
+function wp_install_defaults($user_id) {
+	global $wpdb;
+
+	// Default category
+	$cat_name = $wpdb->escape(__('Uncategorized'));
+	$cat_slug = sanitize_title(__('Uncategorized'));
+	$wpdb->query("INSERT INTO $wpdb->terms (name, slug, term_group) VALUES ('$cat_name', '$cat_slug', '0')");
+	$wpdb->query("INSERT INTO $wpdb->term_taxonomy (term_id, taxonomy, description, parent, count) VALUES ('1', 'category', '', '0', '1')");
+
+	// Default link category
+	$cat_name = $wpdb->escape(__('Blogroll'));
+	$cat_slug = sanitize_title(__('Blogroll'));
+	$wpdb->query("INSERT INTO $wpdb->terms (name, slug, term_group) VALUES ('$cat_name', '$cat_slug', '0')");
+	$wpdb->query("INSERT INTO $wpdb->term_taxonomy (term_id, taxonomy, description, parent, count) VALUES ('2', 'link_category', '', '0', '7')");
+
+	// Now drop in some default links
+	$wpdb->query("INSERT INTO $wpdb->links (link_url, link_name, link_category, link_rss, link_notes) VALUES ('http://codex.wordpress.org/', 'Documentation', 0, '', '');");
+	$wpdb->query( "INSERT INTO $wpdb->term_relationships (`object_id`, `term_taxonomy_id`) VALUES (1, 2)" );
+
+	$wpdb->query("INSERT INTO $wpdb->links (link_url, link_name, link_category, link_rss, link_notes) VALUES ('http://wordpress.org/development/', 'Development Blog', 0, 'http://wordpress.org/development/feed/', '');");
+	$wpdb->query( "INSERT INTO $wpdb->term_relationships (`object_id`, `term_taxonomy_id`) VALUES (2, 2)" );
+
+	$wpdb->query("INSERT INTO $wpdb->links (link_url, link_name, link_category, link_rss, link_notes) VALUES ('http://wordpress.org/extend/ideas/', 'Suggest Ideas', 0, '', '');");
+	$wpdb->query( "INSERT INTO $wpdb->term_relationships (`object_id`, `term_taxonomy_id`) VALUES (3, 2)" );
+
+	$wpdb->query("INSERT INTO $wpdb->links (link_url, link_name, link_category, link_rss, link_notes) VALUES ('http://wordpress.org/support/', 'Support Forum', 0, '', '');");
+	$wpdb->query( "INSERT INTO $wpdb->term_relationships (`object_id`, `term_taxonomy_id`) VALUES (4, 2)" );
+
+	$wpdb->query("INSERT INTO $wpdb->links (link_url, link_name, link_category, link_rss, link_notes) VALUES ('http://wordpress.org/extend/plugins/', 'Plugins', 0, '', '');");
+	$wpdb->query( "INSERT INTO $wpdb->term_relationships (`object_id`, `term_taxonomy_id`) VALUES (5, 2)" );
+
+	$wpdb->query("INSERT INTO $wpdb->links (link_url, link_name, link_category, link_rss, link_notes) VALUES ('http://wordpress.org/extend/themes/', 'Themes', 0, '', '');");
+	$wpdb->query( "INSERT INTO $wpdb->term_relationships (`object_id`, `term_taxonomy_id`) VALUES (6, 2)" );
+
+	$wpdb->query("INSERT INTO $wpdb->links (link_url, link_name, link_category, link_rss, link_notes) VALUES ('http://planet.wordpress.org/', 'WordPress Planet', 0, '', '');");
+	$wpdb->query( "INSERT INTO $wpdb->term_relationships (`object_id`, `term_taxonomy_id`) VALUES (7, 2)" );
+
+	// First post
+	$now = date('Y-m-d H:i:s');
+	$now_gmt = gmdate('Y-m-d H:i:s');
+	$first_post_guid = get_option('home') . '/?p=1';
+	$wpdb->query("INSERT INTO $wpdb->posts (post_author, post_date, post_date_gmt, post_content, post_excerpt, post_title, post_category, post_name, post_modified, post_modified_gmt, guid, comment_count, to_ping, pinged, post_content_filtered) VALUES ($user_id, '$now', '$now_gmt', '".$wpdb->escape(__('Welcome to WordPress. This is your first post. Edit or delete it, then start blogging!'))."', '', '".$wpdb->escape(__('Hello world!'))."', '0', '".$wpdb->escape(__('hello-world'))."', '$now', '$now_gmt', '$first_post_guid', '1', '', '', '')");
+	$wpdb->query( "INSERT INTO $wpdb->term_relationships (`object_id`, `term_taxonomy_id`) VALUES (1, 1)" );
+
+	// Default comment
+	$wpdb->query("INSERT INTO $wpdb->comments (comment_post_ID, comment_author, comment_author_email, comment_author_url, comment_date, comment_date_gmt, comment_content) VALUES ('1', '".$wpdb->escape(__('Mr WordPress'))."', '', 'http://wordpress.org/', '$now', '$now_gmt', '".$wpdb->escape(__('Hi, this is a comment.<br />To delete a comment, just log in and view the post&#039;s comments. There you will have the option to edit or delete them.'))."')");
+
+	// First Page
+	$first_post_guid = get_option('home') . '/?page_id=2';
+	$wpdb->query("INSERT INTO $wpdb->posts (post_author, post_date, post_date_gmt, post_content, post_excerpt, post_title, post_category, post_name, post_modified, post_modified_gmt, guid, post_status, post_type, to_ping, pinged, post_content_filtered) VALUES ($user_id, '$now', '$now_gmt', '".$wpdb->escape(__('This is an example of a WordPress page, you could edit this to put information about yourself or your site so readers know where you are coming from. You can create as many pages like this one or sub-pages as you like and manage all of your content inside of WordPress.'))."', '', '".$wpdb->escape(__('About'))."', '0', '".$wpdb->escape(__('about'))."', '$now', '$now_gmt','$first_post_guid', 'publish', 'page', '', '', '')");
+}
+endif;
+
+if ( !function_exists('wp_new_blog_notification') ) :
+function wp_new_blog_notification($blog_title, $blog_url, $user_id, $password) {
+	$user = new WP_User($user_id);
+	$email = $user->user_email;
+	$name = $user->user_login;
+	$message_headers = 'From: "' . $blog_title . '" <wordpress@' . $_SERVER['SERVER_NAME'] . '>';
+	$message = sprintf(__("Your new WordPress blog has been successfully set up at:
+
+%1\$s
+
+You can log in to the administrator account with the following information:
+
+Username: %2\$s
+Password: %3\$s
+
+We hope you enjoy your new blog. Thanks!
+
+--The WordPress Team
+http://wordpress.org/
+"), $blog_url, $name, $password);
+
+	@wp_mail($email, __('New WordPress Blog'), $message, $message_headers);
+}
+endif;
+
+if ( !function_exists('wp_upgrade') ) :
+function wp_upgrade() {
+	global $wp_current_db_version, $wp_db_version;
+
+	$wp_current_db_version = __get_option('db_version');
+
+	// We are up-to-date.  Nothing to do.
+	if ( $wp_db_version == $wp_current_db_version )
+		return;
+
+	wp_check_mysql_version();
+	wp_cache_flush();
+	make_db_current_silent();
+	upgrade_all();
+	wp_cache_flush();
+}
+endif;
+
+// Functions to be called in install and upgrade scripts
+function upgrade_all() {
+	global $wp_current_db_version, $wp_db_version, $wp_rewrite;
+	$wp_current_db_version = __get_option('db_version');
+
+	// We are up-to-date.  Nothing to do.
+	if ( $wp_db_version == $wp_current_db_version )
+		return;
+
+	// If the version is not set in the DB, try to guess the version.
+	if ( empty($wp_current_db_version) ) {
+		$wp_current_db_version = 0;
+
+		// If the template option exists, we have 1.5.
+		$template = __get_option('template');
+		if ( !empty($template) )
+			$wp_current_db_version = 2541;
+	}
+
+	if ( $wp_current_db_version < 6039 )
+		upgrade_230_options_table();
+
+	populate_options();
+
+	if ( $wp_current_db_version < 2541 ) {
+		upgrade_100();
+		upgrade_101();
+		upgrade_110();
+		upgrade_130();
+	}
+
+	if ( $wp_current_db_version < 3308 )
+		upgrade_160();
+
+	if ( $wp_current_db_version < 4772 )
+		upgrade_210();
+
+	if ( $wp_current_db_version < 4351 )
+		upgrade_old_slugs();
+
+	if ( $wp_current_db_version < 5539 )
+		upgrade_230();
+
+	if ( $wp_current_db_version < 6124 )
+		upgrade_230_old_tables();
+
+	if ( $wp_current_db_version < 7499 )
+		upgrade_250();
+
+	maybe_disable_automattic_widgets();
+
+	$wp_rewrite->flush_rules();
+
+	update_option('db_version', $wp_db_version);
+}
+
+function upgrade_100() {
+	global $wpdb;
+
+	// Get the title and ID of every post, post_name to check if it already has a value
+	$posts = $wpdb->get_results("SELECT ID, post_title, post_name FROM $wpdb->posts WHERE post_name = ''");
+	if ($posts) {
+		foreach($posts as $post) {
+			if ('' == $post->post_name) {
+				$newtitle = sanitize_title($post->post_title);
+				$wpdb->query("UPDATE $wpdb->posts SET post_name = '$newtitle' WHERE ID = '$post->ID'");
+			}
+		}
+	}
+
+	$categories = $wpdb->get_results("SELECT cat_ID, cat_name, category_nicename FROM $wpdb->categories");
+	foreach ($categories as $category) {
+		if ('' == $category->category_nicename) {
+			$newtitle = sanitize_title($category->cat_name);
+			$wpdb->query("UPDATE $wpdb->categories SET category_nicename = '$newtitle' WHERE cat_ID = '$category->cat_ID'");
+		}
+	}
+
+
+	$wpdb->query("UPDATE $wpdb->options SET option_value = REPLACE(option_value, 'wp-links/links-images/', 'wp-images/links/')
+	WHERE option_name LIKE 'links_rating_image%'
+	AND option_value LIKE 'wp-links/links-images/%'");
+
+	$done_ids = $wpdb->get_results("SELECT DISTINCT post_id FROM $wpdb->post2cat");
+	if ($done_ids) :
+		foreach ($done_ids as $done_id) :
+			$done_posts[] = $done_id->post_id;
+		endforeach;
+		$catwhere = ' AND ID NOT IN (' . implode(',', $done_posts) . ')';
+	else:
+		$catwhere = '';
+	endif;
+
+	$allposts = $wpdb->get_results("SELECT ID, post_category FROM $wpdb->posts WHERE post_category != '0' $catwhere");
+	if ($allposts) :
+		foreach ($allposts as $post) {
+			// Check to see if it's already been imported
+			$cat = $wpdb->get_row("SELECT * FROM $wpdb->post2cat WHERE post_id = $post->ID AND category_id = $post->post_category");
+			if (!$cat && 0 != $post->post_category) { // If there's no result
+				$wpdb->query("
+					INSERT INTO $wpdb->post2cat
+					(post_id, category_id)
+					VALUES
+					('$post->ID', '$post->post_category')
+					");
+			}
+		}
+	endif;
+}
+
+function upgrade_101() {
+	global $wpdb;
+
+	// Clean up indices, add a few
+	add_clean_index($wpdb->posts, 'post_name');
+	add_clean_index($wpdb->posts, 'post_status');
+	add_clean_index($wpdb->categories, 'category_nicename');
+	add_clean_index($wpdb->comments, 'comment_approved');
+	add_clean_index($wpdb->comments, 'comment_post_ID');
+	add_clean_index($wpdb->links , 'link_category');
+	add_clean_index($wpdb->links , 'link_visible');
+}
+
+
+function upgrade_110() {
+	global $wpdb;
+
+	// Set user_nicename.
+	$users = $wpdb->get_results("SELECT ID, user_nickname, user_nicename FROM $wpdb->users");
+	foreach ($users as $user) {
+		if ('' == $user->user_nicename) {
+			$newname = sanitize_title($user->user_nickname);
+			$wpdb->query("UPDATE $wpdb->users SET user_nicename = '$newname' WHERE ID = '$user->ID'");
+		}
+	}
+
+	$users = $wpdb->get_results("SELECT ID, user_pass from $wpdb->users");
+	foreach ($users as $row) {
+		if (!preg_match('/^[A-Fa-f0-9]{32}$/', $row->user_pass)) {
+			$wpdb->query('UPDATE '.$wpdb->users.' SET user_pass = MD5(\''.$row->user_pass.'\') WHERE ID = \''.$row->ID.'\'');
+		}
+	}
+
+
+	// Get the GMT offset, we'll use that later on
+	$all_options = get_alloptions_110();
+
+	$time_difference = $all_options->time_difference;
+
+	$server_time = time()+date('Z');
+	$weblogger_time = $server_time + $time_difference*3600;
+	$gmt_time = time();
+
+	$diff_gmt_server = ($gmt_time - $server_time) / 3600;
+	$diff_weblogger_server = ($weblogger_time - $server_time) / 3600;
+	$diff_gmt_weblogger = $diff_gmt_server - $diff_weblogger_server;
+	$gmt_offset = -$diff_gmt_weblogger;
+
+	// Add a gmt_offset option, with value $gmt_offset
+	add_option('gmt_offset', $gmt_offset);
+
+	// Check if we already set the GMT fields (if we did, then
+	// MAX(post_date_gmt) can't be '0000-00-00 00:00:00'
+	// <michel_v> I just slapped myself silly for not thinking about it earlier
+	$got_gmt_fields = ($wpdb->get_var("SELECT MAX(post_date_gmt) FROM $wpdb->posts") == '0000-00-00 00:00:00') ? false : true;
+
+	if (!$got_gmt_fields) {
+
+		// Add or substract time to all dates, to get GMT dates
+		$add_hours = intval($diff_gmt_weblogger);
+		$add_minutes = intval(60 * ($diff_gmt_weblogger - $add_hours));
+		$wpdb->query("UPDATE $wpdb->posts SET post_date_gmt = DATE_ADD(post_date, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)");
+		$wpdb->query("UPDATE $wpdb->posts SET post_modified = post_date");
+		$wpdb->query("UPDATE $wpdb->posts SET post_modified_gmt = DATE_ADD(post_modified, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE) WHERE post_modified != '0000-00-00 00:00:00'");
+		$wpdb->query("UPDATE $wpdb->comments SET comment_date_gmt = DATE_ADD(comment_date, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)");
+		$wpdb->query("UPDATE $wpdb->users SET user_registered = DATE_ADD(user_registered, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)");
+	}
+
+}
+
+function upgrade_130() {
+	global $wpdb;
+
+	// Remove extraneous backslashes.
+	$posts = $wpdb->get_results("SELECT ID, post_title, post_content, post_excerpt, guid, post_date, post_name, post_status, post_author FROM $wpdb->posts");
+	if ($posts) {
+		foreach($posts as $post) {
+			$post_content = addslashes(deslash($post->post_content));
+			$post_title = addslashes(deslash($post->post_title));
+			$post_excerpt = addslashes(deslash($post->post_excerpt));
+			if ( empty($post->guid) )
+				$guid = get_permalink($post->ID);
+			else
+				$guid = $post->guid;
+
+			$wpdb->query("UPDATE $wpdb->posts SET post_title = '$post_title', post_content = '$post_content', post_excerpt = '$post_excerpt', guid = '$guid' WHERE ID = '$post->ID'");
+		}
+	}
+
+	// Remove extraneous backslashes.
+	$comments = $wpdb->get_results("SELECT comment_ID, comment_author, comment_content FROM $wpdb->comments");
+	if ($comments) {
+		foreach($comments as $comment) {
+			$comment_content = addslashes(deslash($comment->comment_content));
+			$comment_author = addslashes(deslash($comment->comment_author));
+			$wpdb->query("UPDATE $wpdb->comments SET comment_content = '$comment_content', comment_author = '$comment_author' WHERE comment_ID = '$comment->comment_ID'");
+		}
+	}
+
+	// Remove extraneous backslashes.
+	$links = $wpdb->get_results("SELECT link_id, link_name, link_description FROM $wpdb->links");
+	if ($links) {
+		foreach($links as $link) {
+			$link_name = addslashes(deslash($link->link_name));
+			$link_description = addslashes(deslash($link->link_description));
+			$wpdb->query("UPDATE $wpdb->links SET link_name = '$link_name', link_description = '$link_description' WHERE link_id = '$link->link_id'");
+		}
+	}
+
+	// The "paged" option for what_to_show is no more.
+	if ($wpdb->get_var("SELECT option_value FROM $wpdb->options WHERE option_name = 'what_to_show'") == 'paged') {
+		$wpdb->query("UPDATE $wpdb->options SET option_value = 'posts' WHERE option_name = 'what_to_show'");
+	}
+
+	$active_plugins = __get_option('active_plugins');
+
+	// If plugins are not stored in an array, they're stored in the old
+	// newline separated format.  Convert to new format.
+	if ( !is_array( $active_plugins ) ) {
+		$active_plugins = explode("\n", trim($active_plugins));
+		update_option('active_plugins', $active_plugins);
+	}
+
+	// Obsolete tables
+	$wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optionvalues');
+	$wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiontypes');
+	$wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiongroups');
+	$wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiongroup_options');
+
+	// Update comments table to use comment_type
+	$wpdb->query("UPDATE $wpdb->comments SET comment_type='trackback', comment_content = REPLACE(comment_content, '<trackback />', '') WHERE comment_content LIKE '<trackback />%'");
+	$wpdb->query("UPDATE $wpdb->comments SET comment_type='pingback', comment_content = REPLACE(comment_content, '<pingback />', '') WHERE comment_content LIKE '<pingback />%'");
+
+	// Some versions have multiple duplicate option_name rows with the same values
+	$options = $wpdb->get_results("SELECT option_name, COUNT(option_name) AS dupes FROM `$wpdb->options` GROUP BY option_name");
+	foreach ( $options as $option ) {
+		if ( 1 != $option->dupes ) { // Could this be done in the query?
+			$limit = $option->dupes - 1;
+			$dupe_ids = $wpdb->get_col("SELECT option_id FROM $wpdb->options WHERE option_name = '$option->option_name' LIMIT $limit");
+			$dupe_ids = join($dupe_ids, ',');
+			$wpdb->query("DELETE FROM $wpdb->options WHERE option_id IN ($dupe_ids)");
+		}
+	}
+
+	make_site_theme();
+}
+
+function upgrade_160() {
+	global $wpdb, $wp_current_db_version;
+
+	populate_roles_160();
+
+	$users = $wpdb->get_results("SELECT * FROM $wpdb->users");
+	foreach ( $users as $user ) :
+		if ( !empty( $user->user_firstname ) )
+			update_usermeta( $user->ID, 'first_name', $wpdb->escape($user->user_firstname) );
+		if ( !empty( $user->user_lastname ) )
+			update_usermeta( $user->ID, 'last_name', $wpdb->escape($user->user_lastname) );
+		if ( !empty( $user->user_nickname ) )
+			update_usermeta( $user->ID, 'nickname', $wpdb->escape($user->user_nickname) );
+		if ( !empty( $user->user_level ) )
+			update_usermeta( $user->ID, $wpdb->prefix . 'user_level', $user->user_level );
+		if ( !empty( $user->user_icq ) )
+			update_usermeta( $user->ID, 'icq', $wpdb->escape($user->user_icq) );
+		if ( !empty( $user->user_aim ) )
+			update_usermeta( $user->ID, 'aim', $wpdb->escape($user->user_aim) );
+		if ( !empty( $user->user_msn ) )
+			update_usermeta( $user->ID, 'msn', $wpdb->escape($user->user_msn) );
+		if ( !empty( $user->user_yim ) )
+			update_usermeta( $user->ID, 'yim', $wpdb->escape($user->user_icq) );
+		if ( !empty( $user->user_description ) )
+			update_usermeta( $user->ID, 'description', $wpdb->escape($user->user_description) );
+
+		if ( isset( $user->user_idmode ) ):
+			$idmode = $user->user_idmode;
+			if ($idmode == 'nickname') $id = $user->user_nickname;
+			if ($idmode == 'login') $id = $user->user_login;
+			if ($idmode == 'firstname') $id = $user->user_firstname;
+			if ($idmode == 'lastname') $id = $user->user_lastname;
+			if ($idmode == 'namefl') $id = $user->user_firstname.' '.$user->user_lastname;
+			if ($idmode == 'namelf') $id = $user->user_lastname.' '.$user->user_firstname;
+			if (!$idmode) $id = $user->user_nickname;
+			$id = $wpdb->escape( $id );
+			$wpdb->query("UPDATE $wpdb->users SET display_name = '$id' WHERE ID = '$user->ID'");
+		endif;
+
+		// FIXME: RESET_CAPS is temporary code to reset roles and caps if flag is set.
+		$caps = get_usermeta( $user->ID, $wpdb->prefix . 'capabilities');
+		if ( empty($caps) || defined('RESET_CAPS') ) {
+			$level = get_usermeta($user->ID, $wpdb->prefix . 'user_level');
+			$role = translate_level_to_role($level);
+			update_usermeta( $user->ID, $wpdb->prefix . 'capabilities', array($role => true) );
+		}
+
+	endforeach;
+	$old_user_fields = array( 'user_firstname', 'user_lastname', 'user_icq', 'user_aim', 'user_msn', 'user_yim', 'user_idmode', 'user_ip', 'user_domain', 'user_browser', 'user_description', 'user_nickname', 'user_level' );
+	$wpdb->hide_errors();
+	foreach ( $old_user_fields as $old )
+		$wpdb->query("ALTER TABLE $wpdb->users DROP $old");
+	$wpdb->show_errors();
+
+	// populate comment_count field of posts table
+	$comments = $wpdb->get_results( "SELECT comment_post_ID, COUNT(*) as c FROM $wpdb->comments WHERE comment_approved = '1' GROUP BY comment_post_ID" );
+	if( is_array( $comments ) ) {
+		foreach ($comments as $comment) {
+			$wpdb->query( "UPDATE $wpdb->posts SET comment_count = $comment->c WHERE ID = '$comment->comment_post_ID'" );
+		}
+	}
+
+	// Some alpha versions used a post status of object instead of attachment and put
+	// the mime type in post_type instead of post_mime_type.
+	if ( $wp_current_db_version > 2541 && $wp_current_db_version <= 3091 ) {
+		$objects = $wpdb->get_results("SELECT ID, post_type FROM $wpdb->posts WHERE post_status = 'object'");
+		foreach ($objects as $object) {
+			$wpdb->query("UPDATE $wpdb->posts SET post_status = 'attachment',
+			post_mime_type = '$object->post_type',
+			post_type = ''
+			WHERE ID = $object->ID");
+
+			$meta = get_post_meta($object->ID, 'imagedata', true);
+			if ( ! empty($meta['file']) )
+				update_attached_file( $object->ID, $meta['file'] );
+		}
+	}
+}
+
+function upgrade_210() {
+	global $wpdb, $wp_current_db_version;
+
+	if ( $wp_current_db_version < 3506 ) {
+		// Update status and type.
+		$posts = $wpdb->get_results("SELECT ID, post_status FROM $wpdb->posts");
+
+		if ( ! empty($posts) ) foreach ($posts as $post) {
+			$status = $post->post_status;
+			$type = 'post';
+
+			if ( 'static' == $status ) {
+				$status = 'publish';
+				$type = 'page';
+			} else if ( 'attachment' == $status ) {
+				$status = 'inherit';
+				$type = 'attachment';
+			}
+
+			$wpdb->query("UPDATE $wpdb->posts SET post_status = '$status', post_type = '$type' WHERE ID = '$post->ID'");
+		}
+	}
+
+	if ( $wp_current_db_version < 3845 ) {
+		populate_roles_210();
+	}
+
+	if ( $wp_current_db_version < 3531 ) {
+		// Give future posts a post_status of future.
+		$now = gmdate('Y-m-d H:i:59');
+		$wpdb->query ("UPDATE $wpdb->posts SET post_status = 'future' WHERE post_status = 'publish' AND post_date_gmt > '$now'");
+
+		$posts = $wpdb->get_results("SELECT ID, post_date FROM $wpdb->posts WHERE post_status ='future'");
+		if ( !empty($posts) )
+			foreach ( $posts as $post )
+				wp_schedule_single_event(mysql2date('U', $post->post_date), 'publish_future_post', array($post->ID));
+	}
+}
+
+function upgrade_230() {
+	global $wp_current_db_version, $wpdb;
+
+	if ( $wp_current_db_version < 5200 ) {
+		populate_roles_230();
+	}
+
+	// Convert categories to terms.
+	$tt_ids = array();
+	$have_tags = false;
+	$categories = $wpdb->get_results("SELECT * FROM $wpdb->categories ORDER BY cat_ID");
+	foreach ($categories as $category) {
+		$term_id = (int) $category->cat_ID;
+		$name = $wpdb->escape($category->cat_name);
+		$description = $wpdb->escape($category->category_description);
+		$slug = $wpdb->escape($category->category_nicename);
+		$parent = $wpdb->escape($category->category_parent);
+		$term_group = 0;
+
+		// Associate terms with the same slug in a term group and make slugs unique.
+		if ( $exists = $wpdb->get_results("SELECT term_id, term_group FROM $wpdb->terms WHERE slug = '$slug'") ) {
+			$term_group = $exists[0]->term_group;
+			$id = $exists[0]->term_id;
+			$num = 2;
+			do {
+				$alt_slug = $slug . "-$num";
+				$num++;
+				$slug_check = $wpdb->get_var("SELECT slug FROM $wpdb->terms WHERE slug = '$alt_slug'");
+			} while ( $slug_check );
+
+			$slug = $alt_slug;
+
+			if ( empty( $term_group ) ) {
+				$term_group = $wpdb->get_var("SELECT MAX(term_group) FROM $wpdb->terms GROUP BY term_group") + 1;
+				$wpdb->query("UPDATE $wpdb->terms SET term_group = '$term_group' WHERE term_id = '$id'");
+			}
+		}
+
+		$wpdb->query("INSERT INTO $wpdb->terms (term_id, name, slug, term_group) VALUES ('$term_id', '$name', '$slug', '$term_group')");
+
+		$count = 0;
+		if ( !empty($category->category_count) ) {
+			$count = (int) $category->category_count;
+			$taxonomy = 'category';
+			$wpdb->query("INSERT INTO $wpdb->term_taxonomy (term_id, taxonomy, description, parent, count) VALUES ('$term_id', '$taxonomy', '$description', '$parent', '$count')");
+			$tt_ids[$term_id][$taxonomy] = (int) $wpdb->insert_id;
+		}
+
+		if ( !empty($category->link_count) ) {
+			$count = (int) $category->link_count;
+			$taxonomy = 'link_category';
+			$wpdb->query("INSERT INTO $wpdb->term_taxonomy (term_id, taxonomy, description, parent, count) VALUES ('$term_id', '$taxonomy', '$description', '$parent', '$count')");
+			$tt_ids[$term_id][$taxonomy] = (int) $wpdb->insert_id;
+		}
+
+		if ( !empty($category->tag_count) ) {
+			$have_tags = true;
+			$count = (int) $category->tag_count;
+			$taxonomy = 'post_tag';
+			$wpdb->query("INSERT INTO $wpdb->term_taxonomy (term_id, taxonomy, description, parent, count) VALUES ('$term_id', '$taxonomy', '$description', '$parent', '$count')");
+			$tt_ids[$term_id][$taxonomy] = (int) $wpdb->insert_id;
+		}
+
+		if ( empty($count) ) {
+			$count = 0;
+			$taxonomy = 'category';
+			$wpdb->query("INSERT INTO $wpdb->term_taxonomy (term_id, taxonomy, description, parent, count) VALUES ('$term_id', '$taxonomy', '$description', '$parent', '$count')");
+			$tt_ids[$term_id][$taxonomy] = (int) $wpdb->insert_id;
+		}
+	}
+
+	$select = 'post_id, category_id';
+	if ( $have_tags )
+		$select .= ', rel_type';
+
+	$posts = $wpdb->get_results("SELECT $select FROM $wpdb->post2cat GROUP BY post_id, category_id");
+	foreach ( $posts as $post ) {
+		$post_id = (int) $post->post_id;
+		$term_id = (int) $post->category_id;
+		$taxonomy = 'category';
+		if ( !empty($post->rel_type) && 'tag' == $post->rel_type)
+			$taxonomy = 'tag';
+		$tt_id = $tt_ids[$term_id][$taxonomy];
+		if ( empty($tt_id) )
+			continue;
+
+		$wpdb->query("INSERT INTO $wpdb->term_relationships (object_id, term_taxonomy_id) VALUES ('$post_id', '$tt_id')");
+	}
+
+	// < 3570 we used linkcategories.  >= 3570 we used categories and link2cat.
+	if ( $wp_current_db_version < 3570 ) {
+		// Create link_category terms for link categories.  Create a map of link cat IDs
+		// to link_category terms.
+		$link_cat_id_map = array();
+		$default_link_cat = 0;
+		$tt_ids = array();
+		$link_cats = $wpdb->get_results("SELECT cat_id, cat_name FROM " . $wpdb->prefix . 'linkcategories');
+		foreach ( $link_cats as $category) {
+			$cat_id = (int) $category->cat_id;
+			$term_id = 0;
+			$name = $wpdb->escape($category->cat_name);
+			$slug = sanitize_title($name);
+			$term_group = 0;
+
+			// Associate terms with the same slug in a term group and make slugs unique.
+			if ( $exists = $wpdb->get_results("SELECT term_id, term_group FROM $wpdb->terms WHERE slug = '$slug'") ) {
+				$term_group = $exists[0]->term_group;
+				$term_id = $exists[0]->term_id;
+			}
+
+			if ( empty($term_id) ) {
+				$wpdb->query("INSERT INTO $wpdb->terms (name, slug, term_group) VALUES ('$name', '$slug', '$term_group')");
+				$term_id = (int) $wpdb->insert_id;
+			}
+
+			$link_cat_id_map[$cat_id] = $term_id;
+			$default_link_cat = $term_id;
+
+			$wpdb->query("INSERT INTO $wpdb->term_taxonomy (term_id, taxonomy, description, parent, count) VALUES ('$term_id', 'link_category', '', '0', '0')");
+			$tt_ids[$term_id] = (int) $wpdb->insert_id;
+		}
+
+		// Associate links to cats.
+		$links = $wpdb->get_results("SELECT link_id, link_category FROM $wpdb->links");
+		if ( !empty($links) ) foreach ( $links as $link ) {
+			if ( 0 == $link->link_category )
+				continue;
+			if ( ! isset($link_cat_id_map[$link->link_category]) )
+				continue;
+			$term_id = $link_cat_id_map[$link->link_category];
+			$tt_id = $tt_ids[$term_id];
+			if ( empty($tt_id) )
+				continue;
+
+			$wpdb->query("INSERT INTO $wpdb->term_relationships (object_id, term_taxonomy_id) VALUES ('$link->link_id', '$tt_id')");
+		}
+
+		// Set default to the last category we grabbed during the upgrade loop.
+		update_option('default_link_category', $default_link_cat);
+	} else {
+		$links = $wpdb->get_results("SELECT link_id, category_id FROM $wpdb->link2cat GROUP BY link_id, category_id");
+		foreach ( $links as $link ) {
+			$link_id = (int) $link->link_id;
+			$term_id = (int) $link->category_id;
+			$taxonomy = 'link_category';
+			$tt_id = $tt_ids[$term_id][$taxonomy];
+			if ( empty($tt_id) )
+				continue;
+
+			$wpdb->query("INSERT INTO $wpdb->term_relationships (object_id, term_taxonomy_id) VALUES ('$link_id', '$tt_id')");
+		}
+	}
+
+	if ( $wp_current_db_version < 4772 ) {
+		// Obsolete linkcategories table
+		$wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'linkcategories');
+	}
+
+	// Recalculate all counts
+	$terms = $wpdb->get_results("SELECT term_taxonomy_id, taxonomy FROM $wpdb->term_taxonomy");
+	foreach ( (array) $terms as $term ) {
+		if ( ('post_tag' == $term->taxonomy) || ('category' == $term->taxonomy) )
+			$count = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts WHERE $wpdb->posts.ID = $wpdb->term_relationships.object_id AND post_status = 'publish' AND post_type = 'post' AND term_taxonomy_id = '$term->term_taxonomy_id'");
+		else
+			$count = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->term_relationships WHERE term_taxonomy_id = '$term->term_taxonomy_id'");
+		$wpdb->query("UPDATE $wpdb->term_taxonomy SET count = '$count' WHERE term_taxonomy_id = '$term->term_taxonomy_id'");
+	}
+}
+
+function upgrade_230_options_table() {
+	global $wpdb;
+	$old_options_fields = array( 'option_can_override', 'option_type', 'option_width', 'option_height', 'option_description', 'option_admin_level' );
+	$wpdb->hide_errors();
+	foreach ( $old_options_fields as $old )
+		$wpdb->query("ALTER TABLE $wpdb->options DROP $old");
+	$wpdb->show_errors();
+}
+
+function upgrade_230_old_tables() {
+	global $wpdb;
+	$wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'categories');
+	$wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'link2cat');
+	$wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'post2cat');
+}
+
+function upgrade_old_slugs() {
+	// upgrade people who were using the Redirect Old Slugs plugin
+	global $wpdb;
+	$wpdb->query("UPDATE $wpdb->postmeta SET meta_key = '_wp_old_slug' WHERE meta_key = 'old_slug'");
+}
+
+
+function upgrade_250() {
+	global $wp_current_db_version;
+
+	if ( $wp_current_db_version < 6689 ) {
+		populate_roles_250();
+	}
+	
+}
+
+// The functions we use to actually do stuff
+
+// General
+function maybe_create_table($table_name, $create_ddl) {
+	global $wpdb;
+	foreach ($wpdb->get_col("SHOW TABLES",0) as $table ) {
+		if ($table == $table_name) {
+			return true;
+		}
+	}
+	//didn't find it try to create it.
+	$q = $wpdb->query($create_ddl);
+	// we cannot directly tell that whether this succeeded!
+	foreach ($wpdb->get_col("SHOW TABLES",0) as $table ) {
+		if ($table == $table_name) {
+			return true;
+		}
+	}
+	return false;
+}
+
+function drop_index($table, $index) {
+	global $wpdb;
+	$wpdb->hide_errors();
+	$wpdb->query("ALTER TABLE `$table` DROP INDEX `$index`");
+	// Now we need to take out all the extra ones we may have created
+	for ($i = 0; $i < 25; $i++) {
+		$wpdb->query("ALTER TABLE `$table` DROP INDEX `{$index}_$i`");
+	}
+	$wpdb->show_errors();
+	return true;
+}
+
+function add_clean_index($table, $index) {
+	global $wpdb;
+	drop_index($table, $index);
+	$wpdb->query("ALTER TABLE `$table` ADD INDEX ( `$index` )");
+	return true;
+}
+
+/**
+ ** maybe_add_column()
+ ** Add column to db table if it doesn't exist.
+ ** Returns:  true if already exists or on successful completion
+ **           false on error
+ */
+function maybe_add_column($table_name, $column_name, $create_ddl) {
+	global $wpdb, $debug;
+	foreach ($wpdb->get_col("DESC $table_name", 0) as $column ) {
+		if ($debug) echo("checking $column == $column_name<br />");
+		if ($column == $column_name) {
+			return true;
+		}
+	}
+	//didn't find it try to create it.
+	$q = $wpdb->query($create_ddl);
+	// we cannot directly tell that whether this succeeded!
+	foreach ($wpdb->get_col("DESC $table_name", 0) as $column ) {
+		if ($column == $column_name) {
+			return true;
+		}
+	}
+	return false;
+}
+
+
+// get_alloptions as it was for 1.2.
+function get_alloptions_110() {
+	global $wpdb;
+	if ($options = $wpdb->get_results("SELECT option_name, option_value FROM $wpdb->options")) {
+		foreach ($options as $option) {
+			// "When trying to design a foolproof system,
+			//  never underestimate the ingenuity of the fools :)" -- Dougal
+			if ('siteurl' == $option->option_name) $option->option_value = preg_replace('|/+$|', '', $option->option_value);
+			if ('home' == $option->option_name) $option->option_value = preg_replace('|/+$|', '', $option->option_value);
+			if ('category_base' == $option->option_name) $option->option_value = preg_replace('|/+$|', '', $option->option_value);
+			$all_options->{$option->option_name} = stripslashes($option->option_value);
+		}
+	}
+	return $all_options;
+}
+
+// Version of get_option that is private to install/upgrade.
+function __get_option($setting) {
+	global $wpdb;
+
+	if ( $setting == 'home' && defined( 'WP_HOME' ) ) {
+		return preg_replace( '|/+$|', '', constant( 'WP_HOME' ) );
+	}
+
+	if ( $setting == 'siteurl' && defined( 'WP_SITEURL' ) ) {
+		return preg_replace( '|/+$|', '', constant( 'WP_SITEURL' ) );
+	}
+
+	$option = $wpdb->get_var("SELECT option_value FROM $wpdb->options WHERE option_name = '$setting'");
+
+	if ( 'home' == $setting && '' == $option )
+		return __get_option('siteurl');
+
+	if ( 'siteurl' == $setting || 'home' == $setting || 'category_base' == $setting )
+		$option = preg_replace('|/+$|', '', $option);
+
+	@ $kellogs = unserialize($option);
+	if ($kellogs !== FALSE)
+		return $kellogs;
+	else
+		return $option;
+}
+
+function deslash($content) {
+	// Note: \\\ inside a regex denotes a single backslash.
+
+	// Replace one or more backslashes followed by a single quote with
+	// a single quote.
+	$content = preg_replace("/\\\+'/", "'", $content);
+
+	// Replace one or more backslashes followed by a double quote with
+	// a double quote.
+	$content = preg_replace('/\\\+"/', '"', $content);
+
+	// Replace one or more backslashes with one backslash.
+	$content = preg_replace("/\\\+/", "\\", $content);
+
+	return $content;
+}
+
+function dbDelta($queries, $execute = true) {
+	global $wpdb;
+
+	// Seperate individual queries into an array
+	if( !is_array($queries) ) {
+		$queries = explode( ';', $queries );
+		if('' == $queries[count($queries) - 1]) array_pop($queries);
+	}
+
+	$cqueries = array(); // Creation Queries
+	$iqueries = array(); // Insertion Queries
+	$for_update = array();
+
+	// Create a tablename index for an array ($cqueries) of queries
+	foreach($queries as $qry) {
+		if(preg_match("|CREATE TABLE ([^ ]*)|", $qry, $matches)) {
+			$cqueries[strtolower($matches[1])] = $qry;
+			$for_update[$matches[1]] = 'Created table '.$matches[1];
+		}
+		else if(preg_match("|CREATE DATABASE ([^ ]*)|", $qry, $matches)) {
+			array_unshift($cqueries, $qry);
+		}
+		else if(preg_match("|INSERT INTO ([^ ]*)|", $qry, $matches)) {
+			$iqueries[] = $qry;
+		}
+		else if(preg_match("|UPDATE ([^ ]*)|", $qry, $matches)) {
+			$iqueries[] = $qry;
+		}
+		else {
+			// Unrecognized query type
+		}
+	}
+
+	// Check to see which tables and fields exist
+	if($tables = $wpdb->get_col('SHOW TABLES;')) {
+		// For every table in the database
+		foreach($tables as $table) {
+			// If a table query exists for the database table...
+			if( array_key_exists(strtolower($table), $cqueries) ) {
+				// Clear the field and index arrays
+				unset($cfields);
+				unset($indices);
+				// Get all of the field names in the query from between the parens
+				preg_match("|\((.*)\)|ms", $cqueries[strtolower($table)], $match2);
+				$qryline = trim($match2[1]);
+
+				// Separate field lines into an array
+				$flds = explode("\n", $qryline);
+
+				//echo "<hr/><pre>\n".print_r(strtolower($table), true).":\n".print_r($cqueries, true)."</pre><hr/>";
+
+				// For every field line specified in the query
+				foreach($flds as $fld) {
+					// Extract the field name
+					preg_match("|^([^ ]*)|", trim($fld), $fvals);
+					$fieldname = $fvals[1];
+
+					// Verify the found field name
+					$validfield = true;
+					switch(strtolower($fieldname))
+					{
+					case '':
+					case 'primary':
+					case 'index':
+					case 'fulltext':
+					case 'unique':
+					case 'key':
+						$validfield = false;
+						$indices[] = trim(trim($fld), ", \n");
+						break;
+					}
+					$fld = trim($fld);
+
+					// If it's a valid field, add it to the field array
+					if($validfield) {
+						$cfields[strtolower($fieldname)] = trim($fld, ", \n");
+					}
+				}
+
+				// Fetch the table column structure from the database
+				$tablefields = $wpdb->get_results("DESCRIBE {$table};");
+
+				// For every field in the table
+				foreach($tablefields as $tablefield) {
+					// If the table field exists in the field array...
+					if(array_key_exists(strtolower($tablefield->Field), $cfields)) {
+						// Get the field type from the query
+						preg_match("|".$tablefield->Field." ([^ ]*( unsigned)?)|i", $cfields[strtolower($tablefield->Field)], $matches);
+						$fieldtype = $matches[1];
+
+						// Is actual field type different from the field type in query?
+						if($tablefield->Type != $fieldtype) {
+							// Add a query to change the column type
+							$cqueries[] = "ALTER TABLE {$table} CHANGE COLUMN {$tablefield->Field} " . $cfields[strtolower($tablefield->Field)];
+							$for_update[$table.'.'.$tablefield->Field] = "Changed type of {$table}.{$tablefield->Field} from {$tablefield->Type} to {$fieldtype}";
+						}
+
+						// Get the default value from the array
+							//echo "{$cfields[strtolower($tablefield->Field)]}<br>";
+						if(preg_match("| DEFAULT '(.*)'|i", $cfields[strtolower($tablefield->Field)], $matches)) {
+							$default_value = $matches[1];
+							if($tablefield->Default != $default_value)
+							{
+								// Add a query to change the column's default value
+								$cqueries[] = "ALTER TABLE {$table} ALTER COLUMN {$tablefield->Field} SET DEFAULT '{$default_value}'";
+								$for_update[$table.'.'.$tablefield->Field] = "Changed default value of {$table}.{$tablefield->Field} from {$tablefield->Default} to {$default_value}";
+							}
+						}
+
+						// Remove the field from the array (so it's not added)
+						unset($cfields[strtolower($tablefield->Field)]);
+					}
+					else {
+						// This field exists in the table, but not in the creation queries?
+					}
+				}
+
+				// For every remaining field specified for the table
+				foreach($cfields as $fieldname => $fielddef) {
+					// Push a query line into $cqueries that adds the field to that table
+					$cqueries[] = "ALTER TABLE {$table} ADD COLUMN $fielddef";
+					$for_update[$table.'.'.$fieldname] = 'Added column '.$table.'.'.$fieldname;
+				}
+
+				// Index stuff goes here
+				// Fetch the table index structure from the database
+				$tableindices = $wpdb->get_results("SHOW INDEX FROM {$table};");
+
+				if($tableindices) {
+					// Clear the index array
+					unset($index_ary);
+
+					// For every index in the table
+					foreach($tableindices as $tableindex) {
+						// Add the index to the index data array
+						$keyname = $tableindex->Key_name;
+						$index_ary[$keyname]['columns'][] = array('fieldname' => $tableindex->Column_name, 'subpart' => $tableindex->Sub_part);
+						$index_ary[$keyname]['unique'] = ($tableindex->Non_unique == 0)?true:false;
+					}
+
+					// For each actual index in the index array
+					foreach($index_ary as $index_name => $index_data) {
+						// Build a create string to compare to the query
+						$index_string = '';
+						if($index_name == 'PRIMARY') {
+							$index_string .= 'PRIMARY ';
+						}
+						else if($index_data['unique']) {
+							$index_string .= 'UNIQUE ';
+						}
+						$index_string .= 'KEY ';
+						if($index_name != 'PRIMARY') {
+							$index_string .= $index_name;
+						}
+						$index_columns = '';
+						// For each column in the index
+						foreach($index_data['columns'] as $column_data) {
+							if($index_columns != '') $index_columns .= ',';
+							// Add the field to the column list string
+							$index_columns .= $column_data['fieldname'];
+							if($column_data['subpart'] != '') {
+								$index_columns .= '('.$column_data['subpart'].')';
+							}
+						}
+						// Add the column list to the index create string
+						$index_string .= ' ('.$index_columns.')';
+						if(!(($aindex = array_search($index_string, $indices)) === false)) {
+							unset($indices[$aindex]);
+							//echo "<pre style=\"border:1px solid #ccc;margin-top:5px;\">{$table}:<br />Found index:".$index_string."</pre>\n";
+						}
+						//else echo "<pre style=\"border:1px solid #ccc;margin-top:5px;\">{$table}:<br /><b>Did not find index:</b>".$index_string."<br />".print_r($indices, true)."</pre>\n";
+					}
+				}
+
+				// For every remaining index specified for the table
+				foreach ( (array) $indices as $index ) {
+					// Push a query line into $cqueries that adds the index to that table
+					$cqueries[] = "ALTER TABLE {$table} ADD $index";
+					$for_update[$table.'.'.$fieldname] = 'Added index '.$table.' '.$index;
+				}
+
+				// Remove the original table creation query from processing
+				unset($cqueries[strtolower($table)]);
+				unset($for_update[strtolower($table)]);
+			} else {
+				// This table exists in the database, but not in the creation queries?
+			}
+		}
+	}
+
+	$allqueries = array_merge($cqueries, $iqueries);
+	if($execute) {
+		foreach($allqueries as $query) {
+			//echo "<pre style=\"border:1px solid #ccc;margin-top:5px;\">".print_r($query, true)."</pre>\n";
+			$wpdb->query($query);
+		}
+	}
+
+	return $for_update;
+}
+
+function make_db_current() {
+	global $wp_queries;
+
+	$alterations = dbDelta($wp_queries);
+	echo "<ol>\n";
+	foreach($alterations as $alteration) echo "<li>$alteration</li>\n";
+	echo "</ol>\n";
+}
+
+function make_db_current_silent() {
+	global $wp_queries;
+
+	$alterations = dbDelta($wp_queries);
+}
+
+function make_site_theme_from_oldschool($theme_name, $template) {
+	$home_path = get_home_path();
+	$site_dir = ABSPATH . "wp-content/themes/$template";
+
+	if (! file_exists("$home_path/index.php"))
+		return false;
+
+	// Copy files from the old locations to the site theme.
+	// TODO: This does not copy arbitarary include dependencies.  Only the
+	// standard WP files are copied.
+	$files = array('index.php' => 'index.php', 'wp-layout.css' => 'style.css', 'wp-comments.php' => 'comments.php', 'wp-comments-popup.php' => 'comments-popup.php');
+
+	foreach ($files as $oldfile => $newfile) {
+		if ($oldfile == 'index.php')
+			$oldpath = $home_path;
+		else
+			$oldpath = ABSPATH;
+
+		if ($oldfile == 'index.php') { // Check to make sure it's not a new index
+			$index = implode('', file("$oldpath/$oldfile"));
+			if (strpos($index, 'WP_USE_THEMES') !== false) {
+				if (! @copy(ABSPATH . 'wp-content/themes/default/index.php', "$site_dir/$newfile"))
+					return false;
+				continue; // Don't copy anything
+				}
+		}
+
+		if (! @copy("$oldpath/$oldfile", "$site_dir/$newfile"))
+			return false;
+
+		chmod("$site_dir/$newfile", 0777);
+
+		// Update the blog header include in each file.
+		$lines = explode("\n", implode('', file("$site_dir/$newfile")));
+		if ($lines) {
+			$f = fopen("$site_dir/$newfile", 'w');
+
+			foreach ($lines as $line) {
+				if (preg_match('/require.*wp-blog-header/', $line))
+					$line = '//' . $line;
+
+				// Update stylesheet references.
+				$line = str_replace("<?php echo __get_option('siteurl'); ?>/wp-layout.css", "<?php bloginfo('stylesheet_url'); ?>", $line);
+
+				// Update comments template inclusion.
+				$line = str_replace("<?php include(ABSPATH . 'wp-comments.php'); ?>", "<?php comments_template(); ?>", $line);
+
+				fwrite($f, "{$line}\n");
+			}
+			fclose($f);
+		}
+	}
+
+	// Add a theme header.
+	$header = "/*\nTheme Name: $theme_name\nTheme URI: " . __get_option('siteurl') . "\nDescription: A theme automatically created by the upgrade.\nVersion: 1.0\nAuthor: Moi\n*/\n";
+
+	$stylelines = file_get_contents("$site_dir/style.css");
+	if ($stylelines) {
+		$f = fopen("$site_dir/style.css", 'w');
+
+		fwrite($f, $header);
+		fwrite($f, $stylelines);
+		fclose($f);
+	}
+
+	return true;
+}
+
+function make_site_theme_from_default($theme_name, $template) {
+	$site_dir = ABSPATH . "wp-content/themes/$template";
+	$default_dir = ABSPATH . 'wp-content/themes/default';
+
+	// Copy files from the default theme to the site theme.
+	//$files = array('index.php', 'comments.php', 'comments-popup.php', 'footer.php', 'header.php', 'sidebar.php', 'style.css');
+
+	$theme_dir = @ opendir("$default_dir");
+	if ($theme_dir) {
+		while(($theme_file = readdir( $theme_dir )) !== false) {
+			if (is_dir("$default_dir/$theme_file"))
+				continue;
+			if (! @copy("$default_dir/$theme_file", "$site_dir/$theme_file"))
+				return;
+			chmod("$site_dir/$theme_file", 0777);
+		}
+	}
+	@closedir($theme_dir);
+
+	// Rewrite the theme header.
+	$stylelines = explode("\n", implode('', file("$site_dir/style.css")));
+	if ($stylelines) {
+		$f = fopen("$site_dir/style.css", 'w');
+
+		foreach ($stylelines as $line) {
+			if (strpos($line, 'Theme Name:') !== false) $line = 'Theme Name: ' . $theme_name;
+			elseif (strpos($line, 'Theme URI:') !== false) $line = 'Theme URI: ' . __get_option('url');
+			elseif (strpos($line, 'Description:') !== false) $line = 'Description: Your theme.';
+			elseif (strpos($line, 'Version:') !== false) $line = 'Version: 1';
+			elseif (strpos($line, 'Author:') !== false) $line = 'Author: You';
+			fwrite($f, $line . "\n");
+		}
+		fclose($f);
+	}
+
+	// Copy the images.
+	umask(0);
+	if (! mkdir("$site_dir/images", 0777)) {
+		return false;
+	}
+
+	$images_dir = @ opendir("$default_dir/images");
+	if ($images_dir) {
+		while(($image = readdir($images_dir)) !== false) {
+			if (is_dir("$default_dir/images/$image"))
+				continue;
+			if (! @copy("$default_dir/images/$image", "$site_dir/images/$image"))
+				return;
+			chmod("$site_dir/images/$image", 0777);
+		}
+	}
+	@closedir($images_dir);
+}
+
+// Create a site theme from the default theme.
+function make_site_theme() {
+	// Name the theme after the blog.
+	$theme_name = __get_option('blogname');
+	$template = sanitize_title($theme_name);
+	$site_dir = ABSPATH . "wp-content/themes/$template";
+
+	// If the theme already exists, nothing to do.
+	if ( is_dir($site_dir)) {
+		return false;
+	}
+
+	// We must be able to write to the themes dir.
+	if (! is_writable(ABSPATH . "wp-content/themes")) {
+		return false;
+	}
+
+	umask(0);
+	if (! mkdir($site_dir, 0777)) {
+		return false;
+	}
+
+	if (file_exists(ABSPATH . 'wp-layout.css')) {
+		if (! make_site_theme_from_oldschool($theme_name, $template)) {
+			// TODO:  rm -rf the site theme directory.
+			return false;
+		}
+	} else {
+		if (! make_site_theme_from_default($theme_name, $template))
+			// TODO:  rm -rf the site theme directory.
+			return false;
+	}
+
+	// Make the new site theme active.
+	$current_template = __get_option('template');
+	if ($current_template == 'default') {
+		update_option('template', $template);
+		update_option('stylesheet', $template);
+	}
+	return $template;
+}
+
+function translate_level_to_role($level) {
+	switch ($level) {
+	case 10:
+	case 9:
+	case 8:
+		return 'administrator';
+	case 7:
+	case 6:
+	case 5:
+		return 'editor';
+	case 4:
+	case 3:
+	case 2:
+		return 'author';
+	case 1:
+		return 'contributor';
+	case 0:
+		return 'subscriber';
+	}
+}
+
+function wp_check_mysql_version() {
+	global $wpdb;
+	$result = $wpdb->check_database_version();
+	if ( is_wp_error( $result ) )
+		die( $result->get_error_message() );
+}
+
+function maybe_disable_automattic_widgets() {
+	$plugins = __get_option( 'active_plugins' );
+
+	foreach ( (array) $plugins as $plugin ) {
+		if ( basename( $plugin ) == 'widgets.php' ) {
+			array_splice( $plugins, array_search( $plugin, $plugins ), 1 );
+			update_option( 'active_plugins', $plugins );
+			break;
+		}
+	}
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/user.php 2.5.src/wp-admin/includes/user.php
--- 2.2.2.src/wp-admin/includes/user.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/user.php	2008-03-15 12:02:16.000000000 -0500
@@ -0,0 +1,395 @@
+<?php
+
+// Creates a new user from the "Users" form using $_POST information.
+function add_user() {
+	if ( func_num_args() ) { // The hackiest hack that ever did hack
+		global $current_user, $wp_roles;
+		$user_id = (int) func_get_arg( 0 );
+
+		if ( isset( $_POST['role'] ) ) {
+			if( $user_id != $current_user->id || $wp_roles->role_objects[$_POST['role']]->has_cap( 'edit_users' ) ) {
+				$user = new WP_User( $user_id );
+				$user->set_role( $_POST['role'] );
+			}
+		}
+	} else {
+		add_action( 'user_register', 'add_user' ); // See above
+		return edit_user();
+	}
+}
+
+function edit_user( $user_id = 0 ) {
+	global $current_user, $wp_roles, $wpdb;
+	if ( $user_id != 0 ) {
+		$update = true;
+		$user->ID = (int) $user_id;
+		$userdata = get_userdata( $user_id );
+		$user->user_login = $wpdb->escape( $userdata->user_login );
+	} else {
+		$update = false;
+		$user = '';
+	}
+
+	if ( isset( $_POST['user_login'] ))
+		$user->user_login = wp_specialchars( trim( $_POST['user_login'] ));
+
+	$pass1 = $pass2 = '';
+	if ( isset( $_POST['pass1'] ))
+		$pass1 = $_POST['pass1'];
+	if ( isset( $_POST['pass2'] ))
+		$pass2 = $_POST['pass2'];
+
+	if ( isset( $_POST['role'] ) && current_user_can( 'edit_users' ) ) {
+		if( $user_id != $current_user->id || $wp_roles->role_objects[$_POST['role']]->has_cap( 'edit_users' ))
+			$user->role = $_POST['role'];
+	}
+
+	if ( isset( $_POST['email'] ))
+		$user->user_email = wp_specialchars( trim( $_POST['email'] ));
+	if ( isset( $_POST['url'] ) ) {
+		$user->user_url = clean_url( trim( $_POST['url'] ));
+		$user->user_url = preg_match('/^(https?|ftps?|mailto|news|irc|gopher|nntp|feed|telnet):/is', $user->user_url) ? $user->user_url : 'http://'.$user->user_url;
+	}
+	if ( isset( $_POST['first_name'] ))
+		$user->first_name = wp_specialchars( trim( $_POST['first_name'] ));
+	if ( isset( $_POST['last_name'] ))
+		$user->last_name = wp_specialchars( trim( $_POST['last_name'] ));
+	if ( isset( $_POST['nickname'] ))
+		$user->nickname = wp_specialchars( trim( $_POST['nickname'] ));
+	if ( isset( $_POST['display_name'] ))
+		$user->display_name = wp_specialchars( trim( $_POST['display_name'] ));
+	if ( isset( $_POST['description'] ))
+		$user->description = trim( $_POST['description'] );
+	if ( isset( $_POST['jabber'] ))
+		$user->jabber = wp_specialchars( trim( $_POST['jabber'] ));
+	if ( isset( $_POST['aim'] ))
+		$user->aim = wp_specialchars( trim( $_POST['aim'] ));
+	if ( isset( $_POST['yim'] ))
+		$user->yim = wp_specialchars( trim( $_POST['yim'] ));
+	if ( !$update )
+		$user->rich_editing = 'true';  // Default to true for new users.
+	else if ( isset( $_POST['rich_editing'] ) )
+		$user->rich_editing = $_POST['rich_editing'];
+	else
+		$user->rich_editing = 'false';
+
+	if ( !$update )
+		$user->admin_color = 'fresh';  // Default to fresh for new users.
+	else if ( isset( $_POST['admin_color'] ) )
+		$user->admin_color = $_POST['admin_color'];
+	else
+		$user->admin_color = 'fresh';
+
+	$errors = new WP_Error();
+
+	/* checking that username has been typed */
+	if ( $user->user_login == '' )
+		$errors->add( 'user_login', __( '<strong>ERROR</strong>: Please enter a username.' ));
+
+	/* checking the password has been typed twice */
+	do_action_ref_array( 'check_passwords', array ( $user->user_login, & $pass1, & $pass2 ));
+
+	if ( $update ) {
+		if ( empty($pass1) && !empty($pass2) )
+			$errors->add( 'pass', __( '<strong>ERROR</strong>: You entered your new password only once.' ), array( 'form-field' => 'pass1' ) );
+		elseif ( !empty($pass1) && empty($pass2) )
+			$errors->add( 'pass', __( '<strong>ERROR</strong>: You entered your new password only once.' ), array( 'form-field' => 'pass2' ) );
+	} else {
+		if ( empty($pass1) )
+			$errors->add( 'pass', __( '<strong>ERROR</strong>: Please enter your password.' ), array( 'form-field' => 'pass1' ) );
+		elseif ( empty($pass2) )
+			$errors->add( 'pass', __( '<strong>ERROR</strong>: Please enter your password twice.' ), array( 'form-field' => 'pass2' ) );
+	}
+
+	/* Check for "\" in password */
+	if( strpos( " ".$pass1, "\\" ) )
+		$errors->add( 'pass', __( '<strong>ERROR</strong>: Passwords may not contain the character "\\".' ), array( 'form-field' => 'pass1' ) );
+
+	/* checking the password has been typed twice the same */
+	if ( $pass1 != $pass2 )
+		$errors->add( 'pass', __( '<strong>ERROR</strong>: Please enter the same password in the two password fields.' ), array( 'form-field' => 'pass1' ) );
+
+	if (!empty ( $pass1 ))
+		$user->user_pass = $pass1;
+
+	if ( !$update && !validate_username( $user->user_login ) )
+		$errors->add( 'user_login', __( '<strong>ERROR</strong>: This username is invalid. Please enter a valid username.' ));
+
+	if (!$update && username_exists( $user->user_login ))
+		$errors->add( 'user_login', __( '<strong>ERROR</strong>: This username is already registered. Please choose another one.' ));
+
+	/* checking e-mail address */
+	if ( empty ( $user->user_email ) ) {
+		$errors->add( 'user_email', __( '<strong>ERROR</strong>: Please enter an e-mail address.' ), array( 'form-field' => 'email' ) );
+	} else
+		if (!is_email( $user->user_email ) ) {
+			$errors->add( 'user_email', __( "<strong>ERROR</strong>: The e-mail address isn't correct." ), array( 'form-field' => 'email' ) );
+		}
+
+	if ( $errors->get_error_codes() )
+		return $errors;
+
+	if ( $update ) {
+		$user_id = wp_update_user( get_object_vars( $user ));
+	} else {
+		$user_id = wp_insert_user( get_object_vars( $user ));
+		wp_new_user_notification( $user_id );
+	}
+	return $user_id;
+}
+
+function get_author_user_ids() {
+	global $wpdb;
+	$level_key = $wpdb->prefix . 'user_level';
+
+	$query = "SELECT user_id FROM $wpdb->usermeta WHERE meta_key = '$level_key' AND meta_value != '0'";
+
+	return $wpdb->get_col( $query );
+}
+
+function get_editable_authors( $user_id ) {
+	global $wpdb;
+
+	$editable = get_editable_user_ids( $user_id );
+
+	if( !$editable ) {
+		return false;
+	} else {
+		$editable = join(',', $editable);
+		$authors = $wpdb->get_results( "SELECT * FROM $wpdb->users WHERE ID IN ($editable) ORDER BY display_name" );
+	}
+
+	return apply_filters('get_editable_authors', $authors);
+}
+
+function get_editable_user_ids( $user_id, $exclude_zeros = true ) {
+	global $wpdb;
+
+	$user = new WP_User( $user_id );
+
+	if ( ! $user->has_cap('edit_others_posts') ) {
+		if ( $user->has_cap('edit_posts') || $exclude_zeros == false )
+			return array($user->id);
+		else
+			return false;
+	}
+
+	$level_key = $wpdb->prefix . 'user_level';
+
+	$query = "SELECT user_id FROM $wpdb->usermeta WHERE meta_key = '$level_key'";
+	if ( $exclude_zeros )
+		$query .= " AND meta_value != '0'";
+
+	return $wpdb->get_col( $query );
+}
+
+function get_nonauthor_user_ids() {
+	global $wpdb;
+	$level_key = $wpdb->prefix . 'user_level';
+
+	$query = "SELECT user_id FROM $wpdb->usermeta WHERE meta_key = '$level_key' AND meta_value = '0'";
+
+	return $wpdb->get_col( $query );
+}
+
+function get_others_unpublished_posts($user_id, $type='any') {
+	global $wpdb;
+
+	$editable = get_editable_user_ids( $user_id );
+
+	if ( in_array($type, array('draft', 'pending')) )
+		$type_sql = " post_status = '$type' ";
+	else
+		$type_sql = " ( post_status = 'draft' OR post_status = 'pending' ) ";
+
+	$dir = ( 'pending' == $type ) ? 'ASC' : 'DESC';
+
+	if( !$editable ) {
+		$other_unpubs = '';
+	} else {
+		$editable = join(',', $editable);
+		$other_unpubs = $wpdb->get_results("SELECT ID, post_title, post_author FROM $wpdb->posts WHERE post_type = 'post' AND $type_sql AND post_author IN ($editable) AND post_author != '$user_id' ORDER BY post_modified $dir");
+	}
+
+	return apply_filters('get_others_drafts', $other_unpubs);
+}
+
+function get_others_drafts($user_id) {
+	return get_others_unpublished_posts($user_id, 'draft');
+}
+
+function get_others_pending($user_id) {
+	return get_others_unpublished_posts($user_id, 'pending');
+}
+
+function get_user_to_edit( $user_id ) {
+	$user = new WP_User( $user_id );
+	$user->user_login   = attribute_escape($user->user_login);
+	$user->user_email   = attribute_escape($user->user_email);
+	$user->user_url     = clean_url($user->user_url);
+	$user->first_name   = attribute_escape($user->first_name);
+	$user->last_name    = attribute_escape($user->last_name);
+	$user->display_name = attribute_escape($user->display_name);
+	$user->nickname     = attribute_escape($user->nickname);
+	$user->aim          = attribute_escape($user->aim);
+	$user->yim          = attribute_escape($user->yim);
+	$user->jabber       = attribute_escape($user->jabber);
+	$user->description  =  wp_specialchars($user->description);
+
+	return $user;
+}
+
+function get_users_drafts( $user_id ) {
+	global $wpdb;
+	$user_id = (int) $user_id;
+	$query = "SELECT ID, post_title FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'draft' AND post_author = $user_id ORDER BY post_modified DESC";
+	$query = apply_filters('get_users_drafts', $query);
+	return $wpdb->get_results( $query );
+}
+
+function wp_delete_user($id, $reassign = 'novalue') {
+	global $wpdb;
+
+	$id = (int) $id;
+
+	if ($reassign == 'novalue') {
+		$post_ids = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE post_author = $id");
+
+		if ($post_ids) {
+			foreach ($post_ids as $post_id)
+				wp_delete_post($post_id);
+		}
+
+		// Clean links
+		$wpdb->query("DELETE FROM $wpdb->links WHERE link_owner = $id");
+	} else {
+		$reassign = (int) $reassign;
+		$wpdb->query("UPDATE $wpdb->posts SET post_author = {$reassign} WHERE post_author = {$id}");
+		$wpdb->query("UPDATE $wpdb->links SET link_owner = {$reassign} WHERE link_owner = {$id}");
+	}
+
+	// FINALLY, delete user
+	do_action('delete_user', $id);
+
+	$wpdb->query("DELETE FROM $wpdb->users WHERE ID = $id");
+	$wpdb->query("DELETE FROM $wpdb->usermeta WHERE user_id = '$id'");
+
+	wp_cache_delete($id, 'users');
+	wp_cache_delete($user->user_login, 'userlogins');
+	wp_cache_delete($user->user_email, 'useremail');
+
+	return true;
+}
+
+function wp_revoke_user($id) {
+	$id = (int) $id;
+
+	$user = new WP_User($id);
+	$user->remove_all_caps();
+}
+
+// WP_User_Search class
+// by Mark Jaquith
+
+if ( !class_exists('WP_User_Search') ) :
+class WP_User_Search {
+	var $results;
+	var $search_term;
+	var $page;
+	var $role;
+	var $raw_page;
+	var $users_per_page = 50;
+	var $first_user;
+	var $last_user;
+	var $query_limit;
+	var $query_sort;
+	var $query_from_where;
+	var $total_users_for_query = 0;
+	var $too_many_total_users = false;
+	var $search_errors;
+
+	function WP_User_Search ($search_term = '', $page = '', $role = '') { // constructor
+		$this->search_term = $search_term;
+		$this->raw_page = ( '' == $page ) ? false : (int) $page;
+		$this->page = (int) ( '' == $page ) ? 1 : $page;
+		$this->role = $role;
+
+		$this->prepare_query();
+		$this->query();
+		$this->prepare_vars_for_template_usage();
+		$this->do_paging();
+	}
+
+	function prepare_query() {
+		global $wpdb;
+		$this->first_user = ($this->page - 1) * $this->users_per_page;
+		$this->query_limit = ' LIMIT ' . $this->first_user . ',' . $this->users_per_page;
+		$this->query_sort = ' ORDER BY user_login';
+		$search_sql = '';
+		if ( $this->search_term ) {
+			$searches = array();
+			$search_sql = 'AND (';
+			foreach ( array('user_login', 'user_nicename', 'user_email', 'user_url', 'display_name') as $col )
+				$searches[] = $col . " LIKE '%$this->search_term%'";
+			$search_sql .= implode(' OR ', $searches);
+			$search_sql .= ')';
+		}
+
+		$this->query_from_where = "FROM $wpdb->users";
+		if ( $this->role )
+			$this->query_from_where .= " INNER JOIN $wpdb->usermeta ON $wpdb->users.ID = $wpdb->usermeta.user_id WHERE $wpdb->usermeta.meta_key = '{$wpdb->prefix}capabilities' AND $wpdb->usermeta.meta_value LIKE '%$this->role%'";
+		else
+			$this->query_from_where .= " WHERE 1=1";
+		$this->query_from_where .= " $search_sql";
+
+	}
+
+	function query() {
+		global $wpdb;
+		$this->results = $wpdb->get_col('SELECT ID ' . $this->query_from_where . $this->query_sort . $this->query_limit);
+
+		if ( $this->results )
+			$this->total_users_for_query = $wpdb->get_var('SELECT COUNT(ID) ' . $this->query_from_where); // no limit
+		else
+			$this->search_errors = new WP_Error('no_matching_users_found', __('No matching users were found!'));
+	}
+
+	function prepare_vars_for_template_usage() {
+		$this->search_term = stripslashes($this->search_term); // done with DB, from now on we want slashes gone
+	}
+
+	function do_paging() {
+		if ( $this->total_users_for_query > $this->users_per_page ) { // have to page the results
+			$this->paging_text = paginate_links( array(
+				'total' => ceil($this->total_users_for_query / $this->users_per_page),
+				'current' => $this->page,
+				'base' => 'users.php?%_%',
+				'format' => 'userspage=%#%',
+				'add_args' => array( 'usersearch' => urlencode($this->search_term) )
+			) );
+		}
+	}
+
+	function get_results() {
+		return (array) $this->results;
+	}
+
+	function page_links() {
+		echo $this->paging_text;
+	}
+
+	function results_are_paged() {
+		if ( $this->paging_text )
+			return true;
+		return false;
+	}
+
+	function is_search() {
+		if ( $this->search_term )
+			return true;
+		return false;
+	}
+}
+endif;
+
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/includes/widgets.php 2.5.src/wp-admin/includes/widgets.php
--- 2.2.2.src/wp-admin/includes/widgets.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/includes/widgets.php	2008-03-22 03:17:37.000000000 -0500
@@ -0,0 +1,282 @@
+<?php
+
+// $_search is unsanitized
+function wp_list_widgets( $show = 'all', $_search = false ) {
+	global $wp_registered_widgets, $sidebars_widgets, $wp_registered_widget_controls;
+	if ( $_search ) {
+		// sanitize
+		$search = preg_replace( '/[^\w\s]/', '', $_search );
+		// array of terms
+		$search_terms = preg_split( '/[\s]/', $search, -1, PREG_SPLIT_NO_EMPTY );
+	} else {
+		$search_terms = array();
+	}
+
+	if ( !in_array( $show, array( 'all', 'unused', 'used' ) ) )
+		$show = 'all';
+?>
+
+	<ul id='widget-list'>
+		<?php
+		$no_widgets_shown = true;
+		$already_shown = array();
+		foreach ( $wp_registered_widgets as $name => $widget ) :
+			if ( in_array( $widget['callback'], $already_shown ) ) // We already showed this multi-widget
+				continue;
+
+			if ( $search_terms ) {
+				$hit = false;
+				// Simple case-insensitive search.  Boolean OR.
+				$search_text = preg_replace( '/[^\w]/', '', $widget['name'] );
+				if ( isset($widget['description']) )
+					$search_text .= preg_replace( '/[^\w]/', '', $widget['description'] );
+
+				foreach ( $search_terms as $search_term ) {
+					if ( stristr( $search_text, $search_term ) ) {
+						$hit = true;
+						break;
+					}
+				}
+				if ( !$hit )
+					continue;
+			}
+
+			$sidebar = is_active_widget( $widget['callback'], $widget['id'] );
+
+			if ( ( 'unused' == $show && $sidebar ) || ( 'used' == $show && !$sidebar ) )
+				continue;
+
+			ob_start();
+				$args = wp_list_widget_controls_dynamic_sidebar( array( 0 => array( 'widget_id' => $widget['id'], 'widget_name' => $widget['name'], '_display' => 'template' ) ) );
+				$sidebar_args = call_user_func_array( 'wp_widget_control', $args );
+			$widget_control_template = ob_get_contents();
+			ob_end_clean();
+
+			$widget_id = $widget['id']; // save this for later in case we mess with $widget['id']
+
+			$is_multi = false !== strpos( $widget_control_template, '%i%' );
+			if ( !$sidebar || $is_multi ) {
+				$add_query = array(
+					'sidebar' => $sidebar,
+					'key' => false,
+					'edit' => false
+				);
+				if ( $is_multi ) {
+					// it's a multi-widget.  We only need to show it in the list once.
+					$already_shown[] = $widget['callback'];
+					$num = (int) array_pop( explode( '-', $widget['id'] ) );
+					$id_base = $wp_registered_widget_controls[$widget['id']]['id_base'];
+					// so that we always add a new one when clicking "add"
+					while ( isset($wp_registered_widgets["$id_base-$num"]) )
+						$num++;
+					$widget['id'] = "$id_base-$num";
+					$add_query['base'] = $id_base;
+					$add_query['key'] = $num;
+					$add_query['sidebar'] = $GLOBALS['sidebar'];
+				}
+				$add_query['add'] = $widget['id'];
+				$action = 'add';
+				$add_url = wp_nonce_url( add_query_arg( $add_query ), "add-widget_$widget[id]" );
+			} else {
+				$action = 'edit';
+				$edit_url = clean_url( add_query_arg( array(
+					'sidebar' => $sidebar,
+					'edit' => $widget['id'],
+					'key' => array_search( $widget['id'], $sidebars_widgets[$sidebar] ),
+				) ) );
+				
+				$widget_control_template = '<textarea rows="1" cols="1">' . htmlspecialchars( $widget_control_template ) . '</textarea>';
+			}
+
+			$widget_control_template = $sidebar_args['before_widget'] . $widget_control_template . $sidebar_args['after_widget'];
+
+			$no_widgets_shown = false;
+
+		?>
+
+		<li id="widget-list-item-<?php echo attribute_escape( $widget['id'] ); ?>" class="widget-list-item">
+			<h4 class="widget-title widget-draggable">
+
+				<?php echo wp_specialchars( $widget['name'] ); ?>
+
+				<?php if ( 'add' == $action ) : ?>
+
+				<a class="widget-action widget-control-add" href="<?php echo $add_url; ?>"><?php _e( 'Add' ); ?></a>
+
+				<?php elseif ( 'edit' == $action ) :
+					// We echo a hidden edit link for the sake of the JS.  Edit links are shown (needlessly?) after a widget is added.
+				?>
+
+				<a class="widget-action widget-control-edit" href="<?php echo $edit_url; ?>" style="display: none;"><?php _e( 'Edit' ); ?></a>
+
+				<?php endif; ?>
+
+			</h4>
+
+
+			<ul id="widget-control-info-<?php echo $widget['id']; ?>" class="widget-control-info">
+
+				<?php echo $widget_control_template; ?>
+
+			</ul>
+
+			<?php if ( 'add' == $action ) : ?>
+			<?php endif; ?>
+
+			<div class="widget-description">
+				<?php echo ( $widget_description = wp_widget_description( $widget_id ) ) ? $widget_description : '&nbsp;'; ?>
+			</div>
+
+			<br class="clear" />
+
+		</li>
+
+		<?php endforeach; if ( $no_widgets_shown ) : ?>
+
+		<li><?php _e( 'No matching widgets' ); ?></li>
+
+		<?php endif; ?>
+
+	</ul>
+<?php
+}
+
+
+
+function wp_list_widget_controls( $sidebar ) {
+	add_filter( 'dynamic_sidebar_params', 'wp_list_widget_controls_dynamic_sidebar' );
+?>
+
+	<ul class="widget-control-list">
+
+		<?php if ( !dynamic_sidebar( $sidebar ) ) echo "<li />"; ?>
+
+	</ul>
+
+<?php
+}
+
+
+function wp_list_widget_controls_dynamic_sidebar( $params ) {
+	global $wp_registered_widgets;
+	static $i = 0;
+	$i++;
+
+	$widget_id = $params[0]['widget_id'];
+
+	$params[0]['before_widget'] = "<li id='widget-list-control-item-$i-$widget_id' class='widget-list-control-item widget-sortable'>\n";
+	$params[0]['after_widget'] = "</li>";
+	$params[0]['before_title'] = "%BEG_OF_TITLE%";
+	$params[0]['after_title'] = "%END_OF_TITLE%";
+	if ( is_callable( $wp_registered_widgets[$widget_id]['callback'] ) ) {
+		$wp_registered_widgets[$widget_id]['_callback'] = $wp_registered_widgets[$widget_id]['callback'];
+		$wp_registered_widgets[$widget_id]['callback'] = 'wp_widget_control';
+	}
+	return $params;
+}
+
+/*
+ * Meta widget used to display the control form for a widget.  Called from dynamic_sidebar()
+ */
+function wp_widget_control( $sidebar_args ) {
+	global $wp_registered_widgets, $wp_registered_widget_controls, $sidebars_widgets, $edit_widget;
+	$widget_id = $sidebar_args['widget_id'];
+	$sidebar_id = isset($sidebar_args['id']) ? $sidebar_args['id'] : false;
+
+	$control = $wp_registered_widget_controls[$widget_id];
+	$widget  = $wp_registered_widgets[$widget_id];
+
+	$key = $sidebar_id ? array_search( $widget_id, $sidebars_widgets[$sidebar_id] ) : 'no-key'; // position of widget in sidebar
+
+	$edit = -1 <  $edit_widget && is_numeric($key) && $edit_widget === $key; // (bool) are we currently editing this widget
+
+	$id_format = $widget['id'];
+	// We aren't showing a widget control, we're outputing a template for a mult-widget control
+	if ( 'template' == $sidebar_args['_display'] && isset($control['params'][0]['number']) ) {
+		// number == -1 implies a template where id numbers are replaced by a generic '%i%'
+		$control['params'][0]['number'] = -1;
+		// if given, id_base means widget id's should be constructed like {$id_base}-{$id_number}
+		if ( isset($control['id_base']) )
+			$id_format = $control['id_base'] . '-%i%';
+	}
+
+	$widget_title = '';
+	// We grab the normal widget output to find the widget's title
+	if ( is_callable( $widget['_callback'] ) ) {
+		ob_start();
+		$args = func_get_args();
+		call_user_func_array( $widget['_callback'], $args );
+		$widget_title = ob_get_clean();
+		$widget_title = wp_widget_control_ob_filter( $widget_title );
+	}
+	$wp_registered_widgets[$widget_id]['callback'] = $wp_registered_widgets[$widget_id]['_callback'];
+	unset($wp_registered_widgets[$widget_id]['_callback']);
+
+	if ( $widget_title && $widget_title != $control['name'] )
+		$widget_title = sprintf( _c('%1$s: %2$s|1: widget name, 2: widget title' ), $sidebar_args['widget_name'], $widget_title );
+	else
+		$widget_title = wp_specialchars( strip_tags( $sidebar_args['widget_name'] ) );
+
+	if ( empty($sidebar_args['_display']) || 'template' != $sidebar_args['_display'] )
+		echo $sidebar_args['before_widget'];
+?>
+		<h4 class="widget-title"><?php echo $widget_title ?>
+
+			<?php if ( $edit ) : ?>
+
+			<a class="widget-action widget-control-edit" href="<?php echo remove_query_arg( array( 'edit', 'key' ) ); ?>"><?php _e('Cancel'); ?></a>
+
+			<?php else : ?>
+
+			<a class="widget-action widget-control-edit" href="<?php echo clean_url( add_query_arg( array( 'edit' => $id_format, 'key' => $key ) ) ); ?>"><?php _e('Edit'); ?></a>
+
+			<?php endif; ?>
+
+		</h4>
+
+		<div class="widget-control"<?php if ( $edit ) echo ' style="display: block;"'; ?>>
+
+			<?php
+			if ( $control )
+				call_user_func_array( $control['callback'], $control['params'] );
+			else
+				echo '<p>' . __('There are no options for this widget.') . '</p>';
+			?>
+
+			<input type="hidden" name="widget-id[]" value="<?php echo $id_format; ?>" />
+			<input type="hidden" class="widget-width" value="<?php echo $control['width']; ?>" />
+
+			<div class="widget-control-actions">
+
+				<?php if ( $control ) : ?>
+
+				<a class="widget-action widget-control-save wp-no-js-hidden edit alignleft" href="#save:<?php echo $id_format; ?>"><?php _e('Change'); ?></a>
+
+				<?php endif; ?>
+
+				<a class="widget-action widget-control-remove delete alignright" href="<?php echo clean_url( wp_nonce_url( add_query_arg( array( 'remove' => $id_format, 'key' => $key ) ), "remove-widget_$widget[id]" ) ); ?>"><?php _e('Remove'); ?></a>
+				<br class="clear" />
+			</div>
+		</div>
+<?php
+	if ( empty($sidebar_args['_display']) || 'template' != $sidebar_args['_display'] )
+		echo $sidebar_args['after_widget'];
+	return $sidebar_args;
+}
+
+function wp_widget_control_ob_filter( $string ) {
+	if ( false === $beg = strpos( $string, '%BEG_OF_TITLE%' ) )
+		return '';
+	if ( false === $end = strpos( $string, '%END_OF_TITLE%' ) )
+		return '';
+	$string = substr( $string, $beg + 14 , $end - $beg - 14);
+	return wp_specialchars( strip_tags( $string ) );
+}
+
+function widget_css() {
+	wp_admin_css( 'css/widgets' );
+}
+
+add_action( 'admin_head', 'widget_css' );
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/index-extra.php 2.5.src/wp-admin/index-extra.php
--- 2.2.2.src/wp-admin/index-extra.php	2007-02-06 14:12:53.000000000 -0600
+++ 2.5.src/wp-admin/index-extra.php	2008-02-21 15:20:09.000000000 -0600
@@ -1,69 +1,28 @@
 <?php
 require_once('admin.php');
+require( 'includes/dashboard.php' );
 require_once (ABSPATH . WPINC . '/rss.php');
 
-@header('Content-type: ' . get_option('html_type') . '; charset=' . get_option('blog_charset'));
+@header('Content-Type: ' . get_option('html_type') . '; charset=' . get_option('blog_charset'));
 
 switch ( $_GET['jax'] ) {
 
 case 'incominglinks' :
-$rss = @fetch_rss('http://feeds.technorati.com/cosmos/rss/?url='. trailingslashit(get_option('home')) .'&partner=wordpress');
-if ( isset($rss->items) && 1 < count($rss->items) ) { // Technorati returns a 1-item feed when it has no results
-?>
-<h3><?php _e('Incoming Links'); ?> <cite><a href="http://www.technorati.com/search/<?php echo trailingslashit(get_option('home')); ?>?partner=wordpress"><?php _e('More &raquo;'); ?></a></cite></h3>
-<ul>
-<?php
-$rss->items = array_slice($rss->items, 0, 10);
-foreach ($rss->items as $item ) {
-?>
-	<li><a href="<?php echo wp_filter_kses($item['link']); ?>"><?php echo wptexturize(wp_specialchars($item['title'])); ?></a></li>
-<?php } ?>
-</ul>
-<?php
-}
-break;
+	wp_dashboard_incoming_links_output();
+	break;
 
 case 'devnews' :
-$rss = @fetch_rss('http://wordpress.org/development/feed/');
-if ( isset($rss->items) && 0 != count($rss->items) ) {
-?>
-<h3><?php _e('WordPress Development Blog'); ?></h3>
-<?php
-$rss->items = array_slice($rss->items, 0, 3);
-foreach ($rss->items as $item ) {
-?>
-<h4><a href='<?php echo wp_filter_kses($item['link']); ?>'><?php echo wp_specialchars($item['title']); ?></a> &#8212; <?php printf(__('%s ago'), human_time_diff(strtotime($item['pubdate'], time() ) ) ); ?></h4>
-<p><?php echo $item['description']; ?></p>
-<?php
-	}
-}
-?>
-
-<?php
-break;
+	wp_dashboard_rss_output( 'dashboard_primary' );
+	break;
 
 case 'planetnews' :
-$rss = @fetch_rss('http://planet.wordpress.org/feed/');
-if ( isset($rss->items) && 0 != count($rss->items) ) {
-?>
-<h3><?php _e('Other WordPress News'); ?></h3>
-<ul>
-<?php
-$rss->items = array_slice($rss->items, 0, 20);
-foreach ($rss->items as $item ) {
-$title = wp_specialchars($item['title']);
-$author = preg_replace( '|(.+?):.+|s', '$1', $item['title'] );
-$post = preg_replace( '|.+?:(.+)|s', '$1', $item['title'] );
-?>
-<li><a href='<?php echo wp_filter_kses($item['link']); ?>'><span class="post"><?php echo $post; ?></span><span class="hidden"> - </span><cite><?php echo $author; ?></cite></a></li>
-<?php
-	}
-?>
-</ul>
-<p class="readmore"><a href="http://planet.wordpress.org/"><?php _e('Read more'); ?> &raquo;</a></p>
-<?php
-}
-break;
+	wp_dashboard_secondary_output();
+	break;
+
+case 'plugins' :
+	wp_dashboard_plugins_output();
+	break;
+
 }
 
-?>
\ No newline at end of file
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/index.php 2.5.src/wp-admin/index.php
--- 2.2.2.src/wp-admin/index.php	2007-04-05 22:33:21.000000000 -0500
+++ 2.5.src/wp-admin/index.php	2008-03-24 15:36:46.000000000 -0500
@@ -1,23 +1,33 @@
 <?php
-require_once('admin.php'); 
+
+require_once('admin.php');
+
+require_once(ABSPATH . 'wp-admin/includes/dashboard.php');
+
+wp_dashboard_setup();
 
 function index_js() {
 ?>
 <script type="text/javascript">
-Event.observe( window, 'load', dashboard_init, false );
-function dashboard_init() {
-	var update1 = new Ajax.Updater( 'incominglinks', 'index-extra.php?jax=incominglinks' );
-	var update2 = new Ajax.Updater( 'devnews', 'index-extra.php?jax=devnews' );
-	var update3 = new Ajax.Updater( 'planetnews', 'index-extra.php?jax=planetnews'	);
-}
+	jQuery(function() {
+		jQuery('#dashboard_incoming_links div.dashboard-widget-content').not( '.dashboard-widget-control' ).find( '.widget-loading' ).parent().load('index-extra.php?jax=incominglinks');
+		jQuery('#dashboard_primary div.dashboard-widget-content').not( '.dashboard-widget-control' ).find( '.widget-loading' ).parent().load('index-extra.php?jax=devnews');
+		jQuery('#dashboard_secondary div.dashboard-widget-content').not( '.dashboard-widget-control' ).find( '.widget-loading' ).parent().load('index-extra.php?jax=planetnews');
+		jQuery('#dashboard_plugins div.dashboard-widget-content').not( '.dashboard-widget-control' ).find( '.widget-loading' ).parent().load('index-extra.php?jax=plugins');
+	});
 </script>
 <?php
 }
 add_action( 'admin_head', 'index_js' );
-wp_enqueue_script('prototype');
-wp_enqueue_script('interface');
 
-$title = __('Dashboard'); 
+function index_css() {
+	wp_admin_css( 'css/dashboard' );
+}
+add_action( 'admin_head', 'index_css' );
+
+wp_enqueue_script( 'jquery' );
+
+$title = __('Dashboard');
 $parent_file = 'index.php';
 require_once('admin-header.php');
 
@@ -26,119 +36,94 @@
 
 <div class="wrap">
 
-<h2><?php _e('Welcome to WordPress'); ?></h2>
+<h2><?php _e('Dashboard'); ?></h2>
 
-<div id="zeitgeist">
-<h2><?php _e('Latest Activity'); ?></h2>
+<div id="rightnow">
+<h3 class="reallynow">
+	<span><?php _e('Right Now'); ?></span>
 
-<div id="incominglinks"></div>
+<?php if ( $can_edit_posts = current_user_can( 'edit_posts' ) ) : ?>
+	<a href="post-new.php" class="rbutton"><strong><?php _e('Write a New Post'); ?></strong></a>
+<?php endif; if ( $can_edit_pages = current_user_can( 'edit_pages' ) ) : ?>
+	<a href="page-new.php" class="rbutton"><?php _e('Write a New Page'); ?></a>
+<?php endif; ?>
+	<br class="clear" />
+</h3>
 
 <?php
-$comments = $wpdb->get_results("SELECT comment_author, comment_author_url, comment_ID, comment_post_ID FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 5");
-$numcomments = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = '0'");
+$num_posts = wp_count_posts( 'post' );
+$num_pages = wp_count_posts( 'page' );
 
-if ( $comments || $numcomments ) :
-?>
-<div>
-<h3><?php _e('Comments'); ?> <a href="edit-comments.php" title="<?php _e('More comments...'); ?>">&raquo;</a></h3>
+$num_cats  = wp_count_terms('category');
 
-<?php if ( $numcomments ) : ?>
-<p><strong><a href="moderation.php"><?php echo sprintf(__('Comments in moderation (%s)'), number_format($numcomments) ); ?> &raquo;</a></strong></p>
-<?php endif; ?>
+$num_tags = wp_count_terms('post_tag');
 
-<ul>
-<?php
-if ( $comments ) {
-foreach ($comments as $comment) {
-	echo '<li>' . sprintf(__('%1$s on %2$s'), get_comment_author_link(), '<a href="'. get_permalink($comment->comment_post_ID) . '#comment-' . $comment->comment_ID . '">' . apply_filters('the_title', get_the_title($comment->comment_post_ID)) . '</a>');
-	edit_comment_link(__("Edit"), ' <small>(', ')</small>');
-	echo '</li>';
+$post_type_texts = array();
+
+if ( !empty($num_posts->publish) ) { // with feeds, anyone can tell how many posts there are.  Just unlink if !current_user_can
+	$post_text = sprintf( __ngettext( '%s post', '%s posts', $num_posts->publish ), number_format_i18n( $num_posts->publish ) );
+	$post_type_texts[] = $can_edit_posts ? "<a href='edit.php'>$post_text</a>" : $post_text;
 }
+if ( $can_edit_pages && !empty($num_pages->publish) ) { // how many pages is not exposed in feeds.  Don't show if !current_user_can
+	$post_type_texts[] = '<a href="edit-pages.php">'.sprintf( __ngettext( '%s page', '%s pages', $num_pages->publish ), number_format_i18n( $num_pages->publish ) ).'</a>';
+}
+if ( $can_edit_posts && !empty($num_posts->draft) ) {
+	$post_type_texts[] = '<a href="edit.php?post_status=draft">'.sprintf( __ngettext( '%s draft', '%s drafts', $num_posts->draft ), number_format_i18n( $num_posts->draft ) ).'</a>';
+}
+if ( $can_edit_posts && !empty($num_posts->future) ) {
+	$post_type_texts[] = '<a href="edit.php?post_status=future">'.sprintf( __ngettext( '%s scheduled post', '%s scheduled posts', $num_posts->future ), number_format_i18n( $num_posts->future ) ).'</a>';
 }
-?>
-</ul>
-</div>
-<?php endif; ?>
 
-<?php
-if ( $recentposts = $wpdb->get_results("SELECT ID, post_title FROM $wpdb->posts WHERE post_type = 'post' AND " . get_private_posts_cap_sql('post') . " AND post_date_gmt < '$today' ORDER BY post_date DESC LIMIT 5") ) :
-?>
-<div>
-<h3><?php _e('Posts'); ?> <a href="edit.php" title="<?php _e('More posts...'); ?>">&raquo;</a></h3>
-<ul>
-<?php
-foreach ($recentposts as $post) {
-	if ($post->post_title == '')
-		$post->post_title = sprintf(__('Post #%s'), $post->ID);
-	echo "<li><a href='post.php?action=edit&amp;post=$post->ID'>";
-	the_title();
-	echo '</a></li>';
+if ( current_user_can('publish_posts') && !empty($num_posts->pending) ) {
+	$pending_text = sprintf( __ngettext( 'There is <a href="%1$s">%2$s post</a> pending your review.', 'There are <a href="%1$s">%2$s posts</a> pending your review.', $num_posts->pending ), 'edit.php?post_status=pending', number_format_i18n( $num_posts->pending ) );
+} else {
+	$pending_text = '';
 }
-?>
-</ul>
-</div>
-<?php endif; ?>
 
-<?php
-if ( $scheduled = $wpdb->get_results("SELECT ID, post_title, post_date_gmt FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'future' ORDER BY post_date ASC") ) :
-?>
-<div>
-<h3><?php _e('Scheduled Entries:') ?></h3>
-<ul>
-<?php
-foreach ($scheduled as $post) {
-	if ($post->post_title == '')
-		$post->post_title = sprintf(__('Post #%s'), $post->ID);
-	echo "<li>" . sprintf(__('%1$s in %2$s'), "<a href='post.php?action=edit&amp;post=$post->ID' title='" . __('Edit this post') . "'>$post->post_title</a>", human_time_diff( current_time('timestamp', 1), strtotime($post->post_date_gmt. ' GMT') ))  . "</li>";
+$cats_text = sprintf( __ngettext( '%s category', '%s categories', $num_cats ), number_format_i18n( $num_cats ) );
+$tags_text = sprintf( __ngettext( '%s tag', '%s tags', $num_tags ), number_format_i18n( $num_tags ) );
+if ( current_user_can( 'manage_categories' ) ) {
+	$cats_text = "<a href='categories.php'>$cats_text</a>";
+	$tags_text = "<a href='edit-tags.php'>$tags_text</a>";
 }
-?>
-</ul>
-</div>
-<?php endif; ?>
 
-<div>
-<h3><?php _e('Blog Stats'); ?></h3>
+$post_type_text = implode(', ', $post_type_texts);
+
+// There is always a category
+$sentence = sprintf( __( 'You have %1$s, contained within %2$s and %3$s. %4$s' ), $post_type_text, $cats_text, $tags_text, $pending_text );
+$sentence = apply_filters( 'dashboard_count_sentence', $sentence, $post_type_text, $cats_text, $tags_text, $pending_text );
+
+?>
+<p class="youhave"><?php echo $sentence; ?></p>
 <?php
-$numposts = (int) $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish'");
-$numcomms = (int) $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = '1'");
-$numcats  = (int) $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->categories");
-
-$post_str = sprintf(__ngettext('%1$s <a href="%2$s" title="Posts">post</a>', '%1$s <a href="%2$s" title="Posts">posts</a>', $numposts), number_format($numposts), 'edit.php');
-$comm_str = sprintf(__ngettext('%1$s <a href="%2$s" title="Comments">comment</a>', '%1$s <a href="%2$s" title="Comments">comments</a>', $numcomms), number_format($numcomms), 'edit-comments.php');
-$cat_str  = sprintf(__ngettext('%1$s <a href="%2$s" title="Categories">category</a>', '%1$s <a href="%2$s" title="Categories">categories</a>', $numcats), number_format($numcats), 'categories.php');
+$ct = current_theme_info();
+$sidebars_widgets = wp_get_sidebars_widgets();
+$num_widgets = array_reduce( $sidebars_widgets, create_function( '$prev, $curr', 'return $prev+count($curr);' ) );
+$widgets_text = sprintf( __ngettext( '%d widget', '%d widgets', $num_widgets ), $num_widgets );
+if ( $can_switch_themes = current_user_can( 'switch_themes' ) )
+	$widgets_text = "<a href='widgets.php'>$widgets_text</a>";
 ?>
+<p class="youare">
+	<?php printf( __( 'You are using %1$s theme with %2$s.' ), $ct->title, $widgets_text ); ?>
+	<?php if ( $can_switch_themes ) : ?>
+		<a href="themes.php" class="rbutton"><?php _e('Change Theme'); ?></a>
+	<?php endif; ?>
+	<?php update_right_now_message(); ?>
+</p>
 
-<p><?php printf(__('There are currently %1$s and %2$s, contained within %3$s.'), $post_str, $comm_str, $cat_str); ?></p>
-</div>
+<?php do_action( 'rightnow_end' ); ?>
+<?php do_action( 'activity_box_end' ); ?>
+</div><!-- rightnow -->
 
-<?php do_action('activity_box_end'); ?>
-</div>
+<br class="clear" />
 
-<p><?php _e('Use these links to get started:'); ?></p>
+<div id="dashboard-widgets-wrap">
 
-<ul>
-<?php if ( current_user_can('edit_posts') ) : ?>
-	<li><a href="post-new.php"><?php _e('Write a post'); ?></a></li>
-<?php endif; ?>
-	<li><a href="profile.php"><?php _e('Update your profile or change your password'); ?></a></li>
-<?php if ( current_user_can('manage_links') ) : ?>
-	<li><a href="link-add.php"><?php _e('Add a link to your blogroll'); ?></a></li>
-<?php endif; ?>
-<?php if ( current_user_can('switch_themes') ) : ?>
-	<li><a href="themes.php"><?php _e('Change your site&#8217;s look or theme'); ?></a></li>
-<?php endif; ?>
-</ul>
-<p><?php _e("Need help with WordPress? Please see our <a href='http://codex.wordpress.org/'>documentation</a> or visit the <a href='http://wordpress.org/support/'>support forums</a>."); ?></p>
+<?php wp_dashboard(); ?>
 
-<div id="devnews"></div>
 
-<div id="planetnews"></div>
+</div><!-- dashboard-widgets-wrap -->
 
-<div style="clear: both">&nbsp;
-<br clear="all" />
-</div>
-</div>
+</div><!-- wrap -->
 
-<?php
-require('./admin-footer.php');
-?>
+<?php require('./admin-footer.php'); ?>
diff -x .svn -aruN 2.2.2.src/wp-admin/install-helper.php 2.5.src/wp-admin/install-helper.php
--- 2.2.2.src/wp-admin/install-helper.php	2006-11-19 01:56:05.000000000 -0600
+++ 2.5.src/wp-admin/install-helper.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,152 +0,0 @@
-<?php
-require_once('../wp-config.php');
-$debug = 0;
-
-/**
- ** maybe_create_table()
- ** Create db table if it doesn't exist.
- ** Returns:  true if already exists or on successful completion
- **           false on error
- */
-function maybe_create_table($table_name, $create_ddl) {
-	global $wpdb;
-	foreach ($wpdb->get_col("SHOW TABLES",0) as $table ) {
-		if ($table == $table_name) {
-			return true;
-		}
-	}
-	//didn't find it try to create it.
-	$q = $wpdb->query($create_ddl);
-	// we cannot directly tell that whether this succeeded!
-	foreach ($wpdb->get_col("SHOW TABLES",0) as $table ) {
-		if ($table == $table_name) {
-			return true;
-		}
-	}
-	return false;
-}
-
-/**
- ** maybe_add_column()
- ** Add column to db table if it doesn't exist.
- ** Returns:  true if already exists or on successful completion
- **           false on error
- */
-function maybe_add_column($table_name, $column_name, $create_ddl) {
-	global $wpdb, $debug;
-	foreach ($wpdb->get_col("DESC $table_name",0) as $column ) {
-		if ($debug) echo("checking $column == $column_name<br />");
-			if ($column == $column_name) {
-				return true;
-			}
-	}
-	//didn't find it try to create it.
-	$q = $wpdb->query($create_ddl);
-	// we cannot directly tell that whether this succeeded!
-	foreach ($wpdb->get_col("DESC $table_name",0) as $column ) {
-		if ($column == $column_name) {
-			return true;
-		}
-	}
-	return false;
-}
-
-
-/**
- ** maybe_drop_column()
- ** Drop column from db table if it exists.
- ** Returns:  true if it doesn't already exist or on successful drop
- **           false on error
- */
-function maybe_drop_column($table_name, $column_name, $drop_ddl) {
-	global $wpdb;
-	foreach ($wpdb->get_col("DESC $table_name",0) as $column ) {
-		if ($column == $column_name) {
-			//found it try to drop it.
-			$q = $wpdb->query($drop_ddl);
-			// we cannot directly tell that whether this succeeded!
-			foreach ($wpdb->get_col("DESC $table_name",0) as $column ) {
-				if ($column == $column_name) {
-					return false;
-				}
-			}
-		}
-	}
-	// else didn't find it
-	return true;
-}
-
-
-/**
- ** check_column()
- ** Check column matches passed in criteria.
- ** Pass in null to skip checking that criteria
- ** Returns:  true if it matches
- **           false otherwise
- ** (case sensitive) Column names returned from DESC table are:
- **      Field
- **      Type
- **      Null
- **      Key
- **      Default
- **      Extra
- */
-function check_column($table_name, $col_name, $col_type, $is_null = null, $key = null, $default = null, $extra = null) {
-	global $wpdb, $debug;
-	$diffs = 0;
-	$results = $wpdb->get_results("DESC $table_name");
-
-	foreach ($results as $row ) {
-		if ($debug > 1) print_r($row);
-			if ($row->Field == $col_name) {
-				// got our column, check the params
-				if ($debug) echo ("checking $row->Type against $col_type\n");
-				if (($col_type != null) && ($row->Type != $col_type)) {
-					++$diffs;
-				}
-				if (($is_null != null) && ($row->Null != $is_null)) {
-					++$diffs;
-				}
-				if (($key != null) && ($row->Key  != $key)) {
-					++$diffs;
-				}
-				if (($default != null) && ($row->Default != $default)) {
-					++$diffs;
-				}
-				if (($extra != null) && ($row->Extra != $extra)) {
-					++$diffs;
-				}
-				if ($diffs > 0) {
-					if ($debug) echo ("diffs = $diffs returning false\n");
-					return false;
-				}
-				return true;
-			} // end if found our column
-	}
-	return false;
-}
-
-/*
-echo "<p>testing</p>";
-echo "<pre>";
-
-//check_column('wp_links', 'link_description', 'mediumtext');
-//if (check_column($wpdb->comments, 'comment_author', 'tinytext'))
-//    echo "ok\n";
-$error_count = 0;
-$tablename = $wpdb->links;
-// check the column
-if (!check_column($wpdb->links, 'link_description', 'varchar(255)'))
-{
-	$ddl = "ALTER TABLE $wpdb->links MODIFY COLUMN link_description varchar(255) NOT NULL DEFAULT '' ";
-	$q = $wpdb->query($ddl);
-}
-if (check_column($wpdb->links, 'link_description', 'varchar(255)')) {
-	$res .= $tablename . ' - ok <br />';
-} else {
-	$res .= 'There was a problem with ' . $tablename . '<br />';
-	++$error_count;
-}
-echo "</pre>";
-*/
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/install-rtl.css 2.5.src/wp-admin/install-rtl.css
--- 2.2.2.src/wp-admin/install-rtl.css	2006-10-25 16:34:42.000000000 -0500
+++ 2.5.src/wp-admin/install-rtl.css	1969-12-31 18:00:00.000000000 -0600
@@ -1,5 +0,0 @@
-body { font-family: Tahoma, Georgia, "Times New Roman", Times, serif; }
-
-ul, ol { padding: 5px 20px 5px 5px; }
-
-.step, th { text-align: left; }
diff -x .svn -aruN 2.2.2.src/wp-admin/install.css 2.5.src/wp-admin/install.css
--- 2.2.2.src/wp-admin/install.css	2006-10-25 16:34:42.000000000 -0500
+++ 2.5.src/wp-admin/install.css	1969-12-31 18:00:00.000000000 -0600
@@ -1,40 +0,0 @@
-html { background: #eee; }
-
-body {
-	background: #fff;
-	color: #000;
-	font-family: Georgia, "Times New Roman", Times, serif;
-	margin-left: 20%;
-	margin-right: 20%;
-	padding: .2em 2em;
-}
-
-h1 {
-	color: #006;
-	font-size: 18px;
-	font-weight: lighter;
-}
-
-h2 { font-size: 16px; }
-
-p, li, dt {
-	line-height: 140%;
-	padding-bottom: 2px;
-}
-
-ul, ol { padding: 5px 5px 5px 20px; }
-
-#logo { margin-bottom: 2em; }
-
-.step a, .step input { font-size: 2em; }
-
-td input { font-size: 1.5em; }
-
-.step, th { text-align: right; }
-
-#footer {
-	text-align: center; 
-	border-top: 1px solid #ccc; 
-	padding-top: 1em; 
-	font-style: italic;
-}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/install.php 2.5.src/wp-admin/install.php
--- 2.2.2.src/wp-admin/install.php	2007-06-15 12:45:21.000000000 -0500
+++ 2.5.src/wp-admin/install.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,110 +0,0 @@
-<?php
-define('WP_INSTALLING', true);
-if (!file_exists('../wp-config.php')) {
-  require_once('../wp-includes/functions.php');
-  wp_die("There doesn't seem to be a <code>wp-config.php</code> file. I need this before we can get started. Need more help? <a href='http://codex.wordpress.org/Editing_wp-config.php'>We got it</a>. You can <a href='setup-config.php'>create a <code>wp-config.php</code> file through a web interface</a>, but this doesn't work for all server setups. The safest way is to manually create the file.", "WordPress &rsaquo; Error");
-}
-
-require_once('../wp-config.php');
-require_once('./upgrade-functions.php');
-
-if (isset($_GET['step']))
-	$step = $_GET['step'];
-else
-	$step = 0;
-header( 'Content-Type: text/html; charset=utf-8' );
-?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>>
-<head>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-	<title><?php _e('WordPress &rsaquo; Installation'); ?></title>
-	<link rel="stylesheet" href="install.css?version=<?php bloginfo('version'); ?>" type="text/css" />
-	<?php if ( ('rtl' == $wp_locale->text_direction) ) : ?>
-	<link rel="stylesheet" href="install-rtl.css?version=<?php bloginfo('version'); ?>" type="text/css" />
-	<?php endif; ?>
-</head>
-<body>
-<h1 id="logo"><img alt="WordPress" src="images/wordpress-logo.png" /></h1>
-<?php
-// Let's check to make sure WP isn't already installed.
-if ( is_blog_installed() ) die('<h1>'.__('Already Installed').'</h1><p>'.__('You appear to have already installed WordPress. To reinstall please clear your old database tables first.').'</p></body></html>');
-
-switch($step) {
-	case 0:
-?>
-<p><?php printf(__('Welcome to WordPress installation. We&#8217;re now going to go through a few steps to get you up and running with the latest in personal publishing platforms. You may want to peruse the <a href="%s">ReadMe documentation</a> at your leisure.'), '../readme.html'); ?></p>
-<h2 class="step"><a href="install.php?step=1"><?php _e('First Step &raquo;'); ?></a></h2>
-<?php
-		break;
-	case 1:
-?>
-<h1><?php _e('First Step'); ?></h1>
-<p><?php _e("Before we begin we need a little bit of information. Don't worry, you can always change these later."); ?></p>
-
-<form id="setup" method="post" action="install.php?step=2">
-	<table width="100%">
-		<tr>
-			<th width="33%"><?php _e('Weblog title:'); ?></th>
-			<td><input name="weblog_title" type="text" id="weblog_title" size="25" /></td>
-		</tr>
-		<tr>
-			<th><?php _e('Your e-mail:'); ?></th>
-			<td><input name="admin_email" type="text" id="admin_email" size="25" /></td>
-		</tr>
-		<tr>
-			<th scope="row"  valign="top"> <?php __('Privacy:'); ?></th>
-			<td><label><input type="checkbox" name="blog_public" value="1" checked="checked" /> <?php _e('I would like my blog to appear in search engines like Google and Technorati.'); ?></label></td>
-		</tr>
-	</table>
-	<p><em><?php _e('Double-check that email address before continuing.'); ?></em></p>
-	<h2 class="step"><input type="submit" name="Submit" value="<?php _e('Continue to Second Step &raquo;'); ?>" /></h2>
-</form>
-
-<?php
-		break;
-	case 2:
-		// Fill in the data we gathered
-		$weblog_title = stripslashes($_POST['weblog_title']);
-		$admin_email = stripslashes($_POST['admin_email']);
-		$public = (int) $_POST['blog_public'];
-		// check e-mail address
-		if (empty($admin_email)) {
-			die(__("<strong>ERROR</strong>: please type your e-mail address"));
-		} else if (!is_email($admin_email)) {
-			die(__("<strong>ERROR</strong>: the e-mail address isn't correct"));
-		}
-
-?>
-<h1><?php _e('Second Step'); ?></h1>
-<p><?php _e('Now we&#8217;re going to create the database tables and fill them with some default data.'); ?></p>
-
-
-<?php
-	$result = wp_install($weblog_title, 'admin', $admin_email, $public);
-	extract($result, EXTR_SKIP);
-?>
-
-<p><em><?php _e('Finished!'); ?></em></p>
-
-<p><?php printf(__('Now you can <a href="%1$s">log in</a> with the <strong>username</strong> "<code>admin</code>" and <strong>password</strong> "<code>%2$s</code>".'), '../wp-login.php', $password); ?></p>
-<p><?php _e('<strong><em>Note that password</em></strong> carefully! It is a <em>random</em> password that was generated just for you. If you lose it, you will have to delete the tables from the database yourself, and re-install WordPress. So to review:'); ?></p>
-
-<dl>
-	<dt><?php _e('Username'); ?></dt>
-		<dd><code>admin</code></dd>
-	<dt><?php _e('Password'); ?></dt>
-		<dd><code><?php echo $password; ?></code></dd>
-	<dt><?php _e('Login address'); ?></dt>
-		<dd><a href="../wp-login.php">wp-login.php</a></dd>
-</dl>
-<p><?php _e('Were you expecting more steps? Sorry to disappoint. All done! :)'); ?></p>
-
-<?php
-		break;
-}
-?>
-
-<p id="footer"><?php _e('<a href="http://wordpress.org/">WordPress</a>, personal publishing platform.'); ?></p>
-</body>
-</html>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/js/cat.js 2.5.src/wp-admin/js/cat.js
--- 2.2.2.src/wp-admin/js/cat.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/js/cat.js	2007-11-01 01:23:16.000000000 -0500
@@ -0,0 +1,5 @@
+jQuery( function($) {
+	var myConfirm = function() { return '' !== $('#newcat').val(); };
+	$('#jaxcat').prepend('<span id="ajaxcat"><input type="text" name="newcat" id="newcat" size="16" autocomplete="off"/><input type="button" name="Button" class="add:categorychecklist:jaxcat" id="catadd" value="' + catL10n.add + '"/><input type="hidden"/><input type="hidden"/><span id="howto">' + catL10n.how + '</span></span><span id="cat-ajax-response"></span>')
+	$('#categorychecklist').wpList( { alt: '', response: 'cat-ajax-response', confirm: myConfirm } );
+} );
diff -x .svn -aruN 2.2.2.src/wp-admin/js/categories.js 2.5.src/wp-admin/js/categories.js
--- 2.2.2.src/wp-admin/js/categories.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/js/categories.js	2008-03-02 15:34:25.000000000 -0600
@@ -0,0 +1,23 @@
+jQuery(function($) {
+	var options = false
+	if ( document.forms['addcat'].category_parent )
+		options = document.forms['addcat'].category_parent.options;
+
+	var addAfter = function( r, settings ) {
+		var name = $("<span>" + $('name', r).text() + "</span>").html();
+		var id = $('cat', r).attr('id');
+		options[options.length] = new Option(name, id);
+	}
+
+	var delAfter = function( r, settings ) {
+		var id = $('cat', r).attr('id');
+		for ( var o = 0; o < options.length; o++ )
+			if ( id == options[o].value )
+				options[o] = null;
+	}
+
+	if ( options )
+		$('#the-list').wpList( { addAfter: addAfter, delAfter: delAfter } );
+	else
+		$('#the-list').wpList();
+});
diff -x .svn -aruN 2.2.2.src/wp-admin/js/comment.js 2.5.src/wp-admin/js/comment.js
--- 2.2.2.src/wp-admin/js/comment.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/js/comment.js	2008-03-26 15:06:18.000000000 -0500
@@ -0,0 +1,26 @@
+jQuery(document).ready( function() {
+	add_postbox_toggles('comment');
+
+	// close postboxes that should be closed
+	jQuery('.if-js-closed').removeClass('if-js-closed').addClass('closed');
+
+	// show things that should be visible, hide what should be hidden
+	jQuery('.hide-if-no-js').show();
+	jQuery('.hide-if-js').hide();
+
+	jQuery('.edit-timestamp').click(function () {
+		if (jQuery('#timestampdiv').is(":hidden")) {
+			jQuery('#timestampdiv').slideDown("normal");
+			jQuery('.edit-timestamp').text(commentL10n.cancel);
+		} else {
+			jQuery('#timestampdiv').hide();
+			jQuery('#mm').val(jQuery('#hidden_mm').val());
+			jQuery('#jj').val(jQuery('#hidden_jj').val());
+			jQuery('#aa').val(jQuery('#hidden_aa').val());
+			jQuery('#hh').val(jQuery('#hidden_hh').val());
+			jQuery('#mn').val(jQuery('#hidden_mn').val());
+			jQuery('.edit-timestamp').text(commentL10n.edit);
+		}
+		return false;
+    });
+});
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/js/common.js 2.5.src/wp-admin/js/common.js
--- 2.2.2.src/wp-admin/js/common.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/js/common.js	2008-03-18 14:20:18.000000000 -0500
@@ -0,0 +1,45 @@
+jQuery(document).ready( function() {
+	// pulse
+	jQuery('.fade').animate( { backgroundColor: '#ffffe0' }, 300).animate( { backgroundColor: '#fffbcc' }, 300).animate( { backgroundColor: '#ffffe0' }, 300).animate( { backgroundColor: '#fffbcc' }, 300);
+
+	// Reveal
+	jQuery('.wp-no-js-hidden').removeClass( 'wp-no-js-hidden' );
+
+	// Basic form validation
+	if ( ( 'undefined' != typeof wpAjax ) && jQuery.isFunction( wpAjax.validateForm ) ) {
+		jQuery('form.validate').submit( function() { return wpAjax.validateForm( jQuery(this) ); } );
+	}
+});
+
+(function(JQ) {
+	JQ.fn.tTips = function() {
+
+		JQ('body').append('<div id="tTips"><p id="tTips_inside"></p></div>');
+		var TT = JQ('#tTips');
+
+		this.each(function() {
+			var el = JQ(this), txt;
+			
+			if ( txt = el.attr('title') ) el.attr('tip', txt).removeAttr('title');
+			else return;
+			el.find('img').removeAttr('alt');
+
+			el.mouseover(function(e) {
+				txt = el.attr('tip'), o = el.offset();;
+
+				clearTimeout(TT.sD);
+				TT.find('p').html(txt);
+
+				TT.css({'top': o.top - 43, 'left': o.left - 5});
+				TT.sD = setTimeout(function(){TT.fadeIn(150);}, 100);
+			});
+
+			el.mouseout(function() {
+				clearTimeout(TT.sD);
+				TT.css({display : 'none'});
+			})
+		});
+	}
+}(jQuery));
+
+jQuery(function(){jQuery('#media-buttons a').tTips();});
diff -x .svn -aruN 2.2.2.src/wp-admin/js/custom-fields.js 2.5.src/wp-admin/js/custom-fields.js
--- 2.2.2.src/wp-admin/js/custom-fields.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/js/custom-fields.js	2008-03-02 15:34:25.000000000 -0600
@@ -0,0 +1,33 @@
+jQuery( function($) {
+	var before = function() {
+		var nonce = $('#newmeta [@name=_ajax_nonce]').val();
+		var postId = $('#post_ID').val();
+		if ( !nonce || !postId ) { return false; }
+		return [nonce,postId];
+	}
+
+	var addBefore = function( s ) {
+		var b = before();
+		if ( !b ) { return false; }
+		s.data = s.data.replace(/_ajax_nonce=[a-f0-9]+/, '_ajax_nonce=' + b[0]) + '&post_id=' + b[1];
+		return s;
+	};
+
+	var addAfter = function( r, s ) {
+		var postId = $('postid', r).text();
+		if ( !postId ) { return; }
+		$('#post_ID').attr( 'name', 'post_ID' ).val( postId );
+		var h = $('#hiddenaction');
+		if ( 'post' == h.val() ) { h.val( 'postajaxpost' ); }
+	};
+
+	var delBefore = function( s ) {
+		var b = before(); if ( !b ) return false;
+		s.data._ajax_nonce = b[0]; s.data.post_id = b[1];
+		return s;
+	}
+
+	$('#the-list')
+		.wpList( { addBefore: addBefore, addAfter: addAfter, delBefore: delBefore } )
+		.find('.updatemeta, .deletemeta').attr( 'type', 'button' );
+} );
diff -x .svn -aruN 2.2.2.src/wp-admin/js/edit-comments.js 2.5.src/wp-admin/js/edit-comments.js
--- 2.2.2.src/wp-admin/js/edit-comments.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/js/edit-comments.js	2008-03-21 16:57:25.000000000 -0500
@@ -0,0 +1,70 @@
+var theList; var theExtraList;
+jQuery(function($) {
+
+var dimAfter = function( r, settings ) {
+	$('li span.comment-count').each( function() {
+		var a = $(this);
+		var n = parseInt(a.html(),10);
+		n = n + ( $('#' + settings.element).is('.' + settings.dimClass) ? 1 : -1 );
+		if ( n < 0 ) { n = 0; }
+		a.html( n.toString() );
+		$('#awaiting-mod')[ 0 == n ? 'addClass' : 'removeClass' ]('count-0');
+	});
+	$('.post-com-count span.comment-count').each( function() {
+		var a = $(this);
+		var n = parseInt(a.html(),10);
+		var t = parseInt(a.parent().attr('title'), 10);
+		if ( $('#' + settings.element).is('.unapproved') ) { // we unapproved a formerly approved comment
+			n = n - 1;
+			t = t + 1;
+		} else { // we approved a formerly unapproved comment
+			n = n + 1;
+			t = t - 1;
+		}
+		if ( n < 0 ) { n = 0; }
+		if ( t < 0 ) { t = 0; }
+		if ( t >= 0 ) { a.parent().attr('title', adminCommentsL10n.pending.replace( /%i%/, t.toString() ) ); }
+		if ( 0 === t ) { a.parents('strong:first').replaceWith( a.parents('strong:first').html() ); }
+		a.html( n.toString() );
+	});
+}
+
+var delAfter = function( r, settings ) {
+	$('li span.comment-count').each( function() {
+		var a = $(this);
+		var n = parseInt(a.html(),10);
+		if ( $('#' + settings.element).is('.unapproved') ) { // we deleted a formerly unapproved comment
+			n = n - 1;
+		} else if ( $(settings.target).parents( 'span.unapprove' ).size() ) { // we "deleted" an approved comment from the approved list by clicking "Unapprove"
+			n = n + 1;
+		}
+		if ( n < 0 ) { n = 0; }
+		a.html( n.toString() );
+		$('#awaiting-mod')[ 0 == n ? 'addClass' : 'removeClass' ]('count-0');
+	});
+	$('.post-com-count span.comment-count').each( function() {
+		var a = $(this);
+		if ( $('#' + settings.element).is('.unapproved') ) { // we deleted a formerly unapproved comment
+			var t = parseInt(a.parent().attr('title'), 10);
+			if ( t < 1 ) { return; }
+			t = t - 1;
+			a.parent().attr('title', adminCommentsL10n.pending.replace( /%i%/, t.toString() ) );
+			if ( 0 === t ) { a.parents('strong:first').replaceWith( a.parents('strong:first').html() ); }
+			return;
+		}
+		var n = parseInt(a.html(),10) - 1;
+		a.html( n.toString() );
+	});
+
+	if ( theExtraList.size() == 0 || theExtraList.children().size() == 0 ) {
+		return;
+	}
+
+	theList.get(0).wpList.add( theExtraList.children(':eq(0)').remove().clone() );
+	$('#get-extra-comments').submit();
+}
+
+theExtraList = $('#the-extra-comment-list').wpList( { alt: '', delColor: 'none', addColor: 'none' } );
+theList = $('#the-comment-list').wpList( { alt: '', dimAfter: dimAfter, delAfter: delAfter, addColor: 'none' } );
+
+} );
diff -x .svn -aruN 2.2.2.src/wp-admin/js/editor.js 2.5.src/wp-admin/js/editor.js
--- 2.2.2.src/wp-admin/js/editor.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/js/editor.js	2008-03-25 22:22:53.000000000 -0500
@@ -0,0 +1,162 @@
+wpEditorInit = function() {
+    // Activate tinyMCE if it's the user's default editor
+    if ( ( 'undefined' == typeof wpTinyMCEConfig ) || 'tinymce' == wpTinyMCEConfig.defaultEditor ) {
+        document.getElementById('editorcontainer').style.padding = '0px';
+        tinyMCE.execCommand("mceAddControl", false, "content");
+	} else {
+        var H;
+        if ( H = tinymce.util.Cookie.getHash("TinyMCE_content_size") )
+            document.getElementById('content').style.height = H.ch - 30 + 'px';
+    }
+};
+
+switchEditors = {
+
+    saveCallback : function(el, content, body) {
+    
+        document.getElementById(el).style.color = '#fff';
+        if ( tinyMCE.activeEditor.isHidden() ) 
+            content = document.getElementById(el).value;
+        else
+            content = this.pre_wpautop(content);
+
+        return content;
+    },
+
+    pre_wpautop : function(content) {
+        // We have a TON of cleanup to do. Line breaks are already stripped.
+
+        // Pretty it up for the source editor
+        var blocklist1 = 'blockquote|ul|ol|li|table|thead|tbody|tr|th|td|div|h[1-6]|pre|p';
+        content = content.replace(new RegExp('\\s*</('+blocklist1+')>\\s*', 'mg'), '</$1>\n');
+        content = content.replace(new RegExp('\\s*<(('+blocklist1+')[^>]*)>', 'mg'), '\n<$1>');
+
+        // Mark </p> if it has any attributes.
+        content = content.replace(new RegExp('(<p [^>]+>.*?)</p>', 'mg'), '$1</p#>');
+
+        // Sepatate <div> containing <p>
+        content = content.replace(new RegExp('<div([^>]*)>\\s*<p>', 'mgi'), '<div$1>\n\n');
+
+        // Remove <p> and <br />
+        content = content.replace(new RegExp('\\s*<p>', 'mgi'), '');
+        content = content.replace(new RegExp('\\s*</p>\\s*', 'mgi'), '\n\n');
+        content = content.replace(new RegExp('\\n\\s*\\n', 'mgi'), '\n\n');
+        content = content.replace(new RegExp('\\s*<br ?/?>\\s*', 'gi'), '\n');
+
+        // Fix some block element newline issues
+        content = content.replace(new RegExp('\\s*<div', 'mg'), '\n<div');
+        content = content.replace(new RegExp('</div>\\s*', 'mg'), '</div>\n');
+        
+        var blocklist2 = 'blockquote|ul|ol|li|table|thead|tr|th|td|h[1-6]|pre';
+        content = content.replace(new RegExp('\\s*<(('+blocklist2+') ?[^>]*)\\s*>', 'mg'), '\n<$1>');
+        content = content.replace(new RegExp('\\s*</('+blocklist2+')>\\s*', 'mg'), '</$1>\n');
+        content = content.replace(new RegExp('<li([^>]*)>', 'g'), '\t<li$1>');
+
+        if ( content.indexOf('<object') != -1 ) {
+            content = content.replace(new RegExp('\\s*<param([^>]*)>\\s*', 'mg'), "<param$1>");
+            content = content.replace(new RegExp('\\s*</embed>\\s*', 'mg'), '</embed>');
+        }
+
+        // Unmark special paragraph closing tags
+        content = content.replace(new RegExp('</p#>', 'g'), '</p>\n');
+        content = content.replace(new RegExp('\\s*(<p [^>]+>.*</p>)', 'mg'), '\n$1');
+
+        // Trim whitespace
+        content = content.replace(new RegExp('^\\s*', ''), '');
+        content = content.replace(new RegExp('\\s*$', ''), '');
+
+        // Hope.
+        return content;
+    },
+
+    go : function(id) {
+        var ed = tinyMCE.get(id);
+        var qt = document.getElementById('quicktags');
+        var H = document.getElementById('edButtonHTML');
+        var P = document.getElementById('edButtonPreview');
+        var ta = document.getElementById(id);
+        var ec = document.getElementById('editorcontainer');
+
+        if ( ! ed || ed.isHidden() ) {
+            ta.style.color = '#fff';
+
+            this.edToggle(P, H);
+            edCloseAllTags(); // :-(
+
+            qt.style.display = 'none';
+            ec.style.padding = '0px';
+            ta.style.padding = '0px';
+
+            ta.value = this.wpautop(ta.value);
+
+            if ( ed ) ed.show();
+            else tinyMCE.execCommand("mceAddControl", false, id);
+
+            this.wpSetDefaultEditor('tinymce');
+        } else {
+            this.edToggle(H, P);
+            ta.style.height = ed.getContentAreaContainer().offsetHeight + 6 + 'px';
+
+            ed.hide();
+            qt.style.display = 'block';
+
+            if ( tinymce.isIE6 ) {
+				ta.style.width = '98%';
+				ec.style.padding = '0px';
+				ta.style.padding = '6px';
+			} else {
+				ta.style.width = '100%';
+				ec.style.padding = '6px';
+            }
+
+			ta.style.color = '';
+            this.wpSetDefaultEditor('html');
+        }
+    },
+
+    edToggle : function(A, B) {
+        A.className = 'active';
+        B.className = '';
+
+        B.onclick = A.onclick;
+        A.onclick = null;
+    },
+
+    wpSetDefaultEditor : function(editor) {
+        try {
+            editor = escape( editor.toString() );
+        } catch(err) {
+            editor = 'tinymce';
+        }
+
+        var userID = document.getElementById('user-id');
+        var date = new Date();
+        date.setTime(date.getTime()+(10*365*24*60*60*1000));
+        document.cookie = "wordpress_editor_" + userID.value + "=" + editor + "; expires=" + date.toGMTString();
+    },
+
+    wpautop : function(pee) {
+        var blocklist = 'table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6]';
+
+        pee = pee + "\n\n";
+        pee = pee.replace(new RegExp('<br />\\s*<br />', 'gi'), "\n\n");
+        pee = pee.replace(new RegExp('(<(?:'+blocklist+')[^>]*>)', 'gi'), "\n$1");
+        pee = pee.replace(new RegExp('(</(?:'+blocklist+')>)', 'gi'), "$1\n\n");
+        pee = pee.replace(new RegExp("\\r\\n|\\r", 'g'), "\n");
+        pee = pee.replace(new RegExp("\\n\\s*\\n+", 'g'), "\n\n");
+        pee = pee.replace(new RegExp('([\\s\\S]+?)\\n\\n', 'mg'), "<p>$1</p>\n");
+        pee = pee.replace(new RegExp('<p>\\s*?</p>', 'gi'), '');
+        pee = pee.replace(new RegExp('<p>\\s*(</?(?:'+blocklist+')[^>]*>)\\s*</p>', 'gi'), "$1");
+        pee = pee.replace(new RegExp("<p>(<li.+?)</p>", 'gi'), "$1");
+        pee = pee.replace(new RegExp('<p><blockquote([^>]*)>', 'gi'), "<blockquote$1><p>");
+        pee = pee.replace(new RegExp('</blockquote></p>', 'gi'), '</p></blockquote>');
+        pee = pee.replace(new RegExp('<p>\\s*(</?(?:'+blocklist+')[^>]*>)', 'gi'), "$1");
+        pee = pee.replace(new RegExp('(</?(?:'+blocklist+')[^>]*>)\\s*</p>', 'gi'), "$1");
+        pee = pee.replace(new RegExp('\\s*\\n', 'gi'), "<br />\n");
+        pee = pee.replace(new RegExp('(</?(?:'+blocklist+')[^>]*>)\\s*<br />', 'gi'), "$1");
+        pee = pee.replace(new RegExp('<br />(\\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)>)', 'gi'), '$1');
+        pee = pee.replace(new RegExp('^((?:&nbsp;)*)\\s', 'mg'), '$1&nbsp;');
+        //pee = pee.replace(new RegExp('(<pre.*?>)(.*?)</pre>!ise', " stripslashes('$1') .  stripslashes(clean_pre('$2'))  . '</pre>' "); // Hmm...
+        return pee;
+    }
+}
diff -x .svn -aruN 2.2.2.src/wp-admin/js/forms.js 2.5.src/wp-admin/js/forms.js
--- 2.2.2.src/wp-admin/js/forms.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/js/forms.js	2008-03-17 21:04:54.000000000 -0500
@@ -0,0 +1,31 @@
+function checkAll(form) {
+	for (i = 0, n = form.elements.length; i < n; i++) {
+		if(form.elements[i].type == "checkbox" && !(form.elements[i].getAttribute('onclick',2))) {
+			if(form.elements[i].checked == true)
+				form.elements[i].checked = false;
+			else
+				form.elements[i].checked = true;
+		}
+	}
+}
+
+function getNumChecked(form) {
+	var num = 0;
+	for (i = 0, n = form.elements.length; i < n; i++) {
+		if (form.elements[i].type == "checkbox") {
+			if (form.elements[i].checked == true)
+				num++;
+		}
+	}
+	return num;
+}
+
+function checkAllUsers(role) {
+ var checkboxs = document.getElementsByTagName('input');
+ for(var i = 0, inp; inp = checkboxs[i]; i++)
+ 	if(inp.type.toLowerCase() == 'checkbox' && inp.className == role)
+		if(inp.checked == false)
+			inp.checked = true;
+		else
+			inp.checked = false;
+}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/js/link.js 2.5.src/wp-admin/js/link.js
--- 2.2.2.src/wp-admin/js/link.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/js/link.js	2008-03-15 17:57:47.000000000 -0500
@@ -0,0 +1,48 @@
+jQuery(document).ready( function() {
+	jQuery('#link_name').focus();
+	// postboxes
+	add_postbox_toggles('link');
+
+	// category tabs
+	var categoryTabs = jQuery('#category-tabs').tabs();
+
+	// Ajax Cat
+	var newCat = jQuery('#newcat').one( 'focus', function() { jQuery(this).val( '' ).removeClass( 'form-input-tip' ) } );
+	jQuery('#category-add-sumbit').click( function() { newCat.focus(); } );
+	var noSyncChecks = false; // prophylactic. necessary?
+	var syncChecks = function() {
+		if ( noSyncChecks )
+			return;
+		noSyncChecks = true;
+		var th = jQuery(this);
+		var c = th.is(':checked');
+		var id = th.val().toString();
+		jQuery('#in-category-' + id + ', #in-popular-category-' + id).attr( 'checked', c );
+		noSyncChecks = false;
+	};
+	var catAddAfter = function( r, s ) {
+		jQuery(s.what + ' response_data', r).each( function() {
+			var t = jQuery(jQuery(this).text());
+			t.find( 'label' ).each( function() {
+				var th = jQuery(this);
+				var val = th.find('input').val();
+				var id = th.find('input')[0].id
+				jQuery('#' + id).change( syncChecks );
+				var name = jQuery.trim( th.text() );
+				var o = jQuery( '<option value="' +  parseInt( val, 10 ) + '"></option>' ).text( name );
+			} );
+		} );
+	};
+	jQuery('#categorychecklist').wpList( {
+		alt: '',
+		what: 'link-category',
+		response: 'category-ajax-response',
+		addAfter: catAddAfter
+	} );
+	jQuery('#category-add-toggle').click( function() {
+		jQuery(this).parents('div:first').toggleClass( 'wp-hidden-children' );
+		categoryTabs.tabsClick( 1 );
+		return false;
+	} );
+	jQuery('.categorychecklist :checkbox').change( syncChecks ).filter( ':checked' ).change();
+});
diff -x .svn -aruN 2.2.2.src/wp-admin/js/media-upload.js 2.5.src/wp-admin/js/media-upload.js
--- 2.2.2.src/wp-admin/js/media-upload.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/js/media-upload.js	2008-03-06 13:48:54.000000000 -0600
@@ -0,0 +1,12 @@
+// send html to the post editor
+function send_to_editor(h) {
+	var win = window.opener ? window.opener : window.dialogArguments;
+	if ( !win )
+		win = top;
+	tinyMCE = win.tinyMCE;
+	if ( typeof tinyMCE != 'undefined' && ( ed = tinyMCE.getInstanceById('content') ) && !ed.isHidden() ) {
+		tinyMCE.selectedInstance.getWin().focus();
+		tinyMCE.execCommand('mceInsertContent', false, h);
+	} else
+		win.edInsertContent(win.edCanvas, h);
+}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/js/page.js 2.5.src/wp-admin/js/page.js
--- 2.2.2.src/wp-admin/js/page.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/js/page.js	2008-03-26 15:06:18.000000000 -0500
@@ -0,0 +1,32 @@
+jQuery(document).ready( function() {
+	add_postbox_toggles('page');
+	make_slugedit_clickable();
+
+	// close postboxes that should be closed
+	jQuery('.if-js-closed').removeClass('if-js-closed').addClass('closed');
+
+	// show things that should be visible, hide what should be hidden
+	jQuery('.hide-if-no-js').show();
+	jQuery('.hide-if-js').hide();
+
+	jQuery('#title').blur( function() { if ( (jQuery("#post_ID").val() > 0) || (jQuery("#title").val().length == 0) ) return; autosave(); } );
+
+	// hide advanced slug field
+	jQuery('#pageslugdiv').hide();
+
+	jQuery('.edit-timestamp').click(function () {
+		if (jQuery('#timestampdiv').is(":hidden")) {
+			jQuery('#timestampdiv').slideDown("normal");
+			jQuery('.edit-timestamp').text(postL10n.cancel);
+		} else {
+			jQuery('#timestampdiv').hide();
+			jQuery('#mm').val(jQuery('#hidden_mm').val());
+			jQuery('#jj').val(jQuery('#hidden_jj').val());
+			jQuery('#aa').val(jQuery('#hidden_aa').val());
+			jQuery('#hh').val(jQuery('#hidden_hh').val());
+			jQuery('#mn').val(jQuery('#hidden_mn').val());
+			jQuery('.edit-timestamp').text(postL10n.edit);
+		}
+		return false;
+    });
+});
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/js/password-strength-meter.js 2.5.src/wp-admin/js/password-strength-meter.js
--- 2.2.2.src/wp-admin/js/password-strength-meter.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/js/password-strength-meter.js	2008-03-14 15:17:17.000000000 -0500
@@ -0,0 +1,80 @@
+// Password strength meter
+// This jQuery plugin is written by firas kassem [2007.04.05]
+// Firas Kassem  phiras.wordpress.com || phiras at gmail {dot} com
+// for more information : http://phiras.wordpress.com/2007/04/08/password-strength-meter-a-jquery-plugin/
+
+var shortPass = pwsL10n.short
+var badPass = pwsL10n.bad
+var goodPass = pwsL10n.good
+var strongPass = pwsL10n.strong
+
+
+function passwordStrength(password,username) {
+    score = 0
+
+    //password < 4
+    if (password.length < 4 ) { return shortPass }
+
+    //password == username
+    if (password.toLowerCase()==username.toLowerCase()) return badPass
+
+    //password length
+    score += password.length * 4
+    score += ( checkRepetition(1,password).length - password.length ) * 1
+    score += ( checkRepetition(2,password).length - password.length ) * 1
+    score += ( checkRepetition(3,password).length - password.length ) * 1
+    score += ( checkRepetition(4,password).length - password.length ) * 1
+
+    //password has 3 numbers
+    if (password.match(/(.*[0-9].*[0-9].*[0-9])/))  score += 5
+
+    //password has 2 sybols
+    if (password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)) score += 5
+
+    //password has Upper and Lower chars
+    if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/))  score += 10
+
+    //password has number and chars
+    if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/))  score += 15
+    //
+    //password has number and symbol
+    if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([0-9])/))  score += 15
+
+    //password has char and symbol
+    if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([a-zA-Z])/))  score += 15
+
+    //password is just a nubers or chars
+    if (password.match(/^\w+$/) || password.match(/^\d+$/) )  score -= 10
+
+    //verifing 0 < score < 100
+    if ( score < 0 )  score = 0
+    if ( score > 100 )  score = 100
+
+    if (score < 34 )  return badPass
+    if (score < 68 )  return goodPass
+    return strongPass
+}
+
+
+// checkRepetition(1,'aaaaaaabcbc')   = 'abcbc'
+// checkRepetition(2,'aaaaaaabcbc')   = 'aabc'
+// checkRepetition(2,'aaaaaaabcdbcd') = 'aabcd'
+
+function checkRepetition(pLen,str) {
+    res = ""
+    for ( i=0; i<str.length ; i++ ) {
+        repeated=true
+        for (j=0;j < pLen && (j+i+pLen) < str.length;j++)
+            repeated=repeated && (str.charAt(j+i)==str.charAt(j+i+pLen))
+        if (j<pLen) repeated=false
+        if (repeated) {
+            i+=pLen-1
+            repeated=false
+        }
+        else {
+            res+=str.charAt(i)
+        }
+    }
+    return res
+}
+
diff -x .svn -aruN 2.2.2.src/wp-admin/js/post.js 2.5.src/wp-admin/js/post.js
--- 2.2.2.src/wp-admin/js/post.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/js/post.js	2008-03-26 15:06:18.000000000 -0500
@@ -0,0 +1,176 @@
+// this file contains all the scripts used in the post/edit page
+
+function new_tag_remove_tag() {
+	var id = jQuery( this ).attr( 'id' );
+	var num = id.substr( 10 );
+	var current_tags = jQuery( '#tags-input' ).val().split(',');
+	delete current_tags[num];
+	var new_tags = [];
+	jQuery.each( current_tags, function( key, val ) {
+		if ( val && !val.match(/^\s+$/) && '' != val ) {
+			new_tags = new_tags.concat( val );
+		}
+	});
+	jQuery( '#tags-input' ).val( new_tags.join( ',' ).replace( /\s*,+\s*/, ',' ).replace( /,+/, ',' ).replace( /,+\s+,+/, ',' ).replace( /,+\s*$/, '' ).replace( /^\s*,+/, '' ) );
+	tag_update_quickclicks();
+	jQuery('#newtag').focus();
+	return false;
+}
+
+function tag_update_quickclicks() {
+	var current_tags = jQuery( '#tags-input' ).val().split(',');
+	jQuery( '#tagchecklist' ).empty();
+	shown = false;
+//	jQuery.merge( current_tags, current_tags ); // this doesn't work anymore, need something to array_unique
+	jQuery.each( current_tags, function( key, val ) {
+		val = val.replace( /^\s+/, '' ).replace( /\s+$/, '' ); // trim
+		if ( !val.match(/^\s+$/) && '' != val ) {
+			txt = '<span><a id="tag-check-' + key + '" class="ntdelbutton">X</a>&nbsp;' + val + '</span> ';
+			jQuery( '#tagchecklist' ).append( txt );
+			jQuery( '#tag-check-' + key ).click( new_tag_remove_tag );
+			shown = true;
+		}
+	});
+	if ( shown )
+		jQuery( '#tagchecklist' ).prepend( '<strong>'+postL10n.tagsUsed+'</strong><br />' );
+}
+
+function tag_flush_to_text() {
+	var newtags = jQuery('#tags-input').val() + ',' + jQuery('#newtag').val();
+	// massage
+	newtags = newtags.replace( /\s+,+\s*/g, ',' ).replace( /,+/g, ',' ).replace( /,+\s+,+/g, ',' ).replace( /,+\s*$/g, '' ).replace( /^\s*,+/g, '' );
+	jQuery('#tags-input').val( newtags );
+	tag_update_quickclicks();
+	jQuery('#newtag').val('');
+	jQuery('#newtag').focus();
+	return false;
+}
+
+function tag_save_on_publish() {
+	if ( jQuery('#newtag').val() != postL10n.addTag )
+		tag_flush_to_text();
+}
+
+function tag_press_key( e ) {
+	if ( 13 == e.keyCode ) {
+		tag_flush_to_text();
+		return false;
+	}
+}
+
+jQuery(document).ready( function() {
+	// close postboxes that should be closed
+	jQuery('.if-js-closed').removeClass('if-js-closed').addClass('closed');
+
+	// show things that should be visible, hide what should be hidden
+	jQuery('.hide-if-no-js').show();
+	jQuery('.hide-if-js').hide();
+
+	// postboxes
+	add_postbox_toggles('post');
+
+	// Editable slugs
+	make_slugedit_clickable();
+
+	// hide advanced slug field
+	jQuery('#slugdiv').hide();
+
+	jQuery('#tags-input').hide();
+	tag_update_quickclicks();
+	// add the quickadd form
+	jQuery('#jaxtag').prepend('<span id="ajaxtag"><input type="text" name="newtag" id="newtag" class="form-input-tip" size="16" autocomplete="off" value="'+postL10n.addTag+'" /><input type="button" class="button" id="tagadd" value="' + postL10n.add + '" tabindex="3" /><input type="hidden"/><input type="hidden"/><span class="howto">'+postL10n.separate+'</span></span>');
+	jQuery('#tagadd').click( tag_flush_to_text );
+	jQuery('#newtag').focus(function() {
+		if ( this.value == postL10n.addTag )
+			jQuery(this).val( '' ).removeClass( 'form-input-tip' );
+	});
+	jQuery('#newtag').blur(function() {
+		if ( this.value == '' )
+			jQuery(this).val( postL10n.addTag ).addClass( 'form-input-tip' );
+	});
+
+	// auto-save tags on post save/publish
+	jQuery('#publish').click( tag_save_on_publish );
+	jQuery('#save-post').click( tag_save_on_publish );
+
+	jQuery('#title').blur( function() { if ( (jQuery("#post_ID").val() > 0) || (jQuery("#title").val().length == 0) ) return; autosave(); } );
+
+	// auto-suggest stuff
+	jQuery('#newtag').suggest( 'admin-ajax.php?action=ajax-tag-search', { delay: 500, minchars: 2 } );
+	jQuery('#newtag').keypress( tag_press_key );
+
+	// category tabs
+	var categoryTabs =jQuery('#category-tabs').tabs();
+
+	// Ajax Cat
+	var newCat = jQuery('#newcat').one( 'focus', function() { jQuery(this).val( '' ).removeClass( 'form-input-tip' ) } );
+	jQuery('#category-add-sumbit').click( function() { newCat.focus(); } );
+	var newCatParent = false;
+	var newCatParentOption = false;
+	var noSyncChecks = false; // prophylactic. necessary?
+	var syncChecks = function() {
+		if ( noSyncChecks )
+			return;
+		noSyncChecks = true;
+		var th = jQuery(this);
+		var c = th.is(':checked');
+		var id = th.val().toString();
+		jQuery('#in-category-' + id + ', #in-popular-category-' + id).attr( 'checked', c );
+		noSyncChecks = false;
+	};
+	var catAddAfter = function( r, s ) {
+		if ( !newCatParent ) newCatParent = jQuery('#newcat_parent');
+		if ( !newCatParentOption ) newCatParentOption = newCatParent.find( 'option[value=-1]' );
+		jQuery(s.what + ' response_data', r).each( function() {
+			var t = jQuery(jQuery(this).text());
+			t.find( 'label' ).each( function() {
+				var th = jQuery(this);
+				var val = th.find('input').val();
+				var id = th.find('input')[0].id
+				jQuery('#' + id).change( syncChecks );
+				if ( newCatParent.find( 'option[value=' + val + ']' ).size() )
+					return;
+				var name = jQuery.trim( th.text() );
+				var o = jQuery( '<option value="' +  parseInt( val, 10 ) + '"></option>' ).text( name );
+				newCatParent.prepend( o );
+			} );
+			newCatParentOption.attr( 'selected', true );
+		} );
+	};
+	jQuery('#categorychecklist').wpList( {
+		alt: '',
+		response: 'category-ajax-response',
+		addAfter: catAddAfter
+	} );
+	jQuery('#category-add-toggle').click( function() {
+		jQuery(this).parents('div:first').toggleClass( 'wp-hidden-children' );
+		categoryTabs.tabsClick( 1 );
+		jQuery('#newcat').focus();
+		return false;
+	} );
+	jQuery('.categorychecklist :checkbox').change( syncChecks ).filter( ':checked' ).change();
+
+	jQuery('.edit-timestamp').click(function () {
+		if (jQuery('#timestampdiv').is(":hidden")) {
+			jQuery('#timestampdiv').slideDown("normal");
+			jQuery('.edit-timestamp').text(postL10n.cancel);
+		} else {
+			jQuery('#timestampdiv').hide();
+			jQuery('#mm').val(jQuery('#hidden_mm').val());
+			jQuery('#jj').val(jQuery('#hidden_jj').val());
+			jQuery('#aa').val(jQuery('#hidden_aa').val());
+			jQuery('#hh').val(jQuery('#hidden_hh').val());
+			jQuery('#mn').val(jQuery('#hidden_mn').val());
+			jQuery('.edit-timestamp').text(postL10n.edit);
+		}
+		return false;
+
+	});
+
+	// Custom Fields
+	jQuery('#the-list').wpList( { addAfter: function( xml, s ) {
+		if ( jQuery.isFunction( autosave_update_post_ID ) ) {
+			autosave_update_post_ID(s.parsed.responses[0].supplemental.postid);
+		}
+	} });
+});
diff -x .svn -aruN 2.2.2.src/wp-admin/js/postbox.js 2.5.src/wp-admin/js/postbox.js
--- 2.2.2.src/wp-admin/js/postbox.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/js/postbox.js	2008-03-14 03:43:00.000000000 -0500
@@ -0,0 +1,14 @@
+function add_postbox_toggles(page) {
+	jQuery('.postbox h3').prepend('<a class="togbox">+</a> ');
+	jQuery('.postbox h3').click( function() { jQuery(jQuery(this).parent().get(0)).toggleClass('closed'); save_postboxes_state(page); } );
+}
+
+function save_postboxes_state(page) {
+	var closed = jQuery('.postbox').filter('.closed').map(function() { return this.id; }).get().join(',');
+	jQuery.post(postboxL10n.requestFile, {
+		action: 'closed-postboxes',
+		closed: closed,
+		closedpostboxesnonce: jQuery('#closedpostboxesnonce').val(),
+		page: page
+	});
+}
diff -x .svn -aruN 2.2.2.src/wp-admin/js/slug.js 2.5.src/wp-admin/js/slug.js
--- 2.2.2.src/wp-admin/js/slug.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/js/slug.js	2008-03-03 15:02:53.000000000 -0600
@@ -0,0 +1,48 @@
+function edit_permalink(post_id) {
+	var i, c = 0;
+	var e = jQuery('#editable-post-name');
+	var revert_e = e.html();
+	var real_slug = jQuery('#post_name');
+	var revert_slug = real_slug.html();
+	var b = jQuery('#edit-slug-buttons');
+	var revert_b = b.html();
+	var full = jQuery('#editable-post-name-full').html();
+
+	b.html('<a href="" class="save">'+slugL10n.save+'</a> <a class="cancel" href="">'+slugL10n.cancel+'</a>');
+	b.children('.save').click(function() {
+		var new_slug = e.children('input').val();
+		jQuery.post(slugL10n.requestFile, {
+			action: 'sample-permalink',
+			post_id: post_id,
+			new_slug: new_slug,
+			new_title: jQuery('#title').val(),
+			samplepermalinknonce: jQuery('#samplepermalinknonce').val()}, function(data) {
+				jQuery('#edit-slug-box').html(data);
+				b.html(revert_b);
+				real_slug.attr('value', new_slug);
+				make_slugedit_clickable();
+			});
+		return false;
+	});
+	jQuery('#edit-slug-buttons .cancel').click(function() {
+		e.html(revert_e);
+		b.html(revert_b);
+		real_slug.attr('value', revert_slug);
+		return false;
+	});
+	for(i=0; i < full.length; ++i) {
+		if ('%' == full.charAt(i)) c++;
+	}
+	slug_value = (c > full.length/4)? '' : full;
+	e.html('<input type="text" id="new-post-slug" value="'+slug_value+'" />').children('input').keypress(function(e){
+		var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;
+		// on enter, just save the new slug, don't save the post
+		if (13 == key) {b.children('.save').click();return false;}
+		if (27 == key) {b.children('.cancel').click();return false;}
+		real_slug.attr('value', this.value)}).focus();
+}
+
+function make_slugedit_clickable() {
+	jQuery('#editable-post-name').click(function() {jQuery('#edit-slug-buttons').children('.edit-slug').click()});
+}
+
diff -x .svn -aruN 2.2.2.src/wp-admin/js/tags.js 2.5.src/wp-admin/js/tags.js
--- 2.2.2.src/wp-admin/js/tags.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/js/tags.js	2008-01-25 13:29:01.000000000 -0600
@@ -0,0 +1,21 @@
+jQuery(function($) {
+	var options = false
+
+	var addAfter = function( r, settings ) {
+		var name = $("<span>" + $('name', r).text() + "</span>").html();
+		var id = $('tag', r).attr('id');
+		options[options.length] = new Option(name, id);
+	}
+
+	var delAfter = function( r, settings ) {
+		var id = $('tag', r).attr('id');
+		for ( var o = 0; o < options.length; o++ )
+			if ( id == options[o].value )
+				options[o] = null;
+	}
+
+	if ( options )
+		$('#the-list').wpList( { addAfter: addAfter, delAfter: delAfter } );
+	else
+		$('#the-list').wpList();
+});
diff -x .svn -aruN 2.2.2.src/wp-admin/js/upload.js 2.5.src/wp-admin/js/upload.js
--- 2.2.2.src/wp-admin/js/upload.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/js/upload.js	2008-03-15 17:57:47.000000000 -0500
@@ -0,0 +1,330 @@
+jQuery(document).ready( function() {
+	theFileList = {
+		currentImage: {ID: 0},
+		nonce: '',
+		tab: '',
+		postID: 0,
+
+		// cookie create and read functions adapted from http://www.quirksmode.org/js/cookies.html
+		createCookie: function(name,value,days) {
+			if (days) {
+				var date = new Date();
+				date.setTime(date.getTime()+(days*24*60*60*1000));
+				var expires = "; expires="+date.toGMTString();
+			}
+			else var expires = "";
+			document.cookie = name+"="+value+expires+"; path=/";
+		},
+
+		readCookie: function(name) {
+			var nameEQ = name + "=";
+			var ca = document.cookie.split(';');
+			for(var i=0;i < ca.length;i++) {
+				var c = ca[i];
+				while (c.charAt(0)==' ') c = c.substring(1,c.length);
+				if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
+			}
+			return null;
+		},
+
+		assignCookieOnChange: function() {
+			jQuery(this).bind("change", function(){
+				theFileList.createCookie(jQuery(this).attr('name'),jQuery(this).attr('id'),365);
+			});
+		},
+
+		checkCookieSetting: function(name, defaultSetting) {
+			return this.readCookie(name) ? this.readCookie(name) : defaultSetting;
+		},
+
+		toQueryParams: function( s ) {
+			var r = {}; if ( !s ) { return r; }
+			var q = s.split('?'); if ( q[1] ) { s = q[1]; }
+			var pp = s.split('&');
+			for ( var i in pp ) {
+				var p = pp[i].split('=');
+				r[p[0]] = p[1];
+			}
+			return r;
+		},
+
+		toQueryString: function(params) {
+			var qryStr = '';
+			for ( var key in params )
+				qryStr += key + '=' + params[key] + '&';
+			return qryStr;
+		},
+
+		initializeVars: function() {
+			this.urlData  = document.location.href.split('?');
+			this.params = this.toQueryParams(this.urlData[1]);
+			this.postID = this.params['post_id'];
+			this.tab = this.params['tab'];
+			this.style = this.params['style'];
+			this.ID = this.params['ID'];
+			if ( !this.style )
+				this.style = 'default';
+			var nonceEl = jQuery('#nonce-value');
+			if ( nonceEl )
+				this.nonce = jQuery(nonceEl).val();
+			if ( this.ID ) {
+				this.grabImageData( this.ID );
+				this.imageView( this.ID );
+			}
+		},
+
+		initializeLinks: function() {
+			if ( this.ID )
+				return;
+			jQuery('a.file-link').each(function() {
+				var id = jQuery(this).attr('id').split('-').pop();
+				jQuery(this).attr('href','javascript:void(0)').click(function(e) {
+					theFileList[ 'inline' == theFileList.style ? 'imageView' : 'editView' ](id, e);
+				});
+			});
+		},
+
+		grabImageData: function(id) {
+			if ( id == this.currentImage.ID )
+				return;
+			var thumbEl = jQuery('#attachment-thumb-url-' + id);
+			if ( thumbEl ) {
+				this.currentImage.thumb = ( 0 == id ? '' : jQuery(thumbEl).val() );
+				this.currentImage.thumbBase = ( 0 == id ? '' : jQuery('#attachment-thumb-url-base-' + id).val() );
+			} else {
+				this.currentImage.thumb = false;
+			}
+			this.currentImage.src = ( 0 == id ? '' : jQuery('#attachment-url-' + id).val() );
+			this.currentImage.srcBase = ( 0 == id ? '' : jQuery('#attachment-url-base-' + id).val() );
+			this.currentImage.page = ( 0 == id ? '' : jQuery('#attachment-page-url-' + id).val() );
+			this.currentImage.title = ( 0 == id ? '' : jQuery('#attachment-title-' + id).val() );
+			this.currentImage.description = ( 0 == id ? '' : jQuery('#attachment-description-' + id).val() );
+			var widthEl = jQuery('#attachment-width-' + id);
+			if ( widthEl ) {
+				this.currentImage.width = ( 0 == id ? '' : jQuery(widthEl).val() );
+				this.currentImage.height = ( 0 == id ? '' : jQuery('#attachment-height-' + id).val() );
+			} else {
+				this.currentImage.width = false;
+				this.currentImage.height = false;
+			}
+			this.currentImage.isImage = ( 0 == id ? 0 : jQuery('#attachment-is-image-' + id).val() );
+			this.currentImage.ID = id;
+		},
+
+		imageView: function(id, e) {
+			this.prepView(id);
+			var h = '';
+
+			h += "<div id='upload-file'>"
+			if ( this.ID ) {
+				var params = this.params;
+				params.ID = '';
+				params.action = '';
+				h += "<a href='" + this.urlData[0] + '?' + this.toQueryString(params) + "'";
+			} else {
+				h += "<a href='#' onclick='return theFileList.cancelView();'";
+			}
+			h += " title='" + this.browseTitle + "' class='back'>" + this.back + "</a>";
+			h += "<div id='file-title'>"
+			if ( 0 == this.currentImage.isImage )
+				h += "<h2><a href='" + this.currentImage.srcBase + this.currentImage.src + "' onclick='return false;' title='" + this.directTitle + "'>" + this.currentImage.title + "</a></h2>";
+			else
+				h += "<h2>" + this.currentImage.title + "</h2>";
+			h += " &#8212; <span>";
+			h += "<a href='#' onclick='return theFileList.editView(" + id + ");'>" + this.edit + "</a>"
+			h += "</span>";
+			h += '</div>'
+			h += "<div id='upload-file-view' class='alignleft'>";
+			if ( 1 == this.currentImage.isImage ) {
+				h += "<a href='" + this.currentImage.srcBase + this.currentImage.src + "' onclick='return false;' title='" + this.directTitle + "'>";
+				h += "<img src='" + ( this.currentImage.thumb ? this.currentImage.thumb : this.currentImage.src ) + "' alt='" + this.currentImage.title + "' width='" + this.currentImage.width + "' height='" + this.currentImage.height + "' />";
+				h += "</a>";
+			} else
+				h += '&nbsp;';
+			h += "</div>";
+
+			h += "<form name='uploadoptions' id='uploadoptions' class='alignleft'>";
+			h += "<table>";
+			var display = [];
+			var checkedDisplay = 'display-title';
+			if ( 1 == this.currentImage.isImage ) {
+				checkedDisplay = 'display-full';
+				if ( this.currentImage.thumb ) {
+					display.push("<label for='display-thumb'><input type='radio' name='display' id='display-thumb' value='thumb' /> " + this.thumb + "</label><br />");
+					checkedDisplay = 'display-thumb';
+				}
+				display.push("<label for='display-full'><input type='radio' name='display' id='display-full' value='full' /> " + this.full + "</label>");
+			} else if ( this.currentImage.thumb ) {
+				display.push("<label for='display-thumb'><input type='radio' name='display' id='display-thumb' value='thumb' /> " + this.icon + "</label>");
+			}
+			if ( display.length ) {
+				display.push("<br /><label for='display-title'><input type='radio' name='display' id='display-title' value='title' /> " + this.title + "</label>");
+				h += "<tr><th style='padding-bottom:.5em'>" + this.show + "</th><td style='padding-bottom:.5em'>";
+				jQuery(display).each( function() { h += this; } );
+				h += "</td></tr>";
+			}
+
+			var checkedLink = 'link-file';
+ 			h += "<tr><th>" + this.link + "</th><td>";
+			h += "<label for='link-file'><input type='radio' name='link' id='link-file' value='file' /> " + this.file + "</label><br />";			h += "<label for='link-page'><input type='radio' name='link' id='link-page' value='page' /> " + this.page + "</label><br />";
+			h += "<label for='link-none'><input type='radio' name='link' id='link-none' value='none' /> " + this.none + "</label>";
+			h += "</td></tr>";
+
+			h += "<tr><td colspan='2'><p class='submit'>";
+			h += "<input type='button' class='button' name='send' onclick='theFileList.sendToEditor(" + id + ")' value='" + this.editorText + "' />";
+			h += "</p></td></tr></table>";
+			h += "</form>";
+
+			h += "</div>";
+
+			jQuery(h).prependTo('#upload-content');
+			jQuery("input[@name='display']").each(theFileList.assignCookieOnChange);
+			jQuery("input[@name='link']").each(theFileList.assignCookieOnChange);
+			checkedDisplay = this.checkCookieSetting('display', checkedDisplay);
+			checkedLink = this.checkCookieSetting('link', checkedLink);
+			jQuery('#' + checkedDisplay).attr('checked','checked');
+			jQuery('#' + checkedLink).attr('checked','checked');
+			if (e) return e.stopPropagation();
+			return false;
+		},
+
+		editView: function(id, e) {
+			this.prepView(id);
+			var h = '';
+
+			var action = 'upload.php?style=' + this.style + '&amp;tab=upload';
+			if ( this.postID )
+				action += '&amp;post_id=' + this.postID;
+
+			h += "<form id='upload-file' method='post' action='" + action + "'>";
+			if ( this.ID ) {
+				var params = this.params;
+				params.ID = '';
+				params.action = '';
+				h += "<a href='" + this.urlData[0] + '?' + this.toQueryString(params) + "'";
+			} else {
+				h += "<a href='#' onclick='return theFileList.cancelView();'";
+			}
+			h += " title='" + this.browseTitle + "' class='back'>" + this.back + "</a>";
+			h += "<div id='file-title'>"
+			if ( 0 == this.currentImage.isImage )
+				h += "<h2><a href='" + this.currentImage.srcBase + this.currentImage.src + "' onclick='return false;' title='" + this.directTitle + "'>" + this.currentImage.title + "</a></h2>";
+			else
+				h += "<h2>" + this.currentImage.title + "</h2>";
+			h += " &#8212; <span>";
+			h += "<a href='#' onclick='return theFileList.imageView(" + id + ");'>" + this.insert + "</a>";
+			h += "</span>";
+			h += '</div>'
+			h += "<div id='upload-file-view' class='alignleft'>";
+			if ( 1 == this.currentImage.isImage ) {
+				h += "<a href='" + this.currentImage.srcBase + this.currentImage.src + "' onclick='return false;' title='" + this.directTitle + "'>";
+				h += "<img src='" + ( this.currentImage.thumb ? this.currentImage.thumb : this.currentImage.src ) + "' alt='" + this.currentImage.title + "' width='" + this.currentImage.width + "' height='" + this.currentImage.height + "' />";
+				h += "</a>";
+			} else
+				h += '&nbsp;';
+			h += "</div>";
+
+
+			h += "<table><col /><col class='widefat' /><tr>";
+			h += "<th scope='row'><label for='url'>" + this.urlText + "</label></th>";
+			h += "<td><input type='text' id='url' class='readonly' value='" + this.currentImage.srcBase + this.currentImage.src + "' readonly='readonly' /></td>";
+			h += "</tr><tr>";
+			h += "<th scope='row'><label for='post_title'>" + this.title + "</label></th>";
+			h += "<td><input type='text' id='post_title' name='post_title' value='" + this.currentImage.title + "' /></td>";
+			h += "</tr><tr>";
+			h += "<th scope='row'><label for='post_content'>" + this.desc + "</label></th>";
+			h += "<td><textarea name='post_content' id='post_content'>" + this.currentImage.description + "</textarea></td>";
+			h += "</tr><tr id='buttons' class='submit'><td colspan='2'><input type='button' id='delete' name='delete' class='delete alignleft' value='" + this.deleteText + "' onclick='theFileList.deleteFile(" + id + ");' />";
+			h += "<input type='hidden' name='from_tab' value='" + this.tab + "' />";
+			h += "<input type='hidden' name='post_parent' value='" + parseInt(this.postID,10) + "' />";
+			h += "<input type='hidden' name='action' id='action-value' value='save' />";
+			h += "<input type='hidden' name='ID' value='" + id + "' />";
+			h += "<input type='hidden' name='_wpnonce' value='" + this.nonce + "' />";
+			h += "<div class='submit'><input type='submit' value='" + this.saveText + "' /></div>";
+			h += "</td></tr></table></form>";
+
+			jQuery(h).prependTo('#upload-content');
+			if (e) e.stopPropagation();
+			return false;
+		},
+
+		prepView: function(id) {
+			this.cancelView( true );
+			var filesEl = jQuery('#upload-files');
+			if ( filesEl )
+				filesEl.hide();
+			var navEl = jQuery('#current-tab-nav');
+			if ( navEl )
+				navEl.hide();
+			this.grabImageData(id);
+		},
+
+		cancelView: function( prep ) {
+			if ( !prep ) {
+				var filesEl = jQuery('#upload-files');
+				if ( filesEl )
+					jQuery(filesEl).show();
+				var navEl = jQuery('#current-tab-nav');
+				if ( navEl )
+					jQuery(navEl).show();
+			}
+			if ( !this.ID )
+				this.grabImageData(0);
+			var div = jQuery('#upload-file');
+			if ( div )
+				jQuery(div).remove();
+			return false;
+		},
+
+		sendToEditor: function(id) {
+			this.grabImageData(id);
+			var link = '';
+			var display = '';
+			var h = '';
+
+			link = jQuery('input[@type=radio][@name="link"][@checked]','#uploadoptions').val();
+			displayEl = jQuery('input[@type=radio][@name="display"][@checked]','#uploadoptions');
+			if ( displayEl )
+				display = jQuery(displayEl).val();
+			else if ( 1 == this.currentImage.isImage )
+				display = 'full';
+
+			if ( 'none' != link )
+				h += "<a href='" + ( 'file' == link ? ( this.currentImage.srcBase + this.currentImage.src ) : ( this.currentImage.page + "' rel='attachment wp-att-" + this.currentImage.ID ) ) + "' title='" + this.currentImage.title + "'>";
+			if ( display && 'title' != display )
+				h += "<img src='" + ( 'thumb' == display ? ( this.currentImage.thumbBase + this.currentImage.thumb ) : ( this.currentImage.srcBase + this.currentImage.src ) ) + "' alt='" + this.currentImage.title + "' />";
+			else
+				h += this.currentImage.title;
+			if ( 'none' != link )
+				h += "</a>";
+
+			var win = window.opener ? window.opener : window.dialogArguments;
+			if ( !win )
+				win = top;
+			tinyMCE = win.tinyMCE;
+			if ( typeof tinyMCE != 'undefined' && tinyMCE.getInstanceById('content') ) {
+				tinyMCE.selectedInstance.getWin().focus();
+				tinyMCE.execCommand('mceInsertContent', false, h);
+			} else
+				win.edInsertContent(win.edCanvas, h);
+			if ( !this.ID )
+				this.cancelView();
+			return false;
+		},
+
+		deleteFile: function(id) {
+			if ( confirm( this.confirmText.replace(/%title%/g, this.currentImage.title) ) ) {
+				jQuery('#action-value').attr('value','delete');
+				jQuery('#upload-file').submit();
+				return true;
+			}
+			return false;
+		}
+
+	};
+
+	for ( var property in uploadL10n )
+		theFileList[property] = uploadL10n[property];
+	theFileList.initializeVars();
+	theFileList.initializeLinks();
+} );
diff -x .svn -aruN 2.2.2.src/wp-admin/js/users.js 2.5.src/wp-admin/js/users.js
--- 2.2.2.src/wp-admin/js/users.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/js/users.js	2008-03-02 15:34:25.000000000 -0600
@@ -0,0 +1 @@
+jQuery( function($) { $('#users').wpList(); } );
diff -x .svn -aruN 2.2.2.src/wp-admin/js/widgets.js 2.5.src/wp-admin/js/widgets.js
--- 2.2.2.src/wp-admin/js/widgets.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/js/widgets.js	2008-03-19 23:39:23.000000000 -0500
@@ -0,0 +1,136 @@
+jQuery(function($) {
+	$('.noscript-action').remove();
+
+	var increment = 1;
+
+	// Open or close widget control form
+	var toggleWidget = function( li, disableFields ) {
+		var width = li.find('input.widget-width').val();
+
+		// it seems IE chokes on these animations because of the positioning/floating
+		var widgetAnim = $.browser.msie ? function() {
+			var t = $(this);
+			if ( t.is(':visible') ) {
+				if ( disableFields ) { t.find( ':enabled' ).not( '[name="widget-id[]"], [name*="[submit]"]' ).attr( 'disabled', 'disabled' ); }
+				li.css( 'marginLeft', 0 );
+				t.siblings('h4').children('a').text( widgetsL10n.edit );
+			} else {
+				t.find( ':disabled' ).attr( 'disabled', '' ); // always enable on open
+				if ( width > 250 )
+					li.css( 'marginLeft', ( width - 250 ) * -1 );
+				t.siblings('h4').children('a').text( widgetsL10n.cancel );
+			}
+			t.toggle();
+		} : function() {
+			var t = $(this);
+
+			if ( t.is(':visible') ) {
+				if ( disableFields ) { t.find( ':enabled' ).not( '[name="widget-id[]"], [name*="[submit]"]' ).attr( 'disabled', 'disabled' ); }
+				if ( width > 250 )
+					li.animate( { marginLeft: 0 } );
+				t.siblings('h4').children('a').text( widgetsL10n.edit );
+			} else {
+				t.find( ':disabled' ).attr( 'disabled', '' ); // always enable on open
+				if ( width > 250 )
+					li.animate( { marginLeft: ( width - 250 ) * -1 } );
+				t.siblings('h4').children('a').text( widgetsL10n.cancel );
+			}
+			t.animate( { height: 'toggle' } );
+		};
+
+		return li.children('div.widget-control').each( widgetAnim ).end();
+	};
+
+	// onclick for edit/cancel links
+	var editClick = function() {
+		var q = wpAjax.unserialize( this.href );
+		// if link is in available widgets list, make sure it points to the current sidebar
+		if ( ( q.sidebar && q.sidebar == $('#sidebar').val() ) || q.add ) {
+			var w = q.edit || q.add;
+			toggleWidget( $('#current-sidebar .widget-control-list input[@name^="widget-id"][@value=' + w + ']').parents('li:first'), false ).blur();
+			return false;
+		} else if ( q.sidebar ) { // otherwise, redirect to correct page
+			return true;
+		}
+
+		// If link is in current widgets list, just open the form
+		toggleWidget( $(this).parents('li:first'), true ).blur();
+		return false;
+	};
+
+	// onclick for add links
+	var addClick = function() {
+		var oldLi = $(this).parents('li:first').find('ul.widget-control-info li');
+		var newLi = oldLi.clone();
+
+		if ( newLi.html().match( /%i%/ ) ) {
+			// supplid form is a template, replace %i% by unique id
+			var i = $('#generated-time').val() + increment.toString();
+			increment++;
+			newLi.html( newLi.html().replace( /%i%/g, i ) );
+		} else {
+			$(this).text( widgetsL10n.edit ).unbind().click( editClick );
+			// save form content in textarea so we don't have any conflicting HTML ids
+			oldLi.html( '<textarea>' + oldLi.html() + '</textarea>' );
+		}
+
+		// add event handlers
+		addWidgetControls( newLi );
+
+		// add widget to sidebar sortable
+		widgetSortable.append( newLi ).SortableAddItem( newLi[0] );
+
+		// increment widget counter
+		var n = parseInt( $('#widget-count').text(), 10 ) + 1;
+		$('#widget-count').text( n.toString() )
+
+		return false;
+	};
+
+	// add event handlers to all links found in context
+	var addWidgetControls = function( context ) {
+		if ( !context )
+			context = document;
+
+		$('a.widget-control-edit', context).click( editClick );
+
+		// onclick for save links
+		$('a.widget-control-save', context).click( function() {
+			toggleWidget( $(this).parents('li:first'), false ).blur()
+			return false;
+		} );
+
+		// onclick for remove links
+		$('a.widget-control-remove', context).click( function() {
+			var w = $(this).parents('li:first').find('input[@name^="widget-id"]').val();
+			$(this).parents('li:first').remove();
+			var t = $('#widget-list ul#widget-control-info-' + w + ' textarea');
+			t.parent().html( t.text() ).parents('li.widget-list-item:first').children( 'h4' ).children('a.widget-action')
+				.show().text( widgetsL10n.add ).unbind().click( addClick );
+			var n = parseInt( $('#widget-count').text(), 10 ) - 1;
+			$('#widget-count').text( n.toString() )
+			return false;
+		} );
+	}
+
+	addWidgetControls();
+
+	$('a.widget-control-add').click( addClick );
+
+	var widgetSortable;
+	var widgetSortableInit = function() {
+		try { // a hack to make sortables work in jQuery 1.2+ and IE7
+			$('#current-sidebar .widget-control-list').SortableDestroy();
+		} catch(e) {}
+		widgetSortable = $('#current-sidebar .widget-control-list').Sortable( {
+			accept: 'widget-sortable',
+			helperclass: 'sorthelper',
+			handle: 'h4.widget-title',
+			onStop: widgetSortableInit
+		} );
+	}
+
+	// initialize sortable
+	widgetSortableInit();
+
+});
diff -x .svn -aruN 2.2.2.src/wp-admin/js/xfn.js 2.5.src/wp-admin/js/xfn.js
--- 2.2.2.src/wp-admin/js/xfn.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/js/xfn.js	2007-06-01 19:37:51.000000000 -0500
@@ -0,0 +1,46 @@
+function GetElementsWithClassName(elementName, className) {
+	var allElements = document.getElementsByTagName(elementName);
+	var elemColl = new Array();
+	for (i = 0; i < allElements.length; i++) {
+		if (allElements[i].className == className) {
+			elemColl[elemColl.length] = allElements[i];
+		}
+	}
+	return elemColl;
+}
+
+function meChecked() {
+	var undefined;
+	var eMe = document.getElementById('me');
+	if (eMe == undefined) return false;
+	else return eMe.checked;
+}
+
+function upit() {
+	var isMe = meChecked(); //document.getElementById('me').checked;
+	var inputColl = GetElementsWithClassName('input', 'valinp');
+	var results = document.getElementById('link_rel');
+	var linkText, linkUrl, inputs = '';
+	for (i = 0; i < inputColl.length; i++) {
+		 inputColl[i].disabled = isMe;
+		 inputColl[i].parentNode.className = isMe ? 'disabled' : '';
+		 if (!isMe && inputColl[i].checked && inputColl[i].value != '') {
+			inputs += inputColl[i].value + ' ';
+				}
+		 }
+	inputs = inputs.substr(0,inputs.length - 1);
+	if (isMe) inputs='me';
+	results.value = inputs;
+	}
+
+function blurry() {
+	if (!document.getElementById) return;
+
+	var aInputs = document.getElementsByTagName('input');
+
+	for (var i = 0; i < aInputs.length; i++) {
+		 aInputs[i].onclick = aInputs[i].onkeyup = upit;
+	}
+}
+
+addLoadEvent(blurry);
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/link-add.php 2.5.src/wp-admin/link-add.php
--- 2.2.2.src/wp-admin/link-add.php	2007-03-07 11:07:33.000000000 -0600
+++ 2.5.src/wp-admin/link-add.php	2008-03-10 00:44:56.000000000 -0500
@@ -3,7 +3,7 @@
 
 $title = __('Add Link');
 $this_file = 'link-manager.php';
-$parent_file = 'link-manager.php';
+$parent_file = 'post-new.php';
 
 
 wp_reset_vars(array('action', 'cat_id', 'linkurl', 'name', 'image',
@@ -11,9 +11,10 @@
 	'submit', 'order_by', 'links_show_cat_id', 'rating', 'rel',
 	'notes', 'linkcheck[]'));
 
-wp_enqueue_script( array('xfn', 'dbx-admin-key?pagenow=link.php') );
-if ( current_user_can( 'manage_categories' ) )
-	wp_enqueue_script( 'ajaxcat' );
+wp_enqueue_script('link');
+wp_enqueue_script('xfn');
+wp_enqueue_script('thickbox');
+
 require('admin-header.php');
 ?>
 
@@ -22,16 +23,8 @@
 <?php endif; ?>
 
 <?php
-	$link = get_default_link_to_edit();
-	include('edit-link-form.php');
-?>
-
-<div id="wp-link-bookmarklet"  class="wrap">
-<h3><?php _e('Add Link Bookmarklet'); ?></h3>
-<p><?php _e('Right click on the following link and choose &#0147;Bookmark This Link...&#0148; or &#0147;Add to Favorites...&#0148; to create a Link This shortcut.'); ?></p>
-<?php printf('<p><a href="%s" title="'.__('Link add bookmarklet').'">'.__('Link This').'</a></p>', "javascript:void(linkmanpopup=window.open('" . get_option('siteurl') . "/wp-admin/link-add.php?action=popup&amp;linkurl='+escape(location.href)+'&amp;name='+escape(document.title),'LinkManager','scrollbars=yes,width=750,height=550,left=15,top=15,status=yes,resizable=yes'));linkmanpopup.focus();window.focus();linkmanpopup.focus();") ?>
-</div>
+$link = get_default_link_to_edit();
+include('edit-link-form.php');
 
-<?php
 require('admin-footer.php');
-?>
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/link-category.php 2.5.src/wp-admin/link-category.php
--- 2.2.2.src/wp-admin/link-category.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/link-category.php	2008-03-26 17:21:01.000000000 -0500
@@ -0,0 +1,86 @@
+<?php
+require_once('admin.php');
+
+wp_reset_vars(array('action', 'cat'));
+
+switch($action) {
+
+case 'addcat':
+
+	check_admin_referer('add-link-category');
+
+	if ( !current_user_can('manage_categories') )
+		wp_die(__('Cheatin&#8217; uh?'));
+
+	if ( wp_insert_term($_POST['name'], 'link_category', $_POST ) ) {
+		wp_redirect('edit-link-categories.php?message=1#addcat');
+	} else {
+		wp_redirect('edit-link-categories.php?message=4#addcat');
+	}
+	exit;
+break;
+
+case 'delete':
+	$cat_ID = (int) $_GET['cat_ID'];
+	check_admin_referer('delete-link-category_' .  $cat_ID);
+
+	if ( !current_user_can('manage_categories') )
+		wp_die(__('Cheatin&#8217; uh?'));
+
+	$cat_name = get_term_field('name', $cat_ID, 'link_category');
+
+	// Don't delete the default cats.
+    if ( $cat_ID == get_option('default_link_category') )
+		wp_die(sprintf(__("Can&#8217;t delete the <strong>%s</strong> category: this is the default one"), $cat_name));
+
+	wp_delete_term($cat_ID, 'link_category');
+
+	$location = 'edit-link-categories.php';
+	if ( $referer = wp_get_original_referer() ) {
+		if ( false !== strpos($referer, 'edit-link-categories.php') )
+			$location = $referer;
+	}
+
+	$location = add_query_arg('message', 2, $location);
+
+	wp_redirect($location);
+	exit;
+
+break;
+
+case 'edit':
+	$title = __('Categories');
+	$parent_file = 'edit.php';
+	$submenu_file = 'edit-link-categories.php';
+	require_once ('admin-header.php');
+	$cat_ID = (int) $_GET['cat_ID'];
+	$category = get_term_to_edit($cat_ID, 'link_category');
+	include('edit-link-category-form.php');
+	include('admin-footer.php');
+	exit;
+break;
+
+case 'editedcat':
+	$cat_ID = (int) $_POST['cat_ID'];
+	check_admin_referer('update-link-category_' . $cat_ID);
+
+	if ( !current_user_can('manage_categories') )
+		wp_die(__('Cheatin&#8217; uh?'));
+
+	$location = 'edit-link-categories.php';
+	if ( $referer = wp_get_original_referer() ) {
+		if ( false !== strpos($referer, 'edit-link-categories.php') )
+			$location = $referer;
+	}
+
+	if ( wp_update_term($cat_ID, 'link_category', $_POST) )
+		$location = add_query_arg('message', 3, $location);
+	else
+		$location = add_query_arg('message', 5, $location);
+
+	wp_redirect($location);
+	exit;
+break;
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/link-import.php 2.5.src/wp-admin/link-import.php
--- 2.2.2.src/wp-admin/link-import.php	2007-08-02 10:10:25.000000000 -0500
+++ 2.5.src/wp-admin/link-import.php	2008-03-14 18:58:31.000000000 -0500
@@ -3,9 +3,8 @@
 // Copyright (C) 2002 Mike Little -- mike@zed1.com
 
 require_once('admin.php');
-$parent_file = 'link-manager.php';
+$parent_file = 'edit.php';
 $title = __('Import Blogroll');
-$this_file = 'link-import.php';
 
 $step = $_POST['step'];
 if (!$step) $step = 0;
@@ -30,12 +29,12 @@
 <div style="width: 70%; margin: auto; height: 8em;">
 <input type="hidden" name="step" value="1" />
 <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
-<div style="width: 48%; float: left;">
+<div style="width: 48%;" class="alignleft">
 <h3><?php _e('Specify an OPML URL:'); ?></h3>
 <input type="text" name="opml_url" size="50" style="width: 90%;" value="http://" />
 </div>
 
-<div style="width: 48%; float: left;">
+<div style="width: 48%;" class="alignleft">
 <h3><?php _e('Or choose from your local disk:'); ?></h3>
 <input id="userfile" name="userfile" type="file" size="30" />
 </div>
@@ -45,16 +44,16 @@
 <p style="clear: both; margin-top: 1em;"><?php _e('Now select a category you want to put these links in.') ?><br />
 <?php _e('Category:') ?> <select name="cat_id">
 <?php
-$categories = get_categories('hide_empty=0');
+$categories = get_terms('link_category', 'get=all');
 foreach ($categories as $category) {
 ?>
-<option value="<?php echo $category->cat_ID; ?>"><?php echo wp_specialchars(apply_filters('link_category', $category->cat_name)); ?></option>
+<option value="<?php echo $category->term_id; ?>"><?php echo wp_specialchars(apply_filters('link_category', $category->name)); ?></option>
 <?php
 } // end foreach
 ?>
 </select></p>
 
-<p class="submit"><input type="submit" name="submit" value="<?php _e('Import OPML File &raquo;') ?>" /></p>
+<p class="submit"><input type="submit" name="submit" value="<?php _e('Import OPML File') ?>" /></p>
 </form>
 
 </div>
@@ -98,7 +97,7 @@
 			} else {
 				$opml = file_get_contents($opml_url);
 			}
-			
+
 			include_once('link-parse-opml.php');
 
 			$link_count = count($names);
@@ -123,7 +122,7 @@
 } // end else
 
 if ( ! $blogrolling )
-	apply_filters( 'wp_delete_file', $opml_url); 
+	do_action( 'wp_delete_file', $opml_url);
 	@unlink($opml_url);
 ?>
 </div>
diff -x .svn -aruN 2.2.2.src/wp-admin/link-manager.php 2.5.src/wp-admin/link-manager.php
--- 2.2.2.src/wp-admin/link-manager.php	2007-05-10 16:07:51.000000000 -0500
+++ 2.5.src/wp-admin/link-manager.php	2008-03-20 00:02:40.000000000 -0500
@@ -1,12 +1,30 @@
 <?php
 
+require_once ('admin.php');
 
-// Links
-// Copyright (C) 2002, 2003 Mike Little -- mike@zed1.com
+// Handle bulk deletes
+if ( isset($_GET['deleteit']) && isset($_GET['linkcheck']) ) {
+	check_admin_referer('bulk-bookmarks');
 
-require_once ('admin.php');
+	if ( ! current_user_can('manage_links') )
+		wp_die( __('You do not have sufficient permissions to edit the links for this blog.') );
 
-wp_enqueue_script( 'listman' );
+	foreach ( (array) $_GET['linkcheck'] as $link_id) {
+		$link_id = (int) $link_id;
+
+		wp_delete_link($link_id);
+	}
+
+	$sendback = wp_get_referer();
+	$sendback = preg_replace('|[^a-z0-9-~+_.?#=&;,/:]|i', '', $sendback);
+	wp_redirect($sendback);
+	exit;
+} elseif ( !empty($_GET['_wp_http_referer']) ) {
+	 wp_redirect(remove_query_arg(array('_wp_http_referer', '_wpnonce'), stripslashes($_SERVER['REQUEST_URI'])));
+	 exit;
+}
+
+wp_enqueue_script('admin-forms');
 
 wp_reset_vars(array('action', 'cat_id', 'linkurl', 'name', 'image', 'description', 'visible', 'target', 'category', 'link_id', 'submit', 'order_by', 'links_show_cat_id', 'rating', 'rel', 'notes', 'linkcheck[]'));
 
@@ -16,8 +34,8 @@
 if (empty ($order_by))
 	$order_by = 'order_name';
 
-$title = __('Manage Blogroll');
-$this_file = $parent_file = 'link-manager.php';
+$title = __('Manage Links');
+$this_file = $parent_file = 'edit.php';
 include_once ("./admin-header.php");
 
 if (!current_user_can('manage_links'))
@@ -44,64 +62,67 @@
 		$sqlorderby = 'name';
 		break;
 }
-?>
-<script type="text/javascript">
-<!--
-function checkAll(form)
-{
-	for (i = 0, n = form.elements.length; i < n; i++) {
-		if(form.elements[i].type == "checkbox") {
-			if(form.elements[i].checked == true)
-				form.elements[i].checked = false;
-			else
-				form.elements[i].checked = true;
-		}
-	}
-}
-//-->
-</script>
 
-<?php
 if ( isset($_GET['deleted']) ) {
 	echo '<div style="background-color: rgb(207, 235, 247);" id="message" class="updated fade"><p>';
 	$deleted = (int) $_GET['deleted'];
 	printf(__ngettext('%s link deleted.', '%s links deleted', $deleted), $deleted);
 	echo '</p></div>';
+	$_SERVER['REQUEST_URI'] = remove_query_arg(array('deleted'), $_SERVER['REQUEST_URI']);
 }
 ?>
 
 <div class="wrap">
 
-<h2><?php _e('Blogroll Management'); ?></h2>
-<p><?php _e('Here you <a href="link-add.php">add links</a> to sites that you visit often and share them on your blog. When you have a list of links in your sidebar to other blogs, it&#8217;s called a &#8220;blogroll.&#8221;'); ?></p>
-<form id="cats" method="get" action="">
-<p><?php
-$categories = get_categories("hide_empty=1&type=link");
+<form id="posts-filter" action="" method="get">
+<h2><?php printf( __( 'Manage Links (<a href="%s">add new</a>)' ), 'link-add.php' ); ?></h2>
+
+<p id="post-search">
+	<input type="text" id="post-search-input" name="s" value="<?php echo attribute_escape(stripslashes($_GET['s'])); ?>" />
+	<input type="submit" value="<?php _e( 'Search Links' ); ?>" class="button" />
+</p>
+
+<br class="clear" />
+
+<div class="tablenav">
+
+<div class="alignleft">
+<input type="submit" value="<?php _e('Delete'); ?>" name="deleteit" class="button-secondary delete" />
+<?php
+$categories = get_terms('link_category', "hide_empty=1");
 $select_cat = "<select name=\"cat_id\">\n";
-$select_cat .= '<option value="all"'  . (($cat_id == 'all') ? " selected='selected'" : '') . '>' . __('All') . "</option>\n";
+$select_cat .= '<option value="all"'  . (($cat_id == 'all') ? " selected='selected'" : '') . '>' . __('View all Categories') . "</option>\n";
 foreach ((array) $categories as $cat)
-	$select_cat .= '<option value="' . $cat->cat_ID . '"' . (($cat->cat_ID == $cat_id) ? " selected='selected'" : '') . '>' . wp_specialchars(apply_filters('link_category', $cat->cat_name)) . "</option>\n";
+	$select_cat .= '<option value="' . $cat->term_id . '"' . (($cat->term_id == $cat_id) ? " selected='selected'" : '') . '>' . sanitize_term_field('name', $cat->name, $cat->term_id, 'link_category', 'display') . "</option>\n";
 $select_cat .= "</select>\n";
 
 $select_order = "<select name=\"order_by\">\n";
-$select_order .= '<option value="order_id"' . (($order_by == 'order_id') ? " selected='selected'" : '') . '>' .  __('Link ID') . "</option>\n";
-$select_order .= '<option value="order_name"' . (($order_by == 'order_name') ? " selected='selected'" : '') . '>' .  __('Name') . "</option>\n";
-$select_order .= '<option value="order_url"' . (($order_by == 'order_url') ? " selected='selected'" : '') . '>' .  __('Address') . "</option>\n";
-$select_order .= '<option value="order_rating"' . (($order_by == 'order_rating') ? " selected='selected'" : '') . '>' .  __('Rating') . "</option>\n";
+$select_order .= '<option value="order_id"' . (($order_by == 'order_id') ? " selected='selected'" : '') . '>' .  __('Order by Link ID') . "</option>\n";
+$select_order .= '<option value="order_name"' . (($order_by == 'order_name') ? " selected='selected'" : '') . '>' .  __('Order by Name') . "</option>\n";
+$select_order .= '<option value="order_url"' . (($order_by == 'order_url') ? " selected='selected'" : '') . '>' .  __('Order by Address') . "</option>\n";
+$select_order .= '<option value="order_rating"' . (($order_by == 'order_rating') ? " selected='selected'" : '') . '>' .  __('Order by Rating') . "</option>\n";
 $select_order .= "</select>\n";
 
-printf(__('Currently showing %1$s links ordered by %2$s'), $select_cat, $select_order);
+echo $select_cat;
+echo $select_order;
+
 ?>
-<input type="submit" name="action" value="<?php _e('Update &raquo;') ?>" /></p>
-</form>
+<input type="submit" id="post-query-submit" value="<?php _e('Filter'); ?>" class="button-secondary" />
+
+</div>
+
+<br class="clear" />
+</div>
+
+<br class="clear" />
+
 <?php
 $link_columns = array(
-	'name'       => '<th width="15%">' . __('Name') . '</th>',
+	'name'       => '<th style="width: 15%;">' . __('Name') . '</th>',
 	'url'       => '<th>' . __('URL') . '</th>',
 	'categories' => '<th>' . __('Categories') . '</th>',
 	'rel'      => '<th style="text-align: center">' . __('rel') . '</th>',
 	'visible'   => '<th style="text-align: center">' . __('Visible') . '</th>',
-	'action'   => '<th colspan="2" style="text-align: center">' . __('Action') . '</th>',
 );
 $link_columns = apply_filters('manage_link_columns', $link_columns);
 ?>
@@ -109,31 +130,28 @@
 <?php
 if ( 'all' == $cat_id )
 	$cat_id = '';
-$links = get_bookmarks( "category=$cat_id&hide_invisible=0&orderby=$sqlorderby&hide_empty=0" );
+$args = array('category' => $cat_id, 'hide_invisible' => 0, 'orderby' => $sqlorderby, 'hide_empty' => 0);
+if ( !empty($_GET['s']) )
+	$args['search'] = $_GET['s'];
+$links = get_bookmarks( $args );
 if ( $links ) {
 ?>
 
-<form id="links" method="post" action="link.php">
 <?php wp_nonce_field('bulk-bookmarks') ?>
-<input type="hidden" name="link_id" value="" />
-<input type="hidden" name="action" value="" />
-<input type="hidden" name="order_by" value="<?php echo attribute_escape($order_by); ?>" />
-<input type="hidden" name="cat_id" value="<?php echo (int) $cat_id ?>" />
 <table class="widefat">
 	<thead>
 	<tr>
+	<th scope="col" class="check-column"><input type="checkbox" onclick="checkAll(document.getElementById('posts-filter'));" /></th>
 <?php foreach($link_columns as $column_display_name) {
 	echo $column_display_name;
 } ?>
-	<th style="text-align: center"><input type="checkbox" onclick="checkAll(document.getElementById('links'));" /></th>
 	</tr>
 	</thead>
-	<tbody id="the-list">
+	<tbody>
 <?php
 	foreach ($links as $link) {
-		$link->link_name = attribute_escape(apply_filters('link_title', $link->link_name));
-		$link->link_description = wp_specialchars(apply_filters('link_description', $link->link_description));
-		$link->link_url = clean_url($link->link_url);
+		$link = sanitize_bookmark($link);
+		$link->link_name = attribute_escape($link->link_name);
 		$link->link_category = wp_get_link_cats($link->link_id);
 		$short_url = str_replace('http://', '', $link->link_url);
 		$short_url = str_replace('www.', '', $short_url);
@@ -146,10 +164,12 @@
 		++ $i;
 		$style = ($i % 2) ? '' : ' class="alternate"';
 		?><tr id="link-<?php echo $link->link_id; ?>" valign="middle" <?php echo $style; ?>><?php
+		echo '<th scope="row" class="check-column"><input type="checkbox" name="linkcheck[]" value="'.$link->link_id.'" /></th>';
 		foreach($link_columns as $column_name=>$column_display_name) {
 			switch($column_name) {
 				case 'name':
-					?><td><strong><?php echo $link->link_name; ?></strong><br /><?php
+
+					echo "<td><strong><a class='row-title' href='link.php?link_id=$link->link_id&amp;action=edit' title='" . attribute_escape(sprintf(__('Edit "%s"'), $link->link_name)) . "' class='edit'>$link->link_name</a></strong><br />";
 					echo $link->link_description . "</td>";
 					break;
 				case 'url':
@@ -159,8 +179,10 @@
 					?><td><?php
 					$cat_names = array();
 					foreach ($link->link_category as $category) {
-						$cat_name = get_the_category_by_ID($category);
-						$cat_name = wp_specialchars(apply_filters('link_category', $cat_name));
+						$cat = get_term($category, 'link_category', OBJECT, 'display');
+						if ( is_wp_error( $cat ) )
+							echo $cat->get_error_message();
+						$cat_name = $cat->name;
 						if ( $cat_id != $category )
 							$cat_name = "<a href='link-manager.php?cat_id=$category'>$cat_name</a>";
 						$cat_names[] = $cat_name;
@@ -172,11 +194,7 @@
 					?><td><?php echo $link->link_rel; ?></td><?php
 					break;
 				case 'visible':
-					?><td align='center'><?php echo $visible; ?></td><?php
-					break;
-				case 'action':
-					echo '<td><a href="link.php?link_id='.$link->link_id.'&amp;action=edit" class="edit">'.__('Edit').'</a></td>';
-					echo '<td><a href="' . wp_nonce_url('link.php?link_id='.$link->link_id.'&amp;action=delete', 'delete-bookmark_' . $link->link_id ) . '"'." onclick=\"return deleteSomething( 'link', $link->link_id , '".js_escape(sprintf(__("You are about to delete the '%s' link to %s.\n'Cancel' to stop, 'OK' to delete."), $link->link_name, $link->link_url )).'\' );" class="delete">'.__('Delete').'</a></td>';
+					?><td style='text-align: center;'><?php echo $visible; ?></td><?php
 					break;
 				default:
 					?>
@@ -186,19 +204,23 @@
 
 			}
 		}
-		echo '<td align="center"><input type="checkbox" name="linkcheck[]" value="'.$link->link_id.'" /></td>';
 		echo "\n    </tr>\n";
 	}
 ?>
 	</tbody>
 </table>
 
+<?php } else { ?>
+<p><?php _e('No links found.') ?></p>
+<?php } ?>
+</form>
+
 <div id="ajax-response"></div>
 
-<p class="submit"><input type="submit" class="button" name="deletebookmarks" id="deletebookmarks" value="<?php _e('Delete Checked Links') ?> &raquo;" onclick="return confirm('<?php echo js_escape(__("You are about to delete these links permanently.\n'Cancel' to stop, 'OK' to delete.")); ?>')" /></p>
-</form>
+<div class="tablenav">
+<br class="clear" />
+</div>
 
-<?php } ?>
 
 </div>
 
diff -x .svn -aruN 2.2.2.src/wp-admin/link.php 2.5.src/wp-admin/link.php
--- 2.2.2.src/wp-admin/link.php	2006-11-19 20:17:07.000000000 -0600
+++ 2.5.src/wp-admin/link.php	2008-03-10 00:44:56.000000000 -0500
@@ -3,6 +3,9 @@
 
 wp_reset_vars(array('action', 'cat_id', 'linkurl', 'name', 'image', 'description', 'visible', 'target', 'category', 'link_id', 'submit', 'order_by', 'links_show_cat_id', 'rating', 'rel', 'notes', 'linkcheck[]'));
 
+if ( ! current_user_can('manage_links') )
+	wp_die( __('You do not have sufficient permissions to edit the links for this blog.') );
+
 if ('' != $_POST['deletebookmarks'])
 	$action = 'deletebookmarks';
 if ('' != $_POST['move'])
@@ -13,13 +16,9 @@
 $this_file = 'link-manager.php';
 
 switch ($action) {
-		case 'deletebookmarks' :
+	case 'deletebookmarks' :
 		check_admin_referer('bulk-bookmarks');
 
-		// check the current user's level first.
-		if (!current_user_can('manage_links'))
-			wp_die(__('Cheatin&#8217; uh?'));
-
 		//for each link id (in $linkcheck[]) change category to selected value
 		if (count($linkcheck) == 0) {
 			wp_redirect($this_file);
@@ -41,10 +40,6 @@
 	case 'move' :
 		check_admin_referer('bulk-bookmarks');
 
-		// check the current user's level first.
-		if (!current_user_can('manage_links'))
-			wp_die(__('Cheatin&#8217; uh?'));
-
 		//for each link id (in $linkcheck[]) change category to selected value
 		if (count($linkcheck) == 0) {
 			wp_redirect($this_file);
@@ -63,7 +58,7 @@
 
 		add_link();
 
-		wp_redirect(wp_get_referer().'?added=true');
+		wp_redirect( wp_get_referer() . '?added=true' );
 		exit;
 		break;
 
@@ -81,9 +76,6 @@
 		$link_id = (int) $_GET['link_id'];
 		check_admin_referer('delete-bookmark_' . $link_id);
 
-		if (!current_user_can('manage_links'))
-			wp_die(__('Cheatin&#8217; uh?'));
-
 		wp_delete_link($link_id);
 
 		wp_redirect($this_file);
@@ -91,27 +83,25 @@
 		break;
 
 	case 'edit' :
-		wp_enqueue_script( array('xfn', 'dbx-admin-key?pagenow=link.php') );
-		if ( current_user_can( 'manage_categories' ) )
-			wp_enqueue_script( 'ajaxcat' );
-		$parent_file = 'link-manager.php';
+		wp_enqueue_script('link');
+		wp_enqueue_script('xfn');
+		wp_enqueue_script('thickbox');
+
+		$parent_file = 'edit.php';
 		$submenu_file = 'link-manager.php';
 		$title = __('Edit Link');
-		include_once ('admin-header.php');
-		if (!current_user_can('manage_links'))
-			wp_die(__('You do not have sufficient permissions to edit the links for this blog.'));
 
 		$link_id = (int) $_GET['link_id'];
 
 		if (!$link = get_link_to_edit($link_id))
 			wp_die(__('Link not found.'));
 
+		include_once ('admin-header.php');
 		include ('edit-link-form.php');
+		include ('admin-footer.php');
 		break;
 
 	default :
 		break;
 }
-
-include ('admin-footer.php');
-?>
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/media-upload.php 2.5.src/wp-admin/media-upload.php
--- 2.2.2.src/wp-admin/media-upload.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/media-upload.php	2008-03-10 16:49:08.000000000 -0500
@@ -0,0 +1,41 @@
+<?php
+require_once('admin.php');
+wp_enqueue_script('swfupload');
+wp_enqueue_script('swfupload-degrade');
+wp_enqueue_script('swfupload-queue');
+wp_enqueue_script('swfupload-handlers');
+
+@header('Content-Type: ' . get_option('html_type') . '; charset=' . get_option('blog_charset'));
+
+if (!current_user_can('upload_files'))
+	wp_die(__('You do not have permission to upload files.'));
+
+// IDs should be integers
+$ID = isset($ID)? (int) $ID : 0;
+$post_id = isset($post_id)? (int) $post_id : 0;
+
+// Require an ID for the edit screen
+if ( isset($action) && $action == 'edit' && !$ID )
+	wp_die(__("You are not allowed to be here"));
+
+// upload type: image, video, file, ..?
+if ( isset($_GET['type']) )
+	$type = strval($_GET['type']);
+else
+	$type = apply_filters('media_upload_default_type', 'file');
+
+// tab: gallery, library, or type-specific
+if ( isset($_GET['tab']) )
+	$tab = strval($_GET['tab']);
+else
+	$tab = apply_filters('media_upload_default_tab', 'type');
+
+$body_id = 'media-upload';
+
+// let the action code decide how to handle the request
+if ( $tab == 'type' )
+	do_action("media_upload_$type");
+else
+	do_action("media_upload_$tab");
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/media.php 2.5.src/wp-admin/media.php
--- 2.2.2.src/wp-admin/media.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/media.php	2008-03-27 17:05:51.000000000 -0500
@@ -0,0 +1,102 @@
+<?php
+
+require_once('admin.php');
+
+$parent_file = 'edit.php';
+$submenu_file = 'upload.php';
+
+wp_reset_vars(array('action'));
+
+switch( $action ) :
+case 'editattachment' :
+	$errors = media_upload_form_handler();
+	$attachment_id = (int) $_POST['attachment_id'];
+	if ( empty($errors) ) {
+		$location = 'media.php';
+		if ( $referer = wp_get_original_referer() ) {
+			if ( false !== strpos($referer, 'upload.php') || ( url_to_postid($referer) == $attachment_id )  )
+				$location = $referer;
+		}
+		if ( false !== strpos($location, 'upload.php') ) {
+			$location = remove_query_arg('message', $location);
+			$location = add_query_arg('posted',	$attachment_id, $location);
+		} elseif ( false !== strpos($location, 'media.php') ) {
+			$location = add_query_arg('message', 'updated', $location);
+		}
+		wp_redirect($location);
+		exit;
+	}
+
+	// no break
+case 'edit' :
+	$title = __('Edit Media');
+
+	if ( empty($errors) )
+		$errors = null;
+
+	if ( empty( $_GET['attachment_id'] ) ) {
+		wp_redirect('upload.php');
+		exit();
+	}
+	$att_id = (int) $_GET['attachment_id'];
+	$att = get_post($att_id);
+
+	add_filter('attachment_fields_to_edit', 'media_single_attachment_fields_to_edit', 10, 2);
+
+	wp_enqueue_script( 'wp-ajax-response' );
+	add_action('admin_head', 'media_admin_css');
+
+	require( 'admin-header.php' );
+
+	$message = '';
+	$class = '';
+	if ( isset($_GET['message']) ) {
+		switch ( $_GET['message'] ) :
+		case 'updated' :
+			$message = __('Media attachment updated.');
+			$class = 'updated fade';
+			break;
+		endswitch;
+	}
+	if ( $message )
+		echo "<div id='message' class='$class'><p>$message</p></div>\n";
+
+?>
+
+<div class="wrap">
+
+<h2><?php _e( 'Edit Media' ); ?></h2>
+
+<form method="post" action="<?php echo clean_url( remove_query_arg( 'message' ) ); ?>" class="media-upload-form" id="media-single-form">
+<div id="media-items" class="media-single">
+<div id='media-item-<?php echo $att_id; ?>' class='media-item'>
+<?php echo get_media_item( $att_id, array( 'toggle' => false, 'send' => false, 'delete' => false, 'errors' => $errors ) ); ?>
+</div>
+</div>
+
+<p class="submit">
+<input type="submit" class="button" name="save" value="<?php _e('Save Changes'); ?>" />
+<input type="hidden" name="post_id" id="post_id" value="<?php echo $post_id; ?>" />
+<input type="hidden" name="attachment_id" id="attachment_id" value="<?php echo $att_id; ?>" />
+<input type="hidden" name="action" value="editattachment" />
+<?php wp_original_referer_field(true, 'previous'); ?>
+<?php wp_nonce_field('media-form'); ?>
+</p>
+
+
+</div>
+
+<?php
+
+	require( 'admin-footer.php' );
+
+	exit;
+
+default:
+	wp_redirect( 'upload.php' );
+	exit;
+
+endswitch;
+
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/menu-header.php 2.5.src/wp-admin/menu-header.php
--- 2.2.2.src/wp-admin/menu-header.php	2006-11-19 01:56:05.000000000 -0600
+++ 2.5.src/wp-admin/menu-header.php	2008-03-07 08:48:10.000000000 -0600
@@ -1,11 +1,46 @@
-<ul id="adminmenu">
 <?php
 $self = preg_replace('|^.*/wp-admin/|i', '', $_SERVER['PHP_SELF']);
 $self = preg_replace('|^.*/plugins/|i', '', $self);
 
 get_admin_page_parent();
 
-foreach ($menu as $item) {
+// We're going to do this loop three times
+?>
+
+<ul id="dashmenu">
+<?php
+foreach ( $menu as $key => $item ) {
+	if ( 3 < $key ) // get each menu item before 3
+		continue;
+	$class = '';
+	// 0 = name, 1 = capability, 2 = file
+	if (( strcmp($self, $item[2]) == 0 && empty($parent_file)) || ($parent_file && ($item[2] == $parent_file))) $class = ' class="current"';
+
+	if ( !empty($submenu[$item[2]]) ) {
+		$submenu[$item[2]] = array_values($submenu[$item[2]]);  // Re-index.
+		$menu_hook = get_plugin_page_hook($submenu[$item[2]][0][2], $item[2]);
+		if ( file_exists(ABSPATH . PLUGINDIR . "/{$submenu[$item[2]][0][2]}") || !empty($menu_hook))
+			echo "\n\t<li><a href='admin.php?page={$submenu[$item[2]][0][2]}'$class>{$item[0]}</a></li>";
+		else
+			echo "\n\t<li><a href='{$submenu[$item[2]][0][2]}'$class>{$item[0]}</a></li>";
+	} else if ( current_user_can($item[1]) ) {
+		$menu_hook = get_plugin_page_hook($item[2], 'admin.php');
+		if ( file_exists(ABSPATH . PLUGINDIR . "/{$item[2]}") || !empty($menu_hook) )
+			echo "\n\t<li><a href='admin.php?page={$item[2]}'$class>{$item[0]}</a></li>";
+		else
+			echo "\n\t<li><a href='{$item[2]}'$class>{$item[0]}</a></li>";
+	}
+}
+do_action( 'dashmenu' );
+?>
+</ul>
+
+<ul id="adminmenu">
+<?php
+foreach ( $menu as $key => $item ) {
+	if ( 5 > $key || $key > 25 ) // get each menu item before 3
+		continue;
+
 	$class = '';
 
 	// 0 = name, 1 = capability, 2 = file
@@ -19,16 +54,77 @@
 		else
 			echo "\n\t<li><a href='{$submenu[$item[2]][0][2]}'$class>{$item[0]}</a></li>";
 	} else if ( current_user_can($item[1]) ) {
-		if ( file_exists(ABSPATH . PLUGINDIR . "/{$item[2]}") )
+		$menu_hook = get_plugin_page_hook($item[2], 'admin.php');
+		if ( file_exists(ABSPATH . PLUGINDIR . "/{$item[2]}") || !empty($menu_hook) )
 			echo "\n\t<li><a href='admin.php?page={$item[2]}'$class>{$item[0]}</a></li>";
 		else
 			echo "\n\t<li><a href='{$item[2]}'$class>{$item[0]}</a></li>";
 	}
 }
 
+foreach ( $menu as $key => $item ) {
+	if ( $key < 41 ) // there is a more efficient way to do this!
+		continue;
+
+	$class = '';
+
+	// 0 = name, 1 = capability, 2 = file
+	if (( strcmp($self, $item[2]) == 0 && empty($parent_file)) || ($parent_file && ($item[2] == $parent_file))) $class = ' class="current"';
+
+	if ( !empty($submenu[$item[2]]) ) {
+		$submenu[$item[2]] = array_values($submenu[$item[2]]);  // Re-index.
+		$menu_hook = get_plugin_page_hook($submenu[$item[2]][0][2], $item[2]);
+		if ( file_exists(ABSPATH . PLUGINDIR . "/{$submenu[$item[2]][0][2]}") || !empty($menu_hook))
+			echo "\n\t<li><a href='admin.php?page={$submenu[$item[2]][0][2]}'$class>{$item[0]}</a></li>";
+		else
+			echo "\n\t<li><a href='{$submenu[$item[2]][0][2]}'$class>{$item[0]}</a></li>";
+	} else if ( current_user_can($item[1]) ) {
+		$menu_hook = get_plugin_page_hook($item[2], 'admin.php');
+		if ( file_exists(ABSPATH . PLUGINDIR . "/{$item[2]}") || !empty($menu_hook) )
+			echo "\n\t<li><a href='admin.php?page={$item[2]}'$class>{$item[0]}</a></li>";
+		else
+			echo "\n\t<li><a href='{$item[2]}'$class>{$item[0]}</a></li>";
+	}
+}
+
+do_action( 'adminmenu' );
 ?>
 </ul>
 
+<ul id="sidemenu">
+<?php
+$side_items = array();
+foreach ( $menu as $key => $item ) {
+	if ( 26 > $key || $key > 40 )
+		continue;
+
+	$class = '';
+
+	// 0 = name, 1 = capability, 2 = file
+	if (( strcmp($self, $item[2]) == 0 && empty($parent_file)) || ($parent_file && ($item[2] == $parent_file))) $class = ' class="current"';
+
+	if ( !empty($submenu[$item[2]]) ) {
+		$submenu[$item[2]] = array_values($submenu[$item[2]]);  // Re-index.
+		$menu_hook = get_plugin_page_hook($submenu[$item[2]][0][2], $item[2]);
+		if ( file_exists(ABSPATH . PLUGINDIR . "/{$submenu[$item[2]][0][2]}") || !empty($menu_hook))
+			$side_items[] = "\n\t<li><a href='admin.php?page={$submenu[$item[2]][0][2]}'$class>{$item[0]}</a>";
+		else
+			$side_items[] = "\n\t<li><a href='{$submenu[$item[2]][0][2]}'$class>{$item[0]}</a>";
+	} else if ( current_user_can($item[1]) ) {
+		$menu_hook = get_plugin_page_hook($item[2], 'admin.php');
+		if ( file_exists(ABSPATH . PLUGINDIR . "/{$item[2]}") || !empty($menu_hook) )
+			$side_items[] = "\n\t<li><a href='admin.php?page={$item[2]}'$class>{$item[0]}</a>";
+		else
+			$side_items[] = "\n\t<li><a href='{$item[2]}'$class>{$item[0]}</a>";
+	}
+}
+echo implode(' </li>', $side_items) . '</li>';
+unset($side_items);
+do_action( 'sidemenu' );
+?>
+</ul>
+
+
 <?php
 // Sub-menu
 if ( isset($submenu["$parent_file"]) ) :
diff -x .svn -aruN 2.2.2.src/wp-admin/menu.php 2.5.src/wp-admin/menu.php
--- 2.2.2.src/wp-admin/menu.php	2007-05-06 15:35:51.000000000 -0500
+++ 2.5.src/wp-admin/menu.php	2008-03-13 18:51:32.000000000 -0500
@@ -8,44 +8,44 @@
 
 if (strpos($_SERVER['REQUEST_URI'], 'edit-pages.php') !== false)
 	$menu[5] = array(__('Write'), 'edit_pages', 'page-new.php');
+elseif (strpos($_SERVER['REQUEST_URI'], 'link-manager.php') !== false)
+	$menu[5] = array(__('Write'), 'manage_links', 'link-add.php');
 else
 	$menu[5] = array(__('Write'), 'edit_posts', 'post-new.php');
+
 if (strpos($_SERVER['REQUEST_URI'], 'page-new.php') !== false)
 	$menu[10] = array(__('Manage'), 'edit_pages', 'edit-pages.php');
+elseif (strpos($_SERVER['REQUEST_URI'], 'link-add.php') !== false)
+	$menu[10] = array(__('Manage'), 'manage_links', 'link-manager.php');
 else
 	$menu[10] = array(__('Manage'), 'edit_posts', 'edit.php');
 
-$menu[15] = array(__('Comments'), 'edit_posts', 'edit-comments.php');
-$menu[20] = array(__('Blogroll'), 'manage_links', 'link-manager.php');
-$menu[25] = array(__('Presentation'), 'switch_themes', 'themes.php');
-$menu[30] = array(__('Plugins'), 'activate_plugins', 'plugins.php');
+$awaiting_mod = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = '0'");
+$menu[15] = array(__('Design'), 'switch_themes', 'themes.php');
+$menu[20] = array( sprintf( __('Comments %s'), "<span id='awaiting-mod' class='count-$awaiting_mod'><span class='comment-count'>$awaiting_mod</span></span>" ), 'edit_posts', 'edit-comments.php');
+$menu[30] = array(__('Settings'), 'manage_options', 'options-general.php');
+$menu[35] = array(__('Plugins'), 'activate_plugins', 'plugins.php');
 if ( current_user_can('edit_users') )
-	$menu[35] = array(__('Users'), 'edit_users', 'users.php');
+	$menu[40] = array(__('Users'), 'edit_users', 'users.php');
 else
-	$menu[35] = array(__('Profile'), 'read', 'profile.php');
-$menu[40] = array(__('Options'), 'manage_options', 'options-general.php');
-
+	$menu[40] = array(__('Profile'), 'read', 'profile.php');
 
 $_wp_real_parent_file['post.php'] = 'post-new.php'; // Back-compat
-$submenu['post-new.php'][5] = array(__('Write Post'), 'edit_posts', 'post-new.php');
-$submenu['post-new.php'][10] = array(__('Write Page'), 'edit_pages', 'page-new.php');
+$submenu['post-new.php'][5] = array(__('Post'), 'edit_posts', 'post-new.php');
+$submenu['post-new.php'][10] = array(__('Page'), 'edit_pages', 'page-new.php');
+$submenu['post-new.php'][15] = array(__('Link'), 'manage_links', 'link-add.php');
 
 $submenu['edit-comments.php'][5] = array(__('Comments'), 'edit_posts', 'edit-comments.php');
-$awaiting_mod = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = '0'");
-$submenu['edit-comments.php'][25] = array(sprintf(__("Awaiting Moderation (%s)"), "<span id='awaitmod'>$awaiting_mod</span>"), 'edit_posts', 'moderation.php');
-
 
 $submenu['edit.php'][5] = array(__('Posts'), 'edit_posts', 'edit.php');
 $submenu['edit.php'][10] = array(__('Pages'), 'edit_pages', 'edit-pages.php');
-$submenu['edit.php'][12] = array(__('Uploads'), 'upload_files', 'upload.php');
-$submenu['edit.php'][15] = array(__('Categories'), 'manage_categories', 'categories.php');
-$submenu['edit.php'][30] = array(__('Files'), 'edit_files', 'templates.php');
-$submenu['edit.php'][35] = array(__('Import'), 'import', 'import.php');
-$submenu['edit.php'][40] = array(__('Export'), 'import', 'export.php');
-
-$submenu['link-manager.php'][5] = array(__('Manage Blogroll'), 'manage_links', 'link-manager.php');
-$submenu['link-manager.php'][10] = array(__('Add Link'), 'manage_links', 'link-add.php');
-$submenu['link-manager.php'][20] = array(__('Import Links'), 'manage_links', 'link-import.php');
+$submenu['edit.php'][15] = array(__('Links'), 'manage_links', 'link-manager.php');
+$submenu['edit.php'][20] = array(__('Categories'), 'manage_categories', 'categories.php');
+$submenu['edit.php'][25] = array(__('Tags'), 'manage_categories', 'edit-tags.php');
+$submenu['edit.php'][30] = array(__('Link Categories'), 'manage_categories', 'edit-link-categories.php');
+$submenu['edit.php'][35] = array(__('Media Library'), 'upload_files', 'upload.php');
+$submenu['edit.php'][40] = array(__('Import'), 'import', 'import.php');
+$submenu['edit.php'][45] = array(__('Export'), 'import', 'export.php');
 
 if ( current_user_can('edit_users') ) {
 	$_wp_real_parent_file['profile.php'] = 'users.php'; // Back-compat for plugins adding submenus to profile.php.
@@ -95,7 +95,7 @@
 // Menus for which the original parent is not acessible due to lack of privs will have the next
 // submenu in line be assigned as the new menu parent.
 foreach ( $menu as $id => $data ) {
-	if ( empty($submenu[$data[2]]) ) 
+	if ( empty($submenu[$data[2]]) )
 		continue;
 	$subs = $submenu[$data[2]];
 	$first_sub = array_shift($subs);
@@ -136,6 +136,7 @@
 uksort($menu, "strnatcasecmp"); // make it all pretty
 
 if (! user_can_access_admin_page()) {
+	do_action('admin_page_access_denied');
 	wp_die( __('You do not have sufficient permissions to access this page.') );
 }
 
diff -x .svn -aruN 2.2.2.src/wp-admin/moderation.php 2.5.src/wp-admin/moderation.php
--- 2.2.2.src/wp-admin/moderation.php	2007-03-06 19:25:17.000000000 -0600
+++ 2.5.src/wp-admin/moderation.php	2008-02-25 13:29:30.000000000 -0600
@@ -1,206 +1,4 @@
 <?php
-require_once('admin.php');
-
-$title = __('Moderate comments');
-$parent_file = 'edit-comments.php';
-wp_enqueue_script( 'admin-comments' );
-
-wp_reset_vars(array('action', 'item_ignored', 'item_deleted', 'item_approved', 'item_spam', 'feelinglucky'));
-
-$comment = array();
-if (isset($_POST["comment"])) {
-	foreach ($_POST["comment"] as $k => $v) {
-		$comment[intval($k)] = $v;
-	}
-}
-
-switch($action) {
-
-case 'update':
-
-	check_admin_referer('moderate-comments');
-
-	if ( !current_user_can('moderate_comments') )
-		wp_die(__('Your level is not high enough to moderate comments.'));
-
-	$item_ignored = 0;
-	$item_deleted = 0;
-	$item_approved = 0;
-	$item_spam = 0;
-
-	foreach($comment as $key => $value) {
-	if ($feelinglucky && 'later' == $value)
-		$value = 'delete';
-		switch($value) {
-			case 'later':
-				// do nothing with that comment
-				// wp_set_comment_status($key, "hold");
-				++$item_ignored;
-				break;
-			case 'delete':
-				wp_set_comment_status($key, 'delete');
-				++$item_deleted;
-				break;
-			case 'spam':
-				wp_set_comment_status($key, 'spam');
-				++$item_spam;
-				break;
-			case 'approve':
-				wp_set_comment_status($key, 'approve');
-				if ( get_option('comments_notify') == true ) {
-					wp_notify_postauthor($key);
-				}
-				++$item_approved;
-				break;
-		}
-	}
-
-	$file = basename(__FILE__);
-	wp_redirect("$file?ignored=$item_ignored&deleted=$item_deleted&approved=$item_approved&spam=$item_spam");
-	exit();
-
-break;
-
-default:
-
-require_once('admin-header.php');
-
-if ( isset($_GET['deleted']) || isset($_GET['approved']) || isset($_GET['ignored']) ) {
-	echo "<div id='moderated' class='updated fade'>\n<p>";
-	$approved = (int) $_GET['approved'];
-	$deleted  = (int) $_GET['deleted'];
-	$ignored  = (int) $_GET['ignored'];
-	$spam     = (int) $_GET['spam'];
-	if ($approved) {
-		printf(__ngettext('%s comment approved', '%s comments approved', $approved), $approved);
-		echo "<br/>\n";
-	}
-	if ($deleted) {
-		printf(__ngettext('%s comment deleted', '%s comments deleted', $deleted), $deleted);
-		echo "<br/>\n";
-	}
-	if ($spam) {
-		printf(__ngettext('%s comment marked as spam', '%s comments marked as spam', $spam), $spam);
-		echo "<br/>\n";
-	}
-	if ($ignored) {
-		printf(__ngettext('%s comment unchanged', '%s comments unchanged', $ignored), $ignored);
-		echo "<br/>\n";
-	}
-	echo "</p></div>\n";
-}
-
-?>
-
-<div class="wrap">
-
-<?php
-if ( current_user_can('moderate_comments') )
-	$comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_approved = '0'");
-else
-	$comments = '';
-
-if ($comments) {
-    // list all comments that are waiting for approval
-    $file = basename(__FILE__);
-?>
-    <h2><?php _e('Moderation Queue') ?></h2>
-    <form name="approval" action="moderation.php" method="post">
-    <?php wp_nonce_field('moderate-comments') ?>
-    <input type="hidden" name="action" value="update" />
-    <ol id="the-comment-list" class="commentlist">
-<?php
-$i = 0;
-    foreach($comments as $comment) {
-	++$i;
-	$comment_date = mysql2date(get_option("date_format") . " @ " . get_option("time_format"), $comment->comment_date);
-	$post_title = $wpdb->get_var("SELECT post_title FROM $wpdb->posts WHERE ID='$comment->comment_post_ID'");
-	if ($i % 2) $class = 'js-unapproved alternate';
-	else $class = 'js-unapproved';
-	echo "\n\t<li id='comment-$comment->comment_ID' class='$class'>"; 
-	?>
-	<p><strong><?php comment_author() ?></strong> <?php if ($comment->comment_author_email) { ?>| <?php comment_author_email_link() ?> <?php } if ($comment->comment_author_url && 'http://' != $comment->comment_author_url) { ?> | <?php comment_author_url_link() ?> <?php } ?>| <?php _e('IP:') ?> <a href="http://ws.arin.net/cgi-bin/whois.pl?queryinput=<?php comment_author_IP() ?>"><?php comment_author_IP() ?></a></p>
-<?php comment_text() ?>
-<p><?php comment_date(__('M j, g:i A')); ?> &#8212; [ <?php
-echo '<a href="comment.php?action=editcomment&amp;c='.$comment->comment_ID.'">' . __('Edit') . '</a> | ';
-echo " <a href=\"post.php?action=deletecomment&amp;p=".$comment->comment_post_ID."&amp;comment=".$comment->comment_ID."\" onclick=\"return deleteSomething( 'comment', $comment->comment_ID, '" . js_escape(sprintf(__("You are about to delete this comment by '%s'.\n'Cancel' to stop, 'OK' to delete."), $comment->comment_author )) . "', theCommentList );\">" . __('Delete') . "</a> | "; ?>
-<?php
-$post = get_post($comment->comment_post_ID);
-$post_title = wp_specialchars( $post->post_title, 'double' );
-$post_title = ('' == $post_title) ? "# $comment->comment_post_ID" : $post_title;
-?>
-<a href="<?php echo get_permalink($comment->comment_post_ID); ?>" title="<?php echo $post_title; ?>"><?php _e('View Post') ?></a> ] &#8212;
- <?php _e('Bulk action:') ?>
-	<input type="radio" name="comment[<?php echo $comment->comment_ID; ?>]" id="comment-<?php echo $comment->comment_ID; ?>-approve" value="approve" /> <label for="comment-<?php echo $comment->comment_ID; ?>-approve"><?php _e('Approve') ?></label> &nbsp;
-	<input type="radio" name="comment[<?php echo $comment->comment_ID; ?>]" id="comment-<?php echo $comment->comment_ID; ?>-spam" value="spam" /> <label for="comment-<?php echo $comment->comment_ID; ?>-spam"><?php _e('Spam') ?></label> &nbsp;
-	<input type="radio" name="comment[<?php echo $comment->comment_ID; ?>]" id="comment-<?php echo $comment->comment_ID; ?>-delete" value="delete" /> <label for="comment-<?php echo $comment->comment_ID; ?>-delete"><?php _e('Delete') ?></label> &nbsp;
-	<input type="radio" name="comment[<?php echo $comment->comment_ID; ?>]" id="comment-<?php echo $comment->comment_ID; ?>-nothing" value="later" checked="checked" /> <label for="comment-<?php echo $comment->comment_ID; ?>-nothing"><?php _e('Defer until later') ?></label>
-	</p>
-
-	</li>
-<?php
-	}
-?>
-	</ol>
-
-<div id="ajax-response"></div>
-
-<p class="submit"><input type="submit" name="submit" value="<?php _e('Bulk Moderate Comments &raquo;') ?>" /></p>
-<script type="text/javascript">
-// <![CDATA[
-function markAllForDelete() {
-	for (var i=0; i< document.approval.length; i++) {
-		if (document.approval[i].value == "delete") {
-			document.approval[i].checked = true;
-		}
-	}
-}
-function markAllForApprove() {
-	for (var i=0; i< document.approval.length; i++) {
-		if (document.approval[i].value == "approve") {
-			document.approval[i].checked = true;
-		}
-	}
-}
-function markAllForDefer() {
-	for (var i=0; i< document.approval.length; i++) {
-		if (document.approval[i].value == "later") {
-			document.approval[i].checked = true;
-		}
-	}
-}
-function markAllAsSpam() {
-	for (var i=0; i< document.approval.length; i++) {
-		if (document.approval[i].value == "spam") {
-			document.approval[i].checked = true;
-		}
-	}
-}
-document.write('<ul><li><a href="javascript:markAllForApprove()"><?php _e('Mark all for approval'); ?></a></li><li><a href="javascript:markAllAsSpam()"><?php _e('Mark all as spam'); ?></a></li><li><a href="javascript:markAllForDelete()"><?php _e('Mark all for deletion'); ?></a></li><li><a href="javascript:markAllForDefer()"><?php _e('Mark all for later'); ?></a></li></ul>');
-// ]]>
-</script>
-
-<noscript>
-	<p>
-		<input name="feelinglucky" type="checkbox" id="feelinglucky" value="true" /> <label for="feelinglucky"><?php _e('Delete every comment marked "defer." <strong>Warning: This can&#8217;t be undone.</strong>'); ?></label>
-	</p>
-</noscript>
-</form>
-<?php
-} else {
-	// nothing to approve
-	echo '<p>'.__("Currently there are no comments for you to moderate.") . "</p>\n";
-}
-?>
-
-</div>
-
-<?php
-
-break;
-}
-
-
-include('admin-footer.php');
-
+require_once('../wp-config.php');
+wp_redirect('edit-comments.php?comment_status=moderated');
 ?>
diff -x .svn -aruN 2.2.2.src/wp-admin/options-discussion.php 2.5.src/wp-admin/options-discussion.php
--- 2.2.2.src/wp-admin/options-discussion.php	2007-01-15 20:27:00.000000000 -0600
+++ 2.5.src/wp-admin/options-discussion.php	2008-03-24 03:28:15.000000000 -0500
@@ -1,86 +1,124 @@
 <?php
 require_once('admin.php');
 
-$title = __('Discussion Options');
+$title = __('Discussion Settings');
 $parent_file = 'options-general.php';
 
 include('admin-header.php');
 ?>
 
-<div class="wrap"> 
-<h2><?php _e('Discussion Options') ?></h2> 
-<form method="post" action="options.php"> 
+<div class="wrap">
+<h2><?php _e('Discussion Settings') ?></h2>
+<form method="post" action="options.php">
 <?php wp_nonce_field('update-options') ?>
-<p class="submit"><input type="submit" name="Submit" value="<?php _e('Update Options &raquo;') ?>" /></p>
-<fieldset class="options">
-<legend><?php echo __('Usual settings for an article:').'<br /><small><em>('.__('These settings may be overridden for individual articles.').')</em></small>'; ?></legend> 
-<ul> 
-<li> 
-<label for="default_pingback_flag"> 
-<input name="default_pingback_flag" type="checkbox" id="default_pingback_flag" value="1" <?php checked('1', get_option('default_pingback_flag')); ?> /> 
-<?php _e('Attempt to notify any Weblogs linked to from the article (slows down posting.)') ?></label> 
-</li> 
-<li> 
-<label for="default_ping_status"> 
-<input name="default_ping_status" type="checkbox" id="default_ping_status" value="open" <?php checked('open', get_option('default_ping_status')); ?> /> 
-<?php _e('Allow link notifications from other Weblogs (pingbacks and trackbacks.)') ?></label> 
-</li> 
-<li> 
-<label for="default_comment_status"> 
-<input name="default_comment_status" type="checkbox" id="default_comment_status" value="open" <?php checked('open', get_option('default_comment_status')); ?> /> 
-<?php _e('Allow people to post comments on the article') ?></label> 
-</li> 
-</ul> 
-</fieldset>
-<fieldset class="options">
-<legend><?php _e('E-mail me whenever:') ?></legend> 
-<ul> 
-<li> 
-<label for="comments_notify"> 
-<input name="comments_notify" type="checkbox" id="comments_notify" value="1" <?php checked('1', get_option('comments_notify')); ?> /> 
-<?php _e('Anyone posts a comment') ?> </label> 
-</li> 
-<li> 
-<label for="moderation_notify"> 
-<input name="moderation_notify" type="checkbox" id="moderation_notify" value="1" <?php checked('1', get_option('moderation_notify')); ?> /> 
-<?php _e('A comment is held for moderation') ?> </label> 
-</li> 
-</ul> 
-</fieldset>
-<fieldset class="options">
-<legend><?php _e('Before a comment appears:') ?></legend> 
-<ul>
-<li>
-<label for="comment_moderation"> 
-<input name="comment_moderation" type="checkbox" id="comment_moderation" value="1" <?php checked('1', get_option('comment_moderation')); ?> /> 
-<?php _e('An administrator must always approve the comment') ?> </label> 
-</li> 
-<li><label for="require_name_email"><input type="checkbox" name="require_name_email" id="require_name_email" value="1" <?php checked('1', get_option('require_name_email')); ?> /> <?php _e('Comment author must fill out name and e-mail') ?></label></li> 
-<li><label for="comment_whitelist"><input type="checkbox" name="comment_whitelist" id="comment_whitelist" value="1" <?php checked('1', get_option('comment_whitelist')); ?> /> <?php _e('Comment author must have a previously approved comment') ?></label></li> 
-</ul> 
-</fieldset>
-<fieldset class="options">
-<legend><?php _e('Comment Moderation') ?></legend>
+<table class="form-table">
+<tr valign="top">
+<th scope="row"><?php _e('Default article settings') ?></th>
+<td>
+<label for="default_pingback_flag">
+<input name="default_pingback_flag" type="checkbox" id="default_pingback_flag" value="1" <?php checked('1', get_option('default_pingback_flag')); ?> />
+<?php _e('Attempt to notify any blogs linked to from the article (slows down posting.)') ?></label>
+<br />
+<label for="default_ping_status">
+<input name="default_ping_status" type="checkbox" id="default_ping_status" value="open" <?php checked('open', get_option('default_ping_status')); ?> />
+<?php _e('Allow link notifications from other blogs (pingbacks and trackbacks.)') ?></label>
+<br />
+<label for="default_comment_status">
+<input name="default_comment_status" type="checkbox" id="default_comment_status" value="open" <?php checked('open', get_option('default_comment_status')); ?> />
+<?php _e('Allow people to post comments on the article') ?></label>
+<br />
+<small><em><?php echo '(' . __('These settings may be overridden for individual articles.') . ')'; ?></em></small>
+</td>
+</tr>
+<tr valign="top">
+<th scope="row"><?php _e('E-mail me whenever') ?></th>
+<td>
+<label for="comments_notify">
+<input name="comments_notify" type="checkbox" id="comments_notify" value="1" <?php checked('1', get_option('comments_notify')); ?> />
+<?php _e('Anyone posts a comment') ?> </label>
+<br />
+<label for="moderation_notify">
+<input name="moderation_notify" type="checkbox" id="moderation_notify" value="1" <?php checked('1', get_option('moderation_notify')); ?> />
+<?php _e('A comment is held for moderation') ?> </label>
+</td>
+</tr>
+<tr valign="top">
+<th scope="row"><?php _e('Before a comment appears') ?></th>
+<td>
+<label for="comment_moderation">
+<input name="comment_moderation" type="checkbox" id="comment_moderation" value="1" <?php checked('1', get_option('comment_moderation')); ?> />
+<?php _e('An administrator must always approve the comment') ?> </label>
+<br />
+<label for="require_name_email"><input type="checkbox" name="require_name_email" id="require_name_email" value="1" <?php checked('1', get_option('require_name_email')); ?> /> <?php _e('Comment author must fill out name and e-mail') ?></label>
+<br />
+<label for="comment_whitelist"><input type="checkbox" name="comment_whitelist" id="comment_whitelist" value="1" <?php checked('1', get_option('comment_whitelist')); ?> /> <?php _e('Comment author must have a previously approved comment') ?></label>
+</td>
+</tr>
+<tr valign="top">
+<th scope="row"><?php _e('Comment Moderation') ?></th>
+<td>
 <p><?php printf(__('Hold a comment in the queue if it contains %s or more links. (A common characteristic of comment spam is a large number of hyperlinks.)'), '<input name="comment_max_links" type="text" id="comment_max_links" size="3" value="' . get_option('comment_max_links'). '" />' ) ?></p>
 
-<p><?php _e('When a comment contains any of these words in its content, name, URL, e-mail, or IP, it will be held in the <a href="moderation.php">moderation queue</a>. One word or IP per line. It will match inside words, so "press" will match "WordPress".') ?></p>
-<p> 
-<textarea name="moderation_keys" cols="60" rows="4" id="moderation_keys" style="width: 98%; font-size: 12px;" class="code"><?php form_option('moderation_keys'); ?></textarea> 
-</p> 
-</fieldset>
-<fieldset class="options">
-<legend><?php _e('Comment Blacklist') ?></legend>
+<p><?php _e('When a comment contains any of these words in its content, name, URL, e-mail, or IP, it will be held in the <a href="edit-comments.php?comment_status=moderated">moderation queue</a>. One word or IP per line. It will match inside words, so "press" will match "WordPress".') ?></p>
+<p>
+<textarea name="moderation_keys" cols="60" rows="10" id="moderation_keys" style="width: 98%; font-size: 12px;" class="code"><?php form_option('moderation_keys'); ?></textarea>
+</p>
+</td>
+</tr>
+<tr valign="top">
+<th scope="row"><?php _e('Comment Blacklist') ?></th>
+<td>
 <p><?php _e('When a comment contains any of these words in its content, name, URL, e-mail, or IP, it will be marked as spam. One word or IP per line. It will match inside words, so "press" will match "WordPress".') ?></p>
-<p> 
-<textarea name="blacklist_keys" cols="60" rows="4" id="blacklist_keys" style="width: 98%; font-size: 12px;" class="code"><?php form_option('blacklist_keys'); ?></textarea> 
+<p>
+<textarea name="blacklist_keys" cols="60" rows="10" id="blacklist_keys" style="width: 98%; font-size: 12px;" class="code"><?php form_option('blacklist_keys'); ?></textarea>
 </p>
-</fieldset>
+</td>
+</tr>
+</table>
+
+<h3><?php _e('Avatars') ?></h3>
+
+<p><?php _e('By default WordPress uses <a href="http://gravatar.com/">Gravatars</a> &#8212; short for Globally Recognized Avatars &#8212; for the pictures that show up next to comments. Plugins may override this.'); ?></p>
+
+<?php // the above would be a good place to link to codex documentation on the gravatar functions, for putting it in themes. anything like that? ?>
+
+<table class="form-table">
+<tr valign="top">
+<th scope="row"><?php _e('Avatar display') ?></th>
+<td>
+<?php
+	$yesorno = array(0 => __("Don&#8217;t show Avatars"), 1 => __('Show Avatars'));
+	foreach ( $yesorno as $key => $value) {
+		$selected = (get_option('show_avatars') == $key) ? 'checked="checked"' : '';
+		echo "\n\t<label><input type='radio' name='show_avatars' value='$key' $selected> $value</label><br />";
+	}
+?>
+</td>
+</tr>
+<tr valign="top">
+<th scope="row"><?php _e('Maximum Rating') ?></th>
+<td>
+
+<?php
+$ratings = array( 'G' => __('G &#8212; Suitable for all audiences'), 'PG' => __('PG &#8212; Possibly offensive, usually for audiences 13 and above'), 'R' => __('R &#8212; Intended for adult audiences above 17'), 'X' => __('X &#8212; Even more mature than above'));
+foreach ($ratings as $key => $rating) :
+	$selected = (get_option('avatar_rating') == $key) ? 'checked="checked"' : '';
+	echo "\n\t<label><input type='radio' name='avatar_rating' value='$key' $selected> $rating</label><br />";
+endforeach;
+?>
+
+</td>
+</tr>
+
+</table>
+
+
 <p class="submit">
-<input type="hidden" name="action" value="update" /> 
-<input type="hidden" name="page_options" value="default_pingback_flag,default_ping_status,default_comment_status,comments_notify,moderation_notify,comment_moderation,require_name_email,comment_whitelist,comment_max_links,moderation_keys,blacklist_keys" /> 
-<input type="submit" name="Submit" value="<?php _e('Update Options &raquo;') ?>" /> 
+<input type="hidden" name="action" value="update" />
+<input type="hidden" name="page_options" value="default_pingback_flag,default_ping_status,default_comment_status,comments_notify,moderation_notify,comment_moderation,require_name_email,comment_whitelist,comment_max_links,moderation_keys,blacklist_keys,show_avatars,avatar_rating" />
+<input type="submit" name="Submit" value="<?php _e('Save Changes') ?>" />
 </p>
 </form>
 </div>
 
-<?php include('./admin-footer.php'); ?>
\ No newline at end of file
+<?php include('./admin-footer.php'); ?>
diff -x .svn -aruN 2.2.2.src/wp-admin/options-general.php 2.5.src/wp-admin/options-general.php
--- 2.2.2.src/wp-admin/options-general.php	2007-05-04 19:19:25.000000000 -0500
+++ 2.5.src/wp-admin/options-general.php	2008-03-24 03:28:15.000000000 -0500
@@ -1,88 +1,104 @@
 <?php
 require_once('./admin.php');
 
-$title = __('General Options');
+$title = __('General Settings');
 $parent_file = 'options-general.php';
 
 include('./admin-header.php');
 ?>
- 
+
 <div class="wrap">
-<h2><?php _e('General Options') ?></h2>
-<form method="post" action="options.php"> 
+<h2><?php _e('General Settings') ?></h2>
+<form method="post" action="options.php">
 <?php wp_nonce_field('update-options') ?>
-<p class="submit"><input type="submit" name="Submit" value="<?php _e('Update Options &raquo;') ?>" /></p>
-<table class="optiontable"> 
-<tr valign="top"> 
-<th scope="row"><?php _e('Weblog title:') ?></th> 
-<td><input name="blogname" type="text" id="blogname" value="<?php form_option('blogname'); ?>" size="40" /></td> 
-</tr> 
-<tr valign="top"> 
-<th scope="row"><?php _e('Tagline:') ?></th> 
+<table class="form-table">
+<tr valign="top">
+<th scope="row"><?php _e('Blog Title') ?></th>
+<td><input name="blogname" type="text" id="blogname" value="<?php form_option('blogname'); ?>" size="40" /></td>
+</tr>
+<tr valign="top">
+<th scope="row"><?php _e('Tagline') ?></th>
 <td><input name="blogdescription" type="text" id="blogdescription" style="width: 95%" value="<?php form_option('blogdescription'); ?>" size="45" />
 <br />
-<?php _e('In a few words, explain what this weblog is about.') ?></td> 
-</tr> 
-<tr valign="top"> 
-<th scope="row"><?php _e('WordPress address (URL):') ?></th> 
-<td><input name="siteurl" type="text" id="siteurl" value="<?php form_option('siteurl'); ?>" size="40" class="code<?php if ( defined( 'WP_SITEURL' ) ) : ?> disabled" disabled="disabled"<?php else: ?>"<?php endif; ?> /></td> 
-</tr> 
+<?php _e('In a few words, explain what this blog is about.') ?></td>
+</tr>
+<tr valign="top">
+<th scope="row"><?php _e('WordPress address (URL)') ?></th>
+<td><input name="siteurl" type="text" id="siteurl" value="<?php form_option('siteurl'); ?>" size="40" class="code<?php if ( defined( 'WP_SITEURL' ) ) : ?> disabled" disabled="disabled"<?php else: ?>"<?php endif; ?> /></td>
+</tr>
 <tr valign="top">
-<th scope="row"><?php _e('Blog address (URL):') ?></th>
+<th scope="row"><?php _e('Blog address (URL)') ?></th>
 <td><input name="home" type="text" id="home" value="<?php form_option('home'); ?>" size="40" class="code<?php if ( defined( 'WP_HOME' ) ) : ?> disabled" disabled="disabled"<?php else: ?>"<?php endif; ?> /><br /><?php _e('Enter the address here if you want your blog homepage <a href="http://codex.wordpress.org/Giving_WordPress_Its_Own_Directory">to be different from the directory</a> you installed WordPress.'); ?></td>
 </tr>
-<tr valign="top"> 
-<th scope="row"><?php _e('E-mail address:') ?> </th> 
+<tr valign="top">
+<th scope="row"><?php _e('E-mail address') ?> </th>
 <td><input name="admin_email" type="text" id="admin_email" value="<?php form_option('admin_email'); ?>" size="40" class="code" />
 <br />
-<?php _e('This address is used only for admin purposes.') ?></td> 
+<?php _e('This address is used for admin purposes, like new user notification.') ?></td>
 </tr>
-<tr valign="top"> 
-<th scope="row"><?php _e('Membership:') ?></th> 
-<td> <label for="users_can_register"> 
-<input name="users_can_register" type="checkbox" id="users_can_register" value="1" <?php checked('1', get_option('users_can_register')); ?> /> 
+<tr valign="top">
+<th scope="row"><?php _e('Membership') ?></th>
+<td> <label for="users_can_register">
+<input name="users_can_register" type="checkbox" id="users_can_register" value="1" <?php checked('1', get_option('users_can_register')); ?> />
 <?php _e('Anyone can register') ?></label><br />
 <label for="comment_registration">
-<input name="comment_registration" type="checkbox" id="comment_registration" value="1" <?php checked('1', get_option('comment_registration')); ?> /> 
+<input name="comment_registration" type="checkbox" id="comment_registration" value="1" <?php checked('1', get_option('comment_registration')); ?> />
 <?php _e('Users must be registered and logged in to comment') ?>
 </label>
-</td> 
-</tr> 
-<tr valign="top"> 
-<th scope="row"><?php _e('New User Default Role:') ?></th> 
-<td><label for="default_role"> 
+</td>
+</tr>
+<tr valign="top">
+<th scope="row"><?php _e('New User Default Role') ?></th>
+<td><label for="default_role">
 <select name="default_role" id="default_role"><?php wp_dropdown_roles( get_option('default_role') ); ?></select></label>
-</td> 
-</tr> 
-</table> 
-<fieldset class="options"> 
-<legend><?php _e('Date and Time') ?></legend> 
-<table class="optiontable"> 
-<tr> 
-<th scope="row"><?php _e('<abbr title="Coordinated Universal Time">UTC</abbr> time is:') ?> </th> 
-<td><code><?php echo gmdate(__('Y-m-d g:i:s a')); ?></code></td> 
+</td>
 </tr>
 <tr>
-<th scope="row"><?php _e('Times in the weblog should differ by:') ?> </th>
-<td><input name="gmt_offset" type="text" id="gmt_offset" size="2" value="<?php form_option('gmt_offset'); ?>" /> 
-<?php _e('hours') ?> (<?php _e('Your timezone offset, for example <code>-6</code> for Central Time.'); ?>)</td>
+<th scope="row"><?php _e('Timezone') ?> </th>
+<td>
+<select name="gmt_offset">
+<?php
+$current_offset = get_option('gmt_offset');
+$offset_range = array (-12, -11.5, -11, -10.5, -10, -9.5, -9, -8.5, -8, -7.5, -7, -6.5, -6, -5.5, -5, -4.5, -4, -3.5, -3, -2.5, -2, -1.5, -1, -0.5,
+	0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 5.75, 6, 6.5, 7, 7.5, 8, 8.5, 8.75, 9, 9.5, 10, 10.5, 11, 11.5, 12, 12.75, 13, 13.75, 14);
+foreach ( $offset_range as $offset ) {
+	if ( 0 < $offset )
+		$offset_name = '+' . $offset;
+	elseif ( 0 == $offset )
+		$offset_name = '';
+	else
+		$offset_name = (string) $offset;
+
+	$offset_name = str_replace(array('.25','.5','.75'), array(':15',':30',':45'), $offset_name);
+
+	$selected = '';
+	if ( $current_offset == $offset ) {
+		$selected = " selected='selected'";
+		$current_offset_name = $offset_name;
+	}
+	echo "<option value=\"$offset\"$selected>" . sprintf(__('UTC %s'), $offset_name) . '</option>';
+}
+?>
+</select>
+<?php _e('hours') ?><br />
+<?php printf(__('<abbr title="Coordinated Universal Time">UTC</abbr> time is <code>%s</code>'), gmdate(__('Y-m-d G:i:s'))); ?><br />
+<?php if ($current_offset) printf(__('UTC %1$s is <code>%2$s</code>'), $current_offset_name, gmdate(__('Y-m-d G:i:s'), current_time('timestamp'))); ?><br />
+<?php _e('Unfortunately, you have to manually update this for Daylight Savings Time. Lame, we know, but will be fixed in the future.'); ?>
+</td>
 </tr>
 <tr>
-<th scope="row"><?php _e('Default date format:') ?></th>
+<th scope="row"><?php _e('Date Format') ?></th>
 <td><input name="date_format" type="text" id="date_format" size="30" value="<?php form_option('date_format'); ?>" /><br />
 <?php _e('Output:') ?> <strong><?php echo mysql2date(get_option('date_format'), current_time('mysql')); ?></strong></td>
 </tr>
 <tr>
-<th scope="row"><?php _e('Default time format:') ?></th>
+<th scope="row"><?php _e('Time Format') ?></th>
 <td><input name="time_format" type="text" id="time_format" size="30" value="<?php form_option('time_format'); ?>" /><br />
-<?php _e('Output:') ?> <strong><?php echo gmdate(get_option('time_format'), current_time('timestamp')); ?></strong></td>
-</tr> 
-<tr>
-<th scope="row">&nbsp;</th>
-<td><?php _e('<a href="http://codex.wordpress.org/Formatting_Date_and_Time">Documentation on date formatting</a>. Click "Update options" to update sample output.') ?> </td>
+<?php _e('Output:') ?> <strong><?php echo gmdate(get_option('time_format'), current_time('timestamp')); ?></strong><br />
+<?php _e('<a href="http://codex.wordpress.org/Formatting_Date_and_Time">Documentation on date formatting</a>. Click "Save Changes" to update sample output.') ?></td>
 </tr>
 <tr>
-<th scope="row"><?php _e('Weeks in the calendar should start on:') ?></th>
+<th scope="row"><?php _e('Week Starts On') ?></th>
 <td><select name="start_of_week" id="start_of_week">
 <?php
 for ($day_index = 0; $day_index <= 6; $day_index++) :
@@ -93,14 +109,13 @@
 </select></td>
 </tr>
 </table>
-</fieldset> 
 
-<p class="submit"><input type="submit" name="Submit" value="<?php _e('Update Options &raquo;') ?>" />
-<input type="hidden" name="action" value="update" /> 
-<input type="hidden" name="page_options" value="<?php if ( ! defined( 'WP_SITEURL' ) ) echo 'siteurl,'; if ( ! defined( 'WP_HOME' ) ) echo 'home,'; ?>blogname,blogdescription,admin_email,users_can_register,gmt_offset,date_format,time_format,start_of_week,comment_registration,default_role" /> 
+<p class="submit"><input type="submit" name="Submit" value="<?php _e('Save Changes') ?>" />
+<input type="hidden" name="action" value="update" />
+<input type="hidden" name="page_options" value="<?php if ( ! defined( 'WP_SITEURL' ) ) echo 'siteurl,'; if ( ! defined( 'WP_HOME' ) ) echo 'home,'; ?>blogname,blogdescription,admin_email,users_can_register,gmt_offset,date_format,time_format,start_of_week,comment_registration,default_role" />
 </p>
 </form>
 
-</div> 
+</div>
 
 <?php include('./admin-footer.php') ?>
diff -x .svn -aruN 2.2.2.src/wp-admin/options-head.php 2.5.src/wp-admin/options-head.php
--- 2.2.2.src/wp-admin/options-head.php	2007-03-16 03:10:02.000000000 -0500
+++ 2.5.src/wp-admin/options-head.php	2008-02-13 18:39:38.000000000 -0600
@@ -1,5 +1,5 @@
 <?php wp_reset_vars(array('action', 'standalone', 'option_group_id')); ?>
 
 <?php if (isset($_GET['updated'])) : ?>
-<div id="message" class="updated fade"><p><strong><?php _e('Options saved.') ?></strong></p></div>
+<div id="message" class="updated fade"><p><strong><?php _e('Settings saved.') ?></strong></p></div>
 <?php endif; ?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/options-misc.php 2.5.src/wp-admin/options-misc.php
--- 2.2.2.src/wp-admin/options-misc.php	2007-03-06 19:35:39.000000000 -0600
+++ 2.5.src/wp-admin/options-misc.php	2008-03-24 03:28:15.000000000 -0500
@@ -1,7 +1,7 @@
 <?php
 require_once('admin.php');
 
-$title = __('Miscellaneous Options');
+$title = __('Miscellaneous Settings');
 $parent_file = 'options-general.php';
 
 include('admin-header.php');
@@ -9,42 +9,89 @@
 ?>
 
 <div class="wrap">
-<h2><?php _e('Miscellaneous Options') ?></h2>
+<h2><?php _e('Miscellaneous Settings') ?></h2>
 <form method="post" action="options.php">
 <?php wp_nonce_field('update-options') ?>
-<p class="submit"><input type="submit" name="Submit" value="<?php _e('Update Options &raquo;') ?>" /></p>
-<fieldset class="options">
-<legend><?php _e('Uploading'); ?></legend>
-<table class="editform optiontable">
+<h3><?php _e('Uploading'); ?></h3>
+<table class="form-table">
 <tr valign="top">
-<th scope="row"><?php _e('Store uploads in this folder'); ?>:</th>
+<th scope="row"><?php _e('Store uploads in this folder'); ?></th>
 <td><input name="upload_path" type="text" id="upload_path" class="code" value="<?php echo attribute_escape(str_replace(ABSPATH, '', get_option('upload_path'))); ?>" size="40" />
 <br />
 <?php _e('Default is <code>wp-content/uploads</code>'); ?>
 </td>
 </tr>
+
+<tr valign="top">
+<th scope="row"><?php _e('Full URL path to files (optional)'); ?></th>
+<td><input name="upload_url_path" type="text" id="upload_url_path" class="code" value="<?php echo attribute_escape( get_option('upload_url_path')); ?>" size="40" />
+</td>
+</tr>
+
 <tr>
-<td></td>
-<td>
+<th scope="row" colspan="2" class="th-full">
 <label for="uploads_use_yearmonth_folders">
 <input name="uploads_use_yearmonth_folders" type="checkbox" id="uploads_use_yearmonth_folders" value="1" <?php checked('1', get_option('uploads_use_yearmonth_folders')); ?> />
 <?php _e('Organize my uploads into month- and year-based folders'); ?>
 </label>
+</th>
+</tr>
+</table>
+
+<h3><?php _e('Image sizes') ?></h3>
+<p><?php _e('The sizes listed below determine the maximum dimensions to use when inserting an image into the body of a post.'); ?></p>
+
+<table class="form-table">
+<tr valign="top">
+<th scope="row"><?php _e('Thumbnail size') ?></th>
+<td>
+<label for="thumbnail_size_w"><?php _e('Width'); ?></label>
+<input name="thumbnail_size_w" type="text" id="thumbnail_size_w" value="<?php form_option('thumbnail_size_w'); ?>" size="6" />
+<label for="thumbnail_size_h"><?php _e('Height'); ?></label>
+<input name="thumbnail_size_h" type="text" id="thumbnail_size_h" value="<?php form_option('thumbnail_size_h'); ?>" size="6" /><br />
+<input name="thumbnail_crop" type="checkbox" id="thumbnail_crop" value="1" <?php checked('1', get_option('thumbnail_crop')); ?>/>
+<label for="thumbnail_crop"><?php _e('Crop thumbnail to exact dimensions (normally thumbnails are proportional)'); ?></label>
+</td>
+</tr>
+<tr valign="top">
+<th scope="row"><?php _e('Medium size') ?></th>
+<td>
+<label for="medium_size_w"><?php _e('Max Width'); ?></label>
+<input name="medium_size_w" type="text" id="medium_size_w" value="<?php form_option('medium_size_w'); ?>" size="6" />
+<label for="medium_size_h"><?php _e('Max Height'); ?></label>
+<input name="medium_size_h" type="text" id="medium_size_h" value="<?php form_option('medium_size_h'); ?>" size="6" />
 </td>
 </tr>
 </table>
-</fieldset>
 
-<p><input name="use_linksupdate" type="checkbox" id="use_linksupdate" value="1" <?php checked('1', get_option('use_linksupdate')); ?> />
-<label for="use_linksupdate"><?php _e('Track Links&#8217; Update Times') ?></label></p>
-<p>
-<label><input type="checkbox" name="hack_file" value="1" <?php checked('1', get_option('hack_file')); ?> /> <?php _e('Use legacy <code>my-hacks.php</code> file support') ?></label>
-</p>
+
+
+<table class="form-table">
+
+<tr>
+<th scope="row" class="th-full">
+<label for="use_linksupdate">
+<input name="use_linksupdate" type="checkbox" id="use_linksupdate" value="1" <?php checked('1', get_option('use_linksupdate')); ?> />
+<?php _e('Track Links&#8217; Update Times') ?>
+</label>
+</th>
+</tr>
+<tr>
+
+<th scope="row" class="th-full">
+<label for="hack_file">
+<input type="checkbox" id="hack_file" name="hack_file" value="1" <?php checked('1', get_option('hack_file')); ?> />
+<?php _e('Use legacy <code>my-hacks.php</code> file support') ?>
+</label>
+</th>
+</tr>
+
+</table>
 
 <p class="submit">
 <input type="hidden" name="action" value="update" />
-<input type="hidden" name="page_options" value="hack_file,use_linksupdate,uploads_use_yearmonth_folders,upload_path" />
-<input type="submit" name="Submit" value="<?php _e('Update Options &raquo;') ?>" />
+<input type="hidden" name="page_options" value="hack_file,use_linksupdate,uploads_use_yearmonth_folders,upload_path,upload_url_path,thumbnail_size_w,thumbnail_size_h,thumbnail_crop,medium_size_w,medium_size_h" />
+<input type="submit" name="Submit" value="<?php _e('Save Changes') ?>" class="button" />
 </p>
 </form>
 </div>
diff -x .svn -aruN 2.2.2.src/wp-admin/options-permalink.php 2.5.src/wp-admin/options-permalink.php
--- 2.2.2.src/wp-admin/options-permalink.php	2007-04-19 17:26:52.000000000 -0500
+++ 2.5.src/wp-admin/options-permalink.php	2008-03-11 11:41:53.000000000 -0500
@@ -1,7 +1,7 @@
 <?php
 require_once('admin.php');
 
-$title = __('Permalink Options');
+$title = __('Permalink Settings');
 $parent_file = 'options-general.php';
 
 function add_js() {
@@ -73,10 +73,18 @@
 			$category_base = preg_replace('#/+#', '/', '/' . $_POST['category_base']);
 		$wp_rewrite->set_category_base($category_base);
 	}
+
+	if ( isset($_POST['tag_base']) ) {
+		$tag_base = $_POST['tag_base'];
+		if (! empty($tag_base) )
+			$tag_base = preg_replace('#/+#', '/', '/' . $_POST['tag_base']);
+		$wp_rewrite->set_tag_base($tag_base);
+	}
 }
 
 $permalink_structure = get_option('permalink_structure');
 $category_base = get_option('category_base');
+$tag_base = get_option( 'tag_base' );
 
 if ( (!file_exists($home_path.'.htaccess') && is_writable($home_path)) || is_writable($home_path.'.htaccess') )
 	$writable = true;
@@ -93,18 +101,17 @@
 
 <?php if (isset($_POST['submit'])) : ?>
 <div id="message" class="updated fade"><p><?php
-if ($writable)
-	_e('Permalink structure updated.');
+if ( $permalink_structure && !$usingpi && !$writable )
+	_e('You should update your .htaccess now.');
 else
-	_e('You should update your .htaccess now.'); 
+	_e('Permalink structure updated.');
 ?></p></div>
 <?php endif; ?>
 
-<div class="wrap"> 
-  <h2><?php _e('Customize Permalink Structure') ?></h2> 
-<form name="form" action="options-permalink.php" method="post"> 
+<div class="wrap">
+  <h2><?php _e('Customize Permalink Structure') ?></h2>
+<form name="form" action="options-permalink.php" method="post">
 <?php wp_nonce_field('update-permalink') ?>
-<p class="submit"><input type="submit" name="submit" value="<?php _e('Update Permalink Structure &raquo;') ?>" /></p>
   <p><?php _e('By default WordPress uses web <abbr title="Universal Resource Locator">URL</abbr>s which have question marks and lots of numbers in them, however WordPress offers you the ability to create a custom URL structure for your permalinks and archives. This can improve the aesthetics, usability, and forward-compatibility of your links. A <a href="http://codex.wordpress.org/Using_Permalinks">number of tags are available</a>, and here are some examples to get you started.'); ?></p>
 
 <?php
@@ -116,62 +123,68 @@
 $structures = array(
 	'',
 	$prefix . '/%year%/%monthnum%/%day%/%postname%/',
+	$prefix . '/%year%/%monthnum%/%postname%/',
 	$prefix . '/archives/%post_id%'
 	);
 ?>
-<h3><?php _e('Common options:'); ?></h3>
-<p>
-	<label>
-<input name="selection" type="radio" value="" class="tog" <?php checked('', $permalink_structure); ?> /> 
-<?php _e('Default'); ?><br /> <span> &raquo; <code><?php echo get_option('home'); ?>/?p=123</code></span>
-   </label>
-</p>
-<p>
-	<label>
-<input name="selection" type="radio" value="<?php echo $structures[1]; ?>" class="tog" <?php checked($structures[1], $permalink_structure); ?> /> 
-<?php _e('Date and name based'); ?><br /> <span> &raquo; <code><?php echo get_option('home') . $prefix . '/' . date('Y') . '/' . date('m') . '/' . date('d') . '/sample-post/'; ?></code></span>
-   </label>
-</p>
-<p>
-	<label>
-<input name="selection" type="radio" value="<?php echo $structures[2]; ?>" class="tog" <?php checked($structures[2], $permalink_structure); ?> /> 
-<?php _e('Numeric'); ?><br /> <span> &raquo; <code><?php echo get_option('home') . $prefix  ; ?>/archives/123</code></span>
-   </label>
-</p>
-<p>
-<label>
-<input name="selection" id="custom_selection" type="radio" value="custom" class="tog"
-<?php if ( !in_array($permalink_structure, $structures) ) { ?>
-checked="checked"
-<?php } ?>
- />
-<?php _e('Custom, specify below'); ?>
-</label>
-<br />
-</p>
-<p id="customstructure"><?php _e('Custom structure'); ?>: <input name="permalink_structure" id="permalink_structure" type="text" class="code" style="width: 60%;" value="<?php echo attribute_escape($permalink_structure); ?>" size="50" /></p>
+<h3><?php _e('Common settings'); ?></h3>
+<table class="form-table">
+	<tr>
+		<th><label><input name="selection" type="radio" value="" class="tog" <?php checked('', $permalink_structure); ?> /> <?php _e('Default'); ?></label></th>
+		<td><code><?php echo get_option('home'); ?>/?p=123</code></td>
+	</tr>
+	<tr>
+		<th><label><input name="selection" type="radio" value="<?php echo $structures[1]; ?>" class="tog" <?php checked($structures[1], $permalink_structure); ?> /> <?php _e('Day and name'); ?></label></th>
+		<td><code><?php echo get_option('home') . $prefix . '/' . date('Y') . '/' . date('m') . '/' . date('d') . '/sample-post/'; ?></code></td>
+	</tr>
+	<tr>
+		<th><label><input name="selection" type="radio" value="<?php echo $structures[2]; ?>" class="tog" <?php checked($structures[2], $permalink_structure); ?> /> <?php _e('Month and name'); ?></label></th>
+		<td><code><?php echo get_option('home') . $prefix . '/' . date('Y') . '/' . date('m') . '/sample-post/'; ?></code></td>
+	</tr>
+	<tr>
+		<th><label><input name="selection" type="radio" value="<?php echo $structures[3]; ?>" class="tog" <?php checked($structures[3], $permalink_structure); ?> /> <?php _e('Numeric'); ?></label></th>
+		<td><code><?php echo get_option('home') . $prefix  ; ?>/archives/123</code></td>
+	</tr>
+	<tr>
+		<th>
+			<label><input name="selection" id="custom_selection" type="radio" value="custom" class="tog"
+			<?php if ( !in_array($permalink_structure, $structures) ) { ?>
+			checked="checked"
+			<?php } ?>
+			 />
+			<?php _e('Custom Structure'); ?>
+			</label>
+		</th>
+		<td>
+			<input name="permalink_structure" id="permalink_structure" type="text" class="code" style="width: 60%;" value="<?php echo attribute_escape($permalink_structure); ?>" size="50" />
+		</td>
+	</tr>
+</table>
 
 <h3><?php _e('Optional'); ?></h3>
 <?php if ($is_apache) : ?>
-	<p><?php _e('If you like, you may enter a custom prefix for your category <abbr title="Universal Resource Locator">URL</abbr>s here. For example, <code>/taxonomy/tags</code> would make your category links like <code>http://example.org/taxonomy/tags/uncategorized/</code>. If you leave this blank the default will be used.') ?></p>
+	<p><?php _e('If you like, you may enter custom structures for your category and tag <abbr title="Universal Resource Locator">URL</abbr>s here. For example, using <code>/topics/</code> as your category base would make your category links like <code>http://example.org/topics/uncategorized/</code>. If you leave these blank the defaults will be used.') ?></p>
 <?php else : ?>
-	<p><?php _e('If you like, you may enter a custom prefix for your category <abbr title="Universal Resource Locator">URL</abbr>s here. For example, <code>/index.php/taxonomy/tags</code> would make your category links like <code>http://example.org/index.php/taxonomy/tags/uncategorized/</code>. If you leave this blank the default will be used.') ?></p>
+	<p><?php _e('If you like, you may enter custom structures for your category and tag <abbr title="Universal Resource Locator">URL</abbr>s here. For example, using <code>/topics/</code> as your category base would make your category links like <code>http://example.org/index.php/topics/uncategorized/</code>. If you leave these blank the defaults will be used.') ?></p>
 <?php endif; ?>
-	<p> 
-  <?php _e('Category base'); ?>: <input name="category_base" type="text" class="code"  value="<?php echo attribute_escape($category_base); ?>" size="30" /> 
-     </p> 
-    <p class="submit"> 
-      <input type="submit" name="submit" value="<?php _e('Update Permalink Structure &raquo;') ?>" /> 
-    </p> 
-  </form> 
+
+<table class="form-table">
+	<tr>
+		<th><?php _e('Category base'); ?></th>
+		<td><input name="category_base" id="category_base" type="text" class="code"  value="<?php echo attribute_escape($category_base); ?>" size="30" /></td>
+	</tr>
+	<tr>
+		<th><?php _e('Tag base'); ?></th>
+		<td><input name="tag_base" id="tag_base" type="text" class="code"  value="<?php echo attribute_escape($tag_base); ?>" size="30" /></td>
+	</tr>
+</table>
+<p class="submit"><input type="submit" name="submit" class="button" value="<?php _e('Save Changes') ?>" /></p>
+  </form>
 <?php if ( $permalink_structure && !$usingpi && !$writable ) : ?>
-  <p><?php _e('If your <code>.htaccess</code> file were <a href="http://codex.wordpress.org/Make_a_Directory_Writable">writable</a>, we could do this automatically, but it isn&#8217;t so these are the mod_rewrite rules you should have in your <code>.htaccess</code> file. Click in the field and press <kbd>CTRL + a</kbd> to select all.') ?></p>
+  <p><?php _e('If your <code>.htaccess</code> file were <a href="http://codex.wordpress.org/Changing_File_Permissions">writable</a>, we could do this automatically, but it isn&#8217;t so these are the mod_rewrite rules you should have in your <code>.htaccess</code> file. Click in the field and press <kbd>CTRL + a</kbd> to select all.') ?></p>
 <form action="options-permalink.php" method="post">
 <?php wp_nonce_field('update-permalink') ?>
-   <p>
-<textarea rows="5" style="width: 98%;" name="rules"><?php echo wp_specialchars($wp_rewrite->mod_rewrite_rules()); ?>
-</textarea>
-    </p>
+	<p><textarea rows="5" style="width: 98%;" name="rules" id="rules"><?php echo wp_specialchars($wp_rewrite->mod_rewrite_rules()); ?></textarea></p>
 </form>
 <?php endif; ?>
 
diff -x .svn -aruN 2.2.2.src/wp-admin/options-privacy.php 2.5.src/wp-admin/options-privacy.php
--- 2.2.2.src/wp-admin/options-privacy.php	2006-11-19 01:56:05.000000000 -0600
+++ 2.5.src/wp-admin/options-privacy.php	2008-02-23 22:33:10.000000000 -0600
@@ -1,19 +1,19 @@
 <?php
 require_once('./admin.php');
 
-$title = __('Privacy Options');
+$title = __('Privacy Settings');
 $parent_file = 'options-general.php';
 
 include('./admin-header.php');
 ?>
 
 <div class="wrap">
-<h2><?php _e('Privacy Options') ?></h2>
+<h2><?php _e('Privacy Settings') ?></h2>
 <form method="post" action="options.php">
 <?php wp_nonce_field('update-options') ?>
-<table class="optiontable">
+<table class="form-table">
 <tr valign="top">
-<th scope="row"><?php _e('Blog visibility:') ?> </th>
+<th scope="row"><?php _e('Blog Visibility') ?> </th>
 <td>
 <p><input id="blog-public" type="radio" name="blog_public" value="1" <?php checked('1', get_option('blog_public')); ?> />
 <label for="blog-public"><?php _e('I would like my blog to be visible to everyone, including search engines (like Google, Sphere, Technorati) and archivers');?></label></p>
@@ -24,7 +24,7 @@
 </tr>
 </table>
 
-<p class="submit"><input type="submit" name="Submit" value="<?php _e('Update Options &raquo;') ?>" />
+<p class="submit"><input type="submit" name="Submit" value="<?php _e('Save Changes') ?>" />
 <input type="hidden" name="action" value="update" />
 <input type="hidden" name="page_options" value="blog_public" />
 </p>
diff -x .svn -aruN 2.2.2.src/wp-admin/options-reading.php 2.5.src/wp-admin/options-reading.php
--- 2.2.2.src/wp-admin/options-reading.php	2007-01-29 10:44:36.000000000 -0600
+++ 2.5.src/wp-admin/options-reading.php	2008-03-24 03:28:15.000000000 -0500
@@ -1,31 +1,28 @@
 <?php
 require_once('admin.php');
 
-$title = __('Reading Options');
+$title = __('Reading Settings');
 $parent_file = 'options-general.php';
 
 include('admin-header.php');
 ?>
 
-<div class="wrap"> 
-<h2><?php _e('Reading Options') ?></h2> 
+<div class="wrap">
+<h2><?php _e('Reading Settings') ?></h2>
 <form name="form1" method="post" action="options.php">
 <?php wp_nonce_field('update-options') ?>
-<p class="submit"><input type="submit" name="Submit" value="<?php _e('Update Options &raquo;') ?>" /></p>
+<table class="form-table">
 <?php if ( get_pages() ): ?>
-<fieldset class="options"> 
-<legend><?php _e('Front Page') ?></legend> 
-<table width="100%" cellspacing="2" cellpadding="5" class="optiontable editform"> 
-<tr valign="top"> 
-<th width="33%" scope="row"><?php _e('Front page displays:')?></th> 
+<tr valign="top">
+<th scope="row"><?php _e('Front page displays')?></th>
 <td>
 	<p><label>
-		<input name="show_on_front" type="radio" value="posts" class="tog" <?php checked('posts', get_option('show_on_front')); ?> /> 
+		<input name="show_on_front" type="radio" value="posts" class="tog" <?php checked('posts', get_option('show_on_front')); ?> />
 		<?php _e('Your latest posts'); ?>
 	</label>
 	</p>
 	<p><label>
-		<input name="show_on_front" type="radio" value="page" class="tog" <?php checked('page', get_option('show_on_front')); ?> /> 
+		<input name="show_on_front" type="radio" value="page" class="tog" <?php checked('page', get_option('show_on_front')); ?> />
 		<?php printf(__('A <a href="%s">static page</a> (select below)'), 'edit-pages.php'); ?>
 	</label>
 	</p>
@@ -40,57 +37,38 @@
 	</p>
 </div>
 <?php endif; ?>
-</td> 
-</tr> 
-</table> 
-</fieldset>
+</td>
+</tr>
 <?php endif; ?>
-
-<fieldset class="options"> 
-<legend><?php _e('Blog Pages') ?></legend> 
-<table width="100%" cellspacing="2" cellpadding="5" class="optiontable editform"> 
-<tr valign="top"> 
-<th width="33%" scope="row"><?php _e('Show at most:') ?></th> 
+<tr valign="top">
+<th scope="row"><?php _e('Blog pages show at most') ?></th>
 <td>
 <input name="posts_per_page" type="text" id="posts_per_page" value="<?php form_option('posts_per_page'); ?>" size="3" /> <?php _e('posts') ?>
-</td> 
-</tr> 
-</table> 
-</fieldset> 
-
-<fieldset class="options"> 
-<legend><?php _e('Syndication Feeds') ?></legend> 
-<table width="100%" cellspacing="2" cellpadding="5" class="optiontable editform"> 
-<tr valign="top"> 
-<th width="33%" scope="row"><?php _e('Show the most recent:') ?></th> 
-<td><input name="posts_per_rss" type="text" id="posts_per_rss" value="<?php form_option('posts_per_rss'); ?>" size="3" /> <?php _e('posts') ?></td> 
+</td>
 </tr>
 <tr valign="top">
-<th scope="row"><?php _e('For each article, show:') ?> </th>
+<th scope="row"><?php _e('Syndication feeds show the most recent') ?></th>
+<td><input name="posts_per_rss" type="text" id="posts_per_rss" value="<?php form_option('posts_per_rss'); ?>" size="3" /> <?php _e('posts') ?></td>
+</tr>
+<tr valign="top">
+<th scope="row"><?php _e('For each article in a feed, show') ?> </th>
 <td>
 <p><label><input name="rss_use_excerpt"  type="radio" value="0" <?php checked(0, get_option('rss_use_excerpt')); ?>	/> <?php _e('Full text') ?></label><br />
 <label><input name="rss_use_excerpt" type="radio" value="1" <?php checked(1, get_option('rss_use_excerpt')); ?> /> <?php _e('Summary') ?></label></p>
-<p><?php _e('Note: If you use the <code>&lt;!--more--&gt;</code> feature, it will cut off posts in RSS feeds.'); ?></p>
 </td>
-</tr> 
-</table> 
-</fieldset> 
-<table width="100%" cellspacing="2" cellpadding="5" class="optiontable editform"> 
-<tr valign="top"> 
-<th width="33%" scope="row"><?php _e('Encoding for pages and feeds:') ?></th> 
+</tr>
+
+<tr valign="top">
+<th scope="row"><?php _e('Encoding for pages and feeds') ?></th>
 <td><input name="blog_charset" type="text" id="blog_charset" value="<?php form_option('blog_charset'); ?>" size="20" class="code" /><br />
-<?php _e('The character encoding you write your blog in (UTF-8 is <a href="http://developer.apple.com/documentation/macos8/TextIntlSvcs/TextEncodingConversionManager/TEC1.5/TEC.b0.html">recommended</a>)') ?></td> 
+<?php _e('The character encoding you write your blog in (UTF-8 is <a href="http://developer.apple.com/documentation/macos8/TextIntlSvcs/TextEncodingConversionManager/TEC1.5/TEC.b0.html">recommended</a>)') ?></td>
 </tr>
-</table> 
-<p>
-<label><input type="checkbox" name="gzipcompression" value="1" <?php checked('1', get_option('gzipcompression')); ?> /> 
-<?php _e('WordPress should compress articles (gzip) if browsers ask for them') ?></label>
-</p>
+</table>
 <p class="submit">
-<input type="hidden" name="action" value="update" /> 
-<input type="hidden" name="page_options" value="posts_per_page,posts_per_rss,rss_use_excerpt,blog_charset,gzipcompression,show_on_front,page_on_front,page_for_posts" /> 
-<input type="submit" name="Submit" value="<?php _e('Update Options &raquo;') ?>" /> 
-</p> 
-</form> 
-</div> 
-<?php include('./admin-footer.php'); ?>
\ No newline at end of file
+<input type="hidden" name="action" value="update" />
+<input type="hidden" name="page_options" value="posts_per_page,posts_per_rss,rss_use_excerpt,blog_charset,gzipcompression,show_on_front,page_on_front,page_for_posts" />
+<input type="submit" name="Submit" value="<?php _e('Save Changes') ?>" />
+</p>
+</form>
+</div>
+<?php include('./admin-footer.php'); ?>
diff -x .svn -aruN 2.2.2.src/wp-admin/options-writing.php 2.5.src/wp-admin/options-writing.php
--- 2.2.2.src/wp-admin/options-writing.php	2007-03-06 19:30:53.000000000 -0600
+++ 2.5.src/wp-admin/options-writing.php	2008-03-24 03:28:15.000000000 -0500
@@ -1,25 +1,25 @@
 <?php
 require_once('admin.php');
 
-$title = __('Writing Options');
+$title = __('Writing Settings');
 $parent_file = 'options-general.php';
 
 include('admin-header.php');
 ?>
 
-<div class="wrap"> 
-<h2><?php _e('Writing Options') ?></h2> 
-<form method="post" action="options.php"> 
+<div class="wrap">
+<h2><?php _e('Writing Settings') ?></h2>
+<form method="post" action="options.php">
 <?php wp_nonce_field('update-options') ?>
-<p class="submit"><input type="submit" name="Submit" value="<?php _e('Update Options &raquo;') ?>" /></p>
-<table width="100%" cellspacing="2" cellpadding="5" class="optiontable editform"> 
-<tr valign="top"> 
-<th width="33%" scope="row"> <?php _e('Size of the post box:') ?></th> 
-<td><input name="default_post_edit_rows" type="text" id="default_post_edit_rows" value="<?php form_option('default_post_edit_rows'); ?>" size="2" style="width: 1.5em; " /> 
-<?php _e('lines') ?></td> 
-</tr> 
+
+<table class="form-table">
+<tr valign="top">
+<th scope="row"> <?php _e('Size of the post box') ?></th>
+<td><input name="default_post_edit_rows" type="text" id="default_post_edit_rows" value="<?php form_option('default_post_edit_rows'); ?>" size="2" style="width: 1.5em;" />
+<?php _e('lines') ?></td>
+</tr>
 <tr valign="top">
-<th scope="row"><?php _e('Formatting:') ?></th>
+<th scope="row"><?php _e('Formatting') ?></th>
 <td>
 <label for="use_smilies">
 <input name="use_smilies" type="checkbox" id="use_smilies" value="1" <?php checked('1', get_option('use_smilies')); ?> />
@@ -28,60 +28,63 @@
 </td>
 </tr>
 <tr valign="top">
-<th scope="row"><?php _e('Default post category:') ?></th>
+<th scope="row"><?php _e('Default Post Category') ?></th>
 <td><select name="default_category" id="default_category">
 <?php
-$categories = $wpdb->get_results("SELECT * FROM $wpdb->categories ORDER BY cat_name");
+$categories = get_categories('get=all');
 foreach ($categories as $category) :
-if ($category->cat_ID == get_option('default_category')) $selected = " selected='selected'";
+$category = sanitize_category($category);
+if ($category->term_id == get_option('default_category')) $selected = " selected='selected'";
 else $selected = '';
-echo "\n\t<option value='$category->cat_ID' $selected>$category->cat_name</option>";
+echo "\n\t<option value='$category->term_id' $selected>$category->name</option>";
 endforeach;
 ?>
 </select></td>
 </tr>
 <tr valign="top">
-<th scope="row"><?php _e('Default link category:') ?></th>
+<th scope="row"><?php _e('Default Link Category') ?></th>
 <td><select name="default_link_category" id="default_link_category">
 <?php
-foreach ($categories as $category) :
-if ($category->cat_ID == get_option('default_link_category')) $selected = " selected='selected'";
+$link_categories = get_terms('link_category', 'get=all');
+foreach ($link_categories as $category) :
+$category = sanitize_term($category, 'link_category');
+if ($category->term_id == get_option('default_link_category')) $selected = " selected='selected'";
 else $selected = '';
-echo "\n\t<option value='$category->cat_ID' $selected>$category->cat_name</option>";
+echo "\n\t<option value='$category->term_id' $selected>$category->name</option>";
 endforeach;
 ?>
 </select></td>
 </tr>
 </table>
 
-<fieldset class="options">
-<legend><?php _e('Post via e-mail') ?></legend>
-<p><?php printf(__('To post to WordPress by e-mail you must set up a secret e-mail account with POP3 access. Any mail received at this address will be posted, so it&#8217;s a good idea to keep this address very secret. Here are three random strings you could use: <code>%s</code>, <code>%s</code>, <code>%s</code>.'), substr(md5(uniqid(microtime())),0,5), substr(md5(uniqid(microtime())),0,5), substr(md5(uniqid(microtime())),0,5)) ?></p>
+<h3><?php _e('Post via e-mail') ?></h3>
+<p><?php printf(__('To post to WordPress by e-mail you must set up a secret e-mail account with POP3 access. Any mail received at this address will be posted, so it&#8217;s a good idea to keep this address very secret. Here are three random strings you could use: <code>%s</code>, <code>%s</code>, <code>%s</code>.'), wp_generate_password(), wp_generate_password(), wp_generate_password()) ?></p>
 
-<table width="100%" cellspacing="2" cellpadding="5" class="optiontable editform">
+<table class="form-table">
 <tr valign="top">
-<th scope="row"><?php _e('Mail server:') ?></th>
+<th scope="row"><?php _e('Mail Server') ?></th>
 <td><input name="mailserver_url" type="text" id="mailserver_url" value="<?php form_option('mailserver_url'); ?>" size="40" />
-<label for="mailserver_port"><?php _e('Port:') ?></label>
+<label for="mailserver_port"><?php _e('Port') ?></label>
 <input name="mailserver_port" type="text" id="mailserver_port" value="<?php form_option('mailserver_port'); ?>" size="6" />
 </td>
 </tr>
 <tr valign="top">
-<th width="33%" scope="row"><?php _e('Login name:') ?></th>
+<th scope="row"><?php _e('Login Name') ?></th>
 <td><input name="mailserver_login" type="text" id="mailserver_login" value="<?php form_option('mailserver_login'); ?>" size="40" /></td>
 </tr>
 <tr valign="top">
-<th scope="row"><?php _e('Password:') ?></th>
+<th scope="row"><?php _e('Password') ?></th>
 <td>
 <input name="mailserver_pass" type="text" id="mailserver_pass" value="<?php form_option('mailserver_pass'); ?>" size="40" />
 </td>
 </tr>
 <tr valign="top">
-<th scope="row"><?php _e('Default mail category:') ?></th>
+<th scope="row"><?php _e('Default Mail Category') ?></th>
 <td><select name="default_email_category" id="default_email_category">
 <?php
 //Alreay have $categories from default_category
 foreach ($categories as $category) :
+$category = sanitize_category($category);
 if ($category->cat_ID == get_option('default_email_category')) $selected = " selected='selected'";
 else $selected = '';
 echo "\n\t<option value='$category->cat_ID' $selected>$category->cat_name</option>";
@@ -90,10 +93,8 @@
 </select></td>
 </tr>
 </table>
-</fieldset>
 
-<fieldset class="options">
-<legend><?php _e('Update Services') ?></legend>
+<h3><?php _e('Update Services') ?></h3>
 
 <?php if ( get_option('blog_public') ) : ?>
 
@@ -103,18 +104,16 @@
 
 <?php else : ?>
 
-	<p><?php printf(__('WordPress is not notifying any <a href="http://codex.wordpress.org/Update_Services">Update Services</a> because of your blog\'s <a href="%s">privacy settings</a>.'), 'options-privacy.php'); ?>
+	<p><?php printf(__('WordPress is not notifying any <a href="http://codex.wordpress.org/Update_Services">Update Services</a> because of your blog\'s <a href="%s">privacy settings</a>.'), 'options-privacy.php'); ?></p>
 
 <?php endif; ?>
 
-</fieldset>
-
 <p class="submit">
 <input type="hidden" name="action" value="update" />
 <input type="hidden" name="page_options" value="default_post_edit_rows,use_smilies,ping_sites,mailserver_url,mailserver_port,mailserver_login,mailserver_pass,default_category,default_email_category,use_balanceTags,default_link_category" />
-<input type="submit" name="Submit" value="<?php _e('Update Options &raquo;') ?>" />
+<input type="submit" name="Submit" value="<?php _e('Save Changes') ?>" />
 </p>
 </form>
 </div>
 
-<?php include('./admin-footer.php') ?>
\ No newline at end of file
+<?php include('./admin-footer.php') ?>
diff -x .svn -aruN 2.2.2.src/wp-admin/options.php 2.5.src/wp-admin/options.php
--- 2.2.2.src/wp-admin/options.php	2007-08-01 14:25:15.000000000 -0500
+++ 2.5.src/wp-admin/options.php	2008-02-23 22:33:10.000000000 -0600
@@ -1,7 +1,7 @@
 <?php
 require_once('admin.php');
 
-$title = __('Options');
+$title = __('Settings');
 $this_file = 'options.php';
 $parent_file = 'options-general.php';
 
@@ -10,77 +10,6 @@
 if ( !current_user_can('manage_options') )
 	wp_die(__('Cheatin&#8217; uh?'));
 
-function sanitize_option($option, $value) { // Remember to call stripslashes!
-
-	switch ($option) {
-		case 'admin_email':
-			$value = stripslashes($value);
-			$value = sanitize_email($value);
-			break;
-
-		case 'default_post_edit_rows':
-		case 'mailserver_port':
-		case 'comment_max_links':
-			$value = stripslashes($value);
-			$value = abs((int) $value);
-			break;
-
-		case 'posts_per_page':
-		case 'posts_per_rss':
-			$value = stripslashes($value);
-			$value = (int) $value;
-			if ( empty($value) ) $value = 1;
-			if ( $value < -1 ) $value = abs($value);
-			break;
-
-		case 'default_ping_status':
-		case 'default_comment_status':
-			$value = stripslashes($value);
-			// Options that if not there have 0 value but need to be something like "closed"
-			if ( $value == '0' || $value == '')
-				$value = 'closed';
-			break;
-
-		case 'blogdescription':
-		case 'blogname':
-			if (current_user_can('unfiltered_html') == false)
-				$value = wp_filter_post_kses( $value ); // calls stripslashes then addslashes
-			$value = stripslashes($value);
-			break;
-
-		case 'blog_charset':
-			$value = preg_replace('/[^a-zA-Z0-9_-]/', '', $value); // strips slashes
-			break;
-
-		case 'date_format':
-		case 'time_format':
-		case 'mailserver_url':
-		case 'mailserver_login':
-		case 'mailserver_pass':
-		case 'ping_sites':
-		case 'upload_path':
-			$value = strip_tags($value);
-			$value = wp_filter_kses($value); // calls stripslashes then addslashes
-			$value = stripslashes($value);
-			break;
-
-		case 'gmt_offset':
-			$value = preg_replace('/[^0-9:.-]/', '', $value); // strips slashes
-			break;
-
-		case 'siteurl':
-		case 'home':
-			$value = stripslashes($value);
-			$value = clean_url($value);
-			break;
-		default :
-			$value = stripslashes($value);
-			break;
-	}
-
-	return $value;
-}
-
 switch($action) {
 
 case 'update':
@@ -100,15 +29,14 @@
 	if ($options) {
 		foreach ($options as $option) {
 			$option = trim($option);
-			$value = trim($_POST[$option]);
-			$value = sanitize_option($option, $value); // This does stripslashes on those that need it
+			$value = $_POST[$option];
+			if(!is_array($value))	$value = trim($value);
+			$value = stripslashes_deep($value);
 			update_option($option, $value);
 		}
 	}
-    
-	$referred = remove_query_arg('updated' , wp_get_referer());
+
 	$goback = add_query_arg('updated', 'true', wp_get_referer());
-	$goback = preg_replace('|[^a-z0-9-~+_.?#=&;,/:]|i', '', $goback);
 	wp_redirect($goback);
     break;
 
@@ -116,12 +44,11 @@
 	include('admin-header.php'); ?>
 
 <div class="wrap">
-  <h2><?php _e('All Options'); ?></h2>
+  <h2><?php _e('All Settings'); ?></h2>
   <form name="form" action="options.php" method="post" id="all-options">
   <?php wp_nonce_field('update-options') ?>
   <input type="hidden" name="action" value="update" />
-	<p class="submit"><input type="submit" name="Update" value="<?php _e('Update Options &raquo;') ?>" /></p>
-  <table width="98%">
+  <table class="form-table">
 <?php
 $options = $wpdb->get_results("SELECT * FROM $wpdb->options ORDER BY option_name");
 
@@ -146,20 +73,19 @@
 	}
 	echo "
 <tr>
-	<th scope='row'><label for='$option->option_name'>$option->option_name</label></th>
+	<th scope='row'>$option->option_name</th>
 <td>";
 
 	if (strpos($value, "\n") !== false) echo "<textarea class='$class' name='$option->option_name' id='$option->option_name' cols='30' rows='5'>" . wp_specialchars($value) . "</textarea>";
 	else echo "<input class='$class' type='text' name='$option->option_name' id='$option->option_name' size='30' value='" . attribute_escape($value) . "'$disabled />";
 
 	echo "</td>
-	<td>$option->option_description</td>
 </tr>";
 endforeach;
 ?>
   </table>
 <?php $options_to_update = implode(',', $options_to_update); ?>
-<p class="submit"><input type="hidden" name="page_options" value="<?php echo $options_to_update; ?>" /><input type="submit" name="Update" value="<?php _e('Update Options &raquo;') ?>" /></p>
+<p class="submit"><input type="hidden" name="page_options" value="<?php echo $options_to_update; ?>" /><input type="submit" name="Update" value="<?php _e('Save Changes') ?>" /></p>
   </form>
 </div>
 
diff -x .svn -aruN 2.2.2.src/wp-admin/page-new.php 2.5.src/wp-admin/page-new.php
--- 2.2.2.src/wp-admin/page-new.php	2007-02-22 09:30:47.000000000 -0600
+++ 2.5.src/wp-admin/page-new.php	2008-02-20 13:30:55.000000000 -0600
@@ -3,24 +3,27 @@
 $title = __('New Page');
 $parent_file = 'post-new.php';
 $editing = true;
-wp_enqueue_script('prototype');
-wp_enqueue_script('interface');
 wp_enqueue_script('autosave');
+wp_enqueue_script('page');
+if ( user_can_richedit() )
+	wp_enqueue_script('editor');
+wp_enqueue_script('thickbox');
+wp_enqueue_script('media-upload');
+
 require_once('admin-header.php');
 ?>
 
 <?php if ( (isset($_GET['posted']) && $_GET['posted'])  || isset($_GET['saved'])  ) : ?>
-<div id="message" class="updated fade"><p><strong><?php _e('Page saved.') ?></strong> <a href="edit-pages.php"><?php _e('Manage pages'); ?></a> | <a href="<?php echo get_page_link( isset($_GET['posted']) ? $_GET['posted'] : $_GET['saved'] ); ?>"><?php _e('View page') ; ?> &raquo;</a></p></div>
+<div id="message" class="updated fade"><p><strong><?php _e('Page saved.') ?></strong> <a href="edit-pages.php"><?php _e('Manage pages'); ?></a> | <a href="<?php echo get_page_link( isset($_GET['posted']) ? $_GET['posted'] : $_GET['saved'] ); ?>"><?php _e('View page') ; ?></a></p></div>
 <?php endif; ?>
 
 <?php
 if ( current_user_can('edit_pages') ) {
 	$action = 'post';
-	$post = get_default_post_to_edit();
-	$post->post_type = 'page';
+	$post = get_default_page_to_edit();
 
 	include('edit-page-form.php');
 }
 ?>
 
-<?php include('admin-footer.php'); ?> 
+<?php include('admin-footer.php'); ?>
diff -x .svn -aruN 2.2.2.src/wp-admin/page.php 2.5.src/wp-admin/page.php
--- 2.2.2.src/wp-admin/page.php	2007-03-31 17:02:19.000000000 -0500
+++ 2.5.src/wp-admin/page.php	2008-03-29 01:47:30.000000000 -0500
@@ -6,6 +6,48 @@
 
 wp_reset_vars(array('action'));
 
+function redirect_page($page_ID) {
+	$referredby = '';
+	if ( !empty($_POST['referredby']) )
+		$referredby = preg_replace('|https?://[^/]+|i', '', $_POST['referredby']);
+	$referer = preg_replace('|https?://[^/]+|i', '', wp_get_referer());
+
+	if ( 'post' == $_POST['originalaction'] && !empty($_POST['mode']) && 'bookmarklet' == $_POST['mode'] ) {
+		$location = $_POST['referredby'];
+	} elseif ( 'post' == $_POST['originalaction'] && !empty($_POST['mode']) && 'sidebar' == $_POST['mode'] ) {
+		$location = 'sidebar.php?a=b';
+	} elseif ( isset($_POST['save']) && ( empty($referredby) || $referredby == $referer || 'redo' != $referredby ) ) {
+		if ( $_POST['_wp_original_http_referer'] && strpos( $_POST['_wp_original_http_referer'], '/wp-admin/page.php') === false && strpos( $_POST['_wp_original_http_referer'], '/wp-admin/page-new.php') === false )
+			$location = add_query_arg( '_wp_original_http_referer', urlencode( stripslashes( $_POST['_wp_original_http_referer'] ) ), "page.php?action=edit&post=$page_ID&message=1" );
+		else
+			$location = "page.php?action=edit&post=$page_ID&message=4";
+	} elseif ($_POST['addmeta']) {
+		$location = add_query_arg( 'message', 2, wp_get_referer() );
+		$location = explode('#', $location);
+		$location = $location[0] . '#postcustom';
+	} elseif ($_POST['deletemeta']) {
+		$location = add_query_arg( 'message', 3, wp_get_referer() );
+		$location = explode('#', $location);
+		$location = $location[0] . '#postcustom';
+	} elseif (!empty($referredby) && $referredby != $referer) {
+		$location = $_POST['referredby'];
+		if ( $_POST['referredby'] == 'redo' )
+			$location = get_permalink( $page_ID );
+		elseif ( false !== strpos($location, 'edit-pages.php') )
+			$location = add_query_arg('posted', $page_ID, $location);
+		elseif ( false !== strpos($location, 'wp-admin') )
+			$location = "page-new.php?posted=$page_ID";
+	} elseif ( isset($_POST['publish']) ) {
+		$location = "page-new.php?posted=$page_ID";
+	} elseif ($action == 'editattachment') {
+		$location = 'attachments.php';
+	} else {
+		$location = "page.php?action=edit&post=$page_ID&message=4";
+	}
+
+	wp_redirect($location);
+}
+
 if (isset($_POST['deletepost'])) {
 $action = "delete";
 }
@@ -15,27 +57,8 @@
 	check_admin_referer('add-page');
 	$page_ID = write_post();
 
-	// Redirect.
-	if (!empty($_POST['mode'])) {
-	switch($_POST['mode']) {
-		case 'bookmarklet':
-			$location = $_POST['referredby'];
-			break;
-		case 'sidebar':
-			$location = 'sidebar.php?a=b';
-			break;
-		default:
-			$location = 'page-new.php';
-			break;
-		}
-	} else {
-		$location = "page-new.php?posted=$page_ID";
-	}
-
-	if ( isset($_POST['save']) )
-		$location = "page.php?action=edit&post=$page_ID";
+	redirect_page($page_ID);
 
-	wp_redirect($location);
 	exit();
 	break;
 
@@ -45,16 +68,29 @@
 	$page_ID = $post_ID = $p = (int) $_GET['post'];
 	$post = get_post_to_edit($page_ID);
 
+	if ( empty($post->ID) ) wp_die( __("You attempted to edit a page that doesn't exist. Perhaps it was deleted?") );
+
 	if ( 'post' == $post->post_type ) {
 		wp_redirect("post.php?action=edit&post=$post_ID");
 		exit();
 	}
 
-	if($post->post_status == 'draft') {
-		wp_enqueue_script('prototype');
-		wp_enqueue_script('interface');
+	wp_enqueue_script('page');
+	if ( user_can_richedit() )
+		wp_enqueue_script('editor');
+	wp_enqueue_script('thickbox');
+	wp_enqueue_script('media-upload');
+	if ( $last = wp_check_post_lock( $post->ID ) ) {
+		$last_user = get_userdata( $last );
+		$last_user_name = $last_user ? $last_user->display_name : __('Somebody');
+		$message = sprintf( __( 'Warning: %s is currently editing this page' ), wp_specialchars( $last_user_name ) );
+		$message = str_replace( "'", "\'", "<div class='error'><p>$message</p></div>" );
+		add_action('admin_notices', create_function( '', "echo '$message';" ) );
+	} else {
+		wp_set_post_lock( $post->ID );
 		wp_enqueue_script('autosave');
 	}
+
 	require_once('admin-header.php');
 
 	if ( !current_user_can('edit_page', $page_ID) )
@@ -83,43 +119,7 @@
 
 	$page_ID = edit_post();
 
-	if ( 'post' == $_POST['originalaction'] ) {
-		if (!empty($_POST['mode'])) {
-		switch($_POST['mode']) {
-			case 'bookmarklet':
-				$location = $_POST['referredby'];
-				break;
-			case 'sidebar':
-				$location = 'sidebar.php?a=b';
-				break;
-			default:
-				$location = 'page-new.php';
-				break;
-			}
-		} else {
-			$location = "page-new.php?posted=$page_ID";
-		}
-
-		if ( isset($_POST['save']) )
-			$location = "page.php?action=edit&post=$page_ID";
-	} else {
-		if ($_POST['save']) {
-			$location = "page.php?action=edit&post=$page_ID";
-		} elseif ($_POST['updatemeta']) {
-			$location = wp_get_referer() . '&message=2#postcustom';
-		} elseif ($_POST['deletemeta']) {
-			$location = wp_get_referer() . '&message=3#postcustom';
-		} elseif (!empty($_POST['referredby']) && $_POST['referredby'] != wp_get_referer()) {
-			$location = $_POST['referredby'];
-			if ( $_POST['referredby'] == 'redo' )
-				$location = get_permalink( $page_ID );
-		} elseif ($action == 'editattachment') {
-			$location = 'attachments.php';
-		} else {
-			$location = 'page-new.php';
-		}
-	}
-	wp_redirect($location); // Send user on their way while we keep working
+	redirect_page($page_ID);
 
 	exit();
 	break;
@@ -137,7 +137,7 @@
 		if ( ! wp_delete_attachment($page_id) )
 			wp_die( __('Error in deleting...') );
 	} else {
-		if ( !wp_delete_post($page_id) ) 
+		if ( !wp_delete_post($page_id) )
 			wp_die( __('Error in deleting...') );
 	}
 
diff -x .svn -aruN 2.2.2.src/wp-admin/plugin-editor.php 2.5.src/wp-admin/plugin-editor.php
--- 2.2.2.src/wp-admin/plugin-editor.php	2007-02-14 00:15:05.000000000 -0600
+++ 2.5.src/wp-admin/plugin-editor.php	2008-03-26 11:14:29.000000000 -0500
@@ -6,12 +6,16 @@
 
 wp_reset_vars(array('action', 'redirect', 'profile', 'error', 'warning', 'a', 'file'));
 
+add_action( 'admin_head', 'theme_editor_css' );
+function theme_editor_css(){
+	wp_admin_css( 'css/theme-editor' );
+}
+
 $plugins = get_plugins();
 $plugin_files = array_keys($plugins);
 
-if (empty($file)) {
+if (empty($file))
 	$file = $plugin_files[0];
-}
 
 $file = validate_file_to_edit($file, $plugin_files);
 $real_file = get_real_file_to_edit( PLUGINDIR . "/$file");
@@ -26,27 +30,23 @@
 		wp_die('<p>'.__('You do not have sufficient permissions to edit templates for this blog.').'</p>');
 
 	$newcontent = stripslashes($_POST['newcontent']);
-	if (is_writeable($real_file)) {
+	if ( is_writeable($real_file) ) {
 		$f = fopen($real_file, 'w+');
 		fwrite($f, $newcontent);
 		fclose($f);
 
 		// Deactivate so we can test it.
-		$current = get_option('active_plugins');
-		if ( in_array($file, $current) || isset($_POST['phperror']) ) {
-			if ( in_array($file, $current) ) {
-				array_splice($current, array_search( $file, $current), 1 ); // Array-fu!
-				update_option('active_plugins', $current);
-			}
+		if ( is_plugin_active($file) || isset($_POST['phperror']) ) {
+			if ( is_plugin_active($file) )
+				deactivate_plugins($file, true);
 			wp_redirect(add_query_arg('_wpnonce', wp_create_nonce('edit-plugin-test_' . $file), "plugin-editor.php?file=$file&liveupdate=1"));
-			exit();
+			exit;
 		}
 		wp_redirect("plugin-editor.php?file=$file&a=te");
 	} else {
 		wp_redirect("plugin-editor.php?file=$file");
 	}
-
-	exit();
+	exit;
 
 break;
 
@@ -55,73 +55,75 @@
 	if ( !current_user_can('edit_plugins') )
 		wp_die('<p>'.__('You do not have sufficient permissions to edit plugins for this blog.').'</p>');
 
-	if ( $_GET['liveupdate'] ) {
+	if ( isset($_GET['liveupdate']) ) {
 		check_admin_referer('edit-plugin-test_' . $file);
-		$current = get_option('active_plugins');
-		$plugin = $file;
-		if ( validate_file($plugin) )
-			wp_die(__('Invalid plugin.'));
-		if ( ! file_exists(ABSPATH . PLUGINDIR . '/' . $plugin) )
-			wp_die(__('Plugin file does not exist.'));
-		if (!in_array($plugin, $current)) {
-			wp_redirect("plugin-editor.php?file=$file&phperror=1"); // we'll override this later if the plugin can be included without fatal error
-			@include(ABSPATH . PLUGINDIR . '/' . $plugin);
-			$current[] = $plugin;
-			sort($current);
-			update_option('active_plugins', $current);
-		}
+
+		$error = validate_plugin($file);
+		if( is_wp_error($error) )
+			wp_die( $error );
+
+		if ( ! is_plugin_active($file) )
+			activate_plugin($file, "plugin-editor.php?file=$file&phperror=1");// we'll override this later if the plugin can be included without fatal error
+
 		wp_redirect("plugin-editor.php?file=$file&a=te");
+		exit;
 	}
 
 	require_once('admin-header.php');
 
 	update_recently_edited(PLUGINDIR . "/$file");
 
-	if (!is_file($real_file))
+	if ( ! is_file($real_file) )
 		$error = 1;
 
-	if (!$error) {
-		$f = fopen($real_file, 'r');
-		$content = fread($f, filesize($real_file));
-		$content = htmlspecialchars($content);
-	}
+	if ( ! $error )
+		$content = htmlspecialchars(file_get_contents($real_file));
 
 	?>
 <?php if (isset($_GET['a'])) : ?>
  <div id="message" class="updated fade"><p><?php _e('File edited successfully.') ?></p></div>
 <?php elseif (isset($_GET['phperror'])) : ?>
- <div id="message" class="updated fade"><p><?php _e('This plugin has been deactivated because your changes resulted in a <strong>fatal error</strong>.') ?></p></div>
+ <div id="message" class="updated fade"><p><?php _e('This plugin has been deactivated because your changes resulted in a <strong>fatal error</strong>.') ?></p>
+	<?php
+		if ( wp_verify_nonce($_GET['_error_nonce'], 'plugin-activation-error_' . $file) ) { ?>
+	<iframe style="border:0" width="100%" height="70px" src="<?php bloginfo('wpurl'); ?>/wp-admin/plugins.php?action=error_scrape&amp;plugin=<?php echo attribute_escape($file); ?>&amp;_wpnonce=<?php echo attribute_escape($_GET['_error_nonce']); ?>"></iframe>
+	<?php } ?>
+</div>
 <?php endif; ?>
  <div class="wrap">
-	<?php
-	if ( in_array($file, (array) get_option('active_plugins')) ) {
-		if (is_writeable($real_file)) {
-			echo '<h2>' . sprintf(__('Editing <strong>%s</strong> (active)'), $file) . '</h2>';
-		} else {
-		echo '<h2>' . sprintf(__('Browsing <strong>%s</strong> (active)'), $file) . '</h2>';
-		}
+<div class="bordertitle">
+	<h2><?php _e('Plugin Editor'); ?></h2>
+</div>
+<div class="tablenav">
+<div class="alignleft">
+<big><strong><?php
+	if ( is_plugin_active($file) ) {
+		if ( is_writeable($real_file) )
+			echo sprintf(__('Editing <strong>%s</strong> (active)'), $file);
+		else
+			echo sprintf(__('Browsing <strong>%s</strong> (active)'), $file);
 	} else {
-		if (is_writeable($real_file)) {
-			echo '<h2>' . sprintf(__('Editing <strong>%s</strong> (inactive)'), $file) . '</h2>';
-		} else {
-		echo '<h2>' . sprintf(__('Browsing <strong>%s</strong> (inactive)'), $file) . '</h2>';
-		}
+		if ( is_writeable($real_file) )
+			echo sprintf(__('Editing <strong>%s</strong> (inactive)'), $file);
+		else
+			echo sprintf(__('Browsing <strong>%s</strong> (inactive)'), $file);
 	}
-	?>
+	?></strong></big>
+</div>
+<br class="clear" />
+</div>
+<br class="clear" />
 	<div id="templateside">
-<h3><?php _e('Plugin files') ?></h3>
+	<h3 id="bordertitle"><?php _e('Plugin Files'); ?></h3>
 
-<?php
-if ($plugin_files) :
-?>
+	<h4><?php _e('Plugins'); ?></h4>
 	<ul>
-	<?php foreach($plugin_files as $plugin_file) : ?>
-		 <li><a href="plugin-editor.php?file=<?php echo "$plugin_file"; ?>"><?php echo $plugins[$plugin_file]['Name']; ?></a></li>
-	<?php endforeach; ?>
+<?php foreach($plugin_files as $plugin_file) : ?>
+		<li><a href="plugin-editor.php?file=<?php echo $plugin_file; ?>"><?php echo $plugins[$plugin_file]['Name']; ?></a></li>
+<?php endforeach; ?>
 	</ul>
-<?php endif; ?>
-</div>
-<?php	if (!$error) { ?>
+	</div>
+<?php	if ( ! $error ) { ?>
 	<form name="template" id="template" action="plugin-editor.php" method="post">
 	<?php wp_nonce_field('edit-plugin_' . $file) ?>
 		<div><textarea cols="70" rows="25" name="newcontent" id="newcontent" tabindex="1"><?php echo $content ?></textarea>
@@ -135,13 +137,13 @@
 	<p class="submit">
 	<?php
 		if ( isset($_GET['phperror']) )
-			echo "<input type='hidden' name='phperror' value='1' /><input type='submit' name='submit' value='" . __('Update File and Attempt to Reactivate &raquo;') . "' tabindex='2' />";
+			echo "<input type='hidden' name='phperror' value='1' /><input type='submit' name='submit' value='" . __('Update File and Attempt to Reactivate') . "' tabindex='2' />";
 		else
-			echo "<input type='submit' name='submit' value='" . __('Update File &raquo;') . "' tabindex='2' />";
+			echo "<input type='submit' name='submit' value='" . __('Update File') . "' tabindex='2' />";
 	?>
 	</p>
 <?php else : ?>
-	<p><em><?php _e('If this file were writable you could edit it.'); ?></em></p>
+	<p><em><?php _e('You need to make this file writable before you can save your changes. See <a href="http://codex.wordpress.org/Changing_File_Permissions">the Codex</a> for more information.'); ?></em></p>
 <?php endif; ?>
  </form>
 <?php
@@ -152,7 +154,6 @@
 <div class="clear"> &nbsp; </div>
 </div>
 <?php
-break;
+	break;
 }
-
-include("admin-footer.php") ?>
+include("admin-footer.php") ?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/plugins.php 2.5.src/wp-admin/plugins.php
--- 2.2.2.src/wp-admin/plugins.php	2007-04-10 22:23:23.000000000 -0500
+++ 2.5.src/wp-admin/plugins.php	2008-03-26 17:27:27.000000000 -0500
@@ -2,84 +2,67 @@
 require_once('admin.php');
 
 if ( isset($_GET['action']) ) {
-	if ('activate' == $_GET['action']) {
-		check_admin_referer('activate-plugin_' . $_GET['plugin']);
-		$current = get_option('active_plugins');
+	if ( isset($_GET['plugin']) )
 		$plugin = trim($_GET['plugin']);
-		if ( validate_file($plugin) )
-			wp_die(__('Invalid plugin.'));
-		if ( ! file_exists(ABSPATH . PLUGINDIR . '/' . $plugin) )
-			wp_die(__('Plugin file does not exist.'));
-		if (!in_array($plugin, $current)) {
-			wp_redirect('plugins.php?error=true'); // we'll override this later if the plugin can be included without fatal error
-			ob_start();
-			@include(ABSPATH . PLUGINDIR . '/' . $plugin);
-			$current[] = $plugin;
-			sort($current);
-			update_option('active_plugins', $current);
-			do_action('activate_' . $plugin);
-			ob_end_clean();
-		}
+
+	if ( 'activate' == $_GET['action'] ) {
+		check_admin_referer('activate-plugin_' . $_GET['plugin']);
+		$result = activate_plugin($_GET['plugin'], 'plugins.php?error=true&plugin=' . $plugin);
+		if ( is_wp_error( $result ) )
+			wp_die( $result->get_error_message() );
 		wp_redirect('plugins.php?activate=true'); // overrides the ?error=true one above
-	} else if ('deactivate' == $_GET['action']) {
+	} elseif ( 'error_scrape' == $_GET['action'] ) {
+		check_admin_referer('plugin-activation-error_' . $plugin);
+		$valid = validate_plugin($plugin);
+		if ( is_wp_error($valid) )
+			wp_die($valid);
+		error_reporting( E_ALL ^ E_NOTICE );
+		@ini_set('display_errors', true); //Ensure that Fatal errors are displayed.
+		include(ABSPATH . PLUGINDIR . '/' . $plugin);
+	} elseif ( 'deactivate' == $_GET['action'] ) {
 		check_admin_referer('deactivate-plugin_' . $_GET['plugin']);
-		$current = get_option('active_plugins');
-		array_splice($current, array_search( $_GET['plugin'], $current), 1 ); // Array-fu!
-		update_option('active_plugins', $current);
-		do_action('deactivate_' . trim( $_GET['plugin'] ));
+		deactivate_plugins($_GET['plugin']);
 		wp_redirect('plugins.php?deactivate=true');
-	} elseif ($_GET['action'] == 'deactivate-all') {
+	} elseif ( 'deactivate-all' == $_GET['action'] ) {
 		check_admin_referer('deactivate-all');
-		$current = get_option('active_plugins');
-		
-		foreach ($current as $plugin) {
-			array_splice($current, array_search($plugin, $current), 1);
-			do_action('deactivate_' . $plugin);
-		}
-		
-		update_option('active_plugins', array());
+		deactivate_all_plugins();
 		wp_redirect('plugins.php?deactivate-all=true');
+	} elseif ('reactivate-all' == $_GET['action']) {
+		check_admin_referer('reactivate-all');
+		reactivate_all_plugins('plugins.php?errors=true');
+		wp_redirect('plugins.php?reactivate-all=true'); // overrides the ?error=true one above
 	}
+
 	exit;
 }
 
 $title = __('Manage Plugins');
 require_once('admin-header.php');
 
-// Clean up options
-// If any plugins don't exist, axe 'em
+validate_active_plugins();
 
-$check_plugins = get_option('active_plugins');
-
-// Sanity check.  If the active plugin list is not an array, make it an
-// empty array.
-if ( !is_array($check_plugins) ) {
-	$check_plugins = array();
-	update_option('active_plugins', $check_plugins);
-}
-
-// If a plugin file does not exist, remove it from the list of active
-// plugins.
-foreach ($check_plugins as $check_plugin) {
-	if (!file_exists(ABSPATH . PLUGINDIR . '/' . $check_plugin)) {
-			$current = get_option('active_plugins');
-			$key = array_search($check_plugin, $current);
-			if ( false !== $key && NULL !== $key ) {
-				unset($current[$key]);
-				update_option('active_plugins', $current);
-			}
-	}
-}
 ?>
 
 <?php if ( isset($_GET['error']) ) : ?>
-	<div id="message" class="updated fade"><p><?php _e('Plugin could not be activated because it triggered a <strong>fatal error</strong>.') ?></p></div>
+	<div id="message" class="updated fade"><p><?php _e('Plugin could not be activated because it triggered a <strong>fatal error</strong>.') ?></p>
+	<?php
+		$plugin = trim($_GET['plugin']);
+		if ( wp_verify_nonce($_GET['_error_nonce'], 'plugin-activation-error_' . $plugin) ) { ?>
+	<iframe style="border:0" width="100%" height="70px" src="<?php bloginfo('wpurl'); ?>/wp-admin/plugins.php?action=error_scrape&amp;plugin=<?php echo attribute_escape($plugin); ?>&amp;_wpnonce=<?php echo attribute_escape($_GET['_error_nonce']); ?>"></iframe>
+	<?php
+		}
+	?>
+	</div>
+<?php elseif ( isset($_GET['errors']) ) : ?>
+	<div id="message" class="updated fade"><p><?php _e('Some plugins could not be reactivated because they triggered a <strong>fatal error</strong>.') ?></p></div>
 <?php elseif ( isset($_GET['activate']) ) : ?>
 	<div id="message" class="updated fade"><p><?php _e('Plugin <strong>activated</strong>.') ?></p></div>
 <?php elseif ( isset($_GET['deactivate']) ) : ?>
 	<div id="message" class="updated fade"><p><?php _e('Plugin <strong>deactivated</strong>.') ?></p></div>
 <?php elseif (isset($_GET['deactivate-all'])) : ?>
 	<div id="message" class="updated fade"><p><?php _e('All plugins <strong>deactivated</strong>.'); ?></p></div>
+<?php elseif (isset($_GET['reactivate-all'])) : ?>
+	<div id="message" class="updated fade"><p><?php _e('Plugins <strong>reactivated</strong>.'); ?></p></div>
 <?php endif; ?>
 
 <div class="wrap">
@@ -87,9 +70,6 @@
 <p><?php _e('Plugins extend and expand the functionality of WordPress. Once a plugin is installed, you may activate it or deactivate it here.'); ?></p>
 <?php
 
-if ( get_option('active_plugins') )
-	$current_plugins = get_option('active_plugins');
-
 $plugins = get_plugins();
 
 if (empty($plugins)) {
@@ -98,28 +78,53 @@
 	echo '</p>';
 } else {
 ?>
-<table class="widefat plugins">
+
+<div class="tablenav">
+	<div class="alignleft">
+	<?php
+	$active = get_option('active_plugins');
+	$inactive = get_option('deactivated_plugins');
+	if ( !empty($active) ) {
+	?>
+	<a class="button-secondary" href="<?php echo wp_nonce_url('plugins.php?action=deactivate-all', 'deactivate-all'); ?>" class="delete"><?php _e('Deactivate All Plugins'); ?></a>
+	<?php
+	} elseif ( empty($active) && !empty($inactive) ) {
+	?>
+	<a class="button-secondary" href="<?php echo wp_nonce_url('plugins.php?action=reactivate-all', 'reactivate-all'); ?>" class="delete"><?php _e('Reactivate Plugins'); ?></a>
+	<?php
+	} // endif active/inactive plugin check
+	?>
+	</div>
+	<br class="clear" />
+</div>
+
+<br class="clear" />
+
+<table class="widefat">
 	<thead>
 	<tr>
 		<th><?php _e('Plugin'); ?></th>
-		<th style="text-align: center"><?php _e('Version'); ?></th>
+		<th class="num"><?php _e('Version'); ?></th>
 		<th><?php _e('Description'); ?></th>
-		<th style="text-align: center"<?php if ( current_user_can('edit_plugins') ) echo ' colspan="2"'; ?>><?php _e('Action'); ?></th>
+		<th class="status"><?php _e('Status') ?></th>
+		<th class="action-links"><?php _e('Action'); ?></th>
 	</tr>
 	</thead>
+	<tbody id="plugins">
 <?php
-	$style = '';
-
 	foreach($plugins as $plugin_file => $plugin_data) {
-		$style = ('class="alternate"' == $style|| 'class="alternate active"' == $style) ? '' : 'alternate';
+		$action_links = array();
+		
+		$style = '';
 
-		if (!empty($current_plugins) && in_array($plugin_file, $current_plugins)) {
-			$toggle = "<a href='" . wp_nonce_url("plugins.php?action=deactivate&amp;plugin=$plugin_file", 'deactivate-plugin_' . $plugin_file) . "' title='".__('Deactivate this plugin')."' class='delete'>".__('Deactivate')."</a>";
-			$plugin_data['Title'] = "<strong>{$plugin_data['Title']}</strong>";
-			$style .= $style == 'alternate' ? ' active' : 'active';
+		if ( is_plugin_active($plugin_file) ) {
+			$action_links[] = "<a href='" . wp_nonce_url("plugins.php?action=deactivate&amp;plugin=$plugin_file", 'deactivate-plugin_' . $plugin_file) . "' title='".__('Deactivate this plugin')."' class='delete'>".__('Deactivate')."</a>";
+			$style = 'active';
 		} else {
-			$toggle = "<a href='" . wp_nonce_url("plugins.php?action=activate&amp;plugin=$plugin_file", 'activate-plugin_' . $plugin_file) . "' title='".__('Activate this plugin')."' class='edit'>".__('Activate')."</a>";
+			$action_links[] = "<a href='" . wp_nonce_url("plugins.php?action=activate&amp;plugin=$plugin_file", 'activate-plugin_' . $plugin_file) . "' title='".__('Activate this plugin')."' class='edit'>".__('Activate')."</a>";
 		}
+		if ( current_user_can('edit_plugins') && is_writable(ABSPATH . PLUGINDIR . '/' . $plugin_file) )
+			$action_links[] = "<a href='plugin-editor.php?file=$plugin_file' title='".__('Open this file in the Plugin Editor')."' class='edit'>".__('Edit')."</a>";
 
 		$plugins_allowedtags = array('a' => array('href' => array(),'title' => array()),'abbr' => array('title' => array()),'acronym' => array('title' => array()),'code' => array(),'em' => array(),'strong' => array());
 
@@ -128,34 +133,35 @@
 		$plugin_data['Version']     = wp_kses($plugin_data['Version'], $plugins_allowedtags);
 		$plugin_data['Description'] = wp_kses($plugin_data['Description'], $plugins_allowedtags);
 		$plugin_data['Author']      = wp_kses($plugin_data['Author'], $plugins_allowedtags);
+		$author = ( empty($plugin_data['Author']) ) ? '' :  ' <cite>' . sprintf( __('By %s'), $plugin_data['Author'] ) . '.</cite>';
 
 		if ( $style != '' )
-			$style = 'class="' . $style . '"';
-		if ( is_writable(ABSPATH . PLUGINDIR . '/' . $plugin_file) )
-			$edit = "<a href='plugin-editor.php?file=$plugin_file' title='".__('Open this file in the Plugin Editor')."' class='edit'>".__('Edit')."</a>";
-		else
-			$edit = '';
+			$style = ' class="' . $style . '"';
+
+		$action_links = apply_filters('plugin_action_links', $action_links, $plugin_file, $plugin_info);
 
 		echo "
-	<tr $style>
+	<tr$style>
 		<td class='name'>{$plugin_data['Title']}</td>
 		<td class='vers'>{$plugin_data['Version']}</td>
-		<td class='desc'><p>{$plugin_data['Description']} <cite>".sprintf(__('By %s'), $plugin_data['Author']).".</cite></p></td>
-		<td class='togl'>$toggle</td>";
-		if ( current_user_can('edit_plugins') )
-		echo "
-		<td>$edit</td>";
-		echo"
+		<td class='desc'><p>{$plugin_data['Description']}$author</p></td>
+		<td class='status'>";
+		if ( is_plugin_active($plugin_file) )
+			echo  __('<span class="active">Active</span>');
+		else
+			_e('<span class="inactive">Inactive</span>');
+		echo "</td>
+		<td class='togl action-links'>$toggle";  
+		if ( !empty($action_links) )
+			echo implode(' | ', $action_links);
+		echo "</td> 
 	</tr>";
+	do_action( 'after_plugin_row', $plugin_file );
 	}
 ?>
-
-<tr>
-	<td colspan="3">&nbsp;</td>
-	<td colspan="2" style="width:12em;"><a href="<?php echo wp_nonce_url('plugins.php?action=deactivate-all', 'deactivate-all'); ?>" class="delete"><?php _e('Deactivate All Plugins'); ?></a></td>
-</tr>
-
+	</tbody>
 </table>
+
 <?php
 }
 ?>
diff -x .svn -aruN 2.2.2.src/wp-admin/post-new.php 2.5.src/wp-admin/post-new.php
--- 2.2.2.src/wp-admin/post-new.php	2007-02-22 09:30:47.000000000 -0600
+++ 2.5.src/wp-admin/post-new.php	2008-03-14 02:07:46.000000000 -0500
@@ -3,14 +3,18 @@
 $title = __('Create New Post');
 $parent_file = 'post-new.php';
 $editing = true;
-wp_enqueue_script('prototype');
-wp_enqueue_script('interface');
 wp_enqueue_script('autosave');
+wp_enqueue_script('post');
+if ( user_can_richedit() )
+	wp_enqueue_script('editor');
+wp_enqueue_script('thickbox');
+wp_enqueue_script('media-upload');
+
 require_once ('./admin-header.php');
 
 if ( ! current_user_can('edit_posts') ) { ?>
 <div class="wrap">
-<p><?php printf(__('Since you&#8217;re a newcomer, you&#8217;ll have to wait for an admin to raise your level to 1, in order to be authorized to post.<br />
+<p><?php printf(__('Since you&#8217;re a newcomer, you&#8217;ll have to wait for an admin to add the <code>edit_posts</code> capability to your user, in order to be authorized to post.<br />
 You can also <a href="mailto:%s?subject=Promotion?">e-mail the admin</a> to ask for a promotion.<br />
 When you&#8217;re promoted, just reload this page and you&#8217;ll be able to blog. :)'), get_option('admin_email')); ?>
 </p>
@@ -20,78 +24,18 @@
 	exit();
 }
 
-if ( isset($_GET['posted']) && $_GET['posted'] ) : ?>
-<div id="message" class="updated fade"><p><strong><?php _e('Post saved.'); ?></strong> <a href="<?php echo get_permalink( $_GET['posted'] ); ?>"><?php _e('View post'); ?> &raquo;</a></p></div>
+if ( isset($_GET['posted']) && $_GET['posted'] ) : $_GET['posted'] = (int) $_GET['posted']; ?>
+<div id="message" class="updated fade"><p><strong><?php _e('Your post has been saved.'); ?></strong> <a href="<?php echo get_permalink( $_GET['posted'] ); ?>"><?php _e('View post'); ?></a> | <a href="post.php?action=edit&amp;post=<?php echo $_GET['posted']; ?>"><?php _e('Edit post'); ?></a></p></div>
 <?php
 endif;
+?>
+
 
-if ( $drafts = get_users_drafts( $user_ID ) ) { ?>
-<div class="wrap">
-<p><strong><?php _e('Your Drafts:') ?></strong>
-<?php
-// Show drafts.
-	$num_drafts = count($drafts);
-	if ( $num_drafts > 15 ) $num_drafts = 15;
-	for ( $i = 0; $i < $num_drafts; $i++ ) {
-		$draft = $drafts[$i];
-		if ( 0 != $i )
-			echo ', ';
-		if ( empty($draft->post_title) )
-			$draft->post_title = sprintf(__('Post # %s'), $draft->ID);
-		echo "<a href='post.php?action=edit&amp;post=$draft->ID' title='" . __('Edit this draft') . "'>$draft->post_title</a>";
-	}
-
-	if ( 15 < count($drafts) ) { ?>
-		, <a href="edit.php"><?php echo sprintf(__('and %s more'), (count($drafts) - 15) ); ?> &raquo;</a>
-	<?php } ?>
-.</p>
-</div>
 <?php
-}
 
 // Show post form.
 $post = get_default_post_to_edit();
 include('edit-form-advanced.php');
-?>
-
-<?php if ( $is_NS4 || $is_gecko || $is_winIE ) { ?>
-<div id="wp-bookmarklet" class="wrap">
-<h3><?php _e('WordPress Bookmarklet'); ?></h3>
-<p><?php _e('Right click on the following link and choose "Add to favorites" to create a posting shortcut.'); ?></p>
-<p>
 
-<?php
-if ($is_NS4 || $is_gecko) {
-?>
-<a href="javascript:if(navigator.userAgent.indexOf('Safari') >= 0){Q=getSelection();}else{Q=document.selection?document.selection.createRange().text:document.getSelection();}location.href='<?php echo get_option('siteurl') ?>/wp-admin/post-new.php?text='+encodeURIComponent(Q)+'&amp;popupurl='+encodeURIComponent(location.href)+'&amp;popuptitle='+encodeURIComponent(document.title);"><?php printf(__('Press It - %s'), wp_specialchars(get_option('blogname'))); ?></a> 
-<?php
-} else if ($is_winIE) {
+include('admin-footer.php');
 ?>
-<a href="javascript:Q='';if(top.frames.length==0)Q=document.selection.createRange().text;location.href='<?php echo get_option('siteurl') ?>/wp-admin/post-new.php?text='+encodeURIComponent(Q)+'&amp;popupurl='+encodeURIComponent(location.href)+'&amp;popuptitle='+encodeURIComponent(document.title);"><?php printf(__('Press it - %s'), get_option('blogname')); ?></a>
-<script type="text/javascript">
-<!--
-function oneclickbookmarklet(blah) {
-window.open ("profile.php?action=IErightclick", "oneclickbookmarklet", "width=500, height=450, location=0, menubar=0, resizable=0, scrollbars=1, status=1, titlebar=0, toolbar=0, screenX=120, left=120, screenY=120, top=120");
-}
-// -->
-</script>
-<br />
-<br />
-<?php _e('One-click bookmarklet:') ?><br />
-<a href="javascript:oneclickbookmarklet(0);"><?php _e('click here') ?></a> 
-<?php
-} else if ($is_opera) {
-?>
-<a href="javascript:location.href='<?php echo get_option('siteurl'); ?>/wp-admin/post-new.php?popupurl='+escape(location.href)+'&popuptitle='+escape(document.title);"><?php printf(__('Press it - %s'), get_option('blogname')); ?></a> 
-<?php
-} else if ($is_macIE) {
-?>
-<a href="javascript:Q='';location.href='<?php echo get_option('siteurl'); ?>/wp-admin/bookmarklet.php?text='+escape(document.getSelection())+'&popupurl='+escape(location.href)+'&popuptitle='+escape(document.title);"><?php printf(__('Press it - %s'), get_option('blogname')); ?></a> 
-<?php
-}
-?>
-</p>
-</div>
-<?php } ?>
-
-<?php include('admin-footer.php'); ?>
diff -x .svn -aruN 2.2.2.src/wp-admin/post.php 2.5.src/wp-admin/post.php
--- 2.2.2.src/wp-admin/post.php	2007-03-31 17:02:19.000000000 -0500
+++ 2.5.src/wp-admin/post.php	2008-03-29 01:47:30.000000000 -0500
@@ -6,57 +6,98 @@
 
 wp_reset_vars(array('action', 'safe_mode', 'withcomments', 'posts', 'content', 'edited_post_title', 'comment_error', 'profile', 'trackback_url', 'excerpt', 'showcomments', 'commentstart', 'commentend', 'commentorder'));
 
+function redirect_post($post_ID = '') {
+	global $action;
+
+	$referredby = '';
+	if ( !empty($_POST['referredby']) )
+		$referredby = preg_replace('|https?://[^/]+|i', '', $_POST['referredby']);
+	$referer = preg_replace('|https?://[^/]+|i', '', wp_get_referer());
+
+	if ( !empty($_POST['mode']) && 'bookmarklet' == $_POST['mode'] ) {
+		$location = $_POST['referredby'];
+	} elseif ( !empty($_POST['mode']) && 'sidebar' == $_POST['mode'] ) {
+		$location = 'sidebar.php?a=b';
+	} elseif ( isset($_POST['save']) && ( empty($referredby) || $referredby == $referer || 'redo' != $referredby ) ) {
+		if ( $_POST['_wp_original_http_referer'] && strpos( $_POST['_wp_original_http_referer'], '/wp-admin/post.php') === false && strpos( $_POST['_wp_original_http_referer'], '/wp-admin/post-new.php') === false )
+			$location = add_query_arg( '_wp_original_http_referer', urlencode( stripslashes( $_POST['_wp_original_http_referer'] ) ), "post.php?action=edit&post=$post_ID&message=1" );
+		else
+			$location = "post.php?action=edit&post=$post_ID&message=4";
+	} elseif (isset($_POST['addmeta']) && $_POST['addmeta']) {
+		$location = add_query_arg( 'message', 2, wp_get_referer() );
+		$location = explode('#', $location);
+		$location = $location[0] . '#postcustom';
+	} elseif (isset($_POST['deletemeta']) && $_POST['deletemeta']) {
+		$location = add_query_arg( 'message', 3, wp_get_referer() );
+		$location = explode('#', $location);
+		$location = $location[0] . '#postcustom';
+	} elseif (!empty($referredby) && $referredby != $referer) {
+		$location = $_POST['referredby'];
+		if ( $_POST['referredby'] == 'redo' )
+			$location = get_permalink( $post_ID );
+		elseif ( false !== strpos($location, 'edit.php') )
+			$location = add_query_arg('posted', $post_ID, $location);		
+		elseif ( false !== strpos($location, 'wp-admin') )
+			$location = "post-new.php?posted=$post_ID";
+	} elseif ( isset($_POST['publish']) ) {
+		$location = "post-new.php?posted=$post_ID";
+	} elseif ($action == 'editattachment') {
+		$location = 'attachments.php';
+	} else {
+		$location = "post.php?action=edit&post=$post_ID&message=4";
+	}
+
+	wp_redirect( $location );
+}
+
 if ( isset( $_POST['deletepost'] ) )
 	$action = 'delete';
 
 switch($action) {
 case 'postajaxpost':
 case 'post':
-	$parent_file = 'post-new.php';
-	$submenu_file = 'post-new.php';
 	check_admin_referer('add-post');
 
 	$post_ID = 'post' == $action ? write_post() : edit_post();
 
-	// Redirect.
-	if (!empty($_POST['mode'])) {
-	switch($_POST['mode']) {
-		case 'bookmarklet':
-			$location = $_POST['referredby'];
-			break;
-		case 'sidebar':
-			$location = 'sidebar.php?a=b';
-			break;
-		default:
-			$location = 'post-new.php';
-			break;
-		}
-	} else {
-		$location = "post-new.php?posted=$post_ID";
-	}
-
-	if ( isset($_POST['save']) )
-		$location = "post.php?action=edit&post=$post_ID";
-
-	wp_redirect($location);
+	redirect_post($post_ID);
 	exit();
 	break;
 
 case 'edit':
 	$title = __('Edit');
 	$editing = true;
+
+	if ( empty( $_GET['post'] ) ) {
+		wp_redirect("post.php");
+		exit();
+	}
 	$post_ID = $p = (int) $_GET['post'];
 	$post = get_post($post_ID);
 
+	if ( empty($post->ID) ) wp_die( __("You attempted to edit a post that doesn't exist. Perhaps it was deleted?") );
+
 	if ( 'page' == $post->post_type ) {
 		wp_redirect("page.php?action=edit&post=$post_ID");
 		exit();
 	}
 
-	if($post->post_status == 'draft') {
-		wp_enqueue_script('prototype');
+	wp_enqueue_script('post');
+	if ( user_can_richedit() )
+		wp_enqueue_script('editor');
+	wp_enqueue_script('thickbox');
+	wp_enqueue_script('media-upload');
+	if ( $last = wp_check_post_lock( $post->ID ) ) {
+		$last_user = get_userdata( $last );
+		$last_user_name = $last_user ? $last_user->display_name : __('Somebody');
+		$message = sprintf( __( 'Warning: %s is currently editing this post' ), wp_specialchars( $last_user_name ) );
+		$message = str_replace( "'", "\'", "<div class='error'><p>$message</p></div>" );
+		add_action('admin_notices', create_function( '', "echo '$message';" ) );
+	} else {
+		wp_set_post_lock( $post->ID );
 		wp_enqueue_script('autosave');
 	}
+
 	require_once('admin-header.php');
 
 	if ( !current_user_can('edit_post', $post_ID) )
@@ -89,49 +130,7 @@
 
 	$post_ID = edit_post();
 
-	if ( 'post' == $_POST['originalaction'] ) {
-		if (!empty($_POST['mode'])) {
-		switch($_POST['mode']) {
-			case 'bookmarklet':
-				$location = $_POST['referredby'];
-				break;
-			case 'sidebar':
-				$location = 'sidebar.php?a=b';
-				break;
-			default:
-				$location = 'post-new.php';
-				break;
-			}
-		} else {
-			$location = "post-new.php?posted=$post_ID";
-		}
-
-		if ( isset($_POST['save']) )
-			$location = "post.php?action=edit&post=$post_ID";
-	} else {
-		$referredby = '';
-		if ( !empty($_POST['referredby']) )
-			$referredby = preg_replace('|https?://[^/]+|i', '', $_POST['referredby']);
-		$referer = preg_replace('|https?://[^/]+|i', '', wp_get_referer());
-
-		if ($_POST['save']) {
-			$location = "post.php?action=edit&post=$post_ID";
-		} elseif ($_POST['updatemeta']) {
-			$location = wp_get_referer() . '&message=2#postcustom';
-		} elseif ($_POST['deletemeta']) {
-			$location = wp_get_referer() . '&message=3#postcustom';
-		} elseif (!empty($referredby) && $referredby != $referer) {
-			$location = $_POST['referredby'];
-			if ( $_POST['referredby'] == 'redo' )
-				$location = get_permalink( $post_ID );
-		} elseif ($action == 'editattachment') {
-			$location = 'attachments.php';
-		} else {
-			$location = 'post-new.php';
-		}
-	}
-
-	wp_redirect($location); // Send user on their way while we keep working
+	redirect_post($post_ID); // Send user on their way while we keep working
 
 	exit();
 	break;
@@ -149,7 +148,7 @@
 		if ( ! wp_delete_attachment($post_id) )
 			wp_die( __('Error in deleting...') );
 	} else {
-		if ( !wp_delete_post($post_id) ) 
+		if ( !wp_delete_post($post_id) )
 			wp_die( __('Error in deleting...') );
 	}
 
diff -x .svn -aruN 2.2.2.src/wp-admin/profile-update.php 2.5.src/wp-admin/profile-update.php
--- 2.2.2.src/wp-admin/profile-update.php	2006-12-19 17:19:12.000000000 -0600
+++ 2.5.src/wp-admin/profile-update.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,30 +0,0 @@
-<?php
-
-$parent_file = 'profile.php';
-$submenu_file = 'profile.php';
-require_once('admin.php');
-
-check_admin_referer('update-profile_' . $user_ID);
-
-if ( !$_POST )
-	wp_die( __('No post?') );
-
-$errors = edit_user($user_ID);
-
-if ( is_wp_error( $errors ) ) {
-	foreach( $errors->get_error_messages() as $message )
-		echo "$message<br />";
-	exit;
-}
-
-do_action('personal_options_update');
-
-if ( 'profile' == $_POST['from'] )
-	$to = 'profile.php?updated=true';
-else
-	$to = 'profile.php?updated=true';
-
-wp_redirect( $to );
-exit;
-
-?>
diff -x .svn -aruN 2.2.2.src/wp-admin/profile.php 2.5.src/wp-admin/profile.php
--- 2.2.2.src/wp-admin/profile.php	2006-11-19 01:56:05.000000000 -0600
+++ 2.5.src/wp-admin/profile.php	2008-01-31 16:03:48.000000000 -0600
@@ -1,150 +1,4 @@
 <?php
-require_once('admin.php');
-
-$title = __('Profile');
-
-if ( current_user_can('edit_users') )
-	$parent_file = 'users.php';
-else
-	$parent_file = 'profile.php';
-include_once('admin-header.php');
-$profileuser = get_user_to_edit($user_ID);
-
-$bookmarklet_height= 440;
+define('IS_PROFILE_PAGE', true);
+require_once('user-edit.php');
 ?>
-
-<?php if ( isset($_GET['updated']) ) { ?>
-<div id="message" class="updated fade">
-<p><strong><?php _e('Profile updated.') ?></strong></p>
-</div>
-<?php } ?>
-
-<div class="wrap">
-<h2><?php _e('Your Profile and Personal Options'); ?></h2>
-<form name="profile" id="your-profile" action="profile-update.php" method="post">
-<?php wp_nonce_field('update-profile_' . $user_ID) ?>
-<p>
-<input type="hidden" name="from" value="profile" />
-<input type="hidden" name="checkuser_id" value="<?php echo $user_ID ?>" />
-</p>
-
-<h3><?php _e('Personal Options'); ?></h3>
-
-<?php if ( rich_edit_exists() ) : // don't bother showing the option if the editor has been removed ?>
-<p><label for="rich_editing"><input name="rich_editing" type="checkbox" id="rich_editing" value="true" <?php checked('true', get_user_option('rich_editing')); ?> />
-<?php _e('Use the visual editor when writing') ?></label></p>
-<?php endif; ?>
-
-<?php do_action('profile_personal_options'); ?>
-
-<p class="submit"><input type="submit" value="<?php _e('Update Profile &raquo;') ?>" name="submit" /></p>
-
-<fieldset>
-<legend><?php _e('Name'); ?></legend>
-<p><label><?php _e('Username: (no editing)'); ?><br />
-<input type="text" name="user_login" value="<?php echo $profileuser->user_login; ?>" disabled="disabled" />
-</label></p>
-
-<p><label><?php _e('First name:') ?><br />
-<input type="text" name="first_name" value="<?php echo $profileuser->first_name ?>" /></label></p>
-
-<p><label><?php _e('Last name:') ?><br />
-<input type="text" name="last_name"  value="<?php echo $profileuser->last_name ?>" /></label></p>
-
-<p><label><?php _e('Nickname:') ?><br />
-<input type="text" name="nickname" value="<?php echo $profileuser->nickname ?>" /></label></p>
-
-<p><label><?php _e('Display name publicly as:') ?> <br />
-<select name="display_name">
-<option value="<?php echo $profileuser->display_name; ?>"><?php echo $profileuser->display_name; ?></option>
-<option value="<?php echo $profileuser->nickname ?>"><?php echo $profileuser->nickname ?></option>
-<option value="<?php echo $profileuser->user_login ?>"><?php echo $profileuser->user_login ?></option>
-<?php if ( !empty( $profileuser->first_name ) ) : ?>
-<option value="<?php echo $profileuser->first_name ?>"><?php echo $profileuser->first_name ?></option>
-<?php endif; ?>
-<?php if ( !empty( $profileuser->last_name ) ) : ?>
-<option value="<?php echo $profileuser->last_name ?>"><?php echo $profileuser->last_name ?></option>
-<?php endif; ?>
-<?php if ( !empty( $profileuser->first_name ) && !empty( $profileuser->last_name ) ) : ?>
-<option value="<?php echo $profileuser->first_name." ".$profileuser->last_name ?>"><?php echo $profileuser->first_name." ".$profileuser->last_name ?></option>
-<option value="<?php echo $profileuser->last_name." ".$profileuser->first_name ?>"><?php echo $profileuser->last_name." ".$profileuser->first_name ?></option>
-<?php endif; ?>
-</select></label></p>
-</fieldset>
-
-<fieldset>
-<legend><?php _e('Contact Info'); ?></legend>
-
-<p><label><?php _e('E-mail: (required)') ?><br />
-<input type="text" name="email" value="<?php echo $profileuser->user_email ?>" /></label></p>
-
-<p><label><?php _e('Website:') ?><br />
-<input type="text" name="url" value="<?php echo $profileuser->user_url ?>" />
-</label></p>
-
-<p><label><?php _e('AIM:') ?><br />
-<input type="text" name="aim" value="<?php echo $profileuser->aim ?>" />
-</label></p>
-
-<p><label><?php _e('Yahoo IM:') ?><br />
-<input type="text" name="yim" value="<?php echo $profileuser->yim ?>" />
-</label></p>
-
-<p><label><?php _e('Jabber / Google Talk:') ?><br />
-<input type="text" name="jabber" value="<?php echo $profileuser->jabber ?>" /></label>
-</p>
-</fieldset>
-<br clear="all" />
-<fieldset>
-<legend><?php _e('About Yourself'); ?></legend>
-<p class="desc"><?php _e('Share a little biographical information. '); ?></p>
-<p><textarea name="description" rows="5" cols="30"><?php echo $profileuser->description ?></textarea></p>
-</fieldset>
-
-<?php
-$show_password_fields = apply_filters('show_password_fields', true);
-if ( $show_password_fields ) :
-?>
-<fieldset>
-<legend><?php _e('Update Your Password'); ?></legend>
-<p class="desc"><?php _e('If you would like to change your password type a new one twice below. Otherwise leave this blank.'); ?></p>
-<p><label><?php _e('New Password:'); ?><br />
-<input type="password" name="pass1" size="16" value="" />
-</label></p>
-<p><label><?php _e('Type it one more time:'); ?><br />
-<input type="password" name="pass2" size="16" value="" />
-</label></p>
-</fieldset>
-<?php endif; ?>
-
-<?php do_action('show_user_profile'); ?>
-
-<br clear="all" />
-
-	<table width="99%"  border="0" cellspacing="2" cellpadding="3" class="editform">
-		<?php
-		if(count($profileuser->caps) > count($profileuser->roles)):
-		?>
-		<tr>
-			<th scope="row"><?php _e('Additional Capabilities:') ?></th>
-			<td><?php
-			$output = '';
-			foreach($profileuser->caps as $cap => $value) {
-				if(!$wp_roles->is_role($cap)) {
-					if($output != '') $output .= ', ';
-					$output .= $value ? $cap : "Denied: {$cap}";
-				}
-			}
-			echo $output;
-			?></td>
-    </tr>
-    <?php
-    endif;
-    ?>
-  </table>
-<p class="submit"><input type="submit" value="<?php _e('Update Profile &raquo;') ?>" name="submit" /></p>
-</form>
-
-</div>
-
-<?php include('admin-footer.php'); ?>
diff -x .svn -aruN 2.2.2.src/wp-admin/rtl.css 2.5.src/wp-admin/rtl.css
--- 2.2.2.src/wp-admin/rtl.css	2007-04-12 22:29:43.000000000 -0500
+++ 2.5.src/wp-admin/rtl.css	2008-03-27 15:33:56.000000000 -0500
@@ -1,205 +1,314 @@
-#viewarc, #viewcat, #namediv, #emaildiv, #uridiv, #planetnews li, #login ul li, #your-profile fieldset, 
-	#footer .logo, .alignleft .available-theme { float: right; }
-
-#templateside, .alignright { float: left; }
-
-#login #send, .readmore, .widefat th { text-align: right; }
-
-#postcustomsubmit, form#upload th, .submit, .editform th { text-align: left; }
-
-#devnews h4, #wphead h1, #your-profile legend, fieldset.options legend, 
-	#planetnews li .post { font-family: Tahoma, Georgia, "Times New Roman", Times, serif; }
+html,#edit-slug-box,#trackback,#category_nicename,#slug,#dbuser,#dbpass,#dbname,#dbhost,#dbprefix,#dccharset,input[name=gmpath],input[name=archivespath],input[name=lastentry],input[name=email],input[name=url],input[name=aim],input[name=yim],input[name=jabber],#newcontent,#email,#newcomment_author_url,#pass1,#pass2,#siteurl,#home,#admin_email,#date_format,#time_format,#mailserver_url,#mailserver_login,#mailserver_pass,#ping_sites,#blog_charset,#moderation_keys,#blacklist_keys,#permalink_structure,#category_base,#tag_base,#upload_path,#upload_url_path,#insertonly[src],#insertonly[href],#mailserver_port,#thumbnail_size_w,#thumbnail_size_h,#medium_size_w,#medium_size_h,#posts_per_page,#posts_per_rss,#comment_max_links,#insertonly[src],#link_url,#link_image,#rss_uri,#user_login,#key
+{
+	direction:ltr;
+	text-align:left
+}
 
-#wphead { padding: .8em 2em .8em 19em; }
+body, td {
+	font-family: Tahoma,Verdana,sans-serif;
+}
 
-#wphead h1 { font-size: 2.4em; }
+#wpwrap,#footer,#TB_title,.media-upload-form,#media-upload-header
+{
+	direction:rtl!important;
+	text-align:right!important
+}
 
-#postdiv, #titlediv, #guiddiv, #tagdiv { margin: 0 0 0 8px; }
+#user_info
+{
+	left:15px;
+	right:auto
+}
 
-#ed_toolbar input { margin: 3px 0 2px 2px; }
+#wphead h1
+{
+	margin:0 0 0 15%;
+	padding:11px 15px 16px 170px
+}
 
-#edButtons input, #edButtons input:active { margin: 0px 0 -1px 2px; }
+#wphead #viewsite
+{
+	margin-left:0;
+	margin-right:10px
+}
 
-body, td { font: 13px Tahoma, "Lucida Grande", "Lucida Sans Unicode", Verdana; }
+#sidemenu
+{
+	float:left;
+	margin:-30px 315px 0 15px;
+	padding-left:0;
+	padding-right:10px
+}
 
-h2 { font: normal 32px/5px serif; }
+#dashmenu
+{
+	font-size:11px;
+	left:auto;
+	padding-left:0;
+	padding-right:9px;
+	right:0
+}
 
-textarea, input, select { font:  13px Tahoma, Verdana, Arial, Helvetica, sans-serif; }
+#dashmenu a
+{
+	margin-left:8px;
+	margin-right:8px;
+}
 
-.quicktags, .search { font: 12px Tahoma, Georgia, "Times New Roman", Times, serif; }
+#adminmenu
+{
+	height:32px;
+	padding:5px 8px 0 0
+}
 
-.updated, .confirm { padding: 0 3em 0 1em; }
+#adminmenu li a
+{
+	display:block;
+	float:right;
+	font:700 16px/100% "Times New Roman", Times, serif;
+	margin:0 0 0 10px;
+	padding:5px 7px 9px
+}
 
-.submit input, .submit input:focus, .button, .button:focus {
-	border-left-color: #999;
-	border-right-color: #ccc;
+#adminmenu li a.current
+{
+	font-weight:700
 }
 
-.submit input:active, .button:active {
-	border-left-color: #ccc;
-	border-right-color: #999;
+#adminmenu li a #awaiting-mod
+{
+	background:url(images/comment-stalk-rtl.gif) -309px bottom !important;
+	font-family: Tahoma, Verdana, sans-serif;
+	margin-left:-45px;
+	margin-right:.2em;
+	margin-top:-5px
 }
 
-#adminmenu {
-	padding: .2em 2em .3em .2em;
-	height: 28px;
+#adminmenu li a:hover #awaiting-mod
+{
+	background-position: -229px bottom !important;
 }
 
-#adminmenu li { line-height: 160%; }
+#adminmenu li a #awaiting-mod span
+{
+	left:0;
+	right:auto
+}
 
-#adminmenu a {
-	margin: 0 0 0 10px;
-	display: block;
-	float: right;
+#submenu li a
+{
+	display:block;
+	float:right;
+	margin:0 10px 10px 0;
+	padding:2px 4px
 }
 
-#adminmenu a.current {
-	border-right: 0;
-	border-left: 2px solid #4f96c8;
+p#post-search
+{
+	left:0;
+	right:auto
 }
 
-#submenu, #minisub { padding: 1px 3em 0 2em; }
+.tablenav div
+{
+	float:right!important
+}
 
-#submenu { height: 28px; }
+ul.view-switch
+{
+	float:left;
+	margin:-28px 0 -2px 5px
+}
 
-#submenu li { line-height: 160%; }
+#currenttheme img
+{
+	float:right;
+	margin-left:1em;
+	margin-right:0
+}
 
-#submenu a {
-	margin: 0 0 0 10px;
-	display: block;
-	float: right;
+form#themeselector
+{
+	float:left
 }
 
-#submenu .current {
-	border-right: 0;
-	border-left: 2px solid #045290;
+.form-table input.tog
+{
+	float:right;
+	margin-right:0;
+	margin-left:2px;
 }
 
-#currenttheme img {
-	float: right;
-	margin-right: auto;
-	margin-left: 1em;
+.curtime
+{
+	background-position:right 2px;
+	padding-left:0;
+	padding-right:18px;
 }
 
-#postdiv #quicktags {
-	padding-right: 0;
-	padding-left: 6px;
+#poststuff #edButtonPreview,#poststuff #edButtonHTML
+{
+	float:left;
+	margin-left:8px;
+	margin-right:0
 }
 
-.readmore {
-	margin-right: auto;
-	margin-left: 5em;
+#poststuff #media-buttons
+{
+	direction: ltr;
+	float:left;
+	margin-left:20px;
+	margin-right:0
 }
 
-#postexcerpt div, #attachmentlinks div {
-	margin-right: auto;
-	margin-left: 8px;
+#poststuff #media-buttons a
+{
+	margin-left:8px;
+	margin-right:0;
+	padding: 0 5px 2px 2px;
 }
 
-* html #postexcerpt .dbx-toggle-open {
-	padding-right: 0;
-	padding-left: 8px;
+#poststuff .togbox
+{
+	margin-left:0;
+	margin-right:-19px
+}
+
+#categorydiv ul#category-tabs,#linkcategorydiv ul#category-tabs
+{
+	float:right;
+	margin:0 0 0 -120px;
+	text-align:left
+}
+
+ul#category-tabs li.ui-tabs-selected,#poststuff .togbox
+{
+	-khtml-border-bottom-left-radius:0;
+	-khtml-border-bottom-right-radius:3px;
+	-khtml-border-top-left-radius:0;
+	-khtml-border-top-right-radius:3px;
+	-moz-border-radius-bottomleft:0;
+	-moz-border-radius-bottomright:3px;
+	-moz-border-radius-topleft:0;
+	-moz-border-radius-topright:3px;
+	-webkit-border-bottom-left-radius:0;
+	-webkit-border-bottom-right-radius:3px;
+	-webkit-border-top-left-radius:0;
+	-webkit-border-top-right-radius:3px;
+	border-bottom-left-radius:0;
+	border-bottom-right-radius:3px;
+	border-top-left-radius:0;
+	border-top-right-radius:3px
+}
+
+div.ui-tabs-panel
+{
+	margin:0 120px 0 0
+}
+
+#tagchecklist span
+{
+	float:right;
+	margin-left:25px;
+	margin-right:0
 }
 
-#searchform {
+#tagchecklist span a {
+	margin: 6px -9px 0 0;
 	float: right;
-	margin-right: auto;
-	margin-left: 1em;
 }
 
-#poststuff {
-	margin-right: auto;
-	margin-left: 16em;
-}
 
-#template div {
-	margin-right: auto;
-	margin-left: 190px;
+.tablenav .tablenav-pages
+{
+	float:left !important;
+	width:200px
 }
 
-* html #template div {
-	margin-right: auto;
-	margin-left: 0px;
+.tablenav-pages .page-numbers
+{
+	display:block;
+	float:right
 }
 
-#user_info {
-	right: auto;
-	left: 1em;
+.side-info ul
+{
+	padding-left:0;
+	padding-right:18px
 }
 
-#zeitgeist {
-	float: left;
-	margin-left: auto;
-	margin-right: 1em;
+.form-table table.color-palette {
+	float:right;
 }
 
-#zeitgeist ul {
-	margin: 0 .6em .3em 0;
-	padding: 0 .6em 0 0;
+#pass-strength-result
+{
+	float:right;
+	margin-right:0;
+	margin-left:5px;
 }
 
-#categorydiv ul {
-	margin-left: auto;
-	margin-right: 10px;
+td.comment p.comment-author img.avatar
+{
+	float:right !important;
+	margin-right:0 !important;
+	margin-left:8px !important;
 }
 
-#moremeta fieldset div { margin: 2px 0px 0 0; }
-
-#moremeta {
-	margin-right: auto;
-	margin-left: 15px;
-	right: auto;
-	left: 5%;
+#footer
+{
+	padding:10px 0 0
 }
 
-#moremeta .dbx-content {
-	background: url(images/box-butt.gif) no-repeat bottom left;
-	padding-right: 0;
-	padding-left: 2px;
+#footer p
+{
+	height:35px;
+	margin-right:20px;
+	padding:12px 40px 0 0;
 }
 
-#moremeta .dbx-handle { background: #2685af url(images/box-head.gif) no-repeat left; }
-
-#moremeta .dbx-box { background: url(images/box-bg.gif) repeat-y left; }
-
-a.dbx-toggle, a.dbx-toggle:visited {
-	right: auto;
-	left: 2px;
+#submenu,#wpbody
+{
+	clear:both;
 }
 
-#advancedstuff a.dbx-toggle, #advancedstuff a.dbx-toggle-open:visited {
-	right: auto;
-	left: 5px;
+#submenu li,ul.subsubsub li a
+{
+	padding:0;
 }
 
-#advancedstuff a.dbx-toggle-open, #advancedstuff a.dbx-toggle-open:visited {
-	right: auto;
-	left: 5px;
+table.widefat th,.form-table th
+{
+	text-align:right
 }
 
-#categorychecklist {
-	margin-right: auto;
-	margin-left: 6px;
+.widefat th input {
+	margin: 0 8px 0 0;
+	padding: 0;
 }
 
-#ajax-response.alignleft {
-	margin-left: auto;
-	margin-right: 2em;
+.available-theme,#tagchecklist span a
+{
+	float:right
 }
-
-#postdivrich #edButtons {
-	padding-left: 0;
-	padding-right: 3px;
+#template div {
+	margin-right:0;
+	margin-left:190px;
+}
+.submitbox .submit {
+	text-align:right;
 }
 
-.page-numbers {
-	margin-right: auto;
-	margin-left: 3px;
+#editorcontainer {
+	border:1px solid;
 }
 
-a.view-link {
-	right:auto;
-	left:5%;
-	margin-right:0;
-	margin-left:220px;
+.wrap h2 {
+	margin: 5px -4px 0 0;
+	padding-right: 0px;
+	padding-left: 280px;
 }
+
+div#message {
+	clear: both;
+}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/setup-config.php 2.5.src/wp-admin/setup-config.php
--- 2.2.2.src/wp-admin/setup-config.php	2007-03-08 12:31:46.000000000 -0600
+++ 2.5.src/wp-admin/setup-config.php	2008-02-23 22:33:10.000000000 -0600
@@ -1,87 +1,49 @@
 <?php
 define('WP_INSTALLING', true);
+//These two defines are required to allow us to use require_wp_db() to load the database class while being wp-content/wp-db.php aware
+define('ABSPATH', dirname(dirname(__FILE__)).'/');
+define('WPINC', 'wp-includes');
+
+require_once('../wp-includes/compat.php');
+require_once('../wp-includes/functions.php');
+require_once('../wp-includes/classes.php');
 
 if (!file_exists('../wp-config-sample.php'))
-	die('Sorry, I need a wp-config-sample.php file to work from. Please re-upload this file from your WordPress installation.');
+	wp_die('Sorry, I need a wp-config-sample.php file to work from. Please re-upload this file from your WordPress installation.');
 
 $configFile = file('../wp-config-sample.php');
 
-if (!is_writable('../')) die("Sorry, I can't write to the directory. You'll have to either change the permissions on your WordPress directory or create your wp-config.php manually.");
+if ( !is_writable('../'))
+	wp_die("Sorry, I can't write to the directory. You'll have to either change the permissions on your WordPress directory or create your wp-config.php manually.");
 
+// Check if wp-config.php has been created
+if (file_exists('../wp-config.php'))
+	wp_die("<p>The file 'wp-config.php' already exists. If you need to reset any of the configuration items in this file, please delete it first. You may try <a href='install.php'>installing now</a>.</p>");
 
 if (isset($_GET['step']))
 	$step = $_GET['step'];
 else
 	$step = 0;
-header( 'Content-Type: text/html; charset=utf-8' );
+
+function display_header(){
+	header( 'Content-Type: text/html; charset=utf-8' );
 ?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-<title>WordPress &rsaquo; Setup Configuration File</title>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<style media="screen" type="text/css">
-	<!--
-	html {
-		background: #eee;
-	}
-	body {
-		background: #fff;
-		color: #000;
-		font-family: Georgia, "Times New Roman", Times, serif;
-		margin-left: 20%;
-		margin-right: 20%;
-		padding: .2em 2em;
-	}
-
-	h1 {
-		color: #006;
-		font-size: 18px;
-		font-weight: lighter;
-	}
-
-	h2 {
-		font-size: 16px;
-	}
-
-	p, li, dt {
-		line-height: 140%;
-		padding-bottom: 2px;
-	}
+<title>WordPress &rsaquo; Setup Configuration File</title>
+<link rel="stylesheet" href="<?php echo $admin_dir; ?>css/install.css" type="text/css" />
 
-	ul, ol {
-		padding: 5px 5px 5px 20px;
-	}
-	#logo {
-		margin-bottom: 2em;
-	}
-	.step a, .step input {
-		font-size: 2em;
-	}
-	td input {
-		font-size: 1.5em;
-	}
-	.step, th {
-		text-align: right;
-	}
-	#footer {
-		text-align: center;
-		border-top: 1px solid #ccc;
-		padding-top: 1em;
-		font-style: italic;
-	}
-	-->
-	</style>
 </head>
 <body>
 <h1 id="logo"><img alt="WordPress" src="images/wordpress-logo.png" /></h1>
 <?php
-// Check if wp-config.php has been created
-if (file_exists('../wp-config.php'))
-	die("<p>The file 'wp-config.php' already exists. If you need to reset any of the configuration items in this file, please delete it first. You may try <a href='install.php'>installing now</a>.</p></body></html>");
+}//end function display_header();
 
 switch($step) {
 	case 0:
+		display_header();
 ?>
 
 <p>Welcome to WordPress. Before getting started, we need some information on the database. You will need to know the following items before proceeding.</p>
@@ -93,16 +55,18 @@
 	<li>Table prefix (if you want to run more than one WordPress in a single database) </li>
 </ol>
 <p><strong>If for any reason this automatic file creation doesn't work, don't worry. All this does is fill in the database information to a configuration file. You may also simply open <code>wp-config-sample.php</code> in a text editor, fill in your information, and save it as <code>wp-config.php</code>. </strong></p>
-<p>In all likelihood, these items were supplied to you by your ISP. If you do not have this information, then you will need to contact them before you can continue. If you&#8217;re all ready, <a href="setup-config.php?step=1">let&#8217;s go</a>! </p>
+<p>In all likelihood, these items were supplied to you by your ISP. If you do not have this information, then you will need to contact them before you can continue. If you&#8217;re all ready&hellip;</p>
+
+<p><a href="setup-config.php?step=1" class="button">Let&#8217;s go!</a></p>
 <?php
 	break;
 
 	case 1:
+		display_header();
 	?>
-</p>
 <form method="post" action="setup-config.php?step=2">
 	<p>Below you should enter your database connection details. If you're not sure about these, contact your host. </p>
-	<table>
+	<table class="form-table">
 		<tr>
 			<th scope="row">Database Name</th>
 			<td><input name="dbname" type="text" size="25" value="wordpress" /></td>
@@ -130,7 +94,7 @@
 		</tr>
 	</table>
 	<h2 class="step">
-	<input name="submit" type="submit" value="Submit" />
+	<input name="submit" type="submit" value="Submit" class="button" />
 	</h2>
 </form>
 <?php
@@ -151,7 +115,10 @@
 	define('DB_HOST', $dbhost);
 
 	// We'll fail here if the values are no good.
-	require_once('../wp-includes/wp-db.php');
+	require_wp_db();
+	if ( !empty($wpdb->error) )
+		wp_die($wpdb->error->get_error_message());
+
 	$handle = fopen('../wp-config.php', 'w');
 
 	foreach ($configFile as $line_num => $line) {
@@ -177,12 +144,15 @@
 	}
 	fclose($handle);
 	chmod('../wp-config.php', 0666);
+
+	display_header();
 ?>
-<p>All right sparky! You've made it through this part of the installation. WordPress can now communicate with your database. If you are ready, time now to <a href="install.php">run the install!</a></p>
+<p>All right sparky! You've made it through this part of the installation. WordPress can now communicate with your database. If you are ready, time now to&hellip;</p>
+
+<p><a href="install.php" class="button">Run the install</a></p>
 <?php
 	break;
 }
 ?>
-<p id="footer"><a href="http://wordpress.org/">WordPress</a>, personal publishing platform.</p>
 </body>
 </html>
diff -x .svn -aruN 2.2.2.src/wp-admin/sidebar.php 2.5.src/wp-admin/sidebar.php
--- 2.2.2.src/wp-admin/sidebar.php	2006-11-19 01:56:05.000000000 -0600
+++ 2.5.src/wp-admin/sidebar.php	2008-03-26 18:41:41.000000000 -0500
@@ -11,13 +11,16 @@
 ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-<title>WordPress &#8250; Posted</title>
 <meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=UTF-8" />
-<link rel="stylesheet" href="wp-admin.css" type="text/css" />
+<title><?php _e('WordPress &#8250; Posted'); ?></title>
+<?php
+wp_admin_css( 'css/global' );
+wp_admin_css();
+?>
 </head>
 <body>
-	<p>Posted !</p>
-	<p><a href="sidebar.php">Click here</a> to post again.</p>
+	<p><?php _e('Posted !'); ?></p>
+	<p><?php printf(__('<a href="%s">Click here</a> to post again.'), 'sidebar.php'); ?></p>
 </body>
 </html><?php
 
@@ -26,9 +29,12 @@
 ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-<title>WordPress &#8250; Sidebar</title>
 <meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php bloginfo('blog_charset'); ?>" />
-<link rel="stylesheet" href="wp-admin.css" type="text/css" />
+<title><?php _e('WordPress &#8250; Sidebar'); ?></title>
+<?php
+wp_admin_css( 'css/global' );
+wp_admin_css();
+?>
 <style type="text/css" media="screen">
 form {
 	padding: 3px;
@@ -49,13 +55,15 @@
 <body id="sidebar">
 <h1 id="wphead"><a href="http://wordpress.org/" rel="external">WordPress</a></h1>
 <form name="post" action="post.php" method="post">
-<div><input type="hidden" name="action" value="post" />
+<div>
+<input type="hidden" name="action" value="post" />
 <input type="hidden" name="user_ID" value="<?php echo $user_ID ?>" />
 <input type="hidden" name="mode" value="sidebar" />
-<p>Title:
+<?php wp_nonce_field('add-post'); ?>
+<p><?php _e('Title:'); ?>
 <input type="text" name="post_title" size="20" tabindex="1" style="width: 100%;" />
 </p>
-<p>Categories:
+<p><?php _e('Categories:'); ?>
 <span class="sidebar-categories">
 <?php dropdown_categories(); ?>
 </span>
@@ -65,9 +73,9 @@
 <textarea rows="8" cols="12" style="width: 100%" name="content" tabindex="2"></textarea>
 </p>
 <p>
-	<input name="saveasdraft" type="submit" id="saveasdraft" tabindex="9" value="Save as Draft" />
+	<input name="saveasdraft" type="submit" id="saveasdraft" tabindex="9" value="<?php _e('Save as Draft'); ?>" />
 <?php if ( current_user_can('publish_posts') ) : ?>
-	<input name="publish" type="submit" id="publish" tabindex="6" style="font-weight: bold;" value="Publish" />
+	<input name="publish" type="submit" id="publish" tabindex="6" value="<?php _e('Publish') ?>" class="button button-highlighted" />
 <?php endif; ?>
 </p>
 </div>
diff -x .svn -aruN 2.2.2.src/wp-admin/templates.php 2.5.src/wp-admin/templates.php
--- 2.2.2.src/wp-admin/templates.php	2007-03-06 23:29:15.000000000 -0600
+++ 2.5.src/wp-admin/templates.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,160 +0,0 @@
-<?php
-require_once('admin.php');
-$title = __('Template &amp; File Editing');
-$parent_file = 	'edit.php';
-
-wp_reset_vars(array('action', 'redirect', 'profile', 'error', 'warning', 'a', 'file'));
-
-$recents = get_option('recently_edited');
-
-if (empty($file)) {
-	if ($recents) {
-		$file = $recents[0];
-	} else {
-		$file = 'index.php';
-	}
-}
-
-$file = validate_file_to_edit($file);
-$real_file = get_real_file_to_edit($file);
-
-switch($action) {
-
-case 'update':
-
-	check_admin_referer('edit-file_' . $file);
-
-	if ( ! current_user_can('edit_files') )
-		wp_die('<p>'.__('You do not have sufficient permissions to edit templates for this blog.').'</p>');
-
-	$newcontent = stripslashes($_POST['newcontent']);
-	if (is_writeable($real_file)) {
-		$f = @ fopen($real_file, 'w+');
-		if ( $f ) {
-			fwrite($f, $newcontent);
-			fclose($f);
-			wp_redirect("templates.php?file=$file&a=te");
-		} else {
-			wp_redirect("templates.php?file=$file&a=err");
-		}
-	} else {
-		wp_redirect("templates.php?file=$file&a=err");
-	}
-
-	exit();
-
-break;
-
-default:
-
-	require_once('./admin-header.php');
-
-	if ( ! current_user_can('edit_files') )
-		wp_die('<p>'.__('You do not have sufficient permissions to edit templates for this blog.').'</p>');
-
-	if (strpos($file, 'wp-config.php') !== false)
-	wp_die('<p>'.__('The config file cannot be edited or viewed through the web interface. Sorry!').'</p>');
-
-	update_recently_edited($file);
-
-	if (!is_file($real_file))
-		$error = true;
-
-	if (!$error) {
-		$f = @ fopen($real_file, 'r');
-		if ( $f ) {
-			if ( filesize($real_file ) > 0 ) {
-				$content = fread($f, filesize($real_file));
-				$content = htmlspecialchars($content);
-			} else {
-				$content = '';
-			}
-		} else {
-			$error = true;
-		}
-	}
-
-	?>
-<?php if (isset($_GET['a'])) : ?>
-	<?php if ( 'err' == $_GET['a'] ) : ?>
- <div id="message" class="error"><p><?php _e('Could not save file.') ?></p></div>
-	<?php else: ?>
- <div id="message" class="updated fade"><p><?php _e('File edited successfully.') ?></p></div>
-	<?php endif; ?>
-<?php endif; ?>
- <div class="wrap">
-<?php
-if (is_writeable($real_file)) {
-	echo '<h2>' . sprintf(__('Editing <strong>%s</strong>'), wp_specialchars($file) ) . '</h2>';
-} else {
-	echo '<h2>' . sprintf(__('Browsing <strong>%s</strong>'), wp_specialchars($file) ) . '</h2>';
-}
-?>
-<div id="templateside">
-<?php
-if ( $recents ) :
-?>
-<h3><?php _e('Recent'); ?></h3>
-<?php
-echo '<ol>';
-foreach ($recents as $recent) :
-	echo "<li><a href='templates.php?file=" . attribute_escape($recent) . "'>" . wp_specialchars(get_file_description(basename($recent))) . "</a></li>";
-endforeach;
-echo '</ol>';
-endif;
-?>
-<h3><?php _e('Common'); ?></h3>
-	<?php $common_files = array('index.php', '.htaccess', 'my-hacks.php');
- $old_files = array('wp-layout.css', 'wp-comments.php', 'wp-comments-popup.php');
- foreach ($old_files as $old_file) {
-	 if (file_exists(ABSPATH . $old_file))
-		 $common_files[] = $old_file;
- } ?>
-<ul>
-	<?php foreach ($common_files as $common_file) : ?>
-		<li><a href="templates.php?file=<?php echo $common_file?>"><?php echo get_file_description($common_file); ?></a></li>
-	<?php endforeach; ?>
-</ul>
-</div>
-<?php if (!$error) { ?>
-	<form name="template" id="template" action="templates.php" method="post">
-	<?php wp_nonce_field('edit-file_' . $file) ?>
-		<div><textarea cols="70" rows="25" name="newcontent" id='newcontent' tabindex="1"><?php echo $content ?></textarea>
-		<input type="hidden" name="action" value="update" />
-		<input type="hidden" name="file" value="<?php echo $file ?>" />
-		</div>
-<?php if ( is_writeable($real_file) ) : ?>
-	<p class="submit">
-<?php
-	echo "<input type='submit' name='submit' value='	" . __('Update File &raquo;') . "' tabindex='2' />";
-?>
-</p>
-<?php else : ?>
-<p><em><?php _e('If this file were writable you could edit it.'); ?></em></p>
-<?php endif; ?>
-	</form>
-	<?php
-	} else {
-		echo '<div class="error"><p>' . __('Oops, no such file exists! Double check the name and try again, merci.') . '</p></div>';
-	}
-	?>
-<div class="clear"> &nbsp; </div>
-</div>
-<div class="wrap">
-<h2><?php _e('Other Files') ?></h2>
-
-	<p><?php _e('To edit a file, type its name here. You can edit any file <a href="http://codex.wordpress.org/Changing_File_Permissions" title="Read more about making files writable">writable by the server</a>, e.g. CHMOD 666.') ?></p>
-	<form name="file" action="templates.php" method="get">
-		<input type="text" name="file" />
-		<input type="submit" name="submit"  value="<?php _e('Edit file &raquo;') ?>" />
-	</form>
-
-	<p><?php _e('Note: of course, you can also edit the files/templates in your text editor of choice and upload them. This online editor is only meant to be used when you don&#8217;t have access to a text editor or FTP client.') ?></p>
-</div>
-<?php
-
-break;
-}
-
-include("admin-footer.php");
-?>
diff -x .svn -aruN 2.2.2.src/wp-admin/theme-editor.php 2.5.src/wp-admin/theme-editor.php
--- 2.2.2.src/wp-admin/theme-editor.php	2006-12-21 04:10:04.000000000 -0600
+++ 2.5.src/wp-admin/theme-editor.php	2008-03-14 18:58:31.000000000 -0500
@@ -6,6 +6,11 @@
 
 wp_reset_vars(array('action', 'redirect', 'profile', 'error', 'warning', 'a', 'file', 'theme'));
 
+add_action( 'admin_head', 'theme_editor_css' );
+function theme_editor_css(){
+	wp_admin_css( 'css/theme-editor' );
+}
+
 $themes = get_themes();
 
 if (empty($theme)) {
@@ -78,42 +83,63 @@
 	?>
 <?php if (isset($_GET['a'])) : ?>
  <div id="message" class="updated fade"><p><?php _e('File edited successfully.') ?></p></div>
-<?php endif; ?>
- <div class="wrap">
-	<form name="theme" action="theme-editor.php" method="post">
-		<?php _e('Select theme to edit:') ?>
+<?php endif;
+
+$description = get_file_description($file);
+$desc_header = ( $description != $file_show ) ? "$description</strong> (%s)" : "%s";
+?>
+<div class="wrap">
+<div class="bordertitle">
+	<h2><?php _e('Theme Editor'); ?></h2>
+	<form id="themeselector" name="theme" action="theme-editor.php" method="post">
+		<strong><?php _e('Select theme to edit:'); ?> </strong>
 		<select name="theme" id="theme">
-	<?php
-		foreach ($themes as $a_theme) {
-		$theme_name = $a_theme['Name'];
-		if ($theme_name == $theme) $selected = " selected='selected'";
-		else $selected = '';
-		$theme_name = attribute_escape($theme_name);
-		echo "\n\t<option value=\"$theme_name\" $selected>$theme_name</option>";
-	}
+<?php
+	foreach ($themes as $a_theme) {
+	$theme_name = $a_theme['Name'];
+	if ($theme_name == $theme) $selected = " selected='selected'";
+	else $selected = '';
+	$theme_name = attribute_escape($theme_name);
+	echo "\n\t<option value=\"$theme_name\" $selected>$theme_name</option>";
+}
 ?>
- </select>
- <input type="submit" name="Submit" value="<?php _e('Select &raquo;') ?>" class="button" />
- </form>
- </div>
-
- <div class="wrap"> 
-  <?php
-	if ( is_writeable($real_file) ) {
-		echo '<h2>' . sprintf(__('Editing <code>%s</code>'), $file_show) . '</h2>';
-	} else {
-		echo '<h2>' . sprintf(__('Browsing <code>%s</code>'), $file_show) . '</h2>';
-	}
-	?>
+		</select>
+		<input type="submit" name="Submit" value="<?php _e('Select') ?>" class="button" />
+	</form>
+</div>
+<div class="tablenav">
+<div class="alignleft">
+<big><strong><?php echo sprintf($desc_header, $file_show); ?></big>
+</div>
+<br class="clear" />
+</div>
+<br class="clear" />
 	<div id="templateside">
-	<h3><?php printf(__("<strong>'%s'</strong> theme files"), $theme) ?></h3>
+	<h3 id="bordertitle"><?php _e("Theme Files"); ?></h3>
 
 <?php
 if ($allowed_files) :
 ?>
+	<h4><?php _e('Templates'); ?></h4>
 	<ul>
-<?php foreach($allowed_files as $allowed_file) : ?>
-		 <li><a href="theme-editor.php?file=<?php echo "$allowed_file"; ?>&amp;theme=<?php echo urlencode($theme) ?>"><?php echo get_file_description($allowed_file); ?></a></li>
+<?php foreach($themes[$theme]['Template Files'] as $template_file) :
+		$description = get_file_description($template_file);
+		$template_show = basename($template_file);
+		$filedesc = ( $description != $template_file ) ? "$description <span class='nonessential'>($template_show)</span>" : "$description";
+		$filedesc = ( $template_file == $file ) ? "<span class='highlight'>$description <span class='nonessential'>($template_show)</span></span>" : $filedesc;
+		?>
+		<li><a href="theme-editor.php?file=<?php echo "$template_file"; ?>&amp;theme=<?php echo urlencode($theme) ?>"><?php echo $filedesc ?></a></li>
+<?php endforeach; ?>
+	</ul>
+	<h4><?php echo _c('Styles|Theme stylesheets in theme editor'); ?></h4>
+	<ul>
+<?php foreach($themes[$theme]['Stylesheet Files'] as $style_file) :
+		$description = get_file_description($style_file);
+		$style_show = basename($style_file);
+		$filedesc = ( $description != $style_file ) ? "$description <span class='nonessential'>($style_show)</span>" : "$description";
+		$filedesc = ( $style_file == $file ) ? "<span class='highlight'>$description <span class='nonessential'>($style_show)</span></span>" : $filedesc;
+		?>
+		<li><a href="theme-editor.php?file=<?php echo "$style_file"; ?>&amp;theme=<?php echo urlencode($theme) ?>"><?php echo $filedesc ?></a></li>
 <?php endforeach; ?>
 	</ul>
 <?php endif; ?>
@@ -128,15 +154,18 @@
 		 <input type="hidden" name="file" value="<?php echo $file ?>" />
 		 <input type="hidden" name="theme" value="<?php echo $theme ?>" />
 		 </div>
+
+		<div>
 <?php if ( is_writeable($real_file) ) : ?>
-	<p class="submit">
+			<p class="submit">
 <?php
-	echo "<input type='submit' name='submit' value='	" . __('Update File &raquo;') . "' tabindex='2' />";
+	echo "<input type='submit' name='submit' value='" . __('Update File') . "' tabindex='2' />";
 ?>
 </p>
 <?php else : ?>
-<p><em><?php _e('If this file were writable you could edit it.'); ?></em></p>
+<p><em><?php _e('You need to make this file writable before you can save your changes. See <a href="http://codex.wordpress.org/Changing_File_Permissions">the Codex</a> for more information.'); ?></em></p>
 <?php endif; ?>
+		</div>
 	</form>
 	<?php
 	} else {
diff -x .svn -aruN 2.2.2.src/wp-admin/themes.php 2.5.src/wp-admin/themes.php
--- 2.2.2.src/wp-admin/themes.php	2007-03-06 21:05:41.000000000 -0600
+++ 2.5.src/wp-admin/themes.php	2008-03-26 02:14:07.000000000 -0500
@@ -5,14 +5,7 @@
 	check_admin_referer('switch-theme_' . $_GET['template']);
 
 	if ('activate' == $_GET['action']) {
-		if ( isset($_GET['template']) )
-			update_option('template', $_GET['template']);
-
-		if ( isset($_GET['stylesheet']) )
-			update_option('stylesheet', $_GET['stylesheet']);
-
-		do_action('switch_theme', get_current_theme());
-
+		switch_theme($_GET['template'], $_GET['stylesheet']);
 		wp_redirect('themes.php?activated=true');
 		exit;
 	}
@@ -26,7 +19,7 @@
 <?php if ( ! validate_current_theme() ) : ?>
 <div id="message1" class="updated fade"><p><?php _e('The active theme is broken.  Reverting to the default theme.'); ?></p></div>
 <?php elseif ( isset($_GET['activated']) ) : ?>
-<div id="message2" class="updated fade"><p><?php printf(__('New theme activated. <a href="%s">View site &raquo;</a>'), get_bloginfo('url') . '/'); ?></p></div>
+<div id="message2" class="updated fade"><p><?php printf(__('New theme activated. <a href="%s">Visit site</a>'), get_bloginfo('url') . '/'); ?></p></div>
 <?php endif; ?>
 
 <?php
@@ -40,13 +33,16 @@
 <?php if ( $ct->screenshot ) : ?>
 <img src="<?php echo get_option('siteurl') . '/' . $ct->stylesheet_dir . '/' . $ct->screenshot; ?>" alt="<?php _e('Current theme preview'); ?>" />
 <?php endif; ?>
-<h3><?php printf(__('%1$s %2$s by %3$s'), $ct->title, $ct->version, $ct->author) ; ?></h3>
+<h3><?php printf(_c('%1$s %2$s by %3$s|1: theme title, 2: theme version, 3: theme author'), $ct->title, $ct->version, $ct->author) ; ?></h3>
 <p><?php echo $ct->description; ?></p>
 <?php if ($ct->parent_theme) { ?>
 	<p><?php printf(__('The template files are located in <code>%2$s</code>.  The stylesheet files are located in <code>%3$s</code>.  <strong>%4$s</strong> uses templates from <strong>%5$s</strong>.  Changes made to the templates will affect both themes.'), $ct->title, $ct->template_dir, $ct->stylesheet_dir, $ct->title, $ct->parent_theme); ?></p>
 <?php } else { ?>
 	<p><?php printf(__('All of this theme&#8217;s files are located in <code>%2$s</code>.'), $ct->title, $ct->template_dir, $ct->stylesheet_dir); ?></p>
 <?php } ?>
+<?php if ( $ct->tags ) : ?>
+<p><?php _e('Tags:'); ?> <?php echo join(', ', $ct->tags); ?></p>
+<?php endif; ?>
 </div>
 
 <h2><?php _e('Available Themes'); ?></h2>
@@ -69,10 +65,11 @@
 	$author = $themes[$theme_name]['Author'];
 	$screenshot = $themes[$theme_name]['Screenshot'];
 	$stylesheet_dir = $themes[$theme_name]['Stylesheet Dir'];
-	$activate_link = wp_nonce_url("themes.php?action=activate&amp;template=$template&amp;stylesheet=$stylesheet", 'switch-theme_' . $template);
+	$tags = $themes[$theme_name]['Tags'];
+	$activate_link = wp_nonce_url("themes.php?action=activate&amp;template=".urlencode($template)."&amp;stylesheet=".urlencode($stylesheet), 'switch-theme_' . $template);
 ?>
 <div class="available-theme">
-<h3><a href="<?php echo $activate_link; ?>"><?php echo "$title $version"; ?></a></h3>
+<h3><a href="<?php echo $activate_link; ?>"><?php echo $title; ?></a></h3>
 
 <a href="<?php echo $activate_link; ?>" class="screenshot">
 <?php if ( $screenshot ) : ?>
@@ -81,6 +78,9 @@
 </a>
 
 <p><?php echo $description; ?></p>
+<?php if ( $tags ) : ?>
+<p><?php _e('Tags:'); ?> <?php echo join(', ', $tags); ?></p>
+<?php endif; ?>
 </div>
 <?php } // end foreach theme_names ?>
 
diff -x .svn -aruN 2.2.2.src/wp-admin/update-links.php 2.5.src/wp-admin/update-links.php
--- 2.2.2.src/wp-admin/update-links.php	2006-11-19 01:56:05.000000000 -0600
+++ 2.5.src/wp-admin/update-links.php	2007-08-02 19:45:06.000000000 -0500
@@ -1,5 +1,5 @@
 <?php
-require_once( dirname( dirname(__FILE__) ) . '/wp-config.php');
+require_once('../wp-config.php');
 require_once( ABSPATH . 'wp-includes/class-snoopy.php');
 
 if ( !get_option('use_linksupdate') )
diff -x .svn -aruN 2.2.2.src/wp-admin/update.php 2.5.src/wp-admin/update.php
--- 2.2.2.src/wp-admin/update.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-admin/update.php	2008-03-21 18:02:00.000000000 -0500
@@ -0,0 +1,173 @@
+<?php
+
+require_once('admin.php');
+
+if ( !current_user_can('edit_plugins') )
+                wp_die('<p>'.__('You do not have sufficient permissions to update plugins for this blog.').'</p>');
+
+function request_filesystem_credentials($form_post, $type = '', $error = false) {
+	$req_cred = apply_filters('request_filesystem_credentials', '', $form_post, $type, $error);
+	if ( '' !== $req_cred )
+		return $req_cred;
+
+	if ( empty($type) )
+		$type = get_filesystem_method();
+
+	if ( 'direct' == $type )
+		return true;
+		
+	if( ! $credentials = get_option('ftp_credentials') )
+		$credentials = array();
+	// If defined, set it to that, Else, If POST'd, set it to that, If not, Set it to whatever it previously was(saved details in option)
+	$credentials['hostname'] = defined('FTP_HOST') ? FTP_HOST : (!empty($_POST['hostname']) ? $_POST['hostname'] : $credentials['hostname']);
+	$credentials['username'] = defined('FTP_USER') ? FTP_USER : (!empty($_POST['username']) ? $_POST['username'] : $credentials['username']);
+	$credentials['password'] = defined('FTP_PASS') ? FTP_PASS : (!empty($_POST['password']) ? $_POST['password'] : $credentials['password']);
+	$credentials['ssl']      = defined('FTP_SSL')  ? FTP_SSL  : (!empty($_POST['ssl'])      ? $_POST['ssl']      : $credentials['ssl']);
+
+	if ( ! $error && !empty($credentials['password']) && !empty($credentials['username']) && !empty($credentials['hostname']) ) {
+		$stored_credentials = $credentials;
+		unset($stored_credentials['password']);
+		update_option('ftp_credentials', $stored_credentials);
+		return $credentials;
+	}
+	$hostname = '';
+	$username = '';
+	$password = '';
+	$ssl = '';
+	if ( !empty($credentials) )
+		extract($credentials, EXTR_OVERWRITE);
+	if( $error )
+		echo '<div id="message" class="error"><p>' . __('<strong>Error:</strong> There was an error connecting to the server, Please verify the settings are correct.') . '</p></div>';
+?>
+<form action="<?php echo $form_post ?>" method="post">
+<div class="wrap">
+<h2><?php _e('FTP Connection Information') ?></h2>
+<p><?php _e('To perform the requested update, FTP connection information is required.') ?></p>
+<table class="form-table">
+<tr valign="top">
+<th scope="row"><?php _e('Hostname:') ?></th>
+<td><input name="hostname" type="text" id="hostname" value="<?php echo attribute_escape($hostname) ?>"<?php if( defined('FTP_HOST') ) echo ' disabled="disabled"' ?> size="40" /></td>
+</tr>
+<tr valign="top">
+<th scope="row"><?php _e('Username:') ?></th>
+<td><input name="username" type="text" id="username" value="<?php echo attribute_escape($username) ?>"<?php if( defined('FTP_USER') ) echo ' disabled="disabled"' ?> size="40" /></td>
+</tr>
+<tr valign="top">
+<th scope="row"><?php _e('Password:') ?></th>
+<td><input name="password" type="password" id="password" value=""<?php if( defined('FTP_PASS') ) echo ' disabled="disabled"' ?> size="40" /><?php if( defined('FTP_PASS') && !empty($password) ) echo '<em>'.__('(Password not shown)').'</em>'; ?></td>
+</tr>
+<tr valign="top">
+<th scope="row"><?php _e('Use SSL:') ?></th>
+<td>
+<select name="ssl" id="ssl"<?php if( defined('FTP_SSL') ) echo ' disabled="disabled"' ?>>
+<?php
+foreach ( array(0 => __('No'), 1 => __('Yes')) as $key => $value ) :
+	$selected = ($ssl == $value) ? 'selected="selected"' : '';
+	echo "\n\t<option value='$key' $selected>" . $value . '</option>';
+endforeach;
+?>
+</select>
+</td>
+</tr>
+</table>
+<p class="submit">
+<input type="submit" name="submit" value="<?php _e('Proceed'); ?>" />
+</p>
+</div>
+</form>
+<?php
+	return false;
+}
+
+function show_message($message) {
+	if( is_wp_error($message) ){
+		if( $message->get_error_data() )
+			$message = $message->get_error_message() . ': ' . $message->get_error_data();
+		else 
+			$message = $message->get_error_message();
+	}
+	echo "<p>$message</p>\n";
+}
+
+function do_plugin_upgrade($plugin) {
+	global $wp_filesystem;
+
+	$url = wp_nonce_url("update.php?action=upgrade-plugin&plugin=$plugin", "upgrade-plugin_$plugin");
+	if ( false === ($credentials = request_filesystem_credentials($url)) )
+		return;
+
+	if ( ! WP_Filesystem($credentials) ) {
+		request_filesystem_credentials($url, '', true); //Failed to connect, Error and request again
+		return;
+	}
+
+	echo '<div class="wrap">';
+	echo '<h2>' . __('Upgrade Plugin') . '</h2>';
+	if ( $wp_filesystem->errors->get_error_code() ) {
+		foreach ( $wp_filesystem->errors->get_error_messages() as $message )
+			show_message($message);
+		echo '</div>';
+		return;
+	}
+
+	$was_activated = is_plugin_active($plugin); //Check now, It'll be deactivated by the next line if it is,
+
+	$result = wp_update_plugin($plugin, 'show_message');
+
+	if ( is_wp_error($result) ) {
+		show_message($result);
+	} else {
+		//Result is the new plugin file relative to PLUGINDIR
+		show_message(__('Plugin upgraded successfully'));	
+		if( $result && $was_activated ){
+			show_message(__('Attempting reactivation of the plugin'));
+			echo '<iframe style="border:0" width="100%" height="170px" src="' . wp_nonce_url('update.php?action=activate-plugin&plugin=' . $result, 'activate-plugin_' . $result) .'"></iframe>';
+		}
+	}
+	echo '</div>';
+}
+
+if ( isset($_GET['action']) ) {
+	$plugin = isset($_GET['plugin']) ? trim($_GET['plugin']) : '';
+
+	if ( 'upgrade-plugin' == $_GET['action'] ) {
+		check_admin_referer('upgrade-plugin_' . $plugin);
+		$title = __('Upgrade Plugin');
+		$parent_file = 'plugins.php';
+		require_once('admin-header.php');
+		do_plugin_upgrade($plugin);
+		include('admin-footer.php');
+	} elseif ('activate-plugin' == $_GET['action'] ) {
+		check_admin_referer('activate-plugin_' . $plugin);
+		if( ! isset($_GET['failure']) && ! isset($_GET['success']) ) {
+			wp_redirect( 'update.php?action=activate-plugin&failure=true&plugin=' . $plugin . '&_wpnonce=' . $_GET['_wpnonce'] ); 
+			activate_plugin($plugin);
+			wp_redirect( 'update.php?action=activate-plugin&success=true&plugin=' . $plugin . '&_wpnonce=' . $_GET['_wpnonce'] ); 
+			die();
+		}
+			?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" <?php do_action('admin_xml_ns'); ?> <?php language_attributes(); ?>>
+<head>
+<meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php echo get_option('blog_charset'); ?>" />
+<title><?php bloginfo('name') ?> &rsaquo; <?php _e('Plugin Reactivation'); ?> &#8212; <?php _e('WordPress'); ?></title>
+<?php
+wp_admin_css( 'css/global' );
+wp_admin_css( 'css/colors' );
+?>
+</head>
+<body>
+<?php
+		if( isset($_GET['success']) )
+			echo '<p>' . __('Plugin reactivated successfully.') . '</p>';
+
+		if( isset($_GET['failure']) ){
+			echo '<p>' . __('Plugin failed to reactivate due to a fatal error.') . '</p>';
+			error_reporting( E_ALL ^ E_NOTICE );
+			@ini_set('display_errors', true); //Ensure that Fatal errors are displayed.
+			include(ABSPATH . PLUGINDIR . '/' . $plugin);
+		}
+		echo "</body></html>";
+	}
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/upgrade-functions.php 2.5.src/wp-admin/upgrade-functions.php
--- 2.2.2.src/wp-admin/upgrade-functions.php	2007-05-10 11:31:49.000000000 -0500
+++ 2.5.src/wp-admin/upgrade-functions.php	2008-04-22 19:05:48.000000000 -0500
@@ -1,1124 +1,5 @@
 <?php
-
-if ( file_exists(ABSPATH . 'wp-content/install.php') )
-	require (ABSPATH . 'wp-content/install.php');
-require_once(ABSPATH . '/wp-admin/admin-functions.php');
-require_once(ABSPATH . '/wp-admin/admin-db.php');
-require_once(ABSPATH . '/wp-admin/upgrade-schema.php');
-require_once(ABSPATH . WPINC . '/registration.php');
-
-if ( !function_exists('wp_install') ) :
-function wp_install($blog_title, $user_name, $user_email, $public, $meta='') {
-	global $wp_rewrite;
-
-	wp_check_mysql_version();
-	wp_cache_flush();
-	make_db_current_silent();
-	populate_options();
-	populate_roles();
-
-	update_option('blogname', $blog_title);
-	update_option('admin_email', $user_email);
-	update_option('blog_public', $public);
-	$schema = ( isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on' ) ? 'https://' : 'http://';
-
-	if ( defined('WP_SITEURL') && '' != WP_SITEURL )
-		$guessurl = WP_SITEURL;
-	else
-		$guessurl = preg_replace('|/wp-admin/.*|i', '', $schema . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
-
-	update_option('siteurl', $guessurl);
-
-	// If not a public blog, don't ping.
-	if ( ! $public )
-		update_option('default_pingback_flag', 0);
-
-	// Create default user.  If the user already exists, the user tables are
-	// being shared among blogs.  Just set the role in that case.
-	$user_id = username_exists($user_name);
-	if ( !$user_id ) {
-		$random_password = substr(md5(uniqid(microtime())), 0, 6);
-		$user_id = wp_create_user($user_name, $random_password, $user_email);
-	} else {
-		$random_password = __('User already exists.  Password inherited.');
-	}
-
-	$user = new WP_User($user_id);
-	$user->set_role('administrator');
-
-	wp_install_defaults($user_id);
-
-	$wp_rewrite->flush_rules();
-
-	wp_new_blog_notification($blog_title, $guessurl, $user_id, $random_password);
-
-	wp_cache_flush();
-
-	return array('url' => $guessurl, 'user_id' => $user_id, 'password' => $random_password);
-}
-endif;
-
-if ( !function_exists('wp_install_defaults') ) :
-function wp_install_defaults($user_id) {
-	global $wpdb;
-
-	// Default category
-	$wpdb->query("INSERT INTO $wpdb->categories (cat_ID, cat_name, category_nicename, category_count, category_description) VALUES ('0', '".$wpdb->escape(__('Uncategorized'))."', '".sanitize_title(__('Uncategorized'))."', '1', '')");
-
-	// Default link category
-	$wpdb->query("INSERT INTO $wpdb->categories (cat_ID, cat_name, category_nicename, link_count, category_description) VALUES ('0', '".$wpdb->escape(__('Blogroll'))."', '".sanitize_title(__('Blogroll'))."', '7', '')");
-
-	// Now drop in some default links
-	$wpdb->query("INSERT INTO $wpdb->links (link_url, link_name, link_category, link_rss, link_notes) VALUES ('http://inphotos.org/', 'Donncha', 0, 'http://inphotos.org/feed/', '');");
-	$wpdb->query( "INSERT INTO $wpdb->link2cat (`link_id`, `category_id`) VALUES (1, 2)" );
-
-	$wpdb->query("INSERT INTO $wpdb->links (link_url, link_name, link_category, link_rss, link_notes) VALUES ('http://zengun.org/weblog/', 'Michel', 0, 'http://zengun.org/weblog/feed/', '');");
-	$wpdb->query( "INSERT INTO $wpdb->link2cat (`link_id`, `category_id`) VALUES (2, 2)" );
-
-	$wpdb->query("INSERT INTO $wpdb->links (link_url, link_name, link_category, link_rss, link_notes) VALUES ('http://boren.nu/', 'Ryan', 0, 'http://boren.nu/feed/', '');");
-	$wpdb->query( "INSERT INTO $wpdb->link2cat (`link_id`, `category_id`) VALUES (3, 2)" );
-
-	$wpdb->query("INSERT INTO $wpdb->links (link_url, link_name, link_category, link_rss, link_notes) VALUES ('http://photomatt.net/', 'Matt', 0, 'http://xml.photomatt.net/feed/', '');");
-	$wpdb->query( "INSERT INTO $wpdb->link2cat (`link_id`, `category_id`) VALUES (4, 2)" );
-
-	$wpdb->query("INSERT INTO $wpdb->links (link_url, link_name, link_category, link_rss, link_notes) VALUES ('http://zed1.com/journalized/', 'Mike', 0, 'http://zed1.com/journalized/feed/', '');");
-	$wpdb->query( "INSERT INTO $wpdb->link2cat (`link_id`, `category_id`) VALUES (5, 2)" );
-
-	$wpdb->query("INSERT INTO $wpdb->links (link_url, link_name, link_category, link_rss, link_notes) VALUES ('http://www.alexking.org/', 'Alex', 0, 'http://www.alexking.org/blog/wp-rss2.php', '');");
-	$wpdb->query( "INSERT INTO $wpdb->link2cat (`link_id`, `category_id`) VALUES (6, 2)" );
-
-	$wpdb->query("INSERT INTO $wpdb->links (link_url, link_name, link_category, link_rss, link_notes) VALUES ('http://dougal.gunters.org/', 'Dougal', 0, 'http://dougal.gunters.org/feed/', '');");
-	$wpdb->query( "INSERT INTO $wpdb->link2cat (`link_id`, `category_id`) VALUES (7, 2)" );
-
-	// First post
-	$now = date('Y-m-d H:i:s');
-	$now_gmt = gmdate('Y-m-d H:i:s');
-	$wpdb->query("INSERT INTO $wpdb->posts (post_author, post_date, post_date_gmt, post_content, post_excerpt, post_title, post_category, post_name, post_modified, post_modified_gmt, comment_count, to_ping, pinged, post_content_filtered) VALUES ($user_id, '$now', '$now_gmt', '".$wpdb->escape(__('Welcome to WordPress. This is your first post. Edit or delete it, then start blogging!'))."', '', '".$wpdb->escape(__('Hello world!'))."', '0', '".$wpdb->escape(__('hello-world'))."', '$now', '$now_gmt', '1', '', '', '')");
-
-	$wpdb->query( "INSERT INTO $wpdb->post2cat (`rel_id`, `post_id`, `category_id`) VALUES (1, 1, 1)" );
-
-	// Default comment
-	$wpdb->query("INSERT INTO $wpdb->comments (comment_post_ID, comment_author, comment_author_email, comment_author_url, comment_date, comment_date_gmt, comment_content) VALUES ('1', '".$wpdb->escape(__('Mr WordPress'))."', '', 'http://wordpress.org/', '$now', '$now_gmt', '".$wpdb->escape(__('Hi, this is a comment.<br />To delete a comment, just log in and view the post&#039;s comments. There you will have the option to edit or delete them.'))."')");
-
-	// First Page
-	$wpdb->query("INSERT INTO $wpdb->posts (post_author, post_date, post_date_gmt, post_content, post_excerpt, post_title, post_category, post_name, post_modified, post_modified_gmt, post_status, post_type, to_ping, pinged, post_content_filtered) VALUES ($user_id, '$now', '$now_gmt', '".$wpdb->escape(__('This is an example of a WordPress page, you could edit this to put information about yourself or your site so readers know where you are coming from. You can create as many pages like this one or sub-pages as you like and manage all of your content inside of WordPress.'))."', '', '".$wpdb->escape(__('About'))."', '0', '".$wpdb->escape(__('about'))."', '$now', '$now_gmt', 'publish', 'page', '', '', '')");
-}
-endif;
-
-if ( !function_exists('wp_new_blog_notification') ) :
-function wp_new_blog_notification($blog_title, $blog_url, $user_id, $password) {
-	$user = new WP_User($user_id);
-	$email = $user->user_email;
-	$name = $user->user_login;
-	$message_headers = 'From: "' . $blog_title . '" <wordpress@' . $_SERVER['SERVER_NAME'] . '>';
-	$message = sprintf(__("Your new WordPress blog has been successfully set up at:
-
-%1\$s
-
-You can log in to the administrator account with the following information:
-
-Username: %2\$s
-Password: %3\$s
-
-We hope you enjoy your new weblog. Thanks!
-
---The WordPress Team
-http://wordpress.org/
-"), $blog_url, $name, $password);
-
-	@wp_mail($email, __('New WordPress Blog'), $message, $message_headers);
-}
-endif;
-
-if ( !function_exists('wp_upgrade') ) :
-function wp_upgrade() {
-	global $wp_current_db_version, $wp_db_version;
-
-	$wp_current_db_version = __get_option('db_version');
-
-	// We are up-to-date.  Nothing to do.
-	if ( $wp_db_version == $wp_current_db_version )
-		return;
-
-	wp_check_mysql_version();
-	wp_cache_flush();
-	make_db_current_silent();
-	upgrade_all();
-	wp_cache_flush();
-}
-endif;
-
-// Functions to be called in install and upgrade scripts
-function upgrade_all() {
-	global $wp_current_db_version, $wp_db_version, $wp_rewrite;
-	$wp_current_db_version = __get_option('db_version');
-
-	// We are up-to-date.  Nothing to do.
-	if ( $wp_db_version == $wp_current_db_version )
-		return;
-
-	// If the version is not set in the DB, try to guess the version.
-	if ( empty($wp_current_db_version) ) {
-		$wp_current_db_version = 0;
-
-		// If the template option exists, we have 1.5.
-		$template = __get_option('template');
-		if ( !empty($template) )
-			$wp_current_db_version = 2541;
-	}
-
-	populate_options();
-
-	if ( $wp_current_db_version < 2541 ) {
-		upgrade_100();
-		upgrade_101();
-		upgrade_110();
-		upgrade_130();
-	}
-	
-	maybe_disable_automattic_widgets();
-
-	if ( $wp_current_db_version < 3308 )
-		upgrade_160();
-
-	if ( $wp_current_db_version < 4772 )
-		upgrade_210();
-
-	if ( $wp_current_db_version < 4351 )
-		upgrade_old_slugs();
-
-	$wp_rewrite->flush_rules();
-
-	update_option('db_version', $wp_db_version);
-}
-
-function upgrade_100() {
-	global $wpdb;
-
-	// Get the title and ID of every post, post_name to check if it already has a value
-	$posts = $wpdb->get_results("SELECT ID, post_title, post_name FROM $wpdb->posts WHERE post_name = ''");
-	if ($posts) {
-		foreach($posts as $post) {
-			if ('' == $post->post_name) {
-				$newtitle = sanitize_title($post->post_title);
-				$wpdb->query("UPDATE $wpdb->posts SET post_name = '$newtitle' WHERE ID = '$post->ID'");
-			}
-		}
-	}
-
-	$categories = $wpdb->get_results("SELECT cat_ID, cat_name, category_nicename FROM $wpdb->categories");
-	foreach ($categories as $category) {
-		if ('' == $category->category_nicename) {
-			$newtitle = sanitize_title($category->cat_name);
-			$wpdb->query("UPDATE $wpdb->categories SET category_nicename = '$newtitle' WHERE cat_ID = '$category->cat_ID'");
-		}
-	}
-
-
-	$wpdb->query("UPDATE $wpdb->options SET option_value = REPLACE(option_value, 'wp-links/links-images/', 'wp-images/links/')
-	WHERE option_name LIKE 'links_rating_image%'
-	AND option_value LIKE 'wp-links/links-images/%'");
-
-	$done_ids = $wpdb->get_results("SELECT DISTINCT post_id FROM $wpdb->post2cat");
-	if ($done_ids) :
-		foreach ($done_ids as $done_id) :
-			$done_posts[] = $done_id->post_id;
-		endforeach;
-		$catwhere = ' AND ID NOT IN (' . implode(',', $done_posts) . ')';
-	else:
-		$catwhere = '';
-	endif;
-
-	$allposts = $wpdb->get_results("SELECT ID, post_category FROM $wpdb->posts WHERE post_category != '0' $catwhere");
-	if ($allposts) :
-		foreach ($allposts as $post) {
-			// Check to see if it's already been imported
-			$cat = $wpdb->get_row("SELECT * FROM $wpdb->post2cat WHERE post_id = $post->ID AND category_id = $post->post_category");
-			if (!$cat && 0 != $post->post_category) { // If there's no result
-				$wpdb->query("
-					INSERT INTO $wpdb->post2cat
-					(post_id, category_id)
-					VALUES
-					('$post->ID', '$post->post_category')
-					");
-			}
-		}
-	endif;
-}
-
-function upgrade_101() {
-	global $wpdb;
-
-	// Clean up indices, add a few
-	add_clean_index($wpdb->posts, 'post_name');
-	add_clean_index($wpdb->posts, 'post_status');
-	add_clean_index($wpdb->categories, 'category_nicename');
-	add_clean_index($wpdb->comments, 'comment_approved');
-	add_clean_index($wpdb->comments, 'comment_post_ID');
-	add_clean_index($wpdb->links , 'link_category');
-	add_clean_index($wpdb->links , 'link_visible');
-}
-
-
-function upgrade_110() {
-	global $wpdb;
-
-	// Set user_nicename.
-	$users = $wpdb->get_results("SELECT ID, user_nickname, user_nicename FROM $wpdb->users");
-	foreach ($users as $user) {
-		if ('' == $user->user_nicename) {
-			$newname = sanitize_title($user->user_nickname);
-			$wpdb->query("UPDATE $wpdb->users SET user_nicename = '$newname' WHERE ID = '$user->ID'");
-		}
-	}
-
-	$users = $wpdb->get_results("SELECT ID, user_pass from $wpdb->users");
-	foreach ($users as $row) {
-		if (!preg_match('/^[A-Fa-f0-9]{32}$/', $row->user_pass)) {
-			$wpdb->query('UPDATE '.$wpdb->users.' SET user_pass = MD5(\''.$row->user_pass.'\') WHERE ID = \''.$row->ID.'\'');
-		}
-	}
-
-
-	// Get the GMT offset, we'll use that later on
-	$all_options = get_alloptions_110();
-
-	$time_difference = $all_options->time_difference;
-
-	$server_time = time()+date('Z');
-	$weblogger_time = $server_time + $time_difference*3600;
-	$gmt_time = time();
-
-	$diff_gmt_server = ($gmt_time - $server_time) / 3600;
-	$diff_weblogger_server = ($weblogger_time - $server_time) / 3600;
-	$diff_gmt_weblogger = $diff_gmt_server - $diff_weblogger_server;
-	$gmt_offset = -$diff_gmt_weblogger;
-
-	// Add a gmt_offset option, with value $gmt_offset
-	add_option('gmt_offset', $gmt_offset);
-
-	// Check if we already set the GMT fields (if we did, then
-	// MAX(post_date_gmt) can't be '0000-00-00 00:00:00'
-	// <michel_v> I just slapped myself silly for not thinking about it earlier
-	$got_gmt_fields = ($wpdb->get_var("SELECT MAX(post_date_gmt) FROM $wpdb->posts") == '0000-00-00 00:00:00') ? false : true;
-
-	if (!$got_gmt_fields) {
-
-		// Add or substract time to all dates, to get GMT dates
-		$add_hours = intval($diff_gmt_weblogger);
-		$add_minutes = intval(60 * ($diff_gmt_weblogger - $add_hours));
-		$wpdb->query("UPDATE $wpdb->posts SET post_date_gmt = DATE_ADD(post_date, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)");
-		$wpdb->query("UPDATE $wpdb->posts SET post_modified = post_date");
-		$wpdb->query("UPDATE $wpdb->posts SET post_modified_gmt = DATE_ADD(post_modified, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE) WHERE post_modified != '0000-00-00 00:00:00'");
-		$wpdb->query("UPDATE $wpdb->comments SET comment_date_gmt = DATE_ADD(comment_date, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)");
-		$wpdb->query("UPDATE $wpdb->users SET user_registered = DATE_ADD(user_registered, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)");
-	}
-
-}
-
-function upgrade_130() {
-	global $wpdb;
-
-	// Remove extraneous backslashes.
-	$posts = $wpdb->get_results("SELECT ID, post_title, post_content, post_excerpt, guid, post_date, post_name, post_status, post_author FROM $wpdb->posts");
-	if ($posts) {
-		foreach($posts as $post) {
-			$post_content = addslashes(deslash($post->post_content));
-			$post_title = addslashes(deslash($post->post_title));
-			$post_excerpt = addslashes(deslash($post->post_excerpt));
-			if ( empty($post->guid) )
-				$guid = get_permalink($post->ID);
-			else
-				$guid = $post->guid;
-
-			$wpdb->query("UPDATE $wpdb->posts SET post_title = '$post_title', post_content = '$post_content', post_excerpt = '$post_excerpt', guid = '$guid' WHERE ID = '$post->ID'");
-		}
-	}
-
-	// Remove extraneous backslashes.
-	$comments = $wpdb->get_results("SELECT comment_ID, comment_author, comment_content FROM $wpdb->comments");
-	if ($comments) {
-		foreach($comments as $comment) {
-			$comment_content = addslashes(deslash($comment->comment_content));
-			$comment_author = addslashes(deslash($comment->comment_author));
-			$wpdb->query("UPDATE $wpdb->comments SET comment_content = '$comment_content', comment_author = '$comment_author' WHERE comment_ID = '$comment->comment_ID'");
-		}
-	}
-
-	// Remove extraneous backslashes.
-	$links = $wpdb->get_results("SELECT link_id, link_name, link_description FROM $wpdb->links");
-	if ($links) {
-		foreach($links as $link) {
-			$link_name = addslashes(deslash($link->link_name));
-			$link_description = addslashes(deslash($link->link_description));
-			$wpdb->query("UPDATE $wpdb->links SET link_name = '$link_name', link_description = '$link_description' WHERE link_id = '$link->link_id'");
-		}
-	}
-
-	// The "paged" option for what_to_show is no more.
-	if ($wpdb->get_var("SELECT option_value FROM $wpdb->options WHERE option_name = 'what_to_show'") == 'paged') {
-		$wpdb->query("UPDATE $wpdb->options SET option_value = 'posts' WHERE option_name = 'what_to_show'");
-	}
-
-	$active_plugins = __get_option('active_plugins');
-
-	// If plugins are not stored in an array, they're stored in the old
-	// newline separated format.  Convert to new format.
-	if ( !is_array( $active_plugins ) ) {
-		$active_plugins = explode("\n", trim($active_plugins));
-		update_option('active_plugins', $active_plugins);
-	}
-
-	// Obsolete tables
-	$wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optionvalues');
-	$wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiontypes');
-	$wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiongroups');
-	$wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiongroup_options');
-
-	// Update comments table to use comment_type
-	$wpdb->query("UPDATE $wpdb->comments SET comment_type='trackback', comment_content = REPLACE(comment_content, '<trackback />', '') WHERE comment_content LIKE '<trackback />%'");
-	$wpdb->query("UPDATE $wpdb->comments SET comment_type='pingback', comment_content = REPLACE(comment_content, '<pingback />', '') WHERE comment_content LIKE '<pingback />%'");
-
-	// Some versions have multiple duplicate option_name rows with the same values
-	$options = $wpdb->get_results("SELECT option_name, COUNT(option_name) AS dupes FROM `$wpdb->options` GROUP BY option_name");
-	foreach ( $options as $option ) {
-		if ( 1 != $option->dupes ) { // Could this be done in the query?
-			$limit = $option->dupes - 1;
-			$dupe_ids = $wpdb->get_col("SELECT option_id FROM $wpdb->options WHERE option_name = '$option->option_name' LIMIT $limit");
-			$dupe_ids = join($dupe_ids, ',');
-			$wpdb->query("DELETE FROM $wpdb->options WHERE option_id IN ($dupe_ids)");
-		}
-	}
-
-	make_site_theme();
-}
-
-function upgrade_160() {
-	global $wpdb, $wp_current_db_version;
-
-	populate_roles_160();
-
-	$users = $wpdb->get_results("SELECT * FROM $wpdb->users");
-	foreach ( $users as $user ) :
-		if ( !empty( $user->user_firstname ) )
-			update_usermeta( $user->ID, 'first_name', $wpdb->escape($user->user_firstname) );
-		if ( !empty( $user->user_lastname ) )
-			update_usermeta( $user->ID, 'last_name', $wpdb->escape($user->user_lastname) );
-		if ( !empty( $user->user_nickname ) )
-			update_usermeta( $user->ID, 'nickname', $wpdb->escape($user->user_nickname) );
-		if ( !empty( $user->user_level ) )
-			update_usermeta( $user->ID, $wpdb->prefix . 'user_level', $user->user_level );
-		if ( !empty( $user->user_icq ) )
-			update_usermeta( $user->ID, 'icq', $wpdb->escape($user->user_icq) );
-		if ( !empty( $user->user_aim ) )
-			update_usermeta( $user->ID, 'aim', $wpdb->escape($user->user_aim) );
-		if ( !empty( $user->user_msn ) )
-			update_usermeta( $user->ID, 'msn', $wpdb->escape($user->user_msn) );
-		if ( !empty( $user->user_yim ) )
-			update_usermeta( $user->ID, 'yim', $wpdb->escape($user->user_icq) );
-		if ( !empty( $user->user_description ) )
-			update_usermeta( $user->ID, 'description', $wpdb->escape($user->user_description) );
-
-		if ( isset( $user->user_idmode ) ):
-			$idmode = $user->user_idmode;
-			if ($idmode == 'nickname') $id = $user->user_nickname;
-			if ($idmode == 'login') $id = $user->user_login;
-			if ($idmode == 'firstname') $id = $user->user_firstname;
-			if ($idmode == 'lastname') $id = $user->user_lastname;
-			if ($idmode == 'namefl') $id = $user->user_firstname.' '.$user->user_lastname;
-			if ($idmode == 'namelf') $id = $user->user_lastname.' '.$user->user_firstname;
-			if (!$idmode) $id = $user->user_nickname;
-			$id = $wpdb->escape( $id );
-			$wpdb->query("UPDATE $wpdb->users SET display_name = '$id' WHERE ID = '$user->ID'");
-		endif;
-
-		// FIXME: RESET_CAPS is temporary code to reset roles and caps if flag is set.
-		$caps = get_usermeta( $user->ID, $wpdb->prefix . 'capabilities');
-		if ( empty($caps) || defined('RESET_CAPS') ) {
-			$level = get_usermeta($user->ID, $wpdb->prefix . 'user_level');
-			$role = translate_level_to_role($level);
-			update_usermeta( $user->ID, $wpdb->prefix . 'capabilities', array($role => true) );
-		}
-
-	endforeach;
-	$old_user_fields = array( 'user_firstname', 'user_lastname', 'user_icq', 'user_aim', 'user_msn', 'user_yim', 'user_idmode', 'user_ip', 'user_domain', 'user_browser', 'user_description', 'user_nickname', 'user_level' );
-	$wpdb->hide_errors();
-	foreach ( $old_user_fields as $old )
-		$wpdb->query("ALTER TABLE $wpdb->users DROP $old");
-	$wpdb->show_errors();
-
-	if ( 0 == $wpdb->get_var("SELECT SUM(category_count) FROM $wpdb->categories") ) { // Create counts
-		$categories = $wpdb->get_col("SELECT cat_ID FROM $wpdb->categories");
-		foreach ( $categories as $cat_id ) {
-			$count = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->post2cat, $wpdb->posts WHERE $wpdb->posts.ID=$wpdb->post2cat.post_id AND post_status='publish' AND category_id = '$cat_id'");
-			$wpdb->query("UPDATE $wpdb->categories SET category_count = '$count' WHERE cat_ID = '$cat_id'");
-		}
-	}
-
-	// populate comment_count field of posts table
-	$comments = $wpdb->get_results( "SELECT comment_post_ID, COUNT(*) as c FROM $wpdb->comments WHERE comment_approved = '1' GROUP BY comment_post_ID" );
-	if( is_array( $comments ) ) {
-		foreach ($comments as $comment) {
-			$wpdb->query( "UPDATE $wpdb->posts SET comment_count = $comment->c WHERE ID = '$comment->comment_post_ID'" );
-		}
-	}
-
-	// Some alpha versions used a post status of object instead of attachment and put
-	// the mime type in post_type instead of post_mime_type.
-	if ( $wp_current_db_version > 2541 && $wp_current_db_version <= 3091 ) {
-		$objects = $wpdb->get_results("SELECT ID, post_type FROM $wpdb->posts WHERE post_status = 'object'");
-		foreach ($objects as $object) {
-			$wpdb->query("UPDATE $wpdb->posts SET post_status = 'attachment',
-			post_mime_type = '$object->post_type',
-			post_type = ''
-			WHERE ID = $object->ID");
-
-			$meta = get_post_meta($object->ID, 'imagedata', true);
-			if ( ! empty($meta['file']) )
-				update_attached_file( $object->ID, $meta['file'] );
-		}
-	}
-}
-
-function upgrade_210() {
-	global $wpdb, $wp_current_db_version;
-
-	if ( $wp_current_db_version < 3506 ) {
-		// Update status and type.
-		$posts = $wpdb->get_results("SELECT ID, post_status FROM $wpdb->posts");
-
-		if ( ! empty($posts) ) foreach ($posts as $post) {
-			$status = $post->post_status;
-			$type = 'post';
-
-			if ( 'static' == $status ) {
-				$status = 'publish';
-				$type = 'page';
-			} else if ( 'attachment' == $status ) {
-				$status = 'inherit';
-				$type = 'attachment';
-			}
-
-			$wpdb->query("UPDATE $wpdb->posts SET post_status = '$status', post_type = '$type' WHERE ID = '$post->ID'");
-		}
-	}
-
-	if ( $wp_current_db_version < 3845 ) {
-		populate_roles_210();
-	}
-
-	if ( $wp_current_db_version < 3531 ) {
-		// Give future posts a post_status of future.
-		$now = gmdate('Y-m-d H:i:59');
-		$wpdb->query ("UPDATE $wpdb->posts SET post_status = 'future' WHERE post_status = 'publish' AND post_date_gmt > '$now'");
-
-		$posts = $wpdb->get_results("SELECT ID, post_date FROM $wpdb->posts WHERE post_status ='future'");
-		if ( !empty($posts) )
-			foreach ( $posts as $post )
-				wp_schedule_single_event(mysql2date('U', $post->post_date), 'publish_future_post', array($post->ID));
-	}
-
-	if ( $wp_current_db_version < 3570 ) {
-		// Create categories for link categories if a category with the same
-		// name doesn't exist.  Create a map of link cat IDs to cat IDs.
-		$link_cat_id_map = array();
-		$link_cats = $wpdb->get_results("SELECT cat_id, cat_name FROM " . $wpdb->prefix . 'linkcategories');
-		foreach ( $link_cats as $link_cat) {
-			if ( $cat_id = category_exists($link_cat->cat_name) ) {
-				$link_cat_id_map[$link_cat->cat_id] = $cat_id;
-				$default_link_cat = $cat_id;
-			} else {
-				$link_cat_id_map[$link_cat->cat_id] = wp_create_category($link_cat->cat_name);
-				$default_link_cat = $link_cat_id_map[$link_cat->cat_id];
-			}
-		}
-
-		// Associate links to cats.
-		$links = $wpdb->get_results("SELECT link_id, link_category FROM $wpdb->links");
-		if ( !empty($links) ) foreach ( $links as $link ) {
-			if ( 0 == $link->link_category )
-				continue;
-			if ( ! isset($link_cat_id_map[$link->link_category]) )
-				continue;
-			$link_cat = $link_cat_id_map[$link->link_category];
-			$cat = $wpdb->get_row("SELECT * FROM $wpdb->link2cat WHERE link_id = '$link->link_id' AND category_id = '$link_cat'");
-			if ( !$cat ) {
-				$wpdb->query("INSERT INTO $wpdb->link2cat (link_id, category_id)
-					VALUES ('$link->link_id', '$link_cat')");
-			}
-		}
-
-		// Set default to the last category we grabbed during the upgrade loop.
-		update_option('default_link_category', $default_link_cat);
-
-		// Count links per category.
-		if ( 0 == $wpdb->get_var("SELECT SUM(link_count) FROM $wpdb->categories") ) {
-			$categories = $wpdb->get_col("SELECT cat_ID FROM $wpdb->categories");
-			foreach ( $categories as $cat_id ) {
-				$count = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->link2cat, $wpdb->links WHERE $wpdb->links.link_id = $wpdb->link2cat.link_id AND category_id = '$cat_id'");
-				$wpdb->query("UPDATE $wpdb->categories SET link_count = '$count' WHERE cat_ID = '$cat_id'");
-			}
-		}
-	}
-
-	if ( $wp_current_db_version < 4772 ) {
-		// Obsolete linkcategories table
-		$wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'linkcategories');
-	}
-}
-
-function upgrade_old_slugs() {
-	// upgrade people who were using the Redirect Old Slugs plugin
-	global $wpdb;
-	$wpdb->query("UPDATE $wpdb->postmeta SET meta_key = '_wp_old_slug' WHERE meta_key = 'old_slug'");
-}
-
-
-// The functions we use to actually do stuff
-
-// General
-function maybe_create_table($table_name, $create_ddl) {
-	global $wpdb;
-	foreach ($wpdb->get_col("SHOW TABLES",0) as $table ) {
-		if ($table == $table_name) {
-			return true;
-		}
-	}
-	//didn't find it try to create it.
-	$q = $wpdb->query($create_ddl);
-	// we cannot directly tell that whether this succeeded!
-	foreach ($wpdb->get_col("SHOW TABLES",0) as $table ) {
-		if ($table == $table_name) {
-			return true;
-		}
-	}
-	return false;
-}
-
-function drop_index($table, $index) {
-	global $wpdb;
-	$wpdb->hide_errors();
-	$wpdb->query("ALTER TABLE `$table` DROP INDEX `$index`");
-	// Now we need to take out all the extra ones we may have created
-	for ($i = 0; $i < 25; $i++) {
-		$wpdb->query("ALTER TABLE `$table` DROP INDEX `{$index}_$i`");
-	}
-	$wpdb->show_errors();
-	return true;
-}
-
-function add_clean_index($table, $index) {
-	global $wpdb;
-	drop_index($table, $index);
-	$wpdb->query("ALTER TABLE `$table` ADD INDEX ( `$index` )");
-	return true;
-}
-
-/**
- ** maybe_add_column()
- ** Add column to db table if it doesn't exist.
- ** Returns:  true if already exists or on successful completion
- **           false on error
- */
-function maybe_add_column($table_name, $column_name, $create_ddl) {
-	global $wpdb, $debug;
-	foreach ($wpdb->get_col("DESC $table_name", 0) as $column ) {
-		if ($debug) echo("checking $column == $column_name<br />");
-		if ($column == $column_name) {
-			return true;
-		}
-	}
-	//didn't find it try to create it.
-	$q = $wpdb->query($create_ddl);
-	// we cannot directly tell that whether this succeeded!
-	foreach ($wpdb->get_col("DESC $table_name", 0) as $column ) {
-		if ($column == $column_name) {
-			return true;
-		}
-	}
-	return false;
-}
-
-
-// get_alloptions as it was for 1.2.
-function get_alloptions_110() {
-	global $wpdb;
-	if ($options = $wpdb->get_results("SELECT option_name, option_value FROM $wpdb->options")) {
-		foreach ($options as $option) {
-			// "When trying to design a foolproof system,
-			//  never underestimate the ingenuity of the fools :)" -- Dougal
-			if ('siteurl' == $option->option_name) $option->option_value = preg_replace('|/+$|', '', $option->option_value);
-			if ('home' == $option->option_name) $option->option_value = preg_replace('|/+$|', '', $option->option_value);
-			if ('category_base' == $option->option_name) $option->option_value = preg_replace('|/+$|', '', $option->option_value);
-			$all_options->{$option->option_name} = stripslashes($option->option_value);
-		}
-	}
-	return $all_options;
-}
-
-// Version of get_option that is private to install/upgrade.
-function __get_option($setting) {
-	global $wpdb;
-	
-	if ( $setting == 'home' && defined( 'WP_HOME' ) ) {
-		return preg_replace( '|/+$|', '', constant( 'WP_HOME' ) );
-	}
-	
-	if ( $setting == 'siteurl' && defined( 'WP_SITEURL' ) ) {
-		return preg_replace( '|/+$|', '', constant( 'WP_SITEURL' ) );
-	}
-	
-	$option = $wpdb->get_var("SELECT option_value FROM $wpdb->options WHERE option_name = '$setting'");
-
-	if ( 'home' == $setting && '' == $option )
-		return __get_option('siteurl');
-
-	if ( 'siteurl' == $setting || 'home' == $setting || 'category_base' == $setting )
-		$option = preg_replace('|/+$|', '', $option);
-
-	@ $kellogs = unserialize($option);
-	if ($kellogs !== FALSE)
-		return $kellogs;
-	else
-		return $option;
-}
-
-function deslash($content) {
-	// Note: \\\ inside a regex denotes a single backslash.
-
-	// Replace one or more backslashes followed by a single quote with
-	// a single quote.
-	$content = preg_replace("/\\\+'/", "'", $content);
-
-	// Replace one or more backslashes followed by a double quote with
-	// a double quote.
-	$content = preg_replace('/\\\+"/', '"', $content);
-
-	// Replace one or more backslashes with one backslash.
-	$content = preg_replace("/\\\+/", "\\", $content);
-
-	return $content;
-}
-
-function dbDelta($queries, $execute = true) {
-	global $wpdb;
-
-	// Seperate individual queries into an array
-	if( !is_array($queries) ) {
-		$queries = explode( ';', $queries );
-		if('' == $queries[count($queries) - 1]) array_pop($queries);
-	}
-
-	$cqueries = array(); // Creation Queries
-	$iqueries = array(); // Insertion Queries
-	$for_update = array();
-
-	// Create a tablename index for an array ($cqueries) of queries
-	foreach($queries as $qry) {
-		if(preg_match("|CREATE TABLE ([^ ]*)|", $qry, $matches)) {
-			$cqueries[strtolower($matches[1])] = $qry;
-			$for_update[$matches[1]] = 'Created table '.$matches[1];
-		}
-		else if(preg_match("|CREATE DATABASE ([^ ]*)|", $qry, $matches)) {
-			array_unshift($cqueries, $qry);
-		}
-		else if(preg_match("|INSERT INTO ([^ ]*)|", $qry, $matches)) {
-			$iqueries[] = $qry;
-		}
-		else if(preg_match("|UPDATE ([^ ]*)|", $qry, $matches)) {
-			$iqueries[] = $qry;
-		}
-		else {
-			// Unrecognized query type
-		}
-	}
-
-	// Check to see which tables and fields exist
-	if($tables = $wpdb->get_col('SHOW TABLES;')) {
-		// For every table in the database
-		foreach($tables as $table) {
-			// If a table query exists for the database table...
-			if( array_key_exists(strtolower($table), $cqueries) ) {
-				// Clear the field and index arrays
-				unset($cfields);
-				unset($indices);
-				// Get all of the field names in the query from between the parens
-				preg_match("|\((.*)\)|ms", $cqueries[strtolower($table)], $match2);
-				$qryline = trim($match2[1]);
-
-				// Separate field lines into an array
-				$flds = explode("\n", $qryline);
-
-				//echo "<hr/><pre>\n".print_r(strtolower($table), true).":\n".print_r($cqueries, true)."</pre><hr/>";
-
-				// For every field line specified in the query
-				foreach($flds as $fld) {
-					// Extract the field name
-					preg_match("|^([^ ]*)|", trim($fld), $fvals);
-					$fieldname = $fvals[1];
-
-					// Verify the found field name
-					$validfield = true;
-					switch(strtolower($fieldname))
-					{
-					case '':
-					case 'primary':
-					case 'index':
-					case 'fulltext':
-					case 'unique':
-					case 'key':
-						$validfield = false;
-						$indices[] = trim(trim($fld), ", \n");
-						break;
-					}
-					$fld = trim($fld);
-
-					// If it's a valid field, add it to the field array
-					if($validfield) {
-						$cfields[strtolower($fieldname)] = trim($fld, ", \n");
-					}
-				}
-
-				// Fetch the table column structure from the database
-				$tablefields = $wpdb->get_results("DESCRIBE {$table};");
-
-				// For every field in the table
-				foreach($tablefields as $tablefield) {
-					// If the table field exists in the field array...
-					if(array_key_exists(strtolower($tablefield->Field), $cfields)) {
-						// Get the field type from the query
-						preg_match("|".$tablefield->Field." ([^ ]*( unsigned)?)|i", $cfields[strtolower($tablefield->Field)], $matches);
-						$fieldtype = $matches[1];
-
-						// Is actual field type different from the field type in query?
-						if($tablefield->Type != $fieldtype) {
-							// Add a query to change the column type
-							$cqueries[] = "ALTER TABLE {$table} CHANGE COLUMN {$tablefield->Field} " . $cfields[strtolower($tablefield->Field)];
-							$for_update[$table.'.'.$tablefield->Field] = "Changed type of {$table}.{$tablefield->Field} from {$tablefield->Type} to {$fieldtype}";
-						}
-
-						// Get the default value from the array
-							//echo "{$cfields[strtolower($tablefield->Field)]}<br>";
-						if(preg_match("| DEFAULT '(.*)'|i", $cfields[strtolower($tablefield->Field)], $matches)) {
-							$default_value = $matches[1];
-							if($tablefield->Default != $default_value)
-							{
-								// Add a query to change the column's default value
-								$cqueries[] = "ALTER TABLE {$table} ALTER COLUMN {$tablefield->Field} SET DEFAULT '{$default_value}'";
-								$for_update[$table.'.'.$tablefield->Field] = "Changed default value of {$table}.{$tablefield->Field} from {$tablefield->Default} to {$default_value}";
-							}
-						}
-
-						// Remove the field from the array (so it's not added)
-						unset($cfields[strtolower($tablefield->Field)]);
-					}
-					else {
-						// This field exists in the table, but not in the creation queries?
-					}
-				}
-
-				// For every remaining field specified for the table
-				foreach($cfields as $fieldname => $fielddef) {
-					// Push a query line into $cqueries that adds the field to that table
-					$cqueries[] = "ALTER TABLE {$table} ADD COLUMN $fielddef";
-					$for_update[$table.'.'.$fieldname] = 'Added column '.$table.'.'.$fieldname;
-				}
-
-				// Index stuff goes here
-				// Fetch the table index structure from the database
-				$tableindices = $wpdb->get_results("SHOW INDEX FROM {$table};");
-
-				if($tableindices) {
-					// Clear the index array
-					unset($index_ary);
-
-					// For every index in the table
-					foreach($tableindices as $tableindex) {
-						// Add the index to the index data array
-						$keyname = $tableindex->Key_name;
-						$index_ary[$keyname]['columns'][] = array('fieldname' => $tableindex->Column_name, 'subpart' => $tableindex->Sub_part);
-						$index_ary[$keyname]['unique'] = ($tableindex->Non_unique == 0)?true:false;
-					}
-
-					// For each actual index in the index array
-					foreach($index_ary as $index_name => $index_data) {
-						// Build a create string to compare to the query
-						$index_string = '';
-						if($index_name == 'PRIMARY') {
-							$index_string .= 'PRIMARY ';
-						}
-						else if($index_data['unique']) {
-							$index_string .= 'UNIQUE ';
-						}
-						$index_string .= 'KEY ';
-						if($index_name != 'PRIMARY') {
-							$index_string .= $index_name;
-						}
-						$index_columns = '';
-						// For each column in the index
-						foreach($index_data['columns'] as $column_data) {
-							if($index_columns != '') $index_columns .= ',';
-							// Add the field to the column list string
-							$index_columns .= $column_data['fieldname'];
-							if($column_data['subpart'] != '') {
-								$index_columns .= '('.$column_data['subpart'].')';
-							}
-						}
-						// Add the column list to the index create string
-						$index_string .= ' ('.$index_columns.')';
-
-						if(!(($aindex = array_search($index_string, $indices)) === false)) {
-							unset($indices[$aindex]);
-							//echo "<pre style=\"border:1px solid #ccc;margin-top:5px;\">{$table}:<br/>Found index:".$index_string."</pre>\n";
-						}
-						//else echo "<pre style=\"border:1px solid #ccc;margin-top:5px;\">{$table}:<br/><b>Did not find index:</b>".$index_string."<br/>".print_r($indices, true)."</pre>\n";
-					}
-				}
-
-				// For every remaining index specified for the table
-				foreach($indices as $index) {
-					// Push a query line into $cqueries that adds the index to that table
-					$cqueries[] = "ALTER TABLE {$table} ADD $index";
-					$for_update[$table.'.'.$fieldname] = 'Added index '.$table.' '.$index;
-				}
-
-				// Remove the original table creation query from processing
-				unset($cqueries[strtolower($table)]);
-				unset($for_update[strtolower($table)]);
-			} else {
-				// This table exists in the database, but not in the creation queries?
-			}
-		}
-	}
-
-	$allqueries = array_merge($cqueries, $iqueries);
-	if($execute) {
-		foreach($allqueries as $query) {
-			//echo "<pre style=\"border:1px solid #ccc;margin-top:5px;\">".print_r($query, true)."</pre>\n";
-			$wpdb->query($query);
-		}
-	}
-
-	return $for_update;
-}
-
-function make_db_current() {
-	global $wp_queries;
-
-	$alterations = dbDelta($wp_queries);
-	echo "<ol>\n";
-	foreach($alterations as $alteration) echo "<li>$alteration</li>\n";
-	echo "</ol>\n";
-}
-
-function make_db_current_silent() {
-	global $wp_queries;
-
-	$alterations = dbDelta($wp_queries);
-}
-
-function make_site_theme_from_oldschool($theme_name, $template) {
-	$home_path = get_home_path();
-	$site_dir = ABSPATH . "wp-content/themes/$template";
-
-	if (! file_exists("$home_path/index.php"))
-		return false;
-
-	// Copy files from the old locations to the site theme.
-	// TODO: This does not copy arbitarary include dependencies.  Only the
-	// standard WP files are copied.
-	$files = array('index.php' => 'index.php', 'wp-layout.css' => 'style.css', 'wp-comments.php' => 'comments.php', 'wp-comments-popup.php' => 'comments-popup.php');
-
-	foreach ($files as $oldfile => $newfile) {
-		if ($oldfile == 'index.php')
-			$oldpath = $home_path;
-		else
-			$oldpath = ABSPATH;
-
-		if ($oldfile == 'index.php') { // Check to make sure it's not a new index
-			$index = implode('', file("$oldpath/$oldfile"));
-			if (strpos($index, 'WP_USE_THEMES') !== false) {
-				if (! @copy(ABSPATH . 'wp-content/themes/default/index.php', "$site_dir/$newfile"))
-					return false;
-				continue; // Don't copy anything
-				}
-		}
-
-		if (! @copy("$oldpath/$oldfile", "$site_dir/$newfile"))
-			return false;
-
-		chmod("$site_dir/$newfile", 0777);
-
-		// Update the blog header include in each file.
-		$lines = explode("\n", implode('', file("$site_dir/$newfile")));
-		if ($lines) {
-			$f = fopen("$site_dir/$newfile", 'w');
-
-			foreach ($lines as $line) {
-				if (preg_match('/require.*wp-blog-header/', $line))
-					$line = '//' . $line;
-
-				// Update stylesheet references.
-				$line = str_replace("<?php echo __get_option('siteurl'); ?>/wp-layout.css", "<?php bloginfo('stylesheet_url'); ?>", $line);
-
-				// Update comments template inclusion.
-				$line = str_replace("<?php include(ABSPATH . 'wp-comments.php'); ?>", "<?php comments_template(); ?>", $line);
-
-				fwrite($f, "{$line}\n");
-			}
-			fclose($f);
-		}
-	}
-
-	// Add a theme header.
-	$header = "/*\nTheme Name: $theme_name\nTheme URI: " . __get_option('siteurl') . "\nDescription: A theme automatically created by the upgrade.\nVersion: 1.0\nAuthor: Moi\n*/\n";
-
-	$stylelines = file_get_contents("$site_dir/style.css");
-	if ($stylelines) {
-		$f = fopen("$site_dir/style.css", 'w');
-
-		fwrite($f, $header);
-		fwrite($f, $stylelines);
-		fclose($f);
-	}
-
-	return true;
-}
-
-function make_site_theme_from_default($theme_name, $template) {
-	$site_dir = ABSPATH . "wp-content/themes/$template";
-	$default_dir = ABSPATH . 'wp-content/themes/default';
-
-	// Copy files from the default theme to the site theme.
-	//$files = array('index.php', 'comments.php', 'comments-popup.php', 'footer.php', 'header.php', 'sidebar.php', 'style.css');
-
-	$theme_dir = @ dir("$default_dir");
-	if ($theme_dir) {
-		while(($theme_file = $theme_dir->read()) !== false) {
-			if (is_dir("$default_dir/$theme_file"))
-				continue;
-			if (! @copy("$default_dir/$theme_file", "$site_dir/$theme_file"))
-				return;
-			chmod("$site_dir/$theme_file", 0777);
-		}
-	}
-
-	// Rewrite the theme header.
-	$stylelines = explode("\n", implode('', file("$site_dir/style.css")));
-	if ($stylelines) {
-		$f = fopen("$site_dir/style.css", 'w');
-
-		foreach ($stylelines as $line) {
-			if (strpos($line, 'Theme Name:') !== false) $line = 'Theme Name: ' . $theme_name;
-			elseif (strpos($line, 'Theme URI:') !== false) $line = 'Theme URI: ' . __get_option('url');
-			elseif (strpos($line, 'Description:') !== false) $line = 'Description: Your theme.';
-			elseif (strpos($line, 'Version:') !== false) $line = 'Version: 1';
-			elseif (strpos($line, 'Author:') !== false) $line = 'Author: You';
-			fwrite($f, $line . "\n");
-		}
-		fclose($f);
-	}
-
-	// Copy the images.
-	umask(0);
-	if (! mkdir("$site_dir/images", 0777)) {
-		return false;
-	}
-
-	$images_dir = @ dir("$default_dir/images");
-	if ($images_dir) {
-		while(($image = $images_dir->read()) !== false) {
-			if (is_dir("$default_dir/images/$image"))
-				continue;
-			if (! @copy("$default_dir/images/$image", "$site_dir/images/$image"))
-				return;
-			chmod("$site_dir/images/$image", 0777);
-		}
-	}
-}
-
-// Create a site theme from the default theme.
-function make_site_theme() {
-	// Name the theme after the blog.
-	$theme_name = __get_option('blogname');
-	$template = sanitize_title($theme_name);
-	$site_dir = ABSPATH . "wp-content/themes/$template";
-
-	// If the theme already exists, nothing to do.
-	if ( is_dir($site_dir)) {
-		return false;
-	}
-
-	// We must be able to write to the themes dir.
-	if (! is_writable(ABSPATH . "wp-content/themes")) {
-		return false;
-	}
-
-	umask(0);
-	if (! mkdir($site_dir, 0777)) {
-		return false;
-	}
-
-	if (file_exists(ABSPATH . 'wp-layout.css')) {
-		if (! make_site_theme_from_oldschool($theme_name, $template)) {
-			// TODO:  rm -rf the site theme directory.
-			return false;
-		}
-	} else {
-		if (! make_site_theme_from_default($theme_name, $template))
-			// TODO:  rm -rf the site theme directory.
-			return false;
-	}
-
-	// Make the new site theme active.
-	$current_template = __get_option('template');
-	if ($current_template == 'default') {
-		update_option('template', $template);
-		update_option('stylesheet', $template);
-	}
-	return $template;
-}
-
-function translate_level_to_role($level) {
-	switch ($level) {
-	case 10:
-	case 9:
-	case 8:
-		return 'administrator';
-	case 7:
-	case 6:
-	case 5:
-		return 'editor';
-	case 4:
-	case 3:
-	case 2:
-		return 'author';
-	case 1:
-		return 'contributor';
-	case 0:
-		return 'subscriber';
-	}
-}
-
-function wp_check_mysql_version() {
-	global $wp_version;
-
-	// Make sure the server has MySQL 4.0
-	$mysql_version = preg_replace('|[^0-9\.]|', '', @mysql_get_server_info());
-	if ( version_compare($mysql_version, '4.0.0', '<') )
-		die(sprintf(__('<strong>ERROR</strong>: WordPress %s requires MySQL 4.0.0 or higher'), $wp_version));
-}
-
-function maybe_disable_automattic_widgets() {
-	$plugins = __get_option( 'active_plugins' );
-	
-	foreach ( (array) $plugins as $plugin ) {
-		if ( basename( $plugin ) == 'widgets.php' ) {
-			array_splice( $plugins, array_search( $plugin, $plugins ), 1 );
-			update_option( 'active_plugins', $plugins );
-			break;
-		}
-	}
-}
-
-?>
\ No newline at end of file
+// Deprecated.  Use includes/upgrade.php.
+_deprecated_file( basename(__FILE__), '2.5', 'wp-admin/includes/upgrade.php' );
+require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
+?>
diff -x .svn -aruN 2.2.2.src/wp-admin/upgrade-schema.php 2.5.src/wp-admin/upgrade-schema.php
--- 2.2.2.src/wp-admin/upgrade-schema.php	2007-04-19 17:26:52.000000000 -0500
+++ 2.5.src/wp-admin/upgrade-schema.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,392 +0,0 @@
-<?php
-// Here we keep the DB structure and option values
-
-$charset_collate = '';
-
-if ( version_compare(mysql_get_server_info(), '4.1.0', '>=') ) {
-	if ( ! empty($wpdb->charset) )
-		$charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
-	if ( ! empty($wpdb->collate) )
-		$charset_collate .= " COLLATE $wpdb->collate";
-}
-
-$wp_queries="CREATE TABLE $wpdb->categories (
-  cat_ID bigint(20) NOT NULL auto_increment,
-  cat_name varchar(55) NOT NULL default '',
-  category_nicename varchar(200) NOT NULL default '',
-  category_description longtext NOT NULL,
-  category_parent bigint(20) NOT NULL default '0',
-  category_count bigint(20) NOT NULL default '0',
-  link_count bigint(20) NOT NULL default '0',
-  posts_private tinyint(1) NOT NULL default '0',
-  links_private tinyint(1) NOT NULL default '0',
-  PRIMARY KEY  (cat_ID),
-  KEY category_nicename (category_nicename)
-) $charset_collate;
-CREATE TABLE $wpdb->comments (
-  comment_ID bigint(20) unsigned NOT NULL auto_increment,
-  comment_post_ID int(11) NOT NULL default '0',
-  comment_author tinytext NOT NULL,
-  comment_author_email varchar(100) NOT NULL default '',
-  comment_author_url varchar(200) NOT NULL default '',
-  comment_author_IP varchar(100) NOT NULL default '',
-  comment_date datetime NOT NULL default '0000-00-00 00:00:00',
-  comment_date_gmt datetime NOT NULL default '0000-00-00 00:00:00',
-  comment_content text NOT NULL,
-  comment_karma int(11) NOT NULL default '0',
-  comment_approved enum('0','1','spam') NOT NULL default '1',
-  comment_agent varchar(255) NOT NULL default '',
-  comment_type varchar(20) NOT NULL default '',
-  comment_parent bigint(20) NOT NULL default '0',
-  user_id bigint(20) NOT NULL default '0',
-  PRIMARY KEY  (comment_ID),
-  KEY comment_approved (comment_approved),
-  KEY comment_post_ID (comment_post_ID)
-) $charset_collate;
-CREATE TABLE $wpdb->link2cat (
-  rel_id bigint(20) NOT NULL auto_increment,
-  link_id bigint(20) NOT NULL default '0',
-  category_id bigint(20) NOT NULL default '0',
-  PRIMARY KEY  (rel_id),
-  KEY link_id (link_id,category_id)
-) $charset_collate;
-CREATE TABLE $wpdb->links (
-  link_id bigint(20) NOT NULL auto_increment,
-  link_url varchar(255) NOT NULL default '',
-  link_name varchar(255) NOT NULL default '',
-  link_image varchar(255) NOT NULL default '',
-  link_target varchar(25) NOT NULL default '',
-  link_category bigint(20) NOT NULL default '0',
-  link_description varchar(255) NOT NULL default '',
-  link_visible enum('Y','N') NOT NULL default 'Y',
-  link_owner int(11) NOT NULL default '1',
-  link_rating int(11) NOT NULL default '0',
-  link_updated datetime NOT NULL default '0000-00-00 00:00:00',
-  link_rel varchar(255) NOT NULL default '',
-  link_notes mediumtext NOT NULL,
-  link_rss varchar(255) NOT NULL default '',
-  PRIMARY KEY  (link_id),
-  KEY link_category (link_category),
-  KEY link_visible (link_visible)
-) $charset_collate;
-CREATE TABLE $wpdb->options (
-  option_id bigint(20) NOT NULL auto_increment,
-  blog_id int(11) NOT NULL default '0',
-  option_name varchar(64) NOT NULL default '',
-  option_can_override enum('Y','N') NOT NULL default 'Y',
-  option_type int(11) NOT NULL default '1',
-  option_value longtext NOT NULL,
-  option_width int(11) NOT NULL default '20',
-  option_height int(11) NOT NULL default '8',
-  option_description tinytext NOT NULL,
-  option_admin_level int(11) NOT NULL default '1',
-  autoload enum('yes','no') NOT NULL default 'yes',
-  PRIMARY KEY  (option_id,blog_id,option_name),
-  KEY option_name (option_name)
-) $charset_collate;
-CREATE TABLE $wpdb->post2cat (
-  rel_id bigint(20) NOT NULL auto_increment,
-  post_id bigint(20) NOT NULL default '0',
-  category_id bigint(20) NOT NULL default '0',
-  PRIMARY KEY  (rel_id),
-  KEY post_id (post_id,category_id)
-) $charset_collate;
-CREATE TABLE $wpdb->postmeta (
-  meta_id bigint(20) NOT NULL auto_increment,
-  post_id bigint(20) NOT NULL default '0',
-  meta_key varchar(255) default NULL,
-  meta_value longtext,
-  PRIMARY KEY  (meta_id),
-  KEY post_id (post_id),
-  KEY meta_key (meta_key)
-) $charset_collate;
-CREATE TABLE $wpdb->posts (
-  ID bigint(20) unsigned NOT NULL auto_increment,
-  post_author bigint(20) NOT NULL default '0',
-  post_date datetime NOT NULL default '0000-00-00 00:00:00',
-  post_date_gmt datetime NOT NULL default '0000-00-00 00:00:00',
-  post_content longtext NOT NULL,
-  post_title text NOT NULL,
-  post_category int(4) NOT NULL default '0',
-  post_excerpt text NOT NULL,
-  post_status enum('publish','draft','private','static','object','attachment','inherit','future') NOT NULL default 'publish',
-  comment_status enum('open','closed','registered_only') NOT NULL default 'open',
-  ping_status enum('open','closed') NOT NULL default 'open',
-  post_password varchar(20) NOT NULL default '',
-  post_name varchar(200) NOT NULL default '',
-  to_ping text NOT NULL,
-  pinged text NOT NULL,
-  post_modified datetime NOT NULL default '0000-00-00 00:00:00',
-  post_modified_gmt datetime NOT NULL default '0000-00-00 00:00:00',
-  post_content_filtered text NOT NULL,
-  post_parent bigint(20) NOT NULL default '0',
-  guid varchar(255) NOT NULL default '',
-  menu_order int(11) NOT NULL default '0',
-  post_type varchar(20) NOT NULL default 'post',
-  post_mime_type varchar(100) NOT NULL default '',
-  comment_count bigint(20) NOT NULL default '0',
-  PRIMARY KEY  (ID),
-  KEY post_name (post_name),
-  KEY type_status_date (post_type,post_status,post_date,ID)
-) $charset_collate;
-CREATE TABLE $wpdb->users (
-  ID bigint(20) unsigned NOT NULL auto_increment,
-  user_login varchar(60) NOT NULL default '',
-  user_pass varchar(64) NOT NULL default '',
-  user_nicename varchar(50) NOT NULL default '',
-  user_email varchar(100) NOT NULL default '',
-  user_url varchar(100) NOT NULL default '',
-  user_registered datetime NOT NULL default '0000-00-00 00:00:00',
-  user_activation_key varchar(60) NOT NULL default '',
-  user_status int(11) NOT NULL default '0',
-  display_name varchar(250) NOT NULL default '',
-  PRIMARY KEY  (ID),
-  KEY user_login_key (user_login)
-) $charset_collate;
-CREATE TABLE $wpdb->usermeta (
-  umeta_id bigint(20) NOT NULL auto_increment,
-  user_id bigint(20) NOT NULL default '0',
-  meta_key varchar(255) default NULL,
-  meta_value longtext,
-  PRIMARY KEY  (umeta_id),
-  KEY user_id (user_id),
-  KEY meta_key (meta_key)
-) $charset_collate;";
-
-function populate_options() {
-	global $wpdb, $wp_db_version;
-
-	$schema = ( isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on' ) ? 'https://' : 'http://';
-	$guessurl = preg_replace('|/wp-admin/.*|i', '', $schema . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
-	add_option('siteurl', $guessurl, __('WordPress web address'));
-	add_option('blogname', __('My Weblog'), __('Blog title'));
-	add_option('blogdescription', __('Just another WordPress weblog'), __('Short tagline'));
-	add_option('new_users_can_blog', 0);
-	add_option('users_can_register', 0);
-	add_option('admin_email', 'you@example.com');
-	add_option('start_of_week', 1);
-	add_option('use_balanceTags', 0);
-	add_option('use_smilies', 1);
-	add_option('require_name_email', 1);
-	add_option('comments_notify', 1);
-	add_option('posts_per_rss', 10);
-	add_option('rss_excerpt_length', 50);
-	add_option('rss_use_excerpt', 0);
-	add_option('mailserver_url', 'mail.example.com');
-	add_option('mailserver_login', 'login@example.com');
-	add_option('mailserver_pass', 'password');
-	add_option('mailserver_port', 110);
-	add_option('default_category', 1);
-	add_option('default_comment_status', 'open');
-	add_option('default_ping_status', 'open');
-	add_option('default_pingback_flag', 1);
-	add_option('default_post_edit_rows', 10);
-	add_option('posts_per_page', 10);
-	add_option('what_to_show', 'posts');
-	add_option('date_format', __('F j, Y'));
-	add_option('time_format', __('g:i a'));
-	add_option('links_updated_date_format', __('F j, Y g:i a'));
-	add_option('links_recently_updated_prepend', '<em>');
-	add_option('links_recently_updated_append', '</em>');
-	add_option('links_recently_updated_time', 120);
-	add_option('comment_moderation', 0);
-	add_option('moderation_notify', 1);
-	add_option('permalink_structure');
-	add_option('gzipcompression', 0);
-	add_option('hack_file', 0);
-	add_option('blog_charset', 'UTF-8');
-	add_option('moderation_keys');
-	add_option('active_plugins');
-	add_option('home', $guessurl);
-	// in case it is set, but blank, update "home"
-	if ( !__get_option('home') ) update_option('home', $guessurl);
-	add_option('category_base');
-	add_option('ping_sites', 'http://rpc.pingomatic.com/');
-	add_option('advanced_edit', 0);
-	add_option('comment_max_links', 2);
-	add_option('gmt_offset', date('Z') / 3600);
-	// 1.5
-	add_option('default_email_category', 1, __('Posts by email go to this category'));
-	add_option('recently_edited');
-	add_option('use_linksupdate', 0);
-	add_option('template', 'default');
-	add_option('stylesheet', 'default');
-	add_option('comment_whitelist', 1);
-	add_option('page_uris');
-	add_option('blacklist_keys');
-	add_option('comment_registration', 0);
-	add_option('rss_language', 'en');
-	add_option('html_type', 'text/html');
-	// 1.5.1
-	add_option('use_trackback', 0);
-	// 2.0
-	add_option('default_role', 'subscriber');
-	add_option('db_version', $wp_db_version);
-	// 2.0.1
-	if ( ini_get('safe_mode') ) {
-		// Safe mode screws up mkdir(), so we must use a flat structure.
-		add_option('uploads_use_yearmonth_folders', 0);
-		add_option('upload_path', 'wp-content');
-	} else {
-		add_option('uploads_use_yearmonth_folders', 1);
-		add_option('upload_path', 'wp-content/uploads');
-	}
-
-	// 2.0.3
-	add_option('secret', md5(uniqid(microtime())));
-
-	// 2.1
-	add_option('blog_public', '1');
-	add_option('default_link_category', 2);
-	add_option('show_on_front', 'posts');
-
-	// Delete unused options
-	$unusedoptions = array ('blodotgsping_url', 'bodyterminator', 'emailtestonly', 'phoneemail_separator', 'smilies_directory', 'subjectprefix', 'use_bbcode', 'use_blodotgsping', 'use_phoneemail', 'use_quicktags', 'use_weblogsping', 'weblogs_cache_file', 'use_preview', 'use_htmltrans', 'smilies_directory', 'fileupload_allowedusers', 'use_phoneemail', 'default_post_status', 'default_post_category', 'archive_mode', 'time_difference', 'links_minadminlevel', 'links_use_adminlevels', 'links_rating_type', 'links_rating_char', 'links_rating_ignore_zero', 'links_rating_single_image', 'links_rating_image0', 'links_rating_image1', 'links_rating_image2', 'links_rating_image3', 'links_rating_image4', 'links_rating_image5', 'links_rating_image6', 'links_rating_image7', 'links_rating_image8', 'links_rating_image9', 'weblogs_cacheminutes', 'comment_allowed_tags', 'search_engine_friendly_urls', 'default_geourl_lat', 'default_geourl_lon', 'use_default_geourl', 'weblogs_xml_url', 'new_users_can_blog', '_wpnonce', '_wp_http_referer', 'Update', 'action', 'rich_editing');
-	foreach ($unusedoptions as $option) :
-		delete_option($option);
-	endforeach;
-
-	// Set up a few options not to load by default
-	$fatoptions = array( 'moderation_keys', 'recently_edited', 'blacklist_keys' );
-	foreach ($fatoptions as $fatoption) :
-		$wpdb->query("UPDATE $wpdb->options SET `autoload` = 'no' WHERE option_name = '$fatoption'");
-	endforeach;
-}
-
-function populate_roles() {
-	populate_roles_160();
-	populate_roles_210();
-}
-
-function populate_roles_160() {
-	global $wp_roles;
-
-	// Add roles
-	add_role('administrator', __('Administrator'));
-	add_role('editor', __('Editor'));
-	add_role('author', __('Author'));
-	add_role('contributor', __('Contributor'));
-	add_role('subscriber', __('Subscriber'));
-
-	// Add caps for Administrator role
-	$role = get_role('administrator');
-	$role->add_cap('switch_themes');
-	$role->add_cap('edit_themes');
-	$role->add_cap('activate_plugins');
-	$role->add_cap('edit_plugins');
-	$role->add_cap('edit_users');
-	$role->add_cap('edit_files');
-	$role->add_cap('manage_options');
-	$role->add_cap('moderate_comments');
-	$role->add_cap('manage_categories');
-	$role->add_cap('manage_links');
-	$role->add_cap('upload_files');
-	$role->add_cap('import');
-	$role->add_cap('unfiltered_html');
-	$role->add_cap('edit_posts');
-	$role->add_cap('edit_others_posts');
-	$role->add_cap('edit_published_posts');
-	$role->add_cap('publish_posts');
-	$role->add_cap('edit_pages');
-	$role->add_cap('read');
-	$role->add_cap('level_10');
-	$role->add_cap('level_9');
-	$role->add_cap('level_8');
-	$role->add_cap('level_7');
-	$role->add_cap('level_6');
-	$role->add_cap('level_5');
-	$role->add_cap('level_4');
-	$role->add_cap('level_3');
-	$role->add_cap('level_2');
-	$role->add_cap('level_1');
-	$role->add_cap('level_0');
-
-	// Add caps for Editor role
-	$role = get_role('editor');
-	$role->add_cap('moderate_comments');
-	$role->add_cap('manage_categories');
-	$role->add_cap('manage_links');
-	$role->add_cap('upload_files');
-	$role->add_cap('unfiltered_html');
-	$role->add_cap('edit_posts');
-	$role->add_cap('edit_others_posts');
-	$role->add_cap('edit_published_posts');
-	$role->add_cap('publish_posts');
-	$role->add_cap('edit_pages');
-	$role->add_cap('read');
-	$role->add_cap('level_7');
-	$role->add_cap('level_6');
-	$role->add_cap('level_5');
-	$role->add_cap('level_4');
-	$role->add_cap('level_3');
-	$role->add_cap('level_2');
-	$role->add_cap('level_1');
-	$role->add_cap('level_0');
-
-	// Add caps for Author role
-	$role = get_role('author');
-	$role->add_cap('upload_files');
-	$role->add_cap('edit_posts');
-	$role->add_cap('edit_published_posts');
-	$role->add_cap('publish_posts');
-	$role->add_cap('read');
-	$role->add_cap('level_2');
-	$role->add_cap('level_1');
-	$role->add_cap('level_0');
-
-	// Add caps for Contributor role
-	$role = get_role('contributor');
-	$role->add_cap('edit_posts');
-	$role->add_cap('read');
-	$role->add_cap('level_1');
-	$role->add_cap('level_0');
-
-	// Add caps for Subscriber role
-	$role = get_role('subscriber');
-	$role->add_cap('read');
-	$role->add_cap('level_0');
-}
-
-function populate_roles_210() {
-	$roles = array('administrator', 'editor');
-	foreach ($roles as $role) {
-		$role = get_role($role);
-		if ( empty($role) )
-			continue;
-
-		$role->add_cap('edit_others_pages');
-		$role->add_cap('edit_published_pages');
-		$role->add_cap('publish_pages');
-		$role->add_cap('delete_pages');
-		$role->add_cap('delete_others_pages');
-		$role->add_cap('delete_published_pages');
-		$role->add_cap('delete_posts');
-		$role->add_cap('delete_others_posts');
-		$role->add_cap('delete_published_posts');
-		$role->add_cap('delete_private_posts');
-		$role->add_cap('edit_private_posts');
-		$role->add_cap('read_private_posts');
-		$role->add_cap('delete_private_pages');
-		$role->add_cap('edit_private_pages');
-		$role->add_cap('read_private_pages');
-	}
-
-	$role = get_role('administrator');
-	if ( ! empty($role) ) {
-		$role->add_cap('delete_users');
-		$role->add_cap('create_users');
-	}
-
-	$role = get_role('author');
-	if ( ! empty($role) ) {
-		$role->add_cap('delete_posts');
-		$role->add_cap('delete_published_posts');
-	}
-
-	$role = get_role('contributor');
-	if ( ! empty($role) ) {
-		$role->add_cap('delete_posts');
-	}
-}
-
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/upgrade.php 2.5.src/wp-admin/upgrade.php
--- 2.2.2.src/wp-admin/upgrade.php	2007-03-17 03:46:59.000000000 -0500
+++ 2.5.src/wp-admin/upgrade.php	2008-04-22 19:06:02.000000000 -0500
@@ -1,27 +1,24 @@
 <?php
 define('WP_INSTALLING', true);
 if (!file_exists('../wp-config.php'))
-	die("There doesn't seem to be a <code>wp-config.php</code> file. I need this before we can get started. Need more help? <a href='http://codex.wordpress.org/Installing_WordPress#Step_3:_Set_up_wp-config.php'>We got it</a>. You can <a href='setup-config.php'>create a <code>wp-config.php</code> file through a web interface</a>, but this doesn't work for all server setups. The safest way is to manually create the file.");
+	die("There doesn't seem to be a <code>wp-config.php</code> file. I need this before we can get started. Need more help? <a href='http://codex.wordpress.org/Installing_WordPress#Step_3:_Set_up_wp-config.php'>We got it</a>. You can create a <code>wp-config.php</code> file through a web interface, but this doesn't work for all server setups. The safest way is to manually create the file.</p><p><a href='setup-config.php' class='button'>Create a Configuration File</a>");
 
 require('../wp-config.php');
 timer_start();
-require_once(ABSPATH . '/wp-admin/upgrade-functions.php');
+require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
 
 if (isset($_GET['step']))
 	$step = (int) $_GET['step'];
 else
 	$step = 0;
-@header('Content-type: ' . get_option('html_type') . '; charset=' . get_option('blog_charset'));
+@header('Content-Type: ' . get_option('html_type') . '; charset=' . get_option('blog_charset'));
 ?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>>
 <head>
 	<meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php echo get_option('blog_charset'); ?>" />
 	<title><?php _e('WordPress &rsaquo; Upgrade'); ?></title>
-	<link rel="stylesheet" href="<?php echo get_option('siteurl') ?>/wp-admin/install.css?version=<?php bloginfo('version'); ?>" type="text/css" />
-	<?php if ( ('rtl' == $wp_locale->text_direction) ) : ?>
-	<link rel="stylesheet" href="<?php echo get_option('siteurl') ?>/wp-admin/install-rtl.css?version=<?php bloginfo('version'); ?>" type="text/css" />
-	<?php endif; ?>
+	<?php wp_admin_css( 'css/install' ); ?>
 </head>
 <body>
 <h1 id="logo"><img alt="WordPress" src="images/wordpress-logo.png" /></h1>
@@ -30,17 +27,19 @@
 
 <h2><?php _e('No Upgrade Required'); ?></h2>
 <p><?php _e('Your WordPress database is already up-to-date!'); ?></p>
-<h2 class="step"><a href="<?php echo get_option('home'); ?>/"><?php _e('Continue &raquo;'); ?></a></h2>
+<h2 class="step"><a href="<?php echo get_option('home'); ?>/"><?php _e('Continue'); ?></a></h2>
 
 <?php else :
 switch($step) :
 	case 0:
-		$goback = clean_url(stripslashes(wp_get_referer()));
+		$goback = stripslashes(wp_get_referer());
+		$goback = clean_url($goback, null, 'url');
+		$goback = urlencode($goback);
 ?>
 <h2><?php _e('Database Upgrade Required'); ?></h2>
 <p><?php _e('Your WordPress database is out-of-date, and must be upgraded before you can continue.'); ?></p>
-<p><?php _e('The upgrade process may take a while, so please be patient.'); ?></p> 
-<h2 class="step"><a href="upgrade.php?step=1&amp;backto=<?php echo $goback; ?>"><?php _e('Upgrade WordPress &raquo;'); ?></a></h2>
+<p><?php _e('The upgrade process may take a while, so please be patient.'); ?></p>
+<h2 class="step"><a href="upgrade.php?step=1&amp;backto=<?php echo $goback; ?>"><?php _e('Upgrade WordPress'); ?></a></h2>
 <?php
 		break;
 	case 1:
@@ -48,12 +47,14 @@
 
 		if ( empty( $_GET['backto'] ) )
 			$backto = __get_option('home') . '/';
-		else
-			$backto = clean_url(stripslashes($_GET['backto']));
-?> 
+		else {
+			$backto = stripslashes(urldecode($_GET['backto']));
+			$backto = clean_url($backto, null, 'url');
+		}
+?>
 <h2><?php _e('Upgrade Complete'); ?></h2>
 	<p><?php _e('Your WordPress database has been successfully upgraded!'); ?></p>
-	<h2 class="step"><a href="<?php echo $backto; ?>"><?php _e('Continue &raquo;'); ?></a></h2>
+	<h2 class="step"><a href="<?php echo $backto; ?>"><?php _e('Continue'); ?></a></h2>
 
 <!--
 <pre>
diff -x .svn -aruN 2.2.2.src/wp-admin/upload-functions.php 2.5.src/wp-admin/upload-functions.php
--- 2.2.2.src/wp-admin/upload-functions.php	2007-08-01 15:58:38.000000000 -0500
+++ 2.5.src/wp-admin/upload-functions.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,360 +0,0 @@
-<?php
-function wp_upload_display( $dims = false, $href = '' ) {
-	global $post;
-	$id = get_the_ID();
-	$attachment_data = wp_get_attachment_metadata( $id );
-	$is_image = (int) wp_attachment_is_image();
-	if ( !isset($attachment_data['width']) && $is_image ) {
-		if ( $image_data = getimagesize( get_attached_file( $id ) ) ) {
-			$attachment_data['width'] = $image_data[0];
-			$attachment_data['height'] = $image_data[1];
-			wp_update_attachment_metadata( $id, $attachment_data );
-		}
-	}
-	if ( isset($attachment_data['width']) )
-		list($width,$height) = wp_shrink_dimensions($attachment_data['width'], $attachment_data['height'], 171, 128);
-
-	ob_start();
-		the_title();
-		$post_title = attribute_escape(ob_get_contents());
-	ob_end_clean();
-	$post_content = attribute_escape(apply_filters( 'content_edit_pre', $post->post_content ));
-
-	$class = 'text';
-	$innerHTML = get_attachment_innerHTML( $id, false, $dims );
-	if ( $image_src = get_attachment_icon_src() ) {
-		$image_rel = wp_make_link_relative($image_src);
-		$innerHTML = '&nbsp;' . str_replace($image_src, $image_rel, $innerHTML);
-		$class = 'image';
-	}
-
-	$src_base = wp_get_attachment_url();
-	$src = wp_make_link_relative( $src_base );
-	$src_base = str_replace($src, '', $src_base);
-
-	$r = '';
-
-	if ( $href )
-		$r .= "<a id='file-link-$id' href='$href' title='$post_title' class='file-link $class'>\n";
-	if ( $href || $image_src )
-		$r .= "\t\t\t$innerHTML";
-	if ( $href )
-		$r .= "</a>\n";
-	$r .= "\n\t\t<div class='upload-file-data'>\n\t\t\t<p>\n";
-	$r .= "\t\t\t\t<input type='hidden' name='attachment-url-$id' id='attachment-url-$id' value='$src' />\n";
-	$r .= "\t\t\t\t<input type='hidden' name='attachment-url-base-$id' id='attachment-url-base-$id' value='$src_base' />\n";
-
-	if ( !$thumb_base = wp_get_attachment_thumb_url() )
-		$thumb_base = wp_mime_type_icon();
-	if ( $thumb_base ) {
-		$thumb_rel = wp_make_link_relative( $thumb_base );
-		$thumb_base = str_replace( $thumb_rel, '', $thumb_base );
-		$r .= "\t\t\t\t<input type='hidden' name='attachment-thumb-url-$id' id='attachment-thumb-url-$id' value='$thumb_rel' />\n";
-		$r .= "\t\t\t\t<input type='hidden' name='attachment-thumb-url-base-$id' id='attachment-thumb-url-base-$id' value='$thumb_base' />\n";
-	}
-
-	$r .= "\t\t\t\t<input type='hidden' name='attachment-is-image-$id' id='attachment-is-image-$id' value='$is_image' />\n";
-
-	if ( isset($width) ) {
-		$r .= "\t\t\t\t<input type='hidden' name='attachment-width-$id' id='attachment-width-$id' value='$width' />\n";
-		$r .= "\t\t\t\t<input type='hidden' name='attachment-height-$id' id='attachment-height-$id' value='$height' />\n";
-	}
-	$r .= "\t\t\t\t<input type='hidden' name='attachment-page-url-$id' id='attachment-page-url-$id' value='" . get_attachment_link( $id ) . "' />\n";
-	$r .= "\t\t\t\t<input type='hidden' name='attachment-title-$id' id='attachment-title-$id' value='$post_title' />\n";
-	$r .= "\t\t\t\t<input type='hidden' name='attachment-description-$id' id='attachment-description-$id' value='$post_content' />\n";
-	$r .= "\t\t\t</p>\n\t\t</div>\n";
-	return $r;
-}
-
-function wp_upload_view() {
-	global $style, $post_id, $style;
-	$id = get_the_ID();
-	$attachment_data = wp_get_attachment_metadata( $id );
-?>
-	<div id="upload-file">
-		<div id="file-title">
-			<h2><?php if ( !isset($attachment_data['width']) && 'inline' != $style )
-					echo "<a href='" . wp_get_attachment_url() . "' title='" . __('Direct link to file') . "'>";
-				the_title();
-				if ( !isset($attachment_data['width']) && 'inline' != $style )
-					echo '</a>';
-			?></h2>
-			<span><?php
-				echo '[&nbsp;';
-				echo '<a href="' . get_permalink() . '">' . __('view') . '</a>';
-				echo '&nbsp;|&nbsp;';
-					echo '<a href="' . clean_url(add_query_arg('action', 'edit')) . '" title="' . __('Edit this file') . '">' . __('edit') . '</a>';
-				echo '&nbsp;|&nbsp;';
-				echo '<a href="' . clean_url(remove_query_arg(array('action', 'ID'))) . '" title="' . __('Browse your files') . '">' . __('cancel') . '</a>';
-				echo '&nbsp;]'; ?></span>
-		</div>
-
-		<div id="upload-file-view" class="alignleft">
-<?php		if ( isset($attachment_data['width']) && 'inline' != $style )
-			echo "<a href='" . wp_get_attachment_url() . "' title='" . __('Direct link to file') . "'>";
-		echo wp_upload_display( array(171, 128) );
-		if ( isset($attachment_data['width']) && 'inline' != $style )
-			echo '</a>'; ?>
-		</div>
-		<?php the_attachment_links( $id ); ?>
-	</div>
-<?php	echo "<form action='' id='browse-form'><input type='hidden' id='nonce-value' value='" . wp_create_nonce( 'inlineuploading' )  . "' /></form>\n";
-}
-
-function wp_upload_form() {
-	$id = get_the_ID();
-	global $post_id, $tab, $style;
-	$enctype = $id ? '' : ' enctype="multipart/form-data"';
-	$post_id = (int) $post_id;
-?>
-	<form<?php echo $enctype; ?> id="upload-file" method="post" action="<?php echo get_option('siteurl') . '/wp-admin/upload.php?style=' . attribute_escape($style . '&amp;tab=upload&amp;post_id=' . $post_id); ?>">
-<?php
-	if ( $id ) :
-		$attachment = get_post_to_edit( $id );
-		$attachment_data = wp_get_attachment_metadata( $id );
-?>
-		<div id="file-title">
-			<h2><?php if ( !isset($attachment_data['width']) && 'inline' != $style )
-					echo "<a href='" . wp_get_attachment_url() . "' title='" . __('Direct link to file') . "'>";
-				the_title();
-				if ( !isset($attachment_data['width']) && 'inline' != $style )
-					echo '</a>';
-			?></h2>
-			<span><?php
-				echo '[&nbsp;';
-				echo '<a href="' . get_permalink() . '">' . __('view') . '</a>';
-				echo '&nbsp;|&nbsp;';
-					echo '<a href="' . clean_url(add_query_arg('action', 'view')) . '">' . __('links') . '</a>';
-				echo '&nbsp;|&nbsp;';
-				echo '<a href="' . clean_url(remove_query_arg(array('action','ID'))) . '" title="' . __('Browse your files') . '">' . __('cancel') . '</a>';
-				echo '&nbsp;]'; ?></span>
-		</div>
-
-	<div id="upload-file-view" class="alignleft">
-<?php		if ( isset($attachment_data['width']) && 'inline' != $style )
-			echo "<a href='" . wp_get_attachment_url() . "' title='" . __('Direct link to file') . "'>";
-		echo wp_upload_display( array(171, 128) );
-		if ( isset($attachment_data['width']) && 'inline' != $style )
-			echo '</a>'; ?>
-	</div>
-<?php	endif; ?>
-		<table><col /><col class="widefat" />
-<?php	if ( $id ): ?>
-			<tr>
-				<th scope="row"><label for="url"><?php _e('URL'); ?></label></th>
-				<td><input type="text" id="url" class="readonly" value="<?php echo wp_get_attachment_url(); ?>" readonly="readonly" /></td>
-			</tr>
-<?php	else : ?>
-			<tr>
-				<th scope="row"><label for="upload"><?php _e('File'); ?></label></th>
-				<td><input type="file" id="upload" name="image" /></td>
-			</tr>
-<?php	endif; ?>
-			<tr>
-				<th scope="row"><label for="post_title"><?php _e('Title'); ?></label></th>
-				<td><input type="text" id="post_title" name="post_title" value="<?php echo $attachment->post_title; ?>" /></td>
-			</tr>
-			<tr>
-				<th scope="row"><label for="post_content"><?php _e('Description'); ?></label></th>
-				<td><textarea name="post_content" id="post_content"><?php echo $attachment->post_content; ?></textarea></td>
-			</tr>
-			<tr id="buttons" class="submit">
-				<td colspan='2'>
-<?php	if ( $id ) : ?>
-					<input type="submit" name="delete" id="delete" class="delete alignleft" value="<?php _e('Delete File'); ?>" />
-<?php	endif; ?>
-					<input type="hidden" name="from_tab" value="<?php echo $tab; ?>" />
-					<input type="hidden" name="action" value="<?php echo $id ? 'save' : 'upload'; ?>" />
-<?php	if ( $post_id ) : ?>
-					<input type="hidden" name="post_id" value="<?php echo $post_id; ?>" />
-<?php	endif; if ( $id ) : ?>
-					<input type="hidden" name="ID" value="<?php echo $id; ?>" />
-<?php	endif; ?>
-					<?php wp_nonce_field( 'inlineuploading' ); ?>
-					<div class="submit">
-						<input type="submit" value="<?php $id ? _e('Save') : _e('Upload'); ?> &raquo;" />
-					</div>
-				</td>
-			</tr>
-		</table>
-	</form>
-<?php
-}
-
-function wp_upload_tab_upload() {
-	wp_upload_form();
-}
-
-function wp_upload_tab_upload_action() {
-	global $action;
-	if ( isset($_POST['delete']) )
-		$action = 'delete';
-
-	switch ( $action ) :
-	case 'upload' :
-		global $from_tab, $post_id, $style;
-		if ( !$from_tab )
-			$from_tab = 'upload';
-
-		check_admin_referer( 'inlineuploading' );
-
-		global $post_id, $post_title, $post_content;
-
-		if ( !current_user_can( 'upload_files' ) )
-			wp_die( __('You are not allowed to upload files.')
-				. " <a href='" . get_option('siteurl') . "/wp-admin/upload.php?style=" . attribute_escape($style . "&amp;tab=browse-all&amp;post_id=$post_id") . "'>"
-				. __('Browse Files') . '</a>'
-			);
-
-		$overrides = array('action'=>'upload');
-
-		$file = wp_handle_upload($_FILES['image'], $overrides);
-
-		if ( isset($file['error']) )
-			wp_die($file['error'] . "<br /><a href='" . get_option('siteurl')
-			. "/wp-admin/upload.php?style=" . attribute_escape($style . "&amp;tab=$from_tab&amp;post_id=$post_id") . "'>" . __('Back to Image Uploading') . '</a>'
-		);
-
-		$url = $file['url'];
-		$type = $file['type'];
-		$file = $file['file'];
-		$filename = basename($file);
-
-		// Construct the attachment array
-		$attachment = array(
-			'post_title' => $post_title ? $post_title : $filename,
-			'post_content' => $post_content,
-			'post_type' => 'attachment',
-			'post_parent' => $post_id,
-			'post_mime_type' => $type,
-			'guid' => $url
-		);
-
-		// Save the data
-		$id = wp_insert_attachment($attachment, $file, $post_id);
-
-		wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) );
-
-		wp_redirect( get_option('siteurl') . "/wp-admin/upload.php?style=$style&tab=browse&action=view&ID=$id&post_id=$post_id");
-		die;
-		break;
-
-	case 'save' :
-		global $from_tab, $post_id, $style;
-		if ( !$from_tab )
-			$from_tab = 'upload';
-		check_admin_referer( 'inlineuploading' );
-
-		wp_update_post($_POST);
-		wp_redirect( get_option('siteurl') . "/wp-admin/upload.php?style=$style&tab=$from_tab&post_id=$post_id");
-		die;
-		break;
-
-	case 'delete' :
-		global $ID, $post_id, $from_tab, $style;
-		if ( !$from_tab )
-			$from_tab = 'upload';
-
-		check_admin_referer( 'inlineuploading' );
-
-		if ( !current_user_can('edit_post', (int) $ID) )
-			wp_die( __('You are not allowed to delete this attachment.')
-				. " <a href='" . get_option('siteurl') . "/wp-admin/upload.php?style=" . attribute_escape($style . "&amp;tab=$from_tab&amp;post_id=$post_id") . "'>"
-				. __('Go back') . '</a>'
-			);
-
-		wp_delete_attachment($ID);
-
-		wp_redirect( get_option('siteurl') . "/wp-admin/upload.php?style=$style&tab=$from_tab&post_id=$post_id" );
-		die;
-		break;
-
-	endswitch;
-}
-
-add_action( 'upload_files_upload', 'wp_upload_tab_upload_action' );
-
-function wp_upload_grab_attachments( $obj ) {
-	$obj->is_attachment = true;
-}
-
-function wp_upload_posts_where( $where ) {
-	global $post_id;
-	return $where . " AND post_parent = '" . (int) $post_id . "'";
-}
-
-function wp_upload_tab_browse() {
-	global $wpdb, $action, $paged;
-	$old_vars = compact( 'paged' );
-
-	switch ( $action ) :
-	case 'edit' :
-	case 'view' :
-		global $ID;
-		$attachments = query_posts("attachment_id=$ID");
-		if ( have_posts() ) : while ( have_posts() ) : the_post();
-			'edit' == $action ? wp_upload_form() : wp_upload_view();
-		endwhile; endif;
-		break;
-	default :
-		global $tab, $post_id, $style;
-		add_action( 'pre_get_posts', 'wp_upload_grab_attachments' );
-		if ( 'browse' == $tab && $post_id )
-			add_filter( 'posts_where', 'wp_upload_posts_where' );
-		$attachments = query_posts("what_to_show=posts&posts_per_page=10&paged=$paged");
-		$count_query = "SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = 'attachment'";
-		if ( $post_id )
-			$count_query .= " AND post_parent = '$post_id'";
-        	$total =  $wpdb->get_var($count_query);
-
-		echo "<ul id='upload-files'>\n";
-		if ( have_posts() ) : while ( have_posts() ) : the_post();
-			$href = wp_specialchars( add_query_arg( array(
-				'action' => 'inline' == $style ? 'view' : 'edit',
-				'ID' => get_the_ID())
-			 ), 1 );
-
-			echo "\t<li id='file-";
-			the_ID();
-			echo "' class='alignleft'>\n";
-			echo wp_upload_display( array(128,128), $href );
-			echo "\t</li>\n";
-		endwhile;
-		else :
-			echo "\t<li>" . __('There are no attachments to show.') . "</li>\n";
-		endif;
-		echo "</ul>\n\n";
-
-		echo "<form action='' id='browse-form'><input type='hidden' id='nonce-value' value='" . wp_create_nonce( 'inlineuploading' )  . "' /></form>\n";
-		break;
-	endswitch;
-
-	extract($old_vars);
-}
-
-
-function wp_upload_tab_browse_action() {
-	global $style;
-	if ( 'inline' == $style )
-		wp_enqueue_script('upload');
-}
-
-add_action( 'upload_files_browse', 'wp_upload_tab_browse_action' );
-add_action( 'upload_files_browse-all', 'wp_upload_tab_browse_action' );
-
-function wp_upload_admin_head() {
-	global $wp_locale;
-	echo "<link rel='stylesheet' href='" . get_option('siteurl') . '/wp-admin/upload.css?version=' . get_bloginfo('version') . "a' type='text/css' />\n";
-	if ( 'rtl' == $wp_locale->text_direction )
-		echo "<link rel='stylesheet' href='" . get_option('siteurl') . '/wp-admin/upload-rtl.css?version=' . get_bloginfo('version') . "a' type='text/css' />\n";
-	if ( 'inline' == @$_GET['style'] ) {
-		echo "<style type='text/css' media='screen'>\n";
-		echo "\t#upload-menu { position: absolute; z-index: 2; }\n";
-		echo "\tbody > #upload-menu { position: fixed; }\n";
-		echo "\t#upload-content { top: 2em; }\n";
-		echo "\t#upload-file { position: absolute; top: 15px; }\n";
-		echo "</style>";
-	}
-}
-
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/upload-rtl.css 2.5.src/wp-admin/upload-rtl.css
--- 2.2.2.src/wp-admin/upload-rtl.css	2006-11-14 17:18:20.000000000 -0600
+++ 2.5.src/wp-admin/upload-rtl.css	1969-12-31 18:00:00.000000000 -0600
@@ -1,50 +0,0 @@
-#upload-menu li a.upload-tab-link {
-	float: right;
-	margin: 0 .75em 0 0;
-}
-
-table { float: right; }
-
-#upload-menu li #current-tab-nav {
-	float: right;
-	padding: 5px 0 0 5px;
-	margin-right: -5px;
-}
-
-#upload-file th, #the-attachment-links textarea { text-align: left; }
-
-h2 { margin: 0 0 0 .2em; }
-
-#upload-files li { margin: 0 15px 15px 0; }
-
-#upload-file-view { padding: 0 75px 0 0; }
-
-#upload-menu li {
-	display: block;
-	float: right;
-}
-
-#upload-menu li.current {
-	border-right: 0;
-	border-left: 2px solid #448abd;
-}
-
-#upload-file {
-	left: auto;
-	right: 0;
-}
-
-#file-title {
-	margin: 0 75px .2em 0;
-	font-family: Tahoma, Georgia, "Times New Roman", Times, serif;
-}
-
-.back {
-	left: auto;
-	right: 14px;
-}
-
-#uploadoptions td {
-	padding-left: 0;
-	padding-right: 1em;
-}
diff -x .svn -aruN 2.2.2.src/wp-admin/upload.css 2.5.src/wp-admin/upload.css
--- 2.2.2.src/wp-admin/upload.css	2007-05-01 18:34:00.000000000 -0500
+++ 2.5.src/wp-admin/upload.css	1969-12-31 18:00:00.000000000 -0600
@@ -1,204 +0,0 @@
-body { background: #f9fcfe; }
-
-.upload-file-data { display: none; }
-
-#upload-menu {
-	border-top: 2em solid #247fab;
-	margin: 0;
-	padding: 0;
-	height: 0;
-	list-style: none;
-	width: 100%;
-}
-
-body > #upload-menu { border-bottom: 7px solid #fff; }
-
-#upload-menu li {
-	margin: 0;
-	position: relative;
-	top: -2em;
-	padding-bottom: 5px;
-	border: none;
-	border-top: 3px solid #247fab;
-}
-
-#upload-menu li a.upload-tab-link {
-	margin-left: 0.75em;
-	padding: 5px 5px 0;
-	display: block;
-	float: left;
-	height: 100%;
-	text-decoration: none;
-	border-bottom: none;
-	color: #fff;
-}
-
-#upload-menu li.current {
-	border-right: 2px solid #448abd;
-	color: #000;
-}
-
-#upload-menu li.current a.upload-tab-link, #upload-menu li a:hover {
-	background: #f9fcfe;
-	color: #000;
-}
-
-#upload-menu li #current-tab-nav {
-	background: #f9fcfe;
-	float: left;
-	padding: 5px 5px 0 0;
-	margin-left: -5px;
-}
-
-#upload-menu li span .page-numbers {
-	padding: 0;
-	border: none;
-}
-
-#upload-menu li span a.page-numbers { color: #00019b; }
-#upload-menu li span a.page-numbers:hover { text-decoration: underline; }
-
-#upload-content {
-	position: relative;
-	clear: both;
-	margin: 0;
-	padding: 0;
-	border: none;
-	width: 100%;
-	height: 100%;
-	background: none;
-}
-
-#upload-file {
-	margin: 0 auto;
-	top: 0;
-	left: 0;
-	width: 95%;
-	height: 100%;
-	background: #f9fcfe;
-}
-
-#upload-file th {
-	width: 8em;
-}
-
-form#upload-file input, form#upload-file textarea, div#upload-content.upload table { width: 100%; }
-
-form#upload-file .submit input { width: auto; }
-
-#upload-file-view { padding: 0 0 0 75px; }
-
-#file-title {
-	margin: 0 0 .2em 75px;
-	padding: 0;
-	display: block;
-	font-family: Georgia, "Times New Roman", Times, serif;
-	font-size: 16px;
-}
-
-h2 {
-	margin: 0 .2em 0 0;
-	padding: 0;
-	display: inline;
-	border: none;
-	color: #000;
-	font-size: 1.4em;
-	line-height: 1.4em;
-}
-
-.wrap h2 {
-	margin: .4em 0 .5em;
-	display: block;
-	border-bottom: .5em solid #e5f3ff;
-	color: #333;
-	font: normal 32px/5px serif;
-	clear: both;
-}
-
-* html .wrap h2 {
-	margin-top: 1em;
-}
-
-.back {
-	display: block;
-	position: absolute;
-	left: 14px;
-	top: 10px;
-}
-
-#upload-files {
-	list-style-type: none;
-	margin: 0;
-	padding: 15px 0 0;
-}
-
-#upload-files li { margin: 0 0 15px 15px; }
-
-#upload-files a, #upload-file-view a, a.file-link {
-	border: none;
-	text-decoration: none;
-}
-
-#upload-file-view a img { padding-bottom: .2em; border-bottom: 1px solid #6699CC; }
-
-#upload-files a.file-link {
-	display: block;
-	width: 130px;
-	height: 128px;
-	background-color: rgb(209, 226, 239);
-	text-align: center;
-	overflow: hidden;
-}
-
-#upload-files a.text {
-	padding-top: 40px;
-	height: 88px;
-	font-size: 16px;
-}
-
-#upload-files a.file-link.image {
-	font-size: 2px;
-	letter-spacing: 0;
-}
-
-#upload-files a.file-link img { vertical-align: middle; }
-
-#the-attachment-links textarea {
-	font-size: 10px;
-	overflow: hidden;
-}
-
-form table { float: none; padding: 0 15px; }
-
-table {
-	float: left;
-	margin: 0;
-	padding: 0;
-}
-
-th { text-align: right; vertical-align: text-top; }
-
-tr, td, th {
-	margin-top: 0;
-	padding-top: 0;
-}
-
-#uploadoptions th {
-	width: 80px;
-}
-
-#uploadoptions p {
-	margin: 0;
-	padding: 0;
-}
-
-#uploadoptions td {
-	padding-left: 1em;
-	line-height: 140%;
-}
-
-#uploadoptions table {
-	width: 300px;
-}
-
-input.readonly { background-color: #ddd; }
diff -x .svn -aruN 2.2.2.src/wp-admin/upload.js 2.5.src/wp-admin/upload.js
--- 2.2.2.src/wp-admin/upload.js	2007-03-06 11:35:01.000000000 -0600
+++ 2.5.src/wp-admin/upload.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,273 +0,0 @@
-addLoadEvent( function() {
-	theFileList = {
-		currentImage: {ID: 0},
-		nonce: '',
-		tab: '',
-		postID: 0,
-
-		initializeVars: function() {
-			this.urlData  = document.location.href.split('?');
-			this.params = this.urlData[1].toQueryParams();
-			this.postID = this.params['post_id'];
-			this.tab = this.params['tab'];
-			this.style = this.params['style'];
-			this.ID = this.params['ID'];
-			if ( !this.style )
-				this.style = 'default';
-			var nonceEl = $('nonce-value');
-			if ( nonceEl )
-				this.nonce = nonceEl.value;
-			if ( this.ID ) {
-				this.grabImageData( this.ID );
-				this.imageView( this.ID );
-			}
-		},
-
-		initializeLinks: function() {
-			if ( this.ID )
-				return;
-			$$('a.file-link').each( function(i) {
-				var id = i.id.split('-').pop();
-				i.onclick = function(e) { theFileList[ 'inline' == theFileList.style ? 'imageView' : 'editView' ](id, e); }
-			} );
-		},
-
-		grabImageData: function(id) {
-			if ( id == this.currentImage.ID )
-				return;
-			var thumbEl = $('attachment-thumb-url-' + id);
-			if ( thumbEl ) {
-				this.currentImage.thumb = ( 0 == id ? '' : thumbEl.value );
-				this.currentImage.thumbBase = ( 0 == id ? '' : $('attachment-thumb-url-base-' + id).value );
-			} else {
-				this.currentImage.thumb = false;
-			}
-			this.currentImage.src = ( 0 == id ? '' : $('attachment-url-' + id).value );
-			this.currentImage.srcBase = ( 0 == id ? '' : $('attachment-url-base-' + id).value );
-			this.currentImage.page = ( 0 == id ? '' : $('attachment-page-url-' + id).value );
-			this.currentImage.title = ( 0 == id ? '' : $('attachment-title-' + id).value );
-			this.currentImage.description = ( 0 == id ? '' : $('attachment-description-' + id).value );
-			var widthEl = $('attachment-width-' + id);
-			if ( widthEl ) {
-				this.currentImage.width = ( 0 == id ? '' : widthEl.value );
-				this.currentImage.height = ( 0 == id ? '' : $('attachment-height-' + id).value );
-			} else {
-				this.currentImage.width = false;
-				this.currentImage.height = false;
-			}
-			this.currentImage.isImage = ( 0 == id ? 0 : $('attachment-is-image-' + id).value );
-			this.currentImage.ID = id;
-		},
-
-		imageView: function(id, e) {
-			this.prepView(id);
-			var h = '';
-
-			h += "<div id='upload-file'>"
-			if ( this.ID ) {
-				var params = $H(this.params);
-				params.ID = '';
-				params.action = '';
-				h += "<a href='" + this.urlData[0] + '?' + params.toQueryString() + "'";
-			} else {
-				h += "<a href='#' onclick='return theFileList.cancelView();'";
-			}
-			h += " title='" + this.browseTitle + "' class='back'>" + this.back + "</a>";
-			h += "<div id='file-title'>"
-			if ( 0 == this.currentImage.isImage )
-				h += "<h2><a href='" + this.currentImage.srcBase + this.currentImage.src + "' onclick='return false;' title='" + this.directTitle + "'>" + this.currentImage.title + "</a></h2>";
-			else
-				h += "<h2>" + this.currentImage.title + "</h2>";
-			h += " &#8212; <span>";
-			h += "<a href='#' onclick='return theFileList.editView(" + id + ");'>" + this.edit + "</a>"
-			h += "</span>";
-			h += '</div>'
-			h += "<div id='upload-file-view' class='alignleft'>";
-			if ( 1 == this.currentImage.isImage ) {
-				h += "<a href='" + this.currentImage.srcBase + this.currentImage.src + "' onclick='return false;' title='" + this.directTitle + "'>";
-				h += "<img src='" + ( this.currentImage.thumb ? this.currentImage.thumb : this.currentImage.src ) + "' alt='" + this.currentImage.title + "' width='" + this.currentImage.width + "' height='" + this.currentImage.height + "' />";
-				h += "</a>";
-			} else
-				h += '&nbsp;';
-			h += "</div>";
-
-			h += "<form name='uploadoptions' id='uploadoptions' class='alignleft'>";
-			h += "<table>";
-			var display = [];
-			var checked = 'display-title';
-			if ( 1 == this.currentImage.isImage ) {
-				checked = 'display-full';
-				if ( this.currentImage.thumb ) {
-					display.push("<label for='display-thumb'><input type='radio' name='display' id='display-thumb' value='thumb' /> " + this.thumb + "</label><br />");
-					checked = 'display-thumb';
-				}
-				display.push("<label for='display-full'><input type='radio' name='display' id='display-full' value='full' /> " + this.full + "</label>");
-			} else if ( this.currentImage.thumb ) {
-				display.push("<label for='display-thumb'><input type='radio' name='display' id='display-thumb' value='thumb' /> " + this.icon + "</label>");
-			}
-			if ( display.length ) {
-				display.push("<br /><label for='display-title'><input type='radio' name='display' id='display-title' value='title' /> " + this.title + "</label>");
-				h += "<tr><th style='padding-bottom:.5em'>" + this.show + "</th><td style='padding-bottom:.5em'>";
-				$A(display).each( function(i) { h += i; } );
-				h += "</td></tr>";
-			}
-
-			h += "<tr><th>" + this.link + "</th><td>";
-			h += "<label for='link-file'><input type='radio' name='link' id='link-file' value='file' checked='checked'/> " + this.file + "</label><br />";
-			h += "<label for='link-page'><input type='radio' name='link' id='link-page' value='page' /> " + this.page + "</label><br />";
-			h += "<label for='link-none'><input type='radio' name='link' id='link-none' value='none' /> " + this.none + "</label>";
-			h += "</td></tr>";
-
-			h += "<tr><td colspan='2'><p class='submit'>";
-			h += "<input type='button' class='button' name='send' onclick='theFileList.sendToEditor(" + id + ")' value='" + this.editorText + "' />";
-			h += "</p></td></tr></table>";
-			h += "</form>";
-
-			h += "</div>";
-
-			new Insertion.Top('upload-content', h);
-			var displayEl = $(checked);
-			if ( displayEl )
-				displayEl.checked = true;
-
-			if (e) Event.stop(e);
-			return false;
-		},
-
-		editView: function(id, e) {
-			this.prepView(id);
-			var h = '';
-
-			var action = 'upload.php?style=' + this.style + '&amp;tab=upload';
-			if ( this.postID )
-				action += '&amp;post_id=' + this.postID;
-
-			h += "<form id='upload-file' method='post' action='" + action + "'>";
-			if ( this.ID ) {
-				var params = $H(this.params);
-				params.ID = '';
-				params.action = '';
-				h += "<a href='" + this.urlData[0] + '?' + params.toQueryString() + "'";
-			} else {
-				h += "<a href='#' onclick='return theFileList.cancelView();'";
-			}
-			h += " title='" + this.browseTitle + "' class='back'>" + this.back + "</a>";
-			h += "<div id='file-title'>"
-			if ( 0 == this.currentImage.isImage )
-				h += "<h2><a href='" + this.currentImage.srcBase + this.currentImage.src + "' onclick='return false;' title='" + this.directTitle + "'>" + this.currentImage.title + "</a></h2>";
-			else
-				h += "<h2>" + this.currentImage.title + "</h2>";
-			h += " &#8212; <span>";
-			h += "<a href='#' onclick='return theFileList.imageView(" + id + ");'>" + this.insert + "</a>";
-			h += "</span>";
-			h += '</div>'
-			h += "<div id='upload-file-view' class='alignleft'>";
-			if ( 1 == this.currentImage.isImage ) {
-				h += "<a href='" + this.currentImage.srcBase + this.currentImage.src + "' onclick='return false;' title='" + this.directTitle + "'>";
-				h += "<img src='" + ( this.currentImage.thumb ? this.currentImage.thumb : this.currentImage.src ) + "' alt='" + this.currentImage.title + "' width='" + this.currentImage.width + "' height='" + this.currentImage.height + "' />";
-				h += "</a>";
-			} else
-				h += '&nbsp;';
-			h += "</div>";
-
-
-			h += "<table><col /><col class='widefat' /><tr>";
-			h += "<th scope='row'><label for='url'>" + this.urlText + "</label></th>";
-			h += "<td><input type='text' id='url' class='readonly' value='" + this.currentImage.srcBase + this.currentImage.src + "' readonly='readonly' /></td>";
-			h += "</tr><tr>";
-			h += "<th scope='row'><label for='post_title'>" + this.title + "</label></th>";
-			h += "<td><input type='text' id='post_title' name='post_title' value='" + this.currentImage.title + "' /></td>";
-			h += "</tr><tr>";
-			h += "<th scope='row'><label for='post_content'>" + this.desc + "</label></th>";
-			h += "<td><textarea name='post_content' id='post_content'>" + this.currentImage.description + "</textarea></td>";
-			h += "</tr><tr id='buttons' class='submit'><td colspan='2'><input type='button' id='delete' name='delete' class='delete alignleft' value='" + this.deleteText + "' onclick='theFileList.deleteFile(" + id + ");' />";
-			h += "<input type='hidden' name='from_tab' value='" + this.tab + "' />";
-			h += "<input type='hidden' name='action' id='action-value' value='save' />";
-			h += "<input type='hidden' name='ID' value='" + id + "' />";
-			h += "<input type='hidden' name='_wpnonce' value='" + this.nonce + "' />";
-			h += "<div class='submit'><input type='submit' value='" + this.saveText + "' /></div>";
-			h += "</td></tr></table></form>";
-
-			new Insertion.Top('upload-content', h);
-			if (e) Event.stop(e);
-			return false;
-		},
-
-		prepView: function(id) {
-			this.cancelView( true );
-			var filesEl = $('upload-files');
-			if ( filesEl )
-				filesEl.hide();
-			var navEl = $('current-tab-nav');
-			if ( navEl )
-				navEl.hide();
-			this.grabImageData(id);
-		},
-
-		cancelView: function( prep ) {
-			if ( !prep ) {
-				var filesEl = $('upload-files');
-				if ( filesEl )
-					Element.show(filesEl);
-				var navEl = $('current-tab-nav');
-				if ( navEl )
-					Element.show(navEl);
-			}
-			if ( !this.ID )
-				this.grabImageData(0);
-			var div = $('upload-file');
-			if ( div )
-				Element.remove(div);
-			return false;
-		},
-
-		sendToEditor: function(id) {
-			this.grabImageData(id);
-			var link = '';
-			var display = '';
-			var h = '';
-
-			link = $A(document.forms.uploadoptions.elements.link).detect( function(i) { return i.checked; } ).value;
-			displayEl = $A(document.forms.uploadoptions.elements.display).detect( function(i) { return i.checked; } )
-			if ( displayEl )
-				display = displayEl.value;
-			else if ( 1 == this.currentImage.isImage )
-				display = 'full';
-
-			if ( 'none' != link )
-				h += "<a href='" + ( 'file' == link ? ( this.currentImage.srcBase + this.currentImage.src ) : ( this.currentImage.page + "' rel='attachment wp-att-" + this.currentImage.ID ) ) + "' title='" + this.currentImage.title + "'>";
-			if ( display && 'title' != display )
-				h += "<img src='" + ( 'thumb' == display ? ( this.currentImage.thumbBase + this.currentImage.thumb ) : ( this.currentImage.srcBase + this.currentImage.src ) ) + "' alt='" + this.currentImage.title + "' />";
-			else
-				h += this.currentImage.title;
-			if ( 'none' != link )
-				h += "</a>";
-
-			var win = window.opener ? window.opener : window.dialogArguments;
-			if ( !win )
-				win = top;
-			tinyMCE = win.tinyMCE;
-			if ( typeof tinyMCE != 'undefined' && tinyMCE.getInstanceById('content') ) {
-				tinyMCE.selectedInstance.getWin().focus();
-				tinyMCE.execCommand('mceInsertContent', false, h);
-			} else
-				win.edInsertContent(win.edCanvas, h);
-			if ( !this.ID )
-				this.cancelView();
-			return false;
-		},
-
-		deleteFile: function(id) {
-			if ( confirm( this.confirmText.replace(/%title%/g, this.currentImage.title) ) ) {
-				$('action-value').value = 'delete';
-				$('upload-file').submit();
-				return true;
-			}
-			return false;
-		}
-
-	};
-	Object.extend( theFileList, uploadL10n );
-	theFileList.initializeVars();
-	theFileList.initializeLinks();
-} );
diff -x .svn -aruN 2.2.2.src/wp-admin/upload.php 2.5.src/wp-admin/upload.php
--- 2.2.2.src/wp-admin/upload.php	2007-05-01 18:34:00.000000000 -0500
+++ 2.5.src/wp-admin/upload.php	2008-03-26 20:48:22.000000000 -0500
@@ -1,138 +1,249 @@
 <?php
 require_once('admin.php');
 
-@header('Content-type: ' . get_option('html_type') . '; charset=' . get_option('blog_charset'));
-
 if (!current_user_can('upload_files'))
 	wp_die(__('You do not have permission to upload files.'));
 
-wp_reset_vars(array('action', 'tab', 'from_tab', 'style', 'post_id', 'ID', 'paged', 'post_title', 'post_content', 'delete'));
+// Handle bulk deletes
+if ( isset($_GET['deleteit']) && isset($_GET['delete']) ) {
+	check_admin_referer('bulk-media');
+	foreach( (array) $_GET['delete'] as $post_id_del ) {
+		$post_del = & get_post($post_id_del);
+
+		if ( !current_user_can('delete_post', $post_id_del) )
+			wp_die( __('You are not allowed to delete this post.') );
+
+		if ( $post_del->post_type == 'attachment' )
+			if ( ! wp_delete_attachment($post_id_del) )
+				wp_die( __('Error in deleting...') );
+	}
+
+	$location = 'upload.php';
+	if ( $referer = wp_get_referer() ) {
+		if ( false !== strpos($referer, 'upload.php') )
+			$location = $referer;
+	}
 
-// IDs should be integers
-$ID = (int) $ID;
-$post_id = (int) $post_id;
-
-// Require an ID for the edit screen
-if ( $action == 'edit' && !$ID )
-	wp_die(__("You are not allowed to be here"));
-
-require_once('upload-functions.php');
-if ( !$tab )
-	$tab = 'browse-all';
-
-do_action( "upload_files_$tab" );
-
-$pid = 0;
-if ( $post_id < 0 )
-	$pid = $post_id;
-elseif ( get_post( $post_id ) )
-	$pid = $post_id;
-$wp_upload_tabs = array();
-$all_atts = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = 'attachment'");
-$post_atts = 0;
-
-if ( $pid ) {
-	// 0 => tab display name, 1 => required cap, 2 => function that produces tab content, 3 => total number objects OR array(total, objects per page), 4 => add_query_args
-	$wp_upload_tabs['upload'] = array(__('Upload'), 'upload_files', 'wp_upload_tab_upload', 0);
-	if ( $all_atts && $post_atts = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = 'attachment' AND post_parent = '$post_id'") )
-		$wp_upload_tabs['browse'] = array(__('Browse'), 'upload_files', "wp_upload_tab_browse", $action ? 0 : $post_atts);
-	if ( $post_atts < $all_atts )
-		$wp_upload_tabs['browse-all'] = array(__('Browse All'), 'upload_files', 'wp_upload_tab_browse', $action ? 0 : $all_atts);
-} else
-	$wp_upload_tabs['browse-all'] = array(__('Browse All'), 'upload_files', 'wp_upload_tab_browse', $action ? 0 : $all_atts);
-
-	$wp_upload_tabs = array_merge($wp_upload_tabs, apply_filters( 'wp_upload_tabs', array() ));
-
-if ( !is_callable($wp_upload_tabs[$tab][2]) ) {
-	$to_tab = isset($wp_upload_tabs['upload']) ? 'upload' : 'browse-all';
-	wp_redirect( add_query_arg( 'tab', $to_tab ) );
+	$location = add_query_arg('message', 2, $location);
+	$location = remove_query_arg('posted', $location);
+	wp_redirect($location);
+	exit;
+} elseif ( !empty($_GET['_wp_http_referer']) ) {
+	wp_redirect(remove_query_arg(array('_wp_http_referer', '_wpnonce'), stripslashes($_SERVER['REQUEST_URI'])));
 	exit;
 }
 
-foreach ( $wp_upload_tabs as $t => $tab_array ) {
-	if ( !current_user_can( $tab_array[1] ) ) {
-		unset($wp_upload_tabs[$t]);
-		if ( $tab == $t )
-			wp_die(__("You are not allowed to be here"));
+$title = __('Media Library');
+$parent_file = 'edit.php';
+wp_enqueue_script( 'admin-forms' );
+
+list($post_mime_types, $avail_post_mime_types) = wp_edit_attachments_query();
+
+if ( is_singular() )
+	wp_enqueue_script( 'admin-comments' );
+
+require_once('admin-header.php');
+
+if ( !isset( $_GET['paged'] ) )
+	$_GET['paged'] = 1;
+
+?>
+
+<div class="wrap">
+
+<form id="posts-filter" action="" method="get">
+<h2><?php
+if ( is_singular() ) {
+	printf(__('Comments on %s'), apply_filters( "the_title", $post->post_title));
+} else {
+	$post_mime_type_label = _c('Manage Media|manage media header');
+	if ( isset($_GET['post_mime_type']) && in_array( $_GET['post_mime_type'], array_keys($post_mime_types) ) )
+        $post_mime_type_label = $post_mime_types[$_GET['post_mime_type']][1];
+	if ( $post_listing_pageable && !is_archive() && !is_search() )
+		$h2_noun = is_paged() ? sprintf(__( 'Previous %s' ), $post_mime_type_label) : sprintf(__('Latest %s'), $post_mime_type_label);
+	else
+		$h2_noun = $post_mime_type_label;
+	// Use $_GET instead of is_ since they can override each other
+	$h2_author = '';
+	$_GET['author'] = (int) $_GET['author'];
+	if ( $_GET['author'] != 0 ) {
+		if ( $_GET['author'] == '-' . $user_ID ) { // author exclusion
+			$h2_author = ' ' . __('by other authors');
+		} else {
+			$author_user = get_userdata( get_query_var( 'author' ) );
+			$h2_author = ' ' . sprintf(__('by %s'), wp_specialchars( $author_user->display_name ));
+		}
 	}
+	$h2_search = isset($_GET['s'])   && $_GET['s']   ? ' ' . sprintf(__('matching &#8220;%s&#8221;'), wp_specialchars( get_search_query() ) ) : '';
+	$h2_cat    = isset($_GET['cat']) && $_GET['cat'] ? ' ' . sprintf( __('in &#8220;%s&#8221;'), single_cat_title('', false) ) : '';
+	$h2_tag    = isset($_GET['tag']) && $_GET['tag'] ? ' ' . sprintf( __('tagged with &#8220;%s&#8221;'), single_tag_title('', false) ) : '';
+	$h2_month  = isset($_GET['m'])   && $_GET['m']   ? ' ' . sprintf( __('during %s'), single_month_title(' ', false) ) : '';
+	printf( _c( '%1$s%2$s%3$s%4$s%5$s%6$s|You can reorder these: 1: Posts, 2: by {s}, 3: matching {s}, 4: in {s}, 5: tagged with {s}, 6: during {s}' ), $h2_noun, $h2_author, $h2_search, $h2_cat, $h2_tag, $h2_month );
 }
+?></h2>
+
+<ul class="subsubsub">
+<?php
+$type_links = array();
+$_num_posts = (array) wp_count_attachments();
+$matches = wp_match_mime_types(array_keys($post_mime_types), array_keys($_num_posts));
+foreach ( $matches as $type => $reals )
+	foreach ( $reals as $real )
+		$num_posts[$type] += $_num_posts[$real];
+$class = empty($_GET['post_mime_type']) ? ' class="current"' : '';
+$type_links[] = "<li><a href=\"upload.php\"$class>".__('All Types')."</a>";
+foreach ( $post_mime_types as $mime_type => $label ) {
+	$class = '';
+
+	if ( !wp_match_mime_types($mime_type, $avail_post_mime_types) )
+		continue;
 
-if ( 'inline' == $style ) : ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>>
-<head>
-<meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php echo get_option('blog_charset'); ?>" />
-<title><?php bloginfo('name') ?> &rsaquo; <?php _e('Uploads'); ?> &#8212; WordPress</title>
-<link rel="stylesheet" href="<?php echo get_option('siteurl') ?>/wp-admin/wp-admin.css?version=<?php bloginfo('version'); ?>" type="text/css" />
-<?php if ( ('rtl' == $wp_locale->text_direction) ) : ?>
-<link rel="stylesheet" href="<?php echo get_option('siteurl') ?>/wp-admin/rtl.css?version=<?php bloginfo('version'); ?>" type="text/css" />
-<?php endif; ?> 
-<script type="text/javascript">
-//<![CDATA[
-function addLoadEvent(func) {if ( typeof wpOnload!='function'){wpOnload=func;}else{ var oldonload=wpOnload;wpOnload=function(){oldonload();func();}}}
-//]]>
-</script>
-<?php do_action('admin_print_scripts'); wp_upload_admin_head(); ?>
-</head>
-<body>
-<?php
-else :
-	add_action( 'admin_head', 'wp_upload_admin_head' );
-	include_once('admin-header.php');
+	if ( wp_match_mime_types($mime_type, $_GET['post_mime_type']) )
+		$class = ' class="current"';
+
+	$type_links[] = "<li><a href=\"upload.php?post_mime_type=$mime_type\"$class>" .
+	sprintf(__ngettext($label[2][0], $label[2][1], $num_posts[$mime_type]), number_format_i18n( $num_posts[$mime_type] )) . '</a>';
+}
+echo implode(' | </li>', $type_links) . '</li>';
+unset($type_links);
 ?>
-	<div class='wrap'>
-	<h2><?php _e('Uploads'); ?></h2>
+</ul>
+
 <?php
+if ( isset($_GET['posted']) && $_GET['posted'] ) : $_GET['posted'] = (int) $_GET['posted']; ?>
+<div id="message" class="updated fade"><p><strong><?php _e('Your media has been saved.'); ?></strong> <a href="<?php echo get_permalink( $_GET['posted'] ); ?>"><?php _e('View media'); ?></a> | <a href="media.php?action=edit&amp;attachment_id=<?php echo $_GET['posted']; ?>"><?php _e('Edit media'); ?></a></p></div>
+<?php $_SERVER['REQUEST_URI'] = remove_query_arg(array('posted'), $_SERVER['REQUEST_URI']);
 endif;
 
-echo "<ul id='upload-menu'>\n";
-foreach ( $wp_upload_tabs as $t => $tab_array ) { // We've already done the current_user_can check
-	$href = add_query_arg( array('tab' => $t, 'ID' => '', 'action' => '', 'paged' => '') );
-	if ( isset($tab_array[4]) && is_array($tab_array[4]) )
-		$href = add_query_arg( $tab_array[4], $href );
-	$_href = clean_url( $href);
-	$page_links = '';
-	$class = 'upload-tab alignleft';
-	if ( $tab == $t ) {
-		$class .= ' current';
-		if ( $tab_array[3] ) {
-			if ( is_array($tab_array[3]) ) {
-				$total = $tab_array[3][0];
-				$per = $tab_array[3][1];
-			} else {
-				$total = $tab_array[3];
-				$per = 10;
-			}
-			$page_links = paginate_links( array(
-				'base' => add_query_arg( 'paged', '%#%' ),
-				'format' => '',
-				'total' => ceil($total / $per),
-				'current' => $paged ? $paged : 1,
-				'prev_text' => '&laquo;',
-				'next_text' => '&raquo;'
-			));
-			if ( $page_links )
-				$page_links = "<span id='current-tab-nav'>: $page_links</span>";
-		}
-	}
+$messages[1] = __('Media updated.');
+$messages[2] = __('Media deleted.');
+
+if (isset($_GET['message'])) : ?>
+<div id="message" class="updated fade"><p><?php echo $messages[$_GET['message']]; ?></p></div>
+<?php $_SERVER['REQUEST_URI'] = remove_query_arg(array('message'), $_SERVER['REQUEST_URI']);
+endif;
+?>
+
+<p id="post-search">
+	<input type="text" id="post-search-input" name="s" value="<?php the_search_query(); ?>" />
+	<input type="submit" value="<?php _e( 'Search Media' ); ?>" class="button" />
+</p>
+
+<?php do_action('restrict_manage_posts'); ?>
+
+<div class="tablenav">
+
+<?php
+$page_links = paginate_links( array(
+	'base' => add_query_arg( 'paged', '%#%' ),
+	'format' => '',
+	'total' => $wp_query->max_num_pages,
+	'current' => $_GET['paged']
+));
 
-	echo "\t<li class='$class'><a href='$_href' class='upload-tab-link' title='{$tab_array[0]}'>{$tab_array[0]}</a>$page_links</li>\n";
+if ( $page_links )
+	echo "<div class='tablenav-pages'>$page_links</div>";
+?>
+
+<div class="alignleft">
+<input type="submit" value="<?php _e('Delete'); ?>" name="deleteit" class="button-secondary delete" />
+<?php wp_nonce_field('bulk-media'); ?>
+<?php
+
+if ( !is_singular() ) :
+	$arc_query = "SELECT DISTINCT YEAR(post_date) AS yyear, MONTH(post_date) AS mmonth FROM $wpdb->posts WHERE post_type = 'attachment' ORDER BY post_date DESC";
+
+	$arc_result = $wpdb->get_results( $arc_query );
+
+	$month_count = count($arc_result);
+
+	if ( $month_count && !( 1 == $month_count && 0 == $arc_result[0]->mmonth ) ) : ?>
+<select name='m'>
+<option<?php selected( @$_GET['m'], 0 ); ?> value='0'><?php _e('Show all dates'); ?></option>
+<?php
+foreach ($arc_result as $arc_row) {
+	if ( $arc_row->yyear == 0 )
+		continue;
+	$arc_row->mmonth = zeroise( $arc_row->mmonth, 2 );
+
+	if ( $arc_row->yyear . $arc_row->mmonth == $_GET['m'] )
+		$default = ' selected="selected"';
+	else
+		$default = '';
+
+	echo "<option$default value='$arc_row->yyear$arc_row->mmonth'>";
+	echo $wp_locale->get_month($arc_row->mmonth) . " $arc_row->yyear";
+	echo "</option>\n";
 }
-unset($t, $tab_array, $href, $_href, $page_links, $total, $per, $class);
-echo "</ul>\n\n";
+?>
+</select>
+<?php endif; // month_count ?>
+
+<input type="submit" id="post-query-submit" value="<?php _e('Filter'); ?>" class="button-secondary" />
+
+<?php endif; // is_singular ?>
+
+</div>
+
+<br class="clear" />
+</div>
+
+<br class="clear" />
+
+<?php include( 'edit-attachment-rows.php' ); ?>
 
-echo "<div id='upload-content' class='$tab'>\n";
+</form>
 
-call_user_func( $wp_upload_tabs[$tab][2] );
+<div id="ajax-response"></div>
 
-echo "</div>\n";
+<div class="tablenav">
+
+<?php
+if ( $page_links )
+	echo "<div class='tablenav-pages'>$page_links</div>";
+?>
+
+</div>
+
+<br class="clear" />
+
+<?php
+ 
+if ( 1 == count($posts) && is_singular() ) :
+	
+	$comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_post_ID = $id AND comment_approved != 'spam' ORDER BY comment_date");
+	if ( $comments ) :
+		// Make sure comments, post, and post_author are cached
+		update_comment_cache($comments);
+		$post = get_post($id);
+		$authordata = get_userdata($post->post_author);
+	?>
+
+<br class="clear" />
+
+<table class="widefat" style="margin-top: .5em">
+<thead>
+  <tr>
+    <th scope="col"><?php _e('Comment') ?></th>
+    <th scope="col"><?php _e('Date') ?></th>
+    <th scope="col"><?php _e('Actions') ?></th>
+  </tr>
+</thead>
+<tbody id="the-comment-list" class="list:comment">
+<?php
+        foreach ($comments as $comment)
+                _wp_comment_row( $comment->comment_ID, 'detail', false, false );
+?>
+</tbody>
+</table>
+
+<?php
+
+endif; // comments
+endif; // posts;
+
+?>
 
-if ( 'inline' != $style ) :
-	echo "<div class='clear'></div></div>";
-	include_once('admin-footer.php');
-else : ?>
-<script type="text/javascript">if(typeof wpOnload=='function')wpOnload();</script>
+</div>
 
-</body>
-</html>
-<?php endif; ?>
+<?php include('admin-footer.php'); ?>
diff -x .svn -aruN 2.2.2.src/wp-admin/user-edit.php 2.5.src/wp-admin/user-edit.php
--- 2.2.2.src/wp-admin/user-edit.php	2007-05-28 23:37:35.000000000 -0500
+++ 2.5.src/wp-admin/user-edit.php	2008-03-15 17:57:47.000000000 -0500
@@ -1,12 +1,71 @@
 <?php
+
 require_once('admin.php');
 
-$title = __('Edit User');
-if ( current_user_can('edit_users') )
-	$parent_file = 'users.php';
+if ( defined('IS_PROFILE_PAGE') && IS_PROFILE_PAGE )
+	$is_profile_page = true;
+else
+	$is_profile_page = false;
+
+function profile_js ( ) {
+?>
+<script type="text/javascript">
+	function check_pass_strength ( ) {
+
+		var pass = jQuery('#pass1').val();
+		var user = jQuery('#user_login').val();
+
+		// get the result as an object, i'm tired of typing it
+		var res = jQuery('#pass-strength-result');
+
+		var strength = passwordStrength(pass, user);
+
+		jQuery(res).removeClass('short bad good strong');
+
+		if ( strength == pwsL10n.bad ) {
+			jQuery(res).addClass('bad');
+			jQuery(res).html( pwsL10n.bad );
+		}
+		else if ( strength == pwsL10n.good ) {
+			jQuery(res).addClass('good');
+			jQuery(res).html( pwsL10n.good );
+		}
+		else if ( strength == pwsL10n.strong ) {
+			jQuery(res).addClass('strong');
+			jQuery(res).html( pwsL10n.strong );
+		}
+		else {
+			// this catches 'Too short' and the off chance anything else comes along
+			jQuery(res).addClass('short');
+			jQuery(res).html( pwsL10n.short );
+		}
+
+	}
+
+	jQuery(function($) { 
+		$('#pass1').keyup( check_pass_strength ) 
+		$('.color-palette').click(function(){$(this).siblings('input[name=admin_color]').attr('checked', 'checked')});
+	} );
+	
+	jQuery(document).ready( function() {
+		jQuery('#pass1,#pass2').attr('autocomplete','off');
+    });
+</script>
+<?php
+}
+
+if ( $is_profile_page ) {
+	add_action('admin_head', 'profile_js');
+	wp_enqueue_script('jquery');
+	wp_enqueue_script('password-strength-meter');
+}
+
+$title = $is_profile_page? __('Profile') : __('Edit User');
+if ( current_user_can('edit_users') && !$is_profile_page )
+	$submenu_file = 'users.php';
 else
-	$parent_file = 'profile.php';
-$submenu_file = 'users.php';
+	$submenu_file = 'profile.php';
+$parent_file = 'users.php';
 
 wp_reset_vars(array('action', 'redirect', 'profile', 'user_id', 'wp_http_referer'));
 
@@ -15,7 +74,12 @@
 $user_id = (int) $user_id;
 
 if ( !$user_id )
-	wp_die(__('Invalid user ID.'));
+	if ( $is_profile_page ) {
+		$current_user = wp_get_current_user();
+		$user_id = $current_user->ID;
+	} else {
+		wp_die(__('Invalid user ID.'));
+	}
 
 switch ($action) {
 case 'switchposts':
@@ -33,10 +97,14 @@
 if ( !current_user_can('edit_user', $user_id) )
 	wp_die(__('You do not have permission to edit this user.'));
 
+if ( $is_profile_page ) {
+	do_action('personal_options_update');
+}
+
 $errors = edit_user($user_id);
 
 if( !is_wp_error( $errors ) ) {
-	$redirect = "user-edit.php?user_id=$user_id&updated=true";
+	$redirect = ($is_profile_page? "profile.php?" : "user-edit.php?user_id=$user_id&"). "updated=true";
 	$redirect = add_query_arg('wp_http_referer', urlencode($wp_http_referer), $redirect);
 	wp_redirect($redirect);
 	exit;
@@ -54,7 +122,7 @@
 <?php if ( isset($_GET['updated']) ) : ?>
 <div id="message" class="updated fade">
 	<p><strong><?php _e('User updated.') ?></strong></p>
-	<?php if ( $wp_http_referer ) : ?>
+	<?php if ( $wp_http_referer && !$is_profile_page ) : ?>
 	<p><a href="users.php"><?php _e('&laquo; Back to Authors and Users'); ?></a></p>
 	<?php endif; ?>
 </div>
@@ -70,10 +138,10 @@
 </div>
 <?php endif; ?>
 
-<div class="wrap">
-<h2><?php _e('Edit User'); ?></h2>
+<div class="wrap" id="profile-page">
+<h2><?php $is_profile_page? _e('Your Profile and Personal Options') : _e('Edit User'); ?></h2>
 
-<form name="profile" id="your-profile" action="user-edit.php" method="post">
+<form name="profile" id="your-profile" action="" method="post">
 <?php wp_nonce_field('update-user_' . $user_id) ?>
 <?php if ( $wp_http_referer ) : ?>
 	<input type="hidden" name="wp_http_referer" value="<?php echo clean_url($wp_http_referer); ?>" />
@@ -83,23 +151,63 @@
 <input type="hidden" name="checkuser_id" value="<?php echo $user_ID ?>" />
 </p>
 
-<p><label for="rich_editing"><input name="rich_editing" type="checkbox" id="rich_editing" value="true" <?php checked('true', $profileuser->rich_editing); ?> /> <?php _e('Use the visual editor when writing'); ?></label></p>
+<h3><?php _e('Personal Options'); ?></h3>
+
+<table class="form-table">
+<?php if ( rich_edit_exists() ) : // don't bother showing the option if the editor has been removed ?>
+	<tr>
+		<th scope="row"><?php _e('Visual Editor')?></th>
+		<td><label for="rich_editing"><input name="rich_editing" type="checkbox" id="rich_editing" value="true" <?php checked('true', $profileuser->rich_editing); ?> /> <?php _e('Use the visual editor when writing'); ?></label></td>
+	</tr>
+<?php endif; ?>
+<tr>
+<th scope="row"><?php _e('Admin Color Scheme')?></th>
+<td>
+<?php
+$current_color = get_user_option('admin_color');
+if ( empty($current_color) )
+	$current_color = 'fresh';
+foreach ( $_wp_admin_css_colors as $color => $color_info ): ?>
+<div class="color-option"><input name="admin_color" id="admin_color_<?php echo $color; ?>" type="radio" value="<?php echo $color ?>" class="tog" <?php checked($color, $current_color); ?> />
+	<table class="color-palette">
+	<tr>
+	<?php
+	foreach ( $color_info->colors as $html_color ): ?>
+	<td style="background-color: <?php echo $html_color ?>" title="<?php echo $color ?>">&nbsp;</td>
+	<?php endforeach; ?>
+	</tr>
+	</table>
+	
+	<label for="admin_color_<?php echo $color; ?>"><?php echo $color_info->name ?></label>
+</div>
+<?php endforeach; ?>
+</td>
+</tr>
+</table>
+
+<?php
+	if ( $is_profile_page ) {
+		do_action('profile_personal_options');
+	}
+?>
 
-<p class="submit"><input type="submit" value="<?php _e('Update User &raquo;'); ?>" name="submit" /></p>
+<h3><?php _e('Name') ?></h3>
 
-<fieldset>
-<legend><?php _e('Name'); ?></legend>
-<p><label><?php _e('Username: (no editing)'); ?><br />
-<input type="text" name="user_login" value="<?php echo $profileuser->user_login; ?>" disabled="disabled" />
-</label></p>
+<table class="form-table">
+	<tr>
+		<th><label for="user_login"><?php _e('Username'); ?></label></th>
+		<td><input type="text" name="user_login" id="user_login" value="<?php echo $profileuser->user_login; ?>" disabled="disabled" /> <?php _e('Your username cannot be changed'); ?></td>
+	</tr>
 
-<p><label><?php _e('Role:') ?><br />
+<?php if ( !$is_profile_page ): ?>
+<tr><th><label for="role"><?php _e('Role:') ?></label></th>
 <?php
 // print_r($profileuser);
-echo '<select name="role">';
+echo '<td><select name="role" id="role">';
 $role_list = '';
 $user_has_role = false;
 foreach($wp_roles->role_names as $role => $name) {
+	$name = translate_with_context($name);
 	if ( $profileuser->has_cap($role) ) {
 		$selected = ' selected="selected"';
 		$user_has_role = true;
@@ -112,88 +220,114 @@
 	$role_list .= '<option value="">' . __('&mdash; No role for this blog &mdash;') . '</option>';
 else
 	$role_list .= '<option value="" selected="selected">' . __('&mdash; No role for this blog &mdash;') . '</option>';
-echo $role_list . '</select>';
-?></label></p>
-
-<p><label><?php _e('First name:') ?><br />
-<input type="text" name="first_name" value="<?php echo $profileuser->first_name ?>" /></label></p>
-
-<p><label><?php _e('Last name:') ?><br />
-<input type="text" name="last_name"  value="<?php echo $profileuser->last_name ?>" /></label></p>
-
-<p><label><?php _e('Nickname:') ?><br />
-<input type="text" name="nickname" value="<?php echo $profileuser->nickname ?>" /></label></p>
-
-<p><label><?php _e('Display name publicly as:') ?> <br />
-<select name="display_name">
-<option value="<?php echo $profileuser->display_name; ?>"><?php echo $profileuser->display_name; ?></option>
-<option value="<?php echo $profileuser->nickname ?>"><?php echo $profileuser->nickname ?></option>
-<option value="<?php echo $profileuser->user_login ?>"><?php echo $profileuser->user_login ?></option>
-<?php if ( !empty( $profileuser->first_name ) ) : ?>
-<option value="<?php echo $profileuser->first_name ?>"><?php echo $profileuser->first_name ?></option>
-<?php endif; ?>
-<?php if ( !empty( $profileuser->last_name ) ) : ?>
-<option value="<?php echo $profileuser->last_name ?>"><?php echo $profileuser->last_name ?></option>
-<?php endif; ?>
-<?php if ( !empty( $profileuser->first_name ) && !empty( $profileuser->last_name ) ) : ?>
-<option value="<?php echo $profileuser->first_name." ".$profileuser->last_name ?>"><?php echo $profileuser->first_name." ".$profileuser->last_name ?></option>
-<option value="<?php echo $profileuser->last_name." ".$profileuser->first_name ?>"><?php echo $profileuser->last_name." ".$profileuser->first_name ?></option>
+echo $role_list . '</select></td></tr>';
+?>
 <?php endif; ?>
-</select></label></p>
-</fieldset>
 
-<fieldset>
-<legend><?php _e('Contact Info'); ?></legend>
-
-<p><label><?php _e('E-mail: (required)') ?><br />
-<input type="text" name="email" value="<?php echo $profileuser->user_email ?>" /></label></p>
-
-<p><label><?php _e('Website:') ?><br />
-<input type="text" name="url" value="<?php echo $profileuser->user_url ?>" />
-</label></p>
-
-<p><label><?php _e('AIM:') ?><br />
-<input type="text" name="aim" value="<?php echo $profileuser->aim ?>" />
-</label></p>
-
-<p><label><?php _e('Yahoo IM:') ?><br />
-<input type="text" name="yim" value="<?php echo $profileuser->yim ?>" />
-</label></p>
-
-<p><label><?php _e('Jabber / Google Talk:') ?><br />
-<input type="text" name="jabber" value="<?php echo $profileuser->jabber ?>" /></label>
-</p>
-</fieldset>
-<br clear="all" />
-<fieldset>
-<legend><?php _e('About the user'); ?></legend>
-<p class="desc"><?php _e('Share a little biographical information to fill out your profile. This may be shown publicly.'); ?></p>
-<p><textarea name="description" rows="5" cols="30"><?php echo $profileuser->description ?></textarea></p>
-</fieldset>
+<tr>
+	<th><label for="first_name"><?php _e('First name') ?></label></th>
+	<td><input type="text" name="first_name" id="first_name" value="<?php echo $profileuser->first_name ?>" /></td>
+</tr>
+
+<tr>
+	<th><label for="last_name"><?php _e('Last name') ?></label></th>
+	<td><input type="text" name="last_name" id="last_name" value="<?php echo $profileuser->last_name ?>" /></td>
+</tr>
+
+<tr>
+	<th><label for="nickname"><?php _e('Nickname') ?></label></th>
+	<td><input type="text" name="nickname" id="nickname" value="<?php echo $profileuser->nickname ?>" /></td>
+</tr>
+
+<tr>
+	<th><label for="display_name"><?php _e('Display name publicly&nbsp;as') ?></label></th>
+	<td>
+		<select name="display_name" id="display_name">
+		<?php
+			$public_display = array();
+			$public_display[] = $profileuser->display_name;
+			$public_display[] = $profileuser->nickname;
+			$public_display[] = $profileuser->user_login;
+			$public_display[] = $profileuser->first_name;
+			$public_display[] = $profileuser->first_name.' '.$profileuser->last_name;
+			$public_display[] = $profileuser->last_name.' '.$profileuser->first_name;
+			$public_display = array_unique(array_filter(array_map('trim', $public_display)));
+			foreach($public_display as $item) {
+		?>
+			<option value="<?php echo $item; ?>"><?php echo $item; ?></option>
+		<?php
+			}
+		?>
+		</select>
+	</td>
+</tr>
+</table>
+
+<h3><?php _e('Contact Info') ?></h3>
+
+<table class="form-table">
+<tr>
+	<th><label for="email"><?php _e('E-mail') ?></label></th>
+	<td><input type="text" name="email" id="email" value="<?php echo $profileuser->user_email ?>" /> <?php _e('Required'); ?></td>
+</tr>
+
+<tr>
+	<th><label for="url"><?php _e('Website') ?></label></th>
+	<td><input type="text" name="url" id="url" value="<?php echo $profileuser->user_url ?>" /></td>
+</tr>
+
+<tr>
+	<th><label for="aim"><?php _e('AIM') ?></label></th>
+	<td><input type="text" name="aim" id="aim" value="<?php echo $profileuser->aim ?>" /></td>
+</tr>
+
+<tr>
+	<th><label for="yim"><?php _e('Yahoo IM') ?></label></th>
+	<td><input type="text" name="yim" id="yim" value="<?php echo $profileuser->yim ?>" /></td>
+</tr>
+
+<tr>
+	<th><label for="jabber"><?php _e('Jabber / Google Talk') ?></label></th>
+	<td><input type="text" name="jabber" id="jabber" value="<?php echo $profileuser->jabber ?>" /></td>
+</tr>
+</table>
+
+<h3><?php $is_profile_page? _e('About Yourself') : _e('About the user'); ?></h3>
+
+<table class="form-table">
+<tr>
+	<th><label for="description"><?php _e('Biographical Info'); ?></label></th>
+	<td><textarea name="description" id="description" rows="5" cols="30"><?php echo $profileuser->description ?></textarea><br /><?php _e('Share a little biographical information to fill out your profile. This may be shown publicly.'); ?></td>
+</tr>
 
 <?php
 $show_password_fields = apply_filters('show_password_fields', true);
 if ( $show_password_fields ) :
 ?>
-<fieldset>
-<legend><?php _e("Update User's Password"); ?></legend>
-<p class="desc"><?php _e("If you would like to change the user's password type a new one twice below. Otherwise leave this blank."); ?></p>
-<p><label><?php _e('New Password:'); ?><br />
-<input type="password" name="pass1" size="16" value="" />
-</label></p>
-<p><label><?php _e('Type it one more time:'); ?><br />
-<input type="password" name="pass2" size="16" value="" />
-</label></p>
-</fieldset>
+<tr>
+	<th><label for="pass1"><?php _e('New Password:'); ?></label></th>
+	<td><input type="password" name="pass1" id="pass1" size="16" value="" /> <?php _e("If you would like to change the password type a new one. Otherwise leave this blank."); ?><br />
+		<input type="password" name="pass2" id="pass2" size="16" value="" /> <?php _e("Type your new password again."); ?><br />
+		<?php if ( $is_profile_page ): ?>
+		<p><strong><?php _e('Password Strength:'); ?></strong></p>
+		<div id="pass-strength-result"><?php _e('Too short'); ?></div> <?php _e('Hint: Use upper and lower case characters, numbers and symbols like !"?$%^&amp;( in your password.'); ?>
+		<?php endif; ?>
+	</td>
+</tr>
 <?php endif; ?>
+</table>
 
-<?php do_action('edit_user_profile'); ?>
+<?php
+	if ( $is_profile_page ) {
+		do_action('show_user_profile');
+	} else {
+		do_action('edit_user_profile');
+	}
+?>
 
-<br clear="all" />
-	<table width="99%"  border="0" cellspacing="2" cellpadding="3" class="editform">
-		<?php
-		if(count($profileuser->caps) > count($profileuser->roles)):
-		?>
+<?php if (count($profileuser->caps) > count($profileuser->roles)): ?>
+<br class="clear" />
+	<table width="99%" style="border: none;" cellspacing="2" cellpadding="3" class="editform">
 		<tr>
 			<th scope="row"><?php _e('Additional Capabilities:') ?></th>
 			<td><?php
@@ -207,14 +341,13 @@
 			echo $output;
 			?></td>
 		</tr>
-		<?php
-		endif;
-		?>
 	</table>
+<?php endif; ?>
+
 <p class="submit">
 	<input type="hidden" name="action" value="update" />
 	<input type="hidden" name="user_id" id="user_id" value="<?php echo $user_id; ?>" />
-	<input type="submit" value="<?php _e('Update User &raquo;') ?>" name="submit" />
+	<input type="submit" value="<?php $is_profile_page? _e('Update Profile') : _e('Update User') ?>" name="submit" />
  </p>
 </form>
 </div>
diff -x .svn -aruN 2.2.2.src/wp-admin/users.js 2.5.src/wp-admin/users.js
--- 2.2.2.src/wp-admin/users.js	2006-12-01 17:00:04.000000000 -0600
+++ 2.5.src/wp-admin/users.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,21 +0,0 @@
-addLoadEvent(function() {
-	theListEls = document.getElementsByTagName('tbody');
-	theUserLists = new Array();
-	for ( var l = 0; l < theListEls.length; l++ ) {
-		if ( theListEls[l].id )
-			theUserLists[theListEls[l].id] = new listMan(theListEls[l].id);
-	}
-	addUserInputs = document.getElementById('adduser').getElementsByTagName('input');
-	for ( var i = 0; i < addUserInputs.length; i++ ) {
-		addUserInputs[i].onkeypress = function(e) { return killSubmit('addUserSubmit();', e); }
-	}
-	document.getElementById('addusersub').onclick = function(e) { return killSubmit('addUserSubmit();', e); }
-}
-);
-
-function addUserSubmit() {
-	var roleEl = document.getElementById('role');
-	var role = roleEl.options[roleEl.selectedIndex].value;
-	if ( !theUserLists['role-' + role] ) return true;
-	return theUserLists['role-' + role].ajaxAdder('user', 'adduser');
-}
diff -x .svn -aruN 2.2.2.src/wp-admin/users.php 2.5.src/wp-admin/users.php
--- 2.2.2.src/wp-admin/users.php	2007-06-16 12:52:08.000000000 -0500
+++ 2.5.src/wp-admin/users.php	2008-03-18 14:20:18.000000000 -0500
@@ -11,117 +11,28 @@
 $action = $_REQUEST['action'];
 $update = '';
 
-if ( empty($_POST) ) {
+if ( empty($action) ) {
+	if ( isset($_GET['deleteit']) )
+		$action = 'delete';
+	elseif ( isset($_GET['changeit']) && !empty($_GET['new_role']) )
+		$action = 'promote';
+}
+
+if ( empty($_REQUEST) ) {
 	$referer = '<input type="hidden" name="wp_http_referer" value="'. attribute_escape(stripslashes($_SERVER['REQUEST_URI'])) . '" />';
-} elseif ( isset($_POST['wp_http_referer']) ) {
-	$redirect = remove_query_arg(array('wp_http_referer', 'updated', 'delete_count'), stripslashes($_POST['wp_http_referer']));
+} elseif ( isset($_REQUEST['wp_http_referer']) ) {
+	$redirect = remove_query_arg(array('wp_http_referer', 'updated', 'delete_count'), stripslashes($_REQUEST['wp_http_referer']));
 	$referer = '<input type="hidden" name="wp_http_referer" value="' . attribute_escape($redirect) . '" />';
 } else {
 	$redirect = 'users.php';
 }
 
-
-// WP_User_Search class
-// by Mark Jaquith
-
-
-class WP_User_Search {
-	var $results;
-	var $search_term;
-	var $page;
-	var $raw_page;
-	var $users_per_page = 50;
-	var $first_user;
-	var $last_user;
-	var $query_limit;
-	var $query_from_where;
-	var $total_users_for_query = 0;
-	var $too_many_total_users = false;
-	var $search_errors;
-
-	function WP_User_Search ($search_term = '', $page = '') { // constructor
-		$this->search_term = $search_term;
-		$this->raw_page = ( '' == $page ) ? false : (int) $page;
-		$this->page = (int) ( '' == $page ) ? 1 : $page;
-
-		$this->prepare_query();
-		$this->query();
-		$this->prepare_vars_for_template_usage();
-		$this->do_paging();
-	}
-
-	function prepare_query() {
-		global $wpdb;
-		$this->first_user = ($this->page - 1) * $this->users_per_page;
-		$this->query_limit = 'LIMIT ' . $this->first_user . ',' . $this->users_per_page;
-		if ( $this->search_term ) {
-			$searches = array();
-			$search_sql = 'AND (';
-			foreach ( array('user_login', 'user_nicename', 'user_email', 'user_url', 'display_name') as $col )
-				$searches[] = $col . " LIKE '%$this->search_term%'";
-			$search_sql .= implode(' OR ', $searches);
-			$search_sql .= ')';
-		}
-		$this->query_from_where = "FROM $wpdb->users WHERE 1=1 $search_sql";
-
-	}
-
-	function query() {
-		global $wpdb;
-		$this->results = $wpdb->get_col('SELECT ID ' . $this->query_from_where . $this->query_limit);
-
-		if ( $this->results )
-			$this->total_users_for_query = $wpdb->get_var('SELECT COUNT(ID) ' . $this->query_from_where); // no limit
-		else
-			$this->search_errors = new WP_Error('no_matching_users_found', __('No matching users were found!'));
-	}
-
-	function prepare_vars_for_template_usage() {
-		$this->search_term = stripslashes($this->search_term); // done with DB, from now on we want slashes gone
-	}
-
-	function do_paging() {
-		if ( $this->total_users_for_query > $this->users_per_page ) { // have to page the results
-			$this->paging_text = paginate_links( array(
-				'total' => ceil($this->total_users_for_query / $this->users_per_page),
-				'current' => $this->page,
-				'prev_text' => __('&laquo; Previous Page'),
-				'next_text' => __('Next Page &raquo;'),
-				'base' => 'users.php?%_%',
-				'format' => 'userspage=%#%',
-				'add_args' => array( 'usersearch' => urlencode($this->search_term) )
-			) );
-		}
-	}
-
-	function get_results() {
-		return (array) $this->results;
-	}
-
-	function page_links() {
-		echo $this->paging_text;
-	}
-
-	function results_are_paged() {
-		if ( $this->paging_text )
-			return true;
-		return false;
-	}
-
-	function is_search() {
-		if ( $this->search_term )
-			return true;
-		return false;
-	}
-}
-
-
 switch ($action) {
 
 case 'promote':
 	check_admin_referer('bulk-users');
 
-	if (empty($_POST['users'])) {
+	if (empty($_REQUEST['users'])) {
 		wp_redirect($redirect);
 		exit();
 	}
@@ -129,19 +40,19 @@
 	if ( !current_user_can('edit_users') )
 		wp_die(__('You can&#8217;t edit users.'));
 
-	$userids = $_POST['users'];
+	$userids = $_REQUEST['users'];
 	$update = 'promote';
 	foreach($userids as $id) {
 		if ( ! current_user_can('edit_user', $id) )
 			wp_die(__('You can&#8217;t edit that user.'));
 		// The new role of the current user must also have edit_users caps
-		if($id == $current_user->ID && !$wp_roles->role_objects[$_POST['new_role']]->has_cap('edit_users')) {
+		if($id == $current_user->ID && !$wp_roles->role_objects[$_REQUEST['new_role']]->has_cap('edit_users')) {
 			$update = 'err_admin_role';
 			continue;
 		}
 
 		$user = new WP_User($id);
-		$user->set_role($_POST['new_role']);
+		$user->set_role($_REQUEST['new_role']);
 	}
 
 	wp_redirect(add_query_arg('update', $update, $redirect));
@@ -153,7 +64,7 @@
 
 	check_admin_referer('delete-users');
 
-	if ( empty($_POST['users']) ) {
+	if ( empty($_REQUEST['users']) ) {
 		wp_redirect($redirect);
 		exit();
 	}
@@ -161,7 +72,7 @@
 	if ( !current_user_can('delete_users') )
 		wp_die(__('You can&#8217;t delete users.'));
 
-	$userids = $_POST['users'];
+	$userids = $_REQUEST['users'];
 	$update = 'del';
 	$delete_count = 0;
 
@@ -173,12 +84,12 @@
 			$update = 'err_admin_del';
 			continue;
 		}
-		switch($_POST['delete_option']) {
+		switch($_REQUEST['delete_option']) {
 		case 'delete':
 			wp_delete_user($id);
 			break;
 		case 'reassign':
-			wp_delete_user($id, $_POST['reassign_user']);
+			wp_delete_user($id, $_REQUEST['reassign_user']);
 			break;
 		}
 		++$delete_count;
@@ -194,7 +105,7 @@
 
 	check_admin_referer('bulk-users');
 
-	if ( empty($_POST['users']) ) {
+	if ( empty($_REQUEST['users']) ) {
 		wp_redirect($redirect);
 		exit();
 	}
@@ -202,13 +113,14 @@
 	if ( !current_user_can('delete_users') )
 		$errors = new WP_Error('edit_users', __('You can&#8217;t delete users.'));
 
-	$userids = $_POST['users'];
+	$userids = $_REQUEST['users'];
 
 	include ('admin-header.php');
 ?>
 <form action="" method="post" name="updateusers" id="updateusers">
 <?php wp_nonce_field('delete-users') ?>
 <?php echo $referer; ?>
+
 <div class="wrap">
 <h2><?php _e('Delete Users'); ?></h2>
 <p><?php _e('You have specified these users for deletion:'); ?></p>
@@ -241,7 +153,7 @@
 		<?php echo '<label for="delete_option1">'.__('Attribute all posts and links to:')."</label> $user_dropdown"; ?></li>
 	</ul>
 	<input type="hidden" name="action" value="dodelete" />
-	<p class="submit"><input type="submit" name="submit" value="<?php _e('Confirm Deletion'); ?>" /></p>
+	<p class="submit"><input type="submit" name="submit" value="<?php _e('Confirm Deletion'); ?>" class="button-secondary" /></p>
 <?php else : ?>
 	<p><?php _e('There are no valid users selected for deletion.'); ?></p>
 <?php endif; ?>
@@ -262,27 +174,26 @@
 	if ( is_wp_error( $user_id ) )
 		$add_user_errors = $user_id;
 	else {
-		$new_user_login = apply_filters('pre_user_login', sanitize_user(stripslashes($_POST['user_login']), true));
+		$new_user_login = apply_filters('pre_user_login', sanitize_user(stripslashes($_REQUEST['user_login']), true));
 		$redirect = add_query_arg( array('usersearch' => urlencode($new_user_login), 'update' => $update), $redirect );
 		wp_redirect( $redirect . '#user-' . $user_id );
 		die();
 	}
 
 default:
+
+	if ( !empty($_GET['_wp_http_referer']) ) {
+		wp_redirect(remove_query_arg(array('_wp_http_referer', '_wpnonce'), stripslashes($_SERVER['REQUEST_URI'])));
+		exit;
+	}
+
 	wp_enqueue_script('admin-users');
+	wp_enqueue_script('admin-forms');
 
 	include('admin-header.php');
 
 	// Query the users
-	$wp_user_search = new WP_User_Search($_GET['usersearch'], $_GET['userspage']);
-
-	// Make the user objects
-	foreach ( $wp_user_search->get_results() as $userid ) {
-		$tmp_user = new WP_User($userid);
-		$roles = $tmp_user->roles;
-		$role = array_shift($roles);
-		$roleclasses[$role][$tmp_user->user_login] = $tmp_user;
-	}
+	$wp_user_search = new WP_User_Search($_GET['usersearch'], $_GET['userspage'], $_GET['role']);
 
 	if ( isset($_GET['update']) ) :
 		switch($_GET['update']) {
@@ -330,16 +241,73 @@
 <?php endif; ?>
 
 <div class="wrap">
-
+<form id="posts-filter" action="" method="get">
 	<?php if ( $wp_user_search->is_search() ) : ?>
-		<h2><?php printf(__('Users Matching "%s" by Role'), wp_specialchars($wp_user_search->search_term)); ?></h2>
+		<h2><?php printf(__('Users Matching "%s"'), wp_specialchars($wp_user_search->search_term)); ?></h2>
 	<?php else : ?>
-		<h2><?php _e('User List by Role'); ?></h2>
+		<h2><?php _e('Manage Users'); ?></h2>
 	<?php endif; ?>
 
-	<form action="" method="get" name="search" id="search">
-		<p><input type="text" name="usersearch" id="usersearch" value="<?php echo attribute_escape($wp_user_search->search_term); ?>" /> <input type="submit" value="<?php _e('Search Users &raquo;'); ?>" class="button" /></p>
-	</form>
+<ul class="subsubsub">
+<?php
+$role_links = array();
+$avail_roles = array();
+$users_of_blog = get_users_of_blog();
+//var_dump($users_of_blog);
+foreach ( (array) $users_of_blog as $b_user ) {
+	$b_roles = unserialize($b_user->meta_value);
+	foreach ( (array) $b_roles as $b_role => $val ) {
+		if ( !isset($avail_roles[$b_role]) )
+			$avail_roles[$b_role] = 0;
+		$avail_roles[$b_role]++;
+	}
+}
+unset($users_of_blog);
+
+$current_role = false;
+$class = empty($_GET['role']) ? ' class="current"' : '';
+$role_links[] = "<li><a href=\"users.php\"$class>" . __('All Users') . "</a>";
+foreach ( $wp_roles->get_names() as $role => $name ) {
+	if ( !isset($avail_roles[$role]) )
+		continue;
+
+	$class = '';
+
+	if ( $role == $_GET['role'] ) {
+		$current_role = $_GET['role'];
+		$class = ' class="current"';
+	}
+
+	$name = translate_with_context($name);
+	$name = sprintf(_c('%1$s (%2$s)|user role with count'), $name, $avail_roles[$role]);
+	$role_links[] = "<li><a href=\"users.php?role=$role\"$class>" . $name . '</a>';
+}
+echo implode(' |</li>', $role_links) . '</li>';
+unset($role_links);
+?>
+</ul>
+	<p id="post-search">
+	<input type="text" id="post-search-input" name="usersearch" value="<?php echo attribute_escape($wp_user_search->search_term); ?>" />
+	<input type="submit" value="<?php _e( 'Search Users' ); ?>" class="button" />
+	</p>
+
+<div class="tablenav">
+
+<?php if ( $wp_user_search->results_are_paged() ) : ?>
+	<div class="tablenav-pages"><?php $wp_user_search->page_links(); ?></div>
+<?php endif; ?>
+
+<div class="alignleft">
+<input type="submit" value="<?php _e('Delete'); ?>" name="deleteit" class="button-secondary delete" />
+<select name="new_role"><option value=''><?php _e('Change role to&hellip;') ?></option>"<?php wp_dropdown_roles(); ?></select>
+<input type="submit" value="<?php _e('Change'); ?>" name="changeit" class="button-secondary" />
+<?php wp_nonce_field('bulk-users'); ?>
+</div>
+
+<br class="clear" />
+</div>
+
+<br class="clear" />
 
 	<?php if ( is_wp_error( $wp_user_search->search_errors ) ) : ?>
 		<div class="error">
@@ -359,82 +327,58 @@
 		<p><a href="users.php"><?php _e('&laquo; Back to All Users'); ?></a></p>
 	<?php endif; ?>
 
-	<h3><?php 
-	if ( 0 == $wp_user_search->first_user && $wp_user_search->total_users_for_query <= 50 )
-		printf(__('%3$s shown below'), $wp_user_search->first_user + 1, min($wp_user_search->first_user + $wp_user_search->users_per_page, $wp_user_search->total_users_for_query), $wp_user_search->total_users_for_query);
-	else
-		printf(__('%1$s &#8211; %2$s of %3$s shown below'), $wp_user_search->first_user + 1, min($wp_user_search->first_user + $wp_user_search->users_per_page, $wp_user_search->total_users_for_query), $wp_user_search->total_users_for_query); ?></h3>
-
-	<?php if ( $wp_user_search->results_are_paged() ) : ?>
-		<div class="user-paging-text"><p><?php $wp_user_search->page_links(); ?></p></div>
-	<?php endif; ?>
-
-<form action="" method="post" name="updateusers" id="updateusers">
-<?php wp_nonce_field('bulk-users') ?>
 <table class="widefat">
-<?php
-foreach($roleclasses as $role => $roleclass) {
-	uksort($roleclass, "strnatcasecmp");
-?>
-<tbody>
-<tr>
-<?php if ( !empty($role) ) : ?>
-	<th colspan="7"><h3><?php echo $wp_roles->role_names[$role]; ?></h3></th>
-<?php else : ?>
-	<th colspan="7"><h3><em><?php _e('No role for this blog'); ?></em></h3></th>
-<?php endif; ?>
-</tr>
+<thead>
 <tr class="thead">
-	<th><?php _e('ID') ?></th>
+	<th scope="col" class="check-column"><input type="checkbox" onclick="checkAll(document.getElementById('posts-filter'));" /> </th>
 	<th><?php _e('Username') ?></th>
 	<th><?php _e('Name') ?></th>
 	<th><?php _e('E-mail') ?></th>
-	<th><?php _e('Website') ?></th>
-	<th colspan="2" style="text-align: center"><?php _e('Actions') ?></th>
+	<th><?php _e('Role') ?></th>
+	<th class="num"><?php _e('Posts') ?></th>
 </tr>
-</tbody>
-<tbody id="role-<?php echo $role; ?>"><?php
+</thead>
+<tbody id="users" class="list:user user-list">
+<?php
 $style = '';
-foreach ( (array) $roleclass as $user_object ) {
+foreach ( $wp_user_search->get_results() as $userid ) {
+	$user_object = new WP_User($userid);
+	$roles = $user_object->roles;
+	$role = array_shift($roles);
+
 	$style = ( ' class="alternate"' == $style ) ? '' : ' class="alternate"';
-	echo "\n\t" . user_row($user_object, $style);
+	echo "\n\t" . user_row($user_object, $style, $role);
 }
 ?>
-
 </tbody>
-<?php } ?>
 </table>
 
+<div class="tablenav">
+
 <?php if ( $wp_user_search->results_are_paged() ) : ?>
-	<div class="user-paging-text"><p><?php $wp_user_search->page_links(); ?></p></div>
+	<div class="tablenav-pages"><?php $wp_user_search->page_links(); ?></div>
 <?php endif; ?>
 
-	<h3><?php _e('Update Selected'); ?></h3>
-	<ul style="list-style:none;">
-		<li><input type="radio" name="action" id="action0" value="delete" /> <label for="action0"><?php _e('Delete checked users.'); ?></label></li>
-		<li>
-			<input type="radio" name="action" id="action1" value="promote" /> <label for="action1"><?php _e('Set the Role of checked users to:'); ?></label>
-			<select name="new_role" onchange="getElementById('action1').checked = 'true'"><?php wp_dropdown_roles(); ?></select>
-		</li>
-	</ul>
-	<p class="submit" style="width: 420px">
-		<?php echo $referer; ?>
-		<input type="submit" value="<?php _e('Bulk Update &raquo;'); ?>" />
-	</p>
+<br class="clear" />
+</div>
+
 </form>
 <?php endif; ?>
+
 </div>
 
 <?php
 	if ( is_wp_error($add_user_errors) ) {
 		foreach ( array('user_login' => 'user_login', 'first_name' => 'user_firstname', 'last_name' => 'user_lastname', 'email' => 'user_email', 'url' => 'user_uri', 'role' => 'user_role') as $formpost => $var ) {
 			$var = 'new_' . $var;
-			$$var = attribute_escape(stripslashes($_POST[$formpost]));
+			$$var = attribute_escape(stripslashes($_REQUEST[$formpost]));
 		}
 		unset($name);
 	}
 ?>
 
+<br class="clear" />
+
 <div class="wrap">
 <h2 id="add-new-user"><?php _e('Add New User') ?></h2>
 
@@ -448,40 +392,38 @@
 <?php endif; ?>
 <div id="ajax-response"></div>
 
-<div class="narrow">
-
-<?php 
-	if ( get_option('users_can_register') ) 
-		echo '<p>' . sprintf(__('Users can <a href="%1$s">register themselves</a> or you can manually create users here.'), get_option('siteurl').'/wp-register.php') . '</p>'; 
-	else 
-        echo '<p>' . sprintf(__('Users cannot currently <a href="%1$s">register themselves</a>, but you can manually create users here.'), get_option('siteurl').'/wp-admin/options-general.php#users_can_register') . '</p>'; 
+<?php
+	if ( get_option('users_can_register') )
+		echo '<p>' . sprintf(__('Users can <a href="%1$s">register themselves</a> or you can manually create users here.'), get_option('siteurl').'/wp-register.php') . '</p>';
+	else
+	        echo '<p>' . sprintf(__('Users cannot currently <a href="%1$s">register themselves</a>, but you can manually create users here.'), get_option('siteurl').'/wp-admin/options-general.php#users_can_register') . '</p>';
 ?>
-<form action="#add-new-user" method="post" name="adduser" id="adduser">
+<form action="#add-new-user" method="post" name="adduser" id="adduser" class="add:users: validate">
 <?php wp_nonce_field('add-user') ?>
-<table class="editform" width="100%" cellspacing="2" cellpadding="5">
-	<tr>
-		<th scope="row" width="33%"><?php _e('Username (required)') ?><input name="action" type="hidden" id="action" value="adduser" /></th>
-		<td width="66%"><input name="user_login" type="text" id="user_login" value="<?php echo $new_user_login; ?>" /></td>
+<table class="form-table">
+	<tr class="form-field form-required">
+		<th scope="row"><?php _e('Username (required)') ?><input name="action" type="hidden" id="action" value="adduser" /></th>
+		<td ><input name="user_login" type="text" id="user_login" value="<?php echo $new_user_login; ?>" /></td>
 	</tr>
-	<tr>
+	<tr class="form-field">
 		<th scope="row"><?php _e('First Name') ?> </th>
 		<td><input name="first_name" type="text" id="first_name" value="<?php echo $new_user_firstname; ?>" /></td>
 	</tr>
-	<tr>
+	<tr class="form-field">
 		<th scope="row"><?php _e('Last Name') ?> </th>
 		<td><input name="last_name" type="text" id="last_name" value="<?php echo $new_user_lastname; ?>" /></td>
 	</tr>
-	<tr>
+	<tr class="form-field form-required">
 		<th scope="row"><?php _e('E-mail (required)') ?></th>
 		<td><input name="email" type="text" id="email" value="<?php echo $new_user_email; ?>" /></td>
 	</tr>
-	<tr>
+	<tr class="form-field">
 		<th scope="row"><?php _e('Website') ?></th>
 		<td><input name="url" type="text" id="url" value="<?php echo $new_user_uri; ?>" /></td>
 	</tr>
 
 <?php if ( apply_filters('show_password_fields', true) ) : ?>
-	<tr>
+	<tr class="form-field form-required">
 		<th scope="row"><?php _e('Password (twice)') ?> </th>
 		<td><input name="pass1" type="password" id="pass1" />
 		<br />
@@ -489,12 +431,12 @@
 	</tr>
 <?php endif; ?>
 
-	<tr>
+	<tr class="form-field">
 		<th scope="row"><?php _e('Role'); ?></th>
 		<td><select name="role" id="role">
 			<?php
 			if ( !$new_user_role )
-				$new_user_role = get_option('default_role');
+				$new_user_role = $current_role ? $current_role : get_option('default_role');
 			wp_dropdown_roles($new_user_role);
 			?>
 			</select>
@@ -503,12 +445,11 @@
 </table>
 <p class="submit">
 	<?php echo $referer; ?>
-	<input name="adduser" type="submit" id="addusersub" value="<?php _e('Add User &raquo;') ?>" />
+	<input name="adduser" type="submit" id="addusersub" value="<?php _e('Add User') ?>" />
 </p>
 </form>
 
 </div>
-</div>
 
 <?php
 break;
diff -x .svn -aruN 2.2.2.src/wp-admin/widgets-rtl.css 2.5.src/wp-admin/widgets-rtl.css
--- 2.2.2.src/wp-admin/widgets-rtl.css	2007-04-27 15:49:52.000000000 -0500
+++ 2.5.src/wp-admin/widgets-rtl.css	1969-12-31 18:00:00.000000000 -0600
@@ -1,39 +0,0 @@
-#sbreset, #lastmodule, #palettediv .module, .dropzone, .dropzone ul { float: right; }
-
-* .module, #lastmodule { text-align: right; }
-
-* html #palettediv ul { padding: 0 10px 0 0; }
-
-#palettediv ul { padding: 0 10px 0 0; }
-
-* .handle, #lastmodule span {
-	border-right: 1px solid #f2f2f2;
-	border-left: 1px solid #e8e8e8;
-}
-
-#sbadmin p.submit {
-	padding-right: 0;
-	padding-left: 10px;
-	clear: right;
-}
-
-#palettediv .module, #lastmodule, .dropzone {
-	margin-right: auto;
-	margin-left: 10px;
-}
-
-* .popper {
-	right: auto;
-	left: 3px;
-	background-position: 5px 0;
-}
-
-.controlcloser {
-	right: auto;
-	left: 8px;
-}
-
-#shadow {
-	left: auto;
-	right: 0px;
-}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/widgets.css 2.5.src/wp-admin/widgets.css
--- 2.2.2.src/wp-admin/widgets.css	2007-05-19 12:23:50.000000000 -0500
+++ 2.5.src/wp-admin/widgets.css	1969-12-31 18:00:00.000000000 -0600
@@ -1,214 +0,0 @@
-body {
-	height: 100%;
-}
-
-#sbadmin #zones {
-	-moz-user-select: none;
-	-khtml-user-select: none;
-	user-select: none;
-}
-
-#sbreset {
-	float: left;
-	margin: 1px 0;
-}
-
-.dropzone {
-	float: left;
-	margin-right: 10px;
-	padding: 5px;
-	border: 1px solid #bbb;
-	background-color: #f0f8ff;
-}
-
-.dropzone h3 {
-	text-align: center;
-	color: #333;
-}
-
-.dropzone ul {
-	list-style-type: none;
-	width: 240px;
-	float: left;
-	margin: 0;
-	padding: 0;
-}
-
-* .module, #lastmodule {
-	width: 238px;
-	padding: 0;
-	margin: 5px 0;
-	cursor: move;
-	display: block;
-	border: 1px solid #ccc;
-	background-color: #fbfbfb;
-	text-align: left;
-	line-height: 25px;
-}
-
-* .handle, #lastmodule span {
-	display: block;
-	width: 216px;
-	padding: 0 10px;
-	border-top: 1px solid #f2f2f2;
-	border-right: 1px solid #e8e8e8;
-	border-bottom: 1px solid #e8e8e8;
-	border-left: 1px solid #f2f2f2;
-}
-
-* .popper {
-	margin: 0;
-	display: inline;
-	position: absolute;
-	top: 3px;
-	right: 3px;
-	overflow: hidden;
-	text-align: center;
-	height: 16px;
-	font-size: 18px;
-	line-height: 14px;
-	cursor: pointer;
-	padding: 0 3px 1px;
-	border-top: 4px solid #6da6d1;
-	background: url( images/fade-butt.png ) -5px 0px;
-}
-
-* html .popper {
-	padding: 1px 6px 0;
-	font-size: 16px;
-}
-
-#sbadmin p.submit {
-	padding-right: 10px;
-	clear: left;
-}
-
-.placematt {
-	cursor: default;
-	margin: 10px 0 0;
-	padding: 0;
-	width: 238px;
-	float:left;
-	background-color: #ffe;
-}
-
-* html .placematt {
-	margin-top: 5px;
-}
-
-.placematt h4 {
-	text-align: center;
-	margin-bottom: 5px;
-}
-
-.placematt span {
-	padding: 0 10px 10px;
-	text-align: justify;
-}
-
-
-#palettediv {
-	border: 1px solid #bbb;
-	background-color: #f0f8ff;
-	height:auto;
-	margin-top: 10px;
-}
-
-#palettediv h3 {
-	text-align: center;
-	color: #333;
-}
-
-#palettediv ul {
-	padding: 0 0 0 10px;
-}
-
-#palettediv .module, #lastmodule {
-	margin-right: 10px;
-	float: left;
-	width: 120px;
-}
-
-#palettediv .handle, #lastmodule span {
-	height: 40px;
-	font-size: 90%;
-	width: 110px;
-	padding: 0 5px;
-}
-
-#palettediv .popper {
-	visibility: hidden;
-}
-
-#lastmodule {
-	visibility: hidden;
-}
-
-* html #palettediv ul {
-	margin: 0;
-	padding: 0 0 0 10px;
-}
-
-* html #palettediv .module {
-	float: none;
-	display: inline;
-}
-
-#controls {
-	height: 0px;
-}
-
-.control {
-	position: absolute;
-	display: block;
-	background: #f9fcfe;
-	padding: 0;
-}
-
-.controlhandle {
-	cursor: move;
-	background-color: #6da6d1;
-	border-bottom: 2px solid #448abd;
-	color: #333;
-	display: block;
-	margin: 0 0 5px;
-	padding: 4px;
-	font-size: 120%;
-}
-
-.controlcloser {
-	cursor: pointer;
-	font-size: 120%;
-	display: block;
-	position: absolute;
-	top: 2px;
-	right: 8px;
-	padding: 0 3px;
-	font-weight: bold;
-}
-
-.controlform {
-	margin: 20px 30px;
-}
-
-.controlform p {
-	text-align: center;
-}
-
-.control .checkbox {
-	border: none;
-	background: transparent;
-}
-
-.hidden {
-	display: none;
-}
-
-#shadow {
-	background: black;
-	display: none;
-	position: absolute;
-	top: 0px;
-	left: 0px;
-	width: 100%;
-}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-admin/widgets.php 2.5.src/wp-admin/widgets.php
--- 2.2.2.src/wp-admin/widgets.php	2007-05-22 17:52:29.000000000 -0500
+++ 2.5.src/wp-admin/widgets.php	2008-03-17 18:25:05.000000000 -0500
@@ -1,392 +1,321 @@
 <?php
 
-require_once 'admin.php';
+require_once( 'admin.php' );
+require_once(ABSPATH . 'wp-admin/includes/widgets.php');
 
 if ( ! current_user_can('switch_themes') )
 	wp_die( __( 'Cheatin&#8217; uh?' ));
 
-wp_enqueue_script( 'scriptaculous-effects' );
-wp_enqueue_script( 'scriptaculous-dragdrop' );
+wp_enqueue_script( array( 'wp-lists', 'admin-widgets' ) );
 
-function wp_widgets_admin_head() {
-	global $wp_registered_sidebars, $wp_registered_widgets, $wp_registered_widget_controls;
-	
-	define( 'WP_WIDGETS_WIDTH', 1 + 262 * ( count( $wp_registered_sidebars ) ) );
-	define( 'WP_WIDGETS_HEIGHT', 35 * ( count( $wp_registered_widgets ) ) );
-?>
-	<link rel="stylesheet" href="widgets.css?version=<?php bloginfo('version'); ?>" type="text/css" />
-	<!--[if IE 7]>
-	<style type="text/css">
-	#palette {float:left;}
-	</style>
-	<![endif]-->
-	<style type="text/css">
-		.dropzone ul { height: <?php echo constant( 'WP_WIDGETS_HEIGHT' ); ?>px; }
-		#sbadmin #zones { width: <?php echo constant( 'WP_WIDGETS_WIDTH' ); ?>px; }
-	</style>
-<?php
-	if ( get_bloginfo( 'text_direction' ) == 'rtl' ) { 
-?>
-	<link rel="stylesheet" href="widgets-rtl.css?version=<?php bloginfo('version'); ?>" type="text/css" />
-<?php
-	}
-	
-	$cols = array();
-	foreach ( $wp_registered_sidebars as $index => $sidebar ) {
-		$cols[] = '\'' . $index . '\'';
-	}
-	$cols = implode( ', ', $cols );
-	
-	$widgets = array();
-	foreach ( $wp_registered_widgets as $name => $widget ) {
-		$widgets[] = '\'' . $widget['id'] . '\'';
-	}
-	$widgets = implode( ', ', $widgets );
-?>
-<script type="text/javascript">
-// <![CDATA[
-	var cols = [<?php echo $cols; ?>];
-	var widgets = [<?php echo $widgets; ?>];
-	var controldims = new Array;
-	<?php foreach ( $wp_registered_widget_controls as $name => $widget ) : ?>
-		controldims['<?php echo $widget['id']; ?>control'] = new Array;
-		controldims['<?php echo $widget['id']; ?>control']['width'] = <?php echo (int) $widget['width']; ?>;
-		controldims['<?php echo $widget['id']; ?>control']['height'] = <?php echo (int) $widget['height']; ?>;
-	<?php endforeach; ?>
-	function initWidgets() {
-	<?php foreach ( $wp_registered_widget_controls as $name => $widget ) : ?>
-		$('<?php echo $widget['id']; ?>popper').onclick = function() {popControl('<?php echo $widget['id']; ?>control');};
-		$('<?php echo $widget['id']; ?>closer').onclick = function() {unpopControl('<?php echo $widget['id']; ?>control');};
-		new Draggable('<?php echo $widget['id']; ?>control', {revert:false,handle:'controlhandle',starteffect:function(){},endeffect:function(){},change:function(o){dragChange(o);}});
-		if ( true && window.opera )
-			$('<?php echo $widget['id']; ?>control').style.border = '1px solid #bbb';
-	<?php endforeach; ?>
-		if ( true && window.opera )
-			$('shadow').style.background = 'transparent';
-		new Effect.Opacity('shadow', {to:0.0});
-		widgets.map(function(o) {o='widgetprefix-'+o; Position.absolutize(o); Position.relativize(o);} );
-		$A(Draggables.drags).map(function(o) {o.startDrag(null); o.finishDrag(null);});
-		//for ( var n in Draggables.drags ) {
-		for ( n=0; n<=Draggables.drags.length; n++ ) {
-			if ( parseInt( n ) ) {
-				if ( Draggables.drags[n].element.id == 'lastmodule' ) {
-					Draggables.drags[n].destroy();
-					break;
-				}
-			}
-		}
-		resetPaletteHeight();
-	}
-	function resetDroppableHeights() {
-		var max = 6;
-		cols.map(function(o) {var c = $(o).childNodes.length; if ( c > max ) max = c;} );
-		var height = 35 * ( max + 1);
-		cols.map(function(o) {h = (($(o).childNodes.length + 1) * 35); $(o).style.height = (h > 280 ? h : 280) + 'px';} );
-	}
-	function resetPaletteHeight() {
-		var p = $('palette'), pd = $('palettediv'), last = $('lastmodule');
-		p.appendChild(last);
-		if ( Draggables.activeDraggable && last.id == Draggables.activeDraggable.element.id )
-			last = last.previousSibling;
-		var y1 = Position.cumulativeOffset(last)[1] + last.offsetHeight;
-		var y2 = Position.cumulativeOffset(pd)[1] + pd.offsetHeight;
-		var dy = y1 - y2;
-		pd.style.height = (pd.offsetHeight + dy + 9) + "px";
-	}
-	function maxHeight(elm) {
-		htmlheight = document.body.parentNode.clientHeight;
-		bodyheight = document.body.clientHeight;
-		var height = htmlheight > bodyheight ? htmlheight : bodyheight;
-		$(elm).style.height = height + 'px';
-	}
-	function dragChange(o) {
-		el = o.element ? o.element : $(o);
-		var p = Position.page(el);
-		var right = p[0];
-		var top = p[1];
-		var left = $('shadow').offsetWidth - (el.offsetWidth + right);
-		var bottom = $('shadow').offsetHeight - (el.offsetHeight + top);
-		if ( right < 1 ) el.style.left = 0;
-		if ( top < 1 ) el.style.top = 0;
-		if ( left < 1 ) el.style.left = (left + right) + 'px';
-		if ( bottom < 1 ) el.style.top = (top + bottom) + 'px';
-	}
-	function popControl(elm) {
-		el = $(elm);
-		el.style.width = controldims[elm]['width'] + 'px';
-		el.style.height = controldims[elm]['height'] + 'px';
-		var x = ( document.body.clientWidth - controldims[elm]['width'] ) / 2;
-		var y = ( document.body.parentNode.clientHeight - controldims[elm]['height'] ) / 2;
-		el.style.position = 'absolute';
-		el.style.right = '' + x + 'px';
-		el.style.top = '' + y + 'px';
-		el.style.zIndex = 1000;
-		el.className='control';
-		$('shadow').onclick = function() {unpopControl(elm);};
-	    window.onresize = function(){maxHeight('shadow');dragChange(elm);};
-		popShadow();
-	}
-	function popShadow() {
-		maxHeight('shadow');
-		var shadow = $('shadow');
-		shadow.style.zIndex = 999;
-		shadow.style.display = 'block';
-	    new Effect.Opacity('shadow', {duration:0.5, from:0.0, to:0.2});
-	}
-	function unpopShadow() {
-	    new Effect.Opacity('shadow', {to:0.0});
-		$('shadow').style.display = 'none';
-	}
-	function unpopControl(el) {
-		$(el).className='hidden';
-		unpopShadow();
-	}
-	function serializeAll() {
-	<?php foreach ( $wp_registered_sidebars as $index => $sidebar ) : ?>
-		$('<?php echo $index; ?>order').value = Sortable.serialize('<?php echo $index; ?>');
-	<?php endforeach; ?>
-	}
-	function updateAll() {
-		resetDroppableHeights();
-		resetPaletteHeight();
-		cols.map(function(o){
-			var pm = $(o+'placematt');
-			if ( $(o).childNodes.length == 0 ) {
-				pm.style.display = 'block';
-				//Position.absolutize(o+'placematt');
-			} else {
-				pm.style.display = 'none';
-			}
-		});
-	}
-	function noSelection(event) {
-		if ( document.selection ) {
-			var range = document.selection.createRange();
-			range.collapse(false);
-			range.select();
-			return false;
-		}
-	}
-	addLoadEvent(updateAll);
-	addLoadEvent(initWidgets);
-	Event.observe(window, 'resize', resetPaletteHeight);
-// ]]>
-</script>
-<?php
-}
-add_action( 'admin_head', 'wp_widgets_admin_head' );
 do_action( 'sidebar_admin_setup' );
 
-function wp_widget_draggable( $name ) {
-	global $wp_registered_widgets, $wp_registered_widget_controls;
-	
-	if ( !isset( $wp_registered_widgets[$name] ) ) {
-		return;
-	}
-	
-	$sanitized_name = sanitize_title( $wp_registered_widgets[$name]['id'] );
-	$link_title = __( 'Configure' );
-	$popper = ( isset( $wp_registered_widget_controls[$name] ) ) 
-		? ' <div class="popper" id="' . $sanitized_name . 'popper" title="' . $link_title . '">&#8801;</div>'
-		: '';
-	
-	$output = '<li class="module" id="widgetprefix-%1$s"><span class="handle">%2$s</span></li>';
-	
-	printf( $output, $sanitized_name, $wp_registered_widgets[$name]['name'] . $popper );
-}
-
 $title = __( 'Widgets' );
 $parent_file = 'themes.php';
 
-require_once 'admin-header.php';
-
-if ( count( $wp_registered_sidebars ) < 1 ) {
+// $sidebar = What sidebar are we editing?
+if ( isset($_GET['sidebar']) && isset($wp_registered_sidebars[$_GET['sidebar']]) ) {
+	$sidebar = attribute_escape( $_GET['sidebar'] );
+} elseif ( is_array($wp_registered_sidebars) && !empty($wp_registered_sidebars) ) {
+	// By default we look at the first defined sidebar
+	$sidebar = array_shift( array_keys($wp_registered_sidebars) );
+} else {
+	// If no sidebars, die.
+	require_once( 'admin-header.php' );
 ?>
+
+	<div class="error">
+		<p><?php _e( 'No Sidebars Defined' ); ?></p>
+	</div>
+
 	<div class="wrap">
-		<h2><?php _e( 'No Sidebars Defined' ); ?></h2>
-		
 		<p><?php _e( 'You are seeing this message because the theme you are currently using isn&#8217;t widget-aware, meaning that it has no sidebars that you are able to change. For information on making your theme widget-aware, please <a href="http://automattic.com/code/widgets/themes/">follow these instructions</a>.' ); /* TODO: article on codex */; ?></p>
 	</div>
+
 <?php
-	
-	require_once 'admin-footer.php';
+	require_once( 'admin-footer.php' );
 	exit;
 }
 
+// These are the widgets grouped by sidebar
 $sidebars_widgets = wp_get_sidebars_widgets();
-
-if ( empty( $sidebars_widgets ) ) {
+if ( empty( $sidebars_widgets ) )
 	$sidebars_widgets = wp_get_widget_defaults();
-}
 
-if ( isset( $_POST['action'] ) ) {
-	check_admin_referer( 'widgets-save-widget-order' );
-	
-	switch ( $_POST['action'] ) {
-		case 'default' :
-			$sidebars_widgets = wp_get_widget_defaults();
-			wp_set_sidebars_widgets( $sidebars_widgets );
-		break;
-		
-		case 'save_widget_order' :
-			$sidebars_widgets = array();
-			
-			foreach ( $wp_registered_sidebars as $index => $sidebar ) {
-				$postindex = $index . 'order';
-				
-				parse_str( $_POST[$postindex], $order );
-				
-				$new_order = $order[$index];
-				
-				if ( is_array( $new_order ) ) {
-					foreach ( $new_order as $sanitized_name ) {
-						foreach ( $wp_registered_widgets as $name => $widget ) {
-							if ( $sanitized_name == $widget['id'] ) {
-								$sidebars_widgets[$index][] = $name;
-							}
-						}
-					}
-				}
+// for the sake of PHP warnings
+if ( empty( $sidebars_widgets[$sidebar] ) )
+	$sidebars_widgets[$sidebar] = array();
+
+$http_post = 'post' == strtolower($_SERVER['REQUEST_METHOD']);
+
+// We're updating a sidebar
+if ( $http_post && isset($sidebars_widgets[$_POST['sidebar']]) ) {
+	check_admin_referer( 'edit-sidebar_' . $_POST['sidebar'] );
+
+	/* Hack #1
+	 * The widget_control is overloaded.  It updates the widget's options AND echoes out the widget's HTML form.
+	 * Since we want to update before sending out any headers, we have to catch it with an output buffer,
+	 */
+	ob_start();
+		/* There can be multiple widgets of the same type, but the widget_control for that
+		 * widget type needs only be called once if it's a multi-widget.
+		 */
+		$already_done = array();
+
+		foreach ( $wp_registered_widget_controls as $name => $control ) {
+			if ( in_array( $control['callback'], $already_done ) )
+				continue;
+
+			if ( is_callable( $control['callback'] ) ) {
+				call_user_func_array( $control['callback'], $control['params'] );
+				$control_output = ob_get_contents();
+				if ( false !== strpos( $control_output, '%i%' ) ) // if it's a multi-widget, only call control function once.
+					$already_done[] = $control['callback'];
 			}
-			
-			wp_set_sidebars_widgets( $sidebars_widgets );
-		break;
-	}
+
+			ob_clean();
+		}
+	ob_end_clean();
+
+	// Prophylactic.  Take out empty ids.
+	foreach ( (array) $_POST['widget-id'] as $key => $val )
+		if ( !$val )
+			unset($_POST['widget-id'][$key]);
+
+	// Reset the key numbering and store
+	$new_sidebar = isset( $_POST['widget-id'] ) && is_array( $_POST['widget-id'] ) ? array_values( $_POST['widget-id'] ) : array();
+	$sidebars_widgets[$_POST['sidebar']] = $new_sidebar;
+	wp_set_sidebars_widgets( $sidebars_widgets );
+
+	wp_redirect( add_query_arg( 'message', 'updated' ) );
+	exit;
 }
 
-ksort( $wp_registered_widgets );
 
-$inactive_widgets = array();
 
-foreach ( $wp_registered_widgets as $name => $widget ) {
-	$is_active = false;
-	
-	foreach ( $wp_registered_sidebars as $index => $sidebar ) {
-		if ( is_array( $sidebars_widgets[$index] ) && in_array( $name, $sidebars_widgets[$index] ) ) {
-			$is_active = true;
-			break;
+
+// What widget (if any) are we editing
+$edit_widget = -1;
+
+$query_args = array('add', 'remove', 'key', 'edit', '_wpnonce', 'message', 'base' );
+
+if ( isset($_GET['add']) && $_GET['add'] ) {
+	// Add to the end of the sidebar
+	$control_callback;
+	if ( isset($wp_registered_widgets[$_GET['add']]) ) {
+		check_admin_referer( "add-widget_$_GET[add]" );
+		$sidebars_widgets[$sidebar][] = $_GET['add'];
+		wp_set_sidebars_widgets( $sidebars_widgets );
+	} elseif ( isset($_GET['base']) && isset($_GET['key']) ) { // It's a multi-widget
+		check_admin_referer( "add-widget_$_GET[add]" );
+		// Copy minimal info from an existing instance of this widget to a new instance
+		foreach ( $wp_registered_widget_controls as $control ) {
+			if ( $_GET['base'] === $control['id_base'] ) {
+				$control_callback = $control['callback'];
+				$num = (int) $_GET['key'];
+				$control['params'][0]['number'] = $num;
+				$control['id'] = $control['id_base'] . '-' . $num;
+				$wp_registered_widget_controls[$control['id']] = $control;
+				$sidebars_widgets[$sidebar][] = $control['id'];
+				break;
+			}
 		}
 	}
-	
-	if ( !$is_active ) {
-		$inactive_widgets[] = $name;
+
+	// it's a multi-widget.  The only way to add multi-widgets without JS is to actually submit POST content...
+	// so here we go
+	if ( is_callable( $control_callback ) ) {
+		require_once( 'admin-header.php' );
+	?>
+		<div class="wrap">
+		<h2><?php _e( 'Add Widget' ); ?></h2>
+		<br />
+		<form action="<?php echo clean_url( remove_query_arg( $query_args ) ); ?>" method="post">
+		
+			<ul class="widget-control-list">
+				<li class="widget-list-control-item">
+					<h4 class="widget-title"><?php echo $control['name']; ?></h4>
+					<div class="widget-control" style="display: block;">
+	<?php
+						call_user_func_array( $control_callback, $control['params'] );
+	?>
+						<div class="widget-control-actions">
+							<input type="submit" class="button" value="<?php _e( 'Add Widget' ); ?>" />
+							<input type="hidden" id='sidebar' name='sidebar' value="<?php echo $sidebar; ?>" />
+	<?php	wp_nonce_field ( 'edit-sidebar_' . $sidebar );
+		foreach ( $sidebars_widgets[$sidebar] as $sidebar_widget_id ) : ?>
+							<input type="hidden" name='widget-id[]' value="<?php echo $sidebar_widget_id; ?>" />
+	<?php 	endforeach; ?>
+						</div>
+					</div>
+				</li>
+			</ul>
+		</form>
+		</div>
+	<?php
+
+		require_once( 'admin-footer.php' );
+		exit;
+	}
+	wp_redirect( remove_query_arg( $query_args ) );
+	exit;
+} elseif ( isset($_GET['remove']) && $_GET['remove'] && isset($_GET['key']) && is_numeric($_GET['key']) ) {
+	// Remove from sidebar the widget of type $_GET['remove'] and in position $_GET['key']
+	$key = (int) $_GET['key'];
+	if ( -1 < $key && ( $keys = array_keys($sidebars_widgets[$sidebar], $_GET['remove']) ) && in_array($key, $keys) ) {
+		check_admin_referer( "remove-widget_$_GET[remove]" );
+		unset($sidebars_widgets[$sidebar][$key]);
+		$sidebars_widgets[$sidebar] = array_values($sidebars_widgets[$sidebar]);
+		wp_set_sidebars_widgets( $sidebars_widgets );
 	}
+	wp_redirect( remove_query_arg( $query_args ) );
+	exit;
+} elseif ( isset($_GET['edit']) && $_GET['edit'] && isset($_GET['key']) && is_numeric($_GET['key']) ) {
+	// Edit widget of type $_GET['edit'] and position $_GET['key']
+	$key = (int) $_GET['key'];
+	if ( -1 < $key && ( $keys = array_keys($sidebars_widgets[$sidebar], $_GET['edit']) ) && in_array($key, $keys) )
+		$edit_widget = $key;
 }
 
-$containers = array( 'palette' );
+// Total number of registered sidebars
+$sidebar_widget_count = count($sidebars_widgets[$sidebar]);
 
-foreach ( $wp_registered_sidebars as $index => $sidebar ) {
-	$containers[] = $index;
-}
+// This is sort of lame since "widget" won't be converted to "widgets" in the JS
+if ( 1 < $sidebars_count = count($wp_registered_sidebars) )
+	$sidebar_info_text = __ngettext( 'You are using %1$s widget in the "%2$s" sidebar.', 'You are using %1$s widgets in the "%2$s" sidebar.', $sidebar_widget_count );
+else
+	$sidebar_info_text = __ngettext( 'You are using %1$s widget in the sidebar.', 'You are using %1$s widgets in the sidebar.', $sidebar_widget_count );
 
-$c_string = '';
 
-foreach ( $containers as $container ) {
-	$c_string .= '"' . $container . '",';
-}
+$sidebar_info_text = sprintf( wp_specialchars( $sidebar_info_text ), "<span id='widget-count'>$sidebar_widget_count</span>", $wp_registered_sidebars[$sidebar]['name'] );
 
-$c_string = substr( $c_string, 0, -1 );
+$page = isset($_GET['apage']) ? abs( (int) $_GET['apage'] ) : 1;
 
-if ( isset( $_POST['action'] ) ) {
-?>
-	<div class="fade updated" id="message">
-		<p><?php printf( __( 'Sidebar updated. <a href="%s">View site &raquo;</a>' ), get_bloginfo( 'url' ) . '/' ); ?></p>
+/* TODO: Paginate widgets list
+$page_links = paginate_links( array(
+	'base'    => add_query_arg( 'apage', '%#%' ),
+	'format'  => '',
+	'total'   => ceil(($total = 105 )/ 10),
+	'current' => $page
+));
+*/
+$page_links = '&nbsp;';
+
+// Unsanitized!
+$widget_search = isset($_GET['s']) ? $_GET['s'] : false;
+
+// Not entirely sure what all should be here
+$show_values = array(
+	''       => $widget_search ? __( 'Show any widgets' ) : __( 'Show all widgets' ),
+	'unused' => __( 'Show unused widgets' ),
+	'used'   => __( 'Show used widgets' )
+);
+
+$show = isset($_GET['show']) && isset($show_values[$_GET['show']]) ? attribute_escape( $_GET['show'] ) : false;
+
+
+$messages = array(
+	'updated' => __('Changes saved.')
+);
+
+require_once( 'admin-header.php' );
+
+if ( isset($_GET['message']) && isset($messages[$_GET['message']]) ) : ?>
+
+<div id="message" class="updated fade"><p><?php echo $messages[$_GET['message']]; ?></p></div>
+
+<?php endif; ?>
+
+<div class="wrap">
+
+	<form id="widgets-filter" action="" method="get">
+
+	<h2><?php _e( 'Widgets' ); ?></h2>
+	<p id="widget-search">
+		<input type="text" id="widget-search-input" name="s" value="<?php echo attribute_escape( $widget_search ); ?>" />
+		<input type="submit" class="button" value="<?php _e( 'Search Widgets' ); ?>" />
+	</p>
+
+	<div class="widget-liquid-left-holder">
+	<div id="available-widgets-filter" class="widget-liquid-left">
+		<h3><?php _e('Available Widgets'); ?></h3>
+		<div class="nav">
+			<select name="show">
+<?php foreach ( $show_values as $show_value => $show_text ) : $show_value = attribute_escape( $show_value ); ?>
+				<option value='<?php echo $show_value; ?>'<?php selected( $show_value, $show ); ?>><?php echo wp_specialchars( $show_text ); ?></option>
+<?php endforeach; ?>
+			</select>
+			<input type="submit" value="<?php _e('Show' ); ?>" class="button-secondary" />
+			<p class="pagenav">
+				<?php echo $page_links; ?>
+			</p>
+		</div>
 	</div>
+	</div>
+
+	<div id="available-sidebars" class="widget-liquid-right">
+		<h3><?php _e('Current Widgets'); ?></h3>
+
+		<div class="nav">
+			<select id="sidebar-selector" name="sidebar">
+<?php foreach ( $wp_registered_sidebars as $sidebar_id => $registered_sidebar ) : $sidebar_id = attribute_escape( $sidebar_id ); ?>
+				<option value='<?php echo $sidebar_id; ?>'<?php selected( $sidebar_id, $sidebar ); ?>><?php echo wp_specialchars( $registered_sidebar['name'] ); ?></option>
+<?php endforeach; ?>
+			</select>
+			<input type="submit" value="<?php _e('Show' ); ?>" class="button-secondary" />
+		</div>
+
+	</div>
+
+	</form>
+
+	<div id="widget-content" class="widget-liquid-left-holder">
+
+		<div id="available-widgets" class="widget-liquid-left">
+
+			<?php wp_list_widgets( $show, $widget_search ); // This lists all the widgets for the query ( $show, $search ) ?>
+
+			<div class="nav">
+				<p class="pagenav">
+					<?php echo $page_links; ?>
+				</p>
+			</div>
+		</div>
+	</div>
+
+	<form id="widget-controls" action="" method="post">
+
+	<div id="current-widgets-head" class="widget-liquid-right">
+
+		<div id="sidebar-info">
+			<p><?php echo $sidebar_info_text; ?></p>
+			<p><?php _e( 'Add more from the Available Widgets section.' ); ?></p>
+		</div>
+
+	</div>
+
+	<div id="current-widgets" class="widget-liquid-right">
+		<div id="current-sidebar">
+
+			<?php wp_list_widget_controls( $sidebar ); // Show the control forms for each of the widgets in this sidebar ?>
+
+		</div>
+
+		<p class="submit">
+			<input type="hidden" id='sidebar' name='sidebar' value="<?php echo $sidebar; ?>" />
+			<input type="hidden" id="generated-time" name="generated-time" value="<?php echo time() - 1199145600; // Jan 1, 2008 ?>" />
+			<input type="submit" name="save-widgets" value="<?php _e( 'Save Changes' ); ?>" />
 <?php
-}
+			wp_nonce_field( 'edit-sidebar_' . $sidebar );
 ?>
-	<div class="wrap">
-		<h2><?php _e( 'Sidebar Arrangement' ); ?></h2>
-		
-		<p><?php _e( 'You can drag and drop widgets onto your sidebar below.' ); ?></p>
-		
-		<form id="sbadmin" method="post" onsubmit="serializeAll();">
-			<p class="submit">
-				<input type="submit" value="<?php _e( 'Save Changes &raquo;' ); ?>" />
-			</p>
-			<div id="zones">
-			<?php
-				foreach ( $wp_registered_sidebars as $index => $sidebar ) {
-			?>
-				<input type="hidden" id="<?php echo $index; ?>order" name="<?php echo $index; ?>order" value="" />
-				
-				<div class="dropzone">
-					<h3><?php echo $sidebar['name']; ?></h3>
-					
-					<div id="<?php echo $index; ?>placematt" class="module placemat">
-						<span class="handle">
-							<h4><?php _e( 'Default Sidebar' ); ?></h4>
-							<?php _e( 'Your theme will display its usual sidebar when this box is empty. Dragging widgets into this box will replace the usual sidebar with your customized sidebar.' ); ?>
-						</span>
-					</div>
-					
-					<ul id="<?php echo $index; ?>">
-					<?php
-						if ( is_array( $sidebars_widgets[$index] ) ) {
-							foreach ( $sidebars_widgets[$index] as $name ) {
-								wp_widget_draggable( $name );
-							}
-						}
-					?>
-					</ul>
-				</div>
-			<?php
-				}
-			?>
-			
-			<br class="clear" />
-			
-			</div>
-		
-			<div id="palettediv">
-				<h3><?php _e( 'Available Widgets' ); ?></h3>
-			
-				<ul id="palette">
-				<?php
-					foreach ( $inactive_widgets as $name ) {
-						wp_widget_draggable( $name );
-					}
-				?>
-					<li id="lastmodule"><span></span></li>
-				</ul>
-			</div>
-		
-			<script type="text/javascript">
-			// <![CDATA[
-			<?php foreach ( $containers as $container ) { ?>
-				Sortable.create("<?php echo $container; ?>", {
-					dropOnEmpty: true, containment: [<?php echo $c_string; ?>], 
-					handle: 'handle', constraint: false, onUpdate: updateAll, 
-					format: /^widgetprefix-(.*)$/
-				});
-			<?php } ?>
-			// ]]>
-			</script>
-		
-			<p class="submit">
-			<?php wp_nonce_field( 'widgets-save-widget-order' ); ?>
-				<input type="hidden" name="action" id="action" value="save_widget_order" />
-				<input type="submit" value="<?php _e( 'Save Changes &raquo;' ); ?>" />
-			</p>
-		
-			<div id="controls">
-			<?php foreach ( $wp_registered_widget_controls as $name => $widget ) { ?>
-				<div class="hidden" id="<?php echo $widget['id']; ?>control">
-					<span class="controlhandle"><?php echo $widget['name']; ?></span>
-					<span id="<?php echo $widget['id']; ?>closer" class="controlcloser">&#215;</span>
-					<div class="controlform">
-					<?php call_user_func_array( $widget['callback'], $widget['params'] ); ?>
-					</div>
-				</div>
-			<?php } ?>
-			</div>
-		</form>
-		
-		<br class="clear" />
+		</p>
 	</div>
-	
-	<div id="shadow"> </div>
-	
-	<?php do_action( 'sidebar_admin_page' ); ?>
 
-<?php require_once 'admin-footer.php'; ?>
+	</form>
+
+</div>
+
+<?php do_action( 'sidebar_admin_page' ); ?>
+
+<?php require_once( 'admin-footer.php' ); ?>
+
diff -x .svn -aruN 2.2.2.src/wp-admin/wp-admin.css 2.5.src/wp-admin/wp-admin.css
--- 2.2.2.src/wp-admin/wp-admin.css	2007-04-19 17:26:52.000000000 -0500
+++ 2.5.src/wp-admin/wp-admin.css	2008-03-29 02:21:12.000000000 -0500
@@ -1,211 +1,22 @@
-* html #poststuff {
-	height: 100%; /* kill peekaboo bug in IE */
-}
-
-/* This is the Holly Hack \*/
-* html .wrap { height: 1% }
-/* For Win IE's eyes only */
-
-body {
-	border: none;
-}
-a {
-	border-bottom: 1px solid #69c;
-	color: #00019b;
-	text-decoration: none;
-}
-
-a.delete:hover {
-	background: #c00;
-	color: #fff;
-}
-
-#devnews h4 {
-	font-family: Georgia, "Times New Roman", Times, serif;
-	font-size: 18px;
-	font-weight: normal;
-}
-
-#planetnews ul {
-	list-style: none;
-	margin: 0;
-	padding: 0;
-}
-
-#planetnews li {
-	width: 17%;
-	margin: 1%;
-	float: left;
-}
-
-#planetnews li a {
-	display: block;
-	padding: .5em;
-	background: #ddd;
-	height: 6em;
-	overflow: hidden;
-}
-
-#planetnews cite {
-	font-size: 11px;
-}
-
-#planetnews li .post {
-	font-family: Georgia, "Times New Roman", Times, serif;
-	font-size: 18px;
-	display: block;
-	height: 60px;
-	overflow: hidden;
-}
-
-#planetnews .hidden {
-	display: none;
-}
-
-.readmore {
-	clear: both;
-	text-align: right;
-	margin-right: 5em;
-}
-
-.widefat {
-	width: 100%;
-}
-
-.widefat td, .widefat th {
-	padding: 5px 6px;
-}
-
-.widefat th {
-	text-align: left;
+#plugins .name {
+	font-weight: bold;
 }
 
-.plugins p {
-	margin: 4px;
+#plugins p {
+	margin: 0 4px;
 	padding: 0;
 }
 
-.plugins .name {
-	font-size: 16px;
+#plugins .togl {
+	width: 150px;
+	border-right-width: 1px;
+	border-right-style: solid;
 }
 
 .import-system {
 	font-size: 16px;
 }
 
-thead, .thead {
-	background: #dfdfdf
-}
-
-#import-upload-form {
-	margin: auto;
-	background: #eee;
-	padding: 1em;
-}
-
-a.edit, a.delete, a.edit:hover, a.delete:hover {
-	border-bottom: none;
-	display: block;
-	padding: 5px 0;
-	text-align: center;
-}
-
-a.edit:hover {
-	background: #ccc;
-	color: #036;
-}
-
-a:visited {
-	color: #006;
-}
-
-a:hover {
-/*	border-bottom: 1px solid #3a75ae;*/
-	color: #069;
-}
-
-body	{
-	background: #f9fcfe;
-	color: #000;
-	margin: 0;
-	padding: 0;
-}
-
-body, td {
-	font: 13px "Lucida Grande", "Lucida Sans Unicode", Tahoma, Verdana;
-}
-
-fieldset {
-	border: none;
-	padding: 3px;
-}
-
-fieldset label.selectit {
-	display: block;
-	font-size: 11px;
-	padding: 0 2px;
-}
-
-fieldset label.selectit:hover {
-	background: #e9e9e9;
-}
-
-fieldset legend {
-	padding: .1em .3em;
-}
-
-fieldset.options {
-	padding: 1em;
-}
-
-fieldset.options legend {
-	font-size: 1.5em;
-	font-weight: bold;
-	font-family: Georgia, "Times New Roman", Times, serif;
-}
-
-form, label input {
-	margin: 0;
-	padding: 0;
-}
-
-h2 {
-	border-bottom: .5em solid #e5f3ff;
-	color: #333;
-	font: normal 32px/5px serif;
-	margin: 5px 10px;
-}
-
-img, #footer a {
-	border: 0;
-}
-
-input:focus, textarea:focus, label:focus {
-	background: #fff;
-	border: 1px solid #686868;
-}
-
-label {
-	cursor: pointer;
-}
-
-li, dd {
-	margin-bottom: 6px;
-}
-
-p, li, dl, dd, dt {
-	line-height: 140%;
-}
-
-textarea, input, select {
-	background: #f4f4f4;
-	border: 1px solid #b2b2b2;
-	color: #000;
-	font: 13px Verdana, Arial, Helvetica, sans-serif;
-	margin: 1px;
-	padding: 3px;
-}
-
 #uploading {
 	border-style: none;
 	padding: 0;
@@ -222,6 +33,12 @@
 	width: 250px;
 }
 
+.form-invalid input {
+	border-width: 1px; !important
+	border-style: solid; !important
+}
+
+
 form#upload #post_content {
 	height: 50px;
 }
@@ -231,18 +48,6 @@
 	text-align: center;
 }
 
-.alignleft {
-	float: left
-}
-
-.alignright {
-	float: right;
-}
-
-.alternate {
-	background: #f1f1f1;
-}
-
 .anchors {
 	margin: 10px 20px 10px 20px;
 }
@@ -261,14 +66,10 @@
 	height: 200px;
 	display: block;
 	margin: auto;
-	background: #f1f1f1;
-	border: 1px solid #ccc;
 	margin-bottom: 10px;
 	overflow: hidden;
-}
-
-.available-theme a.screenshot:hover {
-/*	border: 1px solid #666;*/
+	border-width: 1px;
+	border-style: solid;
 }
 
 .available-theme img {
@@ -276,7 +77,6 @@
 }
 
 .checkbox {
-	background: #fff;
 	border: none;
 	margin: 0;
 	padding: 0;
@@ -287,9 +87,10 @@
 }
 
 .commentlist li {
-	border-bottom: 1px solid #ccc;
 	padding: 1em 1em .2em;
 	margin: 0;
+	border-bottom-width: 1px;
+	border-bottom-style: solid;
 }
 
 .commentlist li li {
@@ -302,95 +103,81 @@
 	margin: 0 0 .8em;
 }
 
-.clear {
-	clear: both;
-	height: 2px;
-}
-
-.hidden {
-	display: none;
-}
-
-.navigation {
-	display: block;
-	text-align: center;
-	margin-top: 10px;
-	margin-bottom: 30px;
-}
-
 .post-categories {
 	display: inline;
 	margin: 0;
 	padding: 0;
 }
 
-.post-categories li, #ed_toolbar {
+.post-categories li {
 	display: inline;
 }
 
 .quicktags, .search {
-	background: #ccc;
-	color: #000;
 	font: 12px Georgia, "Times New Roman", Times, serif;
 }
 
-.submit input, .submit input:focus, .button, .button:focus {
-	background: url( images/fade-butt.png );
-	border: 3px double #999;
-	border-left-color: #ccc;
-	border-top-color: #ccc;
-	color: #333;
-	padding: 0.25em;
-}
-
-.submit input:active, .button:active {
-	background: #f4f4f4;
-	border: 3px double #ccc;
-	border-left-color: #999;
-	border-top-color: #999;
-}
-
-.button, .button:focus {
-	padding: 0.15em;
-}
-
-* html .button {
-	padding: 0;
-}
-
-.submit, .editform th, #postcustomsubmit {
-	text-align: right;
+.submit {
+	border-top: 1px solid #ccc;
+	padding: 1.5em 0 0 0;
+	margin: 10px 0 0 0;
+	-moz-border-radius-bottomleft: 3px;
+	-khtml-border-bottom-left-radius: 3px;
+	-webkit-border-bottom-left-radius: 3px;
+	border-bottom-left-radius: 3px;
+	-moz-border-radius-bottomright: 3px;
+	-khtml-border-bottom-right-radius: 3px;
+	-webkit-border-bottom-right-radius: 3px;
+	border-bottom-right-radius: 3px;
 }
 
-.optiontable {
-	width: 100%;
+.side-info {
+	margin: 0;
+	padding: 4px;
+	font-size: 11px;
 }
 
-.optiontable td, .optiontable th {
-	padding: .5em;
+.side-info h5 {
+	padding-bottom: 7px;
+	font-size: 14px;
+	margin: 12px 2px 5px;
+	border-bottom-width: 1px;
+	border-bottom-style: solid;
 }
 
-.optiontable th {
-	width: 33%;
-	text-align: right;
-	font-size: 1.3em;
-	font-weight: normal;
+.side-info ul {
+	margin: 0;
+	padding-left: 18px;
+	list-style: square;
 }
 
-.unapproved {
-	color: #888;
+.submit input, .button, .button-secondary, .button-highlighted {
+	font-family: "Lucida Grande", "Lucida Sans Unicode", Tahoma, Verdana, sans-serif;
+	padding: 3px 5px;
+	font-size: 12px;
+	line-height: 1.5em;
+	border-width: 1px;
+	border-style: solid;
+	-moz-border-radius: 3px;
+	-khtml-border-radius: 3px;
+	-webkit-border-radius: 3px;
+	border-radius: 3px;
+	cursor: pointer;
+	text-decoration: none;	
 }
 
-.unapproved a:link {
-	color: #b9bcff;
+.button-highlighted {
+	font-weight: bold;
 }
 
-.unapproved a:visited {
-	color: #696dff;
-}
+#wpcontent select {
+	font: 12px/20px "Lucida Grande", "Lucida Sans Unicode", Tahoma, Verdana, sans-serif;
+	padding: 2px;
 
-.unapproved a:hover {
-	color: #009ef0;
+	border-width: 1px;
+	border-style: solid;
+	height: 2em;
+	vertical-align:top;
 }
 
 .approve {
@@ -401,49 +188,25 @@
 	display: inline;
 }
 
-.unapproved .unapprove {
-	display: none;
+.updated a {
+	border-bottom-width: 1px;
+	border-bottom-style: solid;
 }
 
-.updated, .confirm {
-	background: #CFEBF7 url(images/notice.gif) no-repeat 1em;
-	border: 1px solid #2580B2;
-	margin: 1em 5% 10px;
-	padding: 0 1em 0 3em;
-}
-
-.error {
-	background: #FFEFF7;
-	border: 1px solid #c69;
-	margin: 1em 5% 10px;
-	padding: 0 1em 0 1em;
-}
-
-.wrap {
-	background: #fff;
-	border: 1px solid #ccc;
-	clear: both;
-	margin: 15px 5%;
-	padding: 1em;
+
+.unapproved .unapprove {
+	display: none;
 }
 
 .narrow {
-	width: 450px;
-	margin: auto;
+	width: 70%;
+	margin-bottom: 40px;
 }
 
 .narrow p {
 	line-height: 150%;
 }
 
-.wrap h2 {
-	margin: .4em 0 .5em;
-	clear: both;
-}
-
-* html .wrap h2 {
-	margin-top: 1em;
-}
 
 table .vers {
 	text-align: center;
@@ -453,96 +216,15 @@
 	width: 250px;
 }
 
-input.disabled, textarea.disabled {
-	background: #ccc;
-}
-
-#adminmenu {
-	background: #83B4D8;
-	border-top: 3px solid #448abd;
-	margin: 0;
-	padding: .2em .2em .3em 2em;
-}
-
-#adminmenu .current, #submenu .current {
-	font-weight: bold;
-	text-decoration: none;
-}
-
-#adminmenu a {
-	color: #000;
-	font-size: 14px;
-	font-weight: normal;
-	margin: 0;
-	padding: 3px 5px;
-	border-bottom: none;
-}
-
-#adminmenu a:hover, #adminmenu a.current {
-	background: #ddeaf4;
-	color: #333;
-}
-
-#adminmenu li, #submenu li {
-	display: inline;
-	line-height: 200%;
-	list-style: none;
-	text-align: center;
-	white-space: nowrap;
-}
-
-#adminmenu a.current {
-	background: #0d324f;
-	border-right: 2px solid #4f96c8;
-	border-top: 1px solid #96c0de;
-	color: #fff;
-	padding-bottom: 8px;
-}
-
-#submenu, #minisub {
-	background: #0d324f;
-	border-bottom: none;
-	margin: 0;
-	padding: 3px 2em 0 3em;
-}
-
-#minisub {
-	height: 6px;
-}
-
-#submenu .current {
-	background: #f9fcfe;
-	border-top: 1px solid #045290;
-	border-right: 2px solid #045290;
-	color: #000;
-}
-
-#submenu a {
-	border: none;
-	color: #fff;
-	font-size: 12px;
-	padding: .3em .4em .4em;
-}
-
-#submenu a:hover {
-	background: #ddeaf4;
-	color: #393939;
-}
-
-#submenu li {
-	line-height: 180%;
-	height: 25px;
-}
-
-#categorydiv input, #poststatusdiv input, #commentstatusdiv input, #pingstatusdiv input {
-	border: none;
-}
-
-#postdiv, #titlediv, #guiddiv {
+#postdiv, #titlediv, #guiddiv, #poststuff .stuffbox {
 	margin: 0 8px 0 0;
 	padding: 0;
 }
 
+#titlediv, #namediv, #poststuff #namediv {
+	margin-top: 10px;
+}
+
 #postdivrich {
 	margin: 0;
 	padding: 0;
@@ -553,56 +235,43 @@
 	width: 100%;
 }
 
-#postdivrich #content {
-	padding: 5px;
-	line-height: 140%;
+#editorcontainer #content {
+	padding: 0;
+	line-height: 150%;
+	border: 0 none;
+	outline: none;
 }
 
-#titlediv input, #guiddiv input {
-	margin: 0;
-	width: 100%;
+#editorcontainer {
+	padding: 6px;
+	border-style: none solid solid;
+	border-width: 1px;
+	border-collapse: separate;
 }
 
 #currenttheme img {
 	float: left;
-	border: 1px solid #666;
 	margin-right: 1em;
 	margin-bottom: 1.5em;
 	width: 300px;
+	border-width: 1px;
+	border-style: solid;
 }
 
-input.delete:hover {
-	background: #ce0000;
-	color: #fff;
-}
-
-#deletebookmarks:hover {
-	background: #ce0000;
-	color: #fff;
-}
-
-#postdivrich #quicktags {
-	background: #f0f0ee;
+#quicktags {
 	padding: 0;
-	border: 1px solid #ccc;
-	border-bottom: none;
-}
-
-#postdiv #quicktags {
-	padding-right: 6px;
-}
-
-#postdivrich #quicktags {
-	display: none;
+	border: 0 none;
 }
 
 #quicktags #ed_toolbar {
-	padding: 0 2px;
+	padding: 2px 4px;
 }
 
 #ed_toolbar input {
-	background: #fff url( images/fade-butt.png ) repeat-x 0 -2px;
 	margin: 3px 2px 2px;
+	padding: 2px 4px;
+	line-height: 18px;
+	display: inline-block;
 }
 
 #quicktags #ed_strong {
@@ -610,7 +279,6 @@
 }
 
 #quicktags #ed_link {
-	color: blue;
 	text-decoration: underline;
 }
 
@@ -624,17 +292,10 @@
 
 #quicktags #ed_code {
 	font-family: "Courier New", Courier, mono;
-	margin-bottom: 3px;
-}
-
-#title {
-	font-size: 1.7em;
-	padding: 4px 3px;
+	font-size: 1.1em;
+	vertical-align: top;
 }
 
-#postexcerpt div, #attachmentlinks div {
-	margin-right: 8px;
-}
 
 #attachmentlinks textarea {
 	width: 100%;
@@ -642,700 +303,1160 @@
 	margin-bottom: 6px;
 }
 
-* html #postexcerpt .dbx-toggle-open, * html #postexcerpt .dbx-toggle-open {
-	padding-right: 8px;
-}
-
 #excerpt, .attachmentlinks {
 	margin: 0;
 	height: 4em;
-	width: 100%;
+	width: 98%;
 }
 
-#footer {
-	clear: both;
-	text-align: center;
-	width: 500px;
-	margin: auto;
-	height: 100px;
+.plugins p {
 }
 
-#footer .docs {
-	padding-top: 19px;
-	line-height: 160%;
+#login .fullwidth {
+	width: 320px;
 }
 
-#footer .docs a {
-	text-decoration: underline;
+#searchform fieldset {
+	float: left;
+	margin: 0 1.5ex 1em 0;
+	padding: 0;
+}
+
+#searchform fieldset legend {
+	padding: 0 0 .2em 1px;
 }
-#footer .logo {
+
+#searchform #s {
+	padding: 4px 3px;
+}
+
+#searchform #post-query-submit {
 	float: left;
+	margin: 14px 0 1em;
+	position: relative;
+	top: .35em;
+}
+
+#postcustomstuff .updatemeta, #postcustomstuff .deletemeta {
+	margin: auto;
+}
+
+#postcustomstuff table {
 	margin: 0;
+	width: 100%;
+	border-width: 1px;
+	border-style: solid;
+}
+
+#postcustomstuff table input, #postcustomstuff table textarea {
+	width: 95%;
+}
+
+#postcustomstuff table #addmetasub {
+	width: auto;
+}
+
+#poststuff #post-body {
+	margin-right: 230px;
+}
+
+#save {
+	width: 15em;
+}
+
+#template div {
+	margin-right: 190px;
+}
+
+* html #template div {
+	margin-right: 0;
+}
+
+#template, #template div, #editcat, #addcat {
+	zoom: 1;
+}
+
+/* A handy div class for hiding controls.
+Some browsers will disable them when you
+set display:none; */
+.zerosize {
+	height: 0;
+	width: 0;
+	margin: 0;
+	border: 0;
 	padding: 0;
+	overflow: hidden;
+	position: absolute;
 }
 
-#login {
-	position: relative;
-	background: url('images/login-bkg-tile.gif') no-repeat top center;
-	color: #fff;
-	margin: 5em auto 1em;
-	padding: 20px 0 0;
-	width: 425px;
-	_width: 390px;
-}
-
-#login form {
-	background: url('images/login-bkg-bottom.gif') no-repeat bottom center;
-	padding: 0 50px 25px;
-	_width: 325px;
-	_margin: 0 auto;
-}
-
-#login #login_error {
-	background: #0e3350;
-	border: 1px solid #2571ab;
-	color: #ebcd4e;
+* html #themeselect {
+	padding: 0 3px;
+	height: 22px;
+}
+
+#your-profile fieldset {
+	border-width: 1px;
+	border-style: solid;
+	float: left;
+	width: 40%;
+	padding: .5em 2em 1em;
+	margin: 1em 1em 1em 0;
+}
+
+#your-profile fieldset input {
+	width: 100%;
+	font-size: 20px;
+	padding: 2px;
+}
+
+#your-profile fieldset textarea {
+	width: 100%;
+	padding: 2px;
+}
+
+#your-profile legend {
+	font-family: Georgia, "Times New Roman", Times, serif;
+	font-size: 22px;
+}
+
+#your-profile #rich_editing {
+	border: none;
+}
+
+#howto {
 	font-size: 11px;
+	margin: 0 5px;
+	display: block;
+}
+
+#ajax-response.alignleft {
+	margin-left: 2em;
+}
+
+
+div.nav {
+	height: 2em;
+	padding: 7px 10px;
+	vertical-align: text-top;
+	margin: 5px 0;
+}
+
+.nav .button-secondary {
+	padding: 2px 4px;
+}
+
+.page-numbers {
+	padding: 2px 4px;
+	margin-right: 3px;
+	border-width: 1px;
+	border-style: solid;
+}
+
+.page-numbers.current {
+	font-weight: bold;
+	border-width: 1px;
+	border-style: solid;
+}
+
+p.pagenav {
+	margin: 0;
+	display: inline;
+}
+
+.pagenav span {
 	font-weight: bold;
-	padding: .6em;
-	width: 310px;
-	margin: 0 50px;
+	margin: 0 6px;
+}
+
+.row-title {
+	font-size: 12px !important;
+	font-weight: bold;
+}
+
+.comment-column {
+	margin-left: 5px;
+}
+
+.tablenav a.button-secondary {
+	display: block;
+	margin: 1px 8px 0 0;
+}
+
+.tablenav .button-secondary {
+	padding: 2px 4px;
+	vertical-align: top;
+}
+
+.tablenav .tablenav-pages a.next, .tablenav .tablenav-pages a.prev {
+	text-decoration: underline;
+}
+
+.tablenav {
+	height: 2em;
+	padding: 7px 10px;
+	clear: both;
+	margin-bottom: -10px;
+	margin-top: 8px;
+	vertical-align: text-top;
+}
+
+.tablenav .tablenav-pages {
+	float: right;
+	height: 18px;
+	padding-top: 6px;
+	font-size: 11px;
+}
+
+.tablenav .tablenav-pages a {
+	text-decoration: none;
+}
+
+td.media-icon {
+	vertical-align: middle;
 	text-align: center;
 }
 
-#login p { 
+td.media-icon img {
+	max-width: 80px;
+	max-height: 60px;
+}
+
+#update-nag, .plugin-update {
+	line-height: 29px;
 	font-size: 12px;
+	text-align: center;
+	border-bottom-width: 1px;
+	border-bottom-style: solid;
+	border-top-width: 1px;
+	border-top-style: solid;
 }
 
-#login p.message { 
-	width: 310px;
-	margin: 0 auto 1em;
+#update-nag a, .plugin-update a {
+	font-size: 1.1em;
 }
 
-#login #login_error a {
-	color: #ebcd4e;
-	border-color: #ebcd4e;
+#pass-strength-result {
+	padding: 3px 5px 3px 5px;
+	margin-top: 3px;
+	text-align: center;
+	border-width: 1px;
+	border-style: solid;
 }
 
-#login #send {
-	color: #fff;
-	text-align: left;
+a.view-comment-post-link {
+	position: absolute;
+	text-decoration:underline;
+}
+
+/* Admin Header */
+
+#user_info {
+	position: absolute;
+	right: 15px;
+	top: 11px;
+	font-size: 11px;
+}
+
+#user_info p {
+	margin: 0;
+	padding: 0;
+}
+
+#wphead {
+	border-top-width: 30px;
+	border-top-style: solid;
+}
+
+#wphead a, #dashmenu a, #adminmenu a, #submenu a, #sidemenu a {
+	text-decoration: none;
+}
+
+#wphead #viewsite {
+	position: absolute;
+	margin-top: 12px;
+	margin-left: 10px;
+}
+#wphead #viewsite a {
+	font: 12px "Lucida Grande", "Lucida Sans Unicode", Tahoma, Verdana, sans-serif;
+	padding: 3px 4px;
+	display: block;
+	letter-spacing: normal;
+	border-width: 1px;
+	border-style: solid;
+	-moz-border-radius: 3px;
+	-khtml-border-radius: 3px;
+	-webkit-border-radius: 3px;
+	border-radius: 3px;
+}
+
+#wphead h1 {
+	font: normal 36px Georgia, "Times New Roman", Times, serif;
+	padding: 11px 170px 16px 12px;
+	margin: 0;
+	margin-right: 15%;
+}
+
+/* menu stuff */
+
+#dashmenu {
+	margin: 0;
+	list-style: none;
+	position: absolute;
+	top: 7px;
+	left: 0;
+	font-size: 11px;
+	padding-left: 9px;
+}
+
+#dashmenu a {
+	padding: 5px 6px;
+	line-height: 220%;
+	margin-right: 8px;
+}
+
+#dashmenu a.current {
+	border: none;
+	-moz-border-radius-topleft: 3px;
+	-khtml-border-top-left-radius: 3px;
+	-webkit-border-top-left-radius: 3px;
+	border-top-left-radius: 3px;
+	-moz-border-radius-topright: 3px;
+	-khtml-border-top-right-radius: 3px;
+	-webkit-border-top-right-radius: 3px;
+	border-top-right-radius: 3px;
+}
+
+#adminmenu {
+	margin: 0;
+	list-style: none;
+	padding-left: 11px;
+	border-bottom-width: 1px;
+	border-bottom-style: solid;
+}
+
+#adminmenu a {
+	font-size: 16px;
+	padding: 5px 7px;
+	line-height: 30px;
+}
+
+#adminmenu a.current, #sidemenu a.current {
 	font-weight: normal;
-	font-size: 1.1em;
-	_width: 325px;
-	_margin: 0 auto 15px;
+	padding-left: 6px;
+	padding-right: 6px;
+	-moz-border-radius-topleft: 4px;
+	-khtml-border-top-left-radius: 4px;
+	-webkit-border-top-left-radius: 4px;
+	border-top-left-radius: 4px;
+	-moz-border-radius-topright: 4px;
+	-khtml-border-top-right-radius: 4px;
+	-webkit-border-top-right-radius: 4px;
+	border-top-right-radius: 4px;
+	border-width: 1px;
+	border-style: solid;
 }
 
-#login h1 a {
-	margin: 0 auto;
-	height: 88px;
-	width: 320px;
+#adminmenu a.current {
+	border-bottom-width: 2px;
+}
+
+#sidemenu {
+	margin: -30px 15px 0 315px;
+	list-style: none;
+	position: relative;
+	float: right;
+	padding-left: 10px;
+	font-size:12px;
+}
+
+#sidemenu a {
+	padding: 0 7px;
 	display: block;
-	border-bottom: none;
-	text-indent: -9999px;
+	float: left;
+	line-height: 28px;
+	border-top-width: 1px;
+	border-top-style: solid;
+	border-bottom-width: 1px;
+	border-bottom-style: solid;
 }
 
-#login .message {
-	font-size: 10pt;
+#dashmenu li, #adminmenu li, #submenu li, #sidemenu li {
+	display: inline;
+	line-height: 200%;
+	list-style: none;
 	text-align: center;
+	white-space: nowrap;
+	margin: 0;
+	padding: 0;
 }
 
-#login .register {
-	font-size: 20px;
+#submenu li {
+	padding: 0 0 8px 17px;
 }
 
-#login input {
-	padding: 4px;
+#adminmenu li a #awaiting-mod {
+	position: absolute;
+	margin-left: -0.4em;
+	margin-top: 0.2em;
+	font-size: 0.7em;
+	background-repeat: no-repeat;
+	background-position: 0 bottom;
+	height: 0.9em;
+	width: 1em;
+}
+
+#adminmenu li a .count-0 {
+	display: none;
+}
+
+.post-com-count-wrapper {
+	min-width: 22px;
+}
+
+.post-com-count {
+	height: 1.3em;
+	line-height: 1.1em;
+	display: block;
+	text-decoration: none;
+	padding: 0 0 6px;
+	cursor: pointer;
+	background-position: center -80px;
+	background-repeat: no-repeat;
+}
+
+.post-com-count span {
+	height: 1.3em;
+	line-height: 1.2em;
+	padding: 0 0.5em;
+	background-color: #bbb;
+	display: inline-block;
+	cursor: pointer;
+	-moz-border-radius: 3px;
+	-khtml-border-radius: 3px;
+	-webkit-border-radius: 3px;
+	border-radius: 3px;
 }
 
-.login ul, #protected #login .bottom {
+strong .post-com-count {
+	background-position: center -55px;
+}
+
+.post-com-count:hover {
+	background-position: center -3px;
+}
+
+#adminmenu li a:hover #awaiting-mod {
+	background-position: -80px bottom;
+}
+
+#adminmenu li a #awaiting-mod span {
+	top: -0.8em;
+	right: 0;
+	position: absolute;
+	display: block;
+	height: 1.3em;
+	line-height: 1.3em;
+	padding: 0 0.6em;
+	-moz-border-radius: 3px;
+	-khtml-border-radius: 3px;
+	-webkit-border-radius: 3px;
+	border-radius: 3px;
+}
+
+#submenu {
+	margin: 0;
 	list-style: none;
-	width: 325px;
-	margin: 0 auto;
-	padding: 0;
-	line-height: 1.2;
+	padding: 6px 0 3px 0;
 }
 
-.login ul li {
-	font-size: 11px;
+#submenu li {
+	font-size: 14px;
 }
 
-.login ul li a {
-	color: #0d324f;
-	border: none;
+#minisub { /* for empty submenus */
+	height: 15px;
 }
 
-#login ul li a:hover {
-	color: #fff;
+/* end menu stuff */
+
+/* Admin Footer */
+
+html, body {
+	height:100%;
+}
+#wpwrap {
+	position: relative;
+	min-height: 100%;
+}
+#wpcontent{
+	padding-bottom: 95px;
+}
+#footer {
+	clear: both;
+	height: 65px;
+	padding: 10px 0 0 60px;
+	margin: 0;
+	position: relative;
+ 	margin-top: -75px;
+	font-size: 12px;
 }
 
-#login .input {
-	font-size: 1.8em;
-	margin-top: 3px;
-	width: 97%;
+#footer p {
+	margin: 0;
+	padding: 7px 0;
+}
+
+#footer p a {
+	text-decoration: none;
+}
+
+#footer p a:hover {
+	text-decoration: underline;
+}
+
+/* Tables used on comment.php and option/setting pages */
+
+.form-table {
+	border-collapse: collapse;
+	margin-top: 1em;
+	width: 100%;
+	margin-bottom: -8px;
 }
 
-#login p label { 
+.form-table td {
+	margin-bottom: 9px;
+	padding: 10px;
+	line-height: 20px;
+	border-bottom-width: 8px;
+	border-bottom-style: solid;
 	font-size: 11px;
 }
 
-#login #submit {
-	margin: 0;
-	font-size: 15px;
+.form-table th {
+	vertical-align: top;
+	text-align: left;
+	padding: 10px;
+	width: 150px;
+	border-bottom-width: 8px;
+	border-bottom-style: solid;
 }
 
-.plugins p {
+.form-table th.th-full {
+	width: auto;
 }
 
-#login .fullwidth {
-	width: 320px;
+.form-table input, .form-table textarea {
+	border-width: 1px;
+	border-style: solid;
 }
 
-#searchform {
+.form-table div.color-option {
+	display: block;
+	clear: both;
+}
+
+.form-table input.tog {
+	margin-top: 2px;
+	margin-right: 2px;
 	float: left;
-	margin-right: 1em;
-	width: 18em;
 }
 
-#viewarc {
+.form-table table.color-palette {
+	vertical-align: bottom;
+	float: left;
+	margin: -3px 3px 8px;
+}
+
+.form-table .color-palette td {
+	border-bottom: none;
+	border: 1px solid #fff;
+	font-size: 1px;
+	line-height: 1px;
+}
+
+#profile-page .form-table textarea {
+	width: 500px;
+	margin-bottom: 6px;
+}
+
+#pass-strength-result {
+	width: 197px;
+	float: left;
+	margin-right: 5px;
+	border: 1px solid #ccc !important;
+}
+
+#profile-page .form-table #rich_editing {
+	margin-right: 5px
+}
+
+/* Post Screen */
+
+#tagsdiv #newtag {
+	margin-right: 5px;
+	width: 16em;
+}
+
+#tagchecklist {
+	margin-left: 10px;
+
+	font-size: 12px;
+	overflow: auto;
+}
+
+#tagchecklist strong {
+	margin-left: -8px;
+	position: absolute;
+}
+
+#tagchecklist span {
+	margin-right: 25px;
+	display: block;
 	float: left;
-	width: 23em;
-	margin-bottom: 1em;
+	font-size: 11px;
+	line-height: 1.8em;
+	white-space: nowrap;
+	cursor: default;
 }
 
-#viewcat {
+#tagchecklist span a {
+	margin: 6px 0pt 0pt -9px;
+	cursor: pointer;
+	width: 10px;
+	height: 10px;
+	display: block;
 	float: left;
-	width: 30em;
-	margin-bottom: 1em;
+	text-indent: -9999px;
+	overflow: hidden;
+	position: absolute;
 }
 
-#postcustom .updatemeta, #postcustom .deletemeta {
-	margin: auto;
+.howto {
+	font-style: italic;
+	display: block;
 }
 
-#postcustom table {
-	border: 1px solid #ccc;
+.ac_results {
+	padding: 0;
 	margin: 0;
-	width: 100%;
+	list-style: none;
+	position: absolute;
+	z-index: 10000;
+	display: none;
+	border-width: 1px;
+	border-style: solid;
 }
 
-#postcustom table input, #postcustom table textarea {
-	width: 95%;
+.ac_results li {
+	padding: 2px 5px;
+	white-space: nowrap;
+	text-align: left;
 }
 
-#poststuff {
-	margin-right: 16em;
+.ac_over {
+	cursor: pointer;
 }
 
-#save {
-	width: 15em;
+.ac_match {
+	text-decoration: underline;
 }
 
-#template div {
-	margin-right: 190px;
+#poststuff h2 {
+	margin-top: 20px;
+	font-size: 1.5em;
+	margin-bottom: 15px;
+	padding: 0 0 3px;
 }
 
-* html #template div {
-	margin-right: 0;
+#poststuff h3 {
+	font-size: 14px;
+	font-weight: bold;
+	padding: 7px;
+	margin: 0 0 10px;
 }
 
-#template, #template div, #editcat, #addcat {
-	zoom: 1;
+#poststuff .postbox, #poststuff .stuffbox {
+	margin-left: 20px;
+	padding: 2px;
+	margin-bottom: 20px;
+	margin-right: 8px;
+	border-width: 1px;
+	border-style: solid;
 }
 
-#template textarea {
-	font: small 'Courier New', Courier, monospace;
-	width: 97%;
+#titlediv, #poststuff .postarea {
+	margin-left: 20px;
+	margin-bottom: 20px;
+	margin-right: 8px;
 }
 
-#templateside {
-	float: right;
-	width: 170px;
-	overflow: hidden;
+#titlediv {
+	margin-bottom: 20px;
 }
 
-#templateside h3, #postcustom p.submit {
+#titlediv div.inside {
 	margin: 0;
 }
 
-#templateside ol, #templateside ul {
-	list-style: none;
-	margin: .5em;
+#titlediv #title {
+	border: 0;
 	padding: 0;
+	font-size: 1.7em;
+	width: 100%;
+	outline: none;
 }
 
-#user_info {
-	position: absolute;
-	right: 1em;
-	top: 0;
-	color: #fff;
-	font-size: .9em;
+#poststuff #titlewrap {
+	padding: 2px 3px;
+	border-width: 1px;
+	border-style: solid;
 }
 
-#user_info a {
-	color: #fff;
+#poststuff .inside {
+	margin: 0 12px 12px;
+	font-size: 11px;
 }
 
-#wphead {
-	background: #14568a;
-	padding: .8em 19em .8em 2em;
-	color: #c3def1;
+#link_name, #link_url, #link_description {
+	font-size: 1.7em;
+	padding: 4px 3px;
+	width: 98%;
 }
 
-#wphead a {
-	color: #fff;
+#edit-slug-box {
+	margin-top: 8px;
 }
 
-#wphead h1 {
-	font-size: 2.5em;
-	font-weight: normal;
-	letter-spacing: -.05em;
-	margin: 0;
-	font-family: Georgia, "Times New Roman", Times, serif;
-}
+#editable-post-name-full {display: none;}
 
-#wphead h1 span {
-	font-size: .4em;
-	letter-spacing: 0;
-}
+#editable-post-name input {width: 16em;}
 
-#zeitgeist {
-	background: #eee;
-	border: 1px solid #c5c5c5;
-	float: right;
-	font-size: 90%;
-	margin-bottom: .5em;
-	margin-left: 1em;
-	margin-top: .5em;
-	padding: 1em;
-	width: 40%;
+#edit-slug-buttons a.save {
+	padding: 6px 4px;
+	margin-right: 4px;
+	text-decoration: none;
+	border-width: 1px;
+	border-style: solid;
+	-moz-border-radius: 3px;
+	-khtml-border-radius: 3px;
+	-webkit-border-radius: 3px;
+	border-radius: 3px;
+	font-weight: bold;
 }
 
-#zeitgeist h2, fieldset legend a {
-	border-bottom: none;
+#poststuff #editor-toolbar {
+	position: relative;
+	height: 30px;
+	margin-top: -41px;
 }
 
-* html #zeitgeist h2 {
-	padding-top: 10px;
+#poststuff #edButtonPreview, #poststuff #edButtonHTML {
+	display: block;
+	height: 20px;
+	padding: 5px 5px 1px;
+	margin: 5px 8px 0 0;
+	float: right;
+	cursor: pointer;
 }
 
-#zeitgeist h2 {
-	margin-top: .4em;
+#poststuff #editor-toolbar .active {
+	font-weight: bold;
+	-moz-border-radius-topright: 3px;
+	-khtml-border-top-right-radius: 3px;
+	-webkit-border-top-right-radius: 3px;
+	border-top-right-radius: 3px;
+	-moz-border-radius-topleft: 3px;
+	-khtml-border-top-left-radius: 3px;
+	-webkit-border-top-left-radius: 3px;
+	border-top-left-radius: 3px;
 }
 
-#zeitgeist h3 {
-	border-bottom: 1px solid #ccc;
-	font-size: 16px;
-	margin: 1em 0 0;
+#poststuff #media-buttons {
+	float: right;
+	margin-right: 20px;
+	margin-top: 8px;
+	cursor: default;
+	line-height: 1;
+	height: 1.1em;
 }
 
-#zeitgeist h3 cite {
-	font-size: 12px;
-	font-style: normal;
+#poststuff #media-buttons a {
+	cursor: pointer;
+	padding: 0 5px 2px 2px;
 }
 
-#zeitgeist li, #zeitgeist p {
-	margin: .2em 0;
+#poststuff #media-buttons img {
+	vertical-align: middle;
 }
 
-#zeitgeist ul {
-	margin: 0 0 .3em .6em;
-	padding: 0 0 0 .6em;
+#poststuff .togbox {
+	background-position: -10px 16px;
+	background-repeat: no-repeat;
+	display: block;
+	height: 37px;
+	margin-left: -21px;
+	margin-top: -10px;
+	overflow: hidden;
+	position: absolute;
+	text-indent: -9999px;
+	width: 12px;
+	-moz-border-radius-topleft: 3px;
+	-khtml-border-top-left-radius: 3px;
+	-webkit-border-top-left-radius: 3px;
+	border-top-left-radius: 3px;
+	-moz-border-radius-bottomleft: 3px;
+	-khtml-border-bottom-left-radius: 3px;
+	-webkit-border-bottom-left-radius: 3px;
+	border-bottom-left-radius: 3px;
 }
 
-.active td {
-	background: #BEB;
-}
-.active .name {
-	background: #9C9;
-}
-.alternate.active td {
-	background: #ADA;
-}
-.alternate.active .name {
-	background: #8B8;
+#poststuff .closed .inside {
+	display: none;
 }
 
-#namediv, #emaildiv, #uridiv {
-	float: left;
+#poststuff .closed h3 {
+	margin: 0;
 }
 
-#ajax-response {
-	padding: .5em;
+#poststuff .closed .togbox {
+	background-position: 4px 15px;
 }
 
-/* A handy div class for hiding controls.
-Some browsers will disable them when you
-set display:none; */
-.zerosize {
-	height: 0;
-	width: 0;
-	margin: 0;
-	border: 0;
-	padding: 0;
-	overflow: hidden;
-	position: absolute;
+.submitbox {
+	width: 220px;
+	float: right;
 }
 
-/* Box stuff */
-.dbx-clone {
-	position: absolute;
-	visibility: hidden;
-}
-.dbx-clone, .dbx-clone .dbx-handle-cursor {
-	cursor: move !important;
-}
-.dbx-dummy {
-	display: block;
-	width: 0;
-	height: 0;
-	overflow: hidden;
-}
-.dbx-group, .dbx-box, .dbx-handle {
-	position: relative;
-	display: block;
+.submitbox .inside strong {
+	font-size: 14px;
 }
 
-#grabit {
-	width: 188px;
+.submitbox .submitdelete {
+	border-bottom-width: 1px;
+	border-bottom-style: solid;
+	text-decoration: none;
+	margin-left: 8px;
+	padding-bottom: 1px;
 }
 
-* html #themeselect {
-	padding: 0 3px;
-	height: 22px;
-}
 
-/****************************************************************
-avoid padding, margins or borders on dbx-box,
-to reduce visual discrepancies between it and the clone.
-overall, dbx-box is best left as visually unstyled as possible
-*****************************************************************/
-.dbx-box {
-	margin: 0;
-	padding: 0;
-	border: none;
+.submitbox #previewview {
+	padding: 15px 10px;
+	-moz-border-radius-topleft: 3px;
+	-khtml-border-top-left-radius: 3px;
+	-webkit-border-top-left-radius: 3px;
+	border-top-left-radius: 3px;
+	-moz-border-radius-topright: 3px;
+	-khtml-border-top-right-radius: 3px;
+	-webkit-border-top-right-radius: 3px;
+	border-top-right-radius: 3px;
 }
 
-/* Can change this */
-#moremeta fieldset, #advancedstuff fieldset {
-	margin-bottom: 1em;
-}
-#moremeta fieldset div {
-	margin: 2px 0 0 0;
-	padding: 7px;
-}
-#moremeta {
-	line-height: 130%;
-	margin-right: 15px;
-	position: absolute;
-	right: 5%;
-	width: 14.5em;
-}
-#moremeta select {
-	width: 96%;
+.submitbox #previewview a {
+	padding: 6px;
+	text-decoration: none;
+	font-weight: normal;
+	border-bottom: none;
+	font-size: 14px;
+	-moz-border-radius: 3px;
+	-khtml-border-radius: 3px;
+	-webkit-border-radius: 3px;
+	border-radius: 3px;
 }
 
-#slugdiv input, #passworddiv input, #authordiv select, #thumbdiv input, #parentdiv input {
-	margin-top: .5em;
-	width: 90%;
+.submitbox .submit {
+	text-align: left;
+	padding: 12px 10px 10px 10px;
+	font-size: 11px;
 }
 
-#moremeta h3, #advancedstuff h3 {
-	padding: 3px;
-	font-weight: normal;
-	font-size: 13px;
+.submitbox .submit a:hover {
+	border-bottom-width: 1px;
+	border-bottom-style: solid;
 }
 
-#advancedstuff div {
-	margin-top: .5em;
+.submitbox .submit input {
+	margin-bottom: 8px;
+	margin-right: 3px;
+	padding: 6px 4px;
+	border: none;
 }
 
-#categorydiv ul {
-	list-style: none;
-	padding: 0;
-	margin-left: 10px;
+.submitbox #autosave .error {
+	margin-top: 10px;
 }
 
-#categorychecklist {
-	height: 12em;
-	overflow: auto;
-	margin-top: 8px;
-}
+/* Categories */
 
-#categorychecklist li {
-	margin: 0;
-	padding: 0;
+#categorydiv #category-adder {
+	margin-left: 120px;
+	padding: 4px 0;
 }
 
-#ajaxcat input {
-	border: 1px solid #ccc;
+#category-add input, #category-add select {
+	width: 30%;
 }
 
-#your-profile #rich_editing {
-	border: none;
-	background: #fff;
+#category-add input#category-add-sumbit {
+	width: auto;
 }
 
-#your-profile fieldset {
-	border: 1px solid #ccc;
+#categorydiv ul#category-tabs {
 	float: left;
-	width: 40%;
-	padding: .5em 2em 1em;
-	margin: 1em 1em 1em 0;
+	width: 120px;
+	text-align: right;
+	/* Negative margin for the sake of those without JS: all tabs display */
+	margin: 0 -120px 0 0;
+	padding: 0;
 }
 
-#your-profile fieldset input {
-	width: 100%;
-	font-size: 20px;
-	padding: 2px;
+ul#category-tabs li {
+	padding: 8px;
 }
 
-#your-profile fieldset textarea {
-	width: 100%;
-	padding: 2px;
+ul#category-tabs li.ui-tabs-selected {
+	-moz-border-radius-topleft: 3px;
+	-khtml-border-top-left-radius: 3px;
+	-webkit-border-top-left-radius: 3px;
+	border-top-left-radius: 3px;
+	-moz-border-radius-bottomleft: 3px;
+	-khtml-border-bottom-left-radius: 3px;
+	-webkit-border-bottom-left-radius: 3px;
+	border-bottom-left-radius: 3px;
 }
 
-#your-profile legend {
-	font-family: Georgia, "Times New Roman", Times, serif;
-	font-size: 22px;
+ul#category-tabs li.ui-tabs-selected a {
+	color: #333;
+	font-weight: bold;
+	text-decoration: none;
 }
 
-/* default box styles */
-
-/* toggle state of inner content area */
-.dbx-box-open .dbx-content {
-	display: block;
-}
-.dbx-box-closed .dbx-content {
-	display: none;
+div.ui-tabs-panel {
+	margin: 0 5px 0 120px;
+	padding: .5em .9em;
+	height: 10em;
+	overflow: auto;
+	border-width: 4px;
+	border-style: solid;
 }
 
-#moremeta .dbx-content {
-	background: url(images/box-butt.gif) no-repeat bottom right;
-	padding-bottom: 15px;
-	padding-right: 2px;
+#categorydiv ul {
+	list-style: none;
+	padding: 0;
+	margin: 0;
 }
 
-#moremeta fieldset.dbx-box-closed {
-	background: url(images/box-butt.gif) no-repeat bottom;
-	padding-bottom: 9px;
+#categorydiv ul.categorychecklist ul {
+	margin-left: 18px;
 }
 
-/* handles */
-
-.dbx-handle {
-	background: #2685af;
-	padding: 6px 1em 2px;
-	font-size: 12px;
+ul.categorychecklist li {
 	margin: 0;
-	color: #E3EFF5;
+	padding: 0;
+	line-height: 19px;
 }
 
-#moremeta .dbx-handle {
-	padding: 6px 1em 2px;
-	font-size: 12px;
-	background: #2685af url(images/box-head.gif) no-repeat right;
+#linkcategorydiv #category-adder {
+	margin-left: 120px;
+	padding: 4px 0;
 }
 
-#moremeta .dbx-box {
-	background: url(images/box-bg.gif) repeat-y right;
+#category-adder h4 {
+	margin: 0;
 }
 
-#advancedstuff h3.dbx-handle {
-	margin-left: 7px;
-	margin-bottom: -7px;
-	padding: 6px 1em 0 3px;
-	height: 19px;
-	font-size: 12px;
-	background: #2685af url(images/box-head-right.gif) no-repeat top right;
+#linkcategorydiv ul#category-tabs {
+	float: left;
+	width: 120px;
+	text-align: right;
+	/* Negative margin for the sake of those without JS: all tabs display */
+	margin: 0 -120px 0 0;
+	padding: 0;
 }
 
-#advancedstuff div.dbx-h-andle-wrapper {
-	margin: 0 0 0 -7px;
-	background: #fff url(images/box-head-left.gif) no-repeat top left;
+#linkcategorydiv ul {
+	list-style: none;
+	padding: 0;
+	margin: 0;
 }
 
-#advancedstuff div.dbx-content {
-	margin-left: 8px;
-	background: url(images/box-bg-right.gif) repeat-y right;
-	padding: 10px 10px 15px 0;
+#linkcategorydiv ul.categorychecklist ul {
+	margin-left: 18px;
 }
 
-#postexcerpt div.dbx-content {
-	margin-right: 0;
-	padding-right: 17px;
+/* pasitioning etc. */
+form#tags-filter {
+        position: relative;
 }
 
-#advancedstuff div.dbx-c-ontent-wrapper {
-	margin-left: -7px;
-	margin-right: 0;
-	background: url(images/box-bg-left.gif) repeat-y left;
+p#tag-search {
+        position: absolute;
+        right: 0;
+        top: 0;
+        margin: 0;
 }
 
-#advancedstuff fieldset.dbx-box {
-	padding-bottom: 9px;
-	margin-left: 6px;
-	background: url(images/box-butt-right.gif) no-repeat bottom right;
+form#posts-filter {
+        position: relative;
 }
 
-#advancedstuff div.dbx-b-ox-wrapper {
-	background: url(images/box-butt-left.gif) no-repeat bottom left;
+p#post-search {
+        position: absolute;
+        right: 0;
+        top: 0;
+        margin: 0;
 }
 
-#advancedstuff .dbx-box-closed div.dbx-c-ontent-wrapper {
-	padding-bottom: 2px;
-	background: url(images/box-butt-left.gif) no-repeat bottom left;
+#post-search .button, #widget-search .button {
+	padding: 3px;
+	font-size: 13px;
 }
 
-#advancedstuff .dbx-box {
-	background: url(images/box-butt-right.gif) no-repeat bottom right;
+#posts-filter fieldset {
+	float: left;
+	margin: 0 1.5ex 1em 0;
+	padding: 0;
 }
 
-/* handle cursors */
-.dbx-handle-cursor {
-	cursor: move;
+#posts-filter fieldset legend {
+	padding: 0 0 .2em 1px;
 }
 
-/* toggle images */
-a.dbx-toggle, a.dbx-toggle:visited {
-	display: block;
-	overflow: hidden;
-	background-image: url( images/toggle.gif );
-	position: absolute;
-	top: 0;
-	right: 0;
-	background-repeat: no-repeat;
-	border: 0;
-	margin: 0;
-	padding: 0;
+.bordertitle {
+	padding-bottom: 5px;
+	border-bottom-width: 1px;
+	border-bottom-style: solid;
 }
 
-#moremeta a.dbx-toggle, #moremeta a.dbx-toggle-open:visited {
-	height: 25px;
-	width: 27px;
-	background-position: 0 0;
-}
+/* Global classes */
+.wp-hidden-children .wp-hidden-child { display: none; }
+.wp-no-js-hidden { display: none; }
+.ui-tabs-hide { display: none; }
 
-#moremeta a.dbx-toggle-open, #moremeta a.dbx-toggle-open:visited {
-	height: 25px;
-	width: 27px;
-	background-position: 0 -25px;
+.commentlist .avatar {
+	vertical-align:text-top;
 }
 
-#advancedstuff a.dbx-toggle, #advancedstuff a.dbx-toggle-open:visited {
-	height: 22px;
-	width: 22px;
-	top: 3px;
-	right: 5px;
-	background-position: 0 -3px;
+body.minwidth {
+	min-width: 808px;
 }
 
-#advancedstuff a.dbx-toggle-open, #advancedstuff a.dbx-toggle-open:visited {
-	height: 22px;
-	width: 22px;
-	top: 3px;
-	right: 5px;
-	background-position: 0 -28px;
+ul.view-switch {
+	float: right;
+	list-style: none;
+	margin: -23px 5px -2px 0;
+	position: relative;
 }
 
-#categorychecklist {
-	margin-right: 6px;
+ul.view-switch li {
+	float: left;
+	margin: 0;
+	font-size: 11px;
+	padding: 4px 6px;
+	font-weight: bold;
 }
 
-/* additional clone styles */
-.dbx-clone {
-	opacity: 0.8;
-	-moz-opacity: 0.8;
-	-khtml-opacity: 0.8;
-	filter: alpha(opacity=80);
+ul.view-switch a {
+	text-decoration: none;
 }
 
-#newcat {
-	width: 120px;
-	margin-right: 5px;
+ul.view-switch li.current {
+	border: none;
+	-moz-border-radius-topleft: 3px;
+	-khtml-border-top-left-radius: 3px;
+	-webkit-border-top-left-radius: 3px;
+	border-top-left-radius: 3px;
+	-moz-border-radius-topright: 3px;
+	-khtml-border-top-right-radius: 3px;
+	-webkit-border-top-right-radius: 3px;
+	border-top-right-radius: 3px;
 }
 
-input #catadd {
-	background: #a4a4a4;
-	border-bottom: 1px solid #898989;
-	border-left: 1px solid #bcbcbc;
-	border-right: 1px solid #898989;
-	border-top: 1px solid #bcbcbc;
-	color: #fff;
-	font-size: 10px;
-	padding: 0;
-	margin: 0;
-	font-weight: bold;
-	height: 20px;
-	margin-bottom: 2px;
-	text-align: center;
-	width: 37px;
+
+#the-comment-list .comment a {
+	padding-bottom: 1px;
+	text-decoration: none;
+	border-bottom-width: 1px;
+	border-bottom-style: solid;
 }
 
-#howto {
-	font-size: 11px;
-	margin: 0 5px;
-	display: block;
+
+#the-comment-list td.comment p.comment-author {
+	margin-top: 0;
+	margin-left: 0 ;
 }
 
-#jaxcat {
-	margin: 0;
-	padding: 0;
+#the-comment-list p.comment-author img {
+	float: left;
+	margin-right: 8px;
 }
 
-#ajax-response.alignleft {
-	margin-left: 2em;
+#the-comment-list p.comment-author strong a {
+	border: none;
 }
 
-#postdivrich #edButtons {
-	padding-left: 3px;
+#the-comment-list td {
+	vertical-align: top;
 }
 
-#postdivrich #content, #postdivrich #content:active {
-	border: 1px solid #ccc;
+#the-comment-list td.comment {
+	width: 65%;
+	max-width: 460px;
+	word-wrap: break-word;
 }
 
-#edButtons input, #edButtons input:active {
-	margin: 0 2px -1px;
+#the-comment-list td.comment p {
+	margin-left: 8px;
 }
 
-#edButtons input.edButtonFore, #edButtons input.edButtonFore:active {
-	background: #f0f0ee;
-	border-bottom: 1px solid #f0f0ee;
+#the-comment-list .check-column {
+	padding-top: 8px;
 }
 
-#edButtons input.edButtonBack, #edButtons input.edButtonBack:active {
-	background: #fff url( images/fade-butt.png ) repeat-x 0 15px;
-	border-bottom: 1px solid #ccc;
+#templateside ul li a {
+	text-decoration: none;
 }
 
-.page-numbers {
-	padding: 4px 7px;
-	border: 1px solid #fff;
-	margin-right: 3px;
+.curtime {
+	background-image: url(images/date-button.gif);
+	background-repeat: no-repeat;
+	background-position: left 2px;
+	padding-left: 18px;
 }
 
-a.page-numbers {
-	border: 1px solid #ccc;
+.tablenav .delete {
+	margin-right: 20px;
 }
 
-a.page-numbers:hover {
-	border: 1px solid #999;
+#tTips {
+	display: none;
+	position: absolute;
+	margin: 0;
+	padding: 0 0 8px 0;
+	background-image: url(images/tail.gif);
+	background-repeat: no-repeat;
+	background-position: 15px bottom;
+	background-color: thansparent;
 }
 
-.page-numbers.current {
-	border: 1px solid #999;
-	font-weight: bold;
+#tTips p#tTips_inside {
+	margin: 0;
+	padding: 8px 12px;
+	text-align: center;
+	-moz-border-radius: 8px;
+	-khtml-border-radius: 8px;
+	-webkit-border-radius: 8px;
+	border-radius: 8px;
 }
 
-.pagenav span {
-	font-weight: bold;
-	margin: 0 6px;
+td.action-links, th.action-links {
+	text-align: right;
 }
 
-a.view-link {
-	position: absolute;
-	right: 5%;
-	margin-right: 220px;
-	text-decoration:underline;
+#poststuff h3, #poststuff .closed h3 {
+	cursor: pointer;
+} 
+
+.hide-if-no-js {
+	display: none;
 }
diff -x .svn -aruN 2.2.2.src/wp-admin/xfn.js 2.5.src/wp-admin/xfn.js
--- 2.2.2.src/wp-admin/xfn.js	2006-11-19 01:56:05.000000000 -0600
+++ 2.5.src/wp-admin/xfn.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,46 +0,0 @@
-function GetElementsWithClassName(elementName, className) {
-	var allElements = document.getElementsByTagName(elementName);
-	var elemColl = new Array();
-	for (i = 0; i < allElements.length; i++) {
-		if (allElements[i].className == className) {
-			elemColl[elemColl.length] = allElements[i];
-		}
-	}
-	return elemColl;
-}
-
-function meChecked() {
-	var undefined;
-	var eMe = document.getElementById('me');
-	if (eMe == undefined) return false;
-	else return eMe.checked;
-}
-
-function upit() {
-	var isMe = meChecked(); //document.getElementById('me').checked;
-	var inputColl = GetElementsWithClassName('input', 'valinp');
-	var results = document.getElementById('link_rel');
-	var linkText, linkUrl, inputs = '';
-	for (i = 0; i < inputColl.length; i++) {
-		 inputColl[i].disabled = isMe;
-		 inputColl[i].parentNode.className = isMe ? 'disabled' : '';
-		 if (!isMe && inputColl[i].checked && inputColl[i].value != '') {
-			inputs += inputColl[i].value + ' ';
-				}
-		 }
-	inputs = inputs.substr(0,inputs.length - 1);
-	if (isMe) inputs='me';
-	results.value = inputs;
-	}
-
-function blurry() {
-	if (!document.getElementById) return;
-
-	var aInputs = document.getElementsByTagName('input');
-
-	for (var i = 0; i < aInputs.length; i++) {
-		 aInputs[i].onclick = aInputs[i].onkeyup = upit;
-	}
-}
-
-addLoadEvent(blurry);
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-app.php 2.5.src/wp-app.php
--- 2.2.2.src/wp-app.php	2007-06-26 15:47:17.000000000 -0500
+++ 2.5.src/wp-app.php	2008-03-17 16:18:03.000000000 -0500
@@ -1,5 +1,5 @@
 <?php
-/* 
+/*
  * wp-app.php - Atom Publishing Protocol support for WordPress
  * Original code by: Elias Torres, http://torrez.us/archives/2006/08/31/491/
  * Modified by: Dougal Campbell, http://dougal.gunters.org/
@@ -9,34 +9,22 @@
 
 define('APP_REQUEST', true);
 
-require_once('wp-config.php');
-require_once('wp-includes/post-template.php');
+require_once('./wp-config.php');
+require_once(ABSPATH . WPINC . '/post-template.php');
+require_once(ABSPATH . WPINC . '/atomlib.php');
+require_once(ABSPATH . WPINC . '/feed.php');
 
-// Attempt to automatically detect whether to use querystring
-// or PATH_INFO, based on our environment:
-$use_querystring = $wp_version == 'MU' ? 1 : 0;
-
-// If using querystring, we need to put the path together manually:
-if ($use_querystring) {
-	$GLOBALS['use_querystring'] = $use_querystring;
-	$action = $_GET['action'];
-	$eid = (int) $_GET['eid'];
-
-	$_SERVER['PATH_INFO'] = $action;
-
-	if ($eid) {
-		$_SERVER['PATH_INFO'] .= "/$eid";
-	}
-} else {
-	$_SERVER['PATH_INFO'] = str_replace( '/wp-app.php', '', $_SERVER['REQUEST_URI'] );
-}
+$_SERVER['PATH_INFO'] = preg_replace( '/.*\/wp-app\.php/', '', $_SERVER['REQUEST_URI'] );
 
 $app_logging = 0;
 
+// TODO: Should be an option somewhere
+$always_authenticate = 1;
+
 function log_app($label,$msg) {
 	global $app_logging;
 	if ($app_logging) {
-		$fp = fopen( 'app.log', 'a+');
+		$fp = fopen( 'wp-app.log', 'a+');
 		$date = gmdate( 'Y-m-d H:i:s' );
 		fwrite($fp, "\n\n$date - $label\n$msg\n");
 		fclose($fp);
@@ -57,220 +45,29 @@
 endif;
 
 function wa_posts_where_include_drafts_filter($where) {
-	$where = ereg_replace("post_author = ([0-9]+) AND post_status != 'draft'","post_author = \\1 AND post_status = 'draft'", $where);
-	return $where;
-}
-add_filter('posts_where', 'wa_posts_where_include_drafts_filter');
+        $where = str_replace("post_status = 'publish'","post_status = 'publish' OR post_status = 'future' OR post_status = 'draft' OR post_status = 'inherit'", $where);
+        return $where;
 
-class AtomEntry {
-	var $links = array();
-	var $categories = array();
-}
-
-class AtomParser {
-
-	var $ATOM_CONTENT_ELEMENTS = array('content','summary','title','subtitle','rights');
-	var $ATOM_SIMPLE_ELEMENTS = array('id','updated','published','draft');
-
-	var $depth = 0;
-	var $indent = 2;
-	var $in_content;
-	var $ns_contexts = array();
-	var $ns_decls = array();
-	var $is_xhtml = false;
-	var $skipped_div = false;
-
-	var $entry;
-
-	function AtomParser() {
-
-		$this->entry = new AtomEntry();
-		$this->map_attrs_func = create_function('$k,$v', 'return "$k=\"$v\"";');
-		$this->map_xmlns_func = create_function('$p,$n', '$xd = "xmlns"; if(strlen($n[0])>0) $xd .= ":{$n[0]}"; return "{$xd}=\"{$n[1]}\"";');
-	}
-
-	function parse() {
-
-		global $app_logging;
-		array_unshift($this->ns_contexts, array());
-
-		$parser = xml_parser_create_ns();
-		xml_set_object($parser, $this);
-		xml_set_element_handler($parser, "start_element", "end_element");
-		xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
-		xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,0);
-		xml_set_character_data_handler($parser, "cdata");
-		xml_set_default_handler($parser, "_default");
-		xml_set_start_namespace_decl_handler($parser, "start_ns");
-		xml_set_end_namespace_decl_handler($parser, "end_ns");
-
-		$contents = "";
-
-		$fp = fopen("php://input", "r");
-		while(!feof($fp)) {
-			$line = fgets($fp, 4096);
-		 
-			if($app_logging) $contents .= $line;
-
-			if(!xml_parse($parser, $line)) {
-				log_app("xml_parse_error", "line: $line");
-				$this->error = sprintf(__('XML error: %s at line %d')."\n",
-					xml_error_string(xml_get_error_code($xml_parser)),
-					xml_get_current_line_number($xml_parser));
-				log_app("xml_parse_error", $this->error);
-				return false;
-			}
-		}
-		fclose($fp);
-
-		xml_parser_free($parser);
-
-		log_app("AtomParser->parse()",trim($contents));
-
-		return true;
-	}
-
-	function start_element($parser, $name, $attrs) {
-
-		$tag = array_pop(split(":", $name));
-
-		array_unshift($this->ns_contexts, $this->ns_decls);
-
-		$this->depth++;
-
-		#print str_repeat(" ", $this->depth * $this->indent) . "start_element('$name')" ."\n";
-		#print str_repeat(" ", $this->depth+1 * $this->indent) . print_r($this->ns_contexts,true) ."\n";
-
-		if(!empty($this->in_content)) {
-			$attrs_prefix = array();
-
-			// resolve prefixes for attributes
-			foreach($attrs as $key => $value) {
-				$attrs_prefix[$this->ns_to_prefix($key)] = $this->xml_escape($value);
-			}
-			$attrs_str = join(' ', array_map($this->map_attrs_func, array_keys($attrs_prefix), array_values($attrs_prefix)));
-			if(strlen($attrs_str) > 0) {
-				$attrs_str = " " . $attrs_str;
-			}
-
-			$xmlns_str = join(' ', array_map($this->map_xmlns_func, array_keys($this->ns_contexts[0]), array_values($this->ns_contexts[0])));
-			if(strlen($xmlns_str) > 0) {
-				$xmlns_str = " " . $xmlns_str;
-			}
-
-			// handle self-closing tags (case: a new child found right-away, no text node)
-			if(count($this->in_content) == 2) {
-				array_push($this->in_content, ">");
-			}
-		 
-			array_push($this->in_content, "<". $this->ns_to_prefix($name) ."{$xmlns_str}{$attrs_str}");
-		} else if(in_array($tag, $this->ATOM_CONTENT_ELEMENTS) || in_array($tag, $this->ATOM_SIMPLE_ELEMENTS)) {
-			$this->in_content = array();
-			$this->is_xhtml = $attrs['type'] == 'xhtml'; 
-			array_push($this->in_content, array($tag,$this->depth));
-		} else if($tag == 'link') {
-			array_push($this->entry->links, $attrs);
-		} else if($tag == 'category') {
-			array_push($this->entry->categories, $attrs);
-		}
-
-		$this->ns_decls = array();
-	}
-
-	function end_element($parser, $name) {
-
-		$tag = array_pop(split(":", $name));
-
-		if(!empty($this->in_content)) {
-			if($this->in_content[0][0] == $tag && 
-			$this->in_content[0][1] == $this->depth) {
-				array_shift($this->in_content);
-				if($this->is_xhtml) {
-					$this->in_content = array_slice($this->in_content, 2, count($this->in_content)-3);
-				}
-				$this->entry->$tag = join('',$this->in_content);
-				$this->in_content = array();
-			} else {
-				$endtag = $this->ns_to_prefix($name);
-				if (strpos($this->in_content[count($this->in_content)-1], '<' . $endtag) !== false) {
-					array_push($this->in_content, "/>");
-				} else {
-					array_push($this->in_content, "</$endtag>");
-				}
-			}
-		}
-
-		array_shift($this->ns_contexts);
-
-		#print str_repeat(" ", $this->depth * $this->indent) . "end_element('$name')" ."\n";
-
-		$this->depth--;
-	}
-
-	function start_ns($parser, $prefix, $uri) {
-		#print str_repeat(" ", $this->depth * $this->indent) . "starting: " . $prefix . ":" . $uri . "\n";
-		array_push($this->ns_decls, array($prefix,$uri));
-	}
-
-	function end_ns($parser, $prefix) {
-		#print str_repeat(" ", $this->depth * $this->indent) . "ending: #" . $prefix . "#\n";
-	}
-
-	function cdata($parser, $data) {
-		#print str_repeat(" ", $this->depth * $this->indent) . "data: #" . $data . "#\n";
-		if(!empty($this->in_content)) {
-			// handle self-closing tags (case: text node found, need to close element started)
-			if (strpos($this->in_content[count($this->in_content)-1], '<') !== false) {
-				array_push($this->in_content, ">");
-			}
-			array_push($this->in_content, $this->xml_escape($data));
-		}
-	}
-
-	function _default($parser, $data) {
-		# when does this gets called?
-	}
-
-
-	function ns_to_prefix($qname) {
-		$components = split(":", $qname);
-		$name = array_pop($components);
-
-		if(!empty($components)) {
-			$ns = join(":",$components);
-			foreach($this->ns_contexts as $context) {
-				foreach($context as $mapping) {
-					if($mapping[1] == $ns && strlen($mapping[0]) > 0) {
-						return "$mapping[0]:$name";
-					}
-				}
-			}
-		} 
-		return $name;
-	}
-
-	function xml_escape($string)
-	{
-			 return str_replace(array('&','"',"'",'<','>'), 
-				array('&amp;','&quot;','&apos;','&lt;','&gt;'), 
-				$string );
-	}
 }
+add_filter('posts_where', 'wa_posts_where_include_drafts_filter');
 
 class AtomServer {
 
 	var $ATOM_CONTENT_TYPE = 'application/atom+xml';
 	var $CATEGORIES_CONTENT_TYPE = 'application/atomcat+xml';
-	var $INTROSPECTION_CONTENT_TYPE = 'application/atomserv+xml';
+	var $SERVICE_CONTENT_TYPE = 'application/atomsvc+xml';
+
+	var $ATOM_NS = 'http://www.w3.org/2005/Atom';
+	var $ATOMPUB_NS = 'http://www.w3.org/2007/app';
 
 	var $ENTRIES_PATH = "posts";
 	var $CATEGORIES_PATH = "categories";
 	var $MEDIA_PATH = "attachments";
 	var $ENTRY_PATH = "post";
+	var $SERVICE_PATH = "service";
 	var $MEDIA_SINGLE_PATH = "attachment";
 
 	var $params = array();
-	var $script_name = "wp-app.php";
 	var $media_content_types = array('image/*','audio/*','video/*');
 	var $atom_content_types = array('application/atom+xml');
 
@@ -282,40 +79,46 @@
 	function AtomServer() {
 
 		$this->script_name = array_pop(explode('/',$_SERVER['SCRIPT_NAME']));
+		$this->app_base = get_bloginfo('url') . '/' . $this->script_name . '/';
+		if ( isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on' ) {
+			$this->app_base = preg_replace( '/^http:\/\//', 'https://', $this->app_base );
+		}
 
 		$this->selectors = array(
-			'@/service@' => 
+			'@/service$@' =>
 				array('GET' => 'get_service'),
-			'@/categories@' =>
+			'@/categories$@' =>
 				array('GET' => 'get_categories_xml'),
-			'@/post/(\d+)@' => 
-				array('GET' => 'get_post', 
-						'PUT' => 'put_post', 
+			'@/post/(\d+)$@' =>
+				array('GET' => 'get_post',
+						'PUT' => 'put_post',
 						'DELETE' => 'delete_post'),
-			'@/posts/?([^/]+)?@' => 
-				array('GET' => 'get_posts', 
+			'@/posts/?(\d+)?$@' =>
+				array('GET' => 'get_posts',
 						'POST' => 'create_post'),
-			'@/attachments/?(\d+)?@' => 
-				array('GET' => 'get_attachment', 
+			'@/attachments/?(\d+)?$@' =>
+				array('GET' => 'get_attachment',
 						'POST' => 'create_attachment'),
-			'@/attachment/file/(\d+)@' => 
-				array('GET' => 'get_file', 
-						'PUT' => 'put_file', 
+			'@/attachment/file/(\d+)$@' =>
+				array('GET' => 'get_file',
+						'PUT' => 'put_file',
 						'DELETE' => 'delete_file'),
-			'@/attachment/(\d+)@' => 
-				array('GET' => 'get_attachment', 
-						'PUT' => 'put_attachment', 
+			'@/attachment/(\d+)$@' =>
+				array('GET' => 'get_attachment',
+						'PUT' => 'put_attachment',
 						'DELETE' => 'delete_attachment'),
 		);
 	}
 
 	function handle_request() {
+		global $always_authenticate;
 
 		$path = $_SERVER['PATH_INFO'];
 		$method = $_SERVER['REQUEST_METHOD'];
 
 		log_app('REQUEST',"$method $path\n================");
 
+		$this->process_conditionals();
 		//$this->process_conditionals();
 
 		// exception case for HEAD (treat exactly as GET, but don't output)
@@ -324,26 +127,33 @@
 			$method = 'GET';
 		}
 
-		// lame. 
+		// redirect to /service in case no path is found.
 		if(strlen($path) == 0 || $path == '/') {
-			$path = '/service';
+			$this->redirect($this->get_service_url());
 		}
 
-		// authenticate regardless of the operation and set the current
-		// user. each handler will decide if auth is required or not.
-		$this->authenticate();
-
 		// dispatch
 		foreach($this->selectors as $regex => $funcs) {
 			if(preg_match($regex, $path, $matches)) {
-				if(isset($funcs[$method])) {
-					array_shift($matches);
-					call_user_func_array(array(&$this,$funcs[$method]), $matches);
-					exit();
-				} else {
-					// only allow what we have handlers for...
-					$this->not_allowed(array_keys($funcs));
+			if(isset($funcs[$method])) {
+
+				// authenticate regardless of the operation and set the current
+				// user. each handler will decide if auth is required or not.
+				$this->authenticate();
+				$u = wp_get_current_user();
+				if(!isset($u) || $u->ID == 0) {
+					if ($always_authenticate) {
+						$this->auth_required('Credentials required.');
+					}
 				}
+
+				array_shift($matches);
+				call_user_func_array(array(&$this,$funcs[$method]), $matches);
+				exit();
+			} else {
+				// only allow what we have handlers for...
+				$this->not_allowed(array_keys($funcs));
+			}
 			}
 		}
 
@@ -353,54 +163,67 @@
 
 	function get_service() {
 		log_app('function','get_service()');
-		$entries_url = $this->get_entries_url();
-		$categories_url = $this->get_categories_url(); 
-		$media_url = $this->get_attachments_url();
-		$accepted_content_types = join(',',$this->media_content_types);
-		$introspection = <<<EOD
-<service xmlns="http://purl.org/atom/app#" xmlns:atom="http://www.w3.org/2005/Atom"> 
-	<workspace title="WordPress Workspace"> 
-	    <collection href="$entries_url" title="Posts"> 
-		<atom:title>WordPress Posts</atom:title> 
-		<accept>entry</accept> 
-		<categories href="$categories_url" /> 
-	    </collection> 
-	    <collection href="$media_url" title="Media"> 
-		<atom:title>WordPress Media</atom:title> 
-		<accept>$accepted_content_types</accept> 
-	    </collection> 
-	</workspace> 
+
+		if( !current_user_can( 'edit_posts' ) )
+			$this->auth_required( __( 'Sorry, you do not have the right to access this blog.' ) );
+
+		$entries_url = attribute_escape($this->get_entries_url());
+		$categories_url = attribute_escape($this->get_categories_url());
+		$media_url = attribute_escape($this->get_attachments_url());
+                foreach ($this->media_content_types as $med) {
+                  $accepted_media_types = $accepted_media_types . "<accept>" . $med . "</accept>";
+                }
+		$atom_prefix="atom";
+		$atom_blogname=get_bloginfo('name');
+		$service_doc = <<<EOD
+<service xmlns="$this->ATOMPUB_NS" xmlns:$atom_prefix="$this->ATOM_NS">
+  <workspace>
+    <$atom_prefix:title>$atom_blogname Workspace</$atom_prefix:title>
+    <collection href="$entries_url">
+      <$atom_prefix:title>$atom_blogname Posts</$atom_prefix:title>
+      <accept>$this->ATOM_CONTENT_TYPE;type=entry</accept>
+      <categories href="$categories_url" />
+    </collection>
+    <collection href="$media_url">
+      <$atom_prefix:title>$atom_blogname Media</$atom_prefix:title>
+      $accepted_media_types
+    </collection>
+  </workspace>
 </service>
 
 EOD;
 
-		$this->output($introspection, $this->INTROSPECTION_CONTENT_TYPE); 
+		$this->output($service_doc, $this->SERVICE_CONTENT_TYPE);
 	}
 
-function get_categories_xml() {
-	log_app('function','get_categories_xml()');
-	$home = get_bloginfo_rss('home');
+	function get_categories_xml() {
+		log_app('function','get_categories_xml()');
 
-	$categories = "";
-	$cats = get_categories("hierarchical=0&hide_empty=0");
-	foreach ((array) $cats as $cat) {
-		$categories .= "    <category term=\"" . attribute_escape($cat->cat_name) .  "\" />\n";
-	}
-        $output = <<<EOD
-<app:categories xmlns:app="http://purl.org/atom/app#"
-	xmlns="http://www.w3.org/2005/Atom"
+		if( !current_user_can( 'edit_posts' ) )
+			$this->auth_required( __( 'Sorry, you do not have the right to access this blog.' ) );
+
+		$home = attribute_escape(get_bloginfo_rss('home'));
+
+		$categories = "";
+		$cats = get_categories("hierarchical=0&hide_empty=0");
+		foreach ((array) $cats as $cat) {
+			$categories .= "    <category term=\"" . attribute_escape($cat->name) .  "\" />\n";
+}
+		$output = <<<EOD
+<app:categories xmlns:app="$this->ATOMPUB_NS"
+	xmlns="$this->ATOM_NS"
 	fixed="yes" scheme="$home">
 	$categories
 </app:categories>
 EOD;
-	$this->output($output, $this->CATEGORIES_CONTENT_TYPE); 
+	$this->output($output, $this->CATEGORIES_CONTENT_TYPE);
 }
 
 	/*
 	 * Create Post (No arguments)
 	 */
 	function create_post() {
-		global $blog_id;
+		global $blog_id, $user_ID;
 		$this->get_accepted_content_type($this->atom_content_types);
 
 		$parser = new AtomParser();
@@ -408,33 +231,60 @@
 			$this->client_error();
 		}
 
-		$entry = $parser->entry;
+		$entry = array_pop($parser->feed->entries);
+
+		log_app('Received entry:', print_r($entry,true));
+
+		$catnames = array();
+		foreach($entry->categories as $cat)
+			array_push($catnames, $cat["term"]);
+
+		$wp_cats = get_categories(array('hide_empty' => false));
+
+		$post_category = array();
+
+		foreach($wp_cats as $cat) {
+			if(in_array($cat->name, $catnames))
+				array_push($post_category, $cat->term_id);
+		}
 
 		$publish = (isset($entry->draft) && trim($entry->draft) == 'yes') ? false : true;
 
 		$cap = ($publish) ? 'publish_posts' : 'edit_posts';
 
 		if(!current_user_can($cap))
-			$this->auth_required('Sorry, you do not have the right to edit/publish new posts.');
+			$this->auth_required(__('Sorry, you do not have the right to edit/publish new posts.'));
 
 		$blog_ID = (int ) $blog_id;
 		$post_status = ($publish) ? 'publish' : 'draft';
-		$post_author = (int) $user->ID;
-		$post_title = $entry->title;
-		$post_content = $entry->content;
-		$post_excerpt = $entry->summary;
-		$post_date = current_time('mysql');
-		$post_date_gmt = current_time('mysql', 1);
+		$post_author = (int) $user_ID;
+		$post_title = $entry->title[1];
+		$post_content = $entry->content[1];
+		$post_excerpt = $entry->summary[1];
+		$pubtimes = $this->get_publish_time($entry->published);
+		$post_date = $pubtimes[0];
+		$post_date_gmt = $pubtimes[1];
+
+		if ( isset( $_SERVER['HTTP_SLUG'] ) )
+			$post_name = $_SERVER['HTTP_SLUG'];
 
-		$post_data = compact('blog_ID', 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt');
+		$post_data = compact('blog_ID', 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'post_name');
 
+		$this->escape($post_data);
 		log_app('Inserting Post. Data:', print_r($post_data,true));
 
 		$postID = wp_insert_post($post_data);
+		if ( is_wp_error( $postID ) )
+			$this->internal_error($postID->get_error_message());
 
-		if (!$postID) {
-			$this->internal_error('Sorry, your entry could not be posted. Something wrong happened.');
-		}
+		if (!$postID)
+			$this->internal_error(__('Sorry, your entry could not be posted. Something wrong happened.'));
+
+		// getting warning here about unable to set headers
+		// because something in the cache is printing to the buffer
+		// could we clean up wp_set_post_categories or cache to not print
+		// this could affect our ability to send back the right headers
+		@wp_set_post_categories($postID, $post_category);
 
 		$output = $this->get_entry($postID);
 
@@ -443,8 +293,11 @@
 	}
 
 	function get_post($postID) {
-
 		global $entry;
+
+		if( !current_user_can( 'edit_post', $postID ) )
+			$this->auth_required( __( 'Sorry, you do not have the right to access this post.' ) );
+
 		$this->set_current_entry($postID);
 		$output = $this->get_entry($postID);
 		log_app('function',"get_post($postID)");
@@ -453,7 +306,6 @@
 	}
 
 	function put_post($postID) {
-
 		// checked for valid content-types (atom+xml)
 		// quick check and exit
 		$this->get_accepted_content_type($this->atom_content_types);
@@ -463,36 +315,45 @@
 			$this->bad_request();
 		}
 
-		$parsed = $parser->entry;
+		$parsed = array_pop($parser->feed->entries);
+
+		log_app('Received UPDATED entry:', print_r($parsed,true));
 
 		// check for not found
 		global $entry;
-		$entry = $GLOBALS['entry'];
 		$this->set_current_entry($postID);
-		$this->escape($GLOBALS['entry']);
 
 		if(!current_user_can('edit_post', $entry['ID']))
-			$this->auth_required('Sorry, you do not have the right to edit this post.');
+			$this->auth_required(__('Sorry, you do not have the right to edit this post.'));
 
 		$publish = (isset($parsed->draft) && trim($parsed->draft) == 'yes') ? false : true;
 
 		extract($entry);
 
-		$post_title = $parsed->title;
-		$post_content = $parsed->content;
-		$post_excerpt = $parsed->summary;
+		$post_title = $parsed->title[1];
+		$post_content = $parsed->content[1];
+		$post_excerpt = $parsed->summary[1];
+		$pubtimes = $this->get_publish_time($entry->published);
+		$post_date = $pubtimes[0];
+		$post_date_gmt = $pubtimes[1];
+		$pubtimes = $this->get_publish_time($parsed->updated);
+		$post_modified = $pubtimes[0];
+		$post_modified_gmt = $pubtimes[1];
 
 		// let's not go backwards and make something draft again.
 		if(!$publish && $post_status == 'draft') {
 			$post_status = ($publish) ? 'publish' : 'draft';
+		} elseif($publish) {
+			$post_status = 'publish';
 		}
 
-		$postdata = compact('ID', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt');
+		$postdata = compact('ID', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt');
+		$this->escape($postdata);
 
 		$result = wp_update_post($postdata);
 
 		if (!$result) {
-			$this->internal_error('For some strange yet very annoying reason, this post could not be edited.');
+			$this->internal_error(__('For some strange yet very annoying reason, this post could not be edited.'));
 		}
 
 		log_app('function',"put_post($postID)");
@@ -506,7 +367,7 @@
 		$this->set_current_entry($postID);
 
 		if(!current_user_can('edit_post', $postID)) {
-			$this->auth_required('Sorry, you do not have the right to delete this post.');
+			$this->auth_required(__('Sorry, you do not have the right to delete this post.'));
 		}
 
 		if ($entry['post_type'] == 'attachment') {
@@ -515,7 +376,7 @@
 			$result = wp_delete_post($postID);
 
 			if (!$result) {
-				$this->internal_error('For some strange yet very annoying reason, this post could not be deleted.');
+				$this->internal_error(__('For some strange yet very annoying reason, this post could not be deleted.'));
 			}
 
 			log_app('function',"delete_post($postID)");
@@ -525,8 +386,9 @@
 	}
 
 	function get_attachment($postID = NULL) {
+		if( !current_user_can( 'upload_files' ) )
+			$this->auth_required( __( 'Sorry, you do not have permission to upload files.' ) );
 
-		global $entry;
 		if (!isset($postID)) {
 			$this->get_attachments();
 		} else {
@@ -538,12 +400,11 @@
 	}
 
 	function create_attachment() {
-		global $wp, $wpdb, $wp_query, $blog_id;
 
 		$type = $this->get_accepted_content_type();
 
 		if(!current_user_can('upload_files'))
-			$this->auth_required('You do not have permission to upload files.');
+			$this->auth_required(__('You do not have permission to upload files.'));
 
 		$fp = fopen("php://input", "rb");
 		$bits = NULL;
@@ -559,7 +420,7 @@
 			$slug = sanitize_file_name( $_SERVER['HTTP_TITLE'] );
 		elseif ( empty( $slug ) ) // just make a random name
 			$slug = substr( md5( uniqid( microtime() ) ), 0, 7);
-		$ext = preg_replace( '|.*/([a-z]+)|', '$1', $_SERVER['CONTENT_TYPE'] );
+		$ext = preg_replace( '|.*/([a-z0-9]+)|', '$1', $_SERVER['CONTENT_TYPE'] );
 		$slug = "$slug.$ext";
 		$file = wp_upload_bits( $slug, NULL, $bits);
 
@@ -567,9 +428,8 @@
 
 		$url = $file['url'];
 		$file = $file['file'];
-		$filename = basename($file);
 
-		$header = apply_filters('wp_create_file_in_uploads', $file); // replicate
+		do_action('wp_create_file_in_uploads', $file); // replicate
 
 		// Construct the attachment array
 		$attachment = array(
@@ -582,11 +442,10 @@
 			);
 
 		// Save the data
-		$postID = wp_insert_attachment($attachment, $file, $post);
+		$postID = wp_insert_attachment($attachment, $file);
 
-		if (!$postID) {
+		if (!$postID)
 			$this->internal_error(__('Sorry, your entry could not be posted. Something wrong happened.'));
-		}
 
 		$output = $this->get_entry($postID, 'attachment');
 
@@ -595,7 +454,6 @@
 	}
 
 	function put_attachment($postID) {
-
 		// checked for valid content-types (atom+xml)
 		// quick check and exit
 		$this->get_accepted_content_type($this->atom_content_types);
@@ -605,24 +463,25 @@
 			$this->bad_request();
 		}
 
-		$parsed = $parser->entry;
+		$parsed = array_pop($parser->feed->entries);
 
 		// check for not found
 		global $entry;
 		$this->set_current_entry($postID);
-		$this->escape($entry);
 
 		if(!current_user_can('edit_post', $entry['ID']))
 			$this->auth_required(__('Sorry, you do not have the right to edit this post.'));
 
-		$publish = (isset($parsed->draft) && trim($parsed->draft) == 'yes') ? false : true;
-
 		extract($entry);
 
-		$post_title = $parsed->title;
-		$post_content = $parsed->content;
+		$post_title = $parsed->title[1];
+		$post_content = $parsed->content[1];
+		$pubtimes = $this->get_publish_time($parsed->updated);
+		$post_modified = $pubtimes[0];
+		$post_modified_gmt = $pubtimes[1];
 
-		$postdata = compact('ID', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt');
+		$postdata = compact('ID', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'post_modified', 'post_modified_gmt');
+		$this->escape($postdata);
 
 		$result = wp_update_post($postdata);
 
@@ -646,6 +505,10 @@
 		}
 
 		$location = get_post_meta($entry['ID'], '_wp_attached_file', true);
+		$filetype = wp_check_filetype($location);
+
+		if(!isset($location) || 'attachment' != $entry['post_type'] || empty($filetype['ext']))
+			$this->internal_error(__('Error ocurred while accessing post metadata for file location.'));
 
 		// delete file
 		@unlink($location);
@@ -678,7 +541,9 @@
 		if(!isset($location) || 'attachment' != $entry['post_type'] || empty($filetype['ext']))
 			$this->internal_error(__('Error ocurred while accessing post metadata for file location.'));
 
+		status_header('200');
 		header('Content-Type: ' . $entry['post_mime_type']);
+		header('Connection: close');
 
 		$fp = fopen($location, "rb");
 		while(!feof($fp)) {
@@ -687,13 +552,11 @@
 		fclose($fp);
 
 		log_app('function',"get_file($postID)");
-		$this->ok();
+		exit;
 	}
 
 	function put_file($postID) {
 
-		$type = $this->get_accepted_content_type();
-
 		// first check if user can upload
 		if(!current_user_can('upload_files'))
 			$this->auth_required(__('You do not have permission to upload files.'));
@@ -721,113 +584,96 @@
 		fclose($fp);
 		fclose($localfp);
 
+		$ID = $entry['ID'];
+		$pubtimes = $this->get_publish_time($entry->published);
+		$post_date = $pubtimes[0];
+		$post_date_gmt = $pubtimes[1];
+		$pubtimes = $this->get_publish_time($parsed->updated);
+		$post_modified = $pubtimes[0];
+		$post_modified_gmt = $pubtimes[1];
+
+		$post_data = compact('ID', 'post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt');
+		$result = wp_update_post($post_data);
+
+		if (!$result) {
+			$this->internal_error(__('Sorry, your entry could not be posted. Something wrong happened.'));
+		}
+
 		log_app('function',"put_file($postID)");
 		$this->ok();
 	}
 
 	function get_entries_url($page = NULL) {
-		global $use_querystring;
-		$url = get_bloginfo('url') . '/' . $this->script_name;
-		if ($use_querystring) {
-			$url .= '?action=/' . $this->ENTRIES_PATH;
-			if(isset($page) && is_int($page)) {
-				$url .= "&amp;eid=$page";
-			}
+		if($GLOBALS['post_type'] == 'attachment') {
+			$path = $this->MEDIA_PATH;
 		} else {
-			$url .= '/' . $this->ENTRIES_PATH;
-			if(isset($page) && is_int($page)) {
-				$url .= "/$page";
-			}
+			$path = $this->ENTRIES_PATH;
+		}
+		$url = $this->app_base . $path;
+		if(isset($page) && is_int($page)) {
+			$url .= "/$page";
 		}
 		return $url;
 	}
 
 	function the_entries_url($page = NULL) {
-		$url = $this->get_entries_url($page);
-		echo $url;
+		echo $this->get_entries_url($page);
 	}
 
-	function get_categories_url($page = NULL) {
-		global $use_querystring;
-		$url = get_bloginfo('url') . '/' . $this->script_name;
-		if ($use_querystring) {
-			$url .= '?action=/' . $this->CATEGORIES_PATH;
-		} else {
-			$url .= '/' . $this->CATEGORIES_PATH;
-		}
-		return $url;
+	function get_categories_url($deprecated = '') {
+		return $this->app_base . $this->CATEGORIES_PATH;
 	}
 
 	function the_categories_url() {
-		$url = $this->get_categories_url();
-		echo $url;
-    }
+		echo $this->get_categories_url();
+	}
 
 	function get_attachments_url($page = NULL) {
-		global $use_querystring;
-		$url = get_bloginfo('url') . '/' . $this->script_name;
-		if ($use_querystring) {
-			$url .= '?action=/' . $this->MEDIA_PATH;
-			if(isset($page) && is_int($page)) {
-				$url .= "&amp;eid=$page";
-			}
-		} else {
-			$url .= '/' . $this->MEDIA_PATH;
-			if(isset($page) && is_int($page)) {
-				$url .= "/$page";
-			}
+		$url = $this->app_base . $this->MEDIA_PATH;
+		if(isset($page) && is_int($page)) {
+			$url .= "/$page";
 		}
 		return $url;
 	}
 
 	function the_attachments_url($page = NULL) {
-		$url = $this->get_attachments_url($page);
-		echo $url;
+		echo $this->get_attachments_url($page);
 	}
 
+	function get_service_url() {
+		return $this->app_base . $this->SERVICE_PATH;
+	}
 
 	function get_entry_url($postID = NULL) {
-		global $use_querystring;
 		if(!isset($postID)) {
 			global $post;
-			$postID = (int) $GLOBALS['post']->ID;
+			$postID = (int) $post->ID;
 		}
 
-		if ($use_querystring) {
-			$url = get_bloginfo('url') . '/' . $this->script_name . '?action=/' . $this->ENTRY_PATH . "&amp;eid=$postID";
-		} else {
-			$url = get_bloginfo('url') . '/' . $this->script_name . '/' . $this->ENTRY_PATH . "/$postID";
-		}
+		$url = $this->app_base . $this->ENTRY_PATH . "/$postID";
 
 		log_app('function',"get_entry_url() = $url");
 		return $url;
 	}
 
 	function the_entry_url($postID = NULL) {
-		$url = $this->get_entry_url($postID);
-		echo $url;
+		echo $this->get_entry_url($postID);
 	}
 
 	function get_media_url($postID = NULL) {
-		global $use_querystring;
 		if(!isset($postID)) {
 			global $post;
-			$postID = (int) $GLOBALS['post']->ID;
+			$postID = (int) $post->ID;
 		}
 
-		if ($use_querystring) {
-			$url = get_bloginfo('url') . '/' . $this->script_name . '?action=/' . $this->MEDIA_SINGLE_PATH ."&amp;eid=$postID";
-		} else {
-			$url = get_bloginfo('url') . '/' . $this->script_name . '/' . $this->MEDIA_SINGLE_PATH ."/$postID";
-		}
+		$url = $this->app_base . $this->MEDIA_SINGLE_PATH ."/file/$postID";
 
 		log_app('function',"get_media_url() = $url");
 		return $url;
 	}
 
 	function the_media_url($postID = NULL) {
-		$url = $this->get_media_url($postID);
-		echo $url;
+		echo $this->get_media_url($postID);
 	}
 
 	function set_current_entry($postID) {
@@ -847,13 +693,6 @@
 		return;
 	}
 
-	function get_posts_count() {
-		global $wpdb;
-		log_app('function',"get_posts_count()");
-		return $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->posts WHERE post_date_gmt < '" . gmdate("Y-m-d H:i:s",time()) . "'");
-	}
-
-
 	function get_posts($page = 1, $post_type = 'post') {
 			log_app('function',"get_posts($page, '$post_type')");
 			$feed = $this->get_feed($page, $post_type);
@@ -861,13 +700,14 @@
 	}
 
 	function get_attachments($page = 1, $post_type = 'attachment') {
-			log_app('function',"get_attachments($page, '$post_type')");
-			$feed = $this->get_feed($page, $post_type);
-			$this->output($feed);
+	    log_app('function',"get_attachments($page, '$post_type')");
+	    $GLOBALS['post_type'] = $post_type;
+	    $feed = $this->get_feed($page, $post_type);
+	    $this->output($feed);
 	}
 
 	function get_feed($page = 1, $post_type = 'post') {
-		global $post, $wp, $wp_query, $posts, $wpdb, $blog_id, $post_cache;
+		global $post, $wp, $wp_query, $posts, $wpdb, $blog_id;
 		log_app('function',"get_feed($page, '$post_type')");
 		ob_start();
 
@@ -877,78 +717,47 @@
 		$page = (int) $page;
 
 		$count = get_option('posts_per_rss');
-		$query = "paged=$page&posts_per_page=$count&order=DESC";
-		if($post_type == 'attachment') {
-			$query .= "&post_type=$post_type";
-		}
-		query_posts($query);
+
+		wp('what_to_show=posts&posts_per_page=' . $count . '&offset=' . ($count * ($page-1) . '&orderby=modified'));
+
 		$post = $GLOBALS['post'];
 		$posts = $GLOBALS['posts'];
 		$wp = $GLOBALS['wp'];
 		$wp_query = $GLOBALS['wp_query'];
 		$wpdb = $GLOBALS['wpdb'];
 		$blog_id = (int) $GLOBALS['blog_id'];
-		$post_cache = $GLOBALS['post_cache'];
-
+		log_app('function',"query_posts(# " . print_r($wp_query, true) . "#)");
 
-		$total_count = $this->get_posts_count();
-		$last_page = (int) ceil($total_count / $count);
+		log_app('function',"total_count(# $wp_query->max_num_pages #)");
+		$last_page = $wp_query->max_num_pages;
 		$next_page = (($page + 1) > $last_page) ? NULL : $page + 1;
-		$prev_page = ($page - 1) < 1 ? NULL : $page - 1; 
+		$prev_page = ($page - 1) < 1 ? NULL : $page - 1;
 		$last_page = ((int)$last_page == 1 || (int)$last_page == 0) ? NULL : (int) $last_page;
-?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://purl.org/atom/app#" xml:lang="<?php echo get_option('rss_language'); ?>">
+		$self_page = $page > 1 ? $page : NULL;
+?><feed xmlns="<?php echo $this->ATOM_NS ?>" xmlns:app="<?php echo $this->ATOMPUB_NS ?>" xml:lang="<?php echo get_option('rss_language'); ?>">
 <id><?php $this->the_entries_url() ?></id>
 <updated><?php echo mysql2date('Y-m-d\TH:i:s\Z', get_lastpostmodified('GMT')); ?></updated>
 <title type="text"><?php bloginfo_rss('name') ?></title>
 <subtitle type="text"><?php bloginfo_rss("description") ?></subtitle>
-<link rel="first" type="application/atom+xml" href="<?php $this->the_entries_url() ?>" />
+<link rel="first" type="<?php echo $this->ATOM_CONTENT_TYPE ?>" href="<?php $this->the_entries_url() ?>" />
 <?php if(isset($prev_page)): ?>
-<link rel="previous" type="application/atom+xml" href="<?php $this->the_entries_url($prev_page) ?>" />
+<link rel="previous" type="<?php echo $this->ATOM_CONTENT_TYPE ?>" href="<?php $this->the_entries_url($prev_page) ?>" />
 <?php endif; ?>
 <?php if(isset($next_page)): ?>
-<link rel="next" type="application/atom+xml" href="<?php $this->the_entries_url($next_page) ?>" />
+<link rel="next" type="<?php echo $this->ATOM_CONTENT_TYPE ?>" href="<?php $this->the_entries_url($next_page) ?>" />
 <?php endif; ?>
-<link rel="last" type="application/atom+xml" href="<?php $this->the_entries_url($last_page) ?>" />
-<link rel="self" type="application/atom+xml" href="<?php $this->the_entries_url() ?>" />
+<link rel="last" type="<?php echo $this->ATOM_CONTENT_TYPE ?>" href="<?php $this->the_entries_url($last_page) ?>" />
+<link rel="self" type="<?php echo $this->ATOM_CONTENT_TYPE ?>" href="<?php $this->the_entries_url($self_page) ?>" />
 <rights type="text">Copyright <?php echo mysql2date('Y', get_lastpostdate('blog')); ?></rights>
-<generator uri="http://wordpress.com/" version="1.0.5-dc">WordPress.com Atom API</generator>
-<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); 
-$post = $GLOBALS['post'];
-?>
-<entry>
-		<id><?php the_guid($post->ID); ?></id>
-		<title type="html"><![CDATA[<?php the_title() ?>]]></title>
-		<updated><?php echo get_post_modified_time('Y-m-d\TH:i:s\Z', true); ?></updated>
-		<published><?php echo get_post_time('Y-m-d\TH:i:s\Z', true); ?></published>
-		<app:control>
-			<app:draft><?php echo ($GLOBALS['post']->post_status == 'draft' ? 'yes' : 'no') ?></app:draft>
-		</app:control>
-		<author>
-			<name><?php the_author()?></name>
-			<email><?php the_author_email()?></email>
-	<?php if (get_the_author_url() && get_the_author_url() != 'http://') { ?>
-		 <uri><?php the_author_url()?></uri>
-	<?php } ?>
-		</author>
-	<?php if($GLOBALS['post']->post_status == 'attachment') { ?>
-		<link rel="edit" href="<?php $this->the_entry_url() ?>" />
-		<link rel="edit-media" href="<?php $this->the_media_url() ?>" />
-	<?php } else { ?>
-		<link href="<?php permalink_single_rss() ?>" />
-		<link rel="edit" href="<?php $this->the_entry_url() ?>" />
-	<?php } ?>
-	<?php foreach(get_the_category() as $category) { ?>
-	 <category scheme="<?php bloginfo_rss('home') ?>" term="<?php echo $category->cat_name?>" />
-	<?php } ?>   <summary type="html"><![CDATA[<?php the_excerpt_rss(); ?>]]></summary>
-	<?php if ( strlen( $GLOBALS['post']->post_content ) ) : ?>
-	<content type="html"><![CDATA[<?php echo get_the_content('', 0, '') ?>]]></content>
-<?php endif; ?>
-	</entry>
-<?php
-	endwhile; 
-	endif;
+<?php the_generator( 'atom' ); ?>
+<?php if ( have_posts() ) {
+			while ( have_posts() ) {
+				the_post();
+				$this->echo_entry();
+			}
+		}
 ?></feed>
-<?php 
+<?php
 		$feed = ob_get_contents();
 		ob_end_clean();
 		return $feed;
@@ -957,7 +766,6 @@
 	function get_entry($postID, $post_type = 'post') {
 		log_app('function',"get_entry($postID, '$post_type')");
 		ob_start();
-		global $posts, $post, $wp_query, $wp, $wpdb, $blog_id, $post_cache;
 		switch($post_type) {
 			case 'post':
 				$varname = 'p';
@@ -967,61 +775,66 @@
 				break;
 		}
 		query_posts($varname . '=' . $postID);
-		if ( have_posts() ) : while ( have_posts() ) : the_post();
-		$post = $GLOBALS['post'];
-		?>
-		<?php log_app('$post',print_r($GLOBALS['post'],true)); ?>
-<entry xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://purl.org/atom/app#" xml:lang="<?php echo get_option('rss_language'); ?>">
-	<id><?php the_guid($post->ID); ?></id>
-	<title type="html"><![CDATA[<?php the_title_rss() ?>]]></title>
+		if ( have_posts() ) {
+			while ( have_posts() ) {
+				the_post();
+				$this->echo_entry();
+				log_app('$post',print_r($GLOBALS['post'],true));
+				$entry = ob_get_contents();
+				break;
+			}
+		}
+		ob_end_clean();
 
+		log_app('get_entry returning:',$entry);
+		return $entry;
+	}
+
+	function echo_entry() { ?>
+<entry xmlns="<?php echo $this->ATOM_NS ?>"
+       xmlns:app="<?php echo $this->ATOMPUB_NS ?>" xml:lang="<?php echo get_option('rss_language'); ?>">
+	<id><?php the_guid($GLOBALS['post']->ID); ?></id>
+<?php list($content_type, $content) = prep_atom_text_construct(get_the_title()); ?>
+	<title type="<?php echo $content_type ?>"><?php echo $content ?></title>
 	<updated><?php echo get_post_modified_time('Y-m-d\TH:i:s\Z', true); ?></updated>
 	<published><?php echo get_post_time('Y-m-d\TH:i:s\Z', true); ?></published>
+	<app:edited><?php echo get_post_modified_time('Y-m-d\TH:i:s\Z', true); ?></app:edited>
 	<app:control>
 		<app:draft><?php echo ($GLOBALS['post']->post_status == 'draft' ? 'yes' : 'no') ?></app:draft>
 	</app:control>
 	<author>
 		<name><?php the_author()?></name>
-		<email><?php the_author_email()?></email>
+<?php if (get_the_author_url() && get_the_author_url() != 'http://') { ?>
 		<uri><?php the_author_url()?></uri>
+<?php } ?>
 	</author>
 <?php if($GLOBALS['post']->post_type == 'attachment') { ?>
-	<link rel="edit" href="<?php $this->the_entry_url() ?>" />
 	<link rel="edit-media" href="<?php $this->the_media_url() ?>" />
 	<content type="<?php echo $GLOBALS['post']->post_mime_type ?>" src="<?php the_guid(); ?>"/>
 <?php } else { ?>
-	<link href="<?php permalink_single_rss() ?>" />
-	<link rel="edit" href="<?php $this->the_entry_url() ?>" />
+	<link href="<?php the_permalink_rss() ?>" />
+<?php if ( strlen( $GLOBALS['post']->post_content ) ) :
+list($content_type, $content) = prep_atom_text_construct(get_the_content()); ?>
+	<content type="<?php echo $content_type ?>"><?php echo $content ?></content>
+<?php endif; ?>
 <?php } ?>
+	<link rel="edit" href="<?php $this->the_entry_url() ?>" />
 <?php foreach(get_the_category() as $category) { ?>
-	<category scheme="<?php bloginfo_rss('home') ?>" term="<?php echo $category->cat_name?>" />
-	<summary type="html"><![CDATA[<?php the_excerpt_rss(); ?>]]></summary>
-<?php }
-	if ( strlen( $GLOBALS['post']->post_content ) ) : ?>
-	<content type="html"><![CDATA[<?php echo get_the_content('', 0, '') ?>]]></content>
-<?php endif; ?>
+	<category scheme="<?php bloginfo_rss('home') ?>" term="<?php echo $category->name?>" />
+<?php } ?>
+<?php list($content_type, $content) = prep_atom_text_construct(get_the_excerpt()); ?>
+	<summary type="<?php echo $content_type ?>"><?php echo $content ?></summary>
 </entry>
-<?php
-		$entry = ob_get_contents();
-		break;
-		endwhile;
-		else:
-			$this->auth_required(__("Access Denied."));
-		endif;
-		ob_end_clean();
-
-		log_app('get_entry returning:',$entry);
-		return $entry; 
-	}
+<?php }
 
-	function ok() { 
+	function ok() {
 		log_app('Status','200: OK');
 		header('Content-Type: text/plain');
 		status_header('200');
 		exit;
 	}
 
-	function no_content() { 
+	function no_content() {
 		log_app('Status','204: No Content');
 		header('Content-Type: text/plain');
 		status_header('204');
@@ -1073,15 +886,40 @@
 		exit;
 	}
 
+	function redirect($url) {
+
+		log_app('Status','302: Redirect');
+		$escaped_url = attribute_escape($url);
+		$content = <<<EOD
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
+<html>
+  <head>
+    <title>302 Found</title>
+  </head>
+<body>
+  <h1>Found</h1>
+  <p>The document has moved <a href="$escaped_url">here</a>.</p>
+  </body>
+</html>
+
+EOD;
+		header('HTTP/1.1 302 Moved');
+		header('Content-Type: text/html');
+		header('Location: ' . $url);
+		echo $content;
+		exit;
+
+	}
+
+
 	function client_error($msg = 'Client Error') {
-		log_app('Status','400: Client Errir');
+		log_app('Status','400: Client Error');
 		header('Content-Type: text/plain');
 		status_header('400');
 		exit;
 	}
 
 	function created($post_ID, $content, $post_type = 'post') {
-		global $use_querystring;
 		log_app('created()::$post_ID',"$post_ID, $post_type");
 		$edit = $this->get_entry_url($post_ID);
 		switch($post_type) {
@@ -1089,14 +927,10 @@
 				$ctloc = $this->get_entry_url($post_ID);
 				break;
 			case 'attachment':
-				if ($use_querystring) {
-					$edit = get_bloginfo('url') . '/' . $this->script_name . "?action=/attachments&amp;eid=$post_ID";
-				} else {
-					$edit = get_bloginfo('url') . '/' . $this->script_name . "/attachments/$post_ID";
-				}
+				$edit = $this->app_base . "attachments/$post_ID";
 				break;
 		}
-		header('Content-Type: application/atom+xml');
+		header("Content-Type: $this->ATOM_CONTENT_TYPE");
 		if(isset($ctloc))
 			header('Content-Location: ' . $ctloc);
 		header('Location: ' . $edit);
@@ -1109,15 +943,27 @@
 		log_app('Status','401: Auth Required');
 		nocache_headers();
 		header('WWW-Authenticate: Basic realm="WordPress Atom Protocol"');
-		header('WWW-Authenticate: Form action="' . get_option('siteurl') . '/wp-login.php"', false); 
 		header("HTTP/1.1 401 $msg");
 		header('Status: ' . $msg);
-		header('Content-Type: plain/text');
-		echo $msg;
+		header('Content-Type: text/html');
+		$content = <<<EOD
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
+<html>
+  <head>
+    <title>401 Unauthorized</title>
+  </head>
+<body>
+    <h1>401 Unauthorized</h1>
+    <p>$msg</p>
+  </body>
+</html>
+
+EOD;
+		echo $content;
 		exit;
 	}
 
-	function output($xml, $ctype = "application/atom+xml") {
+	function output($xml, $ctype = 'application/atom+xml') {
 			status_header('200');
 			$xml = '<?xml version="1.0" encoding="' . strtolower(get_option('blog_charset')) . '"?>'."\n".$xml;
 			header('Connection: close');
@@ -1145,8 +991,6 @@
 		}
 	}
 
-
-
 	/*
 	 * Access credential through various methods and perform login
 	 */
@@ -1159,13 +1003,14 @@
 		// if using mod_rewrite/ENV hack
 		// http://www.besthostratings.com/articles/http-auth-php-cgi.html
 		if(isset($_SERVER['HTTP_AUTHORIZATION'])) {
-			list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = 
+			list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) =
 				explode(':', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
 		}
 
 		// If Basic Auth is working...
 		if(isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) {
 			$login_data = array('login' => $_SERVER['PHP_AUTH_USER'],	'password' => $_SERVER['PHP_AUTH_PW']);
+			log_app("Basic Auth",$login_data['login']);
 		} else {
 			// else, do cookie-based authentication
 			if (function_exists('wp_get_cookie_login')) {
@@ -1198,18 +1043,16 @@
 		log_app("get_accepted_content_type", "type=$type, subtype=$subtype");
 
 		foreach($types as $t) {
-			list($acceptedType,$acceptedSubtype) = explode('/',$t); 
+			list($acceptedType,$acceptedSubtype) = explode('/',$t);
 			if($acceptedType == '*' || $acceptedType == $type) {
 				if($acceptedSubtype == '*' || $acceptedSubtype == $subtype)
-					return $type;
+					return $type . "/" . $subtype;
 			}
 		}
 
 		$this->invalid_media();
 	}
 
-
-
 	function process_conditionals() {
 
 		if(empty($this->params)) return;
@@ -1233,9 +1076,9 @@
 		@header("ETag: $wp_etag");
 
 		// Support for Conditional GET
-		if (isset($_SERVER['HTTP_IF_NONE_MATCH'])) 
+		if (isset($_SERVER['HTTP_IF_NONE_MATCH']))
 			$client_etag = stripslashes($_SERVER['HTTP_IF_NONE_MATCH']);
-		else 
+		else
 			$client_etag = false;
 
 		$client_last_modified = trim( $_SERVER['HTTP_IF_MODIFIED_SINCE']);
@@ -1253,6 +1096,28 @@
 		}
 	}
 
+	function rfc3339_str2time($str) {
+
+	    $match = false;
+	    if(!preg_match("/(\d{4}-\d{2}-\d{2})T(\d{2}\:\d{2}\:\d{2})\.?\d{0,3}(Z|[+-]+\d{2}\:\d{2})/", $str, $match))
+			return false;
+
+	    if($match[3] == 'Z')
+			$match[3] == '+0000';
+
+	    return strtotime($match[1] . " " . $match[2] . " " . $match[3]);
+	}
+
+	function get_publish_time($published) {
+
+	    $pubtime = $this->rfc3339_str2time($published);
+
+	    if(!$pubtime) {
+			return array(current_time('mysql'),current_time('mysql',1));
+	    } else {
+			return array(date("Y-m-d H:i:s", $pubtime), gmdate("Y-m-d H:i:s", $pubtime));
+	    }
+	}
 
 }
 
diff -x .svn -aruN 2.2.2.src/wp-atom.php 2.5.src/wp-atom.php
--- 2.2.2.src/wp-atom.php	2007-02-22 20:50:05.000000000 -0600
+++ 2.5.src/wp-atom.php	2007-08-02 19:45:06.000000000 -0500
@@ -1,7 +1,7 @@
 <?php
 
 if (empty($wp)) {
-	require_once('wp-config.php');
+	require_once('./wp-config.php');
 	wp('feed=atom');
 }
 
diff -x .svn -aruN 2.2.2.src/wp-blog-header.php 2.5.src/wp-blog-header.php
--- 2.2.2.src/wp-blog-header.php	2007-05-09 11:17:41.000000000 -0500
+++ 2.5.src/wp-blog-header.php	2008-02-21 17:55:11.000000000 -0600
@@ -8,7 +8,7 @@
 	require_once( dirname(__FILE__) . '/wp-includes/classes.php');
 	require_once( dirname(__FILE__) . '/wp-includes/functions.php');
 	require_once( dirname(__FILE__) . '/wp-includes/plugin.php');
-	wp_die("There doesn't seem to be a <code>wp-config.php</code> file. I need this before we can get started. Need more help? <a href='http://codex.wordpress.org/Editing_wp-config.php'>We got it</a>. You can <a href='{$path}setup-config.php'>create a <code>wp-config.php</code> file through a web interface</a>, but this doesn't work for all server setups. The safest way is to manually create the file.", "WordPress &rsaquo; Error");
+	wp_die("There doesn't seem to be a <code>wp-config.php</code> file. I need this before we can get started. Need more help? <a href='http://codex.wordpress.org/Editing_wp-config.php'>We got it</a>. You can create a <code>wp-config.php</code> file through a web interface, but this doesn't work for all server setups. The safest way is to manually create the file.</p><p><a href='{$path}setup-config.php' class='button'>Create a Configuration File</a>", "WordPress &rsaquo; Error");
 }
 
 $wp_did_header = true;
@@ -16,7 +16,6 @@
 require_once( dirname(__FILE__) . '/wp-config.php');
 
 wp();
-gzip_compression();
 
 require_once(ABSPATH . WPINC . '/template-loader.php');
 
diff -x .svn -aruN 2.2.2.src/wp-comments-post.php 2.5.src/wp-comments-post.php
--- 2.2.2.src/wp-comments-post.php	2007-03-28 12:34:42.000000000 -0500
+++ 2.5.src/wp-comments-post.php	2008-02-04 14:27:45.000000000 -0600
@@ -1,9 +1,9 @@
 <?php
-if ($_SERVER["REQUEST_METHOD"] != "POST") {
-    header('Allow: POST');
-	header("HTTP/1.1 405 Method Not Allowed");
-	header("Content-type: text/plain");
-    exit;
+if ( 'POST' != $_SERVER['REQUEST_METHOD'] ) {
+	header('Allow: POST');
+	header('HTTP/1.1 405 Method Not Allowed');
+	header('Content-Type: text/plain');
+	exit;
 }
 require( dirname(__FILE__) . '/wp-config.php' );
 
@@ -16,10 +16,10 @@
 if ( empty($status->comment_status) ) {
 	do_action('comment_id_not_found', $comment_post_ID);
 	exit;
-} elseif ( 'closed' ==  $status->comment_status ) {
+} elseif ( !comments_open($comment_post_ID) ) {
 	do_action('comment_closed', $comment_post_ID);
 	wp_die( __('Sorry, comments are closed for this item.') );
-} elseif ( 'draft' == $status->post_status ) {
+} elseif ( in_array($status->post_status, array('draft', 'pending') ) ) {
 	do_action('comment_on_draft', $comment_post_ID);
 	exit;
 }
@@ -63,11 +63,11 @@
 $comment_id = wp_new_comment( $commentdata );
 
 $comment = get_comment($comment_id);
-if ( !$user->ID ) :
+if ( !$user->ID ) {
 	setcookie('comment_author_' . COOKIEHASH, $comment->comment_author, time() + 30000000, COOKIEPATH, COOKIE_DOMAIN);
 	setcookie('comment_author_email_' . COOKIEHASH, $comment->comment_author_email, time() + 30000000, COOKIEPATH, COOKIE_DOMAIN);
 	setcookie('comment_author_url_' . COOKIEHASH, clean_url($comment->comment_author_url), time() + 30000000, COOKIEPATH, COOKIE_DOMAIN);
-endif;
+}
 
 $location = ( empty($_POST['redirect_to']) ? get_permalink($comment_post_ID) : $_POST['redirect_to'] ) . '#comment-' . $comment_id;
 $location = apply_filters('comment_post_redirect', $location, $comment);
diff -x .svn -aruN 2.2.2.src/wp-commentsrss2.php 2.5.src/wp-commentsrss2.php
--- 2.2.2.src/wp-commentsrss2.php	2007-02-22 20:50:05.000000000 -0600
+++ 2.5.src/wp-commentsrss2.php	2007-08-02 19:45:06.000000000 -0500
@@ -1,7 +1,7 @@
 <?php
 
 if (empty($wp)) {
-	require_once('wp-config.php');
+	require_once('./wp-config.php');
 	wp('feed=rss2&withcomments=1');
 }
 
diff -x .svn -aruN 2.2.2.src/wp-config.php 2.5.src/wp-config.php
--- 2.2.2.src/wp-config.php	2007-08-13 07:47:42.000000000 -0500
+++ 2.5.src/wp-config.php	2008-04-22 07:40:43.000000000 -0500
@@ -1,12 +1,17 @@
 <?php
 // ** MySQL settings ** //
-define('DB_NAME', '[% wp %]');     // The name of the database
+define('DB_NAME', '[% wp %]');    // The name of the database
 define('DB_USER', '[% mysql_user %]');     // Your MySQL username
 define('DB_PASSWORD', '[% mysql_pass %]'); // ...and password
-define('DB_HOST', '[% mysql.wp.sqlhost %]');     // 99% chance you won't need to change this value
+define('DB_HOST', '[% mysql.wp.sqlhost %]');    // 99% chance you won't need to change this value
 define('DB_CHARSET', 'utf8');
 define('DB_COLLATE', '');
 
+// Change SECRET_KEY to a unique phrase.  You won't have to remember it later,
+// so make it long and complicated.  You can visit https://www.grc.com/passwords.htm
+// to get a phrase generated for you, or just make something up.
+define('SECRET_KEY', '[% secret_key %]'); // Change this to a unique phrase.
+
 // You can have multiple installations in one database if you give each a unique prefix
 $table_prefix  = '[% table_prefix %]_';   // Only numbers, letters, and underscores please!
 
diff -x .svn -aruN 2.2.2.src/wp-content/plugins/akismet/akismet.php 2.5.src/wp-content/plugins/akismet/akismet.php
--- 2.2.2.src/wp-content/plugins/akismet/akismet.php	2007-06-18 13:27:32.000000000 -0500
+++ 2.5.src/wp-content/plugins/akismet/akismet.php	2008-03-21 15:42:31.000000000 -0500
@@ -2,8 +2,8 @@
 /*
 Plugin Name: Akismet
 Plugin URI: http://akismet.com/
-Description: Akismet checks your comments against the Akismet web service to see if they look like spam or not. You need a <a href="http://wordpress.com/api-keys/">WordPress.com API key</a> to use it. You can review the spam it catches under "Comments." To show off your Akismet stats just put <code>&lt;?php akismet_counter(); ?></code> in your template.
-Version: 2.0.2
+Description: Akismet checks your comments against the Akismet web service to see if they look like spam or not. You need a <a href="http://wordpress.com/api-keys/">WordPress.com API key</a> to use it. You can review the spam it catches under "Comments." To show off your Akismet stats just put <code>&lt;?php akismet_counter(); ?></code> in your template. See also: <a href="http://wordpress.org/extend/plugins/stats/">WP Stats plugin</a>.
+Version: 2.1.4
 Author: Matt Mullenweg
 Author URI: http://photomatt.net/
 */
@@ -32,9 +32,14 @@
 	$akismet_nonce = 'akismet-update-key';
 }
 
+if ( !function_exists('number_format_i18n') ) {
+	function number_format_i18n( $number, $decimals = null ) { return number_format( $number, $decimals ); }
+}
+
 function akismet_config_page() {
 	if ( function_exists('add_submenu_page') )
 		add_submenu_page('plugins.php', __('Akismet Configuration'), __('Akismet Configuration'), 'manage_options', 'akismet-key-config', 'akismet_conf');
+
 }
 
 function akismet_conf() {
@@ -146,14 +151,10 @@
 if ( !get_option('wordpress_api_key') && !$wpcom_api_key && !isset($_POST['submit']) ) {
 	function akismet_warning() {
 		echo "
-		<div id='akismet-warning' class='updated fade-ff0000'><p><strong>".__('Akismet is not active.')."</strong> ".sprintf(__('You must <a href="%1$s">enter your WordPress.com API key</a> for it to work.'), "plugins.php?page=akismet-key-config")."</p></div>
-		<style type='text/css'>
-		#adminmenu { margin-bottom: 5em; }
-		#akismet-warning { position: absolute; top: 7em; }
-		</style>
+		<div id='akismet-warning' class='updated fade'><p><strong>".__('Akismet is almost ready.')."</strong> ".sprintf(__('You must <a href="%1$s">enter your WordPress.com API key</a> for it to work.'), "plugins.php?page=akismet-key-config")."</p></div>
 		";
 	}
-	add_action('admin_footer', 'akismet_warning');
+	add_action('admin_notices', 'akismet_warning');
 	return;
 }
 
@@ -204,6 +205,8 @@
 		add_filter('pre_comment_approved', create_function('$a', 'return \'spam\';'));
 		update_option( 'akismet_spam_count', get_option('akismet_spam_count') + 1 );
 
+		do_action( 'akismet_spam_caught' );
+
 		$post = get_post( $comment['comment_post_ID'] );
 		$last_updated = strtotime( $post->post_modified_gmt );
 		$diff = time() - $last_updated;
@@ -227,6 +230,7 @@
 
 function akismet_submit_nonspam_comment ( $comment_id ) {
 	global $wpdb, $akismet_api_host, $akismet_api_port;
+	$comment_id = (int) $comment_id;
 
 	$comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment_id'");
 	if ( !$comment ) // it was deleted
@@ -240,6 +244,7 @@
 
 function akismet_submit_spam_comment ( $comment_id ) {
 	global $wpdb, $akismet_api_host, $akismet_api_port;
+	$comment_id = (int) $comment_id;
 
 	$comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment_id'");
 	if ( !$comment ) // it was deleted
@@ -258,14 +263,62 @@
 add_action('edit_comment', 'akismet_submit_spam_comment');
 add_action('preprocess_comment', 'akismet_auto_check_comment', 1);
 
-function akismet_spam_count() {
-	global $wpdb, $comments;
-	$count = wp_cache_get( 'akismet_spam_count', 'widget' );
-	if ( false === $count ) {
-		$count = $wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_approved = 'spam'");
-		wp_cache_set( 'akismet_spam_count', $count, 'widget', 3600 );
+// Total spam in queue
+// get_option( 'akismet_spam_count' ) is the total caught ever
+function akismet_spam_count( $type = false ) {
+	global $wpdb;
+
+	if ( !$type ) { // total
+		$count = wp_cache_get( 'akismet_spam_count', 'widget' );
+		if ( false === $count ) {
+			$count = (int) $wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_approved = 'spam'");
+			wp_cache_set( 'akismet_spam_count', $count, 'widget', 3600 );
+		}
+		return $count;
+	} elseif ( 'comments' == $type || 'comment' == $type ) { // comments
+		$type = '';
+	} else { // pingback, trackback, ...
+		$type  = $wpdb->escape( $type );
 	}
-	return $count;
+
+	return (int) $wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_approved = 'spam' AND comment_type='$type'");
+}
+
+function akismet_spam_comments( $type = false, $page = 1, $per_page = 50 ) {
+	global $wpdb;
+
+	$page = (int) $page;
+	if ( $page < 2 )
+		$page = 1;
+
+	$per_page = (int) $per_page;
+	if ( $per_page < 1 )
+		$per_page = 50;
+
+	$start = ( $page - 1 ) * $per_page;
+	$end = $start + $per_page;
+
+	if ( $type ) {
+		if ( 'comments' == $type || 'comment' == $type )
+			$type = '';
+		else
+			$type = $wpdb->escape( $type );
+		return $wpdb->get_results( "SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' AND comment_type='$type' ORDER BY comment_date DESC LIMIT $start, $end");
+	}
+
+	// All
+	return $wpdb->get_results( "SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_date DESC LIMIT $start, $end");
+}
+
+// Totals for each comment type
+// returns array( type => count, ... )
+function akismet_spam_totals() {
+	global $wpdb;
+	$totals = $wpdb->get_results( "SELECT comment_type, COUNT(*) AS cc FROM $wpdb->comments WHERE comment_approved = 'spam' GROUP BY comment_type" );
+	$return = array();
+	foreach ( $totals as $total )
+		$return[$total->comment_type ? $total->comment_type : 'comment'] = $total->cc;
+	return $return;
 }
 
 function akismet_manage_page() {
@@ -284,7 +337,7 @@
 		check_admin_referer( $akismet_nonce );
 		if ( function_exists('current_user_can') && !current_user_can('moderate_comments') )
 			die(__('You do not have sufficient permission to moderate comments.'));
-		
+
 		$i = 0;
 		foreach ($_POST['not_spam'] as $comment):
 			$comment = (int) $comment;
@@ -304,7 +357,7 @@
 		if ( function_exists('current_user_can') && !current_user_can('moderate_comments') )
 			die(__('You do not have sufficient permission to moderate comments.'));
 
-		$delete_time = addslashes( $_POST['display_time'] );
+		$delete_time = $wpdb->escape( $_POST['display_time'] );
 		$nuked = $wpdb->query( "DELETE FROM $wpdb->comments WHERE comment_approved = 'spam' AND '$delete_time' > comment_date_gmt" );
 		wp_cache_delete( 'akismet_spam_count', 'widget' );
 		$to = add_query_arg( 'deleted', 'all', $_SERVER['HTTP_REFERER'] );
@@ -325,17 +378,59 @@
 else
 	$link = 'edit.php';
 ?>
+<style type="text/css">
+.akismet-tabs {
+	list-style: none;
+	margin: 0;
+	padding: 0;
+	clear: both;
+	border-bottom: 1px solid #ccc;
+	height: 31px;
+	margin-bottom: 20px;
+	background: #ddd;
+	border-top: 1px solid #bdbdbd;
+}
+.akismet-tabs li {
+	float: left;
+	margin: 5px 0 0 20px;
+}
+.akismet-tabs a {
+	display: block;
+	padding: 4px .5em 3px;
+	border-bottom: none;
+	color: #036;
+}
+.akismet-tabs .active a {
+	background: #fff;
+	border: 1px solid #ccc;
+	border-bottom: none;
+	color: #000;
+	font-weight: bold;
+	padding-bottom: 4px;
+}
+#akismetsearch {
+	float: right;
+	margin-top: -.5em;
+}
+
+#akismetsearch p {
+	margin: 0;
+	padding: 0;
+}
+</style>
 <div class="wrap">
 <h2><?php _e('Caught Spam') ?></h2>
 <?php
-$count = get_option('akismet_spam_count');
+$count = get_option( 'akismet_spam_count' );
 if ( $count ) {
 ?>
-<p><?php printf(__('Akismet has caught <strong>%1$s spam</strong> for you since you first installed it.'), number_format($count) ); ?></p>
+<p><?php printf(__('Akismet has caught <strong>%1$s spam</strong> for you since you first installed it.'), number_format_i18n($count) ); ?></p>
 <?php
 }
+
 $spam_count = akismet_spam_count();
-if (0 == $spam_count) {
+
+if ( 0 == $spam_count ) {
 	echo '<p>'.__('You have no spam currently in the queue. Must be your lucky day. :)').'</p>';
 	echo '</div>';
 } else {
@@ -345,7 +440,7 @@
 <form method="post" action="<?php echo attribute_escape( add_query_arg( 'noheader', 'true' ) ); ?>">
 <?php akismet_nonce_field($akismet_nonce) ?>
 <input type="hidden" name="action" value="delete" />
-<?php printf(__('There are currently %1$s comments identified as spam.'), $spam_count); ?>&nbsp; &nbsp; <input type="submit" name="Submit" value="<?php _e('Delete all'); ?>" />
+<?php printf(__('There are currently %1$s comments identified as spam.'), $spam_count); ?>&nbsp; &nbsp; <input type="submit" class="button delete" name="Submit" value="<?php _e('Delete all'); ?>" />
 <input type="hidden" name="display_time" value="<?php echo current_time('mysql', 1); ?>" />
 </form>
 <?php } ?>
@@ -354,7 +449,6 @@
 <?php if ( isset( $_POST['s'] ) ) { ?>
 <h2><?php _e('Search'); ?></h2>
 <?php } else { ?>
-<h2><?php _e('Latest Spam'); ?></h2>
 <?php echo '<p>'.__('These are the latest comments identified as spam by Akismet. If you see any mistakes, simply mark the comment as "not spam" and Akismet will learn from the submission. If you wish to recover a comment from spam, simply select the comment, and click Not Spam. After 15 days we clean out the junk for you.').'</p>'; ?>
 <?php } ?>
 <?php
@@ -377,22 +471,46 @@
 	if ( $page < 2 )
 		$page = 1;
 
-	$start = ( $page - 1 ) * 50;
-	$end = $start + 50;
-
-	$comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_date DESC LIMIT $start, $end");
-	$total = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = 'spam'" );
+	$current_type = false;
+	if ( isset( $_GET['ctype'] ) )
+		$current_type = preg_replace( '|[^a-z]|', '', $_GET['ctype'] );
+
+	$comments = akismet_spam_comments( $current_type );
+	$total = akismet_spam_count( $current_type );
+	$totals = akismet_spam_totals();
+?>
+<ul class="akismet-tabs">
+<li <?php if ( !isset( $_GET['ctype'] ) ) echo ' class="active"'; ?>><a href="edit-comments.php?page=akismet-admin"><?php _e('All'); ?></a></li>
+<?php
+foreach ( $totals as $type => $type_count ) {
+	if ( 'comment' == $type ) {
+		$type = 'comments';
+		$show = __('Comments');
+	} else {
+		$show = ucwords( $type );
+	}
+	$type_count = number_format_i18n( $type_count );
+	$extra = $current_type === $type ? ' class="active"' : '';
+	echo "<li $extra><a href='edit-comments.php?page=akismet-admin&amp;ctype=$type'>$show ($type_count)</a></li>";
+}
+do_action( 'akismet_tabs' ); // so plugins can add more tabs easily
+?>
+</ul>
+<?php
 }
 
 if ($comments) {
 ?>
-
+<form method="post" action="<?php echo attribute_escape("$link?page=akismet-admin"); ?>" id="akismetsearch">
+<p>  <input type="text" name="s" value="<?php if (isset($_POST['s'])) echo attribute_escape($_POST['s']); ?>" size="17" />
+  <input type="submit" class="button" name="submit" value="<?php echo attribute_escape(__('Search Spam &raquo;')) ?>"  />  </p>
+</form>
 <?php if ( $total > 50 ) {
 $total_pages = ceil( $total / 50 );
 $r = '';
 if ( 1 < $page ) {
 	$args['apage'] = ( 1 == $page - 1 ) ? '' : $page - 1;
-	$r .=  '<a class="prev" href="' . clean_url(add_query_arg( $args )) . '">&laquo; '. __('Previous Page') .'</a>' . "\n";
+	$r .=  '<a class="prev" href="' . clean_url(add_query_arg( $args )) . '">'. __('&laquo; Previous Page') .'</a>' . "\n";
 }
 if ( ( $total_pages = ceil( $total / 50 ) ) > 1 ) {
 	for ( $page_num = 1; $page_num <= $total_pages; $page_num++ ) :
@@ -413,17 +531,13 @@
 }
 if ( ( $page ) * 50 < $total || -1 == $total ) {
 	$args['apage'] = $page + 1;
-	$r .=  '<a class="next" href="' . clean_url(add_query_arg($args)) . '">'. __('Next Page') .' &raquo;</a>' . "\n";
+	$r .=  '<a class="next" href="' . clean_url(add_query_arg($args)) . '">'. __('Next Page &raquo;') .'</a>' . "\n";
 }
 echo "<p>$r</p>";
 ?>
 
 <?php } ?>
-<form method="post" action="<?php echo attribute_escape("$link?page=akismet-admin"); ?>" id="akismetsearch">
-<p>  <input type="text" name="s" value="<?php if (isset($_POST['s'])) echo attribute_escape($_POST['s']); ?>" size="17" /> 
-  <input type="submit" name="submit" value="<?php echo attribute_escape(__('Search')) ?>"  />  </p>
-</form>
-<form method="post" action="<?php echo attribute_escape( add_query_arg( 'noheader', 'true' ) ); ?>">
+<form style="clear: both;" method="post" action="<?php echo attribute_escape( add_query_arg( 'noheader', 'true' ) ); ?>">
 <?php akismet_nonce_field($akismet_nonce) ?>
 <input type="hidden" name="action" value="recover" />
 <ul id="spam-list" class="commentlist" style="list-style: none; margin: 0; padding: 0;">
@@ -436,7 +550,7 @@
 	$post_title = $post->post_title;
 	if ($i % 2) $class = 'class="alternate"';
 	else $class = '';
-	echo "\n\t<li id='comment-$comment->comment_ID' $class>"; 
+	echo "\n\t<li id='comment-$comment->comment_ID' $class>";
 	?>
 
 <p><strong><?php comment_author() ?></strong> <?php if ($comment->comment_author_email) { ?>| <?php comment_author_email_link() ?> <?php } if ($comment->comment_author_url && 'http://' != $comment->comment_author_url) { ?> | <?php comment_author_url_link() ?> <?php } ?>| <?php _e('IP:') ?> <a href="http://ws.arin.net/cgi-bin/whois.pl?queryinput=<?php comment_author_IP() ?>"><?php comment_author_IP() ?></a></p>
@@ -445,7 +559,7 @@
 
 <p><label for="spam-<?php echo $comment->comment_ID; ?>">
 <input type="checkbox" id="spam-<?php echo $comment->comment_ID; ?>" name="not_spam[]" value="<?php echo $comment->comment_ID; ?>" />
-<?php _e('Not Spam') ?></label> &#8212; <?php comment_date('M j, g:i A');  ?> &#8212; [ 
+<?php _e('Not Spam') ?></label> &#8212; <?php comment_date('M j, g:i A');  ?> &#8212; [
 <?php
 $post = get_post($comment->comment_post_ID);
 $post_title = wp_specialchars( $post->post_title, 'double' );
@@ -463,7 +577,7 @@
 $r = '';
 if ( 1 < $page ) {
 	$args['apage'] = ( 1 == $page - 1 ) ? '' : $page - 1;
-	$r .=  '<a class="prev" href="' . clean_url(add_query_arg( $args )) . '">&laquo; '. __('Previous Page') .'</a>' . "\n";
+	$r .=  '<a class="prev" href="' . clean_url(add_query_arg( $args )) . '">'. __('&laquo; Previous Page') .'</a>' . "\n";
 }
 if ( ( $total_pages = ceil( $total / 50 ) ) > 1 ) {
 	for ( $page_num = 1; $page_num <= $total_pages; $page_num++ ) :
@@ -484,12 +598,12 @@
 }
 if ( ( $page ) * 50 < $total || -1 == $total ) {
 	$args['apage'] = $page + 1;
-	$r .=  '<a class="next" href="' . clean_url(add_query_arg($args)) . '">'. __('Next Page') .' &raquo;</a>' . "\n";
+	$r .=  '<a class="next" href="' . clean_url(add_query_arg($args)) . '">'. __('Next Page &raquo;') .'</a>' . "\n";
 }
 echo "<p>$r</p>";
 }
 ?>
-<p class="submit"> 
+<p class="submit">
 <input type="submit" name="submit" value="<?php echo attribute_escape(__('De-spam marked comments &raquo;')); ?>" />
 </p>
 <p><?php _e('Comments you de-spam will be submitted to Akismet as mistakes so it can learn and get better.'); ?></p>
@@ -504,7 +618,7 @@
 <form method="post" action="<?php echo attribute_escape( add_query_arg( 'noheader', 'true' ) ); ?>">
 <?php akismet_nonce_field($akismet_nonce) ?>
 <p><input type="hidden" name="action" value="delete" />
-<?php printf(__('There are currently %1$s comments identified as spam.'), $spam_count); ?>&nbsp; &nbsp; <input type="submit" name="Submit" value="<?php echo attribute_escape(__('Delete all')); ?>" />
+<?php printf(__('There are currently %1$s comments identified as spam.'), $spam_count); ?>&nbsp; &nbsp; <input type="submit" name="Submit" class="button" value="<?php echo attribute_escape(__('Delete all')); ?>" />
 <input type="hidden" name="display_time" value="<?php echo current_time('mysql', 1); ?>" /></p>
 </form>
 <?php } ?>
@@ -515,9 +629,11 @@
 
 add_action('admin_menu', 'akismet_manage_page');
 
+// WP < 2.5
 function akismet_stats() {
-	$count = get_option('akismet_spam_count');
-	if ( !$count )
+	if ( !function_exists('did_action') || did_action( 'rightnow_end' ) ) // We already displayed this info in the "Right Now" section
+		return;
+	if ( !$count = get_option('akismet_spam_count') )
 		return;
 	$path = plugin_basename(__FILE__);
 	echo '<h3>'.__('Spam').'</h3>';
@@ -526,12 +642,47 @@
 		$link = 'edit-comments.php';
 	else
 		$link = 'edit.php';
-	echo '<p>'.sprintf(__('<a href="%1$s">Akismet</a> has protected your site from <a href="%2$s">%3$s spam comments</a>.'), 'http://akismet.com/', clean_url("$link?page=akismet-admin"), number_format($count) ).'</p>';
+	echo '<p>'.sprintf(__('<a href="%1$s">Akismet</a> has protected your site from <a href="%2$s">%3$s spam comments</a>.'), 'http://akismet.com/', clean_url("$link?page=akismet-admin"), number_format_i18n($count) ).'</p>';
 }
 
 add_action('activity_box_end', 'akismet_stats');
 
+// WP 2.5+
+function akismet_rightnow() {
+	global $submenu;
+	if ( isset( $submenu['edit-comments.php'] ) )
+		$link = 'edit-comments.php';
+	else
+		$link = 'edit.php';
+
+	if ( $count = get_option('akismet_spam_count') ) {
+		$intro = sprintf( __ngettext(
+			'<a href="%1$s">Akismet</a> has protected your site from %2$s spam comment already,',
+			'<a href="%1$s">Akismet</a> has protected your site from %2$s spam comments already,',
+			$count
+		), 'http://akismet.com/', number_format_i18n( $count ) );
+	} else {
+		$intro = sprintf( __('<a href="%1$s">Akismet</a> blocks spam from getting to your blog,'), 'http://akismet.com/' );
+	}
+
+	if ( $queue_count = akismet_spam_count() ) {
+		$queue_text = sprintf( __ngettext(
+			'and there\'s <a href="%2$s">%1$s comment</a> in your spam queue right now.',
+			'and there are <a href="%2$s">%1$s comments</a> in your spam queue right now.',
+			$queue_count
+		), number_format_i18n( $queue_count ), clean_url("$link?page=akismet-admin") );
+	} else {
+		$queue_text = sprintf( __( "but there's nothing in your <a href='%1\$s'>spam queue</a> at the moment." ), clean_url("$link?page=akismet-admin") );
+	}
+
+	$text = sprintf( _c( '%1$s %2$s|akismet_rightnow' ), $intro, $queue_text );
+
+	echo "<p class='akismet-right-now'>$text</p>\n";
+}
+	
+add_action('rightnow_end', 'akismet_rightnow');
 
+// For WP <= 2.3.x
 if ( 'moderation.php' == $pagenow ) {
 	function akismet_recheck_button( $page ) {
 		global $submenu;
@@ -548,6 +699,16 @@
 		ob_start( 'akismet_recheck_button' );
 }
 
+// For WP >= 2.5
+function akismet_check_for_spam_button($comment_status) {
+	if ( 'moderated' != $comment_status )
+		return;
+	$count = wp_count_comments();
+	if ( !empty($count->moderated ) )
+		echo "<a href='edit-comments.php?page=akismet-admin&amp;recheckqueue=true&amp;noheader=true'>" . __('Check for Spam') . "</a>";
+}
+add_action('manage_comments_nav', 'akismet_check_for_spam_button');
+
 function akismet_recheck_queue() {
 	global $wpdb, $akismet_api_host, $akismet_api_port;
 
@@ -560,12 +721,12 @@
 		$c['user_agent'] = $c['comment_agent'];
 		$c['referrer']   = '';
 		$c['blog']       = get_option('home');
-		$id = $c['comment_ID'];
-		
+		$id = (int) $c['comment_ID'];
+
 		$query_string = '';
 		foreach ( $c as $key => $data )
 		$query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
-		
+
 		$response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port);
 		if ( 'true' == $response[1] ) {
 			$wpdb->query( "UPDATE $wpdb->comments SET comment_approved = 'spam' WHERE comment_ID = $id" );
@@ -588,11 +749,11 @@
 	$c['referrer']   = '';
 	$c['blog']       = get_option('home');
 	$id = $c['comment_ID'];
-	
+
 	$query_string = '';
 	foreach ( $c as $key => $data )
 	$query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
-	
+
 	$response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port);
 	return $response[1];
 }
@@ -607,8 +768,7 @@
 	function widget_akismet($args) {
 		extract($args);
 		$options = get_option('widget_akismet');
-		$count = number_format(get_option('akismet_spam_count'));
-		$text = __('%d spam comments have been blocked by <a href="http://akismet.com">Akismet</a>.');
+		$count = number_format_i18n(get_option('akismet_spam_count'));
 		?>
 			<?php echo $before_widget; ?>
 				<?php echo $before_title . $options['title'] . $after_title; ?>
@@ -616,7 +776,7 @@
 			<?php echo $after_widget; ?>
 	<?php
 	}
-	
+
 	function widget_akismet_style() {
 		?>
 <style type="text/css">
@@ -650,7 +810,7 @@
 	}
 
 	register_sidebar_widget('Akismet', 'widget_akismet', null, 'akismet');
-	register_widget_control('Akismet', 'widget_akismet_control', 300, 75, 'akismet');
+	register_widget_control('Akismet', 'widget_akismet_control', null, 75, 'akismet');
 	if ( is_active_widget('widget_akismet') )
 		add_action('wp_head', 'widget_akismet_style');
 	endif;
@@ -672,7 +832,7 @@
 #akismetwrap #akismetstats{background:url(<?php echo get_option('siteurl'); ?>/wp-content/plugins/akismet/akismet.gif) no-repeat top left;border:none;color:#fff;font:11px 'Trebuchet MS','Myriad Pro',sans-serif;height:40px;line-height:100%;overflow:hidden;padding:8px 0 0;text-align:center;width:120px}
 </style>
 <?php
-$count = number_format(get_option('akismet_spam_count'));
+$count = number_format_i18n(get_option('akismet_spam_count'));
 ?>
 <div id="akismetwrap"><div id="akismetstats"><a id="aka" href="http://akismet.com" title=""><div id="akismet1"><span id="akismetcount"><?php echo $count; ?></span> <span id="akismetsc"><?php _e('spam comments') ?></span></div> <div id="akismet2"><span id="akismetbb"><?php _e('blocked by') ?></span><br /><span id="akismeta">Akismet</span></div></a></div></div>
 <?php
diff -x .svn -aruN 2.2.2.src/wp-content/plugins/hello.php 2.5.src/wp-content/plugins/hello.php
--- 2.2.2.src/wp-content/plugins/hello.php	2006-10-25 16:39:32.000000000 -0500
+++ 2.5.src/wp-content/plugins/hello.php	2008-02-28 16:02:20.000000000 -0600
@@ -6,7 +6,7 @@
 Author: Matt Mullenweg
 Version: 1.5
 Author URI: http://photomatt.net/
-*/ 
+*/
 
 // These are the lyrics to Hello Dolly
 $lyrics = "Hello, Dolly
@@ -59,10 +59,11 @@
 	#dolly {
 		position: absolute;
 		top: 2.3em;
-margin: 0; padding: 0;
-		right: 1em;
+		margin: 0;
+		padding: 0;
+		right: 10px;
 		font-size: 16px;
-		color: #f1f1f1;
+		color: #d54e21;
 	}
 	</style>
 	";
diff -x .svn -aruN 2.2.2.src/wp-content/themes/classic/comments-popup.php 2.5.src/wp-content/themes/classic/comments-popup.php
--- 2.2.2.src/wp-content/themes/classic/comments-popup.php	2007-02-23 02:31:07.000000000 -0600
+++ 2.5.src/wp-content/themes/classic/comments-popup.php	2008-03-21 11:10:33.000000000 -0500
@@ -56,9 +56,9 @@
 <p><?php _e("Line and paragraph breaks automatic, e-mail address never displayed, <acronym title=\"Hypertext Markup Language\">HTML</acronym> allowed:"); ?> <code><?php echo allowed_tags(); ?></code></p>
 
 <form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post" id="commentform">
-<?php if ( $user_ID ) : ?> 
-	<p>Logged in as <a href="<?php echo get_option('siteurl'); ?>/wp-admin/profile.php"><?php echo $user_identity; ?></a>. <a href="<?php echo get_option('siteurl'); ?>/wp-login.php?action=logout" title="Log out of this account">Logout &raquo;</a></p>
-<?php else : ?> 
+<?php if ( $user_ID ) : ?>
+<p><?php printf(__('Logged in as %s.'), '<a href="'.get_option('siteurl').'/wp-admin/profile.php">'.$user_identity.'</a>'); ?> <a href="<?php echo get_option('siteurl'); ?>/wp-login.php?action=logout" title="<?php echo attribute_escape(__('Log out of this account')); ?>"><?php _e('Log out &raquo;'); ?></a></p>
+<?php else : ?>
 	<p>
 	  <input type="text" name="author" id="author" class="textarea" value="<?php echo $comment_author; ?>" size="28" tabindex="1" />
 	   <label for="author"><?php _e("Name"); ?></label>
@@ -102,7 +102,7 @@
 
 <!-- // this is just the end of the motor - don't touch that line either :) -->
 <?php //} ?>
-<p class="credit"><?php timer_stop(1); ?> <?php echo sprintf(__("<cite>Powered by <a href=\"http://wordpress.org\" title=\"%s\"><strong>Wordpress</strong></a></cite>"),__("Powered by WordPress, state-of-the-art semantic personal publishing platform.")); ?></p>
+<p class="credit"><?php timer_stop(1); ?> <?php echo sprintf(__("<cite>Powered by <a href=\"http://wordpress.org\" title=\"%s\"><strong>WordPress</strong></a></cite>"),__("Powered by WordPress, state-of-the-art semantic personal publishing platform.")); ?></p>
 <?php // Seen at http://www.mijnkopthee.nl/log2/archive/2003/05/28/esc(18) ?>
 <script type="text/javascript">
 <!--
diff -x .svn -aruN 2.2.2.src/wp-content/themes/classic/comments.php 2.5.src/wp-content/themes/classic/comments.php
--- 2.2.2.src/wp-content/themes/classic/comments.php	2006-11-19 01:56:05.000000000 -0600
+++ 2.5.src/wp-content/themes/classic/comments.php	2008-03-17 18:16:10.000000000 -0500
@@ -13,6 +13,7 @@
 
 <?php foreach ($comments as $comment) : ?>
 	<li id="comment-<?php comment_ID() ?>">
+	<?php echo get_avatar( $comment, 32 ); ?>
 	<?php comment_text() ?>
 	<p><cite><?php comment_type(__('Comment'), __('Trackback'), __('Pingback')); ?> <?php _e('by'); ?> <?php comment_author_link() ?> &#8212; <?php comment_date() ?> @ <a href="#comment-<?php comment_ID() ?>"><?php comment_time() ?></a></cite> <?php edit_comment_link(__("Edit This"), ' |'); ?></p>
 	</li>
@@ -25,7 +26,7 @@
 	<p><?php _e('No comments yet.'); ?></p>
 <?php endif; ?>
 
-<p><?php comments_rss_link(__('<abbr title="Really Simple Syndication">RSS</abbr> feed for comments on this post.')); ?>
+<p><?php post_comments_feed_link(__('<abbr title="Really Simple Syndication">RSS</abbr> feed for comments on this post.')); ?>
 <?php if ( pings_open() ) : ?>
 	<a href="<?php trackback_url() ?>" rel="trackback"><?php _e('TrackBack <abbr title="Universal Resource Locator">URL</abbr>'); ?></a>
 <?php endif; ?>
@@ -35,33 +36,33 @@
 <h2 id="postcomment"><?php _e('Leave a comment'); ?></h2>
 
 <?php if ( get_option('comment_registration') && !$user_ID ) : ?>
-<p>You must be <a href="<?php echo get_option('siteurl'); ?>/wp-login.php?redirect_to=<?php the_permalink(); ?>">logged in</a> to post a comment.</p>
+<p><?php printf(__('You must be <a href="%s">logged in</a> to post a comment.'), get_option('siteurl')."/wp-login.php?redirect_to=".urlencode(get_permalink()));?></p>
 <?php else : ?>
 
 <form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post" id="commentform">
 
 <?php if ( $user_ID ) : ?>
 
-<p>Logged in as <a href="<?php echo get_option('siteurl'); ?>/wp-admin/profile.php"><?php echo $user_identity; ?></a>. <a href="<?php echo get_option('siteurl'); ?>/wp-login.php?action=logout" title="<?php _e('Log out of this account') ?>">Logout &raquo;</a></p>
+<p><?php printf(__('Logged in as %s.'), '<a href="'.get_option('siteurl').'/wp-admin/profile.php">'.$user_identity.'</a>'); ?> <a href="<?php echo get_option('siteurl'); ?>/wp-login.php?action=logout" title="<?php _e('Log out of this account') ?>"><?php _e('Log out &raquo;'); ?></a></p>
 
 <?php else : ?>
 
 <p><input type="text" name="author" id="author" value="<?php echo $comment_author; ?>" size="22" tabindex="1" />
-<label for="author"><small>Name <?php if ($req) _e('(required)'); ?></small></label></p>
+<label for="author"><small><?php _e('Name'); ?> <?php if ($req) _e('(required)'); ?></small></label></p>
 
 <p><input type="text" name="email" id="email" value="<?php echo $comment_author_email; ?>" size="22" tabindex="2" />
-<label for="email"><small>Mail (will not be published) <?php if ($req) _e('(required)'); ?></small></label></p>
+<label for="email"><small><?php _e('Mail (will not be published)');?> <?php if ($req) _e('(required)'); ?></small></label></p>
 
 <p><input type="text" name="url" id="url" value="<?php echo $comment_author_url; ?>" size="22" tabindex="3" />
-<label for="url"><small>Website</small></label></p>
+<label for="url"><small><?php _e('Website'); ?></small></label></p>
 
 <?php endif; ?>
 
-<!--<p><small><strong>XHTML:</strong> You can use these tags: <?php echo allowed_tags(); ?></small></p>-->
+<!--<p><small><strong>XHTML:</strong> <?php printf(__('You can use these tags: %s'), allowed_tags()); ?></small></p>-->
 
 <p><textarea name="comment" id="comment" cols="100%" rows="10" tabindex="4"></textarea></p>
 
-<p><input name="submit" type="submit" id="submit" tabindex="5" value="Submit Comment" />
+<p><input name="submit" type="submit" id="submit" tabindex="5" value="<?php echo attribute_escape(__('Submit Comment')); ?>" />
 <input type="hidden" name="comment_post_ID" value="<?php echo $id; ?>" />
 </p>
 <?php do_action('comment_form', $post->ID); ?>
diff -x .svn -aruN 2.2.2.src/wp-content/themes/classic/header.php 2.5.src/wp-content/themes/classic/header.php
--- 2.2.2.src/wp-content/themes/classic/header.php	2007-01-16 18:01:21.000000000 -0600
+++ 2.5.src/wp-content/themes/classic/header.php	2007-10-17 14:37:21.000000000 -0500
@@ -6,15 +6,13 @@
 
 	<title><?php bloginfo('name'); ?><?php wp_title(); ?></title>
 
-	<meta name="generator" content="WordPress <?php bloginfo('version'); ?>" /> <!-- leave this for stats please -->
-
 	<style type="text/css" media="screen">
 		@import url( <?php bloginfo('stylesheet_url'); ?> );
 	</style>
 
 	<link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="<?php bloginfo('rss2_url'); ?>" />
 	<link rel="alternate" type="text/xml" title="RSS .92" href="<?php bloginfo('rss_url'); ?>" />
-	<link rel="alternate" type="application/atom+xml" title="Atom 0.3" href="<?php bloginfo('atom_url'); ?>" />
+	<link rel="alternate" type="application/atom+xml" title="Atom 1.0" href="<?php bloginfo('atom_url'); ?>" />
 
 	<link rel="pingback" href="<?php bloginfo('pingback_url'); ?>" />
 	<?php wp_get_archives('type=monthly&format=link'); ?>
diff -x .svn -aruN 2.2.2.src/wp-content/themes/classic/index.php 2.5.src/wp-content/themes/classic/index.php
--- 2.2.2.src/wp-content/themes/classic/index.php	2007-04-19 17:26:52.000000000 -0500
+++ 2.5.src/wp-content/themes/classic/index.php	2007-06-07 18:33:06.000000000 -0500
@@ -8,7 +8,7 @@
 
 <div class="post" id="post-<?php the_ID(); ?>">
 	 <h3 class="storytitle"><a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a></h3>
-	<div class="meta"><?php _e("Filed under:"); ?> <?php the_category(',') ?> &#8212; <?php the_author() ?> @ <?php the_time() ?> <?php edit_post_link(__('Edit This')); ?></div>
+	<div class="meta"><?php _e("Filed under:"); ?> <?php the_category(',') ?> &#8212; <?php the_tags(__('Tags: '), ', ', ' &#8212; '); ?> <?php the_author() ?> @ <?php the_time() ?> <?php edit_post_link(__('Edit This')); ?></div>
 
 	<div class="storycontent">
 		<?php the_content(__('(more...)')); ?>
@@ -27,6 +27,6 @@
 <p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
 <?php endif; ?>
 
-<?php posts_nav_link(' &#8212; ', __('&laquo; Previous Page'), __('Next Page &raquo;')); ?>
+<?php posts_nav_link(' &#8212; ', __('&laquo; Older Posts'), __('Newer Posts &raquo;')); ?>
 
 <?php get_footer(); ?>
diff -x .svn -aruN 2.2.2.src/wp-content/themes/classic/rtl.css 2.5.src/wp-content/themes/classic/rtl.css
--- 2.2.2.src/wp-content/themes/classic/rtl.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-content/themes/classic/rtl.css	2007-07-21 13:55:36.000000000 -0500
@@ -0,0 +1,82 @@
+/* Based on Arabic (RTL) version of WordPress Classic theme, converted by Serdal (Serdal.com) */
+
+#menu ul ul, #wp-calendar caption, #wp-calendar #prev a { text-align: right; }
+#wp-calendar #next a, .feedback { text-align: left; }
+
+blockquote {
+	border-left: 0;
+	border-right: 5px solid #ccc;
+	margin-left: auto;
+	margin-right: 1.5em;
+	padding-left: 0;
+	padding-right: 5px;
+}
+
+body { font-family: 'Geeza Pro', Tahoma, 'Lucida Grande', 'Lucida Sans Unicode', Verdana, sans-serif; }
+
+h2 { font: 95% 'Al Bayan', 'Traditional Arabic', "Times New Roman", Times, serif; }
+
+p, li, .feedback {
+	font: 90%/175% 'Geeza Pro', Tahoma, 'Lucida Grande', 'Lucida Sans Unicode', Verdana, sans-serif;
+	text-align: justify;
+}
+
+acronym, abbr, span.caps, h2, p, li, #header, #menu ul li, #menu ul ul li, #wp-calendar td, .feedback, .meta, .meta a { letter-spacing: normal; }
+
+#commentlist li ul {
+	border-left: 0;
+	border-right: 1px solid #ddd;
+}
+
+#content {
+	margin: 30px 3em 0 13em;
+	padding-right: 0;
+	padding-left: 60px;
+}
+
+#header {
+	border-left: solid 1px #9a9;
+	border-right: solid 1px #565;
+	font: normal normal 230% 'Al Bayan', 'Traditional Arabic', 'Times New Roman', Times, serif;
+	padding: 15px 60px 15px 10px;
+}
+
+#menu {
+	border-left: 0;
+	border-right: 1px dotted #ccc;
+	padding: 20px 30px 10px 0;
+	right: auto;
+	left: 2px;
+}
+
+#menu form { margin: 0 13px 0 0; }
+
+#menu ul {
+	padding-left: 0;
+	padding-right: 3px;
+}
+
+#menu ul li { font: normal normal 110% 'Geeza Pro', Tahoma, 'Times New Roman', Times, serif; }
+
+#menu ul ul li {
+	font: normal normal 12px/115% 'Geeza Pro', Tahoma, 'Lucida Grande', 'Lucida Sans Unicode', Verdana, sans-serif;
+	padding-left: 0;
+	padding-right: 12px;
+}
+
+#menu ul ul ul.children {
+	padding-left: 0;
+	padding-right: 4px;
+}
+
+#wp-calendar #next a {
+	padding-right: 0;
+	padding-left: 10px;
+}
+
+#wp-calendar #prev a {
+	padding-left: 0;
+	padding-right: 10px;
+}
+
+#wp-calendar td { font: normal normal 12px 'Geeza Pro', Tahoma, 'Lucida Grande', 'Lucida Sans Unicode', Verdana, sans-serif; }
diff -x .svn -aruN 2.2.2.src/wp-content/themes/classic/style.css 2.5.src/wp-content/themes/classic/style.css
--- 2.2.2.src/wp-content/themes/classic/style.css	2005-01-24 04:16:17.000000000 -0600
+++ 2.5.src/wp-content/themes/classic/style.css	2008-03-17 18:16:10.000000000 -0500
@@ -4,6 +4,7 @@
 Description: The original WordPress theme that graced versions 1.2.x and prior.
 Version: 1.5
 Author: Dave Shea
+Tags: mantle color, variable width, two columns, widgets
 
 Default WordPress by Dave Shea || http://mezzoblue.com
 Modifications by Matthew Mullenweg || http://photomatt.net
@@ -48,9 +49,9 @@
 
 body {
 	background: #fff;
-	border: solid 2px #565;
-	border-bottom: solid 1px #565;
-	border-top: solid 3px #565;
+	border: 2px solid #565;
+	border-bottom: 1px solid #565;
+	border-top: 3px solid #565;
 	color: #000;
 	font-family: 'Lucida Grande', 'Lucida Sans Unicode', Verdana, sans-serif;
 	margin: 0;
@@ -71,7 +72,7 @@
 }
 
 h3 {
-	border-bottom: dotted 1px #eee;
+	border-bottom: 1px dotted #eee;
 	font-family: "Times New Roman", Times, serif;
 	margin-top: 0;
 }
@@ -96,7 +97,7 @@
 
 .credit {
 	background: #90a090;
-	border-top: double 3px #aba;
+	border-top: 3px double #aba;
 	color: #fff;
 	font-size: 11px;
 	margin: 10px 0 0 0;
@@ -159,6 +160,13 @@
 	list-style-type: none;
 }
 
+#commentlist li .avatar {
+	float: right;
+	margin-right: 25px;
+	border: 1px dotted #ccc;
+	padding: 2px;
+}
+
 #content {
 	margin: 30px 13em 0 3em;
 	padding-right: 60px;
@@ -166,10 +174,10 @@
 
 #header {
 	background: #90a090;
-	border-bottom: double 3px #aba;
-	border-left: solid 1px #9a9;
-	border-right: solid 1px #565;
-	border-top: solid 1px #9a9;
+	border-bottom: 3px double #aba;
+	border-left: 1px solid #9a9;
+	border-right: 1px solid #565;
+	border-top: 1px solid #9a9;
 	font: italic normal 230% 'Times New Roman', Times, serif;
 	letter-spacing: 0.2em;
 	margin: 0;
@@ -188,7 +196,7 @@
 #menu {
 	background: #fff;
 	border-left: 1px dotted #ccc;
-	border-top: solid 3px #e0e6e0;
+	border-top: 3px solid #e0e6e0;
 	padding: 20px 0 10px 30px;
 	position: absolute;
 	right: 2px;
diff -x .svn -aruN 2.2.2.src/wp-content/themes/default/archive.php 2.5.src/wp-content/themes/default/archive.php
--- 2.2.2.src/wp-content/themes/default/archive.php	2007-04-19 17:26:52.000000000 -0500
+++ 2.5.src/wp-content/themes/default/archive.php	2008-02-20 11:57:53.000000000 -0600
@@ -4,51 +4,47 @@
 
 		<?php if (have_posts()) : ?>
 
-		 <?php $post = $posts[0]; // Hack. Set $post so that the_date() works. ?>
-<?php /* If this is a category archive */ if (is_category()) { ?>
+ 	  <?php $post = $posts[0]; // Hack. Set $post so that the_date() works. ?>
+ 	  <?php /* If this is a category archive */ if (is_category()) { ?>
 		<h2 class="pagetitle">Archive for the &#8216;<?php single_cat_title(); ?>&#8217; Category</h2>
-
+ 	  <?php /* If this is a tag archive */ } elseif( is_tag() ) { ?>
+		<h2 class="pagetitle">Posts Tagged &#8216;<?php single_tag_title(); ?>&#8217;</h2>
  	  <?php /* If this is a daily archive */ } elseif (is_day()) { ?>
 		<h2 class="pagetitle">Archive for <?php the_time('F jS, Y'); ?></h2>
-
-	 <?php /* If this is a monthly archive */ } elseif (is_month()) { ?>
+ 	  <?php /* If this is a monthly archive */ } elseif (is_month()) { ?>
 		<h2 class="pagetitle">Archive for <?php the_time('F, Y'); ?></h2>
-
-		<?php /* If this is a yearly archive */ } elseif (is_year()) { ?>
+ 	  <?php /* If this is a yearly archive */ } elseif (is_year()) { ?>
 		<h2 class="pagetitle">Archive for <?php the_time('Y'); ?></h2>
-
 	  <?php /* If this is an author archive */ } elseif (is_author()) { ?>
 		<h2 class="pagetitle">Author Archive</h2>
-
-		<?php /* If this is a paged archive */ } elseif (isset($_GET['paged']) && !empty($_GET['paged'])) { ?>
+ 	  <?php /* If this is a paged archive */ } elseif (isset($_GET['paged']) && !empty($_GET['paged'])) { ?>
 		<h2 class="pagetitle">Blog Archives</h2>
-
-		<?php } ?>
+ 	  <?php } ?>
 
 
 		<div class="navigation">
-			<div class="alignleft"><?php next_posts_link('&laquo; Previous Entries') ?></div>
-			<div class="alignright"><?php previous_posts_link('Next Entries &raquo;') ?></div>
+			<div class="alignleft"><?php next_posts_link('&laquo; Older Entries') ?></div>
+			<div class="alignright"><?php previous_posts_link('Newer Entries &raquo;') ?></div>
 		</div>
 
 		<?php while (have_posts()) : the_post(); ?>
 		<div class="post">
-				<h3 id="post-<?php the_ID(); ?>"><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"><?php the_title(); ?></a></h3>
+				<h3 id="post-<?php the_ID(); ?>"><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h3>
 				<small><?php the_time('l, F jS, Y') ?></small>
 
 				<div class="entry">
 					<?php the_content() ?>
 				</div>
 
-				<p class="postmetadata">Posted in <?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?>  <?php comments_popup_link('No Comments &#187;', '1 Comment &#187;', '% Comments &#187;'); ?></p>
+				<p class="postmetadata"><?php the_tags('Tags: ', ', ', '<br />'); ?> Posted in <?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?>  <?php comments_popup_link('No Comments &#187;', '1 Comment &#187;', '% Comments &#187;'); ?></p>
 
 			</div>
 
 		<?php endwhile; ?>
 
 		<div class="navigation">
-			<div class="alignleft"><?php next_posts_link('&laquo; Previous Entries') ?></div>
-			<div class="alignright"><?php previous_posts_link('Next Entries &raquo;') ?></div>
+			<div class="alignleft"><?php next_posts_link('&laquo; Older Entries') ?></div>
+			<div class="alignright"><?php previous_posts_link('Newer Entries &raquo;') ?></div>
 		</div>
 
 	<?php else : ?>
diff -x .svn -aruN 2.2.2.src/wp-content/themes/default/attachment.php 2.5.src/wp-content/themes/default/attachment.php
--- 2.2.2.src/wp-content/themes/default/attachment.php	2007-05-04 16:27:10.000000000 -0500
+++ 2.5.src/wp-content/themes/default/attachment.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,67 +0,0 @@
-<?php get_header(); ?>
-
-	<div id="content" class="widecolumn">
-
-  <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
-
-		<div class="navigation">
-			<div class="alignleft">&nbsp;</div>
-			<div class="alignright">&nbsp;</div>
-		</div>
-<?php $attachment_link = get_the_attachment_link($post->ID, true, array(450, 800)); // This also populates the iconsize for the next line ?>
-<?php $_post = &get_post($post->ID); $classname = ($_post->iconsize[0] <= 128 ? 'small' : '') . 'attachment'; // This lets us style narrow icons specially ?>
-		<div class="post" id="post-<?php the_ID(); ?>">
-			<h2><a href="<?php echo get_permalink($post->post_parent); ?>" rev="attachment"><?php echo get_the_title($post->post_parent); ?></a> &raquo; <a href="<?php echo get_permalink() ?>" rel="bookmark" title="Permanent Link: <?php the_title(); ?>"><?php the_title(); ?></a></h2>
-			<div class="entry">
-				<p class="<?php echo $classname; ?>"><?php echo $attachment_link; ?><br /><?php echo basename($post->guid); ?></p>
-
-				<?php the_content('<p class="serif">Read the rest of this entry &raquo;</p>'); ?>
-
-				<?php wp_link_pages(array('before' => '<p><strong>Pages:</strong> ', 'after' => '</p>', 'next_or_number' => 'number')); ?>
-
-				<p class="postmetadata alt">
-					<small>
-						This entry was posted
-						<?php /* This is commented, because it requires a little adjusting sometimes.
-							You'll need to download this plugin, and follow the instructions:
-							http://binarybonsai.com/archives/2004/08/17/time-since-plugin/ */
-							/* $entry_datetime = abs(strtotime($post->post_date) - (60*120)); echo time_since($entry_datetime); echo ' ago'; */ ?> 
-						on <?php the_time('l, F jS, Y') ?> at <?php the_time() ?>
-						and is filed under <?php the_category(', ') ?>.
-						You can follow any responses to this entry through the <?php comments_rss_link('RSS 2.0'); ?> feed. 
-
-						<?php if (('open' == $post-> comment_status) && ('open' == $post->ping_status)) {
-							// Both Comments and Pings are open ?>
-							You can <a href="#respond">leave a response</a>, or <a href="<?php trackback_url(true); ?>" rel="trackback">trackback</a> from your own site.
-
-						<?php } elseif (!('open' == $post-> comment_status) && ('open' == $post->ping_status)) {
-							// Only Pings are Open ?>
-							Responses are currently closed, but you can <a href="<?php trackback_url(true); ?> " rel="trackback">trackback</a> from your own site.
-
-						<?php } elseif (('open' == $post-> comment_status) && !('open' == $post->ping_status)) {
-							// Comments are open, Pings are not ?>
-							You can skip to the end and leave a response. Pinging is currently not allowed.
-
-						<?php } elseif (!('open' == $post-> comment_status) && !('open' == $post->ping_status)) {
-							// Neither Comments, nor Pings are open ?>
-							Both comments and pings are currently closed.
-
-						<?php } edit_post_link('Edit this entry.','',''); ?>
-
-					</small>
-				</p>
-
-			</div>
-		</div>
-
-	<?php comments_template(); ?>
-
-	<?php endwhile; else: ?>
-
-		<p>Sorry, no attachments matched your criteria.</p>
-
-<?php endif; ?>
-
-	</div>
-
-<?php get_footer(); ?>
diff -x .svn -aruN 2.2.2.src/wp-content/themes/default/comments-popup.php 2.5.src/wp-content/themes/default/comments-popup.php
--- 2.2.2.src/wp-content/themes/default/comments-popup.php	2007-02-23 02:31:07.000000000 -0600
+++ 2.5.src/wp-content/themes/default/comments-popup.php	2008-03-21 11:10:33.000000000 -0500
@@ -56,9 +56,9 @@
 <p>Line and paragraph breaks automatic, e-mail address never displayed, <acronym title="Hypertext Markup Language">HTML</acronym> allowed: <code><?php echo allowed_tags(); ?></code></p>
 
 <form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post" id="commentform">
-<?php if ( $user_ID ) : ?> 
-	<p>Logged in as <a href="<?php echo get_option('siteurl'); ?>/wp-admin/profile.php"><?php echo $user_identity; ?></a>. <a href="<?php echo get_option('siteurl'); ?>/wp-login.php?action=logout" title="Log out of this account">Logout &raquo;</a></p>
-<?php else : ?> 
+<?php if ( $user_ID ) : ?>
+	<p>Logged in as <a href="<?php echo get_option('siteurl'); ?>/wp-admin/profile.php"><?php echo $user_identity; ?></a>. <a href="<?php echo get_option('siteurl'); ?>/wp-login.php?action=logout" title="Log out of this account">Log out &raquo;</a></p>
+<?php else : ?>
 	<p>
 	  <input type="text" name="author" id="author" class="textarea" value="<?php echo $comment_author; ?>" size="28" tabindex="1" />
 	   <label for="author">Name</label>
@@ -102,7 +102,7 @@
 
 <!-- // this is just the end of the motor - don't touch that line either :) -->
 <?php //} ?>
-<p class="credit"><?php timer_stop(1); ?> <cite>Powered by <a href="http://wordpress.org/" title="Powered by WordPress, state-of-the-art semantic personal publishing platform"><strong>Wordpress</strong></a></cite></p>
+<p class="credit"><?php timer_stop(1); ?> <cite>Powered by <a href="http://wordpress.org/" title="Powered by WordPress, state-of-the-art semantic personal publishing platform"><strong>WordPress</strong></a></cite></p>
 <?php // Seen at http://www.mijnkopthee.nl/log2/archive/2003/05/28/esc(18) ?>
 <script type="text/javascript">
 <!--
diff -x .svn -aruN 2.2.2.src/wp-content/themes/default/comments.php 2.5.src/wp-content/themes/default/comments.php
--- 2.2.2.src/wp-content/themes/default/comments.php	2007-04-19 22:52:41.000000000 -0500
+++ 2.5.src/wp-content/themes/default/comments.php	2008-03-17 18:12:17.000000000 -0500
@@ -1,5 +1,5 @@
 <?php // Do not delete these lines
-	if ('comments.php' == basename($_SERVER['SCRIPT_FILENAME']))
+	if (!empty($_SERVER['SCRIPT_FILENAME']) && 'comments.php' == basename($_SERVER['SCRIPT_FILENAME']))
 		die ('Please do not load this page directly. Thanks!');
 
 	if (!empty($post->post_password)) { // if there's a password
@@ -27,6 +27,7 @@
 	<?php foreach ($comments as $comment) : ?>
 
 		<li <?php echo $oddcomment; ?>id="comment-<?php comment_ID() ?>">
+			<?php echo get_avatar( $comment, 32 ); ?>
 			<cite><?php comment_author_link() ?></cite> Says:
 			<?php if ($comment->comment_approved == '0') : ?>
 			<em>Your comment is awaiting moderation.</em>
@@ -66,14 +67,14 @@
 <h3 id="respond">Leave a Reply</h3>
 
 <?php if ( get_option('comment_registration') && !$user_ID ) : ?>
-<p>You must be <a href="<?php echo get_option('siteurl'); ?>/wp-login.php?redirect_to=<?php the_permalink(); ?>">logged in</a> to post a comment.</p>
+<p>You must be <a href="<?php echo get_option('siteurl'); ?>/wp-login.php?redirect_to=<?php echo urlencode(get_permalink()); ?>">logged in</a> to post a comment.</p>
 <?php else : ?>
 
 <form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post" id="commentform">
 
 <?php if ( $user_ID ) : ?>
 
-<p>Logged in as <a href="<?php echo get_option('siteurl'); ?>/wp-admin/profile.php"><?php echo $user_identity; ?></a>. <a href="<?php echo get_option('siteurl'); ?>/wp-login.php?action=logout" title="Log out of this account">Logout &raquo;</a></p>
+<p>Logged in as <a href="<?php echo get_option('siteurl'); ?>/wp-admin/profile.php"><?php echo $user_identity; ?></a>. <a href="<?php echo get_option('siteurl'); ?>/wp-login.php?action=logout" title="Log out of this account">Log out &raquo;</a></p>
 
 <?php else : ?>
 
diff -x .svn -aruN 2.2.2.src/wp-content/themes/default/footer.php 2.5.src/wp-content/themes/default/footer.php
--- 2.2.2.src/wp-content/themes/default/footer.php	2007-04-04 18:35:37.000000000 -0500
+++ 2.5.src/wp-content/themes/default/footer.php	2007-06-27 18:25:49.000000000 -0500
@@ -1,7 +1,7 @@
 
 <hr />
 <div id="footer">
-<!-- If you'd like to support WordPress, having the "powered by" link somewhere on your blog is the best way, it's our only promotion or advertising. -->
+<!-- If you'd like to support WordPress, having the "powered by" link somewhere on your blog is the best way; it's our only promotion or advertising. -->
 	<p>
 		<?php bloginfo('name'); ?> is proudly powered by
 		<a href="http://wordpress.org/">WordPress</a>
diff -x .svn -aruN 2.2.2.src/wp-content/themes/default/functions.php 2.5.src/wp-content/themes/default/functions.php
--- 2.2.2.src/wp-content/themes/default/functions.php	2007-06-11 17:40:08.000000000 -0500
+++ 2.5.src/wp-content/themes/default/functions.php	2008-02-20 18:27:23.000000000 -0600
@@ -80,8 +80,8 @@
 add_action('admin_menu', 'kubrick_add_theme_page');
 
 function kubrick_add_theme_page() {
-	if ( $_GET['page'] == basename(__FILE__) ) {
-		if ( 'save' == $_REQUEST['action'] ) {
+	if ( isset( $_GET['page'] ) && $_GET['page'] == basename(__FILE__) ) {
+		if ( isset( $_REQUEST['action'] ) && 'save' == $_REQUEST['action'] ) {
 			check_admin_referer('kubrick-header');
 			if ( isset($_REQUEST['njform']) ) {
 				if ( isset($_REQUEST['defaults']) ) {
@@ -157,7 +157,7 @@
 		kUpdate(ColorPicker_targetInput.id);
 	}
 	function PopupWindow_populate(contents) {
-		contents += '<br /><p style="text-align:center;margin-top:0px;"><input type="button" value="<?php echo attribute_escape(__('Close Color Picker')); ?>" onclick="cp.hidePopup(\'prettyplease\')"></input></p>';
+		contents += '<br /><p style="text-align:center;margin-top:0px;"><input type="button" class="button-secondary" value="<?php echo attribute_escape(__('Close Color Picker')); ?>" onclick="cp.hidePopup(\'prettyplease\')"></input></p>';
 		this.contents = contents;
 		this.populated = false;
 	}
@@ -354,7 +354,7 @@
 }
 
 function kubrick_theme_page() {
-	if ( $_REQUEST['saved'] ) echo '<div id="message" class="updated fade"><p><strong>'.__('Options saved.').'</strong></p></div>';
+	if ( isset( $_REQUEST['saved'] ) ) echo '<div id="message" class="updated fade"><p><strong>'.__('Options saved.').'</strong></p></div>';
 ?>
 <div class='wrap'>
 	<div id="kubrick-header">
@@ -386,18 +386,18 @@
 		<div id="jsForm">
 			<form style="display:inline;" method="post" name="hicolor" id="hicolor" action="<?php echo attribute_escape($_SERVER['REQUEST_URI']); ?>">
 				<?php wp_nonce_field('kubrick-header'); ?>
-	<input type="button" onclick="tgt=document.getElementById('fontcolor');colorSelect(tgt,'pick1');return false;" name="pick1" id="pick1" value="<?php echo attribute_escape(__('Font Color')); ?>"></input>
-		<input type="button" onclick="tgt=document.getElementById('uppercolor');colorSelect(tgt,'pick2');return false;" name="pick2" id="pick2" value="<?php echo attribute_escape(__('Upper Color')); ?>"></input>
-		<input type="button" onclick="tgt=document.getElementById('lowercolor');colorSelect(tgt,'pick3');return false;" name="pick3" id="pick3" value="<?php echo attribute_escape(__('Lower Color')); ?>"></input>
-				<input type="button" name="revert" value="<?php echo attribute_escape(__('Revert')); ?>" onclick="kRevert()" />
-				<input type="button" value="<?php echo attribute_escape(__('Advanced')); ?>" onclick="toggleAdvanced()" />
+	<input type="button"  class="button-secondary" onclick="tgt=document.getElementById('fontcolor');colorSelect(tgt,'pick1');return false;" name="pick1" id="pick1" value="<?php echo attribute_escape(__('Font Color')); ?>"></input>
+		<input type="button" class="button-secondary" onclick="tgt=document.getElementById('uppercolor');colorSelect(tgt,'pick2');return false;" name="pick2" id="pick2" value="<?php echo attribute_escape(__('Upper Color')); ?>"></input>
+		<input type="button" class="button-secondary" onclick="tgt=document.getElementById('lowercolor');colorSelect(tgt,'pick3');return false;" name="pick3" id="pick3" value="<?php echo attribute_escape(__('Lower Color')); ?>"></input>
+				<input type="button" class="button-secondary" name="revert" value="<?php echo attribute_escape(__('Revert')); ?>" onclick="kRevert()" />
+				<input type="button" class="button-secondary" value="<?php echo attribute_escape(__('Advanced')); ?>" onclick="toggleAdvanced()" />
 				<input type="hidden" name="action" value="save" />
 				<input type="hidden" name="fontdisplay" id="fontdisplay" value="<?php echo attribute_escape(kubrick_header_display()); ?>" />
 				<input type="hidden" name="fontcolor" id="fontcolor" value="<?php echo attribute_escape(kubrick_header_color()); ?>" />
 				<input type="hidden" name="uppercolor" id="uppercolor" value="<?php echo attribute_escape(kubrick_upper_color()); ?>" />
 				<input type="hidden" name="lowercolor" id="lowercolor" value="<?php echo attribute_escape(kubrick_lower_color()); ?>" />
 				<input type="hidden" name="headerimage" id="headerimage" value="<?php echo attribute_escape(kubrick_header_image()); ?>" />
-				<p class="submit"><input type="submit" name="submitform" class="defbutton" value="<?php echo attribute_escape(__('Update Header &raquo;')); ?>" onclick="cp.hidePopup('prettyplease')" /></p>
+				<p class="submit"><input type="submit" name="submitform" class="defbutton" value="<?php echo attribute_escape(__('Update Header')); ?>" onclick="cp.hidePopup('prettyplease')" /></p>
 			</form>
 			<div id="colorPickerDiv" style="z-index: 100;background:#eee;border:1px solid #ccc;position:absolute;visibility:hidden;"> </div>
 			<div id="advanced">
@@ -406,8 +406,8 @@
 					<label for="advfontcolor"><?php _e('Font Color (CSS):'); ?> </label><input type="text" id="advfontcolor" onchange="advUpdate(this.value, 'fontcolor')" value="<?php echo attribute_escape(kubrick_header_color()); ?>" /><br />
 					<label for="advuppercolor"><?php _e('Upper Color (HEX):');?> </label><input type="text" id="advuppercolor" onchange="advUpdate(this.value, 'uppercolor')" value="#<?php echo attribute_escape(kubrick_upper_color()); ?>" /><br />
 					<label for="advlowercolor"><?php _e('Lower Color (HEX):'); ?> </label><input type="text" id="advlowercolor" onchange="advUpdate(this.value, 'lowercolor')" value="#<?php echo attribute_escape(kubrick_lower_color()); ?>" /><br />
-					<input type="button" name="default" value="<?php echo attribute_escape(__('Select Default Colors')); ?>" onclick="kDefaults()" /><br />
-					<input type="button" onclick="toggleDisplay();return false;" name="pick" id="pick" value="<?php echo attribute_escape(__('Toggle Text Display')); ?>"></input><br />
+					<input type="button" class="button-secondary" name="default" value="<?php echo attribute_escape(__('Select Default Colors')); ?>" onclick="kDefaults()" /><br />
+					<input type="button" class="button-secondary" onclick="toggleDisplay();return false;" name="pick" id="pick" value="<?php echo attribute_escape(__('Toggle Text Display')); ?>"></input><br />
 				</form>
 			</div>
 		</div>
diff -x .svn -aruN 2.2.2.src/wp-content/themes/default/header.php 2.5.src/wp-content/themes/default/header.php
--- 2.2.2.src/wp-content/themes/default/header.php	2007-03-19 14:08:15.000000000 -0500
+++ 2.5.src/wp-content/themes/default/header.php	2008-02-02 12:42:09.000000000 -0600
@@ -6,8 +6,6 @@
 
 <title><?php bloginfo('name'); ?> <?php if ( is_single() ) { ?> &raquo; Blog Archive <?php } ?> <?php wp_title(); ?></title>
 
-<meta name="generator" content="WordPress <?php bloginfo('version'); ?>" /> <!-- leave this for stats -->
-
 <link rel="stylesheet" href="<?php bloginfo('stylesheet_url'); ?>" type="text/css" media="screen" />
 <link rel="alternate" type="application/rss+xml" title="<?php bloginfo('name'); ?> RSS Feed" href="<?php bloginfo('rss2_url'); ?>" />
 <link rel="pingback" href="<?php bloginfo('pingback_url'); ?>" />
@@ -16,7 +14,7 @@
 
 <?php
 // Checks to see whether it needs a sidebar or not
-if ( !$withcomments && !is_single() ) {
+if ( !empty($withcomments) && !is_single() ) {
 ?>
 	#page { background: url("<?php bloginfo('stylesheet_directory'); ?>/images/kubrickbg-<?php bloginfo('text_direction'); ?>.jpg") repeat-y top; border: none; }
 <?php } else { // No sidebar ?>
diff -x .svn -aruN 2.2.2.src/wp-content/themes/default/image.php 2.5.src/wp-content/themes/default/image.php
--- 2.2.2.src/wp-content/themes/default/image.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-content/themes/default/image.php	2008-03-26 19:13:14.000000000 -0500
@@ -0,0 +1,63 @@
+<?php get_header(); ?>
+
+	<div id="content" class="widecolumn">
+
+  <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
+
+		<div class="post" id="post-<?php the_ID(); ?>">
+			<h2><a href="<?php echo get_permalink($post->post_parent); ?>" rev="attachment"><?php echo get_the_title($post->post_parent); ?></a> &raquo; <?php the_title(); ?></h2>
+			<div class="entry">
+				<p class="attachment"><a href="<?php echo wp_get_attachment_url($post->ID); ?>"><?php echo wp_get_attachment_image( $post->ID, 'medium' ); ?></a></p>
+                <div class="caption"><?php if ( !empty($post->post_excerpt) ) the_excerpt(); // this is the "caption" ?></div>
+
+				<?php the_content('<p class="serif">Read the rest of this entry &raquo;</p>'); ?>
+
+				<div class="navigation">
+					<div class="alignleft"><?php previous_image_link() ?></div>
+					<div class="alignright"><?php next_image_link() ?></div>
+				</div>
+				<br class="clear" />
+
+				<p class="postmetadata alt">
+					<small>
+						This entry was posted on <?php the_time('l, F jS, Y') ?> at <?php the_time() ?>
+						and is filed under <?php the_category(', ') ?>.
+						<?php the_taxonomies(); ?>
+						You can follow any responses to this entry through the <?php post_comments_feed_link('RSS 2.0'); ?> feed.
+
+						<?php if (('open' == $post-> comment_status) && ('open' == $post->ping_status)) {
+							// Both Comments and Pings are open ?>
+							You can <a href="#respond">leave a response</a>, or <a href="<?php trackback_url(); ?>" rel="trackback">trackback</a> from your own site.
+
+						<?php } elseif (!('open' == $post-> comment_status) && ('open' == $post->ping_status)) {
+							// Only Pings are Open ?>
+							Responses are currently closed, but you can <a href="<?php trackback_url(); ?> " rel="trackback">trackback</a> from your own site.
+
+						<?php } elseif (('open' == $post-> comment_status) && !('open' == $post->ping_status)) {
+							// Comments are open, Pings are not ?>
+							You can skip to the end and leave a response. Pinging is currently not allowed.
+
+						<?php } elseif (!('open' == $post-> comment_status) && !('open' == $post->ping_status)) {
+							// Neither Comments, nor Pings are open ?>
+							Both comments and pings are currently closed.
+
+						<?php } edit_post_link('Edit this entry.','',''); ?>
+
+					</small>
+				</p>
+
+			</div>
+
+		</div>
+
+	<?php comments_template(); ?>
+
+	<?php endwhile; else: ?>
+
+		<p>Sorry, no attachments matched your criteria.</p>
+
+<?php endif; ?>
+
+	</div>
+
+<?php get_footer(); ?>
diff -x .svn -aruN 2.2.2.src/wp-content/themes/default/images/header-img.php 2.5.src/wp-content/themes/default/images/header-img.php
--- 2.2.2.src/wp-content/themes/default/images/header-img.php	2006-01-04 19:47:22.000000000 -0600
+++ 2.5.src/wp-content/themes/default/images/header-img.php	2007-06-13 21:25:30.000000000 -0500
@@ -1,11 +1,11 @@
 <?php
-
+
 $img = 'kubrickheader.jpg';
-
+
 // If we don't have image processing support, redirect.
 if ( ! function_exists('imagecreatefromjpeg') )
 	die(header("Location: kubrickheader.jpg"));
-
+
 // Assign and validate the color values
 $default = false;
 $vars = array('upper'=>array('r1', 'g1', 'b1'), 'lower'=>array('r2', 'g2', 'b2'));
@@ -23,17 +23,17 @@
 		$default = true;
 	}
 }
-
+
 if ( $default )
 	list ( $r1, $g1, $b1, $r2, $g2, $b2 ) = array ( 105, 174, 231, 65, 128, 182 );
-
+
 // Create the image
 $im = imagecreatefromjpeg($img);
-
+
 // Get the background color, define the rectangle height
 $white = imagecolorat( $im, 15, 15 );
 $h = 182;
-
+
 // Define the boundaries of the rounded edges ( y => array ( x1, x2 ) )
 $corners = array(
 	0 => array ( 25, 734 ),
@@ -47,14 +47,14 @@
 	180 => array ( 23, 736 ),
 	181 => array ( 25, 734 ),
 	);
-
+
 // Blank out the blue thing
 for ( $i = 0; $i < $h; $i++ ) {
 	$x1 = 19;
 	$x2 = 740;
 	imageline( $im, $x1, 18 + $i, $x2, 18 + $i, $white );
 }
-
+
 // Draw a new color thing
 for ( $i = 0; $i < $h; $i++ ) {
 	$x1 = 20;
@@ -69,7 +69,7 @@
 	}
 	imageline( $im, $x1, 18 + $i, $x2, 18 + $i, $color );
 }
-
+
 //die;
 header("Content-Type: image/jpeg");
 imagejpeg($im, '', 92);
diff -x .svn -aruN 2.2.2.src/wp-content/themes/default/index.php 2.5.src/wp-content/themes/default/index.php
--- 2.2.2.src/wp-content/themes/default/index.php	2007-04-19 17:26:52.000000000 -0500
+++ 2.5.src/wp-content/themes/default/index.php	2007-09-18 17:50:59.000000000 -0500
@@ -7,21 +7,21 @@
 		<?php while (have_posts()) : the_post(); ?>
 
 			<div class="post" id="post-<?php the_ID(); ?>">
-				<h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"><?php the_title(); ?></a></h2>
+				<h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2>
 				<small><?php the_time('F jS, Y') ?> <!-- by <?php the_author() ?> --></small>
 
 				<div class="entry">
 					<?php the_content('Read the rest of this entry &raquo;'); ?>
 				</div>
 
-				<p class="postmetadata">Posted in <?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?>  <?php comments_popup_link('No Comments &#187;', '1 Comment &#187;', '% Comments &#187;'); ?></p>
+				<p class="postmetadata"><?php the_tags('Tags: ', ', ', '<br />'); ?> Posted in <?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?>  <?php comments_popup_link('No Comments &#187;', '1 Comment &#187;', '% Comments &#187;'); ?></p>
 			</div>
 
 		<?php endwhile; ?>
 
 		<div class="navigation">
-			<div class="alignleft"><?php next_posts_link('&laquo; Previous Entries') ?></div>
-			<div class="alignright"><?php previous_posts_link('Next Entries &raquo;') ?></div>
+			<div class="alignleft"><?php next_posts_link('&laquo; Older Entries') ?></div>
+			<div class="alignright"><?php previous_posts_link('Newer Entries &raquo;') ?></div>
 		</div>
 
 	<?php else : ?>
diff -x .svn -aruN 2.2.2.src/wp-content/themes/default/links.php 2.5.src/wp-content/themes/default/links.php
--- 2.2.2.src/wp-content/themes/default/links.php	2006-02-12 01:53:23.000000000 -0600
+++ 2.5.src/wp-content/themes/default/links.php	2008-01-28 14:18:07.000000000 -0600
@@ -10,7 +10,7 @@
 
 <h2>Links:</h2>
 <ul>
-<?php get_links_list(); ?>
+<?php wp_list_bookmarks(); ?>
 </ul>
 
 </div>
diff -x .svn -aruN 2.2.2.src/wp-content/themes/default/rtl.css 2.5.src/wp-content/themes/default/rtl.css
--- 2.2.2.src/wp-content/themes/default/rtl.css	2007-03-19 14:08:15.000000000 -0500
+++ 2.5.src/wp-content/themes/default/rtl.css	2008-03-27 15:42:50.000000000 -0500
@@ -1,63 +1,106 @@
-/* Based on Arabic (RTL) version of Kubrick theme, converted by Serdal (Serdal.com) */
-
-.narrowcolumn, .alignleft, .widecolumn .smallattachment { float: right; }
-.alignright, #commentform #submit { float: left; }
-
-#page, #wp-calendar #prev a { text-align: right; }
-
-
-body, #commentform p { font-family: Tahoma, 'Lucida Grande', Verdana, Arial, Sans-Serif; }
-
-small { font-family: Tahoma, Arial, Helvetica, Sans-Serif; }
-
-.commentlist li, #commentform input, #commentform textarea { font: 0.9em Tahoma, 'Lucida Grande', Verdana, Arial, Sans-Serif; }
-
-#sidebar { font: 1em Tahoma, 'Lucida Grande', Verdana, Arial, Sans-Serif; }
-
-#wp-calendar caption { font: bold 1.3em Tahoma, 'Lucida Grande', Verdana, Arial, Sans-Serif; }
-
-#header { margin: 0 1px 0 0; }
-
-.narrowcolumn { padding: 0 45px 20px 0; }
-
-.widecolumn { margin: 5px 150px 0 0; }
-
-.widecolumn .smallattachment { margin: 5px 0px 5px 5px; }
-
-.postmetadata { clear: right; }
-
-img.alignright { margin: 0 7px 2px 0; }
-
-img.alignleft { margin: 0 0 2px 7px; }
-
-.entry ol { padding: 0 35px 0 0; }
-
-#sidebar ul ul, #sidebar ul ol { margin: 5px 10px 0 0; }
-
-#sidebar ul ul ul, #sidebar ul ol { margin: 0 10px 0 0; }
-
-#commentform input { margin: 5px 0 1px 5px; }
-
-.commentlist p { margin: 10px 0 10px 5px; }
-
-#sidebar { margin-right: 545px; }
-
-#wp-calendar #prev a, html>body .entry ul { padding-right: 10px; }
-
-html>body .entry li { margin: 7px 10px 8px 0; }
-
-html>body .entry ul {
-	margin-right: 0px;
-	padding: 0 30px 0 0;
-}
-
-blockquote {
-	margin: 15px 10px 0 30px;
-	padding-right: 20px;
-	border-right: 5px solid #ddd;
-}
-
-#wp-calendar #next a {
-	padding-left: 10px;
-	text-align: left;
-}
+/*
+Theme name: WordPress Default - kubrick -
+Editors: Navid Kashani
+Persian Wordpress Project : wp-persian.com
+*/
+body, .commentlist li, #commentform input, #commentform textarea, #commentform p, #sidebar, #wp-calendar caption  {
+	font-family:tahoma, arial;
+}
+#page {
+	text-align:right;
+	direction:rtl;
+}
+h1, h2, h3, #sidebar h2 {
+	font-family:arial, tahoma;
+}
+.commentlist li .avatar {
+	float:left;
+}
+#header {
+	margin:0 1px 0 0;
+}
+.narrowcolumn {
+	float:right;
+	padding: 0 45px 20px 0;
+}
+.widecolumn {
+	margin: 5px 150px 0 0;
+}
+.widecolumn .smallattachment {
+	margin: 5px 0 5px 5px;
+}
+.postmetadata {
+	clear:right;
+}
+#sidebar {
+	margin-left: 0;
+	margin-right: 545px;
+}
+img.alignright {
+	margin: 0 7px 2px 0;
+}
+
+img.alignleft {
+	margin: 0 0 2px 7px;
+}
+
+.alignright {
+	float: left;
+}
+
+.alignleft {
+	float: right;
+}
+code {
+	display:block;
+	direction:ltr;
+	text-align:left;
+}
+acronym, abbr, span.caps {
+	letter-spacing:0; /* fix opera bug */
+}
+html>body .entry ul {
+	padding:0 10px 0 0;
+	text-indent:10px;
+}
+html>body .entry li {
+	margin: 7px 10px 8px 0;
+}
+.entry ol {
+	padding: 0 35px 0 0;
+}
+#sidebar ul ul, #sidebar ul ol {
+	margin: 5px 10px 0 0;
+}
+#sidebar ul ul ul, #sidebar ul ol {
+	margin: 0 10px 0 0;
+}
+#commentform input {
+	margin: 5px 0 1px 5px;
+}
+#commentform #submit {
+	float:left;
+}
+.commentlist p {
+	margin: 10px 0 10px 5px;
+}
+#wp-calendar #next a {
+	padding-right:0;
+	padding-left:10px;
+	text-align:left;
+}
+#wp-calendar #prev a {
+	padding-left:0;
+	padding-right:10px;
+	text-align:right;
+}
+blockquote {
+	margin: 15px 10px 0 30px;
+	padding-left: 0;
+	padding-right: 20px;
+	border-left: 0 none;
+	border-right: 5px solid #ddd;
+}
+#email, #url {
+	direction:ltr;
+}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-content/themes/default/search.php 2.5.src/wp-content/themes/default/search.php
--- 2.2.2.src/wp-content/themes/default/search.php	2007-04-19 17:26:52.000000000 -0500
+++ 2.5.src/wp-content/themes/default/search.php	2007-09-18 17:50:59.000000000 -0500
@@ -7,25 +7,25 @@
 		<h2 class="pagetitle">Search Results</h2>
 
 		<div class="navigation">
-			<div class="alignleft"><?php next_posts_link('&laquo; Previous Entries') ?></div>
-			<div class="alignright"><?php previous_posts_link('Next Entries &raquo;') ?></div>
+			<div class="alignleft"><?php next_posts_link('&laquo; Older Entries') ?></div>
+			<div class="alignright"><?php previous_posts_link('Newer Entries &raquo;') ?></div>
 		</div>
 
 
 		<?php while (have_posts()) : the_post(); ?>
 
 			<div class="post">
-				<h3 id="post-<?php the_ID(); ?>"><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"><?php the_title(); ?></a></h3>
+				<h3 id="post-<?php the_ID(); ?>"><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h3>
 				<small><?php the_time('l, F jS, Y') ?></small>
 
-				<p class="postmetadata">Posted in <?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?>  <?php comments_popup_link('No Comments &#187;', '1 Comment &#187;', '% Comments &#187;'); ?></p>
+				<p class="postmetadata"><?php the_tags('Tags: ', ', ', '<br />'); ?> Posted in <?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?>  <?php comments_popup_link('No Comments &#187;', '1 Comment &#187;', '% Comments &#187;'); ?></p>
 			</div>
 
 		<?php endwhile; ?>
 
 		<div class="navigation">
-			<div class="alignleft"><?php next_posts_link('&laquo; Previous Entries') ?></div>
-			<div class="alignright"><?php previous_posts_link('Next Entries &raquo;') ?></div>
+			<div class="alignleft"><?php next_posts_link('&laquo; Older Entries') ?></div>
+			<div class="alignright"><?php previous_posts_link('Newer Entries &raquo;') ?></div>
 		</div>
 
 	<?php else : ?>
diff -x .svn -aruN 2.2.2.src/wp-content/themes/default/sidebar.php 2.5.src/wp-content/themes/default/sidebar.php
--- 2.2.2.src/wp-content/themes/default/sidebar.php	2007-03-31 11:57:50.000000000 -0500
+++ 2.5.src/wp-content/themes/default/sidebar.php	2007-07-30 11:32:12.000000000 -0500
@@ -21,26 +21,26 @@
 			<p>You are currently browsing the archives for the <?php single_cat_title(''); ?> category.</p>
 
 			<?php /* If this is a yearly archive */ } elseif (is_day()) { ?>
-			<p>You are currently browsing the <a href="<?php bloginfo('url'); ?>/"><?php echo bloginfo('name'); ?></a> weblog archives
+			<p>You are currently browsing the <a href="<?php bloginfo('url'); ?>/"><?php echo bloginfo('name'); ?></a> blog archives
 			for the day <?php the_time('l, F jS, Y'); ?>.</p>
 
 			<?php /* If this is a monthly archive */ } elseif (is_month()) { ?>
-			<p>You are currently browsing the <a href="<?php bloginfo('url'); ?>/"><?php echo bloginfo('name'); ?></a> weblog archives
+			<p>You are currently browsing the <a href="<?php bloginfo('url'); ?>/"><?php echo bloginfo('name'); ?></a> blog archives
 			for <?php the_time('F, Y'); ?>.</p>
 
 			<?php /* If this is a yearly archive */ } elseif (is_year()) { ?>
-			<p>You are currently browsing the <a href="<?php bloginfo('url'); ?>/"><?php echo bloginfo('name'); ?></a> weblog archives
+			<p>You are currently browsing the <a href="<?php bloginfo('url'); ?>/"><?php echo bloginfo('name'); ?></a> blog archives
 			for the year <?php the_time('Y'); ?>.</p>
 
 			<?php /* If this is a monthly archive */ } elseif (is_search()) { ?>
-			<p>You have searched the <a href="<?php echo bloginfo('url'); ?>/"><?php echo bloginfo('name'); ?></a> weblog archives
+			<p>You have searched the <a href="<?php echo bloginfo('url'); ?>/"><?php echo bloginfo('name'); ?></a> blog archives
 			for <strong>'<?php the_search_query(); ?>'</strong>. If you are unable to find anything in these search results, you can try one of these links.</p>
 
 			<?php /* If this is a monthly archive */ } elseif (isset($_GET['paged']) && !empty($_GET['paged'])) { ?>
-			<p>You are currently browsing the <a href="<?php echo bloginfo('url'); ?>/"><?php echo bloginfo('name'); ?></a> weblog archives.</p>
+			<p>You are currently browsing the <a href="<?php echo bloginfo('url'); ?>/"><?php echo bloginfo('name'); ?></a> blog archives.</p>
 
 			<?php } ?>
-				
+
 			</li> <?php }?>
 
 			<?php wp_list_pages('title_li=<h2>Pages</h2>' ); ?>
@@ -67,7 +67,7 @@
 				</ul>
 				</li>
 			<?php } ?>
-			
+
 			<?php endif; ?>
 		</ul>
 	</div>
diff -x .svn -aruN 2.2.2.src/wp-content/themes/default/single.php 2.5.src/wp-content/themes/default/single.php
--- 2.2.2.src/wp-content/themes/default/single.php	2007-04-19 17:26:52.000000000 -0500
+++ 2.5.src/wp-content/themes/default/single.php	2008-03-10 19:46:58.000000000 -0500
@@ -10,12 +10,13 @@
 		</div>
 
 		<div class="post" id="post-<?php the_ID(); ?>">
-			<h2><a href="<?php echo get_permalink() ?>" rel="bookmark" title="Permanent Link: <?php the_title(); ?>"><?php the_title(); ?></a></h2>
+			<h2><?php the_title(); ?></h2>
 
 			<div class="entry">
 				<?php the_content('<p class="serif">Read the rest of this entry &raquo;</p>'); ?>
 
 				<?php wp_link_pages(array('before' => '<p><strong>Pages:</strong> ', 'after' => '</p>', 'next_or_number' => 'number')); ?>
+				<?php the_tags( '<p>Tags: ', ', ', '</p>'); ?>
 
 				<p class="postmetadata alt">
 					<small>
@@ -26,15 +27,15 @@
 							/* $entry_datetime = abs(strtotime($post->post_date) - (60*120)); echo time_since($entry_datetime); echo ' ago'; */ ?>
 						on <?php the_time('l, F jS, Y') ?> at <?php the_time() ?>
 						and is filed under <?php the_category(', ') ?>.
-						You can follow any responses to this entry through the <?php comments_rss_link('RSS 2.0'); ?> feed.
+						You can follow any responses to this entry through the <?php post_comments_feed_link('RSS 2.0'); ?> feed.
 
 						<?php if (('open' == $post-> comment_status) && ('open' == $post->ping_status)) {
 							// Both Comments and Pings are open ?>
-							You can <a href="#respond">leave a response</a>, or <a href="<?php trackback_url(true); ?>" rel="trackback">trackback</a> from your own site.
+							You can <a href="#respond">leave a response</a>, or <a href="<?php trackback_url(); ?>" rel="trackback">trackback</a> from your own site.
 
 						<?php } elseif (!('open' == $post-> comment_status) && ('open' == $post->ping_status)) {
 							// Only Pings are Open ?>
-							Responses are currently closed, but you can <a href="<?php trackback_url(true); ?> " rel="trackback">trackback</a> from your own site.
+							Responses are currently closed, but you can <a href="<?php trackback_url(); ?> " rel="trackback">trackback</a> from your own site.
 
 						<?php } elseif (('open' == $post-> comment_status) && !('open' == $post->ping_status)) {
 							// Comments are open, Pings are not ?>
diff -x .svn -aruN 2.2.2.src/wp-content/themes/default/style.css 2.5.src/wp-content/themes/default/style.css
--- 2.2.2.src/wp-content/themes/default/style.css	2006-12-01 06:09:35.000000000 -0600
+++ 2.5.src/wp-content/themes/default/style.css	2008-03-26 18:12:54.000000000 -0500
@@ -1,10 +1,11 @@
-/*  
+/*
 Theme Name: WordPress Default
 Theme URI: http://wordpress.org/
 Description: The default WordPress theme based on the famous <a href="http://binarybonsai.com/kubrick/">Kubrick</a>.
 Version: 1.6
 Author: Michael Heilemann
 Author URI: http://binarybonsai.com/
+Tags: blue, custom header, fixed width, two columns, widgets
 
 	Kubrick v1.5
 	 http://binarybonsai.com/kubrick/
@@ -38,11 +39,11 @@
 	background: #73a0c5 url('images/kubrickheader.jpg') no-repeat bottom center;
 	}
 
-#headerimg 	{ 
-	margin: 7px 9px 0; 
-	height: 192px; 
-	width: 740px; 
-	} 
+#headerimg 	{
+	margin: 7px 9px 0;
+	height: 192px;
+	width: 740px;
+	}
 
 #content {
 	font-size: 1.2em
@@ -71,7 +72,7 @@
 	}
 
 #footer {
-	background: #eee url('images/kubrickfooter.jpg') no-repeat top; 
+	background: #eee url('images/kubrickfooter.jpg') no-repeat top;
 	border: none;
 	}
 
@@ -138,6 +139,13 @@
 	font-weight: bold;
 	}
 
+.commentlist li .avatar { 
+	float: right;
+	border: 1px solid #eee;
+	padding: 2px;
+	background: #fff;
+	}
+
 .commentlist cite, .commentlist cite a {
 	font-weight: bold;
 	font-style: normal;
@@ -210,7 +218,7 @@
 /* Begin Structure */
 body {
 	margin: 0 0 20px 0;
-	padding: 0; 
+	padding: 0;
 	}
 
 #page {
@@ -223,9 +231,9 @@
 
 #header {
 	background-color: #73a0c5;
-	margin: 0 0 0 1px; 
-	padding: 0; 
-	height: 200px; 
+	margin: 0 0 0 1px;
+	padding: 0;
+	height: 200px;
 	width: 758px;
 	}
 
@@ -285,6 +293,10 @@
 	clear: left;
 }
 
+.clear {
+	clear: both;
+}
+
 #footer {
 	padding: 0;
 	margin: 0 auto;
@@ -385,7 +397,7 @@
 	list-style: none;
 	padding-left: 10px;
 	text-indent: -10px;
-	} 
+	}
 
 html>body .entry li {
 	margin: 7px 0 8px 10px;
@@ -449,7 +461,7 @@
 /* Begin Form Elements */
 #searchform {
 	margin: 10px auto;
-	padding: 5px 3px; 
+	padding: 5px 3px;
 	text-align: center;
 	}
 
diff -x .svn -aruN 2.2.2.src/wp-cron.php 2.5.src/wp-cron.php
--- 2.2.2.src/wp-cron.php	2007-04-16 15:47:23.000000000 -0500
+++ 2.5.src/wp-cron.php	2007-08-02 19:45:06.000000000 -0500
@@ -1,7 +1,7 @@
 <?php
 ignore_user_abort(true);
 define('DOING_CRON', TRUE);
-require_once('wp-config.php');
+require_once('./wp-config.php');
 
 if ( $_GET['check'] != wp_hash('187425') )
 	exit;
diff -x .svn -aruN 2.2.2.src/wp-includes/atomlib.php 2.5.src/wp-includes/atomlib.php
--- 2.2.2.src/wp-includes/atomlib.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/atomlib.php	2007-12-20 16:28:54.000000000 -0600
@@ -0,0 +1,354 @@
+<?php
+/*
+ * Atom Syndication Format PHP Library
+ *
+ * @package AtomLib
+ * @link http://code.google.com/p/phpatomlib/
+ *
+ * @author: Elias Torres <elias@torrez.us>
+ * @version: 0.4
+ * @since 2.3
+ */
+
+/**
+ * Structure that store common Atom Feed Properties
+ *
+ * @package AtomLib
+ */
+class AtomFeed {
+	/**
+	 * Stores Links
+	 * @var array
+	 * @access public
+	 */
+    var $links = array();
+    /**
+     * Stores Categories
+     * @var array
+     * @access public
+     */
+    var $categories = array();
+	/**
+	 * Stores Entries
+	 *
+	 * @var array
+	 * @access public
+	 */
+    var $entries = array();
+}
+
+/**
+ * Structure that store Atom Entry Properties
+ *
+ * @package AtomLib
+ */
+class AtomEntry {
+	/**
+	 * Stores Links
+	 * @var array
+	 * @access public
+	 */
+    var $links = array();
+    /**
+     * Stores Categories
+     * @var array
+	 * @access public
+     */
+    var $categories = array();
+}
+
+/**
+ * AtomLib Atom Parser API
+ *
+ * @package AtomLib
+ */
+class AtomParser {
+
+    var $NS = 'http://www.w3.org/2005/Atom';
+    var $ATOM_CONTENT_ELEMENTS = array('content','summary','title','subtitle','rights');
+    var $ATOM_SIMPLE_ELEMENTS = array('id','updated','published','draft');
+
+    var $debug = false;
+
+    var $depth = 0;
+    var $indent = 2;
+    var $in_content;
+    var $ns_contexts = array();
+    var $ns_decls = array();
+    var $content_ns_decls = array();
+    var $content_ns_contexts = array();
+    var $is_xhtml = false;
+    var $is_html = false;
+    var $is_text = true;
+    var $skipped_div = false;
+
+    var $FILE = "php://input";
+
+    var $feed;
+    var $current;
+
+    function AtomParser() {
+
+        $this->feed = new AtomFeed();
+        $this->current = null;
+        $this->map_attrs_func = create_function('$k,$v', 'return "$k=\"$v\"";');
+        $this->map_xmlns_func = create_function('$p,$n', '$xd = "xmlns"; if(strlen($n[0])>0) $xd .= ":{$n[0]}"; return "{$xd}=\"{$n[1]}\"";');
+    }
+
+    function _p($msg) {
+        if($this->debug) {
+            print str_repeat(" ", $this->depth * $this->indent) . $msg ."\n";
+        }
+    }
+
+    function error_handler($log_level, $log_text, $error_file, $error_line) {
+        $this->error = $log_text;
+    }
+
+    function parse() {
+
+        set_error_handler(array(&$this, 'error_handler'));
+
+        array_unshift($this->ns_contexts, array());
+
+        $parser = xml_parser_create_ns();
+        xml_set_object($parser, $this);
+        xml_set_element_handler($parser, "start_element", "end_element");
+        xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
+        xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,0);
+        xml_set_character_data_handler($parser, "cdata");
+        xml_set_default_handler($parser, "_default");
+        xml_set_start_namespace_decl_handler($parser, "start_ns");
+        xml_set_end_namespace_decl_handler($parser, "end_ns");
+
+        $this->content = '';
+
+        $ret = true;
+
+        $fp = fopen($this->FILE, "r");
+        while ($data = fread($fp, 4096)) {
+            if($this->debug) $this->content .= $data;
+
+            if(!xml_parse($parser, $data, feof($fp))) {
+                trigger_error(sprintf(__('XML error: %s at line %d')."\n",
+                    xml_error_string(xml_get_error_code($xml_parser)),
+                    xml_get_current_line_number($xml_parser)));
+                $ret = false;
+                break;
+            }
+        }
+        fclose($fp);
+
+        xml_parser_free($parser);
+
+        restore_error_handler();
+
+        return $ret;
+    }
+
+    function start_element($parser, $name, $attrs) {
+
+        $tag = array_pop(split(":", $name));
+
+        switch($name) {
+            case $this->NS . ':feed':
+                $this->current = $this->feed;
+                break;
+            case $this->NS . ':entry':
+                $this->current = new AtomEntry();
+                break;
+        };
+
+        $this->_p("start_element('$name')");
+        #$this->_p(print_r($this->ns_contexts,true));
+        #$this->_p('current(' . $this->current . ')');
+
+        array_unshift($this->ns_contexts, $this->ns_decls);
+
+        $this->depth++;
+
+        if(!empty($this->in_content)) {
+
+            $this->content_ns_decls = array();
+
+            if($this->is_html || $this->is_text)
+                trigger_error("Invalid content in element found. Content must not be of type text or html if it contains markup.");
+
+            $attrs_prefix = array();
+
+            // resolve prefixes for attributes
+            foreach($attrs as $key => $value) {
+                $with_prefix = $this->ns_to_prefix($key, true);
+                $attrs_prefix[$with_prefix[1]] = $this->xml_escape($value);
+            }
+
+            $attrs_str = join(' ', array_map($this->map_attrs_func, array_keys($attrs_prefix), array_values($attrs_prefix)));
+            if(strlen($attrs_str) > 0) {
+                $attrs_str = " " . $attrs_str;
+            }
+
+            $with_prefix = $this->ns_to_prefix($name);
+
+            if(!$this->is_declared_content_ns($with_prefix[0])) {
+                array_push($this->content_ns_decls, $with_prefix[0]);
+            }
+
+            $xmlns_str = '';
+            if(count($this->content_ns_decls) > 0) {
+                array_unshift($this->content_ns_contexts, $this->content_ns_decls);
+                $xmlns_str .= join(' ', array_map($this->map_xmlns_func, array_keys($this->content_ns_contexts[0]), array_values($this->content_ns_contexts[0])));
+                if(strlen($xmlns_str) > 0) {
+                    $xmlns_str = " " . $xmlns_str;
+                }
+            }
+
+            array_push($this->in_content, array($tag, $this->depth, "<". $with_prefix[1] ."{$xmlns_str}{$attrs_str}" . ">"));
+
+        } else if(in_array($tag, $this->ATOM_CONTENT_ELEMENTS) || in_array($tag, $this->ATOM_SIMPLE_ELEMENTS)) {
+            $this->in_content = array();
+            $this->is_xhtml = $attrs['type'] == 'xhtml';
+            $this->is_html = $attrs['type'] == 'html' || $attrs['type'] == 'text/html';
+            $this->is_text = !in_array('type',array_keys($attrs)) || $attrs['type'] == 'text';
+            $type = $this->is_xhtml ? 'XHTML' : ($this->is_html ? 'HTML' : ($this->is_text ? 'TEXT' : $attrs['type']));
+
+            if(in_array('src',array_keys($attrs))) {
+                $this->current->$tag = $attrs;
+            } else {
+                array_push($this->in_content, array($tag,$this->depth, $type));
+            }
+        } else if($tag == 'link') {
+            array_push($this->current->links, $attrs);
+        } else if($tag == 'category') {
+            array_push($this->current->categories, $attrs);
+        }
+
+        $this->ns_decls = array();
+    }
+
+    function end_element($parser, $name) {
+
+        $tag = array_pop(split(":", $name));
+
+        $ccount = count($this->in_content);
+
+        # if we are *in* content, then let's proceed to serialize it
+        if(!empty($this->in_content)) {
+            # if we are ending the original content element
+            # then let's finalize the content
+            if($this->in_content[0][0] == $tag &&
+                $this->in_content[0][1] == $this->depth) {
+                $origtype = $this->in_content[0][2];
+                array_shift($this->in_content);
+                $newcontent = array();
+                foreach($this->in_content as $c) {
+                    if(count($c) == 3) {
+                        array_push($newcontent, $c[2]);
+                    } else {
+                        if($this->is_xhtml || $this->is_text) {
+                            array_push($newcontent, $this->xml_escape($c));
+                        } else {
+                            array_push($newcontent, $c);
+                        }
+                    }
+                }
+                if(in_array($tag, $this->ATOM_CONTENT_ELEMENTS)) {
+                    $this->current->$tag = array($origtype, join('',$newcontent));
+                } else {
+                    $this->current->$tag = join('',$newcontent);
+                }
+                $this->in_content = array();
+            } else if($this->in_content[$ccount-1][0] == $tag &&
+                $this->in_content[$ccount-1][1] == $this->depth) {
+                $this->in_content[$ccount-1][2] = substr($this->in_content[$ccount-1][2],0,-1) . "/>";
+            } else {
+                # else, just finalize the current element's content
+                $endtag = $this->ns_to_prefix($name);
+                array_push($this->in_content, array($tag, $this->depth, "</$endtag[1]>"));
+            }
+        }
+
+        array_shift($this->ns_contexts);
+
+        $this->depth--;
+
+        if($name == ($this->NS . ':entry')) {
+            array_push($this->feed->entries, $this->current);
+            $this->current = null;
+        }
+
+        $this->_p("end_element('$name')");
+    }
+
+    function start_ns($parser, $prefix, $uri) {
+        $this->_p("starting: " . $prefix . ":" . $uri);
+        array_push($this->ns_decls, array($prefix,$uri));
+    }
+
+    function end_ns($parser, $prefix) {
+        $this->_p("ending: #" . $prefix . "#");
+    }
+
+    function cdata($parser, $data) {
+        $this->_p("data: #" . str_replace(array("\n"), array("\\n"), trim($data)) . "#");
+        if(!empty($this->in_content)) {
+            array_push($this->in_content, $data);
+        }
+    }
+
+    function _default($parser, $data) {
+        # when does this gets called?
+    }
+
+
+    function ns_to_prefix($qname, $attr=false) {
+        # split 'http://www.w3.org/1999/xhtml:div' into ('http','//www.w3.org/1999/xhtml','div')
+        $components = split(":", $qname);
+
+        # grab the last one (e.g 'div')
+        $name = array_pop($components);
+
+        if(!empty($components)) {
+            # re-join back the namespace component
+            $ns = join(":",$components);
+            foreach($this->ns_contexts as $context) {
+                foreach($context as $mapping) {
+                    if($mapping[1] == $ns && strlen($mapping[0]) > 0) {
+                        return array($mapping, "$mapping[0]:$name");
+                    }
+                }
+            }
+        }
+
+        if($attr) {
+            return array(null, $name);
+        } else {
+            foreach($this->ns_contexts as $context) {
+                foreach($context as $mapping) {
+                    if(strlen($mapping[0]) == 0) {
+                        return array($mapping, $name);
+                    }
+                }
+            }
+        }
+    }
+
+    function is_declared_content_ns($new_mapping) {
+        foreach($this->content_ns_contexts as $context) {
+            foreach($context as $mapping) {
+                if($new_mapping == $mapping) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    function xml_escape($string)
+    {
+             return str_replace(array('&','"',"'",'<','>'),
+                array('&amp;','&quot;','&apos;','&lt;','&gt;'),
+                $string );
+    }
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-includes/author-template.php 2.5.src/wp-includes/author-template.php
--- 2.2.2.src/wp-includes/author-template.php	2007-06-15 12:45:21.000000000 -0500
+++ 2.5.src/wp-includes/author-template.php	2008-02-29 11:09:44.000000000 -0600
@@ -1,86 +1,237 @@
 <?php
-
+/**
+ * Author Template functions for use in themes.
+ *
+ * @package WordPress
+ * @subpackage Template
+ */
+
+/**
+ * get_the_author() - Get the author of the current post in the Loop.
+ *
+ * @since 1.5
+ * @uses $authordata The current author's DB object.
+ * @uses apply_filters() Calls 'the_author' hook on the author display name.
+ *
+ * @param string $deprecated Deprecated.
+ * @return string The author's display name.
+ */
 function get_the_author($deprecated = '') {
 	global $authordata;
 	return apply_filters('the_author', $authordata->display_name);
 }
 
-// Using echo = false is deprecated.  Use get_the_author instead.
+/**
+ * the_author() - Echo the name of the author of the current post in the Loop.
+ *
+ * The behavior of this function is based off of old functionality predating get_the_author().
+ * This function is not deprecated, but is designed to echo the value from get_the_author()
+ * and as an result of any old theme that might still use the old behavior will also
+ * pass the value from get_the_author().
+ *
+ * The normal, expected behavior of this function is to echo the author and not return it.
+ * However, backwards compatiability has to be maintained.
+ *
+ * @since 0.71
+ * @see get_the_author()
+ *
+ * @param string $deprecated Deprecated.
+ * @param string $deprecated_echo Echo the string or return it. Deprecated, use get_the_author().
+ * @return string The author's display name, from get_the_author().
+ */
 function the_author($deprecated = '', $deprecated_echo = true) {
 	if ( $deprecated_echo )
 		echo get_the_author();
 	return get_the_author();
 }
 
+/**
+ * get_the_author_description() - Get the description of the author of the current post in the Loop.
+ *
+ * @since 1.5
+ * @uses $authordata The current author's DB object.
+ * @return string The author's description.
+ */
 function get_the_author_description() {
 	global $authordata;
 	return $authordata->description;
 }
+
+/**
+ * the_author_description() - Echo the description of the author of the current post in the Loop.
+ *
+ * @since 1.0.0
+ * @see get_the_author_description()
+ */
 function the_author_description() {
 	echo get_the_author_description();
 }
 
+/**
+ * get_the_author_login() - Get the login name of the author of the current post in the Loop.
+ *
+ * @since 1.5
+ * @uses $authordata The current author's DB object.
+ * @return string The author's login name (username).
+ */
 function get_the_author_login() {
 	global $authordata;
 	return $authordata->user_login;
 }
 
+/**
+ * the_author_login() - Echo the login name of the author of the current post in the Loop.
+ *
+ * @since 0.71
+ * @see get_the_author_login()
+ */
 function the_author_login() {
 	echo get_the_author_login();
 }
 
+/**
+ * get_the_author_firstname() - Get the first name of the author of the current post in the Loop.
+ *
+ * @since 1.5
+ * @uses $authordata The current author's DB object.
+ * @return string The author's first name.
+ */
 function get_the_author_firstname() {
 	global $authordata;
 	return $authordata->first_name;
 }
+
+/**
+ * the_author_firstname() - Echo the first name of the author of the current post in the Loop.
+ *
+ * @since 0.71
+ * @uses get_the_author_firstname()
+ */
 function the_author_firstname() {
 	echo get_the_author_firstname();
 }
 
+/**
+ * get_the_author_lastname() - Get the last name of the author of the current post in the Loop.
+ *
+ * @since 1.5
+ * @uses $authordata The current author's DB object.
+ * @return string The author's last name.
+ */
 function get_the_author_lastname() {
 	global $authordata;
 	return $authordata->last_name;
 }
 
+/**
+ * the_author_lastname() - Echo the last name of the author of the current post in the Loop.
+ *
+ * @since 0.71
+ * @uses get_the_author_lastname()
+ */
 function the_author_lastname() {
 	echo get_the_author_lastname();
 }
 
+/**
+ * get_the_author_nickname() - Get the nickname of the author of the current post in the Loop.
+ *
+ * @since 1.5
+ * @uses $authordata The current author's DB object.
+ * @return string The author's nickname.
+ */
 function get_the_author_nickname() {
 	global $authordata;
 	return $authordata->nickname;
 }
 
+/**
+ * the_author_nickname() - Echo the nickname of the author of the current post in the Loop.
+ *
+ * @since 0.71
+ * @uses get_the_author_nickname()
+ */
 function the_author_nickname() {
 	echo get_the_author_nickname();
 }
 
+/**
+ * get_the_author_ID() - Get the ID of the author of the current post in the Loop.
+ *
+ * @since 1.5
+ * @uses $authordata The current author's DB object.
+ * @return int The author's ID.
+ */
 function get_the_author_ID() {
 	global $authordata;
-	return $authordata->ID;
+	return (int) $authordata->ID;
 }
+
+/**
+ * the_author_ID() - Echo the ID of the author of the current post in the Loop.
+ *
+ * @since 0.71
+ * @uses get_the_author_ID()
+ */
 function the_author_ID() {
 	echo get_the_author_id();
 }
 
+/**
+ * get_the_author_email() - Get the email of the author of the current post in the Loop.
+ *
+ * @since 1.5
+ * @uses $authordata The current author's DB object.
+ * @return string The author's username.
+ */
 function get_the_author_email() {
 	global $authordata;
 	return $authordata->user_email;
 }
 
+/**
+ * the_author_email() - Echo the email of the author of the current post in the Loop.
+ *
+ * @since 0.71
+ * @uses get_the_author_email()
+ */
 function the_author_email() {
 	echo apply_filters('the_author_email', get_the_author_email() );
 }
 
+/**
+ * get_the_author_url() - Get the URL to the home page of the author of the current post in the Loop.
+ *
+ * @since 1.5
+ * @uses $authordata The current author's DB object.
+ * @return string The URL to the author's page.
+ */
 function get_the_author_url() {
 	global $authordata;
+
+	if ( 'http://' == $authordata->user_url )
+		return '';
+
 	return $authordata->user_url;
 }
 
+/**
+ * the_author_url() - Echo the URL to the home page of the author of the current post in the Loop.
+ *
+ * @since 0.71
+ * @uses get_the_author_url()
+ */
 function the_author_url() {
 	echo get_the_author_url();
 }
 
+/**
+ * the_author_link() - If the author has a home page set, echo an HTML link, otherwise just echo the author's name.
+ *
+ * @since 2.1
+ * @uses get_the_author_url()
+ * @uses the_author()
+ */
 function the_author_link() {
 	if (get_the_author_url()) {
 		echo '<a href="' . get_the_author_url() . '" title="' . sprintf(__("Visit %s's website"), get_the_author()) . '" rel="external">' . get_the_author() . '</a>';
@@ -89,61 +240,148 @@
 	}
 }
 
+/**
+ * get_the_author_icq() - Get the ICQ number of the author of the current post in the Loop.
+ *
+ * @since 1.5
+ * @uses $authordata The current author's DB object.
+ * @return string The author's ICQ number.
+ */
 function get_the_author_icq() {
 	global $authordata;
 	return $authordata->icq;
 }
 
+/**
+ * the_author_icq() - Echo the ICQ number of the author of the current post in the Loop.
+ *
+ * @since 0.71
+ * @see get_the_author_icq()
+ */
 function the_author_icq() {
 	echo get_the_author_icq();
 }
 
+/**
+ * get_the_author_aim() - Get the AIM name of the author of the current post in the Loop.
+ *
+ * @since 1.5
+ * @uses $authordata The current author's DB object.
+ * @return string The author's AIM name.
+ */
 function get_the_author_aim() {
 	global $authordata;
 	return str_replace(' ', '+', $authordata->aim);
 }
 
+/**
+ * the_author_aim() - Echo the AIM name of the author of the current post in the Loop.
+ *
+ * @since 0.71
+ * @see get_the_author_aim()
+ */
 function the_author_aim() {
 	echo get_the_author_aim();
 }
 
+/**
+ * get_the_author_yim() - Get the Yahoo! IM name of the author of the current post in the Loop.
+ *
+ * @since 1.5
+ * @uses $authordata The current author's DB object.
+ * @return string The author's Yahoo! IM name.
+ */
 function get_the_author_yim() {
 	global $authordata;
 	return $authordata->yim;
 }
 
+/**
+ * the_author_yim() - Echo the Yahoo! IM name of the author of the current post in the Loop.
+ *
+ * @since 0.71
+ * @see get_the_author_yim()
+ */
 function the_author_yim() {
 	echo get_the_author_yim();
 }
 
+/**
+ * get_the_author_msn() - Get the MSN address of the author of the current post in the Loop.
+ *
+ * @since 1.5
+ * @uses $authordata The current author's DB object.
+ * @return string The author's MSN address.
+ */
 function get_the_author_msn() {
 	global $authordata;
 	return $authordata->msn;
 }
 
+/**
+ * the_author_msn() - Echo the MSN address of the author of the current post in the Loop.
+ *
+ * @since 0.71
+ * @see get_the_author_msn()
+ */
 function the_author_msn() {
 	echo get_the_author_msn();
 }
 
+/**
+ * get_the_author_posts() - Get the number of posts by the author of the current post in the Loop.
+ *
+ * @since 1.5
+ * @uses $post The current post in the Loop's DB object.
+ * @uses get_usernumposts()
+ * @return int The number of posts by the author.
+ */
 function get_the_author_posts() {
 	global $post;
-	$posts = get_usernumposts($post->post_author);
-	return $posts;
+	return get_usernumposts($post->post_author);
 }
 
+/**
+ * the_author_posts() - Echo the number of posts by the author of the current post in the Loop.
+ *
+ * @since 0.71
+ * @uses get_the_author_posts() Echos returned value from function.
+ */
 function the_author_posts() {
 	echo get_the_author_posts();
 }
 
-/* the_author_posts_link() requires no get_, use get_author_posts_url() */
+/**
+ * the_author_posts_link() - Echo an HTML link to the author page of the author of the current post in the Loop.
+ *
+ * Does just echo get_author_posts_url() function, like the others do. The reason for this,
+ * is that another function is used to help in printing the link to the author's posts.
+ *
+ * @since 1.2
+ * @uses $authordata The current author's DB object.
+ * @uses get_author_posts_url()
+ * @uses get_the_author()
+ * @param string $deprecated Deprecated.
+ */
 function the_author_posts_link($deprecated = '') {
 	global $authordata;
-
-	echo '<a href="' . get_author_posts_url($authordata->ID, $authordata->user_nicename) . '" title="' . sprintf(__("Posts by %s"), attribute_escape(get_the_author())) . '">' . get_the_author() . '</a>';
+	printf(
+		'<a href="%1$s" title="%2$s">%3$s</a>',
+		get_author_posts_url( $authordata->ID, $authordata->user_nicename ),
+		sprintf( __( 'Posts by %s' ), attribute_escape( get_the_author() ) ),
+		get_the_author()
+	);
 }
 
+/**
+ * get_author_posts_url() - Get the URL to the author page of the author of the current post in the Loop.
+ *
+ * @since 2.1
+ * @uses $wp_rewrite WP_Rewrite
+ * @return string The URL to the author's page.
+ */
 function get_author_posts_url($author_id, $author_nicename = '') {
-	global $wpdb, $wp_rewrite, $post, $cache_userdata;
+	global $wp_rewrite;
 	$auth_ID = (int) $author_id;
 	$link = $wp_rewrite->get_author_permastruct();
 
@@ -165,44 +403,65 @@
 	return $link;
 }
 
-// Get author's preferred display name
+/**
+ * get_author_name() - Get the specified author's preferred display name.
+ *
+ * @since 1.0.0
+ * @param int $auth_id The ID of the author.
+ * @return string The author's display name.
+ */
 function get_author_name( $auth_id ) {
 	$authordata = get_userdata( $auth_id );
-
 	return $authordata->display_name;
 }
 
+/**
+ * wp_list_authors() - List all the authors of the blog, with several options available.
+ *
+ * optioncount (boolean) (false): Show the count in parenthesis next to the author's name.
+ * exclude_admin (boolean) (true): Exclude the 'admin' user that is installed by default.
+ * show_fullname (boolean) (false): Show their full names.
+ * hide_empty (boolean) (true): Don't show authors without any posts.
+ * feed (string) (''): If isn't empty, show links to author's feeds.
+ * feed_image (string) (''): If isn't empty, use this image to link to feeds.
+ * echo (boolean) (true): Set to false to return the output, instead of echoing.
+ *
+ * @since 1.2
+ * @param array $args The argument array.
+ * @return null|string The output, if echo is set to false.
+ */
 function wp_list_authors($args = '') {
 	global $wpdb;
-	
-	if ( is_array($args) )
-		$r = &$args;
-	else
-		parse_str($args, $r);
-
-	$defaults = array('optioncount' => false, 'exclude_admin' => true, 'show_fullname' => false, 'hide_empty' => true,
-		'feed' => '', 'feed_image' => '');
-	$r = array_merge($defaults, $r);
+
+	$defaults = array(
+		'optioncount' => false, 'exclude_admin' => true,
+		'show_fullname' => false, 'hide_empty' => true,
+		'feed' => '', 'feed_image' => '', 'feed_type' => '', 'echo' => true
+	);
+
+	$r = wp_parse_args( $args, $defaults );
 	extract($r, EXTR_SKIP);
-	
-	// TODO:  Move select to get_authors().
+
+	$return = '';
+
+	/** @todo Move select to get_authors(). */
 	$authors = $wpdb->get_results("SELECT ID, user_nicename from $wpdb->users " . ($exclude_admin ? "WHERE user_login <> 'admin' " : '') . "ORDER BY display_name");
-	
+
 	$author_count = array();
-	foreach ((array) $wpdb->get_results("SELECT DISTINCT post_author, COUNT(ID) AS count FROM $wpdb->posts WHERE post_status = 'publish' GROUP BY post_author") as $row) {
+	foreach ((array) $wpdb->get_results("SELECT DISTINCT post_author, COUNT(ID) AS count FROM $wpdb->posts WHERE post_type = 'post' AND " . get_private_posts_cap_sql( 'post' ) . " GROUP BY post_author") as $row) {
 		$author_count[$row->post_author] = $row->count;
 	}
 
 	foreach ( (array) $authors as $author ) {
 		$author = get_userdata( $author->ID );
 		$posts = (isset($author_count[$author->ID])) ? $author_count[$author->ID] : 0;
-		$name = $author->nickname;
+		$name = $author->display_name;
 
 		if ( $show_fullname && ($author->first_name != '' && $author->last_name != '') )
 			$name = "$author->first_name $author->last_name";
 
 		if ( !($posts == 0 && $hide_empty) )
-			echo "<li>";
+			$return .= '<li>';
 		if ( $posts == 0 ) {
 			if ( !$hide_empty )
 				$link = $name;
@@ -225,7 +484,7 @@
 				$link .= '>';
 
 				if ( !empty($feed_image) )
-					$link .= "<img src=\"$feed_image\" border=\"0\"$alt$title" . ' />';
+					$link .= "<img src=\"$feed_image\" style=\"border: none;\"$alt$title" . ' />';
 				else
 					$link .= $name;
 
@@ -241,8 +500,11 @@
 		}
 
 		if ( !($posts == 0 && $hide_empty) )
-			echo "$link</li>";
+			$return .= $link . '</li>';
 	}
+	if ( !$echo )
+		return $return;
+	echo $return;
 }
 
 ?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/bookmark-template.php 2.5.src/wp-includes/bookmark-template.php
--- 2.2.2.src/wp-includes/bookmark-template.php	2007-06-15 12:45:21.000000000 -0500
+++ 2.5.src/wp-includes/bookmark-template.php	2008-02-13 15:56:56.000000000 -0600
@@ -1,259 +1,52 @@
 <?php
-
-/** function wp_get_links()
- ** Gets the links associated with category n.
- ** Parameters:
- **   category (no default)  - The category to use.
- ** or:
- **   a query string
- **/
-function wp_get_links($args = '') {
-	global $wpdb;
-
-	if ( empty($args) )
-		return;
-
-	if ( false === strpos($args, '=') ) {
-		$cat_id = $args;
-		$args = add_query_arg('category', $cat_id, $args);
-	}
-
-	parse_str($args);
-
-	if ( !isset($category) )         $category = -1;
-	if ( !isset($before) )           $before = '';
-	if ( !isset($after) )            $after = '<br />';
-	if ( !isset($between) )          $between = ' ';
-	if ( !isset($show_images) )      $show_images = true;
-	if ( !isset($orderby) )          $orderby = 'name';
-	if ( !isset($show_description) ) $show_description = true;
-	if ( !isset($show_rating) )      $show_rating = false;
-	if ( !isset($limit) )            $limit = -1;
-	if ( !isset($show_updated) )     $show_updated = 1;
-	if ( !isset($echo) )             $echo = true;
-
-	return get_links($category, $before, $after, $between, $show_images, $orderby, $show_description, $show_rating, $limit, $show_updated, $echo);
-} // end wp_get_links
-
-/** function get_links()
- ** Gets the links associated with category n.
- ** Parameters:
- **   category (default -1)  - The category to use. If no category supplied
- **      uses all
- **   before (default '')  - the html to output before the link
- **   after (default '<br />')  - the html to output after the link
- **   between (default ' ')  - the html to output between the link/image
- **     and its description. Not used if no image or show_images == true
- **   show_images (default true) - whether to show images (if defined).
- **   orderby (default 'id') - the order to output the links. E.g. 'id', 'name',
- **     'url', 'description', or 'rating'. Or maybe owner. If you start the
- **     name with an underscore the order will be reversed.
- **     You can also specify 'rand' as the order which will return links in a
- **     random order.
- **   show_description (default true) - whether to show the description if
- **    show_images=false/not defined .
- **   show_rating (default false) - show rating stars/chars
- **   limit (default -1) - Limit to X entries. If not specified, all entries
- **     are shown.
- **   show_updated (default 0) - whether to show last updated timestamp
- **   echo (default true) - whether to echo the results, or return them instead
- */
-function get_links($category = -1,
-			$before = '',
-			$after = '<br />',
-			$between = ' ',
-			$show_images = true,
-			$orderby = 'name',
-			$show_description = true,
-			$show_rating = false,
-			$limit = -1,
-			$show_updated = 1,
-			$echo = true) {
-
-	global $wpdb;
-
-	$order = 'ASC';
-	if ( substr($orderby, 0, 1) == '_' ) {
-		$order = 'DESC';
-		$orderby = substr($orderby, 1);
-	}
-
-	if ( $category == -1 ) //get_bookmarks uses '' to signify all categories
-		$category = '';
-
-	$results = get_bookmarks("category=$category&orderby=$orderby&order=$order&show_updated=$show_updated&limit=$limit");
-
-	if ( !$results )
-		return;
-
-	$output = '';
-
-	foreach ( (array) $results as $row ) {
-		if ( !isset($row->recently_updated) )
-			$row->recently_updated = false;
-		$output .= $before;
-		if ( $show_updated && $row->recently_updated )
-			$output .= get_option('links_recently_updated_prepend');
-		$the_link = '#';
-		if ( !empty($row->link_url) )
-			$the_link = clean_url($row->link_url);
-		$rel = $row->link_rel;
-		if ( '' != $rel )
-			$rel = ' rel="' . $rel . '"';
-
-		$desc = attribute_escape($row->link_description);
-		$name = attribute_escape($row->link_name);
-		$title = $desc;
-
-		if ( $show_updated )
-			if (substr($row->link_updated_f, 0, 2) != '00')
-				$title .= ' ('.__('Last updated') . ' ' . date(get_option('links_updated_date_format'), $row->link_updated_f + (get_option('gmt_offset') * 3600)) . ')';
-
-		if ( '' != $title )
-			$title = ' title="' . $title . '"';
-
-		$alt = ' alt="' . $name . '"';
-
-		$target = $row->link_target;
-		if ( '' != $target )
-			$target = ' target="' . $target . '"';
-
-		$output .= '<a href="' . $the_link . '"' . $rel . $title . $target. '>';
-
-		if ( $row->link_image != null && $show_images ) {
-			if ( strpos($row->link_image, 'http') !== false )
-				$output .= "<img src=\"$row->link_image\" $alt $title />";
-			else // If it's a relative path
-				$output .= "<img src=\"" . get_option('siteurl') . "$row->link_image\" $alt $title />";
-		} else {
-			$output .= $name;
-		}
-
-		$output .= '</a>';
-
-		if ( $show_updated && $row->recently_updated )
-			$output .= get_option('links_recently_updated_append');
-
-		if ( $show_description && '' != $desc )
-			$output .= $between . $desc;
-		
-		if ($show_rating) {
-			$output .= $between . get_linkrating($row);
-		}
-
-		$output .= "$after\n";
-	} // end while
-
-	if ( !$echo )
-		return $output;
-	echo $output;
-}
-
-function get_linkrating($link) {
-	return apply_filters('link_rating', $link->link_rating);
-}
-
-/** function get_linkcatname()
- ** Gets the name of category n.
- ** Parameters: id (default 0)  - The category to get. If no category supplied
- **                uses 0
- */
-function get_linkcatname($id = 0) {
-	$id = (int) $id;
-
-	if ( empty($id) )
-		return '';
-
-	$cats = wp_get_link_cats($id);
-
-	if ( empty($cats) || ! is_array($cats) )
-		return '';
-
-	$cat_id = (int) $cats[0]; // Take the first cat.
-
-	$cat = get_category($cat_id);
-	return $cat->cat_name;
-}
-
-/** function links_popup_script()
- ** This function contributed by Fullo -- http://sprite.csr.unibo.it/fullo/
- ** Show the link to the links popup and the number of links
- ** Parameters:
- **   text (default Links)  - the text of the link
- **   width (default 400)  - the width of the popup window
- **   height (default 400)  - the height of the popup window
- **   file (default linkspopup.php) - the page to open in the popup window
- **   count (default true) - the number of links in the db
+/**
+ * Bookmark Template Functions for usage in Themes
+ *
+ * @package WordPress
+ * @subpackage Template
  */
-function links_popup_script($text = 'Links', $width=400, $height=400, $file='links.all.php', $count = true) {
-	if ( $count )
-		$counts = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->links");
-
-	$javascript = "<a href=\"#\" onclick=\"javascript:window.open('$file?popup=1', '_blank', 'width=$width,height=$height,scrollbars=yes,status=no'); return false\">";
-	$javascript .= $text;
-
-	if ( $count )
-		$javascript .= " ($counts)";
-
-	$javascript .= "</a>\n\n";
-		echo $javascript;
-}
-
 
-/*
- * function get_links_list()
+/**
+ * _walk_bookmarks() - The formatted output of a list of bookmarks
+ *
+ * The $bookmarks array must contain bookmark objects and will be iterated over
+ * to retrieve the bookmark to be used in the output.
+ *
+ * The output is formatted as HTML with no way to change that format. However, what
+ * is between, before, and after can be changed. The link itself will be HTML.
+ *
+ * This function is used internally by wp_list_bookmarks() and should not be used by
+ * themes.
+ *
+ * The defaults for overwriting are:
+ * 'show_updated' - Default is 0 (integer). Will show the time of when the bookmark was last updated.
+ * 'show_description' - Default is 0 (integer). Whether to show the description of the bookmark.
+ * 'show_images' - Default is 1 (integer). Whether to show link image if available.
+ * 'before' - Default is '<li>' (string). The html or text to prepend to each bookmarks.
+ * 'after' - Default is '</li>' (string). The html or text to append to each bookmarks.
+ * 'between' - Default is '\n' (string). The string for use in between the link, description, and image.
+ * 'show_rating' - Default is 0 (integer). Whether to show the link rating.
  *
- * added by Dougal
+ * @since 2.1
+ * @access private
+ * @usedby wp_list_bookmarks()
  *
- * Output a list of all links, listed by category, using the
- * settings in $wpdb->linkcategories and output it as a nested
- * HTML unordered list.
- *
- * Parameters:
- *   order (default 'name')  - Sort link categories by 'name' or 'id'
- *   hide_if_empty (default true)  - Supress listing empty link categories
+ * @param array $bookmarks List of bookmarks to traverse
+ * @param string|array $args Optional. Overwrite the defaults.
+ * @return string Formatted output in HTML
  */
-function get_links_list($order = 'name', $hide_if_empty = 'obsolete') {
-	$order = strtolower($order);
-
-	// Handle link category sorting
-	$direction = 'ASC';
-	if ( '_' == substr($order,0,1) ) {
-		$direction = 'DESC';
-		$order = substr($order,1);
-	}
-
-	if ( !isset($direction) )
-		$direction = '';
-
-	$cats = get_categories("type=link&orderby=$order&order=$direction&hierarchical=0");
-
-	// Display each category
-	if ( $cats ) {
-		foreach ( (array) $cats as $cat ) {
-			// Handle each category.
-
-			// Display the category name
-			echo '	<li id="linkcat-' . $cat->cat_ID . '" class="linkcat"><h2>' . $cat->cat_name . "</h2>\n\t<ul>\n";
-			// Call get_links() with all the appropriate params
-			get_links($cat->cat_ID, '<li>', "</li>", "\n", true, 'name', false);
+function _walk_bookmarks($bookmarks, $args = '' ) {
+	$defaults = array(
+		'show_updated' => 0, 'show_description' => 0,
+		'show_images' => 1, 'before' => '<li>',
+		'after' => '</li>', 'between' => "\n",
+		'show_rating' => 0
+	);
 
-			// Close the last category
-			echo "\n\t</ul>\n</li>\n";
-		}
-	}
-}
+	$r = wp_parse_args( $args, $defaults );
+	extract( $r, EXTR_SKIP );
 
-function _walk_bookmarks($bookmarks, $args = '' ) {
-	if ( is_array($args) )
-		$r = &$args;
-	else
-		parse_str($args, $r);
-
-	$defaults = array('show_updated' => 0, 'show_description' => 0, 'show_images' => 1, 'before' => '<li>',
-		'after' => '</li>', 'between' => "\n");
-	$r = array_merge($defaults, $r);
-	extract($r, EXTR_SKIP);
+	$output = ''; // Blank string to start with.
 
 	foreach ( (array) $bookmarks as $bookmark ) {
 		if ( !isset($bookmark->recently_updated) )
@@ -270,8 +63,8 @@
 		if ( '' != $rel )
 			$rel = ' rel="' . $rel . '"';
 
-		$desc = attribute_escape(apply_filters('link_description', $bookmark->link_description)); 
- 		$name = attribute_escape(apply_filters('link_title', $bookmark->link_name)); 
+		$desc = attribute_escape(sanitize_bookmark_field('link_description', $bookmark->link_description, $bookmark->link_id, 'display'));
+		$name = attribute_escape(sanitize_bookmark_field('link_name', $bookmark->link_name, $bookmark->link_id, 'display'));
  		$title = $desc;
 
 		if ( $show_updated )
@@ -308,44 +101,86 @@
 
 		if ( $show_description && '' != $desc )
 			$output .= $between . $desc;
-		
+
 		if ($show_rating) {
 			$output .= $between . get_linkrating($bookmark);
 		}
-		
+
 		$output .= "$after\n";
 	} // end while
 
 	return $output;
 }
 
+/**
+ * wp_list_bookmarks() - Retrieve or echo all of the bookmarks
+ *
+ * List of default arguments are as follows:
+ * 'orderby' - Default is 'name' (string). How to order the links by. String is based off of the bookmark scheme.
+ * 'order' - Default is 'ASC' (string). Either 'ASC' or 'DESC'. Orders in either ascending or descending order.
+ * 'limit' - Default is -1 (integer) or show all. The amount of bookmarks to display.
+ * 'category' - Default is empty string (string). Include the links in what category ID(s).
+ * 'category_name' - Default is empty string (string). Get links by category name.
+ * 'hide_invisible' - Default is 1 (integer). Whether to show (default) or hide links marked as 'invisible'.
+ * 'show_updated' - Default is 0 (integer). Will show the time of when the bookmark was last updated.
+ * 'echo' - Default is 1 (integer). Whether to echo (default) or return the formatted bookmarks.
+ * 'categorize' - Default is 1 (integer). Whether to show links listed by category (default) or show links in one column.
+ *
+ * These options define how the Category name will appear before the category links are displayed, if 'categorize' is 1.
+ * If 'categorize' is 0, then it will display for only the 'title_li' string and only if 'title_li' is not empty.
+ * 'title_li' - Default is 'Bookmarks' (translatable string). What to show before the links appear.
+ * 'title_before' - Default is '<h2>' (string). The HTML or text to show before the 'title_li' string.
+ * 'title_after' - Default is '</h2>' (string). The HTML or text to show after the 'title_li' string.
+ * 'class' - Default is 'linkcat' (string). The CSS class to use for the 'title_li'.
+ *
+ * 'category_before' - Default is '<li id="%id" class="%class">'. String must contain '%id' and '%class' to get
+ * the id of the category and the 'class' argument. These are used for formatting in themes. Argument will be displayed
+ * before the 'title_before' argument.
+ * 'category_after' - Default is '</li>' (string). The HTML or text that will appear after the list of links.
+ *
+ * These are only used if 'categorize' is set to 1 or true.
+ * 'category_orderby' - Default is 'name'. How to order the bookmark category based on term scheme.
+ * 'category_order' - Default is 'ASC'. Set the order by either ASC (ascending) or DESC (descending).
+ *
+ * @see _walk_bookmarks() For other arguments that can be set in this function and passed to _walk_bookmarks().
+ * @see get_bookmarks() For other arguments that can be set in this function and passed to get_bookmarks().
+ *
+ * @since 2.1
+ * @uses _list_bookmarks() Used to iterate over all of the bookmarks and return the html
+ * @uses get_terms() Gets all of the categories that are for links.
+ *
+ * @param string|array $args Optional. Overwrite the defaults of the function
+ * @return string|null Will only return if echo option is set to not echo. Default is not return anything.
+ */
 function wp_list_bookmarks($args = '') {
-	if ( is_array($args) )
-		$r = &$args;
-	else
-		parse_str($args, $r);
-
-	$defaults = array('orderby' => 'name', 'order' => 'ASC', 'limit' => -1, 'category' => '',
-		'category_name' => '', 'hide_invisible' => 1, 'show_updated' => 0, 'echo' => 1,
-		'categorize' => 1, 'title_li' => __('Bookmarks'), 'title_before' => '<h2>', 'title_after' => '</h2>',
-		'category_orderby' => 'name', 'category_order' => 'ASC', 'class' => 'linkcat',
-		'category_before' => '<li id="%id" class="%class">', 'category_after' => '</li>');
-	$r = array_merge($defaults, $r);
-	extract($r, EXTR_SKIP);
+	$defaults = array(
+		'orderby' => 'name', 'order' => 'ASC',
+		'limit' => -1, 'category' => '',
+		'category_name' => '', 'hide_invisible' => 1,
+		'show_updated' => 0, 'echo' => 1,
+		'categorize' => 1, 'title_li' => __('Bookmarks'),
+		'title_before' => '<h2>', 'title_after' => '</h2>',
+		'category_orderby' => 'name', 'category_order' => 'ASC',
+		'class' => 'linkcat', 'category_before' => '<li id="%id" class="%class">',
+		'category_after' => '</li>'
+	);
+
+	$r = wp_parse_args( $args, $defaults );
+	extract( $r, EXTR_SKIP );
 
 	$output = '';
 
 	if ( $categorize ) {
 		//Split the bookmarks into ul's for each category
-		$cats = get_categories("type=link&category_name=$category_name&include=$category&orderby=$category_orderby&order=$category_order&hierarchical=0");
+		$cats = get_terms('link_category', "category_name=$category_name&include=$category&orderby=$category_orderby&order=$category_order&hierarchical=0");
 
 		foreach ( (array) $cats as $cat ) {
-			$params = array_merge($r, array('category'=>$cat->cat_ID));
+			$params = array_merge($r, array('category'=>$cat->term_id));
 			$bookmarks = get_bookmarks($params);
 			if ( empty($bookmarks) )
 				continue;
-			$output .= str_replace(array('%id', '%class'), array("linkcat-$cat->cat_ID", $class), $category_before);
-			$catname = apply_filters( "link_category", $cat->cat_name );
+			$output .= str_replace(array('%id', '%class'), array("linkcat-$cat->term_id", $class), $category_before);
+			$catname = apply_filters( "link_category", $cat->name );
 			$output .= "$title_before$catname$title_after\n\t<ul>\n";
 			$output .= _walk_bookmarks($bookmarks, $r);
 			$output .= "\n\t</ul>\n$category_after\n";
@@ -366,9 +201,11 @@
 		}
 	}
 
+	$output = apply_filters( 'wp_list_bookmarks', $output );
+
 	if ( !$echo )
 		return $output;
 	echo $output;
 }
 
-?>
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/bookmark.php 2.5.src/wp-includes/bookmark.php
--- 2.2.2.src/wp-includes/bookmark.php	2007-06-15 12:45:21.000000000 -0500
+++ 2.5.src/wp-includes/bookmark.php	2008-03-10 00:28:21.000000000 -0500
@@ -1,11 +1,29 @@
 <?php
-
-function get_bookmark($bookmark_id, $output = OBJECT) {
+/**
+ * Link/Bookmark API
+ *
+ * @package WordPress
+ * @subpackage Bookmark
+ */
+
+/**
+ * get_bookmark() - Get Bookmark data based on ID
+ *
+ * @since 2.1
+ * @uses $wpdb Database Object
+ *
+ * @param int $bookmark_id
+ * @param string $output Optional. Either OBJECT, ARRAY_N, or ARRAY_A constant
+ * @param string $filter Optional, default is 'raw'.
+ * @return array|object Type returned depends on $output value.
+ */
+function get_bookmark($bookmark_id, $output = OBJECT, $filter = 'raw') {
 	global $wpdb;
 
-	$bookmark_id = (int) $bookmark_id;
-	$link = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = '$bookmark_id'");
-	$link->link_category = wp_get_link_cats($bookmark_id);
+	$link = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->links WHERE link_id = %d LIMIT 1", $bookmark_id));
+	$link->link_category = array_unique( wp_get_object_terms($link->link_id, 'link_category', 'fields=ids') );
+
+	$link = sanitize_bookmark($link, $filter);
 
 	if ( $output == OBJECT ) {
 		return $link;
@@ -18,23 +36,86 @@
 	}
 }
 
-// Deprecate
-function get_link($bookmark_id, $output = OBJECT) {
-	return get_bookmark($bookmark_id, $output);
+/**
+ * get_bookmark_field() - Gets single bookmark data item or field.
+ *
+ * @since 2.3
+ * @uses get_bookmark() Gets bookmark object using $bookmark as ID
+ * @uses sanitize_bookmark_field() Sanitizes Bookmark field based on $context.
+ *
+ * @param string $field The name of the data field to return
+ * @param int $bookmark The bookmark ID to get field
+ * @param string $context Optional. The context of how the field will be used.
+ * @return string
+ */
+function get_bookmark_field( $field, $bookmark, $context = 'display' ) {
+	$bookmark = (int) $bookmark;
+	$bookmark = get_bookmark( $bookmark );
+
+	if ( is_wp_error($bookmark) )
+		return $bookmark;
+
+	if ( !is_object($bookmark) )
+		return '';
+
+	if ( !isset($bookmark->$field) )
+		return '';
+
+	return sanitize_bookmark_field($field, $bookmark->$field, $bookmark->link_id, $context);
+}
+
+/**
+ * get_link() - Returns bookmark data based on ID.
+ *
+ * @since 2.0
+ * @deprecated Use get_bookmark()
+ * @see get_bookmark()
+ *
+ * @param int $bookmark_id ID of link
+ * @param string $output Either OBJECT, ARRAY_N, or ARRAY_A
+ * @return object|array
+ */
+function get_link($bookmark_id, $output = OBJECT, $filter = 'raw') {
+	return get_bookmark($bookmark_id, $output, $filter);
 }
 
+/**
+ * get_bookmarks() - Retrieves the list of bookmarks
+ *
+ * Attempts to retrieve from the cache first based on MD5 hash of arguments. If
+ * that fails, then the query will be built from the arguments and executed. The
+ * results will be stored to the cache.
+ *
+ * List of default arguments are as follows:
+ * 'orderby' - Default is 'name' (string). How to order the links by. String is based off of the bookmark scheme.
+ * 'order' - Default is 'ASC' (string). Either 'ASC' or 'DESC'. Orders in either ascending or descending order.
+ * 'limit' - Default is -1 (integer) or show all. The amount of bookmarks to display.
+ * 'category' - Default is empty string (string). Include the links in what category ID(s).
+ * 'category_name' - Default is empty string (string). Get links by category name.
+ * 'hide_invisible' - Default is 1 (integer). Whether to show (default) or hide links marked as 'invisible'.
+ * 'show_updated' - Default is 0 (integer). Will show the time of when the bookmark was last updated.
+ * 'include' - Default is empty string (string). Include other categories separated by commas.
+ * 'exclude' - Default is empty string (string). Exclude other categories separated by commas.
+ *
+ * @since 2.1
+ * @uses $wpdb Database Object
+ *
+ * @param string|array $args List of arguments to overwrite the defaults
+ * @return array List of bookmark row objects
+ */
 function get_bookmarks($args = '') {
 	global $wpdb;
 
-	if ( is_array($args) )
-		$r = &$args;
-	else
-		parse_str($args, $r);
-
-	$defaults = array('orderby' => 'name', 'order' => 'ASC', 'limit' => -1, 'category' => '',
-		'category_name' => '', 'hide_invisible' => 1, 'show_updated' => 0, 'include' => '', 'exclude' => '');
-	$r = array_merge($defaults, $r);
-	extract($r, EXTR_SKIP);
+	$defaults = array(
+		'orderby' => 'name', 'order' => 'ASC',
+		'limit' => -1, 'category' => '',
+		'category_name' => '', 'hide_invisible' => 1,
+		'show_updated' => 0, 'include' => '',
+		'exclude' => '', 'search' => ''
+	);
+
+	$r = wp_parse_args( $args, $defaults );
+	extract( $r, EXTR_SKIP );
 
 	$key = md5( serialize( $r ) );
 	if ( $cache = wp_cache_get( 'get_bookmarks', 'bookmark' ) )
@@ -43,9 +124,9 @@
 
 	$inclusions = '';
 	if ( !empty($include) ) {
-	$exclude = '';  //ignore exclude, category, and category_name params if using include
-	$category = '';
-	$category_name = '';
+		$exclude = '';  //ignore exclude, category, and category_name params if using include
+		$category = '';
+		$category_name = '';
 		$inclinks = preg_split('/[\s,]+/',$include);
 		if ( count($inclinks) ) {
 			foreach ( $inclinks as $inclink ) {
@@ -75,8 +156,13 @@
 		$exclusions .= ')';
 
 	if ( ! empty($category_name) ) {
-		if ( $cat_id = $wpdb->get_var("SELECT cat_ID FROM $wpdb->categories WHERE cat_name='$category_name' LIMIT 1") )
-			$category = $cat_id;
+		if ( $category = get_term_by('name', $category_name, 'link_category') )
+			$category = $category->term_id;
+	}
+
+	if ( ! empty($search) ) {
+		$search = like_escape($search);
+		$search = " AND ( (link_url LIKE '%$search%') OR (link_name LIKE '%$search%') OR (link_description LIKE '%$search%') ) ";
 	}
 
 	$category_query = '';
@@ -86,15 +172,15 @@
 		if ( count($incategories) ) {
 			foreach ( $incategories as $incat ) {
 				if (empty($category_query))
-					$category_query = ' AND ( category_id = ' . intval($incat) . ' ';
+					$category_query = ' AND ( tt.term_id = ' . intval($incat) . ' ';
 				else
-					$category_query .= ' OR category_id = ' . intval($incat) . ' ';
+					$category_query .= ' OR tt.term_id = ' . intval($incat) . ' ';
 			}
 		}
 	}
 	if (!empty($category_query)) {
-		$category_query .= ')';
-		$join = " LEFT JOIN $wpdb->link2cat ON ($wpdb->links.link_id = $wpdb->link2cat.link_id) ";
+		$category_query .= ") AND taxonomy = 'link_category'";
+		$join = " INNER JOIN $wpdb->term_relationships AS tr ON ($wpdb->links.link_id = tr.object_id) INNER JOIN $wpdb->term_taxonomy as tt ON tt.term_taxonomy_id = tr.term_taxonomy_id";
 	}
 
 	if (get_option('links_recently_updated_time')) {
@@ -103,9 +189,7 @@
 		$recently_updated_test = '';
 	}
 
-	if ($show_updated) {
-		$get_updated = ", UNIX_TIMESTAMP(link_updated) AS link_updated_f ";
-	}
+	$get_updated = ( $show_updated ) ? ', UNIX_TIMESTAMP(link_updated) AS link_updated_f ' : '';
 
 	$orderby = strtolower($orderby);
 	$length = '';
@@ -128,7 +212,7 @@
 		$visible = "AND link_visible = 'Y'";
 
 	$query = "SELECT * $length $recently_updated_test $get_updated FROM $wpdb->links $join WHERE 1=1 $visible $category_query";
-	$query .= " $exclusions $inclusions";
+	$query .= " $exclusions $inclusions $search";
 	$query .= " ORDER BY $orderby $order";
 	if ($limit != -1)
 		$query .= " LIMIT $limit";
@@ -136,11 +220,109 @@
 	$results = $wpdb->get_results($query);
 
 	$cache[ $key ] = $results;
-	wp_cache_add( 'get_bookmarks', $cache, 'bookmark' );
+	wp_cache_set( 'get_bookmarks', $cache, 'bookmark' );
 
 	return apply_filters('get_bookmarks', $results, $r);
 }
 
+/**
+ * sanitize_bookmark() - Sanitizes all bookmark fields
+ *
+ * @since 2.3
+ *
+ * @param object|array $bookmark Bookmark row
+ * @param string $context Optional, default is 'display'. How to filter the fields
+ * @return object|array Same type as $bookmark but with fields sanitized.
+ */
+function sanitize_bookmark($bookmark, $context = 'display') {
+	$fields = array('link_id', 'link_url', 'link_name', 'link_image', 'link_target', 'link_category',
+		'link_description', 'link_visible', 'link_owner', 'link_rating', 'link_updated',
+		'link_rel', 'link_notes', 'link_rss', );
+
+	$do_object = false;
+	if ( is_object($bookmark) )
+		$do_object = true;
+
+	foreach ( $fields as $field ) {
+		if ( $do_object )
+			$bookmark->$field = sanitize_bookmark_field($field, $bookmark->$field, $bookmark->link_id, $context);
+		else
+			$bookmark[$field] = sanitize_bookmark_field($field, $bookmark[$field], $bookmark['link_id'], $context);
+	}
+
+	return $bookmark;
+}
+
+/**
+ * sanitize_bookmark_field() - Sanitizes a bookmark field
+ *
+ * Sanitizes the bookmark fields based on what the field name is. If the field has a
+ * strict value set, then it will be tested for that, else a more generic filtering is
+ * applied. After the more strict filter is applied, if the $context is 'raw' then the
+ * value is immediately return.
+ *
+ * Hooks exist for the more generic cases. With the 'edit' context, the 'edit_$field'
+ * filter will be called and passed the $value and $bookmark_id respectively. With the
+ * 'db' context, the 'pre_$field' filter is called and passed the value. The 'display'
+ * context is the final context and has the $field has the filter name and is passed the
+ * $value, $bookmark_id, and $context respectively.
+ *
+ * @since 2.3
+ *
+ * @param string $field The bookmark field
+ * @param mixed $value The bookmark field value
+ * @param int $bookmark_id Bookmark ID
+ * @param string $context How to filter the field value. Either 'raw', 'edit', 'attribute', 'js', 'db', or 'display'
+ * @return mixed The filtered value
+ */
+function sanitize_bookmark_field($field, $value, $bookmark_id, $context) {
+	$int_fields = array('link_id', 'link_rating');
+	if ( in_array($field, $int_fields) )
+		$value = (int) $value;
+
+	$yesno = array('link_visible');
+	if ( in_array($field, $yesno) )
+		$value = preg_replace('/[^YNyn]/', '', $value);
+
+	if ( 'link_target' == $field ) {
+		$targets = array('_top', '_blank');
+		if ( ! in_array($value, $targets) )
+			$value = '';
+	}
+
+	if ( 'raw' == $context )
+		return $value;
+
+	if ( 'edit' == $context ) {
+		$format_to_edit = array('link_notes');
+		$value = apply_filters("edit_$field", $value, $bookmark_id);
+
+		if ( in_array($field, $format_to_edit) ) {
+			$value = format_to_edit($value);
+		} else {
+			$value = attribute_escape($value);
+		}
+	} else if ( 'db' == $context ) {
+		$value = apply_filters("pre_$field", $value);
+	} else {
+		// Use display filters by default.
+		$value = apply_filters($field, $value, $bookmark_id, $context);
+	}
+
+	if ( 'attribute' == $context )
+		$value = attribute_escape($value);
+	else if ( 'js' == $context )
+		$value = js_escape($value);
+
+	return $value;
+}
+
+/**
+ * delete_get_bookmark_cache() - Deletes entire bookmark cache
+ *
+ * @since 2.1
+ * @uses wp_cache_delete() Deletes the contents of 'get_bookmarks'
+ */
 function delete_get_bookmark_cache() {
 	wp_cache_delete( 'get_bookmarks', 'bookmark' );
 }
@@ -148,4 +330,4 @@
 add_action( 'edit_link', 'delete_get_bookmark_cache' );
 add_action( 'delete_link', 'delete_get_bookmark_cache' );
 
-?>
\ No newline at end of file
+?>
diff -x .svn -aruN 2.2.2.src/wp-includes/cache.php 2.5.src/wp-includes/cache.php
--- 2.2.2.src/wp-includes/cache.php	2007-04-12 11:31:47.000000000 -0500
+++ 2.5.src/wp-includes/cache.php	2008-02-02 12:42:09.000000000 -0600
@@ -1,83 +1,219 @@
 <?php
+/**
+ * Object Cache API
+ *
+ * @package WordPress
+ * @subpackage Cache
+ */
+
+/**
+ * wp_cache_add() - Adds data to the cache, if the cache key doesn't aleady exist
+ *
+ * @since 2.0
+ * @uses $wp_object_cache Object Cache Class
+ * @see WP_Object_Cache::add()
+ *
+ * @param int|string $key The cache ID to use for retrieval later
+ * @param mixed $data The data to add to the cache store
+ * @param string $flag The group to add the cache to
+ * @param int $expire When the cache data should be expired
+ * @return unknown
+ */
 function wp_cache_add($key, $data, $flag = '', $expire = 0) {
 	global $wp_object_cache;
-	$data = unserialize(serialize($data));
 
 	return $wp_object_cache->add($key, $data, $flag, $expire);
 }
 
+/**
+ * wp_cache_close() - Closes the cache
+ *
+ * This function has ceased to do anything since WordPress 2.5.
+ * The functionality was removed along with the rest of the
+ * persistant cache.
+ *
+ * @since 2.0
+ *
+ * @return bool Always returns True
+ */
 function wp_cache_close() {
-	global $wp_object_cache;
-
-	if ( ! isset($wp_object_cache) )
-		return;
-	return $wp_object_cache->save();
+	return true;
 }
 
+/**
+ * wp_cache_delete() - Removes the cache contents matching ID and flag
+ *
+ * @since 2.0
+ * @uses $wp_object_cache Object Cache Class
+ * @see WP_Object_Cache::delete()
+ *
+ * @param int|string $id What the contents in the cache are called
+ * @param string $flag Where the cache contents are grouped
+ * @return bool True on successful removal, false on failure
+ */
 function wp_cache_delete($id, $flag = '') {
 	global $wp_object_cache;
 
 	return $wp_object_cache->delete($id, $flag);
 }
 
+/**
+ * wp_cache_flush() - Removes all cache items
+ *
+ * @since 2.0
+ * @uses $wp_object_cache Object Cache Class
+ * @see WP_Object_Cache::flush()
+ *
+ * @return bool Always returns true
+ */
 function wp_cache_flush() {
 	global $wp_object_cache;
 
 	return $wp_object_cache->flush();
 }
 
+/**
+ * wp_cache_get() - Retrieves the cache contents from the cache by ID and flag
+ *
+ * @since 2.0
+ * @uses $wp_object_cache Object Cache Class
+ * @see WP_Object_Cache::get()
+ *
+ * @param int|string $id What the contents in the cache are called
+ * @param string $flag Where the cache contents are grouped
+ * @return bool|mixed False on failure to retrieve contents or the cache contents on success
+ */
 function wp_cache_get($id, $flag = '') {
 	global $wp_object_cache;
 
 	return $wp_object_cache->get($id, $flag);
 }
 
+/**
+ * wp_cache_init() - Sets up Object Cache Global and assigns it
+ *
+ * @since 2.0
+ * @global WP_Object_Cache $wp_object_cache WordPress Object Cache
+ */
 function wp_cache_init() {
 	$GLOBALS['wp_object_cache'] =& new WP_Object_Cache();
 }
 
+/**
+ * wp_cache_replace() - Replaces the contents of the cache with new data
+ *
+ * @since 2.0
+ * @uses $wp_object_cache Object Cache Class
+ * @see WP_Object_Cache::replace()
+ *
+ * @param int|string $id What to call the contents in the cache
+ * @param mixed $data The contents to store in the cache
+ * @param string $flag Where to group the cache contents
+ * @param int $expire When to expire the cache contents
+ * @return bool False if cache ID and group already exists, true on success
+ */
 function wp_cache_replace($key, $data, $flag = '', $expire = 0) {
 	global $wp_object_cache;
-	$data = unserialize(serialize($data));
 
 	return $wp_object_cache->replace($key, $data, $flag, $expire);
 }
 
+/**
+ * wp_cache_set() - Saves the data to the cache
+ *
+ * @since 2.0
+ * @uses $wp_object_cache Object Cache Class
+ * @see WP_Object_Cache::set()
+ *
+ * @param int|string $id What to call the contents in the cache
+ * @param mixed $data The contents to store in the cache
+ * @param string $flag Where to group the cache contents
+ * @param int $expire When to expire the cache contents
+ * @return bool False if cache ID and group already exists, true on success
+ */
 function wp_cache_set($key, $data, $flag = '', $expire = 0) {
 	global $wp_object_cache;
-	$data = unserialize(serialize($data));
 
 	return $wp_object_cache->set($key, $data, $flag, $expire);
 }
 
-define('CACHE_SERIAL_HEADER', "<?php\n/*");
-define('CACHE_SERIAL_FOOTER', "*/\n?".">");
-
+/**
+ * WordPress Object Cache
+ *
+ * The WordPress Object Cache is used to save on trips to the database.
+ * The Object Cache stores all of the cache data to memory and makes the
+ * cache contents available by using a key, which is used to name and
+ * later retrieve the cache contents.
+ *
+ * The Object Cache can be replaced by other caching mechanisms by placing
+ * files in the wp-content folder which is looked at in wp-settings. If
+ * that file exists, then this file will not be included.
+ *
+ * @package WordPress
+ * @subpackage Cache
+ * @since 2.0
+ */
 class WP_Object_Cache {
-	var $cache_dir;
-	var $cache_enabled = false;
-	var $expiration_time = 900;
-	var $flock_filename = 'wp_object_cache.lock';
-	var $mutex;
+
+	/**
+	 * Holds the cached objects
+	 *
+	 * @var array
+	 * @access private
+	 * @since 2.0
+	 */
 	var $cache = array ();
-	var $dirty_objects = array ();
+
+	/**
+	 * Cache objects that do not exist in the cache
+	 *
+	 * @var array
+	 * @access private
+	 * @since 2.0
+	 */
 	var $non_existant_objects = array ();
+
+	/**
+	 * Object caches that are global
+	 *
+	 * @var array
+	 * @access private
+	 * @since 2.0
+	 */
 	var $global_groups = array ('users', 'userlogins', 'usermeta');
-	var $blog_id;
-	var $cold_cache_hits = 0;
-	var $warm_cache_hits = 0;
-	var $cache_misses = 0;
-	var $secret = '';
 
-	function acquire_lock() {
-		// Acquire a write lock.
-		$this->mutex = @fopen($this->cache_dir.$this->flock_filename, 'w');
-		if ( false == $this->mutex)
-			return false;
-		flock($this->mutex, LOCK_EX);
-		return true;
-	}
+	/**
+	 * The amount of times the cache data was already stored in the cache.
+	 *
+	 * @since 2.5
+	 * @access private
+	 * @var int
+	 */
+	var $cache_hits = 0;
+
+	/**
+	 * Amount of times the cache did not have the request in cache
+	 *
+	 * @var int
+	 * @access public
+	 * @since 2.0
+	 */
+	var $cache_misses = 0;
 
+	/**
+	 * Adds data to the cache if it doesn't already exist.
+	 *
+	 * @uses WP_Object_Cache::get Checks to see if the cache already has data.
+	 * @uses WP_Object_Cache::set Sets the data after the checking the cache contents existance.
+	 *
+	 * @since 2.0
+	 *
+	 * @param int|string $id What to call the contents in the cache
+	 * @param mixed $data The contents to store in the cache
+	 * @param string $group Where to group the cache contents
+	 * @param int $expire When to expire the cache contents
+	 * @return bool False if cache ID and group already exists, true on success
+	 */
 	function add($id, $data, $group = 'default', $expire = '') {
 		if (empty ($group))
 			$group = 'default';
@@ -88,6 +224,23 @@
 		return $this->set($id, $data, $group, $expire);
 	}
 
+	/**
+	 * Remove the contents of the cache ID in the group
+	 *
+	 * If the cache ID does not exist in the group and $force parameter
+	 * is set to false, then nothing will happen. The $force parameter
+	 * is set to false by default.
+	 *
+	 * On success the group and the id will be added to the
+	 * $non_existant_objects property in the class.
+	 *
+	 * @since 2.0
+	 *
+	 * @param int|string $id What the contents in the cache are called
+	 * @param string $group Where the cache contents are grouped
+	 * @param bool $force Optional. Whether to force the unsetting of the cache ID in the group
+	 * @return bool False if the contents weren't deleted and true on success
+	 */
 	function delete($id, $group = 'default', $force = false) {
 		if (empty ($group))
 			$group = 'default';
@@ -97,170 +250,70 @@
 
 		unset ($this->cache[$group][$id]);
 		$this->non_existant_objects[$group][$id] = true;
-		$this->dirty_objects[$group][] = $id;
 		return true;
 	}
 
+	/**
+	 * Clears the object cache of all data
+	 *
+	 * @since 2.0
+	 *
+	 * @return bool Always returns true
+	 */
 	function flush() {
-		if ( !$this->cache_enabled )
-			return true;
-
-		if ( ! $this->acquire_lock() )
-			return false;
-
-		$this->rm_cache_dir();
 		$this->cache = array ();
-		$this->dirty_objects = array ();
-		$this->non_existant_objects = array ();
-
-		$this->release_lock();
 
 		return true;
 	}
 
-	function get($id, $group = 'default', $count_hits = true) {
+	/**
+	 * Retrieves the cache contents, if it exists
+	 *
+	 * The contents will be first attempted to be retrieved by searching
+	 * by the ID in the cache group. If the cache is hit (success) then
+	 * the contents are returned.
+	 *
+	 * On failure, the $non_existant_objects property is checked and if
+	 * the cache group and ID exist in there the cache misses will not be
+	 * incremented. If not in the nonexistant objects property, then the
+	 * cache misses will be incremented and the cache group and ID will
+	 * be added to the nonexistant objects.
+	 *
+	 * @since 2.0
+	 *
+	 * @param int|string $id What the contents in the cache are called
+	 * @param string $group Where the cache contents are grouped
+	 * @return bool|mixed False on failure to retrieve contents or the cache contents on success
+	 */
+	function get($id, $group = 'default') {
 		if (empty ($group))
 			$group = 'default';
 
 		if (isset ($this->cache[$group][$id])) {
-			if ($count_hits)
-				$this->warm_cache_hits += 1;
+			$this->cache_hits += 1;
 			return $this->cache[$group][$id];
 		}
 
-		if (isset ($this->non_existant_objects[$group][$id]))
-			return false;
-
-		//  If caching is not enabled, we have to fall back to pulling from the DB.
-		if (!$this->cache_enabled) {
-			if (!isset ($this->cache[$group]))
-				$this->load_group_from_db($group);
-
-			if (isset ($this->cache[$group][$id])) {
-				$this->cold_cache_hits += 1;
-				return $this->cache[$group][$id];
-			}
-
-			$this->non_existant_objects[$group][$id] = true;
-			$this->cache_misses += 1;
-			return false;
-		}
-
-		$cache_file = $this->cache_dir.$this->get_group_dir($group)."/".$this->hash($id).'.php';
-		if (!file_exists($cache_file)) {
-			$this->non_existant_objects[$group][$id] = true;
-			$this->cache_misses += 1;
-			return false;
-		}
-
-		// If the object has expired, remove it from the cache and return false to force
-		// a refresh.
-		$now = time();
-		if ((filemtime($cache_file) + $this->expiration_time) <= $now) {
-			$this->cache_misses += 1;
-			$this->delete($id, $group, true);
+		if ( isset ($this->non_existant_objects[$group][$id]) )
 			return false;
-		}
-
-		$this->cache[$group][$id] = unserialize(base64_decode(substr(@ file_get_contents($cache_file), strlen(CACHE_SERIAL_HEADER), -strlen(CACHE_SERIAL_FOOTER))));
-		if (false === $this->cache[$group][$id])
-			$this->cache[$group][$id] = '';
-
-		$this->cold_cache_hits += 1;
-		return $this->cache[$group][$id];
-	}
-
-	function get_group_dir($group) {
-		if (false !== array_search($group, $this->global_groups))
-			return $group;
 
-		return "{$this->blog_id}/$group";
-	}
-
-	function hash($data) {
-		if ( function_exists('hash_hmac') ) {
-			return hash_hmac('md5', $data, $this->secret);
-		} else {
-			return md5($data . $this->secret);
-		}
-	}
-
-	function load_group_from_db($group) {
-		global $wpdb;
-
-		if ('category' == $group) {
-			$this->cache['category'] = array ();
-			if ($dogs = $wpdb->get_results("SELECT * FROM $wpdb->categories")) {
-				foreach ($dogs as $catt)
-					$this->cache['category'][$catt->cat_ID] = $catt;
-			}
-		}
-
-	}
-
-	function make_group_dir($group, $perms) {
-		$group_dir = $this->get_group_dir($group);
-		$make_dir = '';
-		foreach (split('/', $group_dir) as $subdir) {
-			$make_dir .= "$subdir/";
-			if (!file_exists($this->cache_dir.$make_dir)) {
-				if (! @ mkdir($this->cache_dir.$make_dir))
-					break;
-				@ chmod($this->cache_dir.$make_dir, $perms);
-			}
-
-			if (!file_exists($this->cache_dir.$make_dir."index.php")) {
-				$file_perms = $perms & 0000666;
-				@ touch($this->cache_dir.$make_dir."index.php");
-				@ chmod($this->cache_dir.$make_dir."index.php", $file_perms);
-			}
-		}
-
-		return $this->cache_dir."$group_dir/";
-	}
-
-	function rm_cache_dir() {
-		$dir = $this->cache_dir;
-		$dir = rtrim($dir, DIRECTORY_SEPARATOR);
-		$top_dir = $dir;
-		$stack = array($dir);
-		$index = 0;
-
-		while ($index < count($stack)) {
-			# Get indexed directory from stack
-			$dir = $stack[$index];
-
-			$dh = @ opendir($dir);
-			if (!$dh)
-				return false;
-
-			while (($file = @ readdir($dh)) !== false) {
-				if ($file == '.' or $file == '..')
-					continue;
-
-				if (@ is_dir($dir . DIRECTORY_SEPARATOR . $file))
-					$stack[] = $dir . DIRECTORY_SEPARATOR . $file;
-				else if (@ is_file($dir . DIRECTORY_SEPARATOR . $file))
-					@ unlink($dir . DIRECTORY_SEPARATOR . $file);
-			}
-
-			$index++;
-		}
-
-		$stack = array_reverse($stack);  // Last added dirs are deepest
-		foreach($stack as $dir) {
-			if ( $dir != $top_dir)
-				@ rmdir($dir);
-		}
-
-	}
-
-	function release_lock() {
-		// Release write lock.
-		flock($this->mutex, LOCK_UN);
-		fclose($this->mutex);
+		$this->non_existant_objects[$group][$id] = true;
+		$this->cache_misses += 1;
+		return false;
 	}
 
+	/**
+	 * Replace the contents in the cache, if contents already exist
+	 *
+	 * @since 2.0
+	 * @see WP_Object_Cache::set()
+	 *
+	 * @param int|string $id What to call the contents in the cache
+	 * @param mixed $data The contents to store in the cache
+	 * @param string $group Where to group the cache contents
+	 * @param int $expire When to expire the cache contents
+	 * @return bool False if not exists, true if contents were replaced
+	 */
 	function replace($id, $data, $group = 'default', $expire = '') {
 		if (empty ($group))
 			$group = 'default';
@@ -271,163 +324,97 @@
 		return $this->set($id, $data, $group, $expire);
 	}
 
+	/**
+	 * Sets the data contents into the cache
+	 *
+	 * The cache contents is grouped by the $group parameter followed
+	 * by the $id. This allows for duplicate ids in unique groups.
+	 * Therefore, naming of the group should be used with care and
+	 * should follow normal function naming guidelines outside of
+	 * core WordPress usage.
+	 *
+	 * The $expire parameter is not used, because the cache will
+	 * automatically expire for each time a page is accessed and PHP
+	 * finishes. The method is more for cache plugins which use files.
+	 *
+	 * @since 2.0
+	 *
+	 * @param int|string $id What to call the contents in the cache
+	 * @param mixed $data The contents to store in the cache
+	 * @param string $group Where to group the cache contents
+	 * @param int $expire Not Used
+	 * @return bool Always returns true
+	 */
 	function set($id, $data, $group = 'default', $expire = '') {
 		if (empty ($group))
 			$group = 'default';
 
-		if (NULL == $data)
+		if (NULL === $data)
 			$data = '';
 
 		$this->cache[$group][$id] = $data;
-		unset ($this->non_existant_objects[$group][$id]);
-		$this->dirty_objects[$group][] = $id;
 
-		return true;
-	}
-
-	function save() {
-		//$this->stats();
-
-		if (!$this->cache_enabled)
-			return true;
-
-		if (empty ($this->dirty_objects))
-			return true;
-
-		// Give the new dirs the same perms as wp-content.
-		$stat = stat(ABSPATH.'wp-content');
-		$dir_perms = $stat['mode'] & 0007777; // Get the permission bits.
-		$file_perms = $dir_perms & 0000666; // Remove execute bits for files.
-
-		// Make the base cache dir.
-		if (!file_exists($this->cache_dir)) {
-			if (! @ mkdir($this->cache_dir))
-				return false;
-			@ chmod($this->cache_dir, $dir_perms);
-		}
-
-		if (!file_exists($this->cache_dir."index.php")) {
-			@ touch($this->cache_dir."index.php");
-			@ chmod($this->cache_dir."index.php", $file_perms);
-		}
-
-		if ( ! $this->acquire_lock() )
-			return false;
-
-		// Loop over dirty objects and save them.
-		$errors = 0;
-		foreach ($this->dirty_objects as $group => $ids) {
-			$group_dir = $this->make_group_dir($group, $dir_perms);
-
-			$ids = array_unique($ids);
-			foreach ($ids as $id) {
-				$cache_file = $group_dir.$this->hash($id).'.php';
-
-				// Remove the cache file if the key is not set.
-				if (!isset ($this->cache[$group][$id])) {
-					if (file_exists($cache_file))
-						@ unlink($cache_file);
-					continue;
-				}
-
-				$temp_file = tempnam($group_dir, 'tmp');
-				$serial = CACHE_SERIAL_HEADER.base64_encode(serialize($this->cache[$group][$id])).CACHE_SERIAL_FOOTER;
-				$fd = @fopen($temp_file, 'w');
-				if ( false === $fd ) {
-					$errors++;
-					continue;
-				}
-				fputs($fd, $serial);
-				fclose($fd);
-				if (!@ rename($temp_file, $cache_file)) {
-					if (!@ copy($temp_file, $cache_file))
-						$errors++;
-					@ unlink($temp_file);
-				}
-				@ chmod($cache_file, $file_perms);
-			}
-		}
-
-		$this->dirty_objects = array();
-
-		$this->release_lock();
-
-		if ( $errors )
-			return false;
+		if(isset($this->non_existant_objects[$group][$id]))
+			unset ($this->non_existant_objects[$group][$id]);
 
 		return true;
 	}
 
+	/**
+	 * Echos the stats of the caching.
+	 *
+	 * Gives the cache hits, and cache misses. Also prints every cached
+	 * group, key and the data.
+	 *
+	 * @since 2.0
+	 */
 	function stats() {
 		echo "<p>";
-		echo "<strong>Cold Cache Hits:</strong> {$this->cold_cache_hits}<br/>";
-		echo "<strong>Warm Cache Hits:</strong> {$this->warm_cache_hits}<br/>";
-		echo "<strong>Cache Misses:</strong> {$this->cache_misses}<br/>";
+		echo "<strong>Cache Hits:</strong> {$this->cache_hits}<br />";
+		echo "<strong>Cache Misses:</strong> {$this->cache_misses}<br />";
 		echo "</p>";
 
 		foreach ($this->cache as $group => $cache) {
 			echo "<p>";
-			echo "<strong>Group:</strong> $group<br/>";
+			echo "<strong>Group:</strong> $group<br />";
 			echo "<strong>Cache:</strong>";
 			echo "<pre>";
 			print_r($cache);
 			echo "</pre>";
-			if (isset ($this->dirty_objects[$group])) {
-				echo "<strong>Dirty Objects:</strong>";
-				echo "<pre>";
-				print_r(array_unique($this->dirty_objects[$group]));
-				echo "</pre>";
-				echo "</p>";
-			}
 		}
 	}
 
+	/**
+	 * PHP4 constructor; Calls PHP 5 style constructor
+	 *
+	 * @since 2.0
+	 *
+	 * @return WP_Object_Cache
+	 */
 	function WP_Object_Cache() {
 		return $this->__construct();
 	}
 
+	/**
+	 * Sets up object properties; PHP 5 style constructor
+	 *
+	 * @since 2.0.8
+	 * @return null|WP_Object_Cache If cache is disabled, returns null.
+	 */
 	function __construct() {
-		global $blog_id;
-
-		register_shutdown_function(array(&$this, "__destruct"));
-
-		if (defined('DISABLE_CACHE'))
-			return;
-
-		if ( ! defined('ENABLE_CACHE') )
-			return;
-
-		// Disable the persistent cache if safe_mode is on.
-		if ( ini_get('safe_mode') && ! defined('ENABLE_CACHE') )
-			return;
-
-		if (defined('CACHE_PATH'))
-			$this->cache_dir = CACHE_PATH;
-		else
-			// Using the correct separator eliminates some cache flush errors on Windows
-			$this->cache_dir = ABSPATH.'wp-content'.DIRECTORY_SEPARATOR.'cache'.DIRECTORY_SEPARATOR;
-
-		if (is_writable($this->cache_dir) && is_dir($this->cache_dir)) {
-				$this->cache_enabled = true;
-		} else {
-			if (is_writable(ABSPATH.'wp-content')) {
-				$this->cache_enabled = true;
-			}
-		}
-
-		if (defined('CACHE_EXPIRATION_TIME'))
-			$this->expiration_time = CACHE_EXPIRATION_TIME;
-
-		if ( defined('WP_SECRET') )
-			$this->secret = WP_SECRET;
-		else
-			$this->secret = DB_PASSWORD . DB_USER . DB_NAME . DB_HOST . ABSPATH;
-
-		$this->blog_id = $this->hash($blog_id);
+		register_shutdown_function(array(&$this, "__destruct")); /** @todo This should be moved to the PHP4 style constructor, PHP5 already calls __destruct() */
 	}
 
+	/**
+	 * Will save the object cache before object is completely destroyed.
+	 *
+	 * Called upon object destruction, which should be when PHP ends.
+	 *
+	 * @since  2.0.8
+	 *
+	 * @return bool True value. Won't be used by PHP
+	 */
 	function __destruct() {
-		$this->save();
 		return true;
 	}
 }
diff -x .svn -aruN 2.2.2.src/wp-includes/canonical.php 2.5.src/wp-includes/canonical.php
--- 2.2.2.src/wp-includes/canonical.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/canonical.php	2008-02-23 20:09:24.000000000 -0600
@@ -0,0 +1,243 @@
+<?php
+/**
+ * Canonical API to handle WordPress Redirecting
+ *
+ * Based on "Permalink Redirect" from Scott Yang and "Enforce www. Preference" by Mark Jaquith
+ *
+ * @author Scott Yang
+ * @author Mark Jaquith
+ * @package WordPress
+ * @since 2.3
+ */
+
+/**
+ * redirect_canonical() - Redirects incoming links to the proper URL based on the site url
+ *
+ * Search engines consider www.somedomain.com and somedomain.com to be two different URLs
+ * when they both go to the same location. This SEO enhancement prevents penality for
+ * duplicate content by redirecting all incoming links to one or the other.
+ *
+ * Prevents redirection for feeds, trackbacks, searches, comment popup, and admin URLs.
+ * Does not redirect on IIS, page/post previews, and on form data.
+ *
+ * Will also attempt to find the correct link when a user enters a URL that does not exist
+ * based on exact WordPress query. Will instead try to parse the URL or query in an attempt
+ * to figure the correct page to go to.
+ *
+ * @since 2.3
+ * @uses $wp_rewrite
+ * @uses $is_IIS
+ *
+ * @param string $requested_url Optional. The URL that was requested, used to figure if redirect is needed.
+ * @param bool $do_redirect Optional. Redirect to the new URL.
+ * @return null|false|string Null, if redirect not needed. False, if redirect not needed or the string of the URL
+ */
+function redirect_canonical($requested_url=null, $do_redirect=true) {
+	global $wp_rewrite, $is_IIS;
+
+	if ( is_feed() || is_trackback() || is_search() || is_comments_popup() || is_admin() || $is_IIS || ( isset($_POST) && count($_POST) ) || is_preview() )
+		return;
+
+	if ( !$requested_url ) {
+		// build the URL in the address bar
+		$requested_url  = ( isset($_SERVER['HTTPS'] ) && strtolower($_SERVER['HTTPS']) == 'on' ) ? 'https://' : 'http://';
+		$requested_url .= $_SERVER['HTTP_HOST'];
+		$requested_url .= $_SERVER['REQUEST_URI'];
+	}
+
+	$original = @parse_url($requested_url);
+	if ( false === $original )
+		return;
+
+	// Some PHP setups turn requests for / into /index.php in REQUEST_URI
+	$original['path'] = preg_replace('|/index\.php$|', '/', $original['path']);
+
+	$redirect = $original;
+	$redirect_url = false;
+
+	// These tests give us a WP-generated permalink
+	if ( is_404() ) {
+		$redirect_url = redirect_guess_404_permalink();
+	} elseif ( is_object($wp_rewrite) && $wp_rewrite->using_permalinks() ) {
+		// rewriting of old ?p=X, ?m=2004, ?m=200401, ?m=20040101
+		if ( is_single() && isset($_GET['p']) ) {
+			if ( $redirect_url = get_permalink(get_query_var('p')) )
+				$redirect['query'] = remove_query_arg('p', $redirect['query']);
+		} elseif ( is_page() && isset($_GET['page_id']) ) {
+			if ( $redirect_url = get_permalink(get_query_var('page_id')) )
+				$redirect['query'] = remove_query_arg('page_id', $redirect['query']);
+		} elseif ( isset($_GET['m']) && ( is_year() || is_month() || is_day() ) ) {
+			$m = get_query_var('m');
+			switch ( strlen($m) ) {
+				case 4: // Yearly
+					$redirect_url = get_year_link($m);
+					break;
+				case 6: // Monthly
+					$redirect_url = get_month_link( substr($m, 0, 4), substr($m, 4, 2) );
+					break;
+				case 8: // Daily
+					$redirect_url = get_day_link(substr($m, 0, 4), substr($m, 4, 2), substr($m, 6, 2));
+					break;
+			}
+			if ( $redirect_url )
+				$redirect['query'] = remove_query_arg('m', $redirect['query']);
+		// now moving on to non ?m=X year/month/day links
+		} elseif ( is_day() && get_query_var('year') && get_query_var('monthnum') && isset($_GET['day']) ) {
+			if ( $redirect_url = get_day_link(get_query_var('year'), get_query_var('monthnum'), get_query_var('day')) )
+				$redirect['query'] = remove_query_arg(array('year', 'monthnum', 'day'), $redirect['query']);
+		} elseif ( is_month() && get_query_var('year') && isset($_GET['monthnum']) ) {
+			if ( $redirect_url = get_month_link(get_query_var('year'), get_query_var('monthnum')) )
+				$redirect['query'] = remove_query_arg(array('year', 'monthnum'), $redirect['query']);
+		} elseif ( is_year() && isset($_GET['year']) ) {
+			if ( $redirect_url = get_year_link(get_query_var('year')) )
+				$redirect['query'] = remove_query_arg('year', $redirect['query']);
+		} elseif ( is_category() && isset($_GET['cat']) ) {
+			if ( $redirect_url = get_category_link(get_query_var('cat')) )
+				$redirect['query'] = remove_query_arg('cat', $redirect['query']);
+		} elseif ( is_author() && isset($_GET['author']) ) {
+			$author = get_userdata(get_query_var('author'));
+			if ( false !== $author && $redirect_url = get_author_link(false, $author->ID, $author->user_nicename) )
+				$redirect['query'] = remove_query_arg('author', $redirect['author']);
+		}
+
+	// paging
+		if ( $paged = get_query_var('paged') ) {
+			if ( $paged > 0 ) {
+				if ( !$redirect_url )
+					$redirect_url = $requested_url;
+				$paged_redirect = @parse_url($redirect_url);
+				$paged_redirect['path'] = preg_replace('|/page/[0-9]+?(/+)?$|', '/', $paged_redirect['path']); // strip off any existing paging
+				$paged_redirect['path'] = preg_replace('|/index.php/?$|', '/', $paged_redirect['path']); // strip off trailing /index.php/
+				if ( $paged > 1 && !is_single() ) {
+					$paged_redirect['path'] = trailingslashit($paged_redirect['path']);
+					if ( $wp_rewrite->using_index_permalinks() && strpos($paged_redirect['path'], '/index.php/') === false )
+						$paged_redirect['path'] .= 'index.php/';
+					$paged_redirect['path'] .= user_trailingslashit("page/$paged", 'paged');
+				} elseif ( !is_home() && !is_single() ){
+					$paged_redirect['path'] = user_trailingslashit($paged_redirect['path'], 'paged');
+				}
+				$redirect_url = $paged_redirect['scheme'] . '://' . $paged_redirect['host'] . $paged_redirect['path'];
+				$redirect['path'] = $paged_redirect['path'];
+			}
+			$redirect['query'] = remove_query_arg('paged', $redirect['query']);
+		}
+	}
+
+	// tack on any additional query vars
+	if ( $redirect_url && $redirect['query'] ) {
+		if ( strpos($redirect_url, '?') !== false )
+			$redirect_url .= '&';
+		else
+			$redirect_url .= '?';
+		$redirect_url .= $redirect['query'];
+	}
+
+	if ( $redirect_url )
+		$redirect = @parse_url($redirect_url);
+
+	// www.example.com vs example.com
+	$user_home = @parse_url(get_option('home'));
+	$redirect['host'] = $user_home['host'];
+
+	// Handle ports
+	if ( isset($user_home['port']) )
+		$redirect['port'] = $user_home['port'];
+	else
+		unset($redirect['port']);
+
+	// trailing /index.php/
+	$redirect['path'] = preg_replace('|/index.php/$|', '/', $redirect['path']);
+
+	// strip /index.php/ when we're not using PATHINFO permalinks
+	if ( !$wp_rewrite->using_index_permalinks() )
+		$redirect['path'] = str_replace('/index.php/', '/', $redirect['path']);
+
+	// trailing slashes
+	if ( is_object($wp_rewrite) && $wp_rewrite->using_permalinks() && !is_404() && (!is_home() || ( is_home() && (get_query_var('paged') > 1) ) ) ) {
+		$user_ts_type = '';
+		if ( get_query_var('paged') > 0 ) {
+			$user_ts_type = 'paged';
+		} else {
+			foreach ( array('single', 'category', 'page', 'day', 'month', 'year') as $type ) {
+				$func = 'is_' . $type;
+				if ( call_user_func($func) )
+					$user_ts_type = $type;
+					break;
+				}
+			}
+		$redirect['path'] = user_trailingslashit($redirect['path'], $user_ts_type);
+	} elseif ( is_home() ) {
+		$redirect['path'] = trailingslashit($redirect['path']);
+	}
+
+	// Always trailing slash the 'home' URL
+	if ( $redirect['path'] == $user_home['path'] )
+		$redirect['path'] = trailingslashit($redirect['path']);
+
+	// Ignore differences in host capitalization, as this can lead to infinite redirects
+	if ( strtolower($original['host']) == strtolower($redirect['host']) )
+		$redirect['host'] = $original['host'];
+
+	if ( array($original['host'], $original['port'], $original['path'], $original['query']) !== array($redirect['host'], $redirect['port'], $redirect['path'], $redirect['query']) ) {
+		$redirect_url = $redirect['scheme'] . '://' . $redirect['host'];
+		if ( isset($redirect['port']) )
+		 	$redirect_url .= ':' . $redirect['port'];
+		$redirect_url .= $redirect['path'];
+		if ( $redirect['query'] )
+			$redirect_url .= '?' . $redirect['query'];
+	}
+
+	if ( !$redirect_url || $redirect_url == $requested_url )
+	 	return false;
+
+	// Note that you can use the "redirect_canonical" filter to cancel a canonical redirect for whatever reason by returning FALSE
+	$redirect_url = apply_filters('redirect_canonical', $redirect_url, $requested_url);
+
+	if ( !$redirect_url || $redirect_url == $requested_url ) // yes, again -- in case the filter aborted the request
+	 	return false;
+
+	if ( $do_redirect ) {
+		// protect against chained redirects
+		if ( !redirect_canonical($redirect_url, false) ) {
+			wp_redirect($redirect_url, 301);
+			exit();
+		} else {
+			return false;
+		}
+	} else {
+		return $redirect_url;
+	}
+}
+
+/**
+ * redirect_guess_404_permalink() - Tries to guess correct post based on query vars
+ *
+ * @since 2.3
+ * @uses $wpdb
+ *
+ * @return bool|string Returns False, if it can't find post, returns correct location on success.
+ */
+function redirect_guess_404_permalink() {
+	global $wpdb;
+	if ( !get_query_var('name') )
+		return false;
+
+	$where = $wpdb->prepare("post_name LIKE %s", get_query_var('name') . '%');
+
+	// if any of year, monthnum, or day are set, use them to refine the query
+	if ( get_query_var('year') )
+		$where .= $wpdb->prepare(" AND YEAR(post_date) = %d", get_query_var('year'));
+	if ( get_query_var('monthnum') )
+		$where .= $wpdb->prepare(" AND MONTH(post_date) = %d", get_query_var('monthnum'));
+	if ( get_query_var('day') )
+		$where .= $wpdb->prepare(" AND DAYOFMONTH(post_date) = %d", get_query_var('day'));
+
+	$post_id = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE $where AND post_status = 'publish'");
+	if ( !$post_id )
+		return false;
+	return get_permalink($post_id);
+}
+
+add_action('template_redirect', 'redirect_canonical');
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-includes/capabilities.php 2.5.src/wp-includes/capabilities.php
--- 2.2.2.src/wp-includes/capabilities.php	2007-01-28 15:58:01.000000000 -0600
+++ 2.5.src/wp-includes/capabilities.php	2008-01-31 15:44:17.000000000 -0600
@@ -138,7 +138,6 @@
 	var $allcaps = array();
 
 	function WP_User($id, $name = '') {
-		global $wpdb;
 
 		if ( empty($id) && empty($name) )
 			return;
@@ -267,7 +266,7 @@
 		// Must have ALL requested caps
 		$capabilities = apply_filters('user_has_cap', $this->allcaps, $caps, $args);
 		foreach ($caps as $cap) {
-			//echo "Checking cap $cap<br/>";
+			//echo "Checking cap $cap<br />";
 			if(empty($capabilities[$cap]) || !$capabilities[$cap])
 				return false;
 		}
@@ -291,18 +290,20 @@
 		$caps[] = 'delete_users';
 		break;
 	case 'edit_user':
-		$caps[] = 'edit_users';
+		if ( !isset($args[0]) || $user_id != $args[0] ) {
+			$caps[] = 'edit_users';
+		}
 		break;
 	case 'delete_post':
 		$author_data = get_userdata($user_id);
-		//echo "post ID: {$args[0]}<br/>";
+		//echo "post ID: {$args[0]}<br />";
 		$post = get_post($args[0]);
 		if ( 'page' == $post->post_type ) {
 			$args = array_merge(array('delete_page', $user_id), $args);
 			return call_user_func_array('map_meta_cap', $args);
 		}
 		$post_author_data = get_userdata($post->post_author);
-		//echo "current user id : $user_id, post author id: " . $post_author_data->ID . "<br/>";
+		//echo "current user id : $user_id, post author id: " . $post_author_data->ID . "<br />";
 		// If the user is the author...
 		if ($user_id == $post_author_data->ID) {
 			// If the post is published...
@@ -323,10 +324,10 @@
 		break;
 	case 'delete_page':
 		$author_data = get_userdata($user_id);
-		//echo "post ID: {$args[0]}<br/>";
+		//echo "post ID: {$args[0]}<br />";
 		$page = get_page($args[0]);
 		$page_author_data = get_userdata($page->post_author);
-		//echo "current user id : $user_id, page author id: " . $page_author_data->ID . "<br/>";
+		//echo "current user id : $user_id, page author id: " . $page_author_data->ID . "<br />";
 		// If the user is the author...
 		if ($user_id == $page_author_data->ID) {
 			// If the page is published...
@@ -349,14 +350,14 @@
 		// edit_others_posts
 	case 'edit_post':
 		$author_data = get_userdata($user_id);
-		//echo "post ID: {$args[0]}<br/>";
+		//echo "post ID: {$args[0]}<br />";
 		$post = get_post($args[0]);
 		if ( 'page' == $post->post_type ) {
 			$args = array_merge(array('edit_page', $user_id), $args);
 			return call_user_func_array('map_meta_cap', $args);
 		}
 		$post_author_data = get_userdata($post->post_author);
-		//echo "current user id : $user_id, post author id: " . $post_author_data->ID . "<br/>";
+		//echo "current user id : $user_id, post author id: " . $post_author_data->ID . "<br />";
 		// If the user is the author...
 		if ($user_id == $post_author_data->ID) {
 			// If the post is published...
@@ -377,10 +378,10 @@
 		break;
 	case 'edit_page':
 		$author_data = get_userdata($user_id);
-		//echo "post ID: {$args[0]}<br/>";
+		//echo "post ID: {$args[0]}<br />";
 		$page = get_page($args[0]);
 		$page_author_data = get_userdata($page->post_author);
-		//echo "current user id : $user_id, page author id: " . $page_author_data->ID . "<br/>";
+		//echo "current user id : $user_id, page author id: " . $page_author_data->ID . "<br />";
 		// If the user is the author...
 		if ($user_id == $page_author_data->ID) {
 			// If the page is published...
@@ -445,12 +446,12 @@
 function current_user_can($capability) {
 	$current_user = wp_get_current_user();
 
-	$args = array_slice(func_get_args(), 1);
-	$args = array_merge(array($capability), $args);
-
 	if ( empty($current_user) )
 		return false;
 
+	$args = array_slice(func_get_args(), 1);
+	$args = array_merge(array($capability), $args);
+
 	return call_user_func_array(array(&$current_user, 'has_cap'), $args);
 }
 
diff -x .svn -aruN 2.2.2.src/wp-includes/category-template.php 2.5.src/wp-includes/category-template.php
--- 2.2.2.src/wp-includes/category-template.php	2007-06-15 12:45:21.000000000 -0500
+++ 2.5.src/wp-includes/category-template.php	2008-03-26 01:37:19.000000000 -0500
@@ -5,16 +5,18 @@
 		return '';
 
 	$chain = '';
-
+	// TODO: consult hierarchy
 	$cat_ids = get_all_category_ids();
 	foreach ( $cat_ids as $cat_id ) {
-		if ( $cat_id == $id)
+		if ( $cat_id == $id )
 			continue;
 
 		$category = get_category($cat_id);
-		if ( $category->category_parent == $id ) {
-			$chain .= $before.$category->cat_ID.$after;
-			$chain .= get_category_children($category->cat_ID, $before, $after);
+		if ( is_wp_error( $category ) )
+			return $category;
+		if ( $category->parent == $id ) {
+			$chain .= $before.$category->term_id.$after;
+			$chain .= get_category_children($category->term_id, $before, $after);
 		}
 	}
 	return $chain;
@@ -29,9 +31,11 @@
 		$catlink = $file . '?cat=' . $category_id;
 	} else {
 		$category = &get_category($category_id);
-		$category_nicename = $category->category_nicename;
+		if ( is_wp_error( $category ) )
+			return $category;
+		$category_nicename = $category->slug;
 
-		if ( $parent = $category->category_parent )
+		if ( $parent = $category->parent )
 			$category_nicename = get_category_parents($parent, false, '/', true) . $category_nicename;
 
 		$catlink = str_replace('%category%', $category_nicename, $catlink);
@@ -43,50 +47,55 @@
 function get_category_parents($id, $link = FALSE, $separator = '/', $nicename = FALSE){
 	$chain = '';
 	$parent = &get_category($id);
+	if ( is_wp_error( $parent ) )
+		return $parent;
 
 	if ( $nicename )
-		$name = $parent->category_nicename;
+		$name = $parent->slug;
 	else
 		$name = $parent->cat_name;
 
-	if ( $parent->category_parent && ($parent->category_parent != $parent->cat_ID) )
-		$chain .= get_category_parents($parent->category_parent, $link, $separator, $nicename);
+	if ( $parent->parent && ($parent->parent != $parent->term_id) )
+		$chain .= get_category_parents($parent->parent, $link, $separator, $nicename);
 
 	if ( $link )
-		$chain .= '<a href="' . get_category_link($parent->cat_ID) . '" title="' . sprintf(__("View all posts in %s"), $parent->cat_name) . '">'.$name.'</a>' . $separator;
+		$chain .= '<a href="' . get_category_link($parent->term_id) . '" title="' . sprintf(__("View all posts in %s"), $parent->cat_name) . '">'.$name.'</a>' . $separator;
 	else
 		$chain .= $name.$separator;
 	return $chain;
 }
 
 function get_the_category($id = false) {
-global $post, $category_cache, $blog_id;
+	global $post;
 
 	$id = (int) $id;
 	if ( !$id )
 		$id = (int) $post->ID;
 
-	if ( !isset($category_cache[$blog_id][$id]) )
-		update_post_category_cache($id);
-
-	$categories = $category_cache[$blog_id][$id];
+	$categories = get_object_term_cache($id, 'category');
+	if ( false === $categories )
+		$categories = wp_get_object_terms($id, 'category');
 
 	if ( !empty($categories) )
-		usort($categories, '_get_the_category_usort');
+		usort($categories, '_usort_terms_by_name');
 	else
 		$categories = array();
 
+	foreach(array_keys($categories) as $key) {
+		_make_cat_compat($categories[$key]);
+	}
+
 	return $categories;
 }
 
-function _get_the_category_usort($a, $b) {
-	return strcmp($a->category_name, $b->category_name);
+function _usort_terms_by_name($a, $b) {
+	return strcmp($a->name, $b->name);
 }
 
-function _get_the_category_usort_by_ID($a, $b) {
-	if ( $a->cat_ID > $b->cat_ID )
+function _usort_terms_by_ID($a, $b) {
+	if ( $a->term_id > $b->term_id )
 		return 1;
-	elseif ( $a->cat_ID < $b->cat_ID )
+	elseif ( $a->term_id < $b->term_id )
 		return -1;
 	else
 		return 0;
@@ -95,12 +104,14 @@
 function get_the_category_by_ID($cat_ID) {
 	$cat_ID = (int) $cat_ID;
 	$category = &get_category($cat_ID);
-	return $category->cat_name;
+	if ( is_wp_error( $category ) )
+		return $category;
+	return $category->name;
 }
 
-function get_the_category_list($separator = '', $parents='') {
+function get_the_category_list($separator = '', $parents='', $post_id = false) {
 	global $wp_rewrite;
-	$categories = get_the_category();
+	$categories = get_the_category($post_id);
 	if (empty($categories))
 		return apply_filters('the_category', __('Uncategorized'), $separator, $parents);
 
@@ -113,19 +124,19 @@
 			$thelist .= "\n\t<li>";
 			switch ( strtolower($parents) ) {
 				case 'multiple':
-					if ($category->category_parent)
-						$thelist .= get_category_parents($category->category_parent, TRUE);
-					$thelist .= '<a href="' . get_category_link($category->cat_ID) . '" title="' . sprintf(__("View all posts in %s"), $category->cat_name) . '" ' . $rel . '>' . $category->cat_name.'</a></li>';
+					if ($category->parent)
+						$thelist .= get_category_parents($category->parent, TRUE);
+					$thelist .= '<a href="' . get_category_link($category->term_id) . '" title="' . sprintf(__("View all posts in %s"), $category->name) . '" ' . $rel . '>' . $category->name.'</a></li>';
 					break;
 				case 'single':
-					$thelist .= '<a href="' . get_category_link($category->cat_ID) . '" title="' . sprintf(__("View all posts in %s"), $category->cat_name) . '" ' . $rel . '>';
-					if ($category->category_parent)
-						$thelist .= get_category_parents($category->category_parent, FALSE);
-					$thelist .= $category->cat_name.'</a></li>';
+					$thelist .= '<a href="' . get_category_link($category->term_id) . '" title="' . sprintf(__("View all posts in %s"), $category->name) . '" ' . $rel . '>';
+					if ($category->parent)
+						$thelist .= get_category_parents($category->parent, FALSE);
+					$thelist .= $category->name.'</a></li>';
 					break;
 				case '':
 				default:
-					$thelist .= '<a href="' . get_category_link($category->cat_ID) . '" title="' . sprintf(__("View all posts in %s"), $category->cat_name) . '" ' . $rel . '>' . $category->cat_name.'</a></li>';
+					$thelist .= '<a href="' . get_category_link($category->term_id) . '" title="' . sprintf(__("View all posts in %s"), $category->name) . '" ' . $rel . '>' . $category->cat_name.'</a></li>';
 			}
 		}
 		$thelist .= '</ul>';
@@ -136,19 +147,19 @@
 				$thelist .= $separator . ' ';
 			switch ( strtolower($parents) ) {
 				case 'multiple':
-					if ( $category->category_parent )
-						$thelist .= get_category_parents($category->category_parent, TRUE);
-					$thelist .= '<a href="' . get_category_link($category->cat_ID) . '" title="' . sprintf(__("View all posts in %s"), $category->cat_name) . '" ' . $rel . '>' . $category->cat_name.'</a>';
+					if ( $category->parent )
+						$thelist .= get_category_parents($category->parent, TRUE);
+					$thelist .= '<a href="' . get_category_link($category->term_id) . '" title="' . sprintf(__("View all posts in %s"), $category->name) . '" ' . $rel . '>' . $category->cat_name.'</a>';
 					break;
 				case 'single':
-					$thelist .= '<a href="' . get_category_link($category->cat_ID) . '" title="' . sprintf(__("View all posts in %s"), $category->cat_name) . '" ' . $rel . '>';
-					if ( $category->category_parent )
-						$thelist .= get_category_parents($category->category_parent, FALSE);
+					$thelist .= '<a href="' . get_category_link($category->term_id) . '" title="' . sprintf(__("View all posts in %s"), $category->name) . '" ' . $rel . '>';
+					if ( $category->parent )
+						$thelist .= get_category_parents($category->parent, FALSE);
 					$thelist .= "$category->cat_name</a>";
 					break;
 				case '':
 				default:
-					$thelist .= '<a href="' . get_category_link($category->cat_ID) . '" title="' . sprintf(__("View all posts in %s"), $category->cat_name) . '" ' . $rel . '>' . $category->cat_name.'</a>';
+					$thelist .= '<a href="' . get_category_link($category->term_id) . '" title="' . sprintf(__("View all posts in %s"), $category->name) . '" ' . $rel . '>' . $category->name.'</a>';
 			}
 			++$i;
 		}
@@ -156,48 +167,76 @@
 	return apply_filters('the_category', $thelist, $separator, $parents);
 }
 
-function in_category($category) { // Check if the current post is in the given category
-	global $category_cache, $post, $blog_id;
+/*
+ * in_category() - Checks whether the current post is within a particular category
+ *
+ * This function checks to see if the post is within the supplied category.  The categoy
+ * can be specified by number or name and will be checked as a name first to allow for categories with numeric names.
+ * Note: Prior to v2.5 of WordPress category names where not supported.
+ *
+ * @since 1.2.0
+ *
+ * @param int|string $category
+ * @return bool true if the post is in the supplied category
+*/
+function in_category( $category ) { // Check if the current post is in the given category
+	global $post;
+
+	if ( empty($category) )
+		return false;
 
-	if ( isset( $category_cache[$blog_id][$post->ID][$category] ) )
+	$cat_ID = get_cat_ID($category);
+	if ( $cat_ID )
+		$category = $cat_ID;
+
+	$categories = get_object_term_cache($post->ID, 'category');
+	if ( false === $categories )
+		$categories = wp_get_object_terms($post->ID, 'category');
+	if ( array_key_exists($category, $categories) )
 		return true;
 	else
 		return false;
 }
 
-function the_category($separator = '', $parents='') {
-	echo get_the_category_list($separator, $parents);
+function the_category($separator = '', $parents='', $post_id = false) {
+	echo get_the_category_list($separator, $parents, $post_id);
 }
 
 function category_description($category = 0) {
 	global $cat;
 	if ( !$category )
 		$category = $cat;
-	$category = & get_category($category);
-	return apply_filters('category_description', $category->category_description, $category->cat_ID);
+
+	return get_term_field('description', $category, 'category');
 }
 
 function wp_dropdown_categories($args = '') {
-	if ( is_array($args) )
-		$r = &$args;
-	else
-		parse_str($args, $r);
+	$defaults = array(
+		'show_option_all' => '', 'show_option_none' => '',
+		'orderby' => 'ID', 'order' => 'ASC',
+		'show_last_update' => 0, 'show_count' => 0,
+		'hide_empty' => 1, 'child_of' => 0,
+		'exclude' => '', 'echo' => 1,
+		'selected' => 0, 'hierarchical' => 0,
+		'name' => 'cat', 'class' => 'postform',
+		'depth' => 0, 'tab_index' => 0
+	);
 
-	$defaults = array('show_option_all' => '', 'show_option_none' => '', 'orderby' => 'ID',
-		'order' => 'ASC', 'show_last_update' => 0, 'show_count' => 0,
-		'hide_empty' => 1, 'child_of' => 0, 'exclude' => '', 'echo' => 1,
-		'selected' => 0, 'hierarchical' => 0, 'name' => 'cat',
-		'class' => 'postform');
 	$defaults['selected'] = ( is_category() ) ? get_query_var('cat') : 0;
-	$r = array_merge($defaults, $r);
+
+	$r = wp_parse_args( $args, $defaults );
 	$r['include_last_update_time'] = $r['show_last_update'];
-	extract($r, EXTR_SKIP);
+	extract( $r );
+
+	$tab_index_attribute = '';
+	if ( (int) $tab_index > 0 )
+		$tab_index_attribute = " tabindex=\"$tab_index\"";
 
 	$categories = get_categories($r);
 
 	$output = '';
 	if ( ! empty($categories) ) {
-		$output = "<select name='$name' id='$name' class='$class'>\n";
+		$output = "<select name='$name' id='$name' class='$class' $tab_index_attribute>\n";
 
 		if ( $show_option_all ) {
 			$show_option_all = apply_filters('list_cats', $show_option_all);
@@ -210,7 +249,7 @@
 		}
 
 		if ( $hierarchical )
-			$depth = 0;  // Walk the full depth.
+			$depth = $r['depth'];  // Walk the full depth.
 		else
 			$depth = -1; // Flat.
 
@@ -227,22 +266,28 @@
 }
 
 function wp_list_categories($args = '') {
-	if ( is_array($args) )
-		$r = &$args;
-	else
-		parse_str($args, $r);
+	$defaults = array(
+		'show_option_all' => '', 'orderby' => 'name',
+		'order' => 'ASC', 'show_last_update' => 0,
+		'style' => 'list', 'show_count' => 0,
+		'hide_empty' => 1, 'use_desc_for_title' => 1,
+		'child_of' => 0, 'feed' => '', 'feed_type' => '',
+		'feed_image' => '', 'exclude' => '',
+		'hierarchical' => true, 'title_li' => __('Categories'),
+		'echo' => 1, 'depth' => 0
+	);
 
-	$defaults = array('show_option_all' => '', 'orderby' => 'name',
-		'order' => 'ASC', 'show_last_update' => 0, 'style' => 'list',
-		'show_count' => 0, 'hide_empty' => 1, 'use_desc_for_title' => 1,
-		'child_of' => 0, 'feed' => '', 'feed_image' => '', 'exclude' => '',
-		'hierarchical' => true, 'title_li' => __('Categories'));
-	$r = array_merge($defaults, $r);
-	if ( !isset($r['pad_counts']) && $r['show_count'] && $r['hierarchical'] )
+	$r = wp_parse_args( $args, $defaults );
+
+	if ( !isset( $r['pad_counts'] ) && $r['show_count'] && $r['hierarchical'] ) {
 		$r['pad_counts'] = true;
-	if ( isset($r['show_date']) )
+	}
+
+	if ( isset( $r['show_date'] ) ) {
 		$r['include_last_update_time'] = $r['show_date'];
-	extract($r, EXTR_SKIP);
+	}
+
+	extract( $r );
 
 	$categories = get_categories($r);
 
@@ -257,18 +302,18 @@
 			$output .= __("No categories");
 	} else {
 		global $wp_query;
-		
+
 		if( !empty($show_option_all) )
-			if ('list' == $style )  
+			if ('list' == $style )
 				$output .= '<li><a href="' .  get_bloginfo('url')  . '">' . $show_option_all . '</a></li>';
 			else
 				$output .= '<a href="' .  get_bloginfo('url')  . '">' . $show_option_all . '</a>';
-		
+
 		if ( is_category() )
 			$r['current_category'] = $wp_query->get_queried_object_id();
 
 		if ( $hierarchical )
-			$depth = 0;  // Walk the full depth.
+			$depth = $r['depth'];
 		else
 			$depth = -1; // Flat.
 
@@ -278,7 +323,116 @@
 	if ( $title_li && 'list' == $style )
 		$output .= '</ul></li>';
 
-	echo apply_filters('wp_list_categories', $output);
+	$output = apply_filters('wp_list_categories', $output);
+
+	if ( $echo )
+		echo $output;
+	else
+		return $output;
+}
+
+function wp_tag_cloud( $args = '' ) {
+	$defaults = array(
+		'smallest' => 8, 'largest' => 22, 'unit' => 'pt', 'number' => 45,
+		'format' => 'flat', 'orderby' => 'name', 'order' => 'ASC',
+		'exclude' => '', 'include' => ''
+	);
+	$args = wp_parse_args( $args, $defaults );
+
+	$tags = get_tags( array_merge($args, array('orderby' => 'count', 'order' => 'DESC')) ); // Always query top tags
+
+	if ( empty($tags) )
+		return;
+
+	$return = wp_generate_tag_cloud( $tags, $args ); // Here's where those top tags get sorted according to $args
+
+	if ( is_wp_error( $return ) )
+		return false;
+
+	$return = apply_filters( 'wp_tag_cloud', $return, $args );
+
+	if ( 'array' == $args['format'] )
+		return $return;
+
+	echo $return;
+}
+
+// $tags = prefetched tag array ( get_tags() )
+// $args['format'] = 'flat' => whitespace separated, 'list' => UL, 'array' => array()
+// $args['orderby'] = 'name', 'count'
+function wp_generate_tag_cloud( $tags, $args = '' ) {
+	global $wp_rewrite;
+	$defaults = array(
+		'smallest' => 8, 'largest' => 22, 'unit' => 'pt', 'number' => 45,
+		'format' => 'flat', 'orderby' => 'name', 'order' => 'ASC'
+	);
+	$args = wp_parse_args( $args, $defaults );
+	extract($args);
+
+	if ( !$tags )
+		return;
+	$counts = $tag_links = array();
+	foreach ( (array) $tags as $tag ) {
+		$counts[$tag->name] = $tag->count;
+		$tag_links[$tag->name] = get_tag_link( $tag->term_id );
+		if ( is_wp_error( $tag_links[$tag->name] ) )
+			return $tag_links[$tag->name];
+		$tag_ids[$tag->name] = $tag->term_id;
+	}
+
+	$min_count = min($counts);
+	$spread = max($counts) - $min_count;
+	if ( $spread <= 0 )
+		$spread = 1;
+	$font_spread = $largest - $smallest;
+	if ( $font_spread <= 0 )
+		$font_spread = 1;
+	$font_step = $font_spread / $spread;
+
+	// SQL cannot save you; this is a second (potentially different) sort on a subset of data.
+	if ( 'name' == $orderby )
+		uksort($counts, 'strnatcasecmp');
+	else
+		asort($counts);
+
+	if ( 'DESC' == $order )
+		$counts = array_reverse( $counts, true );
+	elseif ( 'RAND' == $order ) {
+		$keys = array_rand( $counts, count($counts) );
+		foreach ( $keys as $key )
+			$temp[$key] = $counts[$key];
+		$counts = $temp;
+		unset($temp);
+	}
+
+	$a = array();
+
+	$rel = ( is_object($wp_rewrite) && $wp_rewrite->using_permalinks() ) ? ' rel="tag"' : '';
+
+	foreach ( $counts as $tag => $count ) {
+		$tag_id = $tag_ids[$tag];
+		$tag_link = clean_url($tag_links[$tag]);
+		$tag = str_replace(' ', '&nbsp;', wp_specialchars( $tag ));
+		$a[] = "<a href='$tag_link' class='tag-link-$tag_id' title='" . attribute_escape( sprintf( __ngettext('%d topic','%d topics',$count), $count ) ) . "'$rel style='font-size: " .
+			( $smallest + ( ( $count - $min_count ) * $font_step ) )
+			. "$unit;'>$tag</a>";
+	}
+
+	switch ( $format ) :
+	case 'array' :
+		$return =& $a;
+		break;
+	case 'list' :
+		$return = "<ul class='wp-tag-cloud'>\n\t<li>";
+		$return .= join("</li>\n\t<li>", $a);
+		$return .= "</li>\n</ul>\n";
+		break;
+	default :
+		$return = join("\n", $a);
+		break;
+	endswitch;
+
+	return apply_filters( 'wp_generate_tag_cloud', $return, $tags, $args );
 }
 
 //
@@ -297,4 +451,89 @@
 	return call_user_func_array(array(&$walker, 'walk'), $args);
 }
 
+//
+// Tags
+//
+
+function get_tag_link( $tag_id ) {
+	global $wp_rewrite;
+	$taglink = $wp_rewrite->get_tag_permastruct();
+
+	$tag = &get_term($tag_id, 'post_tag');
+	if ( is_wp_error( $tag ) )
+		return $tag;
+	$slug = $tag->slug;
+
+	if ( empty($taglink) ) {
+		$file = get_option('home') . '/';
+		$taglink = $file . '?tag=' . $slug;
+	} else {
+		$taglink = str_replace('%tag%', $slug, $taglink);
+		$taglink = get_option('home') . user_trailingslashit($taglink, 'category');
+	}
+	return apply_filters('tag_link', $taglink, $tag_id);
+}
+
+function get_the_tags( $id = 0 ) {
+	return apply_filters( 'get_the_tags', get_the_terms($id, 'post_tag') );
+}
+
+function get_the_tag_list( $before = '', $sep = '', $after = '' ) {
+	return apply_filters( 'the_tags', get_the_term_list(0, 'post_tag', $before, $sep, $after) );
+}
+
+function the_tags( $before = 'Tags: ', $sep = ', ', $after = '' ) {
+	return the_terms( 0, 'post_tag', $before, $sep, $after );
+}
+
+function get_the_terms( $id = 0, $taxonomy ) {
+	global $post;
+
+ 	$id = (int) $id;
+
+	if ( ! $id && ! in_the_loop() )
+		return false; // in-the-loop function
+
+	if ( !$id )
+		$id = (int) $post->ID;
+
+	$terms = get_object_term_cache($id, $taxonomy);
+	if ( false === $terms )
+		$terms = wp_get_object_terms($id, $taxonomy);
+
+	if ( empty( $terms ) )
+		return false;
+
+	return $terms;
+}
+
+function get_the_term_list( $id = 0, $taxonomy, $before = '', $sep = '', $after = '' ) {
+	$terms = get_the_terms($id, $taxonomy);
+
+	if ( is_wp_error($terms) )
+		return $terms;
+
+	if ( empty( $terms ) )
+		return false;
+
+	foreach ( $terms as $term ) {
+		$link = get_term_link($term, $taxonomy);
+		if ( is_wp_error( $link ) )
+			return $link;
+		$term_links[] = '<a href="' . $link . '" rel="tag">' . $term->name . '</a>';
+	}
+
+	$term_links = apply_filters( "term_links-$taxonomy", $term_links );
+
+	return $before . join($sep, $term_links) . $after;
+}
+
+function the_terms( $id, $taxonomy, $before = '', $sep = '', $after = '' ) {
+	$return = get_the_term_list($id, $taxonomy, $before, $sep, $after);
+	if ( is_wp_error( $return ) )
+		return false;
+	else
+		echo $return;
+}
+
 ?>
diff -x .svn -aruN 2.2.2.src/wp-includes/category.php 2.5.src/wp-includes/category.php
--- 2.2.2.src/wp-includes/category.php	2007-06-15 12:45:21.000000000 -0500
+++ 2.5.src/wp-includes/category.php	2008-01-24 19:59:06.000000000 -0600
@@ -1,10 +1,8 @@
 <?php
 
 function get_all_category_ids() {
-	global $wpdb;
-
 	if ( ! $cat_ids = wp_cache_get('all_category_ids', 'category') ) {
-		$cat_ids = $wpdb->get_col("SELECT cat_ID FROM $wpdb->categories");
+		$cat_ids = get_terms('category', 'fields=ids&get=all');
 		wp_cache_add('all_category_ids', $cat_ids, 'category');
 	}
 
@@ -12,166 +10,33 @@
 }
 
 function &get_categories($args = '') {
-	global $wpdb, $category_links;
-
-	if ( is_array($args) )
-		$r = &$args;
-	else
-		parse_str($args, $r);
-
-	$defaults = array('type' => 'post', 'child_of' => 0, 'orderby' => 'name', 'order' => 'ASC',
-		'hide_empty' => true, 'include_last_update_time' => false, 'hierarchical' => 1, 'exclude' => '', 'include' => '',
-		'number' => '', 'pad_counts' => false);
-	$r = array_merge($defaults, $r);
-	if ( 'count' == $r['orderby'] )
-		$r['orderby'] = 'category_count';
-	else
-		$r['orderby'] = "cat_" . $r['orderby'];  // restricts order by to cat_ID and cat_name fields
-	$r['number'] = (int) $r['number'];
-	extract($r, EXTR_SKIP);
-
-	$key = md5( serialize( $r ) );
-	if ( $cache = wp_cache_get( 'get_categories', 'category' ) )
-		if ( isset( $cache[ $key ] ) )
-			return apply_filters('get_categories', $cache[$key], $r);
-
-	$where = 'cat_ID > 0';
-	$inclusions = '';
-	if ( !empty($include) ) {
-		$child_of = 0; //ignore child_of and exclude params if using include
-		$exclude = '';
-		$incategories = preg_split('/[\s,]+/',$include);
-		if ( count($incategories) ) {
-			foreach ( $incategories as $incat ) {
-				if (empty($inclusions))
-					$inclusions = ' AND ( cat_ID = ' . intval($incat) . ' ';
-				else
-					$inclusions .= ' OR cat_ID = ' . intval($incat) . ' ';
-			}
-		}
-	}
-	if (!empty($inclusions))
-		$inclusions .= ')';
-	$where .= $inclusions;
-
-	$exclusions = '';
-	if ( !empty($exclude) ) {
-		$excategories = preg_split('/[\s,]+/',$exclude);
-		if ( count($excategories) ) {
-			foreach ( $excategories as $excat ) {
-				if (empty($exclusions))
-					$exclusions = ' AND ( cat_ID <> ' . intval($excat) . ' ';
-				else
-					$exclusions .= ' AND cat_ID <> ' . intval($excat) . ' ';
-				// TODO: Exclude children of excluded cats?   Note: children are getting excluded
-			}
-		}
-	}
-	if (!empty($exclusions))
-		$exclusions .= ')';
-	$exclusions = apply_filters('list_cats_exclusions', $exclusions, $r );
-	$where .= $exclusions;
-
-	if ( $hide_empty && !$hierarchical ) {
-		if ( 'link' == $type )
-			$where .= ' AND link_count > 0';
-		else
-			$where .= ' AND category_count > 0';
-	}
-
-	if ( !empty($number) )
-		$number = 'LIMIT ' . $number;
-	else
-		$number = '';
-
-	$categories = $wpdb->get_results("SELECT * FROM $wpdb->categories WHERE $where ORDER BY $orderby $order $number");
-
-	if ( empty($categories) )
-		return array();
-
-	// TODO: Integrate this into the main query.
-	if ( $include_last_update_time ) {
-		$stamps = $wpdb->get_results("SELECT category_id, UNIX_TIMESTAMP( MAX(post_date) ) AS ts FROM $wpdb->posts, $wpdb->post2cat, $wpdb->categories
-							WHERE post_status = 'publish' AND post_id = ID AND $where GROUP BY category_id");
-		global $cat_stamps;
-		foreach ($stamps as $stamp)
-			$cat_stamps[$stamp->category_id] = $stamp->ts;
-		function stamp_cat($cat) {
-			global $cat_stamps;
-			$cat->last_update_timestamp = $cat_stamps[$cat->cat_ID];
-			return $cat;
-		}
-		$categories = array_map('stamp_cat', $categories);
-		unset($cat_stamps);
-	}
+	$defaults = array('type' => 'category');
+	$args = wp_parse_args($args, $defaults);
 
-	if ( $child_of || $hierarchical ) {
-		$children = _get_category_hierarchy();
-		if ( ! empty($children) )
-			$categories = & _get_cat_children($child_of, $categories);
-	}
+	$taxonomy = 'category';
+	if ( 'link' == $args['type'] )
+		$taxonomy = 'link_category';
+	$categories = get_terms($taxonomy, $args);
 
-	// Update category counts to include children.
-	if ( $pad_counts )
-		_pad_category_counts($type, $categories);
-
-	// Make sure we show empty categories that have children.
-	if ( $hierarchical && $hide_empty ) {
-		foreach ( $categories as $k => $category ) {
-			if ( ! $category->{'link' == $type ? 'link_count' : 'category_count'} ) {
-				$children = _get_cat_children($category->cat_ID, $categories);
-				foreach ( $children as $child )
-					if ( $child->{'link' == $type ? 'link_count' : 'category_count'} )
-						continue 2;
-
-				// It really is empty
-				unset($categories[$k]);
-			}
-		}
-	}
-	reset ( $categories );
+	foreach ( array_keys($categories) as $k )
+		_make_cat_compat($categories[$k]);
 
-	$cache[ $key ] = $categories;
-	wp_cache_add( 'get_categories', $cache, 'category' );
-
-	$categories = apply_filters('get_categories', $categories, $r);
 	return $categories;
 }
 
 // Retrieves category data given a category ID or category object.
 // Handles category caching.
-function &get_category(&$category, $output = OBJECT) {
-	global $wpdb;
-
-	if ( empty($category) )
-		return null;
-
-	if ( is_object($category) ) {
-		wp_cache_add($category->cat_ID, $category, 'category');
-		$_category = $category;
-	} else {
-		$category = (int) $category;
-		if ( ! $_category = wp_cache_get($category, 'category') ) {
-			$_category = $wpdb->get_row("SELECT * FROM $wpdb->categories WHERE cat_ID = '$category' LIMIT 1");
-			wp_cache_add($category, $_category, 'category');
-		}
-	}
+function &get_category($category, $output = OBJECT, $filter = 'raw') {
+	$category = get_term($category, 'category', $output, $filter);
+	if ( is_wp_error( $category ) )
+		return $category;
 
-	$_category = apply_filters('get_category', $_category);
+	_make_cat_compat($category);
 
-	if ( $output == OBJECT ) {
-		return $_category;
-	} elseif ( $output == ARRAY_A ) {
-		return get_object_vars($_category);
-	} elseif ( $output == ARRAY_N ) {
-		return array_values(get_object_vars($_category));
-	} else {
-		return $_category;
-	}
+	return $category;
 }
 
 function get_category_by_path($category_path, $full_match = true, $output = OBJECT) {
-	global $wpdb;
 	$category_path = rawurlencode(urldecode($category_path));
 	$category_path = str_replace('%2F', '/', $category_path);
 	$category_path = str_replace('%20', ' ', $category_path);
@@ -182,7 +47,7 @@
 	foreach ( (array) $category_paths as $pathdir )
 		$full_path .= ( $pathdir != '' ? '/' : '' ) . sanitize_title($pathdir);
 
-	$categories = $wpdb->get_results("SELECT cat_ID, category_nicename, category_parent FROM $wpdb->categories WHERE category_nicename = '$leaf_path'");
+	$categories = get_terms('category', "get=all&slug=$leaf_path");
 
 	if ( empty($categories) )
 		return NULL;
@@ -190,29 +55,38 @@
 	foreach ($categories as $category) {
 		$path = '/' . $leaf_path;
 		$curcategory = $category;
-		while ( ($curcategory->category_parent != 0) && ($curcategory->category_parent != $curcategory->cat_ID) ) {
-			$curcategory = $wpdb->get_row("SELECT cat_ID, category_nicename, category_parent FROM $wpdb->categories WHERE cat_ID = '$curcategory->category_parent'");
-			$path = '/' . $curcategory->category_nicename . $path;
+		while ( ($curcategory->parent != 0) && ($curcategory->parent != $curcategory->term_id) ) {
+			$curcategory = get_term($curcategory->parent, 'category');
+			if ( is_wp_error( $curcategory ) )
+				return $curcategory;
+			$path = '/' . $curcategory->slug . $path;
 		}
 
 		if ( $path == $full_path )
-			return get_category($category->cat_ID, $output);
+			return get_category($category->term_id, $output);
 	}
 
 	// If full matching is not required, return the first cat that matches the leaf.
 	if ( ! $full_match )
-		return get_category($categories[0]->cat_ID, $output);
+		return get_category($categories[0]->term_id, $output);
 
 	return NULL;
 }
 
-// Get the ID of a category from its name
-function get_cat_ID($cat_name='General') {
-	global $wpdb;
+function get_category_by_slug( $slug  ) {
+	$category = get_term_by('slug', $slug, 'category');
+	if ( $category )
+		_make_cat_compat($category);
 
-	$cid = $wpdb->get_var("SELECT cat_ID FROM $wpdb->categories WHERE cat_name='$cat_name'");
+	return $category;
+}
 
-	return $cid?$cid:1;	// default to cat 1
+// Get the ID of a category from its name
+function get_cat_ID($cat_name='General') {
+	$cat = get_term_by('name', $cat_name, 'category');
+	if ($cat)
+		return $cat->term_id;
+	return 0;
 }
 
 // Deprecate
@@ -224,108 +98,80 @@
 function get_cat_name($cat_id) {
 	$cat_id = (int) $cat_id;
 	$category = &get_category($cat_id);
-	return $category->cat_name;
+	return $category->name;
 }
 
-function cat_is_ancestor_of($cat1, $cat2) { 
-	if ( is_int($cat1) ) 
-		$cat1 = & get_category($cat1); 
-	if ( is_int($cat2) ) 
-		$cat2 = & get_category($cat2); 
+function cat_is_ancestor_of($cat1, $cat2) {
+	if ( is_int($cat1) )
+		$cat1 = & get_category($cat1);
+	if ( is_int($cat2) )
+		$cat2 = & get_category($cat2);
 
-	if ( !$cat1->cat_ID || !$cat2->category_parent ) 
-		return false; 
+	if ( !$cat1->term_id || !$cat2->parent )
+		return false;
 
-	if ( $cat2->category_parent == $cat1->cat_ID ) 
-		return true; 
+	if ( $cat2->parent == $cat1->term_id )
+		return true;
 
-	return cat_is_ancestor_of($cat1, get_category($cat2->parent_category)); 
-} 
+	return cat_is_ancestor_of($cat1, get_category($cat2->parent));
+}
 
-//
-// Private
-//
+function sanitize_category($category, $context = 'display') {
+	return sanitize_term($category, 'category', $context);
+}
 
-function &_get_cat_children($category_id, $categories) {
-	if ( empty($categories) )
-		return array();
+function sanitize_category_field($field, $value, $cat_id, $context) {
+	return sanitize_term_field($field, $value, $cat_id, 'category', $context);
+}
 
-	$category_list = array();
-	$has_children = _get_category_hierarchy();
+// Tags
 
-	if  ( ( 0 != $category_id ) && ! isset($has_children[$category_id]) )
-		return array();
+function &get_tags($args = '') {
+	$tags = get_terms('post_tag', $args);
 
-	foreach ( $categories as $category ) {
-		if ( $category->cat_ID == $category_id )
-			continue;
+	if ( empty($tags) )
+		return array();
 
-		if ( $category->category_parent == $category_id ) {
-			$category_list[] = $category;
+	$tags = apply_filters('get_tags', $tags, $args);
+	return $tags;
+}
 
-			if ( !isset($has_children[$category->cat_ID]) )
-				continue;
+function &get_tag($tag, $output = OBJECT, $filter = 'raw') {
+	return get_term($tag, 'post_tag', $output, $filter);
+}
 
-			if ( $children = _get_cat_children($category->cat_ID, $categories) )
-				$category_list = array_merge($category_list, $children);
-		}
-	}
+//
+// Cache
+//
 
-	return $category_list;
+function update_category_cache() {
+	return true;
 }
 
-// Recalculates link or post counts by including items from child categories
-// Assumes all relevant children are already in the $categories argument
-function _pad_category_counts($type, &$categories) {
-	global $wpdb;
-
-	// Set up some useful arrays
-	foreach ( $categories as $key => $cat ) {
-		$cats[$cat->cat_ID] = & $categories[$key];
-		$cat_IDs[] = $cat->cat_ID;
-	}
-
-	// Get the relevant post2cat or link2cat records and stick them in a lookup table
-	if ( $type == 'post' ) {
-		$results = $wpdb->get_results("SELECT post_id, category_id FROM $wpdb->post2cat LEFT JOIN $wpdb->posts ON post_id = ID WHERE category_id IN (".join(',', $cat_IDs).") AND post_type = 'post' AND post_status = 'publish'");
-		foreach ( $results as $row )
-			++$cat_items[$row->category_id][$row->post_id];
-	} else {
-		$results = $wpdb->get_results("SELECT $wpdb->link2cat.link_id, category_id FROM $wpdb->link2cat LEFT JOIN $wpdb->links USING (link_id) WHERE category_id IN (".join(',', $cat_IDs).") AND link_visible = 'Y'");
-		foreach ( $results as $row )
-			++$cat_items[$row->category_id][$row->link_id];
-	}
+function clean_category_cache($id) {
+	clean_term_cache($id, 'category');
+}
 
-	// Touch every ancestor's lookup row for each post in each category
-	foreach ( $cat_IDs as $cat_ID ) {
-		$child = $cat_ID;
-		while ( $parent = $cats[$child]->category_parent ) {
-			if ( !empty($cat_items[$cat_ID]) )
-				foreach ( $cat_items[$cat_ID] as $item_id => $touches )
-					++$cat_items[$parent][$item_id];
-			$child = $parent;
-		}
-	}
+//
+// Private helpers
+//
 
-	// Transfer the touched cells 
-	foreach ( (array) $cat_items as $id => $items )
-		if ( isset($cats[$id]) )
-			$cats[$id]->{'link' == $type ? 'link_count' : 'category_count'} = count($items);
-}
-
-function _get_category_hierarchy() {
-	$children = get_option('category_children');
-	if ( is_array($children) )
-		return $children;
-
-	$children = array();
-	$categories = get_categories('hide_empty=0&hierarchical=0');
-	foreach ( $categories as $cat ) {
-		if ( $cat->category_parent > 0 )
-			$children[$cat->category_parent][] = $cat->cat_ID;
+function _make_cat_compat( &$category) {
+	if ( is_object($category) ) {
+		$category->cat_ID = &$category->term_id;
+		$category->category_count = &$category->count;
+		$category->category_description = &$category->description;
+		$category->cat_name = &$category->name;
+		$category->category_nicename = &$category->slug;
+		$category->category_parent = &$category->parent;
+	} else if ( is_array($category) && isset($category['term_id']) ) {
+		$category['cat_ID'] = &$category['term_id'];
+		$category['category_count'] = &$category['count'];
+		$category['category_description'] = &$category['description'];
+		$category['cat_name'] = &$category['name'];
+		$category['category_nicename'] = &$category['slug'];
+		$category['category_parent'] = &$category['parent'];
 	}
-	update_option('category_children', $children);
-
-	return $children;
 }
+
 ?>
diff -x .svn -aruN 2.2.2.src/wp-includes/class-IXR.php 2.5.src/wp-includes/class-IXR.php
--- 2.2.2.src/wp-includes/class-IXR.php	2005-12-07 18:08:12.000000000 -0600
+++ 2.5.src/wp-includes/class-IXR.php	2007-12-20 16:28:54.000000000 -0600
@@ -1,11 +1,17 @@
 <?php
-/* 
-   IXR - The Inutio XML-RPC Library - (c) Incutio Ltd 2002-2005
-   Version 1.7 (beta) - Simon Willison, 23rd May 2005
-   Site:   http://scripts.incutio.com/xmlrpc/
-   Manual: http://scripts.incutio.com/xmlrpc/manual.php
-   Made available under the BSD License: http://www.opensource.org/licenses/bsd-license.php
-*/
+/**
+ * IXR - The Inutio XML-RPC Library
+ *
+ * @package IXR
+ * @since 1.5
+ *
+ * @copyright Incutio Ltd 2002-2005
+ * @version 1.7 (beta) 23rd May 2005
+ * @author Simon Willison
+ * @link http://scripts.incutio.com/xmlrpc/ Site
+ * @link http://scripts.incutio.com/xmlrpc/manual.php Manual
+ * @license BSD License http://www.opensource.org/licenses/bsd-license.php
+ */
 
 class IXR_Value {
     var $data;
@@ -47,7 +53,7 @@
         }
         // If it is a normal PHP object convert it in to a struct
         if (is_object($this->data)) {
-            
+
             $this->data = get_object_vars($this->data);
             return 'struct';
         }
@@ -254,7 +260,7 @@
             }
         }
 		$this->_currentTagContents = '';
-    }       
+    }
 }
 
 
@@ -379,7 +385,7 @@
                 'specUrl' => 'http://www.xmlrpc.com/discuss/msgReader$1208',
                 'specVersion' => 1
             ),
-        );   
+        );
     }
     function getCapabilities($args) {
         return $this->capabilities;
@@ -584,7 +590,7 @@
       </struct>
     </value>
   </fault>
-</methodResponse> 
+</methodResponse>
 
 EOD;
         return $xml;
@@ -658,27 +664,27 @@
             'specVersion' => 1
         );
         $this->addCallback(
-            'system.methodSignature', 
-            'this:methodSignature', 
-            array('array', 'string'), 
+            'system.methodSignature',
+            'this:methodSignature',
+            array('array', 'string'),
             'Returns an array describing the return type and required parameters of a method'
         );
         $this->addCallback(
-            'system.getCapabilities', 
-            'this:getCapabilities', 
-            array('struct'), 
+            'system.getCapabilities',
+            'this:getCapabilities',
+            array('struct'),
             'Returns a struct describing the XML-RPC specifications supported by this server'
         );
         $this->addCallback(
-            'system.listMethods', 
-            'this:listMethods', 
-            array('array'), 
+            'system.listMethods',
+            'this:listMethods',
+            array('array'),
             'Returns an array of available methods on this server'
         );
         $this->addCallback(
-            'system.methodHelp', 
-            'this:methodHelp', 
-            array('string', 'string'), 
+            'system.methodHelp',
+            'this:methodHelp',
+            array('string', 'string'),
             'Returns a documentation string for the specified method'
         );
     }
@@ -812,4 +818,4 @@
     }
 }
 
-?>
\ No newline at end of file
+?>
diff -x .svn -aruN 2.2.2.src/wp-includes/class-phpass.php 2.5.src/wp-includes/class-phpass.php
--- 2.2.2.src/wp-includes/class-phpass.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/class-phpass.php	2008-03-20 14:56:37.000000000 -0500
@@ -0,0 +1,257 @@
+<?php
+/**
+ * Portable PHP password hashing framework.
+ * @package phpass
+ * @since 2.5
+ * @version 0.1
+ * @link http://www.openwall.com/phpass/
+ */
+
+#
+# Portable PHP password hashing framework.
+#
+# Version 0.1 / genuine.
+#
+# Written by Solar Designer <solar at openwall.com> in 2004-2006 and placed in
+# the public domain.
+#
+# There's absolutely no warranty.
+#
+# The homepage URL for this framework is:
+#
+#	http://www.openwall.com/phpass/
+#
+# Please be sure to update the Version line if you edit this file in any way.
+# It is suggested that you leave the main version number intact, but indicate
+# your project name (after the slash) and add your own revision information.
+#
+# Please do not change the "private" password hashing method implemented in
+# here, thereby making your hashes incompatible.  However, if you must, please
+# change the hash type identifier (the "$P$") to something different.
+#
+# Obviously, since this code is in the public domain, the above are not
+# requirements (there can be none), but merely suggestions.
+#
+class PasswordHash {
+	var $itoa64;
+	var $iteration_count_log2;
+	var $portable_hashes;
+	var $random_state;
+
+	function PasswordHash($iteration_count_log2, $portable_hashes)
+	{
+		$this->itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
+
+		if ($iteration_count_log2 < 4 || $iteration_count_log2 > 31)
+			$iteration_count_log2 = 8;
+		$this->iteration_count_log2 = $iteration_count_log2;
+
+		$this->portable_hashes = $portable_hashes;
+
+		$this->random_state = microtime() . (function_exists('getmypid') ? getmypid() : '') . uniqid(rand(), TRUE);
+	
+	}
+
+	function get_random_bytes($count)
+	{
+		$output = '';
+		if (($fh = @fopen('/dev/urandom', 'rb'))) {
+			$output = fread($fh, $count);
+			fclose($fh);
+		}
+
+		if (strlen($output) < $count) {
+			$output = '';
+			for ($i = 0; $i < $count; $i += 16) {
+				$this->random_state =
+				    md5(microtime() . $this->random_state);
+				$output .=
+				    pack('H*', md5($this->random_state));
+			}
+			$output = substr($output, 0, $count);
+		}
+
+		return $output;
+	}
+
+	function encode64($input, $count)
+	{
+		$output = '';
+		$i = 0;
+		do {
+			$value = ord($input[$i++]);
+			$output .= $this->itoa64[$value & 0x3f];
+			if ($i < $count)
+				$value |= ord($input[$i]) << 8;
+			$output .= $this->itoa64[($value >> 6) & 0x3f];
+			if ($i++ >= $count)
+				break;
+			if ($i < $count)
+				$value |= ord($input[$i]) << 16;
+			$output .= $this->itoa64[($value >> 12) & 0x3f];
+			if ($i++ >= $count)
+				break;
+			$output .= $this->itoa64[($value >> 18) & 0x3f];
+		} while ($i < $count);
+
+		return $output;
+	}
+
+	function gensalt_private($input)
+	{
+		$output = '$P$';
+		$output .= $this->itoa64[min($this->iteration_count_log2 +
+			((PHP_VERSION >= '5') ? 5 : 3), 30)];
+		$output .= $this->encode64($input, 6);
+
+		return $output;
+	}
+
+	function crypt_private($password, $setting)
+	{
+		$output = '*0';
+		if (substr($setting, 0, 2) == $output)
+			$output = '*1';
+
+		if (substr($setting, 0, 3) != '$P$')
+			return $output;
+
+		$count_log2 = strpos($this->itoa64, $setting[3]);
+		if ($count_log2 < 7 || $count_log2 > 30)
+			return $output;
+
+		$count = 1 << $count_log2;
+
+		$salt = substr($setting, 4, 8);
+		if (strlen($salt) != 8)
+			return $output;
+
+		# We're kind of forced to use MD5 here since it's the only
+		# cryptographic primitive available in all versions of PHP
+		# currently in use.  To implement our own low-level crypto
+		# in PHP would result in much worse performance and
+		# consequently in lower iteration counts and hashes that are
+		# quicker to crack (by non-PHP code).
+		if (PHP_VERSION >= '5') {
+			$hash = md5($salt . $password, TRUE);
+			do {
+				$hash = md5($hash . $password, TRUE);
+			} while (--$count);
+		} else {
+			$hash = pack('H*', md5($salt . $password));
+			do {
+				$hash = pack('H*', md5($hash . $password));
+			} while (--$count);
+		}
+
+		$output = substr($setting, 0, 12);
+		$output .= $this->encode64($hash, 16);
+
+		return $output;
+	}
+
+	function gensalt_extended($input)
+	{
+		$count_log2 = min($this->iteration_count_log2 + 8, 24);
+		# This should be odd to not reveal weak DES keys, and the
+		# maximum valid value is (2**24 - 1) which is odd anyway.
+		$count = (1 << $count_log2) - 1;
+
+		$output = '_';
+		$output .= $this->itoa64[$count & 0x3f];
+		$output .= $this->itoa64[($count >> 6) & 0x3f];
+		$output .= $this->itoa64[($count >> 12) & 0x3f];
+		$output .= $this->itoa64[($count >> 18) & 0x3f];
+
+		$output .= $this->encode64($input, 3);
+
+		return $output;
+	}
+
+	function gensalt_blowfish($input)
+	{
+		# This one needs to use a different order of characters and a
+		# different encoding scheme from the one in encode64() above.
+		# We care because the last character in our encoded string will
+		# only represent 2 bits.  While two known implementations of
+		# bcrypt will happily accept and correct a salt string which
+		# has the 4 unused bits set to non-zero, we do not want to take
+		# chances and we also do not want to waste an additional byte
+		# of entropy.
+		$itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
+
+		$output = '$2a$';
+		$output .= chr(ord('0') + $this->iteration_count_log2 / 10);
+		$output .= chr(ord('0') + $this->iteration_count_log2 % 10);
+		$output .= '$';
+
+		$i = 0;
+		do {
+			$c1 = ord($input[$i++]);
+			$output .= $itoa64[$c1 >> 2];
+			$c1 = ($c1 & 0x03) << 4;
+			if ($i >= 16) {
+				$output .= $itoa64[$c1];
+				break;
+			}
+
+			$c2 = ord($input[$i++]);
+			$c1 |= $c2 >> 4;
+			$output .= $itoa64[$c1];
+			$c1 = ($c2 & 0x0f) << 2;
+
+			$c2 = ord($input[$i++]);
+			$c1 |= $c2 >> 6;
+			$output .= $itoa64[$c1];
+			$output .= $itoa64[$c2 & 0x3f];
+		} while (1);
+
+		return $output;
+	}
+
+	function HashPassword($password)
+	{
+		$random = '';
+
+		if (CRYPT_BLOWFISH == 1 && !$this->portable_hashes) {
+			$random = $this->get_random_bytes(16);
+			$hash =
+			    crypt($password, $this->gensalt_blowfish($random));
+			if (strlen($hash) == 60)
+				return $hash;
+		}
+
+		if (CRYPT_EXT_DES == 1 && !$this->portable_hashes) {
+			if (strlen($random) < 3)
+				$random = $this->get_random_bytes(3);
+			$hash =
+			    crypt($password, $this->gensalt_extended($random));
+			if (strlen($hash) == 20)
+				return $hash;
+		}
+
+		if (strlen($random) < 6)
+			$random = $this->get_random_bytes(6);
+		$hash =
+		    $this->crypt_private($password,
+		    $this->gensalt_private($random));
+		if (strlen($hash) == 34)
+			return $hash;
+
+		# Returning '*' on error is safe here, but would _not_ be safe
+		# in a crypt(3)-like function used _both_ for generating new
+		# hashes and for validating passwords against existing hashes.
+		return '*';
+	}
+
+	function CheckPassword($password, $stored_hash)
+	{
+		$hash = $this->crypt_private($password, $stored_hash);
+		if ($hash[0] == '*')
+			$hash = crypt($password, $stored_hash);
+
+		return $hash == $stored_hash;
+	}
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-includes/class-phpmailer.php 2.5.src/wp-includes/class-phpmailer.php
--- 2.2.2.src/wp-includes/class-phpmailer.php	2007-06-11 18:18:24.000000000 -0500
+++ 2.5.src/wp-includes/class-phpmailer.php	2008-03-21 11:11:47.000000000 -0500
@@ -58,7 +58,7 @@
      * Sets the From email address for the message.
      * @var string
      */
-    var $From               = "support@wordpress.com";
+    var $From               = "localhost.localdomain";
 
     /**
      * Sets the From name of the message.
@@ -96,7 +96,7 @@
     var $AltBody           = "";
 
     /**
-     * Sets word wrapping on the body of the message to a given number of 
+     * Sets word wrapping on the body of the message to a given number of
      * characters.
      * @var int
      */
@@ -113,10 +113,10 @@
      * @var string
      */
     var $Sendmail          = "/usr/sbin/sendmail";
-    
+
     /**
-     * Path to PHPMailer plugins.  This is now only useful if the SMTP class 
-     * is in a different directory than the PHP include path.  
+     * Path to PHPMailer plugins.  This is now only useful if the SMTP class
+     * is in a different directory than the PHP include path.
      * @var string
      */
     var $PluginDir         = "";
@@ -186,7 +186,7 @@
     var $Password     = "";
 
     /**
-     *  Sets the SMTP server timeout in seconds. This function will not 
+     *  Sets the SMTP server timeout in seconds. This function will not
      *  work with the win32 version.
      *  @var int
      */
@@ -199,9 +199,9 @@
     var $SMTPDebug    = false;
 
     /**
-     * Prevents the SMTP connection from being closed after each mail 
-     * sending.  If this is set to true then to close the connection 
-     * requires an explicit call to SmtpClose(). 
+     * Prevents the SMTP connection from being closed after each mail
+     * sending.  If this is set to true then to close the connection
+     * requires an explicit call to SmtpClose().
      * @var bool
      */
     var $SMTPKeepAlive = false;
@@ -222,13 +222,13 @@
     var $error_count     = 0;
     var $LE              = "\n";
     /**#@-*/
-    
+
     /////////////////////////////////////////////////
     // VARIABLE METHODS
     /////////////////////////////////////////////////
 
     /**
-     * Sets message type to HTML.  
+     * Sets message type to HTML.
      * @param bool $bool
      * @return void
      */
@@ -264,7 +264,7 @@
     }
 
     /**
-     * Sets Mailer to send message using the qmail MTA. 
+     * Sets Mailer to send message using the qmail MTA.
      * @return void
      */
     function IsQmail() {
@@ -278,7 +278,7 @@
     /////////////////////////////////////////////////
 
     /**
-     * Adds a "To" address.  
+     * Adds a "To" address.
      * @param string $address
      * @param string $name
      * @return void
@@ -292,7 +292,7 @@
     /**
      * Adds a "Cc" address. Note: this function works
      * with the SMTP mailer on win32, not with the "mail"
-     * mailer.  
+     * mailer.
      * @param string $address
      * @param string $name
      * @return void
@@ -306,7 +306,7 @@
     /**
      * Adds a "Bcc" address. Note: this function works
      * with the SMTP mailer on win32, not with the "mail"
-     * mailer.  
+     * mailer.
      * @param string $address
      * @param string $name
      * @return void
@@ -318,7 +318,7 @@
     }
 
     /**
-     * Adds a "Reply-to" address.  
+     * Adds a "Reply-to" address.
      * @param string $address
      * @param string $name
      * @return void
@@ -337,7 +337,7 @@
     /**
      * Creates message and assigns Mailer. If the message is
      * not sent successfully then it returns false.  Use the ErrorInfo
-     * variable to view description of the error.  
+     * variable to view description of the error.
      * @return bool
      */
     function Send() {
@@ -382,9 +382,9 @@
 
         return $result;
     }
-    
+
     /**
-     * Sends mail using the $Sendmail program.  
+     * Sends mail using the $Sendmail program.
      * @access private
      * @return bool
      */
@@ -402,7 +402,7 @@
 
         fputs($mail, $header);
         fputs($mail, $body);
-        
+
         $result = pclose($mail) >> 8 & 0xFF;
         if($result != 0)
         {
@@ -414,7 +414,7 @@
     }
 
     /**
-     * Sends mail using the PHP mail() function.  
+     * Sends mail using the PHP mail() function.
      * @access private
      * @return bool
      */
@@ -431,7 +431,7 @@
             $old_from = ini_get("sendmail_from");
             ini_set("sendmail_from", $this->Sender);
             $params = sprintf("-oi -f %s", $this->Sender);
-            $rt = @mail($to, $this->EncodeHeader($this->Subject), $body, 
+            $rt = @mail($to, $this->EncodeHeader($this->Subject), $body,
                         $header, $params);
         }
         else
@@ -457,7 +457,7 @@
      * @return bool
      */
     function SmtpSend($header, $body) {
-        include_once($this->PluginDir . "class.smtp.php");
+        include_once($this->PluginDir . "class-smtp.php");
         $error = "";
         $bad_rcpt = array();
 
@@ -518,7 +518,7 @@
     }
 
     /**
-     * Initiates a connection to an SMTP server.  Returns false if the 
+     * Initiates a connection to an SMTP server.  Returns false if the
      * operation failed.
      * @access private
      * @return bool
@@ -529,7 +529,7 @@
         $this->smtp->do_debug = $this->SMTPDebug;
         $hosts = explode(";", $this->Host);
         $index = 0;
-        $connection = ($this->smtp->Connected()); 
+        $connection = ($this->smtp->Connected());
 
         // Retry while there is no connection
         while($index < count($hosts) && $connection == false)
@@ -548,10 +548,10 @@
                     $this->smtp->Hello($this->Helo);
                 else
                     $this->smtp->Hello($this->ServerHostname());
-        
+
                 if($this->SMTPAuth)
                 {
-                    if(!$this->smtp->Authenticate($this->Username, 
+                    if(!$this->smtp->Authenticate($this->Username,
                                                   $this->Password))
                     {
                         $this->SetError($this->Lang("authenticate"));
@@ -585,7 +585,7 @@
     }
 
     /**
-     * Sets the language for all class error messages.  Returns false 
+     * Sets the language for all class error messages.  Returns false
      * if it cannot load the language file.  The default language type
      * is English.
      * @param string $lang_type Type of language (e.g. Portuguese: "br")
@@ -604,7 +604,7 @@
             return false;
         }
         $this->language = $PHPMAILER_LANG;
-    
+
         return true;
     }
 
@@ -613,7 +613,7 @@
     /////////////////////////////////////////////////
 
     /**
-     * Creates recipient headers.  
+     * Creates recipient headers.
      * @access private
      * @return string
      */
@@ -629,9 +629,9 @@
 
         return $addr_str;
     }
-    
+
     /**
-     * Formats an address correctly. 
+     * Formats an address correctly.
      * @access private
      * @return string
      */
@@ -640,7 +640,7 @@
             $formatted = $addr[0];
         else
         {
-            $formatted = $this->EncodeHeader($addr[1], 'phrase') . " <" . 
+            $formatted = $this->EncodeHeader($addr[1], 'phrase') . " <" .
                          $addr[0] . ">";
         }
 
@@ -650,7 +650,7 @@
     /**
      * Wraps message for use with mailers that do not
      * automatically perform wrapping and for quoted-printable.
-     * Original written by philippe.  
+     * Original written by philippe.
      * @access private
      * @return string
      */
@@ -712,7 +712,7 @@
               else
               {
                 $buf_o = $buf;
-                $buf .= ($e == 0) ? $word : (" " . $word); 
+                $buf .= ($e == 0) ? $word : (" " . $word);
 
                 if (strlen($buf) > $length and $buf_o != "")
                 {
@@ -726,7 +726,7 @@
 
         return $message;
     }
-    
+
     /**
      * Set the body wrapping.
      * @access private
@@ -735,7 +735,7 @@
     function SetWordWrap() {
         if($this->WordWrap < 1)
             return;
-            
+
         switch($this->message_type)
         {
            case "alt":
@@ -750,13 +750,13 @@
     }
 
     /**
-     * Assembles message header.  
+     * Assembles message header.
      * @access private
      * @return string
      */
     function CreateHeader() {
         $result = "";
-        
+
         // Set the boundaries
         $uniq_id = md5(uniqid(time()));
         $this->boundary[1] = "b1_" . $uniq_id;
@@ -767,7 +767,7 @@
             $result .= $this->HeaderLine("Return-Path", trim($this->From));
         else
             $result .= $this->HeaderLine("Return-Path", trim($this->Sender));
-        
+
         // To be created automatically by mail()
         if($this->Mailer != "mail")
         {
@@ -782,7 +782,7 @@
         $from = array();
         $from[0][0] = trim($this->From);
         $from[0][1] = $this->FromName;
-        $result .= $this->AddrAppend("From", $from); 
+        $result .= $this->AddrAppend("From", $from);
 
         // sendmail and mail() extract Bcc from the header before sending
         if((($this->Mailer == "sendmail") || ($this->Mailer == "mail")) && (count($this->bcc) > 0))
@@ -797,17 +797,17 @@
 
         $result .= sprintf("Message-ID: <%s@%s>%s", $uniq_id, $this->ServerHostname(), $this->LE);
         $result .= $this->HeaderLine("X-Priority", $this->Priority);
-        
+
         if($this->ConfirmReadingTo != "")
         {
-            $result .= $this->HeaderLine("Disposition-Notification-To", 
+            $result .= $this->HeaderLine("Disposition-Notification-To",
                        "<" . trim($this->ConfirmReadingTo) . ">");
         }
 
         // Add custom headers
         for($index = 0; $index < count($this->CustomHeader); $index++)
         {
-            $result .= $this->HeaderLine(trim($this->CustomHeader[$index][0]), 
+            $result .= $this->HeaderLine(trim($this->CustomHeader[$index][0]),
                        $this->EncodeHeader(trim($this->CustomHeader[$index][1])));
         }
         $result .= $this->HeaderLine("MIME-Version", "1.0");
@@ -824,8 +824,8 @@
             case "alt_attachments":
                 if($this->InlineImageExists())
                 {
-                    $result .= sprintf("Content-Type: %s;%s\ttype=\"text/html\";%s\tboundary=\"%s\"%s", 
-                                    "multipart/related", $this->LE, $this->LE, 
+                    $result .= sprintf("Content-Type: %s;%s\ttype=\"text/html\";%s\tboundary=\"%s\"%s",
+                                    "multipart/related", $this->LE, $this->LE,
                                     $this->boundary[1], $this->LE);
                 }
                 else
@@ -859,16 +859,16 @@
         switch($this->message_type)
         {
             case "alt":
-                $result .= $this->GetBoundary($this->boundary[1], "", 
+                $result .= $this->GetBoundary($this->boundary[1], "",
                                               "text/plain", "");
                 $result .= $this->EncodeString($this->AltBody, $this->Encoding);
                 $result .= $this->LE.$this->LE;
-                $result .= $this->GetBoundary($this->boundary[1], "", 
+                $result .= $this->GetBoundary($this->boundary[1], "",
                                               "text/html", "");
-                
+
                 $result .= $this->EncodeString($this->Body, $this->Encoding);
                 $result .= $this->LE.$this->LE;
-    
+
                 $result .= $this->EndBoundary($this->boundary[1]);
                 break;
             case "plain":
@@ -878,32 +878,32 @@
                 $result .= $this->GetBoundary($this->boundary[1], "", "", "");
                 $result .= $this->EncodeString($this->Body, $this->Encoding);
                 $result .= $this->LE;
-     
+
                 $result .= $this->AttachAll();
                 break;
             case "alt_attachments":
                 $result .= sprintf("--%s%s", $this->boundary[1], $this->LE);
                 $result .= sprintf("Content-Type: %s;%s" .
                                    "\tboundary=\"%s\"%s",
-                                   "multipart/alternative", $this->LE, 
+                                   "multipart/alternative", $this->LE,
                                    $this->boundary[2], $this->LE.$this->LE);
-    
+
                 // Create text body
-                $result .= $this->GetBoundary($this->boundary[2], "", 
+                $result .= $this->GetBoundary($this->boundary[2], "",
                                               "text/plain", "") . $this->LE;
 
                 $result .= $this->EncodeString($this->AltBody, $this->Encoding);
                 $result .= $this->LE.$this->LE;
-    
+
                 // Create the HTML body
-                $result .= $this->GetBoundary($this->boundary[2], "", 
+                $result .= $this->GetBoundary($this->boundary[2], "",
                                               "text/html", "") . $this->LE;
-    
+
                 $result .= $this->EncodeString($this->Body, $this->Encoding);
                 $result .= $this->LE.$this->LE;
 
                 $result .= $this->EndBoundary($this->boundary[2]);
-                
+
                 $result .= $this->AttachAll();
                 break;
         }
@@ -924,23 +924,23 @@
         if($encoding == "") { $encoding = $this->Encoding; }
 
         $result .= $this->TextLine("--" . $boundary);
-        $result .= sprintf("Content-Type: %s; charset = \"%s\"", 
+        $result .= sprintf("Content-Type: %s; charset = \"%s\"",
                             $contentType, $charSet);
         $result .= $this->LE;
         $result .= $this->HeaderLine("Content-Transfer-Encoding", $encoding);
         $result .= $this->LE;
-       
+
         return $result;
     }
-    
+
     /**
      * Returns the end of a message boundary.
      * @access private
      */
     function EndBoundary($boundary) {
-        return $this->LE . "--" . $boundary . "--" . $this->LE; 
+        return $this->LE . "--" . $boundary . "--" . $this->LE;
     }
-    
+
     /**
      * Sets the message type.
      * @access private
@@ -992,7 +992,7 @@
      * @param string $type File extension (MIME) type.
      * @return bool
      */
-    function AddAttachment($path, $name = "", $encoding = "base64", 
+    function AddAttachment($path, $name = "", $encoding = "base64",
                            $type = "application/octet-stream") {
         if(!@is_file($path))
         {
@@ -1043,7 +1043,7 @@
             $type        = $this->attachment[$i][4];
             $disposition = $this->attachment[$i][6];
             $cid         = $this->attachment[$i][7];
-            
+
             $mime[] = sprintf("--%s%s", $this->boundary[1], $this->LE);
             $mime[] = sprintf("Content-Type: %s; name=\"%s\"%s", $type, $name, $this->LE);
             $mime[] = sprintf("Content-Transfer-Encoding: %s%s", $encoding, $this->LE);
@@ -1051,7 +1051,7 @@
             if($disposition == "inline")
                 $mime[] = sprintf("Content-ID: <%s>%s", $cid, $this->LE);
 
-            $mime[] = sprintf("Content-Disposition: %s; filename=\"%s\"%s", 
+            $mime[] = sprintf("Content-Disposition: %s; filename=\"%s\"%s",
                               $disposition, $name, $this->LE.$this->LE);
 
             // Encode as string attachment
@@ -1063,7 +1063,7 @@
             }
             else
             {
-                $mime[] = $this->EncodeFile($path, $encoding);                
+                $mime[] = $this->EncodeFile($path, $encoding);
                 if($this->IsError()) { return ""; }
                 $mime[] = $this->LE.$this->LE;
             }
@@ -1073,7 +1073,7 @@
 
         return join("", $mime);
     }
-    
+
     /**
      * Encodes attachment in requested format.  Returns an
      * empty string on failure.
@@ -1129,13 +1129,13 @@
     }
 
     /**
-     * Encode a header string to best of Q, B, quoted or none.  
+     * Encode a header string to best of Q, B, quoted or none.
      * @access private
      * @return string
      */
     function EncodeHeader ($str, $position = 'text') {
       $x = 0;
-      
+
       switch (strtolower($position)) {
         case 'phrase':
           if (!preg_match('/[\200-\377]/', $str)) {
@@ -1177,12 +1177,12 @@
 
       $encoded = preg_replace('/^(.*)$/m', " =?".$this->CharSet."?$encoding?\\1?=", $encoded);
       $encoded = trim(str_replace("\n", $this->LE, $encoded));
-      
+
       return $encoded;
     }
-    
+
     /**
-     * Encode string to quoted-printable.  
+     * Encode string to quoted-printable.
      * @access private
      * @return string
      */
@@ -1205,7 +1205,7 @@
     }
 
     /**
-     * Encode string to q encoding.  
+     * Encode string to q encoding.
      * @access private
      * @return string
      */
@@ -1226,7 +1226,7 @@
                   "'='.sprintf('%02X', ord('\\1'))", $encoded);
             break;
         }
-        
+
         // Replace every spaces to _ (more readable than =20)
         $encoded = str_replace(" ", "_", $encoded);
 
@@ -1243,7 +1243,7 @@
      * @param string $type File extension (MIME) type.
      * @return void
      */
-    function AddStringAttachment($string, $filename, $encoding = "base64", 
+    function AddStringAttachment($string, $filename, $encoding = "base64",
                                  $type = "application/octet-stream") {
         // Append to $attachment array
         $cur = count($this->attachment);
@@ -1256,23 +1256,23 @@
         $this->attachment[$cur][6] = "attachment";
         $this->attachment[$cur][7] = 0;
     }
-    
+
     /**
-     * Adds an embedded attachment.  This can include images, sounds, and 
-     * just about any other document.  Make sure to set the $type to an 
-     * image type.  For JPEG images use "image/jpeg" and for GIF images 
+     * Adds an embedded attachment.  This can include images, sounds, and
+     * just about any other document.  Make sure to set the $type to an
+     * image type.  For JPEG images use "image/jpeg" and for GIF images
      * use "image/gif".
      * @param string $path Path to the attachment.
-     * @param string $cid Content ID of the attachment.  Use this to identify 
+     * @param string $cid Content ID of the attachment.  Use this to identify
      *        the Id for accessing the image in an HTML form.
      * @param string $name Overrides the attachment name.
      * @param string $encoding File encoding (see $Encoding).
-     * @param string $type File extension (MIME) type.  
+     * @param string $type File extension (MIME) type.
      * @return bool
      */
-    function AddEmbeddedImage($path, $cid, $name = "", $encoding = "base64", 
+    function AddEmbeddedImage($path, $cid, $name = "", $encoding = "base64",
                               $type = "application/octet-stream") {
-    
+
         if(!@is_file($path))
         {
             $this->SetError($this->Lang("file_access") . $path);
@@ -1293,10 +1293,10 @@
         $this->attachment[$cur][5] = false; // isStringAttachment
         $this->attachment[$cur][6] = "inline";
         $this->attachment[$cur][7] = $cid;
-    
+
         return true;
     }
-    
+
     /**
      * Returns true if an inline attachment is present.
      * @access private
@@ -1312,7 +1312,7 @@
                 break;
             }
         }
-        
+
         return $result;
     }
 
@@ -1397,7 +1397,7 @@
     }
 
     /**
-     * Returns the proper RFC 822 formatted date. 
+     * Returns the proper RFC 822 formatted date.
      * @access private
      * @return string
      */
@@ -1410,10 +1410,10 @@
 
         return $result;
     }
-    
+
     /**
-     * Returns the appropriate server variable.  Should work with both 
-     * PHP 4.1.0+ as well as older versions.  Returns an empty string 
+     * Returns the appropriate server variable.  Should work with both
+     * PHP 4.1.0+ as well as older versions.  Returns an empty string
      * if nothing is found.
      * @access private
      * @return mixed
@@ -1428,7 +1428,7 @@
             if(!isset($_SERVER["REMOTE_ADDR"]))
                 $_SERVER = $HTTP_ENV_VARS; // must be Apache
         }
-        
+
         if(isset($_SERVER[$varName]))
             return $_SERVER[$varName];
         else
@@ -1459,13 +1459,13 @@
     function Lang($key) {
         if(count($this->language) < 1)
             $this->SetLanguage("en"); // set the default language
-    
+
         if(isset($this->language[$key]))
             return $this->language[$key];
         else
             return "Language string failed to load: " . $key;
     }
-    
+
     /**
      * Returns true if an error occurred.
      * @return bool
@@ -1475,7 +1475,7 @@
     }
 
     /**
-     * Changes every end of line from CR or LF to CRLF.  
+     * Changes every end of line from CR or LF to CRLF.
      * @access private
      * @return string
      */
@@ -1487,7 +1487,7 @@
     }
 
     /**
-     * Adds a custom header. 
+     * Adds a custom header.
      * @return void
      */
     function AddCustomHeader($custom_header) {
diff -x .svn -aruN 2.2.2.src/wp-includes/class-pop3.php 2.5.src/wp-includes/class-pop3.php
--- 2.2.2.src/wp-includes/class-pop3.php	2007-02-25 12:19:21.000000000 -0600
+++ 2.5.src/wp-includes/class-pop3.php	2007-12-20 16:28:54.000000000 -0600
@@ -1,20 +1,21 @@
-<?php 
-
-   /**
-    * mail_fetch/setup.php
-    *
-    * Copyright (c) 1999-2006 The SquirrelMail Project Team
-    *
-    * Copyright (c) 1999 CDI (cdi@thewebmasters.net) All Rights Reserved
-    * Modified by Philippe Mingo 2001 mingo@rotedic.com
-    * An RFC 1939 compliant wrapper class for the POP3 protocol.
-    *
-    * Licensed under the GNU GPL. For full terms see the file COPYING.
-    *
-    * pop3 class
-    *
-    * $Id: class-pop3.php 4945 2007-02-25 18:19:21Z ryan $
-    */
+<?php
+/**
+ * mail_fetch/setup.php
+ *
+ * @package SquirrelMail
+ *
+ * @copyright (c) 1999-2006 The SquirrelMail Project Team
+ *
+ * @copyright (c) 1999 CDI (cdi@thewebmasters.net) All Rights Reserved
+ * Modified by Philippe Mingo 2001 mingo@rotedic.com
+ * An RFC 1939 compliant wrapper class for the POP3 protocol.
+ *
+ * Licensed under the GNU GPL. For full terms see the file COPYING.
+ *
+ * pop3 class
+ *
+ * $Id: class-pop3.php 6440 2007-12-20 22:28:54Z westi $
+ */
 
 class POP3 {
     var $ERROR      = '';       //  Error string.
@@ -57,14 +58,14 @@
             settype($timeout,"integer");
             $this->TIMEOUT = $timeout;
             if (!ini_get('safe_mode'))
-            set_time_limit($timeout);
+                set_time_limit($timeout);
         }
         return true;
     }
 
     function update_timer () {
         if (!ini_get('safe_mode'))
-        set_time_limit($this->TIMEOUT);
+            set_time_limit($this->TIMEOUT);
         return true;
     }
 
@@ -74,12 +75,12 @@
 
         // If MAILSERVER is set, override $server with it's value
 
-        if (!isset($port) || !$port) {$port = 110;}
+	if (!isset($port) || !$port) {$port = 110;}
         if(!empty($this->MAILSERVER))
             $server = $this->MAILSERVER;
 
         if(empty($server)){
-            $this->ERROR = _("POP3 connect:") . ' ' . _("No server specified");
+            $this->ERROR = "POP3 connect: " . _("No server specified");
             unset($this->FP);
             return false;
         }
@@ -87,7 +88,7 @@
         $fp = @fsockopen("$server", $port, $errno, $errstr);
 
         if(!$fp) {
-            $this->ERROR = _("POP3 connect:") . ' ' . _("Error ") . "[$errno] [$errstr]";
+            $this->ERROR = "POP3 connect: " . _("Error ") . "[$errno] [$errstr]";
             unset($this->FP);
             return false;
         }
@@ -99,7 +100,7 @@
         if($this->DEBUG)
             error_log("POP3 SEND [connect: $server] GOT [$reply]",0);
         if(!$this->is_ok($reply)) {
-            $this->ERROR = _("POP3 connect:") . ' ' . _("Error ") . "[$reply]";
+            $this->ERROR = "POP3 connect: " . _("Error ") . "[$reply]";
             unset($this->FP);
             return false;
         }
@@ -112,15 +113,15 @@
         // Sends the USER command, returns true or false
 
         if( empty($user) ) {
-            $this->ERROR = _("POP3 user:") . ' ' . _("no login ID submitted");
+            $this->ERROR = "POP3 user: " . _("no login ID submitted");
             return false;
         } elseif(!isset($this->FP)) {
-            $this->ERROR = _("POP3 user:") . ' ' . _("connection not established");
+            $this->ERROR = "POP3 user: " . _("connection not established");
             return false;
         } else {
             $reply = $this->send_cmd("USER $user");
             if(!$this->is_ok($reply)) {
-                $this->ERROR = _("POP3 user:") . ' ' . _("Error ") . "[$reply]";
+                $this->ERROR = "POP3 user: " . _("Error ") . "[$reply]";
                 return false;
             } else
                 return true;
@@ -132,15 +133,15 @@
         // returns false (undef) on Auth failure
 
         if(empty($pass)) {
-            $this->ERROR = _("POP3 pass:") . ' ' . _("No password submitted");
+            $this->ERROR = "POP3 pass: " . _("No password submitted");
             return false;
         } elseif(!isset($this->FP)) {
-            $this->ERROR = _("POP3 pass:") . ' ' . _("connection not established");
+            $this->ERROR = "POP3 pass: " . _("connection not established");
             return false;
         } else {
             $reply = $this->send_cmd("PASS $pass");
             if(!$this->is_ok($reply)) {
-                $this->ERROR = _("POP3 pass:") . ' ' . _("Authentication failed ") . "[$reply]";
+                $this->ERROR = "POP3 pass: " . _("Authentication failed") . " [$reply]";
                 $this->quit();
                 return false;
             } else {
@@ -159,21 +160,21 @@
         //  (apop is optional per rfc1939)
 
         if(!isset($this->FP)) {
-            $this->ERROR = _("POP3 apop:") . ' ' . _("No connection to server");
+            $this->ERROR = "POP3 apop: " . _("No connection to server");
             return false;
         } elseif(!$this->ALLOWAPOP) {
             $retVal = $this->login($login,$pass);
             return $retVal;
         } elseif(empty($login)) {
-            $this->ERROR = _("POP3 apop:") . ' ' . _("No login ID submitted");
+            $this->ERROR = "POP3 apop: " . _("No login ID submitted");
             return false;
         } elseif(empty($pass)) {
-            $this->ERROR = _("POP3 apop:") . ' ' . _("No password submitted");
+            $this->ERROR = "POP3 apop: " . _("No password submitted");
             return false;
         } else {
             $banner = $this->BANNER;
             if( (!$banner) or (empty($banner)) ) {
-                $this->ERROR = _("POP3 apop:") . ' ' . _("No server banner") . ' - ' . _("abort");
+                $this->ERROR = "POP3 apop: " . _("No server banner") . ' - ' . _("abort");
                 $retVal = $this->login($login,$pass);
                 return $retVal;
             } else {
@@ -183,7 +184,7 @@
                 $cmd = "APOP $login $APOPString";
                 $reply = $this->send_cmd($cmd);
                 if(!$this->is_ok($reply)) {
-                    $this->ERROR = _("POP3 apop:") . ' ' . _("apop authentication failed") . ' - ' . _("abort");
+                    $this->ERROR = "POP3 apop: " . _("apop authentication failed") . ' - ' . _("abort");
                     $retVal = $this->login($login,$pass);
                     return $retVal;
                 } else {
@@ -202,7 +203,7 @@
         // the number of messages.)
 
         if( !isset($this->FP) ) {
-            $this->ERROR = _("POP3 login:") . ' ' . _("No connection to server");
+            $this->ERROR = "POP3 login: " . _("No connection to server");
             return false;
         } else {
             $fp = $this->FP;
@@ -227,7 +228,7 @@
         //  only the header information, and none of the body.
 
         if(!isset($this->FP)) {
-            $this->ERROR = _("POP3 top:") . ' ' . _("No connection to server");
+            $this->ERROR = "POP3 top: " . _("No connection to server");
             return false;
         }
         $this->update_timer();
@@ -243,7 +244,7 @@
         }
         if(!$this->is_ok($reply))
         {
-            $this->ERROR = _("POP3 top:") . ' ' . _("Error ") . "[$reply]";
+            $this->ERROR = "POP3 top: " . _("Error ") . "[$reply]";
             return false;
         }
 
@@ -269,7 +270,7 @@
 
         if(!isset($this->FP))
         {
-            $this->ERROR = _("POP3 pop_list:") . ' ' . _("No connection to server");
+            $this->ERROR = "POP3 pop_list: " . _("No connection to server");
             return false;
         }
         $fp = $this->FP;
@@ -297,7 +298,7 @@
             }
             if(!$this->is_ok($reply))
             {
-                $this->ERROR = _("POP3 pop_list:") . ' ' . _("Error ") . "[$reply]";
+                $this->ERROR = "POP3 pop_list: " . _("Error ") . "[$reply]";
                 return false;
             }
             list($junk,$num,$size) = preg_split('/\s+/',$reply);
@@ -308,7 +309,7 @@
         if(!$this->is_ok($reply))
         {
             $reply = $this->strip_clf($reply);
-            $this->ERROR = _("POP3 pop_list:") . ' ' . _("Error ") .  "[$reply]";
+            $this->ERROR = "POP3 pop_list: " . _("Error ") .  "[$reply]";
             return false;
         }
         $MsgArray = array();
@@ -320,7 +321,7 @@
             $line = $this->strip_clf($line);
             if(ereg("^\.",$line))
             {
-                $this->ERROR = _("POP3 pop_list:") . ' ' . _("Premature end of list");
+                $this->ERROR = "POP3 pop_list: " . _("Premature end of list");
                 return false;
             }
             list($thisMsg,$msgSize) = preg_split('/\s+/',$line);
@@ -343,7 +344,7 @@
 
         if(!isset($this->FP))
         {
-            $this->ERROR = _("POP3 get:") . ' ' . _("No connection to server");
+            $this->ERROR = "POP3 get: " . _("No connection to server");
             return false;
         }
 
@@ -356,25 +357,21 @@
 
         if(!$this->is_ok($reply))
         {
-            $this->ERROR = _("POP3 get:") . ' ' . _("Error ") . "[$reply]";
+            $this->ERROR = "POP3 get: " . _("Error ") . "[$reply]";
             return false;
         }
 
         $count = 0;
         $MsgArray = array();
 
-        $line = "";
+        $line = fgets($fp,$buffer);
         while ( !ereg("^\.\r\n",$line))
         {
-            $line = fgets($fp,$buffer);
-            if (preg_match("/^\s+/", $line) && $count > 0) {
-                $MsgArray[$count-1] .= $line;
-                continue;
-            }
-            if(empty($line))    { break; }
-
+            if ( $line{0} == '.' ) { $line = substr($line,1); }
             $MsgArray[$count] = $line;
             $count++;
+            $line = fgets($fp,$buffer);
+            if(empty($line))    { break; }
         }
         return $MsgArray;
     }
@@ -387,14 +384,14 @@
         $last = -1;
         if(!isset($this->FP))
         {
-            $this->ERROR = _("POP3 last:") . ' ' . _("No connection to server");
+            $this->ERROR = "POP3 last: " . _("No connection to server");
             return $last;
         }
 
         $reply = $this->send_cmd("STAT");
         if(!$this->is_ok($reply))
         {
-            $this->ERROR = _("POP3 last:") . ' ' . _("Error ") . "[$reply]";
+            $this->ERROR = "POP3 last: " . _("Error ") . "[$reply]";
             return $last;
         }
 
@@ -417,7 +414,7 @@
 
         if(!isset($this->FP))
         {
-            $this->ERROR = _("POP3 reset:") . ' ' . _("No connection to server");
+            $this->ERROR = "POP3 reset: " . _("No connection to server");
             return false;
         }
         $reply = $this->send_cmd("RSET");
@@ -427,7 +424,7 @@
             //  response - if it ever does, something truely
             //  wild is going on.
 
-            $this->ERROR = _("POP3 reset:") . ' ' . _("Error ") . "[$reply]";
+            $this->ERROR = "POP3 reset: " . _("Error ") . "[$reply]";
             @error_log("POP3 reset: ERROR [$reply]",0);
         }
         $this->quit();
@@ -451,13 +448,13 @@
 
         if(!isset($this->FP))
         {
-            $this->ERROR = _("POP3 send_cmd:") . ' ' . _("No connection to server");
+            $this->ERROR = "POP3 send_cmd: " . _("No connection to server");
             return false;
         }
 
         if(empty($cmd))
         {
-            $this->ERROR = _("POP3 send_cmd:") . ' ' . _("Empty command string");
+            $this->ERROR = "POP3 send_cmd: " . _("Empty command string");
             return "";
         }
 
@@ -477,7 +474,7 @@
 
         if(!isset($this->FP))
         {
-            $this->ERROR = _("POP3 quit:") . ' ' . _("connection does not exist");
+            $this->ERROR = "POP3 quit: " . _("connection does not exist");
             return false;
         }
         $fp = $this->FP;
@@ -514,7 +511,7 @@
         //  Array element 0 will contain the total number of msgs
 
         if(!isset($this->FP)) {
-            $this->ERROR = _("POP3 uidl:") . ' ' . _("No connection to server");
+            $this->ERROR = "POP3 uidl: " . _("No connection to server");
             return false;
         }
 
@@ -526,7 +523,7 @@
             $reply = $this->send_cmd($cmd);
             if(!$this->is_ok($reply))
             {
-                $this->ERROR = _("POP3 uidl:") . ' ' . _("Error ") . "[$reply]";
+                $this->ERROR = "POP3 uidl: " . _("Error ") . "[$reply]";
                 return false;
             }
             list ($ok,$num,$myUidl) = preg_split('/\s+/',$reply);
@@ -549,7 +546,7 @@
             if($this->DEBUG) { @error_log("POP3 SEND [$cmd] GOT [$reply]",0); }
             if(!$this->is_ok($reply))
             {
-                $this->ERROR = _("POP3 uidl:") . ' ' . _("Error ") . "[$reply]";
+                $this->ERROR = "POP3 uidl: " . _("Error ") . "[$reply]";
                 return false;
             }
 
@@ -582,18 +579,18 @@
 
         if(!isset($this->FP))
         {
-            $this->ERROR = _("POP3 delete:") . ' ' . _("No connection to server");
+            $this->ERROR = "POP3 delete: " . _("No connection to server");
             return false;
         }
         if(empty($msgNum))
         {
-            $this->ERROR = _("POP3 delete:") . ' ' . _("No msg number submitted");
+            $this->ERROR = "POP3 delete: " . _("No msg number submitted");
             return false;
         }
         $reply = $this->send_cmd("DELE $msgNum");
         if(!$this->is_ok($reply))
         {
-            $this->ERROR = _("POP3 delete:") . ' ' . _("Command failed ") . "[$reply]";
+            $this->ERROR = "POP3 delete: " . _("Command failed ") . "[$reply]";
             return false;
         }
         return true;
@@ -630,8 +627,8 @@
         $length = strlen($server_text);
         for($count =0; $count < $length; $count++)
         {
-            $digit = substr($server_text, $count, 1);
-            if (!empty($digit)) {
+            $digit = substr($server_text,$count,1);
+            if(!empty($digit))             {
                 if( (!$outside) && ($digit != '<') && ($digit != '>') )
                 {
                     $banner .= $digit;
@@ -651,5 +648,4 @@
     }
 
 }   // End class
-
 ?>
diff -x .svn -aruN 2.2.2.src/wp-includes/class-smtp.php 2.5.src/wp-includes/class-smtp.php
--- 2.2.2.src/wp-includes/class-smtp.php	2007-05-04 16:48:43.000000000 -0500
+++ 2.5.src/wp-includes/class-smtp.php	2007-06-13 21:25:30.000000000 -0500
@@ -28,13 +28,13 @@
      *  @var int
      */
     var $SMTP_PORT = 25;
-    
+
     /**
      *  SMTP reply line ending
      *  @var string
      */
     var $CRLF = "\r\n";
-    
+
     /**
      *  Sets whether debugging is turned on
      *  @var bool
@@ -508,7 +508,7 @@
         }
 
         $this->helo_rply = $rply;
-        
+
         return true;
     }
 
diff -x .svn -aruN 2.2.2.src/wp-includes/class-snoopy.php 2.5.src/wp-includes/class-snoopy.php
--- 2.2.2.src/wp-includes/class-snoopy.php	2006-08-04 23:18:09.000000000 -0500
+++ 2.5.src/wp-includes/class-snoopy.php	2007-12-20 16:28:54.000000000 -0600
@@ -1,5 +1,13 @@
 <?php
-
+/**
+ * Snoopy - the PHP net client
+ * @author Monte Ohrt <monte@ispi.net>
+ * @copyright 1999-2000 ispi, all rights reserved
+ * @version 1.01
+ * @license GNU Lesser GPL
+ * @link http://snoopy.sourceforge.net/
+ * @package Snoopy
+ */
 /*************************************************
 
 Snoopy - the PHP net client
@@ -796,7 +804,7 @@
 			$headers .= "User-Agent: ".$this->agent."\r\n";
 		if(!empty($this->host) && !isset($this->rawheaders['Host'])) {
 			$headers .= "Host: ".$this->host;
-			if(!empty($this->port))
+			if(!empty($this->port) && $this->port != 80)
 				$headers .= ":".$this->port;
 			$headers .= "\r\n";
 		}
@@ -816,7 +824,7 @@
 				$cookie_headers .= $cookieKey."=".urlencode($cookieVal)."; ";
 				}
 				$headers .= substr($cookie_headers,0,-2) . "\r\n";
-			} 
+			}
 		}
 		if(!empty($this->rawheaders))
 		{
diff -x .svn -aruN 2.2.2.src/wp-includes/classes.php 2.5.src/wp-includes/classes.php
--- 2.2.2.src/wp-includes/classes.php	2007-06-15 12:45:21.000000000 -0500
+++ 2.5.src/wp-includes/classes.php	2008-03-27 15:10:29.000000000 -0500
@@ -1,9 +1,9 @@
 <?php
 
 class WP {
-	var $public_query_vars = array('m', 'p', 'posts', 'w', 'cat', 'withcomments', 'withoutcomments', 's', 'search', 'exact', 'sentence', 'debug', 'calendar', 'page', 'paged', 'more', 'tb', 'pb', 'author', 'order', 'orderby', 'year', 'monthnum', 'day', 'hour', 'minute', 'second', 'name', 'category_name', 'feed', 'author_name', 'static', 'pagename', 'page_id', 'error', 'comments_popup', 'attachment', 'attachment_id', 'subpost', 'subpost_id', 'preview', 'robots');
+	var $public_query_vars = array('m', 'p', 'posts', 'w', 'cat', 'withcomments', 'withoutcomments', 's', 'search', 'exact', 'sentence', 'debug', 'calendar', 'page', 'paged', 'more', 'tb', 'pb', 'author', 'order', 'orderby', 'year', 'monthnum', 'day', 'hour', 'minute', 'second', 'name', 'category_name', 'tag', 'feed', 'author_name', 'static', 'pagename', 'page_id', 'error', 'comments_popup', 'attachment', 'attachment_id', 'subpost', 'subpost_id', 'preview', 'robots', 'taxonomy', 'term');
 
-	var $private_query_vars = array('offset', 'posts_per_page', 'posts_per_archive_page', 'what_to_show', 'showposts', 'nopaging', 'post_type');
+	var $private_query_vars = array('offset', 'posts_per_page', 'posts_per_archive_page', 'what_to_show', 'showposts', 'nopaging', 'post_type', 'post_status', 'category__in', 'category__not_in', 'category__and', 'tag__in', 'tag__not_in', 'tag__and', 'tag_slug__in', 'tag_slug__and', 'tag_id', 'post_mime_type', 'perm');
 	var $extra_query_vars = array();
 
 	var $query_vars;
@@ -14,7 +14,12 @@
 	var $did_permalink = false;
 
 	function add_query_var($qv) {
-		$this->public_query_vars[] = $qv;
+		if ( !in_array($qv, $this->public_query_vars) )
+			$this->public_query_vars[] = $qv;
+	}
+
+	function set_query_var($key, $value) {
+		$this->query_vars[$key] = $value;
 	}
 
 	function parse_request($extra_query_vars = '') {
@@ -67,7 +72,6 @@
 			$pathinfo = trim($pathinfo, '/');
 			$self = trim($self, '/');
 			$self = preg_replace("|^$home_path|", '', $self);
-			$self = str_replace($home_path, '', $self);
 			$self = trim($self, '/');
 
 			// The requested permalink is in $pathinfo for path info requests and
@@ -176,19 +180,19 @@
 			status_header( 404 );
 			if ( !is_user_logged_in() )
 				nocache_headers();
-			@header('Content-type: ' . get_option('html_type') . '; charset=' . get_option('blog_charset'));
+			@header('Content-Type: ' . get_option('html_type') . '; charset=' . get_option('blog_charset'));
 		} else if ( empty($this->query_vars['feed']) ) {
-			@header('Content-type: ' . get_option('html_type') . '; charset=' . get_option('blog_charset'));
+			@header('Content-Type: ' . get_option('html_type') . '; charset=' . get_option('blog_charset'));
 		} else {
 			// We're showing a feed, so WP is indeed the only thing that last changed
-			if ( $this->query_vars['withcomments']
-				|| ( !$this->query_vars['withoutcomments']
-					&& ( $this->query_vars['p']
-						|| $this->query_vars['name']
-						|| $this->query_vars['page_id']
-						|| $this->query_vars['pagename']
-						|| $this->query_vars['attachment']
-						|| $this->query_vars['attachment_id']
+			if ( !empty($this->query_vars['withcomments'])
+				|| ( empty($this->query_vars['withoutcomments'])
+					&& ( !empty($this->query_vars['p'])
+						|| !empty($this->query_vars['name'])
+						|| !empty($this->query_vars['page_id'])
+						|| !empty($this->query_vars['pagename'])
+						|| !empty($this->query_vars['attachment'])
+						|| !empty($this->query_vars['attachment_id'])
 					)
 				)
 			)
@@ -204,7 +208,7 @@
 				$client_etag = stripslashes(stripslashes($_SERVER['HTTP_IF_NONE_MATCH']));
 			else $client_etag = false;
 
-			$client_last_modified = trim( $_SERVER['HTTP_IF_MODIFIED_SINCE']);
+			$client_last_modified = empty($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? '' : trim($_SERVER['HTTP_IF_MODIFIED_SINCE']);
 			// If string is empty, return 0. If not, attempt to parse into a timestamp
 			$client_modified_timestamp = $client_last_modified ? strtotime($client_last_modified) : 0;
 
@@ -234,8 +238,7 @@
 		}
 
 		// query_string filter deprecated.  Use request filter instead.
-		global $wp_filter;
-		if ( isset($wp_filter['query_string']) ) {  // Don't bother filtering and parsing if no plugins are hooked in.
+		if ( has_filter('query_string') ) {  // Don't bother filtering and parsing if no plugins are hooked in.
 			$this->query_string = apply_filters('query_string', $this->query_string);
 			parse_str($this->query_string, $this->query_vars);
 		}
@@ -383,9 +386,10 @@
 	return false;
 }
 
-
-// A class for displaying various tree-like structures. Extend the Walker class to use it, see examples at the bottom
-
+/*
+ * A class for displaying various tree-like structures.
+ * Extend the Walker class to use it, see examples at the bottom
+ */
 class Walker {
 	var $tree_type;
 	var $db_fields;
@@ -396,95 +400,131 @@
 	function start_el($output)  { return $output; }
 	function end_el($output)    { return $output; }
 
-	function walk($elements, $to_depth) {
-		$args = array_slice(func_get_args(), 2); $parents = array(); $depth = 1; $previous_element = ''; $output = '';
+	/*
+ 	 * display one element if the element doesn't have any children
+ 	 * otherwise, display the element and its children
+ 	 */
+	function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, $output ) {
 
-		//padding at the end
-		$last_element->post_parent = 0;
-		$last_element->post_id = 0;
-		$elements[] = $last_element;
+		if ( !$element)
+			return $output;
 
 		$id_field = $this->db_fields['id'];
 		$parent_field = $this->db_fields['parent'];
 
-		$flat = ($to_depth == -1) ? true : false;
+		//display this element
+		$cb_args = array_merge( array($output, $element, $depth), $args);
+		$output = call_user_func_array(array(&$this, 'start_el'), $cb_args);
 
-		foreach ( $elements as $element ) {
-			// If flat, start and end the element and skip the level checks.
-			if ( $flat) {
-				// Start the element.
-				if ( isset($element->$id_field) && $element->$id_field != 0 ) {
-					$cb_args = array_merge( array($output, $element, $depth - 1), $args);
-					$output = call_user_func_array(array(&$this, 'start_el'), $cb_args);
-				}
+		if ( $max_depth == 0 ||
+		     ($max_depth != 0 &&  $max_depth > $depth+1 )) { //whether to descend
 
-				// End the element.
-				if ( isset($element->$id_field) && $element->$id_field != 0 ) {
-					$cb_args = array_merge( array($output, $element, $depth - 1), $args);
-					$output = call_user_func_array(array(&$this, 'end_el'), $cb_args);
-				}
+			for ( $i = 0; $i < sizeof( $children_elements ); $i++ ) {
 
-				continue;
-			}
+				$child = $children_elements[$i];
+				if ( $child->$parent_field == $element->$id_field ) {
 
-			// Walk the tree.
-			if ( !empty($previous_element) && ($element->$parent_field == $previous_element->$id_field) ) {
-				// Previous element is my parent. Descend a level.
-				array_unshift($parents, $previous_element);
-				if ( !$to_depth || ($depth < $to_depth) ) { //only descend if we're below $to_depth
-					$cb_args = array_merge( array($output, $depth), $args);
-					$output = call_user_func_array(array(&$this, 'start_lvl'), $cb_args);
-				} else if ( $to_depth && $depth == $to_depth  ) {  // If we've reached depth, end the previous element.
-					$cb_args = array_merge( array($output, $previous_element, $depth), $args);
-					$output = call_user_func_array(array(&$this, 'end_el'), $cb_args);
-				}
-				$depth++; //always do this so when we start the element further down, we know where we are
-			} else if ( $element->$parent_field == $previous_element->$parent_field) {
-				// On the same level as previous element.
-				if ( !$to_depth || ($depth <= $to_depth) ) {
-					$cb_args = array_merge( array($output, $previous_element, $depth - 1), $args);
-					$output = call_user_func_array(array(&$this, 'end_el'), $cb_args);
-				}
-			} else if ( $depth > 1 ) {
-				// Ascend one or more levels.
-				if ( !$to_depth || ($depth <= $to_depth) ) {
-					$cb_args = array_merge( array($output, $previous_element, $depth - 1), $args);
-					$output = call_user_func_array(array(&$this, 'end_el'), $cb_args);
-				}
-
-				while ( $parent = array_shift($parents) ) {
-					$depth--;
-					if ( !$to_depth || ($depth < $to_depth) ) {
+					if ( !isset($newlevel) ) {
+						$newlevel = true;
+						//start the child delimiter
 						$cb_args = array_merge( array($output, $depth), $args);
-						$output = call_user_func_array(array(&$this, 'end_lvl'), $cb_args);
-						$cb_args = array_merge( array($output, $parent, $depth - 1), $args);
-						$output = call_user_func_array(array(&$this, 'end_el'), $cb_args);
+						$output = call_user_func_array(array(&$this, 'start_lvl'), $cb_args);
 					}
-					if ( $element->$parent_field == $parents[0]->$id_field ) {
-						break;
-					}
-				}
-			} else if ( !empty($previous_element) ) {
-				// Close off previous element.
-				if ( !$to_depth || ($depth <= $to_depth) ) {
-					$cb_args = array_merge( array($output, $previous_element, $depth - 1), $args);
-					$output = call_user_func_array(array(&$this, 'end_el'), $cb_args);
-				}
-			}
 
-			// Start the element.
-			if ( !$to_depth || ($depth <= $to_depth) ) {
-				if ( $element->$id_field != 0 ) {
-					$cb_args = array_merge( array($output, $element, $depth - 1), $args);
-					$output = call_user_func_array(array(&$this, 'start_el'), $cb_args);
+					array_splice( $children_elements, $i, 1 );
+					$output = $this->display_element( $child, $children_elements, $max_depth, $depth + 1, $args, $output );
+					$i = -1;
 				}
 			}
+		}
 
-			$previous_element = $element;
+		if ( isset($newlevel) && $newlevel ){
+			//end the child delimiter
+			$cb_args = array_merge( array($output, $depth), $args);
+			$output = call_user_func_array(array(&$this, 'end_lvl'), $cb_args);
 		}
 
+		//end this element
+		$cb_args = array_merge( array($output, $element, $depth), $args);
+		$output = call_user_func_array(array(&$this, 'end_el'), $cb_args);
+
 		return $output;
 	}
+
+	/*
+ 	* displays array of elements hierarchically
+ 	* it is a generic function which does not assume any existing order of elements
+ 	* max_depth = -1 means flatly display every element
+ 	* max_depth = 0  means display all levels
+ 	* max_depth > 0  specifies the number of display levels.
+ 	*/
+	function walk( $elements, $max_depth) {
+
+		$args = array_slice(func_get_args(), 2);
+		$output = '';
+
+		if ($max_depth < -1) //invalid parameter
+			return $output;
+
+		if (empty($elements)) //nothing to walk
+			return $output;
+
+		$id_field = $this->db_fields['id'];
+		$parent_field = $this->db_fields['parent'];
+
+		// flat display
+		if ( -1 == $max_depth ) {
+			$empty_array = array();
+			foreach ( $elements as $e )
+				$output = $this->display_element( $e, $empty_array, 1, 0, $args, $output );
+			return $output;
+		}
+
+		/*
+		 * need to display in hierarchical order
+		 * splice elements into two buckets: those without parent and those with parent
+		 */
+		$top_level_elements = array();
+		$children_elements  = array();
+		foreach ( $elements as $e) {
+			if ( 0 == $e->$parent_field )
+				$top_level_elements[] = $e;
+			else
+				$children_elements[] = $e;
+		}
+
+		/*
+		 * none of the elements is top level
+		 * the first one must be root of the sub elements
+		 */
+		if ( !$top_level_elements ) {
+
+			$root = $children_elements[0];
+			for ( $i = 0; $i < sizeof( $children_elements ); $i++ ) {
+
+				$child = $children_elements[$i];
+				if ($root->$parent_field == $child->$parent_field ) {
+					$top_level_elements[] = $child;
+					array_splice( $children_elements, $i, 1 );
+					$i--;
+				}
+			}
+		}
+
+		foreach ( $top_level_elements as $e )
+			$output = $this->display_element( $e, $children_elements, $max_depth, 0, $args, $output );
+
+		/*
+		* if we are displaying all levels, and remaining children_elements is not empty,
+		* then we got orphans, which should be displayed regardless
+	 	*/
+		if ( ( $max_depth == 0 ) && sizeof( $children_elements ) > 0 ) {
+			$empty_array = array();
+			foreach ( $children_elements as $orphan_e )
+				$output = $this->display_element( $orphan_e, $empty_array, 1, 0, $args, $output );
+		 }
+		 return $output;
+	}
 }
 
 class Walker_Page extends Walker {
@@ -506,13 +546,20 @@
 	function start_el($output, $page, $depth, $current_page, $args) {
 		if ( $depth )
 			$indent = str_repeat("\t", $depth);
+		else
+			$indent = '';
+
 		extract($args, EXTR_SKIP);
-		$css_class = 'page_item';
-		$_current_page = get_page( $current_page );
-		if ( $page->ID == $current_page )
-			$css_class .= ' current_page_item';
-		elseif ( $_current_page && $page->ID == $_current_page->post_parent )
-			$css_class .= ' current_page_parent';
+		$css_class = 'page_item page-item-'.$page->ID;
+		if ( !empty($current_page) ) {
+			$_current_page = get_page( $current_page );
+			if ( in_array($page->ID, (array) $_current_page->ancestors) )
+				$css_class .= ' current_page_ancestor';
+			if ( $page->ID == $current_page )
+				$css_class .= ' current_page_item';
+			elseif ( $_current_page && $page->ID == $_current_page->post_parent )
+				$css_class .= ' current_page_parent';
+		}
 
 		$output .= $indent . '<li class="' . $css_class . '"><a href="' . get_page_link($page->ID) . '" title="' . attribute_escape(apply_filters('the_title', $page->post_title)) . '">' . apply_filters('the_title', $page->post_title) . '</a>';
 
@@ -557,7 +604,7 @@
 
 class Walker_Category extends Walker {
 	var $tree_type = 'category';
-	var $db_fields = array ('parent' => 'category_parent', 'id' => 'cat_ID'); //TODO: decouple this
+	var $db_fields = array ('parent' => 'parent', 'id' => 'term_id'); //TODO: decouple this
 
 	function start_lvl($output, $depth, $args) {
 		if ( 'list' != $args['style'] )
@@ -580,13 +627,13 @@
 	function start_el($output, $category, $depth, $args) {
 		extract($args);
 
-		$cat_name = attribute_escape( $category->cat_name);
+		$cat_name = attribute_escape( $category->name);
 		$cat_name = apply_filters( 'list_cats', $cat_name, $category );
-		$link = '<a href="' . get_category_link( $category->cat_ID ) . '" ';
-		if ( $use_desc_for_title == 0 || empty($category->category_description) )
+		$link = '<a href="' . get_category_link( $category->term_id ) . '" ';
+		if ( $use_desc_for_title == 0 || empty($category->description) )
 			$link .= 'title="' . sprintf(__( 'View all posts filed under %s' ), $cat_name) . '"';
 		else
-			$link .= 'title="' . attribute_escape( apply_filters( 'category_description', $category->category_description, $category )) . '"';
+			$link .= 'title="' . attribute_escape( apply_filters( 'category_description', $category->description, $category )) . '"';
 		$link .= '>';
 		$link .= $cat_name . '</a>';
 
@@ -596,7 +643,7 @@
 			if ( empty($feed_image) )
 				$link .= '(';
 
-			$link .= '<a href="' . get_category_rss_link( 0, $category->cat_ID, $category->category_nicename ) . '"';
+			$link .= '<a href="' . get_category_feed_link($category->term_id, $feed_type) . '"';
 
 			if ( empty($feed) )
 				$alt = ' alt="' . sprintf(__( 'Feed for all posts filed under %s' ), $cat_name ) . '"';
@@ -619,21 +666,23 @@
 		}
 
 		if ( isset($show_count) && $show_count )
-			$link .= ' (' . intval($category->category_count) . ')';
+			$link .= ' (' . intval($category->count) . ')';
 
 		if ( isset($show_date) && $show_date ) {
 			$link .= ' ' . gmdate('Y-m-d', $category->last_update_timestamp);
 		}
 
-		if ( $current_category )
+		if ( isset($current_category) && $current_category )
 			$_current_category = get_category( $current_category );
 
 		if ( 'list' == $args['style'] ) {
 			$output .= "\t<li";
-			if ( $current_category && ($category->cat_ID == $current_category) )
-				$output .=  ' class="current-cat"';
-			elseif ( $_current_category && ($category->cat_ID == $_current_category->category_parent) )
-				$output .=  ' class="current-cat-parent"';
+			$class = 'cat-item cat-item-'.$category->term_id;
+			if ( isset($current_category) && $current_category && ($category->term_id == $current_category) )
+				$class .=  ' current-cat';
+			elseif ( isset($_current_category) && $_current_category && ($category->term_id == $_current_category->parent) )
+				$class .=  ' current-cat-parent';
+			$output .=  ' class="'.$class.'"';
 			$output .= ">$link\n";
 		} else {
 			$output .= "\t$link<br />\n";
@@ -654,19 +703,19 @@
 
 class Walker_CategoryDropdown extends Walker {
 	var $tree_type = 'category';
-	var $db_fields = array ('parent' => 'category_parent', 'id' => 'cat_ID'); //TODO: decouple this
+	var $db_fields = array ('parent' => 'parent', 'id' => 'term_id'); //TODO: decouple this
 
 	function start_el($output, $category, $depth, $args) {
 		$pad = str_repeat('&nbsp;', $depth * 3);
 
-		$cat_name = apply_filters('list_cats', $category->cat_name, $category);
-		$output .= "\t<option value=\"".$category->cat_ID."\"";
-		if ( $category->cat_ID == $args['selected'] )
+		$cat_name = apply_filters('list_cats', $category->name, $category);
+		$output .= "\t<option value=\"".$category->term_id."\"";
+		if ( $category->term_id == $args['selected'] )
 			$output .= ' selected="selected"';
 		$output .= '>';
 		$output .= $pad.$cat_name;
 		if ( $args['show_count'] )
-			$output .= '&nbsp;&nbsp;('. $category->category_count .')';
+			$output .= '&nbsp;&nbsp;('. $category->count .')';
 		if ( $args['show_last_update'] ) {
 			$format = 'Y-m-d';
 			$output .= '&nbsp;&nbsp;' . gmdate($format, $category->last_update_timestamp);
@@ -687,16 +736,16 @@
 
 	// a WP_Error object can be passed in 'id' or 'data'
 	function add( $args = '' ) {
-		if ( is_array($args) )
-			$r = &$args;
-		else
-			parse_str($args, $r);
-
-		$defaults = array('what' => 'object', 'action' => false, 'id' => '0', 'old_id' => false,
-				'data' => '', 'supplemental' => array());
-
-		$r = array_merge($defaults, $r);
-		extract($r, EXTR_SKIP);
+		$defaults = array(
+			'what' => 'object', 'action' => false,
+			'id' => '0', 'old_id' => false,
+			'position' => 1, // -1 = top, 1 = bottom, html ID = after, -html ID = before
+			'data' => '', 'supplemental' => array()
+		);
+
+		$r = wp_parse_args( $args, $defaults );
+		extract( $r, EXTR_SKIP );
+		$position = preg_replace( '/[^a-z0-9:_-]/i', '', $position );
 
 		if ( is_wp_error($id) ) {
 			$data = $id;
@@ -704,23 +753,45 @@
 		}
 
 		$response = '';
-		if ( is_wp_error($data) )
-			foreach ( $data->get_error_codes() as $code )
+		if ( is_wp_error($data) ) {
+			foreach ( $data->get_error_codes() as $code ) {
 				$response .= "<wp_error code='$code'><![CDATA[" . $data->get_error_message($code) . "]]></wp_error>";
-		else
+				if ( !$error_data = $data->get_error_data($code) )
+					continue;
+				$class = '';
+				if ( is_object($error_data) ) {
+					$class = ' class="' . get_class($error_data) . '"';
+					$error_data = get_object_vars($error_data);
+				}
+
+				$response .= "<wp_error_data code='$code'$class>";
+
+				if ( is_scalar($error_data) ) {
+					$response .= "<![CDATA[$error_data]]>";
+				} elseif ( is_array($error_data) ) {
+					foreach ( $error_data as $k => $v )
+						$response .= "<$k><![CDATA[$v]]></$k>";
+				}
+
+				$response .= "</wp_error_data>";
+			}
+		} else {
 			$response = "<response_data><![CDATA[$data]]></response_data>";
+		}
 
 		$s = '';
-		if ( (array) $supplemental )
+		if ( (array) $supplemental ) {
 			foreach ( $supplemental as $k => $v )
 				$s .= "<$k><![CDATA[$v]]></$k>";
+			$s = "<supplemental>$s</supplemental>";
+		}
 
 		if ( false === $action )
 			$action = $_POST['action'];
 
 		$x = '';
 		$x .= "<response action='{$action}_$id'>"; // The action attribute in the xml output is formatted like a nonce action
-		$x .=	"<$what id='$id'" . ( false !== $old_id ? "old_id='$old_id'>" : '>' );
+		$x .=	"<$what id='$id' " . ( false === $old_id ? '' : "old_id='$old_id' " ) . "position='$position'>";
 		$x .=		$response;
 		$x .=		$s;
 		$x .=	"</$what>";
@@ -731,7 +802,7 @@
 	}
 
 	function send() {
-		header('Content-type: text/xml');
+		header('Content-Type: text/xml');
 		echo "<?xml version='1.0' standalone='yes'?><wp_ajax>";
 		foreach ( $this->responses as $response )
 			echo $response;
diff -x .svn -aruN 2.2.2.src/wp-includes/comment-template.php 2.5.src/wp-includes/comment-template.php
--- 2.2.2.src/wp-includes/comment-template.php	2007-06-15 12:45:21.000000000 -0500
+++ 2.5.src/wp-includes/comment-template.php	2008-02-13 00:39:45.000000000 -0600
@@ -1,8 +1,24 @@
 <?php
-/*
- * Comment template functions.
+/**
+ * Comment template functions
+ *
+ * These functions are meant to live inside of the WordPress loop.
+ *
+ * @package WordPress
+ * @subpackage Template
  */
 
+/**
+ * get_comment_author() - Retrieve the author of the current comment
+ *
+ * If the comment has an empty comment_author field, then 'Anonymous' person
+ * is assumed.
+ *
+ * @since 1.5
+ * @uses apply_filters() Calls 'get_comment_author' hook on the comment author
+ *
+ * @return string The comment author
+ */
 function get_comment_author() {
 	global $comment;
 	if ( empty($comment->comment_author) )
@@ -12,20 +28,62 @@
 	return apply_filters('get_comment_author', $author);
 }
 
+/**
+ * comment_author() - Displays the author of the current comment
+ *
+ * @since 0.71
+ * @uses apply_filters() Calls 'comment_author' on comment author before displaying
+ */
 function comment_author() {
 	$author = apply_filters('comment_author', get_comment_author() );
 	echo $author;
 }
 
+/**
+ * get_comment_author_email() - Retrieve the email of the author of the current comment
+ *
+ * @since 1.5
+ * @uses apply_filters() Calls the 'get_comment_author_email' hook on the comment author email
+ * @uses $comment
+ *
+ * @return string The current comment author's email
+ */
 function get_comment_author_email() {
 	global $comment;
 	return apply_filters('get_comment_author_email', $comment->comment_author_email);
 }
 
+/**
+ * comment_author_email() - Display the email of the author of the current global $comment
+ *
+ * Care should be taken to protect the email address and assure that email harvesters
+ * do not capture your commentors' email address. Most assume that their email address will
+ * not appear in raw form on the blog. Doing so will enable anyone, including those that
+ * people don't want to get the email address and use it for their own means good and bad.
+ *
+ * @since 0.71
+ * @uses apply_filters() Calls 'author_email' hook on the author email
+ */
 function comment_author_email() {
 	echo apply_filters('author_email', get_comment_author_email() );
 }
 
+/**
+ * comment_author_email_link() - Display the html email link to the author of the current comment
+ *
+ * Care should be taken to protect the email address and assure that email harvesters
+ * do not capture your commentors' email address. Most assume that their email address will
+ * not appear in raw form on the blog. Doing so will enable anyone, including those that
+ * people don't want to get the email address and use it for their own means good and bad.
+ *
+ * @since 0.71
+ * @uses apply_filters() Calls 'comment_email' hook for the display of the comment author's email
+ * @global object $comment The current Comment row object
+ *
+ * @param string $linktext The text to display instead of the comment author's email address
+ * @param string $before The text or HTML to display before the email link.
+ * @param string $after The text or HTML to display after the email link.
+ */
 function comment_author_email_link($linktext='', $before='', $after='') {
 	global $comment;
 	$email = apply_filters('comment_email', $comment->comment_author_email);
@@ -37,8 +95,16 @@
 	}
 }
 
+/**
+ * get_comment_author_link() - Retrieve the html link to the url of the author of the current comment
+ *
+ * @since 1.5
+ * @uses apply_filters() Calls 'get_comment_author_link' hook on the complete link HTML or author
+ *
+ * @return string Comment Author name or HTML link for author's URL
+ */
 function get_comment_author_link() {
-	global $comment;
+	/** @todo Only call these functions when they are needed. Include in if... else blocks */
 	$url    = get_comment_author_url();
 	$author = get_comment_author();
 
@@ -49,30 +115,82 @@
 	return apply_filters('get_comment_author_link', $return);
 }
 
+/**
+ * comment_author_link() - Display the html link to the url of the author of the current comment
+ *
+ * @since 0.71
+ * @see get_comment_author_link() Echos result
+ */
 function comment_author_link() {
 	echo get_comment_author_link();
 }
 
+/**
+ * get_comment_author_IP() - Retrieve the IP address of the author of the current comment
+ *
+ * @since 1.5
+ * @uses $comment
+ * @uses apply_filters()
+ *
+ * @return unknown
+ */
 function get_comment_author_IP() {
 	global $comment;
 	return apply_filters('get_comment_author_IP', $comment->comment_author_IP);
 }
 
+/**
+ * comment_author_IP() - Displays the IP address of the author of the current comment
+ *
+ * @since 0.71
+ * @see get_comment_author_IP() Echos Result
+ */
 function comment_author_IP() {
 	echo get_comment_author_IP();
 }
 
+/**
+ * get_comment_author_url() - Returns the url of the author of the current comment
+ *
+ * @since 1.5
+ * @uses apply_filters() Calls 'get_comment_author_url' hook on the comment author's URL
+ *
+ * @return string
+ */
 function get_comment_author_url() {
 	global $comment;
 	return apply_filters('get_comment_author_url', $comment->comment_author_url);
 }
 
+/**
+ * comment_author_url() - Display the url of the author of the current comment
+ *
+ * @since 0.71
+ * @uses apply_filters()
+ * @uses get_comment_author_url() Retrieves the comment author's URL
+ */
 function comment_author_url() {
 	echo apply_filters('comment_url', get_comment_author_url());
 }
 
+/**
+ * get_comment_author_url_link() - Retrieves the HTML link of the url of the author of the current comment
+ *
+ * $linktext parameter is only used if the URL does not exist for the comment author. If the URL does
+ * exist then the URL will be used and the $linktext will be ignored.
+ *
+ * Encapsulate the HTML link between the $before and $after. So it will appear in the order of $before,
+ * link, and finally $after.
+ *
+ * @since 1.5
+ * @uses apply_filters() Calls the 'get_comment_author_url_link' on the complete HTML before returning.
+ *
+ * @param string $linktext The text to display instead of the comment author's email address
+ * @param string $before The text or HTML to display before the email link.
+ * @param string $after The text or HTML to display after the email link.
+ * @return string The HTML link between the $before and $after parameters
+ */
 function get_comment_author_url_link( $linktext = '', $before = '', $after = '' ) {
-	global $comment;
 	$url = get_comment_author_url();
 	$display = ($linktext != '') ? $linktext : $url;
 	$display = str_replace( 'http://www.', '', $display );
@@ -83,10 +201,30 @@
 	return apply_filters('get_comment_author_url_link', $return);
 }
 
+/**
+ * comment_author_url_link() - Displays the HTML link of the url of the author of the current comment
+ *
+ * @since 0.71
+ * @see get_comment_author_url_link() Echos result
+ *
+ * @param string $linktext The text to display instead of the comment author's email address
+ * @param string $before The text or HTML to display before the email link.
+ * @param string $after The text or HTML to display after the email link.
+ */
 function comment_author_url_link( $linktext = '', $before = '', $after = '' ) {
 	echo get_comment_author_url_link( $linktext, $before, $after );
 }
 
+/**
+ * get_comment_date() - Retrieve the comment date of the current comment
+ *
+ * @since 1.5
+ * @uses apply_filters() Calls 'get_comment_date' hook with the formated date and the $d parameter respectively
+ * @uses $comment
+ *
+ * @param string $d The format of the date (defaults to user's config)
+ * @return string The comment's date
+ */
 function get_comment_date( $d = '' ) {
 	global $comment;
 	if ( '' == $d )
@@ -96,10 +234,30 @@
 	return apply_filters('get_comment_date', $date, $d);
 }
 
+/**
+ * comment_date() - Display the comment date of the current comment
+ *
+ * @since 0.71
+ *
+ * @param string $d The format of the date (defaults to user's config)
+ */
 function comment_date( $d = '' ) {
 	echo get_comment_date( $d );
 }
 
+/**
+ * get_comment_excerpt() - Retrieve the excerpt of the current comment
+ *
+ * Will cut each word and only output the first 20 words with '...' at the end.
+ * If the word count is less than 20, then no truncating is done and no '...'
+ * will appear.
+ *
+ * @since 1.5
+ * @uses $comment
+ * @uses apply_filters() Calls 'get_comment_excerpt' on truncated comment
+ *
+ * @return string The maybe truncated comment with 20 words or less
+ */
 function get_comment_excerpt() {
 	global $comment;
 	$comment_text = strip_tags($comment->comment_content);
@@ -119,34 +277,87 @@
 	return apply_filters('get_comment_excerpt', $excerpt);
 }
 
+/**
+ * comment_excerpt() - Returns the excerpt of the current comment
+ *
+ * @since 1.2
+ * @uses apply_filters() Calls 'comment_excerpt' hook before displaying excerpt
+ */
 function comment_excerpt() {
 	echo apply_filters('comment_excerpt', get_comment_excerpt() );
 }
 
+/**
+ * get_comment_ID() - Retrieve the comment id of the current comment
+ *
+ * @since 1.5
+ * @uses $comment
+ * @uses apply_filters() Calls the 'get_comment_ID' hook for the comment ID
+ *
+ * @return int The comment ID
+ */
 function get_comment_ID() {
 	global $comment;
 	return apply_filters('get_comment_ID', $comment->comment_ID);
 }
 
+/**
+ * comment_ID() - Displays the comment id of the current comment
+ *
+ * @since 0.71
+ * @see get_comment_ID() Echos Result
+ */
 function comment_ID() {
 	echo get_comment_ID();
 }
 
+/**
+ * get_comment_link() - Retrieve the link to the current comment
+ *
+ * @since 1.5
+ * @uses $comment
+ *
+ * @return string The permalink to the current comment
+ */
 function get_comment_link() {
 	global $comment;
 	return get_permalink( $comment->comment_post_ID ) . '#comment-' . $comment->comment_ID;
 }
 
+/**
+ * get_comments_link() - Retrieves the link to the current post comments
+ *
+ * @since 1.5
+ *
+ * @return string The link to the comments
+ */
 function get_comments_link() {
 	return get_permalink() . '#comments';
 }
 
-function comments_link( $file = '', $echo = true ) {
-		echo get_comments_link();
+/**
+ * comments_link() - Displays the link to the current post comments
+ *
+ * @since 0.71
+ *
+ * @param string $deprecated Not Used
+ * @param bool $deprecated Not Used
+ */
+function comments_link( $deprecated = '', $deprecated = '' ) {
+	echo get_comments_link();
 }
 
+/**
+ * get_comments_number() - Retrieve the amount of comments a post has
+ *
+ * @since 1.5
+ * @uses apply_filters() Calls the 'get_comments_number' hook on the number of comments
+ *
+ * @param int $post_id The Post ID
+ * @return int The number of comments a post has
+ */
 function get_comments_number( $post_id = 0 ) {
-	global $wpdb, $id;
+	global $id;
 	$post_id = (int) $post_id;
 
 	if ( !$post_id )
@@ -161,6 +372,18 @@
 	return apply_filters('get_comments_number', $count);
 }
 
+/**
+ * comments_number() - Display the language string for the number of comments the current post has
+ *
+ * @since 0.71
+ * @uses $id
+ * @uses apply_filters() Calls the 'comments_number' hook on the output and number of comments respectively.
+ *
+ * @param string $zero Text for no comments
+ * @param string $one Text for one comment
+ * @param string $more Text for more than one comment
+ * @param string $deprecated Not used.
+ */
 function comments_number( $zero = false, $one = false, $more = false, $deprecated = '' ) {
 	global $id;
 	$number = get_comments_number($id);
@@ -175,15 +398,41 @@
 	echo apply_filters('comments_number', $output, $number);
 }
 
+/**
+ * get_comment_text() - Retrieve the text of the current comment
+ *
+ * @since 1.5
+ * @uses $comment
+ *
+ * @return string The comment content
+ */
 function get_comment_text() {
 	global $comment;
 	return apply_filters('get_comment_text', $comment->comment_content);
 }
 
+/**
+ * comment_text() - Displays the text of the current comment
+ *
+ * @since 0.71
+ * @uses apply_filters() Passes the comment content through the 'comment_text' hook before display
+ * @uses get_comment_text() Gets the comment content
+ */
 function comment_text() {
 	echo apply_filters('comment_text', get_comment_text() );
 }
 
+/**
+ * get_comment_time() - Retrieve the comment time of the current comment
+ *
+ * @since 1.5
+ * @uses $comment
+ * @uses apply_filter() Calls 'get_comment_time' hook with the formatted time, the $d parameter, and $gmt parameter passed.
+ *
+ * @param string $d Optional. The format of the time (defaults to user's config)
+ * @param bool $gmt Whether to use the GMT date
+ * @return string The formatted time
+ */
 function get_comment_time( $d = '', $gmt = false ) {
 	global $comment;
 	$comment_date = $gmt? $comment->comment_date_gmt : $comment->comment_date;
@@ -194,10 +443,26 @@
 	return apply_filters('get_comment_time', $date, $d, $gmt);
 }
 
+/**
+ * comment_time() - Display the comment time of the current comment
+ *
+ * @since 0.71
+ *
+ * @param string $d Optional. The format of the time (defaults to user's config)
+ */
 function comment_time( $d = '' ) {
 	echo get_comment_time($d);
 }
 
+/**
+ * get_comment_type() - Retrieve the comment type of the current comment
+ *
+ * @since 1.5
+ * @uses $comment
+ * @uses apply_filters() Calls the 'get_comment_type' hook on the comment type
+ *
+ * @return string The comment type
+ */
 function get_comment_type() {
 	global $comment;
 
@@ -207,6 +472,15 @@
 	return apply_filters('get_comment_type', $comment->comment_type);
 }
 
+/**
+ * comment_type() - Display the comment type of the current comment
+ *
+ * @since 0.71
+ *
+ * @param string $commenttxt The string to display for comment type
+ * @param string $trackbacktxt The string to display for trackback type
+ * @param string $pingbacktxt The string to display for pingback type
+ */
 function comment_type($commenttxt = 'Comment', $trackbacktxt = 'Trackback', $pingbacktxt = 'Pingback') {
 	$type = get_comment_type();
 	switch( $type ) {
@@ -221,24 +495,51 @@
 	}
 }
 
+/**
+ * get_trackback_url() - Retrieve The current post's trackback URL
+ *
+ * There is a check to see if permalink's have been enabled and if so, will retrieve
+ * the pretty path. If permalinks weren't enabled, the ID of the current post is used
+ * and appended to the correct page to go to.
+ *
+ * @since 1.5
+ * @uses apply_filters() Calls 'trackback_url' on the resulting trackback URL
+ * @uses $id
+ *
+ * @return string The trackback URL after being filtered
+ */
 function get_trackback_url() {
 	global $id;
-	$tb_url = get_option('siteurl') . '/wp-trackback.php?p=' . $id;
-
-	if ( '' != get_option('permalink_structure') )
+	if ( '' != get_option('permalink_structure') ) {
 		$tb_url = trailingslashit(get_permalink()) . user_trailingslashit('trackback', 'single_trackback');
-
+	} else {
+		$tb_url = get_option('siteurl') . '/wp-trackback.php?p=' . $id;
+	}
 	return apply_filters('trackback_url', $tb_url);
 }
-function trackback_url( $display = true ) {
-	if ( $display)
-		echo get_trackback_url();
-	else
-		return get_trackback_url();
+
+/**
+ * trackback_url() - Displays the current post's trackback URL
+ *
+ * @since 0.71
+ * @uses get_trackback_url() Gets the trackback url for the current post
+ *
+ * @param bool $deprecated Remove backwards compat in 2.5
+ * @return void|string Should only be used to echo the trackback URL, use get_trackback_url() for the result instead.
+ */
+function trackback_url($deprecated = true) {
+	if ($deprecated) echo get_trackback_url();
+	else return get_trackback_url();
 }
 
-function trackback_rdf($timezone = 0) {
-	global $id;
+/**
+ * trackback_rdf() - Generates and displays the RDF for the trackback information of current post
+ *
+ * @since 0.71
+ *
+ * @param int $deprecated Not used (Was $timezone = 0)
+ */
+function trackback_rdf($deprecated = '') {
 	if (stripos($_SERVER['HTTP_USER_AGENT'], 'W3C_Validator') === false) {
 		echo '<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 				xmlns:dc="http://purl.org/dc/elements/1.1/"
@@ -250,33 +551,91 @@
 		the_permalink();
 		echo '"'."\n";
 		echo '    dc:title="'.str_replace('--', '&#x2d;&#x2d;', wptexturize(strip_tags(get_the_title()))).'"'."\n";
-		echo '    trackback:ping="'.trackback_url(0).'"'." />\n";
+		echo '    trackback:ping="'.get_trackback_url().'"'." />\n";
 		echo '</rdf:RDF>';
 	}
 }
 
-function comments_open() {
-	global $post;
-	if ( 'open' == $post->comment_status )
-		return true;
-	else
-		return false;
+/**
+ * comments_open() - Whether the current post is open for comments
+ *
+ * @since 1.5
+ * @uses $post
+ *
+ * @param int $post_id An optional post ID to check instead of the current post.
+ * @return bool True if the comments are open
+ */
+function comments_open( $post_id=NULL ) {
+
+	$_post = get_post($post_id);
+
+	$open = ( 'open' == $_post->comment_status );
+	return apply_filters( 'comments_open', $open, $post_id );
 }
 
-function pings_open() {
-	global $post;
-	if ( 'open' == $post->ping_status )
-		return true;
-	else
-		return false;
+/**
+ * pings_open() - Whether the current post is open for pings
+ *
+ * @since 1.5
+ * @uses $post
+ *
+ * @param int $post_id An optional post ID to check instead of the current post.
+ * @return bool True if pings are accepted
+ */
+function pings_open( $post_id = NULL ) {
+
+	$_post = get_post($post_id);
+
+	$open = ( 'open' == $_post->ping_status );
+	return apply_filters( 'pings_open', $open, $post_id );
 }
 
+/**
+ * wp_comment_form_unfiltered_html_nonce() - Displays form token for unfiltered comments
+ *
+ * Will only display nonce token if the current user has permissions for unfiltered html.
+ * Won't display the token for other users.
+ *
+ * The function was backported to 2.0.10 and was added to versions 2.1.3 and above. Does not
+ * exist in versions prior to 2.0.10 in the 2.0 branch and in the 2.1 branch, prior to 2.1.3.
+ * Technically added in 2.2.0.
+ *
+ * @since 2.0.10 Backported to 2.0 branch
+ * @since 2.1.3
+ * @uses $post Gets the ID of the current post for the token
+ */
 function wp_comment_form_unfiltered_html_nonce() {
 	global $post;
 	if ( current_user_can('unfiltered_html') )
 		wp_nonce_field('unfiltered-html-comment_' . $post->ID, '_wp_unfiltered_html_comment', false);
 }
 
+/**
+ * comments_template() - Loads the comment template specified in $file
+ *
+ * Will not display the comments template if not on single post or page, or
+ * if the post does not have comments.
+ *
+ * Uses the WordPress database object to query for the comments. The comments
+ * are passed through the 'comments_array' filter hook with the list of comments
+ * and the post ID respectively.
+ *
+ * The $file path is passed through a filter hook called, 'comments_template'
+ * which includes the TEMPLATEPATH and $file combined. Tries the $filtered path
+ * first and if it fails it will require the default comment themplate from the
+ * default theme. If either does not exist, then the WordPress process will be
+ * halted. It is advised for that reason, that the default theme is not deleted.
+ *
+ * @since 1.5
+ * @global array $comment List of comment objects for the current post
+ * @uses $wpdb
+ * @uses $id
+ * @uses $post
+ * @uses $withcomments Will not try to get the comments if the post has none.
+ *
+ * @param string $file Optional, default '/comments.php'. The file to load
+ * @return null Returns null if no comments appear
+ */
 function comments_template( $file = '/comments.php' ) {
 	global $wp_query, $withcomments, $post, $wpdb, $id, $comment, $user_login, $user_ID, $user_identity;
 
@@ -287,20 +646,19 @@
 	$commenter = wp_get_current_commenter();
 	extract($commenter, EXTR_SKIP);
 
-	// TODO: Use API instead of SELECTs.
+	/** @todo Use API instead of SELECTs. */
 	if ( $user_ID) {
-		$comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_post_ID = '$post->ID' AND (comment_approved = '1' OR ( user_id = '$user_ID' AND comment_approved = '0' ) )  ORDER BY comment_date");
-	} else if ( empty($comment_author) ) { 
-		$comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_post_ID = '$post->ID' AND comment_approved = '1' ORDER BY comment_date");
+		$comments = $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND (comment_approved = '1' OR ( user_id = %d AND comment_approved = '0' ) )  ORDER BY comment_date", $post->ID, $user_ID));
+	} else if ( empty($comment_author) ) {
+		$comments = $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved = '1' ORDER BY comment_date", $post->ID));
 	} else {
-		$author_db = $wpdb->escape($comment_author);
-		$email_db  = $wpdb->escape($comment_author_email);
-		$comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_post_ID = '$post->ID' AND ( comment_approved = '1' OR ( comment_author = '$author_db' AND comment_author_email = '$email_db' AND comment_approved = '0' ) ) ORDER BY comment_date");
+		$comments = $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND ( comment_approved = '1' OR ( comment_author = %s AND comment_author_email = %s AND comment_approved = '0' ) ) ORDER BY comment_date", $post->ID, $comment_author, $comment_author_email));
 	}
 
 	// keep $comments for legacy's sake (remember $table*? ;) )
 	$comments = $wp_query->comments = apply_filters( 'comments_array', $comments, $post->ID );
 	$wp_query->comment_count = count($wp_query->comments);
+	update_comment_cache($comments);
 
 	define('COMMENTS_TEMPLATE', true);
 	$include = apply_filters('comments_template', TEMPLATEPATH . $file );
@@ -310,47 +668,82 @@
 		require( ABSPATH . 'wp-content/themes/default/comments.php');
 }
 
+/**
+ * comments_popup_script() - Displays the JS popup script to show a comment
+ *
+ * If the $file parameter is empty, then the home page is assumed. The defaults
+ * for the window are 400px by 400px.
+ *
+ * For the comment link popup to work, this function has to be called or the
+ * normal comment link will be assumed.
+ *
+ * @since 0.71
+ * @global string $wpcommentspopupfile The URL to use for the popup window
+ * @global int $wpcommentsjavascript Whether to use JavaScript or not. Set when function is called
+ *
+ * @param int $width Optional. The width of the popup window
+ * @param int $height Optional. The height of the popup window
+ * @param string $file Optional. Sets the location of the popup window
+ */
 function comments_popup_script($width=400, $height=400, $file='') {
-		global $wpcommentspopupfile, $wptrackbackpopupfile, $wppingbackpopupfile, $wpcommentsjavascript;
-
-		if (empty ($file)) {
-			$wpcommentspopupfile = '';  // Use the index.
-		} else {
-			$wpcommentspopupfile = $file;
-		}
+	global $wpcommentspopupfile, $wpcommentsjavascript;
 
-		$wpcommentsjavascript = 1;
-		$javascript = "<script type='text/javascript'>\nfunction wpopen (macagna) {\n    window.open(macagna, '_blank', 'width=$width,height=$height,scrollbars=yes,status=yes');\n}\n</script>\n";
-		echo $javascript;
-}
+	if (empty ($file)) {
+		$wpcommentspopupfile = '';  // Use the index.
+	} else {
+		$wpcommentspopupfile = $file;
+	}
 
-function comments_popup_link($zero='No Comments', $one='1 Comment', $more='% Comments', $CSSclass='', $none='Comments Off') {
-	global $id, $wpcommentspopupfile, $wpcommentsjavascript, $post, $wpdb;
+	$wpcommentsjavascript = 1;
+	$javascript = "<script type='text/javascript'>\nfunction wpopen (macagna) {\n    window.open(macagna, '_blank', 'width=$width,height=$height,scrollbars=yes,status=yes');\n}\n</script>\n";
+	echo $javascript;
+}
+
+/**
+ * comments_popup_link() - Displays the link to the comments popup window for the current post ID.
+ *
+ * Is not meant to be displayed on single posts and pages. Should be used on the lists of posts
+ *
+ * @since 0.71
+ * @uses $id
+ * @uses $wpcommentspopupfile
+ * @uses $wpcommentsjavascript
+ * @uses $post
+ *
+ * @param string $zero The string to display when no comments
+ * @param string $one The string to display when only one comment is available
+ * @param string $more The string to display when there are more than one comment
+ * @param string $css_class The CSS class to use for comments
+ * @param string $none The string to display when comments have been turned off
+ * @return null Returns null on single posts and pages.
+ */
+function comments_popup_link( $zero = 'No Comments', $one = '1 Comment', $more = '% Comments', $css_class = '', $none = 'Comments Off' ) {
+	global $id, $wpcommentspopupfile, $wpcommentsjavascript, $post;
 
 	if ( is_single() || is_page() )
 		return;
 
-	$number = get_comments_number($id);
+	$number = get_comments_number( $id );
 
 	if ( 0 == $number && 'closed' == $post->comment_status && 'closed' == $post->ping_status ) {
-		echo '<span' . ((!empty($CSSclass)) ? ' class="' . $CSSclass . '"' : '') . '>' . $none . '</span>';
+		echo '<span' . ((!empty($css_class)) ? ' class="' . $css_class . '"' : '') . '>' . $none . '</span>';
 		return;
 	}
 
 	if ( !empty($post->post_password) ) { // if there's a password
-		if ($_COOKIE['wp-postpass_'.COOKIEHASH] != $post->post_password) {  // and it doesn't match the cookie
-			echo(__('Enter your password to view comments'));
+		if ( !isset($_COOKIE['wp-postpass_' . COOKIEHASH]) || $_COOKIE['wp-postpass_' . COOKIEHASH] != $post->post_password ) {  // and it doesn't match the cookie
+			echo __('Enter your password to view comments');
 			return;
 		}
 	}
 
 	echo '<a href="';
-	if ($wpcommentsjavascript) {
-		if ( empty($wpcommentspopupfile) )
+	if ( $wpcommentsjavascript ) {
+		if ( empty( $wpcommentspopupfile ) )
 			$home = get_option('home');
 		else
 			$home = get_option('siteurl');
-		echo $home . '/' . $wpcommentspopupfile.'?comments_popup='.$id;
+		echo $home . '/' . $wpcommentspopupfile . '?comments_popup=' . $id;
 		echo '" onclick="wpopen(this.href); return false"';
 	} else { // if comments_popup_script() is not in the template, display simple comment link
 		if ( 0 == $number )
@@ -360,13 +753,16 @@
 		echo '"';
 	}
 
-	if (!empty($CSSclass)) {
-		echo ' class="'.$CSSclass.'"';
+	if ( !empty( $css_class ) ) {
+		echo ' class="'.$css_class.'" ';
 	}
-	$title = attribute_escape(apply_filters('the_title', get_the_title()));
-	echo ' title="' . sprintf( __('Comment on %s'), $title ) .'">';
-	comments_number($zero, $one, $more, $number);
+	$title = attribute_escape( get_the_title() );
+
+	echo apply_filters( 'comments_popup_link_attributes', '' );
+
+	echo ' title="' . sprintf( __('Comment on %s'), $title ) . '">';
+	comments_number( $zero, $one, $more, $number );
 	echo '</a>';
 }
 
-?>
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/comment.php 2.5.src/wp-includes/comment.php
--- 2.2.2.src/wp-includes/comment.php	2007-06-15 12:45:21.000000000 -0500
+++ 2.5.src/wp-includes/comment.php	2008-03-20 15:32:18.000000000 -0500
@@ -1,5 +1,27 @@
 <?php
-
+/**
+ * Manages WordPress comments
+ *
+ * @package WordPress
+ */
+
+/**
+ * check_comment() - Checks whether a comment passes internal checks to be allowed to add
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @since 1.2
+ * @uses $wpdb
+ *
+ * @param string $author {@internal Missing Description }}
+ * @param string $email {@internal Missing Description }}
+ * @param string $url {@internal Missing Description }}
+ * @param string $comment {@internal Missing Description }}
+ * @param string $user_ip {@internal Missing Description }}
+ * @param string $user_agent {@internal Missing Description }}
+ * @param string $comment_type {@internal Missing Description }}
+ * @return bool {@internal Missing Description }}
+ */
 function check_comment($author, $email, $url, $comment, $user_ip, $user_agent, $comment_type) {
 	global $wpdb;
 
@@ -41,11 +63,12 @@
 			$domain = $uri['host'];
 			$uri = parse_url( get_option('home') );
 			$home_domain = $uri['host'];
-			if ( $wpdb->get_var("SELECT link_id FROM $wpdb->links WHERE link_url LIKE ('%$domain%') LIMIT 1") || $domain == $home_domain )
+			if ( $wpdb->get_var($wpdb->prepare("SELECT link_id FROM $wpdb->links WHERE link_url LIKE (%s) LIMIT 1", '%'.$domain.'%')) || $domain == $home_domain )
 				return true;
 			else
 				return false;
 		} elseif ( $author != '' && $email != '' ) {
+			// expected_slashed ($author, $email)
 			$ok_to_comment = $wpdb->get_var("SELECT comment_approved FROM $wpdb->comments WHERE comment_author = '$author' AND comment_author_email = '$email' and comment_approved = '1' LIMIT 1");
 			if ( ( 1 == $ok_to_comment ) &&
 				( empty($mod_keys) || false === strpos( $email, $mod_keys) ) )
@@ -59,37 +82,54 @@
 	return true;
 }
 
-
+/**
+ * get_approved_comments() - Returns the approved comments for post $post_id
+ *
+ * @since 2.0
+ * @uses $wpdb
+ *
+ * @param int $post_id The ID of the post
+ * @return array $comments The approved comments
+ */
 function get_approved_comments($post_id) {
 	global $wpdb;
-
-	$post_id = (int) $post_id;
-	return $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_post_ID = '$post_id' AND comment_approved = '1' ORDER BY comment_date");
+	return $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved = '1' ORDER BY comment_date", $post_id));
 }
 
-
-// Retrieves comment data given a comment ID or comment object.
-// Handles comment caching.
+/**
+ * get_comment() - Retrieves comment data given a comment ID or comment object.
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @since 2.0
+ * @uses $wpdb
+ *
+ * @param object|string|int $comment {@internal Missing Description}}
+ * @param string $output OBJECT or ARRAY_A or ARRAY_N constants
+ * @return object|array|null Depends on $output value.
+ */
 function &get_comment(&$comment, $output = OBJECT) {
-	global $comment_cache, $wpdb;
-
-	if ( empty($comment) )
-		return null;
+	global $wpdb;
 
-	if ( is_object($comment) ) {
-		if ( !isset($comment_cache[$comment->comment_ID]) )
-			$comment_cache[$comment->comment_ID] = &$comment;
-		$_comment = & $comment_cache[$comment->comment_ID];
+	if ( empty($comment) ) {
+		if ( isset($GLOBALS['comment']) )
+			$_comment = & $GLOBALS['comment'];
+		else
+			$_comment = null;
+	} elseif ( is_object($comment) ) {
+		wp_cache_add($comment->comment_ID, $comment, 'comment');
+		$_comment = $comment;
 	} else {
-		$comment = (int) $comment;
-		if ( !isset($comment_cache[$comment]) ) {
-			$_comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment' LIMIT 1");
-			$comment_cache[$comment->comment_ID] = & $_comment;
-		} else {
-			$_comment = & $comment_cache[$comment];
+		if ( isset($GLOBALS['comment']) && ($GLOBALS['comment']->comment_ID == $comment) ) {
+			$_comment = & $GLOBALS['comment'];
+		} elseif ( ! $_comment = wp_cache_get($comment, 'comment') ) {
+			$_comment = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_ID = %d LIMIT 1", $comment));
+			wp_cache_add($_comment->comment_ID, $_comment, 'comment');
 		}
 	}
 
+	$_comment = apply_filters('get_comment', $_comment);
+
 	if ( $output == OBJECT ) {
 		return $_comment;
 	} elseif ( $output == ARRAY_A ) {
@@ -101,12 +141,31 @@
 	}
 }
 
-
-// Deprecate in favor of get_comment()?
+/**
+ * get_commentdata() - Returns an array of comment data about comment $comment_ID
+ *
+ * get_comment() technically does the same thing as this function. This function also
+ * appears to reference variables and then not use them or not update them when needed.
+ * It is advised to switch to get_comment(), since this function might be deprecated in
+ * favor of using get_comment().
+ *
+ * @deprecated Use get_comment()
+ * @see get_comment()
+ * @since 0.71
+ *
+ * @uses $postc Comment cache, might not be used any more
+ * @uses $id
+ * @uses $wpdb Database Object
+ *
+ * @param int $comment_ID The ID of the comment
+ * @param int $no_cache Whether to use the cache or not (casted to bool)
+ * @param bool $include_unapproved Whether to include unapproved comments or not
+ * @return array The comment data
+ */
 function get_commentdata( $comment_ID, $no_cache = 0, $include_unapproved = false ) { // less flexible, but saves DB queries
-	global $postc, $id, $commentdata, $wpdb;
+	global $postc, $wpdb;
 	if ( $no_cache ) {
-		$query = "SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment_ID'";
+		$query = $wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_ID = %d", $comment_ID);
 		if ( false == $include_unapproved )
 			$query .= " AND comment_approved = '1'";
 		$myrow = $wpdb->get_row($query, ARRAY_A);
@@ -126,32 +185,109 @@
 	return $myrow;
 }
 
-
+/**
+ * get_lastcommentmodified() - The date the last comment was modified
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @since 1.5.0
+ * @uses $wpdb
+ * @global array $cache_lastcommentmodified
+ *
+ * @param string $timezone Which timezone to use in reference to 'gmt', 'blog', or 'server' locations
+ * @return string Last comment modified date
+ */
 function get_lastcommentmodified($timezone = 'server') {
-	global $cache_lastcommentmodified, $pagenow, $wpdb;
-	$add_seconds_blog = get_option('gmt_offset') * 3600;
+	global $cache_lastcommentmodified, $wpdb;
+
+	if ( isset($cache_lastcommentmodified[$timezone]) )
+		return $cache_lastcommentmodified[$timezone];
+
 	$add_seconds_server = date('Z');
-	$now = current_time('mysql', 1);
-	if ( !isset($cache_lastcommentmodified[$timezone]) ) {
-		switch ( strtolower($timezone)) {
-			case 'gmt':
-				$lastcommentmodified = $wpdb->get_var("SELECT comment_date_gmt FROM $wpdb->comments WHERE comment_date_gmt <= '$now' ORDER BY comment_date_gmt DESC LIMIT 1");
+
+	switch ( strtolower($timezone)) {
+		case 'gmt':
+			$lastcommentmodified = $wpdb->get_var("SELECT comment_date_gmt FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 1");
+			break;
+		case 'blog':
+			$lastcommentmodified = $wpdb->get_var("SELECT comment_date FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 1");
+			break;
+		case 'server':
+			$lastcommentmodified = $wpdb->get_var($wpdb->prepare("SELECT DATE_ADD(comment_date_gmt, INTERVAL %s SECOND) FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 1", $add_seconds_server));
+			break;
+	}
+
+	$cache_lastcommentmodified[$timezone] = $lastcommentmodified;
+
+	return $lastcommentmodified;
+}
+
+/**
+ * get_comment_count() - The amount of comments in a post or total comments
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @since 2.0.0
+ * @uses $wpdb
+ *
+ * @param int $post_id Optional. Comment amount in post if > 0, else total com
+ments blog wide
+ * @return array The amount of spam, approved, awaiting moderation, and total
+ */
+function get_comment_count( $post_id = 0 ) {
+	global $wpdb;
+
+	$post_id = (int) $post_id;
+
+	$where = '';
+	if ( $post_id > 0 ) {
+		$where = "WHERE comment_post_ID = {$post_id}";
+	}
+
+	$totals = (array) $wpdb->get_results("
+		SELECT comment_approved, COUNT( * ) AS total
+		FROM {$wpdb->comments}
+		{$where}
+		GROUP BY comment_approved
+	", ARRAY_A);
+
+	$comment_count = array(
+		"approved"              => 0,
+		"awaiting_moderation"   => 0,
+		"spam"                  => 0,
+		"total_comments"        => 0
+	);
+
+	foreach ( $totals as $row ) {
+		switch ( $row['comment_approved'] ) {
+			case 'spam':
+				$comment_count['spam'] = $row['total'];
+				$comment_count["total_comments"] += $row['total'];
 				break;
-			case 'blog':
-				$lastcommentmodified = $wpdb->get_var("SELECT comment_date FROM $wpdb->comments WHERE comment_date_gmt <= '$now' ORDER BY comment_date_gmt DESC LIMIT 1");
+			case 1:
+				$comment_count['approved'] = $row['total'];
+				$comment_count['total_comments'] += $row['total'];
 				break;
-			case 'server':
-				$lastcommentmodified = $wpdb->get_var("SELECT DATE_ADD(comment_date_gmt, INTERVAL '$add_seconds_server' SECOND) FROM $wpdb->comments WHERE comment_date_gmt <= '$now' ORDER BY comment_date_gmt DESC LIMIT 1");
+			case 0:
+				$comment_count['awaiting_moderation'] = $row['total'];
+				$comment_count['total_comments'] += $row['total'];
+				break;
+			default:
 				break;
 		}
-		$cache_lastcommentmodified[$timezone] = $lastcommentmodified;
-	} else {
-		$lastcommentmodified = $cache_lastcommentmodified[$timezone];
 	}
-	return $lastcommentmodified;
-}
 
+	return $comment_count;
+}
 
+/**
+ * sanitize_comment_cookies() - {@internal Missing Short Description}}
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @since 2.0.4
+ *
+ */
 function sanitize_comment_cookies() {
 	if ( isset($_COOKIE['comment_author_'.COOKIEHASH]) ) {
 		$comment_author = apply_filters('pre_comment_author_name', $_COOKIE['comment_author_'.COOKIEHASH]);
@@ -170,17 +306,29 @@
 	if ( isset($_COOKIE['comment_author_url_'.COOKIEHASH]) ) {
 		$comment_author_url = apply_filters('pre_comment_author_url', $_COOKIE['comment_author_url_'.COOKIEHASH]);
 		$comment_author_url = stripslashes($comment_author_url);
-		$comment_author_url = clean_url($comment_author_url);
 		$_COOKIE['comment_author_url_'.COOKIEHASH] = $comment_author_url;
 	}
 }
 
-
+/**
+ * wp_allow_comment() - Validates whether this comment is allowed to be made or not
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @since 2.0.0
+ * @uses $wpdb
+ * @uses apply_filters() Calls 'pre_comment_approved' hook on the type of comment
+ * @uses do_action() Calls 'check_comment_flood' hook on $comment_author_IP, $comment_author_email, and $comment_date_gmt
+ *
+ * @param array $commentdata Contains information on the comment
+ * @return mixed Signifies the approval status (0|1|'spam')
+ */
 function wp_allow_comment($commentdata) {
 	global $wpdb;
 	extract($commentdata, EXTR_SKIP);
 
 	// Simple duplicate check
+	// expected_slashed ($comment_post_ID, $comment_author, $comment_author_email, $comment_content)
 	$dupe = "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = '$comment_post_ID' AND ( comment_author = '$comment_author' ";
 	if ( $comment_author_email )
 		$dupe .= "OR comment_author_email = '$comment_author_email' ";
@@ -188,21 +336,12 @@
 	if ( $wpdb->get_var($dupe) )
 		wp_die( __('Duplicate comment detected; it looks as though you\'ve already said that!') );
 
-	// Simple flood-protection
-	if ( $lasttime = $wpdb->get_var("SELECT comment_date_gmt FROM $wpdb->comments WHERE comment_author_IP = '$comment_author_IP' OR comment_author_email = '$comment_author_email' ORDER BY comment_date DESC LIMIT 1") ) {
-		$time_lastcomment = mysql2date('U', $lasttime);
-		$time_newcomment  = mysql2date('U', $comment_date_gmt);
-		$flood_die = apply_filters('comment_flood_filter', false, $time_lastcomment, $time_newcomment);
-		if ( $flood_die ) {
-			do_action('comment_flood_trigger', $time_lastcomment, $time_newcomment);
-			wp_die( __('You are posting comments too quickly.  Slow down.') );
-		}
-	}
+	do_action( 'check_comment_flood', $comment_author_IP, $comment_author_email, $comment_date_gmt );
 
 	if ( $user_id ) {
 		$userdata = get_userdata($user_id);
 		$user = new WP_User($user_id);
-		$post_author = $wpdb->get_var("SELECT post_author FROM $wpdb->posts WHERE ID = '$comment_post_ID' LIMIT 1");
+		$post_author = $wpdb->get_var($wpdb->prepare("SELECT post_author FROM $wpdb->posts WHERE ID = %d LIMIT 1", $comment_post_ID));
 	}
 
 	if ( $userdata && ( $user_id == $post_author || $user->has_cap('level_9') ) ) {
@@ -222,10 +361,52 @@
 	return $approved;
 }
 
-
-function wp_blacklist_check($author, $email, $url, $comment, $user_ip, $user_agent) {
+/**
+ * check_comment_flood_db() - {@internal Missing Short Description}}
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @since 2.3.0
+ * @uses $wpdb
+ * @uses apply_filters() {@internal Missing Description}}
+ * @uses do_action() {@internal Missing Description}}
+ *
+ * @param string $ip {@internal Missing Description}}
+ * @param string $email {@internal Missing Description}}
+ * @param unknown_type $date {@internal Missing Description}}
+ */
+function check_comment_flood_db( $ip, $email, $date ) {
 	global $wpdb;
+	if ( current_user_can( 'manage_options' ) )
+		return; // don't throttle admins
+	if ( $lasttime = $wpdb->get_var("SELECT comment_date_gmt FROM $wpdb->comments WHERE comment_author_IP = '$ip' OR comment_author_email = '$email' ORDER BY comment_date DESC LIMIT 1") ) {
+		$time_lastcomment = mysql2date('U', $lasttime);
+		$time_newcomment  = mysql2date('U', $date);
+		$flood_die = apply_filters('comment_flood_filter', false, $time_lastcomment, $time_newcomment);
+		if ( $flood_die ) {
+			do_action('comment_flood_trigger', $time_lastcomment, $time_newcomment);
+			wp_die( __('You are posting comments too quickly.  Slow down.') );
+		}
+	}
+}
 
+/**
+ * wp_blacklist_check() - Does comment contain blacklisted characters or words
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @since 1.5.0
+ * @uses do_action() Calls 'wp_blacklist_check' hook for all parameters
+ *
+ * @param string $author The author of the comment
+ * @param string $email The email of the comment
+ * @param string $url The url used in the comment
+ * @param string $comment The comment content
+ * @param string $user_ip The comment author IP address
+ * @param string $user_agent The author's browser user agent
+ * @return bool True if comment contains blacklisted content, false if comment does not
+ */
+function wp_blacklist_check($author, $email, $url, $comment, $user_ip, $user_agent) {
 	do_action('wp_blacklist_check', $author, $email, $url, $comment, $user_ip, $user_agent);
 
 	if ( preg_match_all('/&#(\d+);/', $comment . $author . $url, $chars) ) {
@@ -267,7 +448,39 @@
 	return false;
 }
 
+function wp_count_comments() {
+	global $wpdb;
 
+	$count = $wpdb->get_results( "SELECT comment_approved, COUNT( * ) AS num_comments FROM {$wpdb->comments} GROUP BY comment_approved", ARRAY_A );
+
+	$stats = array( );
+	$approved = array('0' => 'moderated', '1' => 'approved', 'spam' => 'spam');
+	foreach( (array) $count as $row_num => $row ) {
+		$stats[$approved[$row['comment_approved']]] = $row['num_comments'];
+	}
+
+	foreach ( $approved as $key ) {
+		if ( empty($stats[$key]) )
+			$stats[$key] = 0;
+	}
+
+	return (object) $stats;
+}
+
+/**
+ * wp_delete_comment() - Removes comment ID and maybe updates post comment count
+ *
+ * The post comment count will be updated if the comment was approved and has a post
+ * ID available.
+ *
+ * @since 2.0.0
+ * @uses $wpdb
+ * @uses do_action() Calls 'delete_comment' hook on comment ID
+ * @uses do_action() Calls 'wp_set_comment_status' hook on comment ID with 'delete' set for the second parameter
+ *
+ * @param int $comment_id Comment ID
+ * @return bool False if delete comment query failure, true on success
+ */
 function wp_delete_comment($comment_id) {
 	global $wpdb;
 	do_action('delete_comment', $comment_id);
@@ -281,29 +494,51 @@
 	if ( $post_id && $comment->comment_approved == 1 )
 		wp_update_comment_count($post_id);
 
+	clean_comment_cache($comment_id);
+
 	do_action('wp_set_comment_status', $comment_id, 'delete');
 	return true;
 }
 
-
+/**
+ * wp_get_comment_status() - The status of a comment by ID
+ *
+ * @since 1.0.0
+ *
+ * @param int $comment_id Comment ID
+ * @return string|bool Status might be 'deleted', 'approved', 'unapproved', 'spam'. False on failure
+ */
 function wp_get_comment_status($comment_id) {
-	global $wpdb;
+	$comment = get_comment($comment_id);
+	if ( !$comment )
+		return false;
 
-	$result = $wpdb->get_var("SELECT comment_approved FROM $wpdb->comments WHERE comment_ID='$comment_id' LIMIT 1");
+	$approved = $comment->comment_approved;
 
-	if ( $result == NULL )
+	if ( $approved == NULL )
 		return 'deleted';
-	elseif ( $result == '1' )
+	elseif ( $approved == '1' )
 		return 'approved';
-	elseif ( $result == '0' )
+	elseif ( $approved == '0' )
 		return 'unapproved';
-	elseif ( $result == 'spam' )
+	elseif ( $approved == 'spam' )
 		return 'spam';
 	else
 		return false;
 }
 
-
+/**
+ * wp_get_current_commenter() - Get current commenter's name, email, and URL
+ *
+ * Expects cookies content to already be sanitized. User of this function
+ * might wish to recheck the returned array for validity.
+ *
+ * @see sanitize_comment_cookies() Use to sanitize cookies
+ *
+ * @since 2.0.4
+ *
+ * @return array Comment author, email, url respectively
+ */
 function wp_get_current_commenter() {
 	// Cookies should already be sanitized.
 
@@ -322,13 +557,23 @@
 	return compact('comment_author', 'comment_author_email', 'comment_author_url');
 }
 
-
+/**
+ * wp_insert_comment() - Inserts a comment to the database
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @since 2.0.0
+ * @uses $wpdb
+ *
+ * @param array $commentdata Contains information on the comment
+ * @return int The new comment's id
+ */
 function wp_insert_comment($commentdata) {
 	global $wpdb;
 	extract($commentdata, EXTR_SKIP);
 
 	if ( ! isset($comment_author_IP) )
-		$comment_author_IP = preg_replace( '/[^0-9., ]/', '',$_SERVER['REMOTE_ADDR'] );
+		$comment_author_IP = '';
 	if ( ! isset($comment_date) )
 		$comment_date = current_time('mysql');
 	if ( ! isset($comment_date_gmt) )
@@ -354,7 +599,25 @@
 	return $id;
 }
 
-
+/**
+ * wp_filter_comment() - Parses and returns comment information
+ *
+ * Sets the comment data 'filtered' field to true when finished. This
+ * can be checked as to whether the comment should be filtered and to
+ * keep from filtering the same comment more than once.
+ *
+ * @since 2.0.0
+ * @uses apply_filters() Calls 'pre_user_id' hook on comment author's user ID
+ * @uses apply_filters() Calls 'pre_comment_user_agent' hook on comment author's user agent
+ * @uses apply_filters() Calls 'pre_comment_author_name' hook on comment author's name
+ * @uses apply_filters() Calls 'pre_comment_content' hook on the comment's content
+ * @uses apply_filters() Calls 'pre_comment_user_ip' hook on comment author's IP
+ * @uses apply_filters() Calls 'pre_comment_author_url' hook on comment author's URL
+ * @uses apply_filters() Calls 'pre_comment_author_email' hook on comment author's email address
+ *
+ * @param array $commentdata Contains information on the comment
+ * @return array Parsed comment information
+ */
 function wp_filter_comment($commentdata) {
 	$commentdata['user_id']              = apply_filters('pre_user_id', $commentdata['user_ID']);
 	$commentdata['comment_agent']        = apply_filters('pre_comment_user_agent', $commentdata['comment_agent']);
@@ -367,7 +630,18 @@
 	return $commentdata;
 }
 
-
+/**
+ * wp_throttle_comment_flood() - {@internal Missing Short Description}}
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @since 2.1.0
+ *
+ * @param unknown_type $block {@internal Missing Description}}
+ * @param unknown_type $time_lastcomment {@internal Missing Description}}
+ * @param unknown_type $time_newcomment {@internal Missing Description}}
+ * @return unknown {@internal Missing Description}}
+ */
 function wp_throttle_comment_flood($block, $time_lastcomment, $time_newcomment) {
 	if ( $block ) // a plugin has already blocked... we'll let that decision stand
 		return $block;
@@ -376,14 +650,28 @@
 	return false;
 }
 
-
+/**
+ * wp_new_comment() - Parses and adds a new comment to the database
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @since 1.5.0
+ * @uses apply_filters() Calls 'preprocess_comment' hook on $commentdata parameter array before processing
+ * @uses do_action() Calls 'comment_post' hook on $comment_ID returned from adding the comment and if the comment was approved.
+ * @uses wp_filter_comment() Used to filter comment before adding comment
+ * @uses wp_allow_comment() checks to see if comment is approved.
+ * @uses wp_insert_comment() Does the actual comment insertion to the database
+ *
+ * @param array $commentdata Contains information on the comment
+ * @return int The ID of the comment after adding.
+ */
 function wp_new_comment( $commentdata ) {
 	$commentdata = apply_filters('preprocess_comment', $commentdata);
 
 	$commentdata['comment_post_ID'] = (int) $commentdata['comment_post_ID'];
 	$commentdata['user_ID']         = (int) $commentdata['user_ID'];
 
-	$commentdata['comment_author_IP'] = preg_replace( '/[^0-9., ]/', '',$_SERVER['REMOTE_ADDR'] );
+	$commentdata['comment_author_IP'] = preg_replace( '/[^0-9a-fA-F:., ]/', '',$_SERVER['REMOTE_ADDR'] );
 	$commentdata['comment_agent']     = $_SERVER['HTTP_USER_AGENT'];
 
 	$commentdata['comment_date']     = current_time('mysql');
@@ -410,7 +698,17 @@
 	return $comment_ID;
 }
 
-
+/**
+ * wp_set_comment_status() - Sets the status of comment ID
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @since 1.0.0
+ *
+ * @param int $comment_id Comment ID
+ * @param string $comment_status New comment status, either 'hold', 'approve', 'spam', or 'delete'
+ * @return bool False on failure or deletion and true on success.
+ */
 function wp_set_comment_status($comment_id, $comment_status) {
 	global $wpdb;
 
@@ -434,13 +732,26 @@
 	if ( !$wpdb->query($query) )
 		return false;
 
+	clean_comment_cache($comment_id);
+
 	do_action('wp_set_comment_status', $comment_id, $comment_status);
 	$comment = get_comment($comment_id);
 	wp_update_comment_count($comment->comment_post_ID);
+
 	return true;
 }
 
-
+/**
+ * wp_update_comment() - Parses and updates an existing comment in the database
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @since 2.0.0
+ * @uses $wpdb
+ *
+ * @param array $commentarr Contains information on the comment
+ * @return int Comment was updated if value is 1, or was not updated if value is 0.
+ */
 function wp_update_comment($commentarr) {
 	global $wpdb;
 
@@ -463,7 +774,7 @@
 
 	$comment_date_gmt = get_gmt_from_date($comment_date);
 
-	$result = $wpdb->query(
+	$wpdb->query(
 		"UPDATE $wpdb->comments SET
 			comment_content      = '$comment_content',
 			comment_author       = '$comment_author',
@@ -475,37 +786,129 @@
 		WHERE comment_ID = $comment_ID" );
 
 	$rval = $wpdb->rows_affected;
+
+	clean_comment_cache($comment_ID);
 	wp_update_comment_count($comment_post_ID);
 	do_action('edit_comment', $comment_ID);
 	return $rval;
 }
 
+/**
+ * wp_defer_comment_counting() - Whether to defer comment counting
+ *
+ * When setting $defer to true, all post comment counts will not be updated
+ * until $defer is set to false. When $defer is set to false, then all
+ * previously deferred updated post comment counts will then be automatically
+ * updated without having to call wp_update_comment_count() after.
+ *
+ * @since 2.5
+ * @staticvar bool $_defer
+ *
+ * @param bool $defer
+ * @return unknown
+ */
+function wp_defer_comment_counting($defer=null) {
+	static $_defer = false;
+
+	if ( is_bool($defer) ) {
+		$_defer = $defer;
+		// flush any deferred counts
+		if ( !$defer )
+			wp_update_comment_count( null, true );
+	}
+
+	return $_defer;
+}
+
+/**
+ * wp_update_comment_count() - Updates the comment count for post(s)
+ *
+ * When $do_deferred is false (is by default) and the comments have been
+ * set to be deferred, the post_id will be added to a queue, which will
+ * be updated at a later date and only updated once per post ID.
+ *
+ * If the comments have not be set up to be deferred, then the post will
+ * be updated. When $do_deferred is set to true, then all previous deferred
+ * post IDs will be updated along with the current $post_id.
+ *
+ * @since 2.1.0
+ * @see wp_update_comment_count_now() For what could cause a false return value
+ *
+ * @param int $post_id Post ID
+ * @param bool $do_deferred Whether to process previously deferred post comment counts
+ * @return bool True on success, false on failure
+ */
+function wp_update_comment_count($post_id, $do_deferred=false) {
+	static $_deferred = array();
+
+	if ( $do_deferred ) {
+		$_deferred = array_unique($_deferred);
+		foreach ( $_deferred as $i => $_post_id ) {
+			wp_update_comment_count_now($_post_id);
+			unset( $_deferred[$i] ); /** @todo Move this outside of the foreach and reset $_deferred to an array instead */
+		}
+	}
 
-function wp_update_comment_count($post_id) {
-	global $wpdb, $comment_count_cache;
+	if ( wp_defer_comment_counting() ) {
+		$_deferred[] = $post_id;
+		return true;
+	}
+	elseif ( $post_id ) {
+		return wp_update_comment_count_now($post_id);
+	}
+
+}
+
+/**
+ * wp_update_comment_count_now() - Updates the comment count for the post
+ *
+ * @since 2.5
+ * @uses $wpdb
+ * @uses do_action() Calls 'wp_update_comment_count' hook on $post_id, $new, and $old
+ * @uses do_action() Calls 'edit_posts' hook on $post_id and $post
+ *
+ * @param int $post_id Post ID
+ * @return bool False on '0' $post_id or if post with ID does not exist. True on success.
+ */
+function wp_update_comment_count_now($post_id) {
+	global $wpdb;
 	$post_id = (int) $post_id;
 	if ( !$post_id )
 		return false;
-	$count = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->comments WHERE comment_post_ID = '$post_id' AND comment_approved = '1'");
-	$wpdb->query("UPDATE $wpdb->posts SET comment_count = $count WHERE ID = '$post_id'");
-	$comment_count_cache[$post_id] = $count;
+	if ( !$post = get_post($post_id) )
+		return false;
+
+	$old = (int) $post->comment_count;
+	$new = (int) $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->comments WHERE comment_post_ID = '$post_id' AND comment_approved = '1'");
+	$wpdb->query("UPDATE $wpdb->posts SET comment_count = '$new' WHERE ID = '$post_id'");
 
-	$post = get_post($post_id);
 	if ( 'page' == $post->post_type )
 		clean_page_cache( $post_id );
 	else
 		clean_post_cache( $post_id );
 
-	do_action('edit_post', $post_id);
+	do_action('wp_update_comment_count', $post_id, $new, $old);
+	do_action('edit_post', $post_id, $post);
 
 	return true;
 }
 
-
 //
 // Ping and trackback functions.
 //
 
+/**
+ * discover_pingback_server_uri() - Finds a pingback server URI based on the given URL
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @since 1.5.0
+ * @uses $wp_version
+ *
+ * @param string $url URL to ping
+ * @param int $timeout_bytes Number of bytes to timeout at. Prevents big file downloads, default is 2048.
+ * @return bool|string False on failure, string containing URI on success.
+ */
 function discover_pingback_server_uri($url, $timeout_bytes = 2048) {
 	global $wp_version;
 
@@ -515,7 +918,6 @@
 	$pingback_str_dquote = 'rel="pingback"';
 	$pingback_str_squote = 'rel=\'pingback\'';
 	$x_pingback_str = 'x-pingback: ';
-	$pingback_href_original_pos = 27;
 
 	extract(parse_url($url), EXTR_SKIP);
 
@@ -587,7 +989,14 @@
 	return false;
 }
 
-
+/**
+ * do_all_pings() - {@internal Missing Short Description}}
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @since 2.1.0
+ * @uses $wpdb
+ */
 function do_all_pings() {
 	global $wpdb;
 
@@ -604,16 +1013,25 @@
 	}
 
 	// Do Trackbacks
-	$trackbacks = $wpdb->get_results("SELECT ID FROM $wpdb->posts WHERE CHAR_LENGTH(TRIM(to_ping)) > 7 AND post_status = 'publish'");
-	if ( is_array($trackbacks) ) {
+	$trackbacks = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE to_ping <> '' AND post_status = 'publish'");
+	if ( is_array($trackbacks) )
 		foreach ( $trackbacks as $trackback )
-			do_trackbacks($trackback->ID);
-	}
+			do_trackbacks($trackback);
 
 	//Do Update Services/Generic Pings
 	generic_ping();
 }
 
+/**
+ * do_trackbacks() - {@internal Missing Short Description}}
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @since 1.5.0
+ * @uses $wpdb
+ *
+ * @param int $post_id Post ID to do trackbacks on
+ */
 function do_trackbacks($post_id) {
 	global $wpdb;
 
@@ -630,11 +1048,7 @@
 	else
 		$excerpt = apply_filters('the_excerpt', $post->post_excerpt);
 	$excerpt = str_replace(']]>', ']]&gt;', $excerpt);
-	$excerpt = strip_tags($excerpt);
-	if ( function_exists('mb_strcut') ) // For international trackbacks
-    	$excerpt = mb_strcut($excerpt, 0, 252, get_option('blog_charset')) . '...';
-	else
-		$excerpt = substr($excerpt, 0, 252) . '...';
+	$excerpt = wp_html_excerpt($excerpt, 252) . '...';
 
 	$post_title = apply_filters('the_title', $post->post_title);
 	$post_title = strip_tags($post_title);
@@ -652,29 +1066,47 @@
 	}
 }
 
-
+/**
+ * generic_ping() - {@internal Missing Short Description}}
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @since 1.2.0
+ *
+ * @param int $post_id Post ID. Not actually used.
+ * @return int Same as Post ID from parameter
+ */
 function generic_ping($post_id = 0) {
 	$services = get_option('ping_sites');
-	$services = preg_replace("|(\s)+|", '$1', $services); // Kill dupe lines
-	$services = trim($services);
-	if ( '' != $services ) {
-		$services = explode("\n", $services);
-		foreach ( (array) $services as $service )
+
+	$services = explode("\n", $services);
+	foreach ( (array) $services as $service ) {
+		$service = trim($service);
+		if ( '' != $service )
 			weblog_ping($service);
 	}
 
 	return $post_id;
 }
 
-
+/**
+ * pingback() - Pings back the links found in a post
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @since 0.71
+ * @uses $wp_version
+ * @uses IXR_Client
+ *
+ * @param string $content {@internal Missing Description}}
+ * @param int $post_ID {@internal Missing Description}}
+ */
 function pingback($content, $post_ID) {
-	global $wp_version, $wpdb;
+	global $wp_version;
 	include_once(ABSPATH . WPINC . '/class-IXR.php');
 
 	// original code by Mort (http://mort.mine.nu:8080)
-	$log = debug_fopen(ABSPATH . '/pingback.log', 'a');
 	$post_links = array();
-	debug_fwrite($log, 'BEGIN ' . date('YmdHis', time()) . "\n");
 
 	$pung = get_pung($post_ID);
 
@@ -690,10 +1122,6 @@
 	// http://www.phpfreaks.com/quickcode/Extract_All_URLs_on_a_Page/15.php
 	preg_match_all("{\b http : [$any] +? (?= [$punc] * [^$any] | $)}x", $content, $post_links_temp);
 
-	// Debug
-	debug_fwrite($log, 'Post contents:');
-	debug_fwrite($log, $content."\n");
-
 	// Step 2.
 	// Walking thru the links array
 	// first we get rid of links pointing to sites, not to specific files
@@ -717,16 +1145,12 @@
 	do_action_ref_array('pre_ping', array(&$post_links, &$pung));
 
 	foreach ( (array) $post_links as $pagelinkedto ) {
-		debug_fwrite($log, "Processing -- $pagelinkedto\n");
 		$pingback_server_url = discover_pingback_server_uri($pagelinkedto, 2048);
 
 		if ( $pingback_server_url ) {
 			@ set_time_limit( 60 );
 			 // Now, the RPC call
-			debug_fwrite($log, "Page Linked To: $pagelinkedto \n");
-			debug_fwrite($log, 'Page Linked From: ');
 			$pagelinkedfrom = get_permalink($post_ID);
-			debug_fwrite($log, $pagelinkedfrom."\n");
 
 			// using a timeout of 3 seconds should be enough to cover slow servers
 			$client = new IXR_Client($pingback_server_url);
@@ -736,18 +1160,22 @@
 			// when set to true, this outputs debug messages by itself
 			$client->debug = false;
 
-			if ( $client->query('pingback.ping', $pagelinkedfrom, $pagelinkedto ) )
+			if ( $client->query('pingback.ping', $pagelinkedfrom, $pagelinkedto) || ( isset($client->error->code) && 48 == $client->error->code ) ) // Already registered
 				add_ping( $post_ID, $pagelinkedto );
-			else
-				debug_fwrite($log, "Error.\n Fault code: ".$client->getErrorCode()." : ".$client->getErrorMessage()."\n");
 		}
 	}
-
-	debug_fwrite($log, "\nEND: ".time()."\n****************************\n");
-	debug_fclose($log);
 }
 
-
+/**
+ * privacy_ping_filter() - {@internal Missing Short Description}}
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @since 2.1.0
+ *
+ * @param unknown_type $sites {@internal Missing Description}}
+ * @return unknown {@internal Missing Description}}
+ */
 function privacy_ping_filter($sites) {
 	if ( '0' != get_option('blog_public') )
 		return $sites;
@@ -755,7 +1183,21 @@
 		return '';
 }
 
-// Send a Trackback
+/**
+ * trackback() - Send a Trackback
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @since 0.71
+ * @uses $wpdb
+ * @uses $wp_version WordPress version
+ *
+ * @param string $trackback_url {@internal Missing Description}}
+ * @param string $title {@internal Missing Description}}
+ * @param string $excerpt {@internal Missing Description}}
+ * @param int $ID {@internal Missing Description}}
+ * @return unknown {@internal Missing Description}}
+ */
 function trackback($trackback_url, $title, $excerpt, $ID) {
 	global $wpdb, $wp_version;
 
@@ -780,16 +1222,6 @@
 		$trackback_url['port'] = 80;
 	$fs = @fsockopen($trackback_url['host'], $trackback_url['port'], $errno, $errstr, 4);
 	@fputs($fs, $http_request);
-/*
-	$debug_file = 'trackback.log';
-	$fp = fopen($debug_file, 'a');
-	fwrite($fp, "\n*****\nRequest:\n\n$http_request\n\nResponse:\n\n");
-	while(!@feof($fs)) {
-		fwrite($fp, @fgets($fs, 4096));
-	}
-	fwrite($fp, "\n\n");
-	fclose($fp);
-*/
 	@fclose($fs);
 
 	$tb_url = addslashes( $tb_url );
@@ -797,7 +1229,18 @@
 	return $wpdb->query("UPDATE $wpdb->posts SET to_ping = TRIM(REPLACE(to_ping, '$tb_url', '')) WHERE ID = '$ID'");
 }
 
-
+/**
+ * weblog_ping() - {@internal Missing Short Description}}
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @since 1.2.0
+ * @uses $wp_version
+ * @uses IXR_Client
+ *
+ * @param unknown_type $server
+ * @param unknown_type $path
+ */
 function weblog_ping($server = '', $path = '') {
 	global $wp_version;
 	include_once(ABSPATH . WPINC . '/class-IXR.php');
@@ -814,4 +1257,39 @@
 		$client->query('weblogUpdates.ping', get_option('blogname'), $home);
 }
 
+//
+// Cache
+//
+
+/**
+ * clean_comment_cache() - Removes comment ID from the comment cache
+ *
+ * @since 2.3.0
+ * @package WordPress
+ * @subpackage Cache
+ *
+ * @param int $id Comment ID to remove from cache
+ */
+function clean_comment_cache($id) {
+	wp_cache_delete($id, 'comment');
+}
+
+/**
+ * update_comment_cache() - Updates the comment cache of given comments
+ *
+ * Will add the comments in $comments to the cache. If comment ID already
+ * exists in the comment cache then it will not be updated.
+ *
+ * The comment is added to the cache using the comment group with the key
+ * using the ID of the comments.
+ *
+ * @since 2.3.0
+ *
+ * @param array $comments Array of comment row objects
+ */
+function update_comment_cache($comments) {
+	foreach ( (array) $comments as $comment )
+		wp_cache_add($comment->comment_ID, $comment, 'comment');
+}
+
 ?>
diff -x .svn -aruN 2.2.2.src/wp-includes/compat.php 2.5.src/wp-includes/compat.php
--- 2.2.2.src/wp-includes/compat.php	2007-04-05 21:54:12.000000000 -0500
+++ 2.5.src/wp-includes/compat.php	2008-03-03 15:05:23.000000000 -0600
@@ -1,128 +1,99 @@
 <?php
+/**
+ * WordPress implementation for PHP functions missing from older PHP versions.
+ *
+ * @package PHP
+ * @access private
+ */
 
-/* Functions missing from older PHP versions */
-
-
-/* Added in PHP 4.2.0 */
+// Added in PHP 5.0
 
-if (!function_exists('floatval')) {
-	function floatval($string) {
-		return ((float) $string);
+if (!function_exists('http_build_query')) {
+	function http_build_query($data, $prefix=null, $sep=null) {
+		return _http_build_query($data, $prefix, $sep);
 	}
 }
 
-if (!function_exists('is_a')) {
-	function is_a($object, $class) {
-		// by Aidan Lister <aidan@php.net>
-		if (get_class($object) == strtolower($class)) {
-			return true;
-		} else {
-			return is_subclass_of($object, $class);
-		}
+// from php.net (modified by Mark Jaquith to behave like the native PHP5 function)
+function _http_build_query($data, $prefix=null, $sep=null, $key='', $urlencode=true) {
+	$ret = array();
+
+	foreach ( (array) $data as $k => $v ) {
+		if ( $urlencode)
+			$k = urlencode($k);
+		if ( is_int($k) && $prefix != null )
+			$k = $prefix.$k;
+		if ( !empty($key) )
+			$k = $key . '%5B' . $k . '%5D';
+		if ( $v === NULL )
+			continue;
+		elseif ( $v === FALSE )
+			$v = '0';
+
+		if ( is_array($v) || is_object($v) )
+			array_push($ret,_http_build_query($v, '', $sep, $k, $urlencode));
+		elseif ( $urlencode )
+			array_push($ret, $k.'='.urlencode($v));
+		else
+			array_push($ret, $k.'='.$v);
 	}
-}
-
-if (!function_exists('ob_clean')) {
-	function ob_clean() {
-		// by Aidan Lister <aidan@php.net>
-		if (@ob_end_clean()) {
-			return ob_start();
-		}
-		return false;
-	}
-}
 
+	if ( NULL === $sep )
+		$sep = ini_get('arg_separator.output');
 
-/* Added in PHP 4.3.0 */
+	return implode($sep, $ret);
+}
 
-function printr($var, $do_not_echo = false) {
-	// from php.net/print_r user contributed notes
-	ob_start();
-	print_r($var);
-	$code =  htmlentities(ob_get_contents());
-	ob_clean();
-	if (!$do_not_echo) {
-		echo "<pre>$code</pre>";
+if ( !function_exists('_') ) {
+	function _($string) {
+		return $string;
 	}
-	ob_end_clean();
-	return $code;
 }
 
-/* compatibility with PHP versions older than 4.3 */
-if ( !function_exists('file_get_contents') ) {
-	function file_get_contents( $file ) {
-		$file = file($file);
-		return !$file ? false : implode('', $file);
+if (!function_exists('stripos')) {
+	function stripos($haystack, $needle, $offset = 0) {
+		return strpos(strtolower($haystack), strtolower($needle), $offset);
 	}
 }
 
-if (!defined('CASE_LOWER')) {
-		define('CASE_LOWER', 0);
-}
+if ( ! function_exists('hash_hmac') ):
+function hash_hmac($algo, $data, $key, $raw_output = false) {
+	$packs = array('md5' => 'H32', 'sha1' => 'H40');
 
-if (!defined('CASE_UPPER')) {
-		define('CASE_UPPER', 1);
-}
+	if ( !isset($packs[$algo]) )
+		return false;
 
+	$pack = $packs[$algo];
 
-/**
- * Replace array_change_key_case()
- *
- * @category    PHP
- * @package     PHP_Compat
- * @link        http://php.net/function.array_change_key_case
- * @author      Stephan Schmidt <schst@php.net>
- * @author      Aidan Lister <aidan@php.net>
- * @version     $Revision: 5187 $
- * @since       PHP 4.2.0
- * @require     PHP 4.0.0 (user_error)
- */
-if (!function_exists('array_change_key_case')) {
-		function array_change_key_case($input, $case = CASE_LOWER)
-		{
-				if (!is_array($input)) {
-						user_error('array_change_key_case(): The argument should be an array',
-								E_USER_WARNING);
-						return false;
-				}
-
-				$output   = array ();
-				$keys     = array_keys($input);
-				$casefunc = ($case == CASE_LOWER) ? 'strtolower' : 'strtoupper';
-
-				foreach ($keys as $key) {
-						$output[$casefunc($key)] = $input[$key];
-				}
-
-				return $output;
-		}
-}
-
-// From php.net
-if(!function_exists('http_build_query')) {
-	 function http_build_query( $formdata, $numeric_prefix = null, $key = null ) {
-			 $res = array();
-			 foreach ((array)$formdata as $k=>$v) {
-					 $tmp_key = urlencode(is_int($k) ? $numeric_prefix.$k : $k);
-					 if ($key) $tmp_key = $key.'['.$tmp_key.']';
-					 $res[] = ( ( is_array($v) || is_object($v) ) ? http_build_query($v, null, $tmp_key) : $tmp_key."=".urlencode($v) );
-			 }
-			 $separator = ini_get('arg_separator.output');
-			 return implode($separator, $res);
-	 }
+	if (strlen($key) > 64)
+		$key = pack($pack, $algo($key));
+	else if (strlen($key) < 64)
+		$key = str_pad($key, 64, chr(0));
+
+	$ipad = (substr($key, 0, 64) ^ str_repeat(chr(0x36), 64));
+	$opad = (substr($key, 0, 64) ^ str_repeat(chr(0x5C), 64));
+
+	return $algo($opad . pack($pack, $algo($ipad . $data)));
 }
+endif;
 
-if ( !function_exists('_') ) {
-	function _($string) {
-		return $string;
+if ( ! function_exists('mb_strcut') ):
+	function mb_strcut( $str, $start, $length=null, $encoding=null ) {
+		return _mb_strcut($str, $start, $length, $encoding);
 	}
-}
+endif;
 
-// Added in PHP 5.0
-if (!function_exists('stripos')) {
-	function stripos($haystack, $needle, $offset = 0) {
-		return strpos(strtolower($haystack), strtolower($needle), $offset);
+function _mb_strcut( $str, $start, $length=null, $encoding=null ) {
+	// the solution below, works only for utf-8, so in case of a different
+	// charset, just use built-in substr
+	$charset = get_option( 'blog_charset' );
+	if ( !in_array( $charset, array('utf8', 'utf-8', 'UTF8', 'UTF-8') ) ) {
+		return is_null( $length )? substr( $str, $start ) : substr( $str, $start, $length);
 	}
+	// use the regex unicode support to separate the UTF-8 characters into an array
+	preg_match_all( '/./us', $str, $match );
+	$chars = is_null( $length )? array_slice( $match[0], $start ) : array_slice( $match[0], $start, $length );
+	return implode( '', $chars );
 }
 
 ?>
diff -x .svn -aruN 2.2.2.src/wp-includes/cron.php 2.5.src/wp-includes/cron.php
--- 2.2.2.src/wp-includes/cron.php	2007-04-16 15:47:23.000000000 -0500
+++ 2.5.src/wp-includes/cron.php	2007-08-29 12:57:06.000000000 -0500
@@ -83,18 +83,20 @@
 
 	$cron_url = get_option( 'siteurl' ) . '/wp-cron.php';
 	$parts = parse_url( $cron_url );
-	
+
 	if ($parts['scheme'] == 'https') {
 		// support for SSL was added in 4.3.0
 		if (version_compare(phpversion(), '4.3.0', '>=') && function_exists('openssl_open')) {
-			$argyle = @fsockopen('ssl://' . $parts['host'], $_SERVER['SERVER_PORT'], $errno, $errstr, 0.01);
+			$port = isset($parts['port']) ? $parts['port'] : 443;
+			$argyle = @fsockopen('ssl://' . $parts['host'], $port, $errno, $errstr, 0.01);
 		} else {
 			return false;
 		}
 	} else {
-		$argyle = @ fsockopen( $parts['host'], $_SERVER['SERVER_PORT'], $errno, $errstr, 0.01 );
+		$port = isset($parts['port']) ? $parts['port'] : 80;
+		$argyle = @ fsockopen( $parts['host'], $port, $errno, $errstr, 0.01 );
 	}
-	
+
 	if ( $argyle )
 		fputs( $argyle,
 			  "GET {$parts['path']}?check=" . wp_hash('187425') . " HTTP/1.0\r\n"
diff -x .svn -aruN 2.2.2.src/wp-includes/default-filters.php 2.5.src/wp-includes/default-filters.php
--- 2.2.2.src/wp-includes/default-filters.php	2007-05-12 17:37:07.000000000 -0500
+++ 2.5.src/wp-includes/default-filters.php	2008-03-23 12:02:11.000000000 -0500
@@ -1,133 +1,132 @@
 <?php
-
-// Some default filters
-add_filter('bloginfo','wp_specialchars');
-add_filter('category_description', 'wptexturize');
-add_filter('list_cats', 'wptexturize');
-add_filter('comment_author', 'wptexturize');
-add_filter('comment_text', 'wptexturize');
-add_filter('single_post_title', 'wptexturize');
-add_filter('the_title', 'wptexturize');
-add_filter('the_content', 'wptexturize');
-add_filter('the_excerpt', 'wptexturize');
-add_filter('bloginfo', 'wptexturize');
-
-// Comments, trackbacks, pingbacks
-add_filter('pre_comment_author_name', 'strip_tags');
-add_filter('pre_comment_author_name', 'trim');
-add_filter('pre_comment_author_name', 'wp_specialchars', 30);
-
-add_filter('pre_comment_author_email', 'trim');
-add_filter('pre_comment_author_email', 'sanitize_email');
-
-add_filter('pre_comment_author_url', 'strip_tags');
-add_filter('pre_comment_author_url', 'trim');
-add_filter('pre_comment_author_url', 'clean_url');
-
-add_filter('pre_comment_content', 'wp_rel_nofollow', 15);
-add_filter('pre_comment_content', 'balanceTags', 30);
-
-add_filter('pre_comment_author_name', 'wp_filter_kses');
-add_filter('pre_comment_author_email', 'wp_filter_kses');
-add_filter('pre_comment_author_url', 'wp_filter_kses');
-
-add_action('comment_form', 'wp_comment_form_unfiltered_html_nonce');
-
-// Default filters for these functions
-add_filter('comment_author', 'wptexturize');
-add_filter('comment_author', 'convert_chars');
-add_filter('comment_author', 'wp_specialchars');
-
-add_filter('comment_email', 'antispambot');
-
-add_filter('comment_flood_filter', 'wp_throttle_comment_flood', 10, 3);
-
-add_filter('comment_url', 'clean_url');
-
-add_filter('comment_text', 'convert_chars');
-add_filter('comment_text', 'make_clickable', 9);
-add_filter('comment_text', 'force_balance_tags', 25);
-add_filter('comment_text', 'wpautop', 30);
-add_filter('comment_text', 'convert_smilies', 20);
-
-add_filter('comment_excerpt', 'convert_chars');
-
-// Categories
-add_filter('pre_category_name', 'strip_tags');
-add_filter('pre_category_name', 'trim');
-add_filter('pre_category_name', 'wp_filter_kses');
-add_filter('pre_category_name', 'wp_specialchars', 30);
-add_filter('pre_category_description', 'wp_filter_kses');
-
-//Links
-add_filter('pre_link_name', 'strip_tags');
-add_filter('pre_link_name', 'trim');
-add_filter('pre_link_name', 'wp_filter_kses');
-add_filter('pre_link_name', 'wp_specialchars', 30);
-add_filter('pre_link_description', 'wp_filter_kses');
-add_filter('pre_link_notes', 'wp_filter_kses');
-add_filter('pre_link_url', 'strip_tags');
-add_filter('pre_link_url', 'trim');
-add_filter('pre_link_url', 'clean_url');
-add_filter('pre_link_image', 'strip_tags');
-add_filter('pre_link_image', 'trim');
-add_filter('pre_link_image', 'clean_url');
-add_filter('pre_link_rss', 'strip_tags');
-add_filter('pre_link_rss', 'trim');
-add_filter('pre_link_rss', 'clean_url');
-add_filter('pre_link_target', 'strip_tags');
-add_filter('pre_link_target', 'trim');
-add_filter('pre_link_target', 'wp_filter_kses');
-add_filter('pre_link_target', 'wp_specialchars', 30);
-add_filter('pre_link_rel', 'strip_tags');
-add_filter('pre_link_rel', 'trim');
-add_filter('pre_link_rel', 'wp_filter_kses');
-add_filter('pre_link_rel', 'wp_specialchars', 30);
-
-// Users
-add_filter('pre_user_display_name', 'strip_tags');
-add_filter('pre_user_display_name', 'trim');
-add_filter('pre_user_display_name', 'wp_filter_kses');
-add_filter('pre_user_display_name', 'wp_specialchars', 30);
-add_filter('pre_user_first_name', 'strip_tags');
-add_filter('pre_user_first_name', 'trim');
-add_filter('pre_user_first_name', 'wp_filter_kses');
-add_filter('pre_user_first_name', 'wp_specialchars', 30);
-add_filter('pre_user_last_name', 'strip_tags');
-add_filter('pre_user_last_name', 'trim');
-add_filter('pre_user_last_name', 'wp_filter_kses');
-add_filter('pre_user_last_name', 'wp_specialchars', 30);
-add_filter('pre_user_nickname', 'strip_tags');
-add_filter('pre_user_nickname', 'trim');
-add_filter('pre_user_nickname', 'wp_filter_kses');
-add_filter('pre_user_nickname', 'wp_specialchars', 30);
-add_filter('pre_user_description', 'trim');
-add_filter('pre_user_description', 'wp_filter_kses');
-add_filter('pre_user_url', 'strip_tags');
-add_filter('pre_user_url', 'trim');
-add_filter('pre_user_url', 'clean_url');
-add_filter('pre_user_email', 'trim');
-add_filter('pre_user_email', 'sanitize_email');
+/**
+ * Sets up the default filters and actions for most
+ * of the WordPress hooks.
+ *
+ * If you need to remove a default hook, this file will
+ * give you the priority for which to use to remove the
+ * hook.
+ *
+ * Not all of the default hooks are found in default-filters.php
+ *
+ * @package WordPress
+ */
+
+// Strip, trim, kses, special chars for string saves
+$filters = array('pre_term_name', 'pre_comment_author_name', 'pre_link_name', 'pre_link_target',
+	'pre_link_rel', 'pre_user_display_name', 'pre_user_first_name', 'pre_user_last_name',
+	'pre_user_nickname');
+foreach ( $filters as $filter ) {
+	add_filter($filter, 'strip_tags');
+	add_filter($filter, 'trim');
+	add_filter($filter, 'wp_filter_kses');
+	add_filter($filter, 'wp_specialchars', 30);
+}
+
+// Kses only for textarea saves
+$filters = array('pre_term_description', 'pre_link_description', 'pre_link_notes', 'pre_user_description');
+foreach ( $filters as $filter ) {
+	add_filter($filter, 'wp_filter_kses');
+}
+
+// Email
+$filters = array('pre_comment_author_email', 'pre_user_email');
+foreach ( $filters as $filter ) {
+	add_filter($filter, 'trim');
+	add_filter($filter, 'sanitize_email');
+	add_filter($filter, 'wp_filter_kses');
+}
+
+// Save URL
+$filters = array('pre_comment_author_url', 'pre_user_url', 'pre_link_url', 'pre_link_image',
+	'pre_link_rss');
+foreach ( $filters as $filter ) {
+	add_filter($filter, 'strip_tags');
+	add_filter($filter, 'trim');
+	add_filter($filter, 'sanitize_url');
+	add_filter($filter, 'wp_filter_kses');
+}
+
+// Display URL
+$filters = array('user_url', 'link_url', 'link_image', 'link_rss', 'comment_url');
+foreach ( $filters as $filter ) {
+	add_filter($filter, 'strip_tags');
+	add_filter($filter, 'trim');
+	add_filter($filter, 'clean_url');
+	add_filter($filter, 'wp_filter_kses');
+}
+
+// Slugs
+$filters = array('pre_term_slug');
+foreach ( $filters as $filter ) {
+	add_filter($filter, 'sanitize_title');
+}
+
+// Keys
+$filters = array('pre_post_type');
+foreach ( $filters as $filter ) {
+	add_filter($filter, 'sanitize_user');
+}
 
 // Places to balance tags on input
-add_filter('content_save_pre', 'balanceTags', 50);
-add_filter('excerpt_save_pre', 'balanceTags', 50);
-add_filter('comment_save_pre', 'balanceTags', 50);
+$filters = array('content_save_pre', 'excerpt_save_pre', 'comment_save_pre', 'pre_comment_content');
+foreach ( $filters as $filter ) {
+	add_filter( $filter, 'balanceTags', 50);
+}
+
+// Format strings for display.
+$filters = array('comment_author', 'term_name', 'link_name', 'link_description',
+	'link_notes', 'bloginfo', 'wp_title');
+foreach ( $filters as $filter ) {
+	add_filter($filter, 'wptexturize');
+	add_filter($filter, 'convert_chars');
+	add_filter($filter, 'wp_specialchars');
+}
+
+// Format text area for display.
+$filters = array('term_description');
+foreach ( $filters as $filter ) {
+	add_filter($filter, 'wptexturize');
+	add_filter($filter, 'convert_chars');
+	add_filter($filter, 'wpautop');
+}
+
+// Format for RSS
+$filters = array('term_name_rss');
+foreach ( $filters as $filter ) {
+	add_filter($filter, 'convert_chars');
+}
 
-// Misc. title, content, and excerpt filters
+// Display filters
+add_filter('the_title', 'wptexturize');
 add_filter('the_title', 'convert_chars');
 add_filter('the_title', 'trim');
 
+add_filter('the_content', 'wptexturize');
 add_filter('the_content', 'convert_smilies');
 add_filter('the_content', 'convert_chars');
 add_filter('the_content', 'wpautop');
+add_filter('the_content', 'prepend_attachment');
 
+add_filter('the_excerpt', 'wptexturize');
 add_filter('the_excerpt', 'convert_smilies');
 add_filter('the_excerpt', 'convert_chars');
 add_filter('the_excerpt', 'wpautop');
 add_filter('get_the_excerpt', 'wp_trim_excerpt');
 
-add_filter('sanitize_title', 'sanitize_title_with_dashes');
+add_filter('comment_text', 'wptexturize');
+add_filter('comment_text', 'convert_chars');
+add_filter('comment_text', 'make_clickable', 9);
+add_filter('comment_text', 'force_balance_tags', 25);
+add_filter('comment_text', 'convert_smilies', 20);
+add_filter('comment_text', 'wpautop', 30);
+
+add_filter('comment_excerpt', 'convert_chars');
+
+add_filter('list_cats', 'wptexturize');
+add_filter('single_post_title', 'wptexturize');
+
+add_filter('wp_sprintf', 'wp_sprintf_l', 10, 2);
 
 // RSS filters
 add_filter('the_title_rss', 'strip_tags');
@@ -137,8 +136,8 @@
 add_filter('the_excerpt_rss', 'convert_chars');
 add_filter('the_excerpt_rss', 'ent2ncr', 8);
 add_filter('comment_author_rss', 'ent2ncr', 8);
-add_filter('comment_text_rss', 'wp_specialchars');
 add_filter('comment_text_rss', 'ent2ncr', 8);
+add_filter('comment_text_rss', 'wp_specialchars');
 add_filter('bloginfo_rss', 'ent2ncr', 8);
 add_filter('the_author', 'ent2ncr', 8);
 
@@ -147,20 +146,25 @@
 add_filter('option_blog_charset', 'wp_specialchars');
 add_filter('option_home', '_config_wp_home');
 add_filter('option_siteurl', '_config_wp_siteurl');
-add_filter('mce_plugins', '_mce_load_rtl_plugin');
-add_filter('mce_buttons', '_mce_add_direction_buttons');
+add_filter('tiny_mce_before_init', '_mce_set_direction');
+add_filter('pre_kses', 'wp_pre_kses_less_than');
+add_filter('sanitize_title', 'sanitize_title_with_dashes');
+add_action('check_comment_flood', 'check_comment_flood_db', 10, 3);
+add_filter('comment_flood_filter', 'wp_throttle_comment_flood', 10, 3);
+add_filter('pre_comment_content', 'wp_rel_nofollow', 15);
+add_filter('comment_email', 'antispambot');
 
-// Redirect Old Slugs
-add_action('template_redirect', 'wp_old_slug_redirect');
-add_action('edit_post', 'wp_check_for_changed_slugs');
-add_action('edit_form_advanced', 'wp_remember_old_slug');
+//Atom SSL support
+add_filter('atom_service_url','atom_service_url_filter');
 
 // Actions
 add_action('wp_head', 'rsd_link');
+add_action('wp_head', 'wlwmanifest_link');
 add_action('wp_head', 'locale_stylesheet');
-add_action('publish_future_post', 'wp_publish_post', 10, 1);
+add_action('publish_future_post', 'check_and_publish_future_post', 10, 1);
 add_action('wp_head', 'noindex', 1);
 add_action('wp_head', 'wp_print_scripts');
+add_action('wp_head', 'wp_generator');
 if(!defined('DOING_CRON'))
 	add_action('init', 'wp_cron');
 add_action('do_feed_rdf', 'do_feed_rdf', 10, 1);
@@ -171,9 +175,18 @@
 add_action('do_robots', 'do_robots');
 add_action('sanitize_comment_cookies', 'sanitize_comment_cookies');
 add_action('admin_print_scripts', 'wp_print_scripts', 20);
-add_action('mce_options', '_mce_set_direction');
 add_action('init', 'smilies_init', 5);
 add_action( 'plugins_loaded', 'wp_maybe_load_widgets', 0 );
 add_action( 'shutdown', 'wp_ob_end_flush_all', 1);
+add_action('publish_post', '_publish_post_hook', 5, 1);
+add_action('future_post', '_future_post_hook', 5, 2);
+add_action('future_page', '_future_post_hook', 5, 2);
+add_action('save_post', '_save_post_hook', 5, 2);
+add_action('transition_post_status', '_transition_post_status', 5, 3);
+add_action('comment_form', 'wp_comment_form_unfiltered_html_nonce');
+// Redirect Old Slugs
+add_action('template_redirect', 'wp_old_slug_redirect');
+add_action('edit_post', 'wp_check_for_changed_slugs');
+add_action('edit_form_advanced', 'wp_remember_old_slug');
 
-?>
\ No newline at end of file
+?>
diff -x .svn -aruN 2.2.2.src/wp-includes/deprecated.php 2.5.src/wp-includes/deprecated.php
--- 2.2.2.src/wp-includes/deprecated.php	2007-01-23 03:15:17.000000000 -0600
+++ 2.5.src/wp-includes/deprecated.php	2008-03-02 14:17:30.000000000 -0600
@@ -1,25 +1,93 @@
 <?php
+/**
+ * Deprecated functions from past WordPress versions
+ * @package WordPress
+ * @subpackage Deprecated
+ */
 
 /*
  * Deprecated global variables.
  */
 
+/**
+ * The name of the Posts table
+ * @global string $tableposts
+ * @deprecated Use $wpdb->posts
+ */
 $tableposts = $wpdb->posts;
+
+/**
+ * The name of the Users table
+ * @global string $tableusers
+ * @deprecated Use $wpdb->users
+ */
 $tableusers = $wpdb->users;
+
+/**
+ * The name of the Categories table
+ * @global string $tablecategories
+ * @deprecated Use $wpdb->categories
+ */
 $tablecategories = $wpdb->categories;
+
+/**
+ * The name of the post to category table
+ * @global string $tablepost2cat
+ * @deprecated Use $wpdb->post2cat;
+ */
 $tablepost2cat = $wpdb->post2cat;
+
+/**
+ * The name of the comments table
+ * @global string $tablecomments
+ * @deprecated Use $wpdb->comments;
+ */
 $tablecomments = $wpdb->comments;
+
+/**
+ * The name of the links table
+ * @global string $tablelinks
+ * @deprecated Use $wpdb->links;
+ */
 $tablelinks = $wpdb->links;
+
+/**
+ * @global string $tablelinkcategories
+ * @deprecated Not used anymore;
+ */
 $tablelinkcategories = 'linkcategories_is_gone';
+
+/**
+ * The name of the options table
+ * @global string $tableoptions
+ * @deprecated Use $wpdb->options;
+ */
 $tableoptions = $wpdb->options;
+
+/**
+ * The name of the postmeta table
+ * @global string $tablepostmeta
+ * @deprecated Use $wpdb->postmeta;
+ */
 $tablepostmeta = $wpdb->postmeta;
 
 /*
  * Deprecated functions come here to die.
  */
 
-// Use get_post().
+/**
+ * get_postdata() - Entire Post data
+ *
+ * @since 0.71
+ * @deprecated Use get_post()
+ * @see get_post()
+ *
+ * @param int $postid
+ * @return array
+ */
 function get_postdata($postid) {
+	_deprecated_function(__FUNCTION__, '0.0', 'get_post()');
+
 	$post = &get_post($postid);
 
 	$postdata = array (
@@ -43,20 +111,39 @@
 	return $postdata;
 }
 
-// Use the new post loop.
+/**
+ * start_wp() - Sets up the WordPress Loop
+ *
+ * @since 1.0.1
+ * @deprecated Since 1.5 - {@link http://codex.wordpress.org/The_Loop Use new WordPress Loop}
+ */
 function start_wp() {
 	global $wp_query, $post;
 
+	_deprecated_function(__FUNCTION__, '1.5', __('new WordPress Loop') );
+
 	// Since the old style loop is being used, advance the query iterator here.
 	$wp_query->next_post();
 
 	setup_postdata($post);
 }
 
+/**
+ * the_category_ID() - Return or Print Category ID
+ *
+ * @since 0.71
+ * @deprecated use get_the_category()
+ * @see get_the_category()
+ *
+ * @param bool $echo
+ * @return null|int
+ */
 function the_category_ID($echo = true) {
+	_deprecated_function(__FUNCTION__, '0.0', 'get_the_category()');
+
 	// Grab the first cat in the list.
 	$categories = get_the_category();
-	$cat = $categories[0]->cat_ID;
+	$cat = $categories[0]->term_id;
 
 	if ( $echo )
 		echo $cat;
@@ -64,8 +151,21 @@
 	return $cat;
 }
 
+/**
+ * the_category_head() - Print category with optional text before and after
+ *
+ * @since 0.71
+ * @deprecated use get_the_category_by_ID()
+ * @see get_the_category_by_ID()
+ *
+ * @param string $before
+ * @param string $after
+ */
 function the_category_head($before='', $after='') {
 	global $currentcat, $previouscat;
+
+	_deprecated_function(__FUNCTION__, '0.0', 'get_the_category_by_ID()');
+
 	// Grab the first cat in the list.
 	$categories = get_the_category();
 	$currentcat = $categories[0]->category_id;
@@ -77,9 +177,24 @@
 	}
 }
 
-// Use previous_post_link().
+/**
+ * previous_post() - Prints link to the previous post
+ *
+ * @since 1.5
+ * @deprecated Use previous_post_link()
+ * @see previous_post_link()
+ *
+ * @param string $format
+ * @param string $previous
+ * @param string $title
+ * @param string $in_same_cat
+ * @param int $limitprev
+ * @param string $excluded_categories
+ */
 function previous_post($format='%', $previous='previous post: ', $title='yes', $in_same_cat='no', $limitprev=1, $excluded_categories='') {
 
+	_deprecated_function(__FUNCTION__, '0.0', 'previous_post_link()');
+
 	if ( empty($in_same_cat) || 'no' == $in_same_cat )
 		$in_same_cat = false;
 	else
@@ -98,8 +213,22 @@
 	echo $format;
 }
 
-// Use next_post_link().
+/**
+ * next_post() - Prints link to the next post
+ *
+ * @since 0.71
+ * @deprecated Use next_post_link()
+ * @see next_post_link()
+ *
+ * @param string $format
+ * @param string $previous
+ * @param string $title
+ * @param string $in_same_cat
+ * @param int $limitprev
+ * @param string $excluded_categories
+ */
 function next_post($format='%', $next='next post: ', $title='yes', $in_same_cat='no', $limitnext=1, $excluded_categories='') {
+	_deprecated_function(__FUNCTION__, '0.0', 'next_post_link()');
 
 	if ( empty($in_same_cat) || 'no' == $in_same_cat )
 		$in_same_cat = false;
@@ -119,24 +248,59 @@
 	echo $format;
 }
 
-//
-// Use current_user_can() for these.
-//
-
-/* returns true if $user_id can create a new post */
+/**
+ * user_can_create_post() - Whether user can create a post
+ *
+ * @since 1.5
+ * @deprecated Use current_user_can()
+ * @see current_user_can()
+ *
+ * @param int $user_id
+ * @param int $blog_id Not Used
+ * @param int $category_id Not Used
+ * @return bool
+ */
 function user_can_create_post($user_id, $blog_id = 1, $category_id = 'None') {
+	_deprecated_function(__FUNCTION__, '0.0', 'current_user_can()');
+
 	$author_data = get_userdata($user_id);
 	return ($author_data->user_level > 1);
 }
 
-/* returns true if $user_id can create a new post */
+/**
+ * user_can_create_draft() - Whether user can create a post
+ *
+ * @since 1.5
+ * @deprecated Use current_user_can()
+ * @see current_user_can()
+ *
+ * @param int $user_id
+ * @param int $blog_id Not Used
+ * @param int $category_id Not Used
+ * @return bool
+ */
 function user_can_create_draft($user_id, $blog_id = 1, $category_id = 'None') {
+	_deprecated_function(__FUNCTION__, '0.0', 'current_user_can()');
+
 	$author_data = get_userdata($user_id);
 	return ($author_data->user_level >= 1);
 }
 
-/* returns true if $user_id can edit $post_id */
+/**
+ * user_can_edit_post() - Whether user can edit a post
+ *
+ * @since 1.5
+ * @deprecated Use current_user_can()
+ * @see current_user_can()
+ *
+ * @param int $user_id
+ * @param int $post_id
+ * @param int $blog_id Not Used
+ * @return bool
+ */
 function user_can_edit_post($user_id, $post_id, $blog_id = 1) {
+	_deprecated_function(__FUNCTION__, '0', 'current_user_can()');
+
 	$author_data = get_userdata($user_id);
 	$post = get_post($post_id);
 	$post_author_data = get_userdata($post->post_author);
@@ -150,37 +314,118 @@
 	}
 }
 
-/* returns true if $user_id can delete $post_id */
+/**
+ * user_can_delete_post() - Whether user can delete a post
+ *
+ * @since 1.5
+ * @deprecated Use current_user_can()
+ * @see current_user_can()
+ *
+ * @param int $user_id
+ * @param int $post_id
+ * @param int $blog_id Not Used
+ * @return bool
+ */
 function user_can_delete_post($user_id, $post_id, $blog_id = 1) {
+	_deprecated_function(__FUNCTION__, '0.0', 'current_user_can()');
+
 	// right now if one can edit, one can delete
 	return user_can_edit_post($user_id, $post_id, $blog_id);
 }
 
-/* returns true if $user_id can set new posts' dates on $blog_id */
+/**
+ * user_can_set_post_date() - Whether user can set new posts' dates
+ *
+ * @since 1.5
+ * @deprecated Use current_user_can()
+ * @see current_user_can()
+ *
+ * @param int $user_id
+ * @param int $blog_id Not Used
+ * @param int $category_id Not Used
+ * @return bool
+ */
 function user_can_set_post_date($user_id, $blog_id = 1, $category_id = 'None') {
+	_deprecated_function(__FUNCTION__, '0.0', 'current_user_can()');
+
 	$author_data = get_userdata($user_id);
 	return (($author_data->user_level > 4) && user_can_create_post($user_id, $blog_id, $category_id));
 }
 
 /* returns true if $user_id can edit $post_id's date */
+/**
+ * user_can_edit_post_date() - Whether user can delete a post
+ *
+ * @since 1.5
+ * @deprecated Use current_user_can()
+ * @see current_user_can()
+ *
+ * @param int $user_id
+ * @param int $post_id
+ * @param int $blog_id Not Used
+ * @return bool
+ */
 function user_can_edit_post_date($user_id, $post_id, $blog_id = 1) {
+	_deprecated_function(__FUNCTION__, '0.0', 'current_user_can()');
+
 	$author_data = get_userdata($user_id);
 	return (($author_data->user_level > 4) && user_can_edit_post($user_id, $post_id, $blog_id));
 }
 
 /* returns true if $user_id can edit $post_id's comments */
+/**
+ * user_can_edit_post_comments() - Whether user can delete a post
+ *
+ * @since 1.5
+ * @deprecated Use current_user_can()
+ * @see current_user_can()
+ *
+ * @param int $user_id
+ * @param int $post_id
+ * @param int $blog_id Not Used
+ * @return bool
+ */
 function user_can_edit_post_comments($user_id, $post_id, $blog_id = 1) {
+	_deprecated_function(__FUNCTION__, '0.0', 'current_user_can()');
+
 	// right now if one can edit a post, one can edit comments made on it
 	return user_can_edit_post($user_id, $post_id, $blog_id);
 }
 
 /* returns true if $user_id can delete $post_id's comments */
+/**
+ * user_can_delete_post_comments() - Whether user can delete a post
+ *
+ * @since 1.5
+ * @deprecated Use current_user_can()
+ * @see current_user_can()
+ *
+ * @param int $user_id
+ * @param int $post_id
+ * @param int $blog_id Not Used
+ * @return bool
+ */
 function user_can_delete_post_comments($user_id, $post_id, $blog_id = 1) {
+	_deprecated_function(__FUNCTION__, '0.0', 'current_user_can()');
+
 	// right now if one can edit comments, one can delete comments
 	return user_can_edit_post_comments($user_id, $post_id, $blog_id);
 }
 
+/**
+ * user_can_edit_user() - Can user can edit other user
+ *
+ * @since 1.5
+ * @deprecated Use current_user_can()
+ * @see current_user_can()
+ *
+ * @param int $user_id
+ * @param int $other_user
+ * @return bool
+ */
 function user_can_edit_user($user_id, $other_user) {
+	_deprecated_function(__FUNCTION__, '0.0', 'current_user_can()');
+
 	$user  = get_userdata($user_id);
 	$other = get_userdata($other_user);
 	if ( $user->user_level > $other->user_level || $user->user_level > 8 || $user->ID == $other->ID )
@@ -189,248 +434,263 @@
 		return false;
 }
 
-/** function get_linksbyname()
- ** Gets the links associated with category 'cat_name'.
- ** Parameters:
- **   cat_name (default 'noname')  - The category name to use. If no
- **     match is found uses all
- **   before (default '')  - the html to output before the link
- **   after (default '<br />')  - the html to output after the link
- **   between (default ' ')  - the html to output between the link/image
- **     and it's description. Not used if no image or show_images == true
- **   show_images (default true) - whether to show images (if defined).
- **   orderby (default 'id') - the order to output the links. E.g. 'id', 'name',
- **     'url', 'description' or 'rating'. Or maybe owner. If you start the
- **     name with an underscore the order will be reversed.
- **     You can also specify 'rand' as the order which will return links in a
- **     random order.
- **   show_description (default true) - whether to show the description if
- **     show_images=false/not defined
- **   show_rating (default false) - show rating stars/chars
- **   limit (default -1) - Limit to X entries. If not specified, all entries
- **     are shown.
- **   show_updated (default 0) - whether to show last updated timestamp
- */
-function get_linksbyname($cat_name = "noname", $before = '', $after = '<br />',
-												 $between = " ", $show_images = true, $orderby = 'id',
-												 $show_description = true, $show_rating = false,
-												 $limit = -1, $show_updated = 0) {
-		global $wpdb;
-		$cat_id = -1;
-		$results = $wpdb->get_results("SELECT cat_ID FROM $wpdb->categories WHERE cat_name='$cat_name'");
-		if ($results) {
-				foreach ($results as $result) {
-						$cat_id = $result->cat_ID;
-				}
-		}
-		get_links($cat_id, $before, $after, $between, $show_images, $orderby,
-							$show_description, $show_rating, $limit, $show_updated);
-}
-
-/** function wp_get_linksbyname()
- ** Gets the links associated with the named category.
- ** Parameters:
- **   category (no default)  - The category to use.
- **/
+/**
+ * get_linksbyname() - Gets the links associated with category $cat_name.
+ *
+ * @since 0.71
+ * @deprecated Use get_links()
+ * @see get_links()
+ *
+ * @param string 	$cat_name 	Optional. The category name to use. If no match is found uses all.
+ * @param string 	$before 	Optional. The html to output before the link.
+ * @param string 	$after 		Optional. The html to output after the link.
+ * @param string 	$between 	Optional. The html to output between the link/image and it's description. Not used if no image or $show_images is true.
+ * @param bool 		$show_images Optional. Whether to show images (if defined).
+ * @param string 	$orderby	Optional. The order to output the links. E.g. 'id', 'name', 'url', 'description' or 'rating'. Or maybe owner.
+ *		If you start the name with an underscore the order will be reversed. You can also specify 'rand' as the order which will return links in a
+ *		random order.
+ * @param bool 		$show_description Optional. Whether to show the description if show_images=false/not defined.
+ * @param bool 		$show_rating Optional. Show rating stars/chars.
+ * @param int 		$limit		Optional. Limit to X entries. If not specified, all entries are shown.
+ * @param int 		$show_updated Optional. Whether to show last updated timestamp
+ */
+function get_linksbyname($cat_name = "noname", $before = '', $after = '<br />', $between = " ", $show_images = true, $orderby = 'id',
+						 $show_description = true, $show_rating = false,
+						 $limit = -1, $show_updated = 0) {
+	_deprecated_function(__FUNCTION__, '0.0', 'get_links()');
+
+	$cat_id = -1;
+	$cat = get_term_by('name', $cat_name, 'link_category');
+	if ( $cat )
+		$cat_id = $cat->term_id;
+
+	get_links($cat_id, $before, $after, $between, $show_images, $orderby, $show_description, $show_rating, $limit, $show_updated);
+}
+
+/**
+ * wp_get_linksbyname() - Gets the links associated with the named category.
+ *
+ * @since 1.0.1
+ * @deprecated Use wp_get_links()
+ * @see wp_get_links()
+ *
+ * @param string $category The category to use.
+ * @param string $args
+ * @return bool|null
+ */
 function wp_get_linksbyname($category, $args = '') {
-	global $wpdb;
+	_deprecated_function(__FUNCTION__, '0.0', 'wp_get_links()');
 
-	$cat_id = $wpdb->get_var("SELECT cat_ID FROM $wpdb->categories WHERE cat_name='$category' LIMIT 1");
-
-	if (! $cat_id)
-		return;
+	$cat = get_term_by('name', $category, 'link_category');
+	if ( !$cat )
+		return false;
+	$cat_id = $cat->term_id;
 
 	$args = add_query_arg('category', $cat_id, $args);
 	wp_get_links($args);
 }
 
-/** function get_linkobjectsbyname()
- ** Gets an array of link objects associated with category 'cat_name'.
- ** Parameters:
- **   cat_name (default 'noname')  - The category name to use. If no
- **     match is found uses all
- **   orderby (default 'id') - the order to output the links. E.g. 'id', 'name',
- **     'url', 'description', or 'rating'. Or maybe owner. If you start the
- **     name with an underscore the order will be reversed.
- **     You can also specify 'rand' as the order which will return links in a
- **     random order.
- **   limit (default -1) - Limit to X entries. If not specified, all entries
- **     are shown.
- **
- ** Use this like:
- ** $links = get_linkobjectsbyname('fred');
- ** foreach ($links as $link) {
- **   echo '<li>'.$link->link_name.'</li>';
- ** }
- **/
-// Deprecate in favor of get_linkz().
+/**
+ * get_linkobjectsbyname() - Gets an array of link objects associated with category $cat_name.
+ *
+ * <code>
+ *	$links = get_linkobjectsbyname('fred');
+ *	foreach ($links as $link) {
+ * 		echo '<li>'.$link->link_name.'</li>';
+ *	}
+ * </code>
+ *
+ * @since 1.0.1
+ * @deprecated Use get_linkobjects()
+ * @see get_linkobjects()
+ *
+ * @param string $cat_name The category name to use. If no match is found uses all.
+ * @param string $orderby The order to output the links. E.g. 'id', 'name', 'url', 'description', or 'rating'.
+ *		Or maybe owner. If you start the name with an underscore the order will be reversed. You can also
+ *		specify 'rand' as the order which will return links in a random order.
+ * @param int $limit Limit to X entries. If not specified, all entries are shown.
+ * @return unknown
+ */
 function get_linkobjectsbyname($cat_name = "noname" , $orderby = 'name', $limit = -1) {
-		global $wpdb;
-		$cat_id = -1;
-		//$results = $wpdb->get_results("SELECT cat_id FROM $wpdb->linkcategories WHERE cat_name='$cat_name'");
-		// TODO: Fix me.
-		if ($results) {
-				foreach ($results as $result) {
-						$cat_id = $result->cat_id;
-				}
-		}
-		return get_linkobjects($cat_id, $orderby, $limit);
-}
+	_deprecated_function(__FUNCTION__, '0.0', 'get_linkobjects()');
 
-/** function get_linkobjects()
- ** Gets an array of link objects associated with category n.
- ** Parameters:
- **   category (default -1)  - The category to use. If no category supplied
- **      uses all
- **   orderby (default 'id') - the order to output the links. E.g. 'id', 'name',
- **     'url', 'description', or 'rating'. Or maybe owner. If you start the
- **     name with an underscore the order will be reversed.
- **     You can also specify 'rand' as the order which will return links in a
- **     random order.
- **   limit (default -1) - Limit to X entries. If not specified, all entries
- **     are shown.
- **
- ** Use this like:
- ** $links = get_linkobjects(1);
- ** if ($links) {
- **   foreach ($links as $link) {
- **     echo '<li>'.$link->link_name.'<br />'.$link->link_description.'</li>';
- **   }
- ** }
- ** Fields are:
- ** link_id
- ** link_url
- ** link_name
- ** link_image
- ** link_target
- ** link_category
- ** link_description
- ** link_visible
- ** link_owner
- ** link_rating
- ** link_updated
- ** link_rel
- ** link_notes
- **/
-// Deprecate in favor of get_linkz().
-function get_linkobjects($category = -1, $orderby = 'name', $limit = -1) {
-		global $wpdb;
-
-		$sql = "SELECT * FROM $wpdb->links WHERE link_visible = 'Y'";
-		if ($category != -1) {
-				$sql .= " AND link_category = $category ";
-		}
-		if ($orderby == '')
-				$orderby = 'id';
-		if (substr($orderby,0,1) == '_') {
-				$direction = ' DESC';
-				$orderby = substr($orderby,1);
-		}
-		if (strcasecmp('rand',$orderby) == 0) {
-				$orderby = 'rand()';
-		} else {
-				$orderby = " link_" . $orderby;
-		}
-		$sql .= ' ORDER BY ' . $orderby;
-		$sql .= $direction;
-		/* The next 2 lines implement LIMIT TO processing */
-		if ($limit != -1)
-				$sql .= " LIMIT $limit";
-
-		$results = $wpdb->get_results($sql);
-		if ($results) {
-				foreach ($results as $result) {
-						$result->link_url         = $result->link_url;
-						$result->link_name        = $result->link_name;
-						$result->link_description = $result->link_description;
-						$result->link_notes       = $result->link_notes;
-						$newresults[] = $result;
-				}
-		}
-		return $newresults;
+	$cat_id = -1;
+	$cat = get_term_by('name', $cat_name, 'link_category');
+	if ( $cat )
+		$cat_id = $cat->term_id;
+
+	return get_linkobjects($cat_id, $orderby, $limit);
+}
+
+/**
+ * get_linkobjects() - Gets an array of link objects associated with category n.
+ *
+ * Usage:
+ * <code>
+ *	$links = get_linkobjects(1);
+ *	if ($links) {
+ *		foreach ($links as $link) {
+ *			echo '<li>'.$link->link_name.'<br />'.$link->link_description.'</li>';
+ *		}
+ *	}
+ * </code>
+ *
+ * Fields are:
+ * <ol>
+ *	<li>link_id</li>
+ *	<li>link_url</li>
+ *	<li>link_name</li>
+ *	<li>link_image</li>
+ *	<li>link_target</li>
+ *	<li>link_category</li>
+ *	<li>link_description</li>
+ *	<li>link_visible</li>
+ *	<li>link_owner</li>
+ *	<li>link_rating</li>
+ *	<li>link_updated</li>
+ *	<li>link_rel</li>
+ *	<li>link_notes</li>
+ * </ol>
+ *
+ * @since 1.0.1
+ * @deprecated Use get_bookmarks()
+ * @see get_bookmarks()
+ *
+ * @param int $category The category to use. If no category supplied uses all
+ * @param string $orderby the order to output the links. E.g. 'id', 'name', 'url',
+ *		'description', or 'rating'. Or maybe owner. If you start the name with an
+ *		underscore the order will be reversed. You can also specify 'rand' as the
+ *		order which will return links in a random order.
+ * @param int $limit Limit to X entries. If not specified, all entries are shown.
+ * @return unknown
+ */
+function get_linkobjects($category = 0, $orderby = 'name', $limit = 0) {
+	_deprecated_function(__FUNCTION__, '0.0', 'get_bookmarks()');
+
+	$links = get_bookmarks("category=$category&orderby=$orderby&limit=$limit");
+
+	$links_array = array();
+	foreach ($links as $link)
+		$links_array[] = $link;
+
+	return $links_array;
+}
+
+/**
+ * get_linksbyname_withrating() - Gets the links associated with category 'cat_name' and display rating stars/chars.
+ *
+ * @since 0.71
+ * @deprecated Use get_bookmarks()
+ * @see get_bookmarks()
+ *
+ * @param string $cat_name The category name to use. If no match is found uses all
+ * @param string $before The html to output before the link
+ * @param string $after The html to output after the link
+ * @param string $between The html to output between the link/image and it's description. Not used if no image or show_images is true
+ * @param bool $show_images Whether to show images (if defined).
+ * @param string $orderby the order to output the links. E.g. 'id', 'name', 'url',
+ *		'description', or 'rating'. Or maybe owner. If you start the name with an
+ *		underscore the order will be reversed. You can also specify 'rand' as the
+ *		order which will return links in a random order.
+ * @param bool $show_description Whether to show the description if show_images=false/not defined
+ * @param int $limit Limit to X entries. If not specified, all entries are shown.
+ * @param int $show_updated Whether to show last updated timestamp
+ */
+function get_linksbyname_withrating($cat_name = "noname", $before = '', $after = '<br />', $between = " ",
+									$show_images = true, $orderby = 'id', $show_description = true, $limit = -1, $show_updated = 0) {
+	_deprecated_function(__FUNCTION__, '0.0', 'get_bookmarks()');
+
+	get_linksbyname($cat_name, $before, $after, $between, $show_images, $orderby, $show_description, true, $limit, $show_updated);
+}
+
+/**
+ * get_links_withrating() - Gets the links associated with category n and display rating stars/chars.
+ *
+ * @since 0.71
+ * @deprecated Use get_bookmarks()
+ * @see get_bookmarks()
+ *
+ * @param int $category The category to use. If no category supplied uses all
+ * @param string $before The html to output before the link
+ * @param string $after The html to output after the link
+ * @param string $between The html to output between the link/image and it's description. Not used if no image or show_images == true
+ * @param bool $show_images Whether to show images (if defined).
+ * @param string $orderby The order to output the links. E.g. 'id', 'name', 'url',
+ *		'description', or 'rating'. Or maybe owner. If you start the name with an
+ *		underscore the order will be reversed. You can also specify 'rand' as the
+ *		order which will return links in a random order.
+ * @param bool $show_description Whether to show the description if show_images=false/not defined.
+ * @param string $limit Limit to X entries. If not specified, all entries are shown.
+ * @param int $show_updated Whether to show last updated timestamp
+ */
+function get_links_withrating($category = -1, $before = '', $after = '<br />', $between = " ", $show_images = true,
+							  $orderby = 'id', $show_description = true, $limit = -1, $show_updated = 0) {
+	_deprecated_function(__FUNCTION__, '0.0', 'get_bookmarks()');
+
+	get_links($category, $before, $after, $between, $show_images, $orderby, $show_description, true, $limit, $show_updated);
 }
 
-/** function get_linksbyname_withrating()
- ** Gets the links associated with category 'cat_name' and display rating stars/chars.
- ** Parameters:
- **   cat_name (default 'noname')  - The category name to use. If no
- **     match is found uses all
- **   before (default '')  - the html to output before the link
- **   after (default '<br />')  - the html to output after the link
- **   between (default ' ')  - the html to output between the link/image
- **     and it's description. Not used if no image or show_images == true
- **   show_images (default true) - whether to show images (if defined).
- **   orderby (default 'id') - the order to output the links. E.g. 'id', 'name',
- **     'url' or 'description'. Or maybe owner. If you start the
- **     name with an underscore the order will be reversed.
- **     You can also specify 'rand' as the order which will return links in a
- **     random order.
- **   show_description (default true) - whether to show the description if
- **     show_images=false/not defined
- **   limit (default -1) - Limit to X entries. If not specified, all entries
- **     are shown.
- **   show_updated (default 0) - whether to show last updated timestamp
- */
-function get_linksbyname_withrating($cat_name = "noname", $before = '',
-																		$after = '<br />', $between = " ",
-																		$show_images = true, $orderby = 'id',
-																		$show_description = true, $limit = -1, $show_updated = 0) {
-
-		get_linksbyname($cat_name, $before, $after, $between, $show_images,
-										$orderby, $show_description, true, $limit, $show_updated);
-}
-
-/** function get_links_withrating()
- ** Gets the links associated with category n and display rating stars/chars.
- ** Parameters:
- **   category (default -1)  - The category to use. If no category supplied
- **      uses all
- **   before (default '')  - the html to output before the link
- **   after (default '<br />')  - the html to output after the link
- **   between (default ' ')  - the html to output between the link/image
- **     and it's description. Not used if no image or show_images == true
- **   show_images (default true) - whether to show images (if defined).
- **   orderby (default 'id') - the order to output the links. E.g. 'id', 'name',
- **     'url' or 'description'. Or maybe owner. If you start the
- **     name with an underscore the order will be reversed.
- **     You can also specify 'rand' as the order which will return links in a
- **     random order.
- **   show_description (default true) - whether to show the description if
- **    show_images=false/not defined .
- **   limit (default -1) - Limit to X entries. If not specified, all entries
- **     are shown.
- **   show_updated (default 0) - whether to show last updated timestamp
- */
-function get_links_withrating($category = -1, $before = '', $after = '<br />',
-															$between = " ", $show_images = true,
-															$orderby = 'id', $show_description = true,
-															$limit = -1, $show_updated = 0) {
-
-		get_links($category, $before, $after, $between, $show_images, $orderby,
-							$show_description, true, $limit, $show_updated);
-}
-
-/** function get_get_autotoggle()
- ** Gets the auto_toggle setting of category n.
- ** Parameters: id (default 0)  - The category to get. If no category supplied
- **                uses 0
+/**
+ * get_autotoggle() - Gets the auto_toggle setting
+ *
+ * @since 0.71
+ * @deprecated No alternative function available
+ *
+ * @param int $id The category to get. If no category supplied uses 0
+ * @return int Only returns 0.
  */
 function get_autotoggle($id = 0) {
+	_deprecated_function(__FUNCTION__, '0.0' );
 	return 0;
 }
 
-// Use wp_list_cats().
-function list_cats($optionall = 1, $all = 'All', $sort_column = 'ID', $sort_order = 'asc', $file = '', $list = true, $optiondates = 0, $optioncount = 0, $hide_empty = 1, $use_desc_for_title = 1, $children=FALSE, $child_of=0, $categories=0, $recurse=0, $feed = '', $feed_image = '', $exclude = '', $hierarchical=FALSE) {
+/**
+ * @since 0.71
+ * @deprecated Use wp_list_categories()
+ * @see wp_list_categories()
+ *
+ * @param int $optionall
+ * @param string $all
+ * @param string $sort_column
+ * @param string $sort_order
+ * @param string $file
+ * @param bool $list
+ * @param int $optiondates
+ * @param int $optioncount
+ * @param int $hide_empty
+ * @param int $use_desc_for_title
+ * @param bool $children
+ * @param int $child_of
+ * @param int $categories
+ * @param int $recurse
+ * @param string $feed
+ * @param string $feed_image
+ * @param string $exclude
+ * @param bool $hierarchical
+ * @return unknown
+ */
+function list_cats($optionall = 1, $all = 'All', $sort_column = 'ID', $sort_order = 'asc', $file = '', $list = true, $optiondates = 0,
+				   $optioncount = 0, $hide_empty = 1, $use_desc_for_title = 1, $children=false, $child_of=0, $categories=0,
+				   $recurse=0, $feed = '', $feed_image = '', $exclude = '', $hierarchical=false) {
+	_deprecated_function(__FUNCTION__, '0.0', 'wp_list_categories()');
+
 	$query = compact('optionall', 'all', 'sort_column', 'sort_order', 'file', 'list', 'optiondates', 'optioncount', 'hide_empty', 'use_desc_for_title', 'children',
 		'child_of', 'categories', 'recurse', 'feed', 'feed_image', 'exclude', 'hierarchical');
 	return wp_list_cats($query);
 }
 
+/**
+ * @since 1.2
+ * @deprecated Use wp_list_categories()
+ * @see wp_list_categories()
+ *
+ * @param string|array $args
+ * @return unknown
+ */
 function wp_list_cats($args = '') {
-	if ( is_array($args) )
-		$r = &$args;
-	else
-		parse_str($args, $r);
+	_deprecated_function(__FUNCTION__, '0.0', 'wp_list_categories()');
+
+	$r = wp_parse_args( $args );
 
 	// Map to new names.
 	if ( isset($r['optionall']) && isset($r['all']))
@@ -450,9 +710,27 @@
 	return wp_list_categories($r);
 }
 
+/**
+ * @since 0.71
+ * @deprecated Use wp_dropdown_categories()
+ * @see wp_dropdown_categories()
+ *
+ * @param int $optionall
+ * @param string $all
+ * @param string $orderby
+ * @param string $order
+ * @param int $show_last_update
+ * @param int $show_count
+ * @param int $hide_empty
+ * @param bool $optionnone
+ * @param int $selected
+ * @param int $exclude
+ * @return unknown
+ */
 function dropdown_cats($optionall = 1, $all = 'All', $orderby = 'ID', $order = 'asc',
-		$show_last_update = 0, $show_count = 0, $hide_empty = 1, $optionnone = FALSE,
+		$show_last_update = 0, $show_count = 0, $hide_empty = 1, $optionnone = false,
 		$selected = 0, $exclude = 0) {
+	_deprecated_function(__FUNCTION__, '0.0', 'wp_dropdown_categories()');
 
 	$show_option_all = '';
 	if ( $optionall )
@@ -468,32 +746,103 @@
 	return wp_dropdown_categories($query);
 }
 
-// Use wp_print_scripts() or WP_Scripts.
+/**
+ * @since 2.1
+ * @deprecated Use wp_print_scripts() or WP_Scripts.
+ * @see wp_print_scripts()
+ * @see WP_Scripts
+ */
 function tinymce_include() {
+	_deprecated_function(__FUNCTION__, '0.0', 'wp_print_scripts()/WP_Scripts');
+
 	wp_print_script('wp_tiny_mce');
 }
 
+/**
+ * @since 1.2
+ * @deprecated Use wp_list_authors()
+ * @see wp_list_authors()
+ *
+ * @param bool $optioncount
+ * @param bool $exclude_admin
+ * @param bool $show_fullname
+ * @param bool $hide_empty
+ * @param string $feed
+ * @param string $feed_image
+ * @return unknown
+ */
 function list_authors($optioncount = false, $exclude_admin = true, $show_fullname = false, $hide_empty = true, $feed = '', $feed_image = '') {
+	_deprecated_function(__FUNCTION__, '0.0', 'wp_list_authors()');
+
 	$args = compact('optioncount', 'exclude_admin', 'show_fullname', 'hide_empty', 'feed', 'feed_image');
 	return wp_list_authors($args);
 }
 
+/**
+ * @since 1.0.1
+ * @deprecated Use wp_get_post_categories()
+ * @see wp_get_post_categories()
+ *
+ * @param int $blogid Not Used
+ * @param int $post_ID
+ * @return unknown
+ */
 function wp_get_post_cats($blogid = '1', $post_ID = 0) {
+	_deprecated_function(__FUNCTION__, '0.0', 'wp_get_post_categories()');
 	return wp_get_post_categories($post_ID);
 }
 
+/**
+ * wp_set_post_cats() - Sets the categories that the post id belongs to.
+ *
+ * @since 1.0.1
+ * @deprecated Use wp_set_post_categories()
+ * @see wp_set_post_categories()
+ *
+ * @param int $blogid Not used
+ * @param int $post_ID
+ * @param array $post_categories
+ * @return unknown
+ */
 function wp_set_post_cats($blogid = '1', $post_ID = 0, $post_categories = array()) {
+	_deprecated_function(__FUNCTION__, '0.0', 'wp_set_post_categories()');
 	return wp_set_post_categories($post_ID, $post_categories);
 }
 
-// Use wp_get_archives().
+/**
+ * @since 0.71
+ * @deprecated Use wp_get_archives()
+ * @see wp_get_archives()
+ *
+ * @param string $type
+ * @param string $limit
+ * @param string $format
+ * @param string $before
+ * @param string $after
+ * @param bool $show_post_count
+ * @return unknown
+ */
 function get_archives($type='', $limit='', $format='html', $before = '', $after = '', $show_post_count = false) {
+	_deprecated_function(__FUNCTION__, '0.0', 'wp_get_archives()');
 	$args = compact('type', 'limit', 'format', 'before', 'after', 'show_post_count');
 	return wp_get_archives($args);
 }
 
-// Use get_author_posts_url().
+/**
+ * get_author_link() - Returns or Prints link to the author's posts
+ *
+ * @since 1.2
+ * @deprecated Use get_author_posts_url()
+ * @see get_author_posts_url()
+ *
+ * @param bool $echo Optional.
+ * @param int $author_id Required.
+ * @param string $author_nicename Optional.
+ * @return string|null
+ */
 function get_author_link($echo = false, $author_id, $author_nicename = '') {
+	_deprecated_function(__FUNCTION__, '0.0', 'get_author_posts_url()');
+
 	$link = get_author_posts_url($author_id, $author_nicename);
 
 	if ( $echo )
@@ -501,15 +850,437 @@
 	return $link;
 }
 
-// Use wp_link_pages().
-function link_pages($before='<br />', $after='<br />', $next_or_number='number', $nextpagelink='next page', $previouspagelink='previous page', $pagelink='%', $more_file='') {
+/**
+ * link_pages() - Print list of pages based on arguments
+ *
+ * @since 0.71
+ * @deprecated Use wp_link_pages()
+ * @see wp_link_pages()
+ *
+ * @param string $before
+ * @param string $after
+ * @param string $next_or_number
+ * @param string $nextpagelink
+ * @param string $previouspagelink
+ * @param string $pagelink
+ * @param string $more_file
+ * @return string
+ */
+function link_pages($before='<br />', $after='<br />', $next_or_number='number', $nextpagelink='next page', $previouspagelink='previous page',
+					$pagelink='%', $more_file='') {
+	_deprecated_function(__FUNCTION__, '0.0', 'wp_link_pages()');
+
 	$args = compact('before', 'after', 'next_or_number', 'nextpagelink', 'previouspagelink', 'pagelink', 'more_file');
 	return wp_link_pages($args);
 }
 
-// Use get_option().
+/**
+ * get_settings() - Get value based on option
+ *
+ * @since 0.71
+ * @deprecated Use get_option()
+ * @see get_option()
+ *
+ * @param string $option
+ * @return string
+ */
 function get_settings($option) {
+	_deprecated_function(__FUNCTION__, '0.0', 'get_option()');
+
 	return get_option($option);
 }
 
+/**
+ * permalink_link() - Print the permalink of the current post in the loop
+ *
+ * @since 0.71
+ * @deprecated Use the_permalink()
+ * @see the_permalink()
+ */
+function permalink_link() {
+	_deprecated_function(__FUNCTION__, '0.0', 'the_permalink()');
+	the_permalink();
+}
+
+/**
+ * permalink_single_rss() - Print the permalink to the RSS feed
+ *
+ * @since 0.71
+ * @deprecated Use the_permalink_rss()
+ * @see the_permalink_rss()
+ *
+ * @param string $file
+ */
+function permalink_single_rss($deprecated = '') {
+	_deprecated_function(__FUNCTION__, '0.0', 'the_permalink_rss()');
+	the_permalink_rss();
+}
+
+/**
+ * wp_get_links() - Gets the links associated with category.
+ *
+ * @see get_links() for argument information that can be used in $args
+ * @since 1.0.1
+ * @deprecated Use get_bookmarks()
+ * @see get_bookmarks()
+ *
+ * @param string $args a query string
+ * @return null|string
+ */
+function wp_get_links($args = '') {
+	_deprecated_function(__FUNCTION__, '0.0', 'get_bookmarks()');
+
+	if ( strpos( $args, '=' ) === false ) {
+		$cat_id = $args;
+		$args = add_query_arg( 'category', $cat_id, $args );
+	}
+
+	$defaults = array(
+		'category' => -1, 'before' => '',
+		'after' => '<br />', 'between' => ' ',
+		'show_images' => true, 'orderby' => 'name',
+		'show_description' => true, 'show_rating' => false,
+		'limit' => -1, 'show_updated' => true,
+		'echo' => true
+	);
+
+	$r = wp_parse_args( $args, $defaults );
+	extract( $r, EXTR_SKIP );
+
+	return get_links($category, $before, $after, $between, $show_images, $orderby, $show_description, $show_rating, $limit, $show_updated, $echo);
+}
+
+/**
+ * get_links() - Gets the links associated with category by id.
+ *
+ * @since 0.71
+ * @deprecated Use get_bookmarks()
+ * @see get_bookmarks()
+ *
+ * @param int $category The category to use. If no category supplied uses all
+ * @param string $before the html to output before the link
+ * @param string $after the html to output after the link
+ * @param string $between the html to output between the link/image and its description.
+ *		Not used if no image or show_images == true
+ * @param bool $show_images whether to show images (if defined).
+ * @param string $orderby the order to output the links. E.g. 'id', 'name', 'url',
+ *		'description', or 'rating'. Or maybe owner. If you start the name with an
+ *		underscore the order will be reversed. You can also specify 'rand' as the order
+ *		which will return links in a random order.
+ * @param bool $show_description whether to show the description if show_images=false/not defined.
+ * @param bool $show_rating show rating stars/chars
+ * @param int $limit Limit to X entries. If not specified, all entries are shown.
+ * @param int $show_updated whether to show last updated timestamp
+ * @param bool $echo whether to echo the results, or return them instead
+ * @return null|string
+ */
+function get_links($category = -1, $before = '', $after = '<br />', $between = ' ', $show_images = true, $orderby = 'name',
+			$show_description = true, $show_rating = false, $limit = -1, $show_updated = 1, $echo = true) {
+	_deprecated_function(__FUNCTION__, '0.0', 'get_bookmarks()');
+
+	$order = 'ASC';
+	if ( substr($orderby, 0, 1) == '_' ) {
+		$order = 'DESC';
+		$orderby = substr($orderby, 1);
+	}
+
+	if ( $category == -1 ) //get_bookmarks uses '' to signify all categories
+		$category = '';
+
+	$results = get_bookmarks("category=$category&orderby=$orderby&order=$order&show_updated=$show_updated&limit=$limit");
+
+	if ( !$results )
+		return;
+
+	$output = '';
+
+	foreach ( (array) $results as $row ) {
+		if ( !isset($row->recently_updated) )
+			$row->recently_updated = false;
+		$output .= $before;
+		if ( $show_updated && $row->recently_updated )
+			$output .= get_option('links_recently_updated_prepend');
+		$the_link = '#';
+		if ( !empty($row->link_url) )
+			$the_link = clean_url($row->link_url);
+		$rel = $row->link_rel;
+		if ( '' != $rel )
+			$rel = ' rel="' . $rel . '"';
+
+		$desc = attribute_escape(sanitize_bookmark_field('link_description', $row->link_description, $row->link_id, 'display'));
+		$name = attribute_escape(sanitize_bookmark_field('link_name', $row->link_name, $row->link_id, 'display'));
+		$title = $desc;
+
+		if ( $show_updated )
+			if (substr($row->link_updated_f, 0, 2) != '00')
+				$title .= ' ('.__('Last updated') . ' ' . date(get_option('links_updated_date_format'), $row->link_updated_f + (get_option('gmt_offset') * 3600)) . ')';
+
+		if ( '' != $title )
+			$title = ' title="' . $title . '"';
+
+		$alt = ' alt="' . $name . '"';
+
+		$target = $row->link_target;
+		if ( '' != $target )
+			$target = ' target="' . $target . '"';
+
+		$output .= '<a href="' . $the_link . '"' . $rel . $title . $target. '>';
+
+		if ( $row->link_image != null && $show_images ) {
+			if ( strpos($row->link_image, 'http') !== false )
+				$output .= "<img src=\"$row->link_image\" $alt $title />";
+			else // If it's a relative path
+				$output .= "<img src=\"" . get_option('siteurl') . "$row->link_image\" $alt $title />";
+		} else {
+			$output .= $name;
+		}
+
+		$output .= '</a>';
+
+		if ( $show_updated && $row->recently_updated )
+			$output .= get_option('links_recently_updated_append');
+
+		if ( $show_description && '' != $desc )
+			$output .= $between . $desc;
+
+		if ($show_rating) {
+			$output .= $between . get_linkrating($row);
+		}
+
+		$output .= "$after\n";
+	} // end while
+
+	if ( !$echo )
+		return $output;
+	echo $output;
+}
+
+/**
+ * get_links_list() - Output entire list of links by category
+ *
+ * Output a list of all links, listed by category, using the
+ * settings in $wpdb->linkcategories and output it as a nested
+ * HTML unordered list.
+ *
+ * @author Dougal
+ * @since 1.0.1
+ * @deprecated Use get_categories()
+ * @see get_categories()
+ *
+ * @param string $order Sort link categories by 'name' or 'id'
+ * @param string $$deprecated Not Used
+ */
+function get_links_list($order = 'name', $deprecated = '') {
+	_deprecated_function(__FUNCTION__, '0.0', 'get_categories()');
+
+	$order = strtolower($order);
+
+	// Handle link category sorting
+	$direction = 'ASC';
+	if ( '_' == substr($order,0,1) ) {
+		$direction = 'DESC';
+		$order = substr($order,1);
+	}
+
+	if ( !isset($direction) )
+		$direction = '';
+
+	$cats = get_categories("type=link&orderby=$order&order=$direction&hierarchical=0");
+
+	// Display each category
+	if ( $cats ) {
+		foreach ( (array) $cats as $cat ) {
+			// Handle each category.
+
+			// Display the category name
+			echo '  <li id="linkcat-' . $cat->term_id . '" class="linkcat"><h2>' . apply_filters('link_category', $cat->name ) . "</h2>\n\t<ul>\n";
+			// Call get_links() with all the appropriate params
+			get_links($cat->term_id, '<li>', "</li>", "\n", true, 'name', false);
+
+			// Close the last category
+			echo "\n\t</ul>\n</li>\n";
+		}
+	}
+}
+
+/**
+ * links_popup_script() - Show the link to the links popup and the number of links
+ *
+ * @author Fullo
+ * @link http://sprite.csr.unibo.it/fullo/
+ *
+ * @since 0.71
+ * @deprecated {@internal Use function instead is unknown}}
+ *
+ * @param string $text the text of the link
+ * @param int $width the width of the popup window
+ * @param int $height the height of the popup window
+ * @param string $file the page to open in the popup window
+ * @param bool $count the number of links in the db
+ */
+function links_popup_script($text = 'Links', $width=400, $height=400, $file='links.all.php', $count = true) {
+	_deprecated_function(__FUNCTION__, '0.0' );
+
+	if ( $count )
+		$counts = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->links");
+
+	$javascript = "<a href=\"#\" onclick=\"javascript:window.open('$file?popup=1', '_blank', 'width=$width,height=$height,scrollbars=yes,status=no'); return false\">";
+	$javascript .= $text;
+
+	if ( $count )
+		$javascript .= " ($counts)";
+
+	$javascript .= "</a>\n\n";
+		echo $javascript;
+}
+
+/**
+ * @since 1.0.1
+ * @deprecated Use sanitize_bookmark_field()
+ * @see sanitize_bookmark_field()
+ *
+ * @param object $link
+ * @return unknown
+ */
+function get_linkrating($link) {
+	_deprecated_function(__FUNCTION__, '0.0', 'sanitize_bookmark_field()');
+	return sanitize_bookmark_field('link_rating', $link->link_rating, $link->link_id, 'display');
+}
+
+/**
+ * get_linkcatname() - Gets the name of category by id.
+ *
+ * @since 0.71
+ * @deprecated Use get_category()
+ * @see get_category()
+ *
+ * @param int $id The category to get. If no category supplied uses 0
+ * @return string
+ */
+function get_linkcatname($id = 0) {
+	_deprecated_function(__FUNCTION__, '0.0', 'get_category()');
+
+	$id = (int) $id;
+
+	if ( empty($id) )
+		return '';
+
+	$cats = wp_get_link_cats($id);
+
+	if ( empty($cats) || ! is_array($cats) )
+		return '';
+
+	$cat_id = (int) $cats[0]; // Take the first cat.
+
+	$cat = get_category($cat_id);
+	return $cat->name;
+}
+
+/**
+ * comment_rss_link() - Print RSS comment feed link
+ *
+ * @since 1.0.1
+ * @deprecated Use post_comments_feed_link()
+ * @see post_comments_feed_link()
+ *
+ * @param string $link_text
+ * @param string $deprecated Not used
+ */
+function comments_rss_link($link_text = 'Comments RSS', $deprecated = '') {
+	_deprecated_function(__FUNCTION__, '0.0', 'post_comments_feed_link()');
+	post_comments_feed_link($link_text);
+}
+
+/**
+ * get_category_rss_link() - Print/Return link to category RSS2 feed
+ *
+ * @since 1.2
+ * @deprecated Use get_category_feed_link()
+ * @see get_category_feed_link()
+ *
+ * @param bool $echo
+ * @param int $cat_ID
+ * @param string $deprecated Not used
+ * @return string|null
+ */
+function get_category_rss_link($echo = false, $cat_ID = 1, $deprecated = '') {
+	_deprecated_function(__FUNCTION__, '0.0', 'get_category_feed_link()');
+
+	$link = get_category_feed_link($cat_ID, 'rss2');
+
+	if ( $echo )
+		echo $link;
+	return $link;
+}
+
+/**
+ * get_author_rss_link() - Print/Return link to author RSS feed
+ *
+ * @since 1.2
+ * @deprecated Use get_author_feed_link()
+ * @see get_author_feed_link()
+ *
+ * @param bool $echo
+ * @param int $author_id
+ * @param string $deprecated Not used
+ * @return string|null
+ */
+function get_author_rss_link($echo = false, $author_id = 1, $deprecated = '') {
+	_deprecated_function(__FUNCTION__, '0.0', 'get_author_feed_link()');
+
+	$link = get_author_feed_link($author_id);
+	if ( $echo )
+		echo $link;
+	return $link;
+}
+
+/**
+ * comments_rss() - Return link to the post RSS feed
+ *
+ * @since 1.5
+ * @deprecated Use get_post_comments_feed_link()
+ * @see get_post_comments_feed_link()
+ *
+ * @param string $deprecated Not used
+ * @return string
+ */
+function comments_rss($deprecated = '') {
+	_deprecated_function(__FUNCTION__, '2.2', 'get_post_comments_feed_link()');
+	return get_post_comments_feed_link();
+}
+
+/**
+ * create_user() - An alias of wp_create_user().
+ * @param string $username The user's username.
+ * @param string $password The user's password.
+ * @param string $email The user's email (optional).
+ * @return int The new user's ID.
+ * @deprecated Use wp_create_user()
+ * @see wp_create_user()
+ */
+function create_user($username, $password, $email) {
+	_deprecated_function( __FUNCTION__, '2.0', 'wp_create_user()' );
+	return wp_create_user($username, $password, $email);
+}
+
+/**
+ * documentation_link() - Unused Admin function
+ * @since 2.0
+ * @param string $deprecated Unknown
+ * @deprecated 2.5
+ */
+function documentation_link( $deprecated = '' ) {
+	_deprecated_function( __FUNCTION__, '2.5', '' );
+	return;
+}
+
+/**
+ * gzip_compression() - Unused function
+ *
+ * @deprecated 2.5
+*/
+
+function gzip_compression() {
+	return false;
+}
 ?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/feed-atom-comments.php 2.5.src/wp-includes/feed-atom-comments.php
--- 2.2.2.src/wp-includes/feed-atom-comments.php	2007-05-31 17:14:42.000000000 -0500
+++ 2.5.src/wp-includes/feed-atom-comments.php	2008-02-13 12:29:10.000000000 -0600
@@ -1,4 +1,10 @@
 <?php
+/**
+ * Atom Feed Template for displaying Atom Comments feed.
+ *
+ * @package WordPress
+ */
+
 header('Content-Type: application/atom+xml; charset=' . get_option('blog_charset'), true);
 echo '<?xml version="1.0" encoding="' . get_option('blog_charset') . '" ?' . '>';
 ?>
@@ -7,22 +13,32 @@
 	xml:lang="<?php echo get_option('rss_language'); ?>"
 	<?php do_action('atom_ns'); ?>
 >
-	<title type="text"><?php 
+	<title type="text"><?php
 		if ( is_singular() )
 			printf(__('Comments on: %s'), get_the_title_rss());
 		elseif ( is_search() )
-			printf(__('Comments for %s searching on %s'), get_bloginfo_rss( 'name' ), attribute_escape($wp_query->query_vars['s']));
+			printf(__('Comments for %1$s searching on %2$s'), get_bloginfo_rss( 'name' ), attribute_escape(get_search_query()));
 		else
 			printf(__('Comments for %s'), get_bloginfo_rss( 'name' ) . get_wp_title_rss());
 	?></title>
 	<subtitle type="text"><?php bloginfo_rss('description'); ?></subtitle>
 
 	<updated><?php echo mysql2date('Y-m-d\TH:i:s\Z', get_lastcommentmodified('GMT')); ?></updated>
-	<generator uri="http://wordpress.org/" version="<?php bloginfo('version'); ?>">WordPress</generator>
+	<?php the_generator( 'atom' ); ?>
 
+<?php if ( is_singular() ) { ?>
+	<link rel="alternate" type="<?php bloginfo_rss('html_type'); ?>" href="<?php echo get_comments_link(); ?>" />
+	<link rel="self" type="application/atom+xml" href="<?php echo get_post_comments_feed_link('', 'atom'); ?>" />
+	<id><?php echo get_post_comments_feed_link('', 'atom'); ?></id>
+<?php } elseif(is_search()) { ?>
+	<link rel="alternate" type="<?php bloginfo_rss('html_type'); ?>" href="<?php echo get_option('home') . '?s=' . attribute_escape(get_search_query()); ?>" />
+	<link rel="self" type="application/atom+xml" href="<?php echo get_search_comments_feed_link('', 'atom'); ?>" />
+	<id><?php echo get_search_comments_feed_link('', 'atom'); ?></id>
+<?php } else { ?>
 	<link rel="alternate" type="<?php bloginfo_rss('html_type'); ?>" href="<?php bloginfo_rss('home'); ?>" />
 	<link rel="self" type="application/atom+xml" href="<?php bloginfo_rss('comments_atom_url'); ?>" />
 	<id><?php bloginfo_rss('comments_atom_url'); ?></id>
+<?php } ?>
 
 <?php
 if ( have_comments() ) : while ( have_comments() ) : the_comment();
@@ -33,7 +49,6 @@
 		<title><?php
 			if ( !is_singular() ) {
 				$title = get_the_title($comment_post->ID);
-				$title = apply_filters('the_title', $title);
 				$title = apply_filters('the_title_rss', $title);
 				printf(__('Comment on %1$s by %2$s'), $title, get_comment_author_rss());
 			} else {
diff -x .svn -aruN 2.2.2.src/wp-includes/feed-atom.php 2.5.src/wp-includes/feed-atom.php
--- 2.2.2.src/wp-includes/feed-atom.php	2007-05-04 16:48:43.000000000 -0500
+++ 2.5.src/wp-includes/feed-atom.php	2008-03-11 13:18:22.000000000 -0500
@@ -1,5 +1,11 @@
 <?php
-header('Content-type: application/atom+xml; charset=' . get_option('blog_charset'), true);
+/**
+ * Atom Feed Template for displaying Atom Posts feed.
+ *
+ * @package WordPress
+ */
+
+header('Content-Type: application/atom+xml; charset=' . get_option('blog_charset'), true);
 $more = 1;
 
 ?>
@@ -15,31 +21,36 @@
 	<subtitle type="text"><?php bloginfo_rss("description") ?></subtitle>
 
 	<updated><?php echo mysql2date('Y-m-d\TH:i:s\Z', get_lastpostmodified('GMT')); ?></updated>
-	<generator uri="http://wordpress.org/" version="<?php bloginfo_rss('version'); ?>">WordPress</generator>
+	<?php the_generator( 'atom' ); ?>
 
 	<link rel="alternate" type="text/html" href="<?php bloginfo_rss('home') ?>" />
 	<id><?php bloginfo('atom_url'); ?></id>
-	<link rel="self" type="application/atom+xml" href="<?php bloginfo('atom_url'); ?>" />
+	<link rel="self" type="application/atom+xml" href="<?php self_link(); ?>" />
 
 	<?php do_action('atom_head'); ?>
 	<?php while (have_posts()) : the_post(); ?>
 	<entry>
 		<author>
 			<name><?php the_author() ?></name>
+			<?php $author_url = get_the_author_url(); if ( !empty($author_url) ) : ?>
 			<uri><?php the_author_url()?></uri>
+			<?php endif; ?>
 		</author>
 		<title type="<?php html_type_rss(); ?>"><![CDATA[<?php the_title_rss() ?>]]></title>
-		<link rel="alternate" type="text/html" href="<?php permalink_single_rss() ?>" />
+		<link rel="alternate" type="text/html" href="<?php the_permalink_rss() ?>" />
 		<id><?php the_guid(); ?></id>
-		<updated><?php echo get_post_time('Y-m-d\TH:i:s\Z', true); ?></updated>
+		<updated><?php echo get_post_modified_time('Y-m-d\TH:i:s\Z', true); ?></updated>
 		<published><?php echo get_post_time('Y-m-d\TH:i:s\Z', true); ?></published>
 		<?php the_category_rss('atom') ?>
 		<summary type="<?php html_type_rss(); ?>"><![CDATA[<?php the_excerpt_rss(); ?>]]></summary>
 <?php if ( !get_option('rss_use_excerpt') ) : ?>
-		<content type="<?php html_type_rss(); ?>" xml:base="<?php permalink_single_rss() ?>"><![CDATA[<?php the_content('', 0, '') ?>]]></content>
+		<content type="<?php html_type_rss(); ?>" xml:base="<?php the_permalink_rss() ?>"><![CDATA[<?php the_content('', 0, '') ?>]]></content>
 <?php endif; ?>
 <?php atom_enclosure(); ?>
 <?php do_action('atom_entry'); ?>
+		<link rel="replies" type="text/html" href="<?php the_permalink_rss() ?>#comments" thr:count="<?php echo get_comments_number()?>"/>
+		<link rel="replies" type="appication/atom+xml" href="<?php echo get_post_comments_feed_link(0,'atom') ?>" thr:count="<?php echo get_comments_number()?>"/>
+		<thr:total><?php echo get_comments_number()?></thr:total>
 	</entry>
 	<?php endwhile ; ?>
-</feed>
\ No newline at end of file
+</feed>
diff -x .svn -aruN 2.2.2.src/wp-includes/feed-rdf.php 2.5.src/wp-includes/feed-rdf.php
--- 2.2.2.src/wp-includes/feed-rdf.php	2007-05-04 16:48:43.000000000 -0500
+++ 2.5.src/wp-includes/feed-rdf.php	2007-12-25 14:48:01.000000000 -0600
@@ -1,10 +1,15 @@
 <?php
-header('Content-type: application/rdf+xml; charset=' . get_option('blog_charset'), true);
+/**
+ * RSS 1 RDF Feed Template for displaying RSS 1 Posts feed.
+ *
+ * @package WordPress
+ */
+
+header('Content-Type: application/rdf+xml; charset=' . get_option('blog_charset'), true);
 $more = 1;
 
 ?>
 <?php echo '<?xml version="1.0" encoding="'.get_option('blog_charset').'"?'.'>'; ?>
-<!-- generator="wordpress/<?php echo $wp_version ?>" -->
 <rdf:RDF
 	xmlns="http://purl.org/rss/1.0/"
 	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
@@ -19,7 +24,7 @@
 	<link><?php bloginfo_rss('url') ?></link>
 	<description><?php bloginfo_rss('description') ?></description>
 	<dc:date><?php echo mysql2date('Y-m-d\TH:i:s\Z', get_lastpostmodified('GMT'), false); ?></dc:date>
-	<admin:generatorAgent rdf:resource="http://wordpress.org/?v=<?php echo $wp_version ?>"/>
+	<?php the_generator( 'rdf' ); ?>
 	<sy:updatePeriod>hourly</sy:updatePeriod>
 	<sy:updateFrequency>1</sy:updateFrequency>
 	<sy:updateBase>2000-01-01T12:00+00:00</sy:updateBase>
@@ -27,15 +32,15 @@
 	<items>
 		<rdf:Seq>
 		<?php while (have_posts()): the_post(); ?>
-			<rdf:li rdf:resource="<?php permalink_single_rss() ?>"/>
+			<rdf:li rdf:resource="<?php the_permalink_rss() ?>"/>
 		<?php endwhile; ?>
 		</rdf:Seq>
 	</items>
 </channel>
 <?php rewind_posts(); while (have_posts()): the_post(); ?>
-<item rdf:about="<?php permalink_single_rss() ?>">
+<item rdf:about="<?php the_permalink_rss() ?>">
 	<title><?php the_title_rss() ?></title>
-	<link><?php permalink_single_rss() ?></link>
+	<link><?php the_permalink_rss() ?></link>
 	 <dc:date><?php echo mysql2date('Y-m-d\TH:i:s\Z', $post->post_date_gmt, false); ?></dc:date>
 	<dc:creator><?php the_author() ?></dc:creator>
 	<?php the_category_rss('rdf') ?>
diff -x .svn -aruN 2.2.2.src/wp-includes/feed-rss.php 2.5.src/wp-includes/feed-rss.php
--- 2.2.2.src/wp-includes/feed-rss.php	2007-05-04 16:48:43.000000000 -0500
+++ 2.5.src/wp-includes/feed-rss.php	2007-12-25 14:48:01.000000000 -0600
@@ -1,10 +1,16 @@
 <?php
-header('Content-type: text/xml; charset=' . get_option('blog_charset'), true);
+/**
+ * RSS 0.92 Feed Template for displaying RSS 0.92 Posts feed.
+ *
+ * @package WordPress
+ */
+
+header('Content-Type: text/xml; charset=' . get_option('blog_charset'), true);
 $more = 1;
 
 ?>
 <?php echo '<?xml version="1.0" encoding="'.get_option('blog_charset').'"?'.'>'; ?>
-<!-- generator="wordpress/<?php echo $wp_version ?>" -->
+<?php the_generator( 'comment' ); ?>
 <rss version="0.92">
 <channel>
 	<title><?php bloginfo_rss('name'); wp_title_rss(); ?></title>
@@ -23,7 +29,7 @@
 <?php } else { // use content ?>
 		<description><?php the_content_rss('', 0, '', get_option('rss_excerpt_length')) ?></description>
 <?php } ?>
-		<link><?php permalink_single_rss() ?></link>
+		<link><?php the_permalink_rss() ?></link>
 		<?php do_action('rss_item'); ?>
 	</item>
 <?php endwhile; ?>
diff -x .svn -aruN 2.2.2.src/wp-includes/feed-rss2-comments.php 2.5.src/wp-includes/feed-rss2-comments.php
--- 2.2.2.src/wp-includes/feed-rss2-comments.php	2007-05-04 16:48:43.000000000 -0500
+++ 2.5.src/wp-includes/feed-rss2-comments.php	2008-03-11 13:18:22.000000000 -0500
@@ -1,11 +1,19 @@
 <?php
-header('Content-type: text/xml;charset=' . get_option('blog_charset'), true);
+/**
+ * RSS2 Feed Template for displaying RSS2 Comments feed.
+ *
+ * @package WordPress
+ */
 
-echo '<?xml version="1.0" encoding="'.get_option('blog_charset').'"?'.'>'; 
+header('Content-Type: text/xml;charset=' . get_option('blog_charset'), true);
+
+echo '<?xml version="1.0" encoding="'.get_option('blog_charset').'"?'.'>';
 ?>
-<!-- generator="wordpress/<?php echo $wp_version ?>" -->
-<rss version="2.0" 
-	xmlns:content="http://purl.org/rss/1.0/modules/content/">
+<rss version="2.0"
+	xmlns:content="http://purl.org/rss/1.0/modules/content/"
+	xmlns:dc="http://purl.org/dc/elements/1.1/"
+	xmlns:atom="http://www.w3.org/2005/Atom"
+	>
 <channel>
 	<title><?php
 		if ( is_singular() )
@@ -15,12 +23,13 @@
 		else
 			printf(__('Comments for %s'), get_bloginfo_rss( 'name' ) . get_wp_title_rss());
 	?></title>
-	<link><?php (is_single()) ? permalink_single_rss() : bloginfo_rss("url") ?></link>
+	<atom:link href="<?php self_link(); ?>" rel="self" type="application/rss+xml" />
+	<link><?php (is_single()) ? the_permalink_rss() : bloginfo_rss("url") ?></link>
 	<description><?php bloginfo_rss("description") ?></description>
 	<pubDate><?php echo gmdate('r'); ?></pubDate>
-	<generator>http://wordpress.org/?v=<?php echo $wp_version ?></generator>
-
-<?php 
+	<?php the_generator( 'rss2' ); ?>
+	<?php do_action('commentsrss2_head'); ?>
+<?php
 if ( have_comments() ) : while ( have_comments() ) : the_comment();
 	$comment_post = get_post($comment->comment_post_ID);
 	get_post_custom($comment_post->ID);
@@ -29,7 +38,6 @@
 		<title><?php
 			if ( !is_singular() ) {
 				$title = get_the_title($comment_post->ID);
-				$title = apply_filters('the_title', $title);
 				$title = apply_filters('the_title_rss', $title);
 				printf(__('Comment on %1$s by %2$s'), $title, get_comment_author_rss());
 			} else {
@@ -37,9 +45,9 @@
 			}
 		?></title>
 		<link><?php comment_link() ?></link>
-		<author><?php echo get_comment_author_rss() ?></author>
+		<dc:creator><?php echo get_comment_author_rss() ?></dc:creator>
 		<pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_comment_time('Y-m-d H:i:s', true), false); ?></pubDate>
-		<guid><?php comment_link() ?></guid>
+		<guid isPermaLink="false"><?php comment_guid() ?></guid>
 <?php if (!empty($comment_post->post_password) && $_COOKIE['wp-postpass'] != $comment_post->post_password) : ?>
 		<description><?php _e('Protected Comments: Please enter your password to view comments.'); ?></description>
 		<content:encoded><![CDATA[<?php echo get_the_password_form() ?>]]></content:encoded>
diff -x .svn -aruN 2.2.2.src/wp-includes/feed-rss2.php 2.5.src/wp-includes/feed-rss2.php
--- 2.2.2.src/wp-includes/feed-rss2.php	2007-05-04 16:48:43.000000000 -0500
+++ 2.5.src/wp-includes/feed-rss2.php	2008-03-11 13:18:22.000000000 -0500
@@ -1,30 +1,37 @@
 <?php
-header('Content-type: text/xml; charset=' . get_option('blog_charset'), true);
+/**
+ * RSS2 Feed Template for displaying RSS2 Posts feed.
+ *
+ * @package WordPress
+ */
+
+header('Content-Type: text/xml; charset=' . get_option('blog_charset'), true);
 $more = 1;
 
 ?>
 <?php echo '<?xml version="1.0" encoding="'.get_option('blog_charset').'"?'.'>'; ?>
 
-<!-- generator="wordpress/<?php bloginfo_rss('version') ?>" -->
 <rss version="2.0"
 	xmlns:content="http://purl.org/rss/1.0/modules/content/"
 	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
 	xmlns:dc="http://purl.org/dc/elements/1.1/"
+	xmlns:atom="http://www.w3.org/2005/Atom"
 	<?php do_action('rss2_ns'); ?>
 >
 
 <channel>
 	<title><?php bloginfo_rss('name'); wp_title_rss(); ?></title>
+	<atom:link href="<?php self_link(); ?>" rel="self" type="application/rss+xml" />
 	<link><?php bloginfo_rss('url') ?></link>
 	<description><?php bloginfo_rss("description") ?></description>
 	<pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_lastpostmodified('GMT'), false); ?></pubDate>
-	<generator>http://wordpress.org/?v=<?php bloginfo_rss('version'); ?></generator>
+	<?php the_generator( 'rss2' ); ?>
 	<language><?php echo get_option('rss_language'); ?></language>
 	<?php do_action('rss2_head'); ?>
 	<?php while( have_posts()) : the_post(); ?>
 	<item>
 		<title><?php the_title_rss() ?></title>
-		<link><?php permalink_single_rss() ?></link>
+		<link><?php the_permalink_rss() ?></link>
 		<comments><?php comments_link(); ?></comments>
 		<pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_post_time('Y-m-d H:i:s', true), false); ?></pubDate>
 		<dc:creator><?php the_author() ?></dc:creator>
@@ -41,7 +48,7 @@
 		<content:encoded><![CDATA[<?php the_excerpt_rss() ?>]]></content:encoded>
 	<?php endif; ?>
 <?php endif; ?>
-		<wfw:commentRss><?php echo comments_rss(); ?></wfw:commentRss>
+		<wfw:commentRss><?php echo get_post_comments_feed_link(); ?></wfw:commentRss>
 <?php rss_enclosure(); ?>
 	<?php do_action('rss2_item'); ?>
 	</item>
diff -x .svn -aruN 2.2.2.src/wp-includes/feed.php 2.5.src/wp-includes/feed.php
--- 2.2.2.src/wp-includes/feed.php	2007-05-25 10:55:30.000000000 -0500
+++ 2.5.src/wp-includes/feed.php	2008-03-11 13:18:22.000000000 -0500
@@ -2,16 +2,21 @@
 
 function get_bloginfo_rss($show = '') {
 	$info = strip_tags(get_bloginfo($show));
-	return apply_filters('get_bloginfo_rss', convert_chars($info));
+	return apply_filters('get_bloginfo_rss', convert_chars($info), $show);
 }
 
-
 function bloginfo_rss($show = '') {
-	echo apply_filters('bloginfo_rss', get_bloginfo_rss($show));
+	echo apply_filters('bloginfo_rss', get_bloginfo_rss($show), $show);
+}
+
+function get_default_feed() {
+	return apply_filters('default_feed', 'rss2');
 }
 
 function get_wp_title_rss($sep = '&#187;') {
 	$title = wp_title($sep, false);
+	if ( is_wp_error( $title ) )
+		return $title->get_error_message();
 	$title = apply_filters('get_wp_title_rss', $title);
 	return $title;
 }
@@ -22,7 +27,6 @@
 
 function get_the_title_rss() {
 	$title = get_the_title();
-	$title = apply_filters('the_title', $title);
 	$title = apply_filters('the_title_rss', $title);
 	return $title;
 }
@@ -66,103 +70,78 @@
 
 
 function the_excerpt_rss() {
-	$output = get_the_excerpt(true);
+	$output = get_the_excerpt();
 	echo apply_filters('the_excerpt_rss', $output);
 }
 
+function the_permalink_rss() {
+	echo apply_filters('the_permalink_rss', get_permalink());
 
-function permalink_single_rss($file = '') {
-	echo get_permalink();
 }
 
+function comment_guid() {
+	echo get_comment_guid();
+}
+
+function get_comment_guid() {
+	global $comment;
+
+	if ( !is_object($comment) )
+		return false;
+
+	return get_the_guid($comment->comment_post_ID) . '#comment-' . $comment->comment_ID;
+}
 
 function comment_link() {
 	echo get_comment_link();
 }
 
-
 function get_comment_author_rss() {
 	return apply_filters('comment_author_rss', get_comment_author() );
 }
 
-
 function comment_author_rss() {
 	echo get_comment_author_rss();
 }
 
-
 function comment_text_rss() {
 	$comment_text = get_comment_text();
 	$comment_text = apply_filters('comment_text_rss', $comment_text);
 	echo $comment_text;
 }
 
+function get_the_category_rss($type = 'rss') {
+	$categories = get_the_category();
+	$tags = get_the_tags();
+	$the_list = '';
+	$cat_names = array();
 
-function comments_rss_link($link_text = 'Comments RSS', $commentsrssfilename = 'nolongerused') {
-	$url = get_post_comments_feed_link();
-	echo "<a href='$url'>$link_text</a>";
-}
-
-
-function comments_rss($commentsrssfilename = 'nolongerused') {
-	return get_post_comments_feed_link();
-}
-
-
-function get_author_rss_link($echo = false, $author_id, $author_nicename) {
-	$auth_ID = (int) $author_id;
-	$permalink_structure = get_option('permalink_structure');
+	$filter = 'rss';
+	if ( 'atom' == $type )
+		$filter = 'raw';
 
-	if ( '' == $permalink_structure ) {
-		$link = get_option('home') . '?feed=rss2&amp;author=' . $author_id;
-	} else {
-		$link = get_author_posts_url($author_id, $author_nicename);
-		$link = $link . user_trailingslashit('feed', 'feed');
+	if ( !empty($categories) ) foreach ( (array) $categories as $category ) {
+		$cat_names[] = sanitize_term_field('name', $category->name, $category->term_id, 'category', $filter);
 	}
 
-	$link = apply_filters('author_feed_link', $link);
-
-	if ( $echo )
-		echo $link;
-	return $link;
-}
-
-
-function get_category_rss_link($echo = false, $cat_ID, $category_nicename) {
-	$permalink_structure = get_option('permalink_structure');
-
-	if ( '' == $permalink_structure ) {
-		$link = get_option('home') . '?feed=rss2&amp;cat=' . $cat_ID;
-	} else {
-		$link = get_category_link($cat_ID);
-		$link = $link . user_trailingslashit('feed', 'feed');
+	if ( !empty($tags) ) foreach ( (array) $tags as $tag ) {
+		$cat_names[] = sanitize_term_field('name', $tag->name, $tag->term_id, 'post_tag', $filter);
 	}
 
-	$link = apply_filters('category_feed_link', $link);
-
-	if ( $echo )
-		echo $link;
-	return $link;
-}
-
+	$cat_names = array_unique($cat_names);
 
-function get_the_category_rss($type = 'rss') {
-	$categories = get_the_category();
-	$home = get_bloginfo_rss('home');
-	$the_list = '';
-	foreach ( (array) $categories as $category ) {
-		$cat_name = convert_chars($category->cat_name);
+	foreach ( $cat_names as $cat_name ) {
 		if ( 'rdf' == $type )
 			$the_list .= "\n\t\t<dc:subject><![CDATA[$cat_name]]></dc:subject>\n";
-		if ( 'atom' == $type )
-			$the_list .= sprintf( '<category scheme="%1$s" term="%2$s" />', attribute_escape( apply_filters( 'get_bloginfo_rss', get_bloginfo( 'url' ) ) ), attribute_escape( $category->cat_name ) );
+		elseif ( 'atom' == $type )
+			$the_list .= sprintf( '<category scheme="%1$s" term="%2$s" />', attribute_escape( apply_filters( 'get_bloginfo_rss', get_bloginfo( 'url' ) ) ), attribute_escape( $cat_name ) );
 		else
 			$the_list .= "\n\t\t<category><![CDATA[$cat_name]]></category>\n";
 	}
+
 	return apply_filters('the_category_rss', $the_list, $type);
 }
 
-
 function the_category_rss($type = 'rss') {
 	echo get_the_category_rss($type);
 }
@@ -178,8 +157,8 @@
 
 
 function rss_enclosure() {
-	global $id, $post;
-	if ( !empty($post->post_password) && ($_COOKIE['wp-postpass_'.COOKIEHASH] != $post->post_password) )
+	global $post;
+	if ( !empty($post->post_password) && (!isset($_COOKIE['wp-postpass_'.COOKIEHASH]) || $_COOKIE['wp-postpass_'.COOKIEHASH] != $post->post_password) )
 		return;
 
 	foreach (get_post_custom() as $key => $val) {
@@ -193,7 +172,7 @@
 }
 
 function atom_enclosure() {
-	global $id, $post;
+	global $post;
 	if ( !empty($post->post_password) && ($_COOKIE['wp-postpass_'.COOKIEHASH] != $post->post_password) )
 		return;
 
@@ -207,4 +186,66 @@
 	}
 }
 
-?>
\ No newline at end of file
+/**
+ * prep_atom_text_construct() - Determine the type of a given string of data
+ *
+ * Tell whether the type is text, html, or xhtml, per RFC 4287 section 3.1.
+ *
+ * In the case of WordPress, text is defined as containing no markup,
+ * xhtml is defined as "well formed", and html as tag soup (i.e., the rest).
+ *
+ * Container div tags are added to xhtml values, per section 3.1.1.3.
+ *
+ * @link http://www.atomenabled.org/developers/syndication/atom-format-spec.php#rfc.section.3.1
+ *
+ * @package WordPress
+ * @subpackage Feed
+ * @since 2.5
+ *
+ * @param string $data input string
+ * @return array $result array(type, value)
+ */
+function prep_atom_text_construct($data) {
+	if (strpos($data, '<') === false && strpos($data, '&') === false) {
+		return array('text', $data);
+	}
+
+	$parser = xml_parser_create();
+	xml_parse($parser, '<div>' . $data . '</div>', true);
+	$code = xml_get_error_code($parser);
+	xml_parser_free($parser);
+
+	if (!$code) {
+		if (strpos($data, '<') === false) {
+			return array('text', $data);
+		} else {
+			$data = "<div xmlns='http://www.w3.org/1999/xhtml'>$data</div>";
+			return array('xhtml', $data);
+		}
+	}
+
+	if (strpos($data, ']]>') == false) {
+		return array('html', "<![CDATA[$data]]>");
+	} else {
+		return array('html', htmlspecialchars($data));
+	}
+}
+
+/**
+ * self_link() - Generate a correct link for the atom:self elemet
+ *
+ * Echo the link for the currently displayed feed in a XSS safe way.
+ *
+ * @package WordPress
+ * @subpackage Feed
+ * @since 2.5
+ *
+ */
+function self_link() {
+	echo 'http'
+		. ( $_SERVER['https'] == 'on' ? 's' : '' ) . '://'
+		. $_SERVER['HTTP_HOST']
+		. wp_specialchars(stripslashes($_SERVER['REQUEST_URI']), 1);
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-includes/formatting.php 2.5.src/wp-includes/formatting.php
--- 2.2.2.src/wp-includes/formatting.php	2007-06-19 17:47:01.000000000 -0500
+++ 2.5.src/wp-includes/formatting.php	2008-03-26 01:37:19.000000000 -0500
@@ -11,13 +11,13 @@
 	// if a plugin has provided an autocorrect array, use it
 	if ( isset($wp_cockneyreplace) ) {
 		$cockney = array_keys($wp_cockneyreplace);
-		$cockney_replace = array_values($wp_cockneyreplace);
+		$cockneyreplace = array_values($wp_cockneyreplace);
 	} else {
 		$cockney = array("'tain't","'twere","'twas","'tis","'twill","'til","'bout","'nuff","'round","'cause");
 		$cockneyreplace = array("&#8217;tain&#8217;t","&#8217;twere","&#8217;twas","&#8217;tis","&#8217;twill","&#8217;til","&#8217;bout","&#8217;nuff","&#8217;round","&#8217;cause");
 	}
 
-	$static_characters = array_merge(array('---', ' -- ', '--', 'xn&#8211;', '...', '``', '\'s', '\'\'', ' (tm)'), $cockney); 
+	$static_characters = array_merge(array('---', ' -- ', '--', 'xn&#8211;', '...', '``', '\'s', '\'\'', ' (tm)'), $cockney);
 	$static_replacements = array_merge(array('&#8212;', ' &#8212; ', '&#8211;', 'xn--', '&#8230;', '&#8220;', '&#8217;s', '&#8221;', ' &#8482;'), $cockneyreplace);
 
 	$dynamic_characters = array('/\'(\d\d(?:&#8217;|\')?s)/', '/(\s|\A|")\'/', '/(\d+)"/', '/(\d+)\'/', '/(\S)\'([^\'\s])/', '/(\s|\A)"(?!\s)/', '/"(\s|\S|\Z)/', '/\'([\s.]|\Z)/', '/(\d+)x(\d+)/');
@@ -44,10 +44,18 @@
   	return $output;
 }
 
-function clean_pre($text) {
+// Accepts matches array from preg_replace_callback in wpautop()
+// or a string
+function clean_pre($matches) {
+	if ( is_array($matches) )
+		$text = $matches[1] . $matches[2] . "</pre>";
+	else
+		$text = $matches;
+
 	$text = str_replace('<br />', '', $text);
 	$text = str_replace('<p>', "\n", $text);
 	$text = str_replace('</p>', '', $text);
+
 	return $text;
 }
 
@@ -59,6 +67,10 @@
 	$pee = preg_replace('!(<' . $allblocks . '[^>]*>)!', "\n$1", $pee);
 	$pee = preg_replace('!(</' . $allblocks . '>)!', "$1\n\n", $pee);
 	$pee = str_replace(array("\r\n", "\r"), "\n", $pee); // cross-platform newlines
+	if ( strpos($pee, '<object') !== false ) {
+		$pee = preg_replace('|\s*<param([^>]*)>\s*|', "<param$1>", $pee); // no pee inside object/embed
+		$pee = preg_replace('|\s*</embed>\s*|', '</embed>', $pee);
+	}
 	$pee = preg_replace("/\n\n+/", "\n\n", $pee); // take care of duplicates
 	$pee = preg_replace('/\n?(.+?)(?:\n\s*\n|\z)/s', "<p>$1</p>\n", $pee); // make paragraphs, including one at the end
 	$pee = preg_replace('|<p>\s*?</p>|', '', $pee); // under certain strange conditions it could create a P of entirely whitespace
@@ -71,14 +83,14 @@
 	$pee = preg_replace('!<p>\s*(</?' . $allblocks . '[^>]*>)!', "$1", $pee);
 	$pee = preg_replace('!(</?' . $allblocks . '[^>]*>)\s*</p>!', "$1", $pee);
 	if ($br) {
-		$pee = preg_replace('/<(script|style).*?<\/\\1>/se', 'str_replace("\n", "<WPPreserveNewline />", "\\0")', $pee);
+		$pee = preg_replace_callback('/<(script|style).*?<\/\\1>/s', create_function('$matches', 'return str_replace("\n", "<WPPreserveNewline />", $matches[0]);'), $pee);
 		$pee = preg_replace('|(?<!<br />)\s*\n|', "<br />\n", $pee); // optionally make line breaks
 		$pee = str_replace('<WPPreserveNewline />', "\n", $pee);
 	}
 	$pee = preg_replace('!(</?' . $allblocks . '[^>]*>)\s*<br />!', "$1", $pee);
 	$pee = preg_replace('!<br />(\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)[^>]*>)!', '$1', $pee);
 	if (strpos($pee, '<pre') !== false)
-		$pee = preg_replace('!(<pre.*?>)(.*?)</pre>!ise', " stripslashes('$1') .  stripslashes(clean_pre('$2'))  . '</pre>' ", $pee);
+		$pee = preg_replace_callback('!(<pre.*?>)(.*?)</pre>!is', 'clean_pre', $pee );
 	$pee = preg_replace( "|\n</p>$|", '</p>', $pee );
 
 	return $pee;
@@ -86,7 +98,8 @@
 
 
 function seems_utf8($Str) { # by bmorel at ssi dot fr
-	for ($i=0; $i<strlen($Str); $i++) {
+	$length = strlen($Str);
+	for ($i=0; $i < $length; $i++) {
 		if (ord($Str[$i]) < 0x80) continue; # 0bbbbbbb
 		elseif ((ord($Str[$i]) & 0xE0) == 0xC0) $n=1; # 110bbbbb
 		elseif ((ord($Str[$i]) & 0xF0) == 0xE0) $n=2; # 1110bbbb
@@ -95,7 +108,7 @@
 		elseif ((ord($Str[$i]) & 0xFE) == 0xFC) $n=5; # 1111110b
 		else return false; # Does not match any model
 		for ($j=0; $j<$n; $j++) { # n bytes matching 10bbbbbb follow ?
-			if ((++$i == strlen($Str)) || ((ord($Str[$i]) & 0xC0) != 0x80))
+			if ((++$i == $length) || ((ord($Str[$i]) & 0xC0) != 0x80))
 			return false;
 		}
 	}
@@ -124,27 +137,32 @@
 	$unicode = '';
 	$values = array();
 	$num_octets = 1;
+	$unicode_length = 0;
 
-	for ($i = 0; $i < strlen( $utf8_string ); $i++ ) {
+	$string_length = strlen( $utf8_string );
+	for ($i = 0; $i < $string_length; $i++ ) {
 
 		$value = ord( $utf8_string[ $i ] );
 
 		if ( $value < 128 ) {
-			if ( $length && ( strlen($unicode) + 1 > $length ) )
-				break; 
+			if ( $length && ( $unicode_length >= $length ) )
+				break;
 			$unicode .= chr($value);
+			$unicode_length++;
 		} else {
 			if ( count( $values ) == 0 ) $num_octets = ( $value < 224 ) ? 2 : 3;
 
 			$values[] = $value;
 
-			if ( $length && ( (strlen($unicode) + ($num_octets * 3)) > $length ) )
+			if ( $length && ( $unicode_length + ($num_octets * 3) ) > $length )
 				break;
 			if ( count( $values ) == $num_octets ) {
 				if ($num_octets == 3) {
 					$unicode .= '%' . dechex($values[0]) . '%' . dechex($values[1]) . '%' . dechex($values[2]);
+					$unicode_length += 9;
 				} else {
 					$unicode .= '%' . dechex($values[0]) . '%' . dechex($values[1]);
+					$unicode_length += 6;
 				}
 
 				$values = array();
@@ -315,9 +333,8 @@
 	$title = strip_tags($title);
 	$title = apply_filters('sanitize_title', $title);
 
-	if (empty($title)) {
+	if ( '' === $title || false === $title )
 		$title = $fallback_title;
-	}
 
 	return $title;
 }
@@ -349,7 +366,7 @@
 	return $title;
 }
 
-function convert_chars($content, $flag = 'obsolete') {
+function convert_chars($content, $deprecated = '') {
 	// Translation of invalid Unicode references range to valid range
 	$wp_htmltranswinuni = array(
 	'&#128;' => '&#8364;', // the Euro sign
@@ -413,8 +430,14 @@
 	return $text;
 }
 
+function balanceTags( $text, $force = false ) {
+	if ( !$force && get_option('use_balanceTags') == 0 )
+		return $text;
+	return force_balance_tags( $text );
+}
+
 /*
- balanceTags
+ force_balance_tags
 
  Balances Tags of string using a modified stack.
 
@@ -433,12 +456,10 @@
 	     Added Cleaning Hooks
 	1.0  First Version
 */
-function balanceTags($text, $force = false) {
-
-	if ( !$force && get_option('use_balanceTags') == 0 )
-		return $text;
-
+function force_balance_tags( $text ) {
 	$tagstack = array(); $stacksize = 0; $tagqueue = ''; $newtext = '';
+	$single_tags = array('br', 'hr', 'img', 'input'); //Known single-entity/self-closing tags
+	$nestable_tags = array('blockquote', 'div', 'span'); //Tags that can be immediately nested within themselves
 
 	# WP bug fix for comments - in case you REALLY meant to type '< !--'
 	$text = str_replace('< !--', '<    !--', $text);
@@ -489,11 +510,11 @@
 			if((substr($regex[2],-1) == '/') || ($tag == '')) {
 			}
 			// ElseIf it's a known single-entity tag but it doesn't close itself, do so
-			elseif ($tag == 'br' || $tag == 'img' || $tag == 'hr' || $tag == 'input') {
+			elseif ( in_array($tag, $single_tags) ) {
 				$regex[2] .= '/';
 			} else {	// Push the tag onto the stack
 				// If the top of the stack is the same as the tag we want to push, close previous tag
-				if (($stacksize > 0) && ($tag != 'div') && ($tagstack[$stacksize - 1] == $tag)) {
+				if (($stacksize > 0) && !in_array($tag, $nestable_tags) && ($tagstack[$stacksize - 1] == $tag)) {
 					$tagqueue = '</' . array_pop ($tagstack) . '>';
 					$stacksize--;
 				}
@@ -534,10 +555,6 @@
 	return $newtext;
 }
 
-function force_balance_tags($text) {
-	return balanceTags($text, true);
-}
-
 function format_to_edit($content, $richedit = false) {
 	$content = apply_filters('format_to_edit', $content);
 	if (! $richedit )
@@ -546,7 +563,6 @@
 }
 
 function format_to_post($content) {
-	global $wpdb;
 	$content = apply_filters('format_to_post', $content);
 	return $content;
 }
@@ -614,18 +630,46 @@
 	return $emailNOSPAMaddy;
 }
 
+function _make_url_clickable_cb($matches) {
+	$ret = '';
+	$url = $matches[2];
+	$url = clean_url($url);
+	if ( empty($url) )
+		return $matches[0];
+	// removed trailing [.,;:] from URL
+	if ( in_array(substr($url, -1), array('.', ',', ';', ':')) === true ) {
+		$ret = substr($url, -1);
+		$url = substr($url, 0, strlen($url)-1);
+	}
+	return $matches[1] . "<a href=\"$url\" rel=\"nofollow\">$url</a>" . $ret;
+}
+
+function _make_web_ftp_clickable_cb($matches) {
+	$ret = '';
+	$dest = $matches[2];
+	$dest = 'http://' . $dest;
+	$dest = clean_url($dest);
+	if ( empty($dest) )
+		return $matches[0];
+	// removed trailing [,;:] from URL
+	if ( in_array(substr($dest, -1), array('.', ',', ';', ':')) === true ) {
+		$ret = substr($dest, -1);
+		$dest = substr($dest, 0, strlen($dest)-1);
+	}
+	return $matches[1] . "<a href=\"$dest\" rel=\"nofollow\">$dest</a>" . $ret;
+}
+
+function _make_email_clickable_cb($matches) {
+	$email = $matches[2] . '@' . $matches[3];
+	return $matches[1] . "<a href=\"mailto:$email\">$email</a>";
+}
+
 function make_clickable($ret) {
 	$ret = ' ' . $ret;
 	// in testing, using arrays here was found to be faster
-	$ret = preg_replace(
-		array(
-			'#([\s>])([\w]+?://[\w\#$%&~/.\-;:=,?@\[\]+]*)#is',
-			'#([\s>])((www|ftp)\.[\w\#$%&~/.\-;:=,?@\[\]+]*)#is',
-			'#([\s>])([a-z0-9\-_.]+)@([^,< \n\r]+)#i'),
-		array(
-			'$1<a href="$2" rel="nofollow">$2</a>',
-			'$1<a href="http://$2" rel="nofollow">$2</a>',
-			'$1<a href="mailto:$2@$3">$2@$3</a>'),$ret);
+	$ret = preg_replace_callback('#([\s>])([\w]+?://[\w\#$%&~/.\-;:=,?@\[\]+]*)#is', '_make_url_clickable_cb', $ret);
+	$ret = preg_replace_callback('#([\s>])((www|ftp)\.[\w\#$%&~/.\-;:=,?@\[\]+]*)#is', '_make_web_ftp_clickable_cb', $ret);
+	$ret = preg_replace_callback('#([\s>])([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})#i', '_make_email_clickable_cb', $ret);
 	// this one is not in an array because we need it to run last, for cleanup of accidental links within links
 	$ret = preg_replace("#(<a( [^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i", "$1$3</a>", $ret);
 	$ret = trim($ret);
@@ -636,24 +680,30 @@
 	global $wpdb;
 	// This is a pre save filter, so text is already escaped.
 	$text = stripslashes($text);
-	$text = preg_replace('|<a (.+?)>|ie', "'<a ' . str_replace(' rel=\"nofollow\"','',stripslashes('$1')) . ' rel=\"nofollow\">'", $text);
+	$text = preg_replace_callback('|<a (.+?)>|i', 'wp_rel_nofollow_callback', $text);
 	$text = $wpdb->escape($text);
 	return $text;
 }
 
+function wp_rel_nofollow_callback( $matches ) {
+	$text = $matches[1];
+	$text = str_replace(array(' rel="nofollow"', " rel='nofollow'"), '', $text);
+	return "<a $text rel=\"nofollow\">";
+}
+
 function convert_smilies($text) {
 	global $wp_smiliessearch, $wp_smiliesreplace;
     $output = '';
-	if (get_option('use_smilies')) {
+	if ( get_option('use_smilies') && !empty($wp_smiliessearch) && !empty($wp_smiliesreplace) ) {
 		// HTML loop taken from texturize function, could possible be consolidated
 		$textarr = preg_split("/(<.*>)/U", $text, -1, PREG_SPLIT_DELIM_CAPTURE); // capture the tags as well as in between
-		$stop = count($textarr);// loop stuff 
-		for ($i = 0; $i < $stop; $i++) { 
-			$content = $textarr[$i]; 
-			if ((strlen($content) > 0) && ('<' != $content{0})) { // If it's not a tag 
-				$content = preg_replace($wp_smiliessearch, $wp_smiliesreplace, $content); 
-			} 
-			$output .= $content; 
+		$stop = count($textarr);// loop stuff
+		for ($i = 0; $i < $stop; $i++) {
+			$content = $textarr[$i];
+			if ((strlen($content) > 0) && ('<' != $content{0})) { // If it's not a tag
+				$content = preg_replace($wp_smiliessearch, $wp_smiliesreplace, $content);
+			}
+			$output .= $content;
 		}
 	} else {
 		// return default text.
@@ -763,7 +813,7 @@
 	} else if (($diff <= 86400) && ($diff > 3600)) {
 		$hours = round($diff / 3600);
 		if ($hours <= 1) {
-			$hour = 1;
+			$hours = 1;
 		}
 		$since = sprintf(__ngettext('%s hour', '%s hours', $hours), $hours);
 	} elseif ($diff >= 86400) {
@@ -777,7 +827,6 @@
 }
 
 function wp_trim_excerpt($text) { // Fakes an excerpt if needed
-	global $post;
 	if ( '' == $text ) {
 		$text = get_the_content('');
 		$text = apply_filters('the_content', $text);
@@ -1073,23 +1122,43 @@
 	return apply_filters('richedit_pre', $output);
 }
 
-function clean_url( $url, $protocols = null ) {
+function wp_htmledit_pre($output) {
+	if ( !empty($output) )
+		$output = htmlspecialchars($output, ENT_NOQUOTES); // convert only < > &
+
+	return apply_filters('htmledit_pre', $output);
+}
+
+function clean_url( $url, $protocols = null, $context = 'display' ) {
+	$original_url = $url;
+
 	if ('' == $url) return $url;
-	$url = preg_replace('|[^a-z0-9-~+_.?#=!&;,/:%]|i', '', $url);
+	$url = preg_replace('|[^a-z0-9-~+_.?#=!&;,/:%@()]|i', '', $url);
 	$strip = array('%0d', '%0a');
 	$url = str_replace($strip, '', $url);
 	$url = str_replace(';//', '://', $url);
-	// Append http unless a relative link starting with / or a php file.
-	if ( strpos($url, '://') === false &&
+	/* If the URL doesn't appear to contain a scheme, we
+	 * presume it needs http:// appended (unless a relative
+	 * link starting with / or a php file).
+	*/
+	if ( strpos($url, ':') === false &&
 		substr( $url, 0, 1 ) != '/' && !preg_match('/^[a-z0-9-]+?\.php/i', $url) )
 		$url = 'http://' . $url;
-	
-	$url = preg_replace('/&([^#])(?![a-z]{2,8};)/', '&#038;$1', $url);
+
+	// Replace ampersands ony when displaying.
+	if ( 'display' == $context )
+		$url = preg_replace('/&([^#])(?![a-z]{2,8};)/', '&#038;$1', $url);
+
 	if ( !is_array($protocols) )
-		$protocols = array('http', 'https', 'ftp', 'ftps', 'mailto', 'news', 'irc', 'gopher', 'nntp', 'feed', 'telnet'); 
+		$protocols = array('http', 'https', 'ftp', 'ftps', 'mailto', 'news', 'irc', 'gopher', 'nntp', 'feed', 'telnet');
 	if ( wp_kses_bad_protocol( $url, $protocols ) != $url )
 		return '';
-	return $url;
+
+	return apply_filters('clean_url', $url, $original_url, $context);
+}
+
+function sanitize_url( $url, $protocols = null ) {
+	return clean_url( $url, $protocols, 'db');
 }
 
 // Borrowed from the PHP Manual user notes. Convert entities, while
@@ -1114,10 +1183,100 @@
 	return apply_filters('attribute_escape', $safe_text, $text);
 }
 
+// Escape a HTML tag name
+function tag_escape($tag_name) {
+	$safe_tag = strtolower( preg_replace('[^a-zA-Z_:]', '', $tag_name) );
+	return apply_filters('tag_escape', $safe_tag, $tag_name);
+}
+
+/**
+ * Escapes text for SQL LIKE special characters % and _
+ *
+ * @param string text the text to be escaped
+ * @return string text, safe for inclusion in LIKE query
+ */
+function like_escape($text) {
+	return str_replace(array("%", "_"), array("\\%", "\\_"), $text);
+}
+
 function wp_make_link_relative( $link ) {
 	return preg_replace('|https?://[^/]+(/.*)|i', '$1', $link );
 }
 
+function sanitize_option($option, $value) { // Remember to call stripslashes!
+
+	switch ($option) {
+		case 'admin_email':
+			$value = sanitize_email($value);
+			break;
+
+		case 'default_post_edit_rows':
+		case 'mailserver_port':
+		case 'comment_max_links':
+		case 'page_on_front':
+		case 'rss_excerpt_length':
+		case 'default_category':
+		case 'default_email_category':
+		case 'default_link_category':
+			$value = abs((int) $value);
+			break;
+
+		case 'posts_per_page':
+		case 'posts_per_rss':
+			$value = (int) $value;
+			if ( empty($value) ) $value = 1;
+			if ( $value < -1 ) $value = abs($value);
+			break;
+
+		case 'default_ping_status':
+		case 'default_comment_status':
+			// Options that if not there have 0 value but need to be something like "closed"
+			if ( $value == '0' || $value == '')
+				$value = 'closed';
+			break;
+
+		case 'blogdescription':
+		case 'blogname':
+			$value = addslashes($value);
+			$value = wp_filter_post_kses( $value ); // calls stripslashes then addslashes
+			$value = stripslashes($value);
+			$value = wp_specialchars( $value );
+			break;
+
+		case 'blog_charset':
+			$value = preg_replace('/[^a-zA-Z0-9_-]/', '', $value); // strips slashes
+			break;
+
+		case 'date_format':
+		case 'time_format':
+		case 'mailserver_url':
+		case 'mailserver_login':
+		case 'mailserver_pass':
+		case 'ping_sites':
+		case 'upload_path':
+			$value = strip_tags($value);
+			$value = addslashes($value);
+			$value = wp_filter_kses($value); // calls stripslashes then addslashes
+			$value = stripslashes($value);
+			break;
+
+		case 'gmt_offset':
+			$value = preg_replace('/[^0-9:.-]/', '', $value); // strips slashes
+			break;
+
+		case 'siteurl':
+		case 'home':
+			$value = stripslashes($value);
+			$value = clean_url($value);
+			break;
+		default :
+			$value = apply_filters("sanitize_option_{$option}", $value, $option);
+			break;
+	}
+
+	return $value;
+}
+
 function wp_parse_str( $string, &$array ) {
 	parse_str( $string, $array );
 	if ( get_magic_quotes_gpc() )
@@ -1125,4 +1284,126 @@
 	$array = apply_filters( 'wp_parse_str', $array );
 }
 
+// Convert lone less than signs.  KSES already converts lone greater than signs.
+function wp_pre_kses_less_than( $text ) {
+	return preg_replace_callback('%<[^>]*?((?=<)|>|$)%', 'wp_pre_kses_less_than_callback', $text);
+}
+
+function wp_pre_kses_less_than_callback( $matches ) {
+	if ( false === strpos($matches[0], '>') )
+		return wp_specialchars($matches[0]);
+	return $matches[0];
+}
+
+/**
+ * wp_sprintf() - sprintf() with filters
+ */
+function wp_sprintf( $pattern ) {
+	$args = func_get_args( );
+	$len = strlen($pattern);
+	$start = 0;
+	$result = '';
+	$arg_index = 0;
+	while ( $len > $start ) {
+		// Last character: append and break
+		if ( strlen($pattern) - 1 == $start ) {
+			$result .= substr($pattern, -1);
+			break;
+		}
+
+		// Literal %: append and continue
+		if ( substr($pattern, $start, 2) == '%%' ) {
+			$start += 2;
+			$result .= '%';
+			continue;
+		}
+
+		// Get fragment before next %
+		$end = strpos($pattern, '%', $start + 1);
+		if ( false === $end )
+			$end = $len;
+		$fragment = substr($pattern, $start, $end - $start);
+
+		// Fragment has a specifier
+		if ( $pattern{$start} == '%' ) {
+			// Find numbered arguments or take the next one in order
+			if ( preg_match('/^%(\d+)\$/', $fragment, $matches) ) {
+				$arg = isset($args[$matches[1]]) ? $args[$matches[1]] : '';
+				$fragment = str_replace("%{$matches[1]}$", '%', $fragment);
+			} else {
+				++$arg_index;
+				$arg = isset($args[$arg_index]) ? $args[$arg_index] : '';
+			}
+
+			// Apply filters OR sprintf
+			$_fragment = apply_filters( 'wp_sprintf', $fragment, $arg );
+			if ( $_fragment != $fragment )
+				$fragment = $_fragment;
+			else
+				$fragment = sprintf($fragment, strval($arg) );
+		}
+
+		// Append to result and move to next fragment
+		$result .= $fragment;
+		$start = $end;
+	}
+	return $result;
+}
+
+/**
+ * wp_sprintf_l - List specifier %l for wp_sprintf
+ *
+ * @param unknown_type $pattern
+ * @param unknown_type $args
+ * @return unknown
+ */
+function wp_sprintf_l($pattern, $args) {
+	// Not a match
+	if ( substr($pattern, 0, 2) != '%l' )
+		return $pattern;
+
+	// Nothing to work with
+	if ( empty($args) )
+		return '';
+
+	// Translate and filter the delimiter set (avoid ampersands and entities here)
+	$l = apply_filters('wp_sprintf_l', array(
+		'between'          => _c(', |between list items'),
+		'between_last_two' => _c(', and |between last two list items'),
+		'between_only_two' => _c(' and |between only two list items'),
+		));
+
+	$args = (array) $args;
+	$result = array_shift($args);
+	if ( count($args) == 1 )
+		$result .= $l['between_only_two'] . array_shift($args);
+	// Loop when more than two args
+	while ( count($args) ) {
+		$arg = array_shift($args);
+		if ( $i == 1 )
+			$result .= $l['between_last_two'] . $arg;
+		else
+			$result .= $l['between'] . $arg;
+	}
+	return $result . substr($pattern, 2);
+}
+
+/**
+ * Safely extracts not more than the first $count characters from html string
+ *
+ * UTF-8, tags and entities safe prefix extraction. Entities inside will *NOT* be
+ * counted as one character. For example &amp; will be counted as 4, &lt; as 3, etc.
+ *
+ * @param integer $str String to get the excerpt from
+ * @param integer $count Maximum number of characters to take
+ * @eaturn string the excerpt
+ */
+function wp_html_excerpt( $str, $count ) {
+	$str = strip_tags( $str );
+	$str = mb_strcut( $str, 0, $count );
+	// remove part of an entity at the end
+	$str = preg_replace( '/&[^;\s]{0,6}$/', '', $str );
+	return $str;
+}
+
 ?>
diff -x .svn -aruN 2.2.2.src/wp-includes/functions.php 2.5.src/wp-includes/functions.php
--- 2.2.2.src/wp-includes/functions.php	2007-08-01 14:14:28.000000000 -0500
+++ 2.5.src/wp-includes/functions.php	2008-03-24 19:22:37.000000000 -0500
@@ -1,16 +1,21 @@
 <?php
 
-require_once(dirname(__FILE__).'/compat.php');
-
-function mysql2date($dateformatstring, $mysqlstring, $translate = true) {
+function mysql2date( $dateformatstring, $mysqlstring, $translate = true ) {
 	global $wp_locale;
 	$m = $mysqlstring;
-	if ( empty($m) ) {
+	if ( empty( $m ) )
 		return false;
+
+	if( 'G' == $dateformatstring ) {
+		return gmmktime(
+			(int) substr( $m, 11, 2 ), (int) substr( $m, 14, 2 ), (int) substr( $m, 17, 2 ),
+			(int) substr( $m, 5, 2 ), (int) substr( $m, 8, 2 ), (int) substr( $m, 0, 4 )
+		);
 	}
-	$i = mktime( 
-		(int) substr( $m, 11, 2 ), (int) substr( $m, 14, 2 ), (int) substr( $m, 17, 2 ), 
-		(int) substr( $m, 5, 2 ), (int) substr( $m, 8, 2 ), (int) substr( $m, 0, 4 ) 
+
+	$i = mktime(
+		(int) substr( $m, 11, 2 ), (int) substr( $m, 14, 2 ), (int) substr( $m, 17, 2 ),
+		(int) substr( $m, 5, 2 ), (int) substr( $m, 8, 2 ), (int) substr( $m, 0, 4 )
 	);
 
 	if( 'U' == $dateformatstring )
@@ -19,224 +24,210 @@
 	if ( -1 == $i || false == $i )
 		$i = 0;
 
-	if ( !empty($wp_locale->month) && !empty($wp_locale->weekday) && $translate ) {
-		$datemonth = $wp_locale->get_month(date('m', $i));
-		$datemonth_abbrev = $wp_locale->get_month_abbrev($datemonth);
-		$dateweekday = $wp_locale->get_weekday(date('w', $i));
-		$dateweekday_abbrev = $wp_locale->get_weekday_abbrev($dateweekday);
-		$datemeridiem = $wp_locale->get_meridiem(date('a', $i));
-		$datemeridiem_capital = $wp_locale->get_meridiem(date('A', $i));
-		$dateformatstring = ' '.$dateformatstring;
-		$dateformatstring = preg_replace("/([^\\\])D/", "\\1".backslashit($dateweekday_abbrev), $dateformatstring);
-		$dateformatstring = preg_replace("/([^\\\])F/", "\\1".backslashit($datemonth), $dateformatstring);
-		$dateformatstring = preg_replace("/([^\\\])l/", "\\1".backslashit($dateweekday), $dateformatstring);
-		$dateformatstring = preg_replace("/([^\\\])M/", "\\1".backslashit($datemonth_abbrev), $dateformatstring);
-		$dateformatstring = preg_replace("/([^\\\])a/", "\\1".backslashit($datemeridiem), $dateformatstring);
-		$dateformatstring = preg_replace("/([^\\\])A/", "\\1".backslashit($datemeridiem_capital), $dateformatstring);
-
-		$dateformatstring = substr($dateformatstring, 1, strlen($dateformatstring)-1);
-	}
-	$j = @date($dateformatstring, $i);
-	if ( !$j ) {
-	// for debug purposes
-	//	echo $i." ".$mysqlstring;
-	}
+	if ( !empty( $wp_locale->month ) && !empty( $wp_locale->weekday ) && $translate ) {
+		$datemonth = $wp_locale->get_month( date( 'm', $i ) );
+		$datemonth_abbrev = $wp_locale->get_month_abbrev( $datemonth );
+		$dateweekday = $wp_locale->get_weekday( date( 'w', $i ) );
+		$dateweekday_abbrev = $wp_locale->get_weekday_abbrev( $dateweekday );
+		$datemeridiem = $wp_locale->get_meridiem( date( 'a', $i ) );
+		$datemeridiem_capital = $wp_locale->get_meridiem( date( 'A', $i ) );
+		$dateformatstring = ' ' . $dateformatstring;
+		$dateformatstring = preg_replace( "/([^\\\])D/", "\\1" . backslashit( $dateweekday_abbrev ), $dateformatstring );
+		$dateformatstring = preg_replace( "/([^\\\])F/", "\\1" . backslashit( $datemonth ), $dateformatstring );
+		$dateformatstring = preg_replace( "/([^\\\])l/", "\\1" . backslashit( $dateweekday ), $dateformatstring );
+		$dateformatstring = preg_replace( "/([^\\\])M/", "\\1" . backslashit( $datemonth_abbrev ), $dateformatstring );
+		$dateformatstring = preg_replace( "/([^\\\])a/", "\\1" . backslashit( $datemeridiem ), $dateformatstring );
+		$dateformatstring = preg_replace( "/([^\\\])A/", "\\1" . backslashit( $datemeridiem_capital ), $dateformatstring );
+
+		$dateformatstring = substr( $dateformatstring, 1, strlen( $dateformatstring ) -1 );
+	}
+	$j = @date( $dateformatstring, $i );
+
+	/*
+	if ( !$j ) // for debug purposes
+		echo $i." ".$mysqlstring;
+	*/
+
 	return $j;
 }
 
-function current_time($type, $gmt = 0) {
-	switch ($type) {
+
+function current_time( $type, $gmt = 0 ) {
+	switch ( $type ) {
 		case 'mysql':
-			if ( $gmt ) $d = gmdate('Y-m-d H:i:s');
-			else $d = gmdate('Y-m-d H:i:s', (time() + (get_option('gmt_offset') * 3600)));
-			return $d;
+			return ( $gmt ) ? gmdate( 'Y-m-d H:i:s' ) : gmdate( 'Y-m-d H:i:s', ( time() + ( get_option( 'gmt_offset' ) * 3600 ) ) );
 			break;
 		case 'timestamp':
-			if ( $gmt ) $d = time();
-			else $d = time() + (get_option('gmt_offset') * 3600);
-			return $d;
+			return ( $gmt ) ? time() : time() + ( get_option( 'gmt_offset' ) * 3600 );
 			break;
 	}
 }
 
-function date_i18n($dateformatstring, $unixtimestamp) {
+
+function date_i18n( $dateformatstring, $unixtimestamp ) {
 	global $wp_locale;
 	$i = $unixtimestamp;
-	if ( (!empty($wp_locale->month)) && (!empty($wp_locale->weekday)) ) {
-		$datemonth = $wp_locale->get_month(date('m', $i));
-		$datemonth_abbrev = $wp_locale->get_month_abbrev($datemonth);
-		$dateweekday = $wp_locale->get_weekday(date('w', $i));
-		$dateweekday_abbrev = $wp_locale->get_weekday_abbrev($dateweekday);
-		$datemeridiem = $wp_locale->get_meridiem(date('a', $i));
-		$datemeridiem_capital = $wp_locale->get_meridiem(date('A', $i));
+	if ( ( !empty( $wp_locale->month ) ) && ( !empty( $wp_locale->weekday ) ) ) {
+		$datemonth = $wp_locale->get_month( date( 'm', $i ) );
+		$datemonth_abbrev = $wp_locale->get_month_abbrev( $datemonth );
+		$dateweekday = $wp_locale->get_weekday( date( 'w', $i ) );
+		$dateweekday_abbrev = $wp_locale->get_weekday_abbrev( $dateweekday );
+		$datemeridiem = $wp_locale->get_meridiem( date( 'a', $i ) );
+		$datemeridiem_capital = $wp_locale->get_meridiem( date( 'A', $i ) );
 		$dateformatstring = ' '.$dateformatstring;
-		$dateformatstring = preg_replace("/([^\\\])D/", "\\1".backslashit($dateweekday_abbrev), $dateformatstring);
-		$dateformatstring = preg_replace("/([^\\\])F/", "\\1".backslashit($datemonth), $dateformatstring);
-		$dateformatstring = preg_replace("/([^\\\])l/", "\\1".backslashit($dateweekday), $dateformatstring);
-		$dateformatstring = preg_replace("/([^\\\])M/", "\\1".backslashit($datemonth_abbrev), $dateformatstring);
-		$dateformatstring = preg_replace("/([^\\\])a/", "\\1".backslashit($datemeridiem), $dateformatstring);
-		$dateformatstring = preg_replace("/([^\\\])A/", "\\1".backslashit($datemeridiem_capital), $dateformatstring);
+		$dateformatstring = preg_replace( "/([^\\\])D/", "\\1" . backslashit( $dateweekday_abbrev ), $dateformatstring );
+		$dateformatstring = preg_replace( "/([^\\\])F/", "\\1" . backslashit( $datemonth ), $dateformatstring );
+		$dateformatstring = preg_replace( "/([^\\\])l/", "\\1" . backslashit( $dateweekday ), $dateformatstring );
+		$dateformatstring = preg_replace( "/([^\\\])M/", "\\1" . backslashit( $datemonth_abbrev ), $dateformatstring );
+		$dateformatstring = preg_replace( "/([^\\\])a/", "\\1" . backslashit( $datemeridiem ), $dateformatstring );
+		$dateformatstring = preg_replace( "/([^\\\])A/", "\\1" . backslashit( $datemeridiem_capital ), $dateformatstring );
 
-		$dateformatstring = substr($dateformatstring, 1, strlen($dateformatstring)-1);
+		$dateformatstring = substr( $dateformatstring, 1, strlen( $dateformatstring ) -1 );
 	}
-	$j = @date($dateformatstring, $i);
+	$j = @date( $dateformatstring, $i );
 	return $j;
 }
 
-function get_weekstartend($mysqlstring, $start_of_week) {
-	$my = substr($mysqlstring,0,4);
-	$mm = substr($mysqlstring,8,2);
-	$md = substr($mysqlstring,5,2);
-	$day = mktime(0,0,0, $md, $mm, $my);
-	$weekday = date('w',$day);
+
+function number_format_i18n( $number, $decimals = null ) {
+	global $wp_locale;
+	// let the user override the precision only
+	$decimals = ( is_null( $decimals ) ) ? $wp_locale->number_format['decimals'] : intval( $decimals );
+
+	return number_format( $number, $decimals, $wp_locale->number_format['decimal_point'], $wp_locale->number_format['thousands_sep'] );
+}
+
+
+function size_format( $bytes, $decimals = null ) {
+	// technically the correct unit names for powers of 1024 are KiB, MiB etc
+	// see http://en.wikipedia.org/wiki/Byte
+	$quant = array(
+		// ========================= Origin ====
+		'TB' => 1099511627776,  // pow( 1024, 4)
+		'GB' => 1073741824,     // pow( 1024, 3)
+		'MB' => 1048576,        // pow( 1024, 2)
+		'kB' => 1024,           // pow( 1024, 1)
+		'B ' => 1,              // pow( 1024, 0)
+	);
+
+	foreach ( $quant as $unit => $mag )
+		if ( doubleval($bytes) >= $mag )
+			return number_format_i18n( $bytes / $mag, $decimals ) . ' ' . $unit;
+
+	return false;
+}
+
+
+function get_weekstartend( $mysqlstring, $start_of_week = '' ) {
+	$my = substr( $mysqlstring, 0, 4 );
+	$mm = substr( $mysqlstring, 8, 2 );
+	$md = substr( $mysqlstring, 5, 2 );
+	$day = mktime( 0, 0, 0, $md, $mm, $my );
+	$weekday = date( 'w', $day );
 	$i = 86400;
+	if( !is_numeric($start_of_week) )
+		$start_of_week = get_option( 'start_of_week' );
 
-	if ( $weekday < get_option('start_of_week') )
-		$weekday = 7 - (get_option('start_of_week') - $weekday);
+	if ( $weekday < $start_of_week )
+		$weekday = 7 - $start_of_week - $weekday;
 
-	while ($weekday > get_option('start_of_week')) {
-		$weekday = date('w',$day);
-		if ( $weekday < get_option('start_of_week') )
-			$weekday = 7 - (get_option('start_of_week') - $weekday);
+	while ( $weekday > $start_of_week ) {
+		$weekday = date( 'w', $day );
+		if ( $weekday < $start_of_week )
+			$weekday = 7 - $start_of_week - $weekday;
 
-		$day = $day - 86400;
+		$day -= 86400;
 		$i = 0;
 	}
 	$week['start'] = $day + 86400 - $i;
-	// $week['end'] = $day - $i + 691199;
 	$week['end'] = $week['start'] + 604799;
 	return $week;
 }
 
-function get_lastpostdate($timezone = 'server') {
-	global $cache_lastpostdate, $pagenow, $wpdb, $blog_id;
-	$add_seconds_blog = get_option('gmt_offset') * 3600;
-	$add_seconds_server = date('Z');
-	if ( !isset($cache_lastpostdate[$blog_id][$timezone]) ) {
-		switch(strtolower($timezone)) {
-			case 'gmt':
-				$lastpostdate = $wpdb->get_var("SELECT post_date_gmt FROM $wpdb->posts WHERE post_status = 'publish' ORDER BY post_date_gmt DESC LIMIT 1");
-				break;
-			case 'blog':
-				$lastpostdate = $wpdb->get_var("SELECT post_date FROM $wpdb->posts WHERE post_status = 'publish' ORDER BY post_date_gmt DESC LIMIT 1");
-				break;
-			case 'server':
-				$lastpostdate = $wpdb->get_var("SELECT DATE_ADD(post_date_gmt, INTERVAL '$add_seconds_server' SECOND) FROM $wpdb->posts WHERE post_status = 'publish' ORDER BY post_date_gmt DESC LIMIT 1");
-				break;
-		}
-		$cache_lastpostdate[$blog_id][$timezone] = $lastpostdate;
-	} else {
-		$lastpostdate = $cache_lastpostdate[$blog_id][$timezone];
-	}
-	return $lastpostdate;
-}
 
-function get_lastpostmodified($timezone = 'server') {
-	global $cache_lastpostmodified, $pagenow, $wpdb, $blog_id;
-	$add_seconds_blog = get_option('gmt_offset') * 3600;
-	$add_seconds_server = date('Z');
-	if ( !isset($cache_lastpostmodified[$blog_id][$timezone]) ) {
-		switch(strtolower($timezone)) {
-			case 'gmt':
-				$lastpostmodified = $wpdb->get_var("SELECT post_modified_gmt FROM $wpdb->posts WHERE post_status = 'publish' ORDER BY post_modified_gmt DESC LIMIT 1");
-				break;
-			case 'blog':
-				$lastpostmodified = $wpdb->get_var("SELECT post_modified FROM $wpdb->posts WHERE post_status = 'publish' ORDER BY post_modified_gmt DESC LIMIT 1");
-				break;
-			case 'server':
-				$lastpostmodified = $wpdb->get_var("SELECT DATE_ADD(post_modified_gmt, INTERVAL '$add_seconds_server' SECOND) FROM $wpdb->posts WHERE post_status = 'publish' ORDER BY post_modified_gmt DESC LIMIT 1");
-				break;
-		}
-		$lastpostdate = get_lastpostdate($timezone);
-		if ( $lastpostdate > $lastpostmodified ) {
-			$lastpostmodified = $lastpostdate;
-		}
-		$cache_lastpostmodified[$blog_id][$timezone] = $lastpostmodified;
-	} else {
-		$lastpostmodified = $cache_lastpostmodified[$blog_id][$timezone];
-	}
-	return $lastpostmodified;
-}
-
-function maybe_unserialize($original) {
-	if ( is_serialized($original) ) // don't attempt to unserialize data that wasn't serialized going in
-		if ( false !== $gm = @ unserialize($original) )
+function maybe_unserialize( $original ) {
+	if ( is_serialized( $original ) ) // don't attempt to unserialize data that wasn't serialized going in
+		if ( false !== $gm = @unserialize( $original ) )
 			return $gm;
 	return $original;
 }
 
-function is_serialized($data) {
+
+function is_serialized( $data ) {
 	// if it isn't a string, it isn't serialized
-	if ( !is_string($data) )
+	if ( !is_string( $data ) )
 		return false;
-	$data = trim($data);
+	$data = trim( $data );
 	if ( 'N;' == $data )
 		return true;
-	if ( !preg_match('/^([adObis]):/', $data, $badions) )
+	if ( !preg_match( '/^([adObis]):/', $data, $badions ) )
 		return false;
-	switch ( $badions[1] ) :
-	case 'a' :
-	case 'O' :
-	case 's' :
-		if ( preg_match("/^{$badions[1]}:[0-9]+:.*[;}]\$/s", $data) )
-			return true;
-		break;
-	case 'b' :
-	case 'i' :
-	case 'd' :
-		if ( preg_match("/^{$badions[1]}:[0-9.E-]+;\$/", $data) )
-			return true;
-		break;
-	endswitch;
+	switch ( $badions[1] ) {
+		case 'a' :
+		case 'O' :
+		case 's' :
+			if ( preg_match( "/^{$badions[1]}:[0-9]+:.*[;}]\$/s", $data ) )
+				return true;
+			break;
+		case 'b' :
+		case 'i' :
+		case 'd' :
+			if ( preg_match( "/^{$badions[1]}:[0-9.E-]+;\$/", $data ) )
+				return true;
+			break;
+	}
 	return false;
 }
 
-function is_serialized_string($data) {
+
+function is_serialized_string( $data ) {
 	// if it isn't a string, it isn't a serialized string
-	if ( !is_string($data) )
+	if ( !is_string( $data ) )
 		return false;
-	$data = trim($data);
-	if ( preg_match('/^s:[0-9]+:.*;$/s',$data) ) // this should fetch all serialized strings
+	$data = trim( $data );
+	if ( preg_match( '/^s:[0-9]+:.*;$/s', $data ) ) // this should fetch all serialized strings
 		return true;
 	return false;
 }
 
+
 /* Options functions */
 
 // expects $setting to already be SQL-escaped
-function get_option($setting) {
+function get_option( $setting ) {
 	global $wpdb;
 
 	// Allow plugins to short-circuit options.
-	$pre = apply_filters( 'pre_option_' . $setting, false ); 
-	if ( $pre ) 
-		return $pre; 
+	$pre = apply_filters( 'pre_option_' . $setting, false );
+	if ( false !== $pre )
+		return $pre;
 
 	// prevent non-existent options from triggering multiple queries
-	$notoptions = wp_cache_get('notoptions', 'options');
-	if ( isset($notoptions[$setting]) )
+	$notoptions = wp_cache_get( 'notoptions', 'options' );
+	if ( isset( $notoptions[$setting] ) )
 		return false;
 
 	$alloptions = wp_load_alloptions();
 
-	if ( isset($alloptions[$setting]) ) {
+	if ( isset( $alloptions[$setting] ) ) {
 		$value = $alloptions[$setting];
 	} else {
-		$value = wp_cache_get($setting, 'options');
+		$value = wp_cache_get( $setting, 'options' );
 
 		if ( false === $value ) {
-			if ( defined('WP_INSTALLING') )
-				$wpdb->hide_errors();
-			$row = $wpdb->get_row("SELECT option_value FROM $wpdb->options WHERE option_name = '$setting' LIMIT 1");
-			if ( defined('WP_INSTALLING') )
-				$wpdb->show_errors();
+			if ( defined( 'WP_INSTALLING' ) )
+				$supress = $wpdb->suppress_errors();
+			// expected_slashed ($setting)
+			$row = $wpdb->get_row( "SELECT option_value FROM $wpdb->options WHERE option_name = '$setting' LIMIT 1" );
+			if ( defined( 'WP_INSTALLING' ) )
+				$wpdb->suppress_errors($suppress);
 
-			if( is_object( $row) ) { // Has to be get_row instead of get_var because of funkiness with 0, false, null values
+			if ( is_object( $row) ) { // Has to be get_row instead of get_var because of funkiness with 0, false, null values
 				$value = $row->option_value;
-				wp_cache_add($setting, $value, 'options');
+				wp_cache_add( $setting, $value, 'options' );
 			} else { // option does not exist, so we must cache its non-existence
 				$notoptions[$setting] = true;
-				wp_cache_set('notoptions', $notoptions, 'options');
+				wp_cache_set( 'notoptions', $notoptions, 'options' );
 				return false;
 			}
 		}
@@ -244,274 +235,268 @@
 
 	// If home is not set use siteurl.
 	if ( 'home' == $setting && '' == $value )
-		return get_option('siteurl');
+		return get_option( 'siteurl' );
 
-	if ( 'siteurl' == $setting || 'home' == $setting || 'category_base' == $setting )
-		$value = preg_replace('|/+$|', '', $value);
+	if ( in_array( $setting, array('siteurl', 'home', 'category_base', 'tag_base') ) )
+		$value = untrailingslashit( $value );
 
-	return apply_filters( 'option_' . $setting, maybe_unserialize($value) );
+	return apply_filters( 'option_' . $setting, maybe_unserialize( $value ) );
 }
 
-function wp_protect_special_option($option) {
-	$protected = array('alloptions', 'notoptions');
-	if ( in_array($option, $protected) )
-		die(sprintf(__('%s is a protected WP option and may not be modified'), wp_specialchars($option)));
+
+function wp_protect_special_option( $option ) {
+	$protected = array( 'alloptions', 'notoptions' );
+	if ( in_array( $option, $protected ) )
+		die( sprintf( __( '%s is a protected WP option and may not be modified' ), wp_specialchars( $option ) ) );
 }
 
-function form_option($option) {
-	echo attribute_escape(get_option($option));
+function form_option( $option ) {
+	echo attribute_escape (get_option( $option ) );
 }
 
 function get_alloptions() {
 	global $wpdb, $wp_queries;
-	$wpdb->hide_errors();
-	if ( !$options = $wpdb->get_results("SELECT option_name, option_value FROM $wpdb->options WHERE autoload = 'yes'") ) {
-		$options = $wpdb->get_results("SELECT option_name, option_value FROM $wpdb->options");
-	}
-	$wpdb->show_errors();
+	$show = $wpdb->hide_errors();
+	if ( !$options = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options WHERE autoload = 'yes'" ) )
+		$options = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options" );
+	$wpdb->show_errors($show);
 
-	foreach ($options as $option) {
+	foreach ( $options as $option ) {
 		// "When trying to design a foolproof system,
 		//  never underestimate the ingenuity of the fools :)" -- Dougal
-		if ( 'siteurl' == $option->option_name )
-			$option->option_value = preg_replace('|/+$|', '', $option->option_value);
-		if ( 'home' == $option->option_name )
-			$option->option_value = preg_replace('|/+$|', '', $option->option_value);
-		if ( 'category_base' == $option->option_name )
-			$option->option_value = preg_replace('|/+$|', '', $option->option_value);
-		$value = maybe_unserialize($option->option_value);
-		$all_options->{$option->option_name} = apply_filters('pre_option_' . $option->option_name, $value);
+		if ( in_array( $option->option_name, array( 'siteurl', 'home', 'category_base' ) ) )
+			$option->option_value = untrailingslashit( $option->option_value );
+		$value = maybe_unserialize( $option->option_value );
+		$all_options->{$option->option_name} = apply_filters( 'pre_option_' . $option->option_name, $value );
 	}
-	return apply_filters('all_options', $all_options);
+	return apply_filters( 'all_options', $all_options );
 }
 
+
 function wp_load_alloptions() {
 	global $wpdb;
 
-	$alloptions = wp_cache_get('alloptions', 'options');
+	$alloptions = wp_cache_get( 'alloptions', 'options' );
 
 	if ( !$alloptions ) {
-		$wpdb->hide_errors();
-		if ( !$alloptions_db = $wpdb->get_results("SELECT option_name, option_value FROM $wpdb->options WHERE autoload = 'yes'") )
-			$alloptions_db = $wpdb->get_results("SELECT option_name, option_value FROM $wpdb->options");
-		$wpdb->show_errors();
+		$suppress = $wpdb->suppress_errors();
+		if ( !$alloptions_db = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options WHERE autoload = 'yes'" ) )
+			$alloptions_db = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options" );
+		$wpdb->suppress_errors($suppress);
 		$alloptions = array();
 		foreach ( (array) $alloptions_db as $o )
 			$alloptions[$o->option_name] = $o->option_value;
-		wp_cache_add('alloptions', $alloptions, 'options');
+		wp_cache_add( 'alloptions', $alloptions, 'options' );
 	}
 	return $alloptions;
 }
 
+
 // expects $option_name to NOT be SQL-escaped
-function update_option($option_name, $newvalue) {
+function update_option( $option_name, $newvalue ) {
 	global $wpdb;
 
-	wp_protect_special_option($option_name);
+	wp_protect_special_option( $option_name );
 
-	$safe_option_name = $wpdb->escape($option_name);
-
-	if ( is_string($newvalue) )
-		$newvalue = trim($newvalue);
+	$safe_option_name = $wpdb->escape( $option_name );
+	$newvalue = sanitize_option( $option_name, $newvalue );
 
 	// If the new and old values are the same, no need to update.
-	$oldvalue = get_option($safe_option_name);
-	if ( $newvalue === $oldvalue ) {
+	$oldvalue = get_option( $safe_option_name );
+	if ( $newvalue === $oldvalue )
 		return false;
-	}
 
 	if ( false === $oldvalue ) {
-		add_option($option_name, $newvalue);
+		add_option( $option_name, $newvalue );
 		return true;
 	}
 
-	$notoptions = wp_cache_get('notoptions', 'options');
-	if ( is_array($notoptions) && isset($notoptions[$option_name]) ) {
-		unset($notoptions[$option_name]);
-		wp_cache_set('notoptions', $notoptions, 'options');
+	$notoptions = wp_cache_get( 'notoptions', 'options' );
+	if ( is_array( $notoptions ) && isset( $notoptions[$option_name] ) ) {
+		unset( $notoptions[$option_name] );
+		wp_cache_set( 'notoptions', $notoptions, 'options' );
 	}
 
 	$_newvalue = $newvalue;
-	$newvalue = maybe_serialize($newvalue);
+	$newvalue = maybe_serialize( $newvalue );
 
 	$alloptions = wp_load_alloptions();
-	if ( isset($alloptions[$option_name]) ) {
+	if ( isset( $alloptions[$option_name] ) ) {
 		$alloptions[$option_name] = $newvalue;
-		wp_cache_set('alloptions', $alloptions, 'options');
+		wp_cache_set( 'alloptions', $alloptions, 'options' );
 	} else {
-		wp_cache_set($option_name, $newvalue, 'options');
+		wp_cache_set( $option_name, $newvalue, 'options' );
 	}
 
-	$newvalue = $wpdb->escape($newvalue);
-	$option_name = $wpdb->escape($option_name);
-	$wpdb->query("UPDATE $wpdb->options SET option_value = '$newvalue' WHERE option_name = '$option_name'");
+	$wpdb->query( $wpdb->prepare( "UPDATE $wpdb->options SET option_value = %s WHERE option_name = %s", $newvalue, $option_name ) );
 	if ( $wpdb->rows_affected == 1 ) {
-		do_action("update_option_{$option_name}", $oldvalue, $_newvalue);
+		do_action( "update_option_{$option_name}", $oldvalue, $_newvalue );
 		return true;
 	}
 	return false;
 }
 
+
 // thx Alex Stapleton, http://alex.vort-x.net/blog/
 // expects $name to NOT be SQL-escaped
-function add_option($name, $value = '', $description = '', $autoload = 'yes') {
+function add_option( $name, $value = '', $deprecated = '', $autoload = 'yes' ) {
 	global $wpdb;
 
-	wp_protect_special_option($name);
-	$safe_name = $wpdb->escape($name);
+	wp_protect_special_option( $name );
+	$safe_name = $wpdb->escape( $name );
+	$value = sanitize_option( $name, $value );
 
 	// Make sure the option doesn't already exist. We can check the 'notoptions' cache before we ask for a db query
-	$notoptions = wp_cache_get('notoptions', 'options');
-	if ( !is_array($notoptions) || !isset($notoptions[$name]) )
-		if ( false !== get_option($safe_name) )
+	$notoptions = wp_cache_get( 'notoptions', 'options' );
+	if ( !is_array( $notoptions ) || !isset( $notoptions[$name] ) )
+		if ( false !== get_option( $safe_name ) )
 			return;
 
-	$value = maybe_serialize($value);
+	$value = maybe_serialize( $value );
 	$autoload = ( 'no' === $autoload ) ? 'no' : 'yes';
 
 	if ( 'yes' == $autoload ) {
 		$alloptions = wp_load_alloptions();
 		$alloptions[$name] = $value;
-		wp_cache_set('alloptions', $alloptions, 'options');
+		wp_cache_set( 'alloptions', $alloptions, 'options' );
 	} else {
-		wp_cache_set($name, $value, 'options');
+		wp_cache_set( $name, $value, 'options' );
 	}
 
 	// This option exists now
-	$notoptions = wp_cache_get('notoptions', 'options'); // yes, again... we need it to be fresh
-	if ( is_array($notoptions) && isset($notoptions[$name]) ) {
-		unset($notoptions[$name]);
-		wp_cache_set('notoptions', $notoptions, 'options');
+	$notoptions = wp_cache_get( 'notoptions', 'options' ); // yes, again... we need it to be fresh
+	if ( is_array( $notoptions ) && isset( $notoptions[$name] ) ) {
+		unset( $notoptions[$name] );
+		wp_cache_set( 'notoptions', $notoptions, 'options' );
 	}
 
-	$name = $wpdb->escape($name);
-	$value = $wpdb->escape($value);
-	$description = $wpdb->escape($description);
-	$wpdb->query("INSERT INTO $wpdb->options (option_name, option_value, option_description, autoload) VALUES ('$name', '$value', '$description', '$autoload')");
+	$wpdb->query( $wpdb->prepare( "INSERT INTO $wpdb->options (option_name, option_value, autoload) VALUES (%s, %s, %s)", $name, $value, $autoload ) );
 
+	do_action( "add_option_{$name}", $name, $value ); 
 	return;
 }
 
-function delete_option($name) {
+
+function delete_option( $name ) {
 	global $wpdb;
 
-	wp_protect_special_option($name);
+	wp_protect_special_option( $name );
 
 	// Get the ID, if no ID then return
-	$option = $wpdb->get_row("SELECT option_id, autoload FROM $wpdb->options WHERE option_name = '$name'");
-	if ( !$option->option_id ) return false;
-	$wpdb->query("DELETE FROM $wpdb->options WHERE option_name = '$name'");
+	// expected_slashed ($name)
+	$option = $wpdb->get_row( "SELECT option_id, autoload FROM $wpdb->options WHERE option_name = '$name'" );
+	if ( is_null($option) || !$option->option_id )
+		return false;
+	// expected_slashed ($name)
+	$wpdb->query( "DELETE FROM $wpdb->options WHERE option_name = '$name'" );
 	if ( 'yes' == $option->autoload ) {
 		$alloptions = wp_load_alloptions();
-		if ( isset($alloptions[$name]) ) {
-			unset($alloptions[$name]);
-			wp_cache_set('alloptions', $alloptions, 'options');
+		if ( isset( $alloptions[$name] ) ) {
+			unset( $alloptions[$name] );
+			wp_cache_set( 'alloptions', $alloptions, 'options' );
 		}
 	} else {
-		wp_cache_delete($name, 'options');
+		wp_cache_delete( $name, 'options' );
 	}
 	return true;
 }
 
-function maybe_serialize($data) {
-	if ( is_string($data) )
-		$data = trim($data);
-	elseif ( is_array($data) || is_object($data) )
-		return serialize($data);
-	if ( is_serialized($data) )
-		return serialize($data);
+
+function maybe_serialize( $data ) {
+	if ( is_string( $data ) )
+		$data = trim( $data );
+	elseif ( is_array( $data ) || is_object( $data ) )
+		return serialize( $data );
+	if ( is_serialized( $data ) )
+		return serialize( $data );
 	return $data;
 }
 
-function gzip_compression() {
-	if ( !get_option('gzipcompression') ) return false;
 
-	if ( extension_loaded('zlib') ) {
-		ob_start('ob_gzhandler');
-	}
-}
-
-function make_url_footnote($content) {
-	preg_match_all('/<a(.+?)href=\"(.+?)\"(.*?)>(.+?)<\/a>/', $content, $matches);
+function make_url_footnote( $content ) {
+	preg_match_all( '/<a(.+?)href=\"(.+?)\"(.*?)>(.+?)<\/a>/', $content, $matches );
 	$j = 0;
-	for ($i=0; $i<count($matches[0]); $i++) {
-		$links_summary = (!$j) ? "\n" : $links_summary;
+	for ( $i=0; $i<count($matches[0]); $i++ ) {
+		$links_summary = ( !$j ) ? "\n" : $links_summary;
 		$j++;
 		$link_match = $matches[0][$i];
 		$link_number = '['.($i+1).']';
 		$link_url = $matches[2][$i];
 		$link_text = $matches[4][$i];
-		$content = str_replace($link_match, $link_text.' '.$link_number, $content);
-		$link_url = ((strtolower(substr($link_url,0,7)) != 'http://') && (strtolower(substr($link_url,0,8)) != 'https://')) ? get_option('home') . $link_url : $link_url;
-		$links_summary .= "\n".$link_number.' '.$link_url;
+		$content = str_replace( $link_match, $link_text . ' ' . $link_number, $content );
+		$link_url = ( ( strtolower( substr( $link_url, 0, 7 ) ) != 'http://' ) && ( strtolower( substr( $link_url, 0, 8 ) ) != 'https://' ) ) ? get_option( 'home' ) . $link_url : $link_url;
+		$links_summary .= "\n" . $link_number . ' ' . $link_url;
 	}
-	$content = strip_tags($content);
+	$content  = strip_tags( $content );
 	$content .= $links_summary;
 	return $content;
 }
 
 
-function xmlrpc_getposttitle($content) {
+function xmlrpc_getposttitle( $content ) {
 	global $post_default_title;
-	if ( preg_match('/<title>(.+?)<\/title>/is', $content, $matchtitle) ) {
+	if ( preg_match( '/<title>(.+?)<\/title>/is', $content, $matchtitle ) ) {
 		$post_title = $matchtitle[0];
-		$post_title = preg_replace('/<title>/si', '', $post_title);
-		$post_title = preg_replace('/<\/title>/si', '', $post_title);
+		$post_title = preg_replace( '/<title>/si', '', $post_title );
+		$post_title = preg_replace( '/<\/title>/si', '', $post_title );
 	} else {
 		$post_title = $post_default_title;
 	}
 	return $post_title;
 }
 
-function xmlrpc_getpostcategory($content) {
+
+function xmlrpc_getpostcategory( $content ) {
 	global $post_default_category;
-	if ( preg_match('/<category>(.+?)<\/category>/is', $content, $matchcat) ) {
-		$post_category = trim($matchcat[1], ',');
-		$post_category = explode(',', $post_category);
+	if ( preg_match( '/<category>(.+?)<\/category>/is', $content, $matchcat ) ) {
+		$post_category = trim( $matchcat[1], ',' );
+		$post_category = explode( ',', $post_category );
 	} else {
 		$post_category = $post_default_category;
 	}
 	return $post_category;
 }
 
-function xmlrpc_removepostdata($content) {
-	$content = preg_replace('/<title>(.+?)<\/title>/si', '', $content);
-	$content = preg_replace('/<category>(.+?)<\/category>/si', '', $content);
-	$content = trim($content);
+
+function xmlrpc_removepostdata( $content ) {
+	$content = preg_replace( '/<title>(.+?)<\/title>/si', '', $content );
+	$content = preg_replace( '/<category>(.+?)<\/category>/si', '', $content );
+	$content = trim( $content );
 	return $content;
 }
 
-function debug_fopen($filename, $mode) {
+
+function debug_fopen( $filename, $mode ) {
 	global $debug;
-	if ( $debug == 1 ) {
-		$fp = fopen($filename, $mode);
+	if ( 1 == $debug ) {
+		$fp = fopen( $filename, $mode );
 		return $fp;
 	} else {
 		return false;
 	}
 }
 
-function debug_fwrite($fp, $string) {
+
+function debug_fwrite( $fp, $string ) {
 	global $debug;
-	if ( $debug == 1 ) {
-		fwrite($fp, $string);
-	}
+	if ( 1 == $debug )
+		fwrite( $fp, $string );
 }
 
-function debug_fclose($fp) {
+
+function debug_fclose( $fp ) {
 	global $debug;
-	if ( $debug == 1 ) {
-		fclose($fp);
-	}
+	if ( 1 == $debug )
+		fclose( $fp );
 }
 
 function do_enclose( $content, $post_ID ) {
-	global $wp_version, $wpdb;
-	include_once (ABSPATH . WPINC . '/class-IXR.php');
+	global $wpdb;
+	include_once( ABSPATH . WPINC . '/class-IXR.php' );
 
-	$log = debug_fopen(ABSPATH . '/enclosures.log', 'a');
+	$log = debug_fopen( ABSPATH . 'enclosures.log', 'a' );
 	$post_links = array();
-	debug_fwrite($log, 'BEGIN '.date('YmdHis', time())."\n");
+	debug_fwrite( $log, 'BEGIN ' . date( 'YmdHis', time() ) . "\n" );
 
 	$pung = get_enclosed( $post_ID );
 
@@ -520,38 +505,41 @@
 	$punc = '.:?\-';
 	$any = $ltrs . $gunk . $punc;
 
-	preg_match_all("{\b http : [$any] +? (?= [$punc] * [^$any] | $)}x", $content, $post_links_temp);
+	preg_match_all( "{\b http : [$any] +? (?= [$punc] * [^$any] | $)}x", $content, $post_links_temp );
 
-	debug_fwrite($log, 'Post contents:');
-	debug_fwrite($log, $content."\n");
+	debug_fwrite( $log, 'Post contents:' );
+	debug_fwrite( $log, $content . "\n" );
 
-	foreach($post_links_temp[0] as $link_test) :
-		if ( !in_array($link_test, $pung) ) : // If we haven't pung it already
-			$test = parse_url($link_test);
-			if ( isset($test['query']) )
+	foreach ( $post_links_temp[0] as $link_test ) {
+		if ( !in_array( $link_test, $pung ) ) { // If we haven't pung it already
+			$test = parse_url( $link_test );
+			if ( isset( $test['query'] ) )
 				$post_links[] = $link_test;
-			elseif (($test['path'] != '/') && ($test['path'] != ''))
+			elseif ( $test['path'] != '/' && $test['path'] != '' )
 				$post_links[] = $link_test;
-		endif;
-	endforeach;
+		}
+	}
 
-	foreach ($post_links as $url) :
-		if ( $url != '' && !$wpdb->get_var("SELECT post_id FROM $wpdb->postmeta WHERE post_id = '$post_ID' AND meta_key = 'enclosure' AND meta_value LIKE ('$url%')") ) {
+	foreach ( $post_links as $url ) {
+		if ( $url != '' && !$wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = 'enclosure' AND meta_value LIKE (%s)", $post_ID, $url . '%' ) ) ) {
 			if ( $headers = wp_get_http_headers( $url) ) {
 				$len = (int) $headers['content-length'];
 				$type = $wpdb->escape( $headers['content-type'] );
 				$allowed_types = array( 'video', 'audio' );
 				if ( in_array( substr( $type, 0, strpos( $type, "/" ) ), $allowed_types ) ) {
 					$meta_value = "$url\n$len\n$type\n";
-					$wpdb->query( "INSERT INTO `$wpdb->postmeta` ( `post_id` , `meta_key` , `meta_value` )
-					VALUES ( '$post_ID', 'enclosure' , '$meta_value')" );
+					$wpdb->query( $wpdb->prepare( "INSERT INTO `$wpdb->postmeta` ( `post_id` , `meta_key` , `meta_value` )
+					VALUES ( %d, 'enclosure' , %s)", $post_ID, $meta_value ) );
 				}
 			}
 		}
-	endforeach;
+	}
 }
 
-function wp_get_http_headers( $url, $red = 1 ) {
+// perform a HTTP HEAD or GET request
+// if $file_path is a writable filename, this will do a GET request and write the file to that path
+// returns a list of HTTP headers
+function wp_get_http( $url, $file_path = false, $red = 1 ) {
 	global $wp_version;
 	@set_time_limit( 60 );
 
@@ -559,14 +547,19 @@
 		 return false;
 
 	$parts = parse_url( $url );
-	$file = $parts['path'] . ($parts['query'] ? '?'.$parts['query'] : '');
+	$file = $parts['path'] . ( ( $parts['query'] ) ? '?' . $parts['query'] : '' );
 	$host = $parts['host'];
 	if ( !isset( $parts['port'] ) )
 		$parts['port'] = 80;
 
-	$head = "HEAD $file HTTP/1.1\r\nHOST: $host\r\nUser-Agent: WordPress/" . $wp_version . "\r\n\r\n";
+	if ( $file_path )
+		$request_type = 'GET';
+	else
+		$request_type = 'HEAD';
+
+	$head = "$request_type $file HTTP/1.1\r\nHOST: $host\r\nUser-Agent: WordPress/" . $wp_version . "\r\n\r\n";
 
-	$fp = @fsockopen($host, $parts['port'], $err_num, $err_msg, 3);
+	$fp = @fsockopen( $host, $parts['port'], $err_num, $err_msg, 3 );
 	if ( !$fp )
 		return false;
 
@@ -574,190 +567,67 @@
 	fputs( $fp, $head );
 	while ( !feof( $fp ) && strpos( $response, "\r\n\r\n" ) == false )
 		$response .= fgets( $fp, 2048 );
-	fclose( $fp );
-	preg_match_all('/(.*?): (.*)\r/', $response, $matches);
-	$count = count($matches[1]);
-	for ( $i = 0; $i < $count; $i++) {
-		$key = strtolower($matches[1][$i]);
+	preg_match_all( '/(.*?): (.*)\r/', $response, $matches );
+	$count = count( $matches[1] );
+	for ( $i = 0; $i < $count; $i++ ) {
+		$key = strtolower( $matches[1][$i] );
 		$headers["$key"] = $matches[2][$i];
 	}
 
-	preg_match('/.*([0-9]{3}).*/', $response, $return);
+	preg_match( '/.*([0-9]{3}).*/', $response, $return );
 	$headers['response'] = $return[1]; // HTTP response code eg 204, 200, 404
 
 		$code = $headers['response'];
-		if ( ('302' == $code || '301' == $code) && isset($headers['location']) )
-				return wp_get_http_headers( $headers['location'], ++$red );
-
-	return $headers;
-}
-
-function is_new_day() {
-	global $day, $previousday;
-	if ( $day != $previousday ) {
-		return(1);
-	} else {
-		return(0);
-	}
-}
+		if ( ( '302' == $code || '301' == $code ) && isset( $headers['location'] ) ) {
+				fclose($fp);
+				return wp_get_http( $headers['location'], $file_path, ++$red );
+		}
 
-function update_post_cache(&$posts) {
-	global $post_cache, $blog_id;
+	// make a note of the final location, so the caller can tell if we were redirected or not
+	$headers['x-final-location'] = $url;
 
-	if ( !$posts )
-		return;
-
-	for ($i = 0; $i < count($posts); $i++) {
-		$post_cache[$blog_id][$posts[$i]->ID] = &$posts[$i];
+	// HEAD request only
+	if ( !$file_path ) {
+		fclose($fp);
+		return $headers;
 	}
-}
-
-function clean_post_cache($id) {
-	global $post_cache, $post_meta_cache, $category_cache, $blog_id;
-
-	if ( isset( $post_cache[$blog_id][$id] ) )
-		unset( $post_cache[$blog_id][$id] );
 
-	if ( isset ($post_meta_cache[$blog_id][$id] ) )
-		unset( $post_meta_cache[$blog_id][$id] );
-
-	if ( isset( $category_cache[$blog_id][$id]) )
-		unset ( $category_cache[$blog_id][$id] );
-}
-
-function update_page_cache(&$pages) {
-	global $page_cache, $blog_id;
-
-	if ( !$pages )
-		return;
-
-	for ($i = 0; $i < count($pages); $i++) {
-		$page_cache[$blog_id][$pages[$i]->ID] = &$pages[$i];
-		wp_cache_add($pages[$i]->ID, $pages[$i], 'pages');
+	// GET request - fetch and write it to the supplied filename
+	$content_length = $headers['content-length'];
+	$got_bytes = 0;
+	$out_fp = fopen($file_path, 'w');
+	while ( !feof($fp) ) {
+		$buf = fread( $fp, 4096 );
+		fwrite( $out_fp, $buf );
+		$got_bytes += strlen($buf);
+		// don't read past the content-length
+		if ($content_length and $got_bytes >= $content_length)
+			break;
 	}
-}
-
-function clean_page_cache($id) {
-	global $page_cache, $blog_id;
 
-	if ( isset( $page_cache[$blog_id][$id] ) )
-		unset( $page_cache[$blog_id][$id] );
-
-	wp_cache_delete($id, 'pages');
-	wp_cache_delete( 'all_page_ids', 'pages' );
-	wp_cache_delete( 'get_pages', 'page' );
+	fclose($out_fp);
+	fclose($fp);
+	return $headers;
 }
 
-function update_post_category_cache($post_ids) {
-	global $wpdb, $category_cache, $blog_id;
-
-	if ( empty($post_ids) )
-		return;
-
-	if ( is_array($post_ids) )
-		$post_id_list = implode(',', $post_ids);
-
-	$post_id_array = (array) explode(',', $post_ids);
-	$count = count( $post_id_array);
-	for ( $i = 0; $i < $count; $i++ ) {
-		$post_id = (int) $post_id_array[ $i ];
-		if ( isset( $category_cache[$blog_id][$post_id] ) ) {
-			unset( $post_id_array[ $i ] );
-			continue;
-		}
-	}
-	if ( count( $post_id_array ) == 0 )
-		return;
-	$post_id_list = join( ',', $post_id_array ); // with already cached stuff removed
-
-	$dogs = $wpdb->get_results("SELECT post_id, category_id FROM $wpdb->post2cat WHERE post_id IN ($post_id_list)");
-
-	if ( empty($dogs) )
-		return;
-
-	foreach ($dogs as $catt)
-		$category_cache[$blog_id][$catt->post_id][$catt->category_id] = &get_category($catt->category_id);
+function wp_get_http_headers( $url, $red = 1 ) {
+	return wp_get_http( $url, false, $red );
 }
 
-function update_post_caches(&$posts) {
-	global $post_cache, $category_cache, $post_meta_cache;
-	global $wpdb, $blog_id;
-
-	// No point in doing all this work if we didn't match any posts.
-	if ( !$posts )
-		return;
-
-	// Get the categories for all the posts
-	for ($i = 0; $i < count($posts); $i++) {
-		$post_id_array[] = $posts[$i]->ID;
-		$post_cache[$blog_id][$posts[$i]->ID] = &$posts[$i];
-	}
-
-	$post_id_list = implode(',', $post_id_array);
-
-	update_post_category_cache($post_id_list);
 
-	update_postmeta_cache($post_id_list);
+function is_new_day() {
+	global $day, $previousday;
+	if ( $day != $previousday )
+		return 1;
+	else
+		return 0;
 }
 
-function update_postmeta_cache($post_id_list = '') {
-	global $wpdb, $post_meta_cache, $blog_id;
-
-	// We should validate this comma-separated list for the upcoming SQL query
-	$post_id_list = preg_replace('|[^0-9,]|', '', $post_id_list);
 
-	if ( empty( $post_id_list ) )
-		return false;
-
-	// we're marking each post as having its meta cached (with no keys... empty array), to prevent posts with no meta keys from being queried again
-	// any posts that DO have keys will have this empty array overwritten with a proper array, down below
-	$post_id_array = (array) explode(',', $post_id_list);
-	$count = count( $post_id_array);
-	for ( $i = 0; $i < $count; $i++ ) {
-		$post_id = (int) $post_id_array[ $i ];
-		if ( isset( $post_meta_cache[$blog_id][$post_id] ) ) { // If the meta is already cached
-			unset( $post_id_array[ $i ] );
-			continue;
-		}
-		$post_meta_cache[$blog_id][$post_id] = array();
-	}
-	if ( count( $post_id_array ) == 0 )
-		return;
-	$post_id_list = join( ',', $post_id_array ); // with already cached stuff removeds
-
-	// Get post-meta info
-	if ( $meta_list = $wpdb->get_results("SELECT post_id, meta_key, meta_value FROM $wpdb->postmeta WHERE post_id IN($post_id_list) ORDER BY post_id, meta_key", ARRAY_A) ) {
-		// Change from flat structure to hierarchical:
-		if ( !isset($post_meta_cache) )
-			$post_meta_cache[$blog_id] = array();
-
-		foreach ($meta_list as $metarow) {
-			$mpid = (int) $metarow['post_id'];
-			$mkey = $metarow['meta_key'];
-			$mval = $metarow['meta_value'];
-
-			// Force subkeys to be array type:
-			if ( !isset($post_meta_cache[$blog_id][$mpid]) || !is_array($post_meta_cache[$blog_id][$mpid]) )
-				$post_meta_cache[$blog_id][$mpid] = array();
-			if ( !isset($post_meta_cache[$blog_id][$mpid]["$mkey"]) || !is_array($post_meta_cache[$blog_id][$mpid]["$mkey"]) )
-				$post_meta_cache[$blog_id][$mpid]["$mkey"] = array();
-
-			// Add a value to the current pid/key:
-			$post_meta_cache[$blog_id][$mpid][$mkey][] = $mval;
-		}
-	}
+function build_query( $data ) {
+	return _http_build_query( $data, NULL, '&', '', false );
 }
 
-function update_category_cache() {
-	return true;
-}
-
-function clean_category_cache($id) {
-	wp_cache_delete($id, 'category');
-	wp_cache_delete('all_category_ids', 'category');
-	wp_cache_delete('get_categories', 'category');
-	delete_option('category_children');
-}
 
 /*
 add_query_arg: Returns a modified querystring by adding
@@ -771,40 +641,40 @@
 */
 function add_query_arg() {
 	$ret = '';
-	if ( is_array(func_get_arg(0)) ) {
-		if ( @func_num_args() < 2 || false === @func_get_arg(1) )
+	if ( is_array( func_get_arg(0) ) ) {
+		if ( @func_num_args() < 2 || false === @func_get_arg( 1 ) )
 			$uri = $_SERVER['REQUEST_URI'];
 		else
-			$uri = @func_get_arg(1);
+			$uri = @func_get_arg( 1 );
 	} else {
-		if ( @func_num_args() < 3 || false === @func_get_arg(2) )
+		if ( @func_num_args() < 3 || false === @func_get_arg( 2 ) )
 			$uri = $_SERVER['REQUEST_URI'];
 		else
-			$uri = @func_get_arg(2);
+			$uri = @func_get_arg( 2 );
 	}
 
-	if ( $frag = strstr($uri, '#') )
-		$uri = substr($uri, 0, -strlen($frag));
+	if ( $frag = strstr( $uri, '#' ) )
+		$uri = substr( $uri, 0, -strlen( $frag ) );
 	else
 		$frag = '';
 
-	if ( preg_match('|^https?://|i', $uri, $matches) ) {
+	if ( preg_match( '|^https?://|i', $uri, $matches ) ) {
 		$protocol = $matches[0];
-		$uri = substr($uri, strlen($protocol));
+		$uri = substr( $uri, strlen( $protocol ) );
 	} else {
 		$protocol = '';
 	}
 
-	if (strpos($uri, '?') !== false) {
-		$parts = explode('?', $uri, 2);
-		if ( 1 == count($parts) ) {
+	if ( strpos( $uri, '?' ) !== false ) {
+		$parts = explode( '?', $uri, 2 );
+		if ( 1 == count( $parts ) ) {
 			$base = '?';
 			$query = $parts[0];
 		} else {
 			$base = $parts[0] . '?';
 			$query = $parts[1];
 		}
-	} elseif (!empty($protocol) || strpos($uri, '/') !== false) {
+	} elseif ( !empty( $protocol ) || strpos( $uri, '=' ) === false ) {
 		$base = $uri . '?';
 		$query = '';
 	} else {
@@ -812,31 +682,29 @@
 		$query = $uri;
 	}
 
-	wp_parse_str($query, $qs);
-	$qs = urlencode_deep($qs);
-	if ( is_array(func_get_arg(0)) ) {
-		$kayvees = func_get_arg(0);
-		$qs = array_merge($qs, $kayvees);
+	wp_parse_str( $query, $qs );
+	$qs = urlencode_deep( $qs ); // this re-URL-encodes things that were already in the query string
+	if ( is_array( func_get_arg( 0 ) ) ) {
+		$kayvees = func_get_arg( 0 );
+		$qs = array_merge( $qs, $kayvees );
 	} else {
-		$qs[func_get_arg(0)] = func_get_arg(1);
+		$qs[func_get_arg( 0 )] = func_get_arg( 1 );
 	}
 
-	foreach($qs as $k => $v) {
-		if ( $v !== FALSE ) {
-			if ( $ret != '' )
-				$ret .= '&';
-			if ( empty($v) && !preg_match('|[?&]' . preg_quote($k, '|') . '=|', $query) )
-				$ret .= $k;
-			else
-				$ret .= "$k=$v";
-		}
+	foreach ( $qs as $k => $v ) {
+		if ( $v === false )
+			unset( $qs[$k] );
 	}
-	$ret = trim($ret, '?');
+
+	$ret = build_query( $qs );
+	$ret = trim( $ret, '?' );
+	$ret = preg_replace( '#=(&|$)#', '$1', $ret );
 	$ret = $protocol . $base . $ret . $frag;
-	$ret = rtrim($ret, '?');
+	$ret = rtrim( $ret, '?' );
 	return $ret;
 }
 
+
 /*
 remove_query_arg: Returns a modified querystring by removing
 a single key or an array of keys.
@@ -847,23 +715,24 @@
 remove_query_arg(removekeyarray, [oldquery_or_uri])
 */
 
-function remove_query_arg($key, $query=FALSE) {
-	if ( is_array($key) ) { // removing multiple keys
+function remove_query_arg( $key, $query=FALSE ) {
+	if ( is_array( $key ) ) { // removing multiple keys
 		foreach ( (array) $key as $k )
-			$query = add_query_arg($k, FALSE, $query);
+			$query = add_query_arg( $k, FALSE, $query );
 		return $query;
 	}
-	return add_query_arg($key, FALSE, $query);
+	return add_query_arg( $key, FALSE, $query );
 }
 
-function add_magic_quotes($array) {
+
+function add_magic_quotes( $array ) {
 	global $wpdb;
 
-	foreach ($array as $k => $v) {
-		if ( is_array($v) ) {
-			$array[$k] = add_magic_quotes($v);
+	foreach ( $array as $k => $v ) {
+		if ( is_array( $v ) ) {
+			$array[$k] = add_magic_quotes( $v );
 		} else {
-			$array[$k] = $wpdb->escape($v);
+			$array[$k] = $wpdb->escape( $v );
 		}
 	}
 	return $array;
@@ -871,141 +740,209 @@
 
 function wp_remote_fopen( $uri ) {
 	$timeout = 10;
-	$parsed_url = @parse_url($uri);
+	$parsed_url = @parse_url( $uri );
 
-	if ( !$parsed_url || !is_array($parsed_url) )
+	if ( !$parsed_url || !is_array( $parsed_url ) )
 		return false;
 
-	if ( !isset($parsed_url['scheme']) || !in_array($parsed_url['scheme'], array('http','https')) )
+	if ( !isset( $parsed_url['scheme'] ) || !in_array( $parsed_url['scheme'], array( 'http','https' ) ) )
 		$uri = 'http://' . $uri;
 
-	if ( ini_get('allow_url_fopen') ) {
+	if ( ini_get( 'allow_url_fopen' ) ) {
 		$fp = @fopen( $uri, 'r' );
 		if ( !$fp )
 			return false;
 
 		//stream_set_timeout($fp, $timeout); // Requires php 4.3
 		$linea = '';
-		while( $remote_read = fread($fp, 4096) )
+		while ( $remote_read = fread( $fp, 4096 ) )
 			$linea .= $remote_read;
-		fclose($fp);
+		fclose( $fp );
 		return $linea;
-	} else if ( function_exists('curl_init') ) {
+	} elseif ( function_exists( 'curl_init' ) ) {
 		$handle = curl_init();
-		curl_setopt ($handle, CURLOPT_URL, $uri);
-		curl_setopt ($handle, CURLOPT_CONNECTTIMEOUT, 1);
-		curl_setopt ($handle, CURLOPT_RETURNTRANSFER, 1);
-		curl_setopt ($handle, CURLOPT_TIMEOUT, $timeout);
-		$buffer = curl_exec($handle);
-		curl_close($handle);
+		curl_setopt( $handle, CURLOPT_URL, $uri);
+		curl_setopt( $handle, CURLOPT_CONNECTTIMEOUT, 1 );
+		curl_setopt( $handle, CURLOPT_RETURNTRANSFER, 1 );
+		curl_setopt( $handle, CURLOPT_TIMEOUT, $timeout );
+		$buffer = curl_exec( $handle );
+		curl_close( $handle );
 		return $buffer;
 	} else {
 		return false;
 	}
 }
 
-function wp($query_vars = '') {
-	global $wp;
 
-	$wp->main($query_vars);
+function wp( $query_vars = '' ) {
+	global $wp, $wp_query, $wp_the_query;
+	$wp->main( $query_vars );
+
+	if( !isset($wp_the_query) )
+		$wp_the_query = $wp_query;
 }
 
+
+function get_status_header_desc( $code ) {
+	global $wp_header_to_desc;
+
+	$code = absint( $code );
+
+	if ( !isset( $wp_header_to_desc ) ) {
+		$wp_header_to_desc = array(
+			100 => 'Continue',
+			101 => 'Switching Protocols',
+
+			200 => 'OK',
+			201 => 'Created',
+			202 => 'Accepted',
+			203 => 'Non-Authoritative Information',
+			204 => 'No Content',
+			205 => 'Reset Content',
+			206 => 'Partial Content',
+
+			300 => 'Multiple Choices',
+			301 => 'Moved Permanently',
+			302 => 'Found',
+			303 => 'See Other',
+			304 => 'Not Modified',
+			305 => 'Use Proxy',
+			307 => 'Temporary Redirect',
+
+			400 => 'Bad Request',
+			401 => 'Unauthorized',
+			403 => 'Forbidden',
+			404 => 'Not Found',
+			405 => 'Method Not Allowed',
+			406 => 'Not Acceptable',
+			407 => 'Proxy Authentication Required',
+			408 => 'Request Timeout',
+			409 => 'Conflict',
+			410 => 'Gone',
+			411 => 'Length Required',
+			412 => 'Precondition Failed',
+			413 => 'Request Entity Too Large',
+			414 => 'Request-URI Too Long',
+			415 => 'Unsupported Media Type',
+			416 => 'Requested Range Not Satisfiable',
+			417 => 'Expectation Failed',
+
+			500 => 'Internal Server Error',
+			501 => 'Not Implemented',
+			502 => 'Bad Gateway',
+			503 => 'Service Unavailable',
+			504 => 'Gateway Timeout',
+			505 => 'HTTP Version Not Supported'
+		);
+	}
+
+	if ( isset( $wp_header_to_desc[$code] ) )
+		return $wp_header_to_desc[$code];
+	else
+		return '';
+}
+
+
 function status_header( $header ) {
-	if ( 200 == $header )
-		$text = 'OK';
-	elseif ( 301 == $header )
-		$text = 'Moved Permanently';
-	elseif ( 302 == $header )
-		$text = 'Moved Temporarily';
-	elseif ( 304 == $header )
-		$text = 'Not Modified';
-	elseif ( 404 == $header )
-		$text = 'Not Found';
-	elseif ( 410 == $header )
-		$text = 'Gone';
+	$text = get_status_header_desc( $header );
+
+	if ( empty( $text ) )
+		return false;
 
 	$protocol = $_SERVER["SERVER_PROTOCOL"];
-	if ( ('HTTP/1.1' != $protocol) && ('HTTP/1.0' != $protocol) )
+	if ( 'HTTP/1.1' != $protocol && 'HTTP/1.0' != $protocol )
 		$protocol = 'HTTP/1.0';
 	$status_header = "$protocol $header $text";
-	$status_header = apply_filters('status_header', $status_header, $header, $text, $protocol);
+	if ( function_exists( 'apply_filters' ) )
+		$status_header = apply_filters( 'status_header', $status_header, $header, $text, $protocol );
 
-	if ( version_compare( phpversion(), '4.3.0', '>=' ) ) {
+	if ( version_compare( phpversion(), '4.3.0', '>=' ) )
 		return @header( $status_header, true, $header );
-	} else {
+	else
 		return @header( $status_header );
-	}
 }
 
+
 function nocache_headers() {
-	@ header('Expires: Wed, 11 Jan 1984 05:00:00 GMT');
-	@ header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
-	@ header('Cache-Control: no-cache, must-revalidate, max-age=0');
-	@ header('Pragma: no-cache');
+	// why are these @-silenced when other header calls aren't?
+	@header( 'Expires: Wed, 11 Jan 1984 05:00:00 GMT' );
+	@header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . ' GMT' );
+	@header( 'Cache-Control: no-cache, must-revalidate, max-age=0' );
+	@header( 'Pragma: no-cache' );
 }
 
+
 function cache_javascript_headers() {
 	$expiresOffset = 864000; // 10 days
-	header("Content-type: text/javascript; charset=" . get_bloginfo('charset'));
-	header("Vary: Accept-Encoding"); // Handle proxies
-	header("Expires: " . gmdate("D, d M Y H:i:s", time() + $expiresOffset) . " GMT");
+	header( "Content-Type: text/javascript; charset=" . get_bloginfo( 'charset' ) );
+	header( "Vary: Accept-Encoding" ); // Handle proxies
+	header( "Expires: " . gmdate( "D, d M Y H:i:s", time() + $expiresOffset ) . " GMT" );
 }
 
+
 function get_num_queries() {
 	global $wpdb;
 	return $wpdb->num_queries;
 }
 
-function bool_from_yn($yn) {
-		if ($yn == 'Y') return 1;
-		return 0;
+
+function bool_from_yn( $yn ) {
+	return ( strtolower( $yn ) == 'y' );
 }
 
+
 function do_feed() {
 	global $wp_query;
 
-	$feed = get_query_var('feed');
+	$feed = get_query_var( 'feed' );
 
 	// Remove the pad, if present.
-	$feed = preg_replace('/^_+/', '', $feed);
+	$feed = preg_replace( '/^_+/', '', $feed );
 
 	if ( $feed == '' || $feed == 'feed' )
-		$feed = 'rss2';
+		$feed = get_default_feed();
 
 	$hook = 'do_feed_' . $feed;
-	do_action($hook, $wp_query->is_comment_feed);
+	if ( !has_action($hook) ) {
+		$message = sprintf( __( 'ERROR: %s is not a valid feed template' ), wp_specialchars($feed));
+		wp_die($message);
+	}
+
+	do_action( $hook, $wp_query->is_comment_feed );
 }
 
+
 function do_feed_rdf() {
-	load_template(ABSPATH . WPINC . '/feed-rdf.php');
+	load_template( ABSPATH . WPINC . '/feed-rdf.php' );
 }
 
+
 function do_feed_rss() {
-	load_template(ABSPATH . WPINC . '/feed-rss.php');
+	load_template( ABSPATH . WPINC . '/feed-rss.php' );
 }
 
-function do_feed_rss2($for_comments) {
-	if ( $for_comments ) {
-		load_template(ABSPATH . WPINC . '/feed-rss2-comments.php');
-	} else {
-		load_template(ABSPATH . WPINC . '/feed-rss2.php');
-	}
+
+function do_feed_rss2( $for_comments ) {
+	if ( $for_comments )
+		load_template( ABSPATH . WPINC . '/feed-rss2-comments.php' );
+	else
+		load_template( ABSPATH . WPINC . '/feed-rss2.php' );
 }
 
-function do_feed_atom($for_comments) {
-	if ($for_comments) {
-		load_template(ABSPATH . WPINC . '/feed-atom-comments.php');
-	} else {
-		load_template(ABSPATH . WPINC . '/feed-atom.php');
-	}
+
+function do_feed_atom( $for_comments ) {
+	if ($for_comments)
+		load_template( ABSPATH . WPINC . '/feed-atom-comments.php');
+	else
+		load_template( ABSPATH . WPINC . '/feed-atom.php' );
 }
 
 function do_robots() {
-	header('Content-type: text/plain; charset=utf-8');
+	header( 'Content-Type: text/plain; charset=utf-8' );
 
-	do_action('do_robotstxt');
+	do_action( 'do_robotstxt' );
 
-	if ( '0' == get_option('blog_public') ) {
+	if ( '0' == get_option( 'blog_public' ) ) {
 		echo "User-agent: *\n";
 		echo "Disallow: /\n";
 	} else {
@@ -1014,171 +951,268 @@
 	}
 }
 
+
 function is_blog_installed() {
 	global $wpdb;
-	$wpdb->hide_errors();
-	$installed = $wpdb->get_var("SELECT option_value FROM $wpdb->options WHERE option_name = 'siteurl'");
-	$wpdb->show_errors();
 
-	$install_status = !empty( $installed ) ? TRUE : FALSE;
-	return $install_status;
+	// Check cache first.  If options table goes away and we have true cached, oh well.
+	if ( wp_cache_get('is_blog_installed') )
+		return true;
+
+	$suppress = $wpdb->suppress_errors();
+	$installed = $wpdb->get_var( "SELECT option_value FROM $wpdb->options WHERE option_name = 'siteurl'" );
+	$wpdb->suppress_errors($suppress);
+
+	$installed = !empty( $installed ) ? true : false;
+	wp_cache_set('is_blog_installed', $installed);
+
+	return $installed;
 }
 
-function wp_nonce_url($actionurl, $action = -1) {
-	return wp_specialchars(add_query_arg('_wpnonce', wp_create_nonce($action), $actionurl));
+
+function wp_nonce_url( $actionurl, $action = -1 ) {
+	$actionurl = str_replace( '&amp;', '&', $actionurl );
+	return wp_specialchars( add_query_arg( '_wpnonce', wp_create_nonce( $action ), $actionurl ) );
 }
 
-function wp_nonce_field($action = -1, $name = "_wpnonce", $referer = true) {
-	$name = attribute_escape($name);
-	echo '<input type="hidden" name="' . $name . '" value="' . wp_create_nonce($action) . '" />';
+
+function wp_nonce_field( $action = -1, $name = "_wpnonce", $referer = true , $echo = true ) {
+	$name = attribute_escape( $name );
+	$nonce_field = '<input type="hidden" id="' . $name . '" name="' . $name . '" value="' . wp_create_nonce( $action ) . '" />';
+	if ( $echo )
+		echo $nonce_field;
+	
 	if ( $referer )
-		wp_referer_field();
+		wp_referer_field( $echo, 'previous' );
+	
+	return $nonce_field;
 }
 
-function wp_referer_field() {
-	$ref = attribute_escape($_SERVER['REQUEST_URI']);
-	echo '<input type="hidden" name="_wp_http_referer" value="'. $ref . '" />';
-	if ( wp_get_original_referer() ) {
-		$original_ref = attribute_escape(stripslashes(wp_get_original_referer()));
-		echo '<input type="hidden" name="_wp_original_http_referer" value="'. $original_ref . '" />';
-	}
+
+function wp_referer_field( $echo = true) {
+	$ref = attribute_escape( $_SERVER['REQUEST_URI'] );
+	$referer_field = '<input type="hidden" name="_wp_http_referer" value="'. $ref . '" />';
+
+	if ( $echo )
+		echo $referer_field;
+	return $referer_field;
 }
 
-function wp_original_referer_field() {
-	echo '<input type="hidden" name="_wp_original_http_referer" value="' . attribute_escape(stripslashes($_SERVER['REQUEST_URI'])) . '" />';
+function wp_original_referer_field( $echo = true, $jump_back_to = 'current' ) {
+	$jump_back_to = ( 'previous' == $jump_back_to ) ? wp_get_referer() : $_SERVER['REQUEST_URI'];
+	$ref = ( wp_get_original_referer() ) ? wp_get_original_referer() : $jump_back_to;
+	$orig_referer_field = '<input type="hidden" name="_wp_original_http_referer" value="' . attribute_escape( stripslashes( $ref ) ) . '" />';
+	if ( $echo )
+		echo $orig_referer_field;
+	return $orig_referer_field;
 }
 
+
 function wp_get_referer() {
-	foreach ( array($_REQUEST['_wp_http_referer'], $_SERVER['HTTP_REFERER']) as $ref )
-		if ( !empty($ref) )
-			return $ref;
+	if ( ! empty( $_REQUEST['_wp_http_referer'] ) )
+		$ref = $_REQUEST['_wp_http_referer'];
+	else if ( ! empty( $_SERVER['HTTP_REFERER'] ) )
+		$ref = $_SERVER['HTTP_REFERER'];
+
+	if ( $ref !== $_SERVER['REQUEST_URI'] )
+		return $ref;
 	return false;
 }
 
+
 function wp_get_original_referer() {
-	if ( !empty($_REQUEST['_wp_original_http_referer']) )
+	if ( !empty( $_REQUEST['_wp_original_http_referer'] ) )
 		return $_REQUEST['_wp_original_http_referer'];
 	return false;
 }
 
-function wp_mkdir_p($target) {
+
+function wp_mkdir_p( $target ) {
 	// from php.net/mkdir user contributed notes
-	if (file_exists($target)) {
-		if (! @ is_dir($target))
-			return false;
-		else
-			return true;
-	}
+	$target = str_replace( '//', '/', $target );
+	if ( file_exists( $target ) )
+		return @is_dir( $target );
 
 	// Attempting to create the directory may clutter up our display.
-	if (@ mkdir($target)) {
-		$stat = @ stat(dirname($target));
+	if ( @mkdir( $target ) ) {
+		$stat = @stat( dirname( $target ) );
 		$dir_perms = $stat['mode'] & 0007777;  // Get the permission bits.
-		@ chmod($target, $dir_perms);
+		@chmod( $target, $dir_perms );
 		return true;
-	} else {
-		if ( is_dir(dirname($target)) )
+	} elseif ( is_dir( dirname( $target ) ) ) {
 			return false;
 	}
 
 	// If the above failed, attempt to create the parent node, then try again.
-	if (wp_mkdir_p(dirname($target)))
-		return wp_mkdir_p($target);
+	if ( wp_mkdir_p( dirname( $target ) ) )
+		return wp_mkdir_p( $target );
 
 	return false;
 }
 
+// Test if a give filesystem path is absolute ('/foo/bar', 'c:\windows')
+function path_is_absolute( $path ) {
+	// this is definitive if true but fails if $path does not exist or contains a symbolic link
+	if ( realpath($path) == $path )
+		return true;
+
+	if ( strlen($path) == 0 || $path{0} == '.' )
+		return false;
+
+	// windows allows absolute paths like this
+	if ( preg_match('#^[a-zA-Z]:\\\\#', $path) )
+		return true;
+
+	// a path starting with / or \ is absolute; anything else is relative
+	return (bool) preg_match('#^[/\\\\]#', $path);
+}
+
+// Join two filesystem paths together (e.g. 'give me $path relative to $base')
+function path_join( $base, $path ) {
+	if ( path_is_absolute($path) )
+		return $path;
+
+	return rtrim($base, '/') . '/' . ltrim($path, '/');
+}
+
 // Returns an array containing the current upload directory's path and url, or an error message.
-function wp_upload_dir() {
-	$siteurl = get_option('siteurl');
-	//prepend ABSPATH to $dir and $siteurl to $url if they're not already there
-	$path = str_replace(ABSPATH, '', trim(get_option('upload_path')));
-	$dir = ABSPATH . $path;
-	$url = trailingslashit($siteurl) . $path;
+function wp_upload_dir( $time = NULL ) {
+	$siteurl = get_option( 'siteurl' );
+	$upload_path = get_option( 'upload_path' );
+	if ( trim($upload_path) === '' )
+		$upload_path = 'wp-content/uploads';
+	$dir = $upload_path;
+
+	// $dir is absolute, $path is (maybe) relative to ABSPATH
+	$dir = path_join( ABSPATH, $upload_path );
+	$path = str_replace( ABSPATH, '', trim( $upload_path ) );
 
-	if ( $dir == ABSPATH ) { //the option was empty
-		$dir = ABSPATH . 'wp-content/uploads';
-	}
+	if ( !$url = get_option( 'upload_url_path' ) )
+		$url = trailingslashit( $siteurl ) . $path;
 
 	if ( defined('UPLOADS') ) {
 		$dir = ABSPATH . UPLOADS;
-		$url = trailingslashit($siteurl) . UPLOADS;
+		$url = trailingslashit( $siteurl ) . UPLOADS;
 	}
 
-	if ( get_option('uploads_use_yearmonth_folders')) {
+	$subdir = '';
+	if ( get_option( 'uploads_use_yearmonth_folders' ) ) {
 		// Generate the yearly and monthly dirs
-		$time = current_time( 'mysql' );
+		if ( !$time )
+			$time = current_time( 'mysql' );
 		$y = substr( $time, 0, 4 );
 		$m = substr( $time, 5, 2 );
-		$dir = $dir . "/$y/$m";
-		$url = $url . "/$y/$m";
+		$subdir = "/$y/$m";
 	}
 
+	$dir .= $subdir;
+	$url .= $subdir;
+
 	// Make sure we have an uploads dir
 	if ( ! wp_mkdir_p( $dir ) ) {
-		$message = sprintf(__('Unable to create directory %s. Is its parent directory writable by the server?'), $dir);
-		return array('error' => $message);
+		$message = sprintf( __( 'Unable to create directory %s. Is its parent directory writable by the server?' ), $dir );
+		return array( 'error' => $message );
+	}
+
+	$uploads = array( 'path' => $dir, 'url' => $url, 'subdir' => $subdir, 'error' => false );
+	return apply_filters( 'upload_dir', $uploads );
+}
+
+// return a filename that is sanitized and unique for the given directory
+function wp_unique_filename( $dir, $filename, $unique_filename_callback = NULL ) {
+	$filename = strtolower( $filename );
+	// separate the filename into a name and extension
+	$info = pathinfo($filename);
+	$ext = $info['extension'];
+	$name = basename($filename, ".{$ext}");
+	
+	// edge case: if file is named '.ext', treat as an empty name
+	if( $name === ".$ext" )
+		$name = '';
+
+	// Increment the file number until we have a unique file to save in $dir. Use $override['unique_filename_callback'] if supplied.
+	if ( $unique_filename_callback && function_exists( $unique_filename_callback ) ) {
+		$filename = $unique_filename_callback( $dir, $name );
+	} else {
+		$number = '';
+
+		if ( empty( $ext ) )
+			$ext = '';
+		else
+			$ext = strtolower( ".$ext" );
+
+		$filename = str_replace( $ext, '', $filename );
+		$filename = sanitize_title_with_dashes( $filename ) . $ext;
+
+		while ( file_exists( $dir . "/$filename" ) ) {
+			if ( '' == "$number$ext" )
+				$filename = $filename . ++$number . $ext;
+			else
+				$filename = str_replace( "$number$ext", ++$number . $ext, $filename );
+		}
 	}
 
-		$uploads = array('path' => $dir, 'url' => $url, 'error' => false);
-	return apply_filters('upload_dir', $uploads);
+	return $filename;
 }
 
-function wp_upload_bits($name, $type, $bits) {
-	if ( empty($name) )
-		return array('error' => __("Empty filename"));
+function wp_upload_bits( $name, $deprecated, $bits, $time = NULL ) {
+	if ( empty( $name ) )
+		return array( 'error' => __( "Empty filename" ) );
 
-	$wp_filetype = wp_check_filetype($name);
+	$wp_filetype = wp_check_filetype( $name );
 	if ( !$wp_filetype['ext'] )
-		return array('error' => __("Invalid file type"));
+		return array( 'error' => __( "Invalid file type" ) );
 
-	$upload = wp_upload_dir();
+	$upload = wp_upload_dir( $time );
 
 	if ( $upload['error'] !== false )
 		return $upload;
 
-	$number = '';
-	$filename = $name;
-	$path_parts = pathinfo($filename);
-	$ext = $path_parts['extension'];
-	if ( empty($ext) )
-		$ext = '';
-	else
-		$ext = ".$ext";
-	while ( file_exists($upload['path'] . "/$filename") ) {
-		if ( '' == "$number$ext" )
-			$filename = $filename . ++$number . $ext;
-		else
-			$filename = str_replace("$number$ext", ++$number . $ext, $filename);
-	}
+	$filename = wp_unique_filename( $upload['path'], $name );
 
 	$new_file = $upload['path'] . "/$filename";
-	if ( ! wp_mkdir_p( dirname($new_file) ) ) {
-		$message = sprintf(__('Unable to create directory %s. Is its parent directory writable by the server?'), dirname($new_file));
-		return array('error' => $message);
+	if ( ! wp_mkdir_p( dirname( $new_file ) ) ) {
+		$message = sprintf( __( 'Unable to create directory %s. Is its parent directory writable by the server?' ), dirname( $new_file ) );
+		return array( 'error' => $message );
 	}
 
-	$ifp = @ fopen($new_file, 'wb');
+	$ifp = @ fopen( $new_file, 'wb' );
 	if ( ! $ifp )
-		return array('error' => sprintf(__('Could not write file %s'), $new_file));
+		return array( 'error' => sprintf( __( 'Could not write file %s' ), $new_file ) );
 
-	$success = @ fwrite($ifp, $bits);
-	fclose($ifp);
+	@fwrite( $ifp, $bits );
+	fclose( $ifp );
 	// Set correct file permissions
-	$stat = @ stat(dirname($new_file));
+	$stat = @ stat( dirname( $new_file ) );
 	$perms = $stat['mode'] & 0007777;
 	$perms = $perms & 0000666;
-	@ chmod($new_file, $perms);
+	@ chmod( $new_file, $perms );
 
 	// Compute the URL
 	$url = $upload['url'] . "/$filename";
 
-	return array('file' => $new_file, 'url' => $url, 'error' => false);
+	return array( 'file' => $new_file, 'url' => $url, 'error' => false );
+}
+
+function wp_ext2type( $ext ) {
+	$ext2type = apply_filters('ext2type', array(
+		'audio' => array('aac','ac3','aif','aiff','mp1','mp2','mp3','m3a','m4a','m4b','ogg','ram','wav','wma'),
+		'video' => array('asf','avi','divx','dv','mov','mpg','mpeg','mp4','mpv','ogm','qt','rm','vob','wmv'),
+		'document' => array('doc','pages','odt','rtf','pdf'),
+		'spreadsheet' => array('xls','numbers','ods'),
+		'interactive' => array('ppt','key','odp','swf'),
+		'text' => array('txt'),
+		'archive' => array('tar','bz2','gz','cab','dmg','rar','sea','sit','sqx','zip'),
+		'code' => array('css','html','php','js'),
+	));
+	foreach ( $ext2type as $type => $exts )
+		if ( in_array($ext, $exts) )
+			return $type;
 }
 
-function wp_check_filetype($filename, $mimes = null) {
+function wp_check_filetype( $filename, $mimes = null ) {
 	// Accepted MIME types are set here as PCRE unless provided.
-	$mimes = is_array($mimes) ? $mimes : apply_filters('upload_mimes', array (
+	$mimes = ( is_array( $mimes ) ) ? $mimes : apply_filters( 'upload_mimes', array(
 		'jpg|jpeg|jpe' => 'image/jpeg',
 		'gif' => 'image/gif',
 		'png' => 'image/png',
@@ -1188,12 +1222,12 @@
 		'asf|asx|wax|wmv|wmx' => 'video/asf',
 		'avi' => 'video/avi',
 		'mov|qt' => 'video/quicktime',
-		'mpeg|mpg|mpe' => 'video/mpeg',
+		'mpeg|mpg|mpe|mp4' => 'video/mpeg',
 		'txt|c|cc|h' => 'text/plain',
 		'rtx' => 'text/richtext',
 		'css' => 'text/css',
 		'htm|html' => 'text/html',
-		'mp3|mp4' => 'audio/mpeg',
+		'mp3|m4a' => 'audio/mpeg',
 		'ra|ram' => 'audio/x-realaudio',
 		'wav' => 'audio/wav',
 		'ogg' => 'audio/ogg',
@@ -1213,127 +1247,119 @@
 		'tar' => 'application/x-tar',
 		'zip' => 'application/zip',
 		'gz|gzip' => 'application/x-gzip',
-		'exe' => 'application/x-msdownload'
-	));
+		'exe' => 'application/x-msdownload',
+		// openoffice formats
+		'odt' => 'application/vnd.oasis.opendocument.text',
+		'odp' => 'application/vnd.oasis.opendocument.presentation',
+		'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
+		'odg' => 'application/vnd.oasis.opendocument.graphics',
+		'odc' => 'application/vnd.oasis.opendocument.chart',
+		'odb' => 'application/vnd.oasis.opendocument.database',
+		'odf' => 'application/vnd.oasis.opendocument.formula',
+		)
+	);
 
 	$type = false;
 	$ext = false;
 
-	foreach ($mimes as $ext_preg => $mime_match) {
+	foreach ( $mimes as $ext_preg => $mime_match ) {
 		$ext_preg = '!\.(' . $ext_preg . ')$!i';
-		if ( preg_match($ext_preg, $filename, $ext_matches) ) {
+		if ( preg_match( $ext_preg, $filename, $ext_matches ) ) {
 			$type = $mime_match;
 			$ext = $ext_matches[1];
 			break;
 		}
 	}
 
-	return compact('ext', 'type');
+	return compact( 'ext', 'type' );
 }
 
-function wp_explain_nonce($action) {
-	if ( $action !== -1 && preg_match('/([a-z]+)-([a-z]+)(_(.+))?/', $action, $matches) ) {
+function wp_explain_nonce( $action ) {
+	if ( $action !== -1 && preg_match( '/([a-z]+)-([a-z]+)(_(.+))?/', $action, $matches ) ) {
 		$verb = $matches[1];
 		$noun = $matches[2];
 
 		$trans = array();
-		$trans['update']['attachment'] = array(__('Are you sure you want to edit this attachment: &quot;%s&quot;?'), 'get_the_title');
+		$trans['update']['attachment'] = array( __( 'Your attempt to edit this attachment: &quot;%s&quot; has failed.' ), 'get_the_title' );
 
-		$trans['add']['category'] = array(__('Are you sure you want to add this category?'), false);
-		$trans['delete']['category'] = array(__('Are you sure you want to delete this category: &quot;%s&quot;?'), 'get_catname');
-		$trans['update']['category'] = array(__('Are you sure you want to edit this category: &quot;%s&quot;?'), 'get_catname');
-
-		$trans['delete']['comment'] = array(__('Are you sure you want to delete this comment: &quot;%s&quot;?'), 'use_id');
-		$trans['unapprove']['comment'] = array(__('Are you sure you want to unapprove this comment: &quot;%s&quot;?'), 'use_id');
-		$trans['approve']['comment'] = array(__('Are you sure you want to approve this comment: &quot;%s&quot;?'), 'use_id');
-		$trans['update']['comment'] = array(__('Are you sure you want to edit this comment: &quot;%s&quot;?'), 'use_id');
-		$trans['bulk']['comments'] = array(__('Are you sure you want to bulk modify comments?'), false);
-		$trans['moderate']['comments'] = array(__('Are you sure you want to moderate comments?'), false);
-
-		$trans['add']['bookmark'] = array(__('Are you sure you want to add this link?'), false);
-		$trans['delete']['bookmark'] = array(__('Are you sure you want to delete this link: &quot;%s&quot;?'), 'use_id');
-		$trans['update']['bookmark'] = array(__('Are you sure you want to edit this link: &quot;%s&quot;?'), 'use_id');
-		$trans['bulk']['bookmarks'] = array(__('Are you sure you want to bulk modify links?'), false);
-
-		$trans['add']['page'] = array(__('Are you sure you want to add this page?'), false);
-		$trans['delete']['page'] = array(__('Are you sure you want to delete this page: &quot;%s&quot;?'), 'get_the_title');
-		$trans['update']['page'] = array(__('Are you sure you want to edit this page: &quot;%s&quot;?'), 'get_the_title');
-
-		$trans['edit']['plugin'] = array(__('Are you sure you want to edit this plugin file: &quot;%s&quot;?'), 'use_id');
-		$trans['activate']['plugin'] = array(__('Are you sure you want to activate this plugin: &quot;%s&quot;?'), 'use_id');
-		$trans['deactivate']['plugin'] = array(__('Are you sure you want to deactivate this plugin: &quot;%s&quot;?'), 'use_id');
-
-		$trans['add']['post'] = array(__('Are you sure you want to add this post?'), false);
-		$trans['delete']['post'] = array(__('Are you sure you want to delete this post: &quot;%s&quot;?'), 'get_the_title');
-		$trans['update']['post'] = array(__('Are you sure you want to edit this post: &quot;%s&quot;?'), 'get_the_title');
-
-		$trans['add']['user'] = array(__('Are you sure you want to add this user?'), false);
-		$trans['delete']['users'] = array(__('Are you sure you want to delete users?'), false);
-		$trans['bulk']['users'] = array(__('Are you sure you want to bulk modify users?'), false);
-		$trans['update']['user'] = array(__('Are you sure you want to edit this user: &quot;%s&quot;?'), 'get_author_name');
-		$trans['update']['profile'] = array(__('Are you sure you want to modify the profile for: &quot;%s&quot;?'), 'get_author_name');
-
-		$trans['update']['options'] = array(__('Are you sure you want to edit your settings?'), false);
-		$trans['update']['permalink'] = array(__('Are you sure you want to change your permalink structure to: %s?'), 'use_id');
-		$trans['edit']['file'] = array(__('Are you sure you want to edit this file: &quot;%s&quot;?'), 'use_id');
-		$trans['edit']['theme'] = array(__('Are you sure you want to edit this theme file: &quot;%s&quot;?'), 'use_id');
-		$trans['switch']['theme'] = array(__('Are you sure you want to switch to this theme: &quot;%s&quot;?'), 'use_id');
+		$trans['add']['category']      = array( __( 'Your attempt to add this category has failed.' ), false );
+		$trans['delete']['category']   = array( __( 'Your attempt to delete this category: &quot;%s&quot; has failed.' ), 'get_catname' );
+		$trans['update']['category']   = array( __( 'Your attempt to edit this category: &quot;%s&quot; has failed.' ), 'get_catname' );
+
+		$trans['delete']['comment']    = array( __( 'Your attempt to delete this comment: &quot;%s&quot; has failed.' ), 'use_id' );
+		$trans['unapprove']['comment'] = array( __( 'Your attempt to unapprove this comment: &quot;%s&quot; has failed.' ), 'use_id' );
+		$trans['approve']['comment']   = array( __( 'Your attempt to approve this comment: &quot;%s&quot; has failed.' ), 'use_id' );
+		$trans['update']['comment']    = array( __( 'Your attempt to edit this comment: &quot;%s&quot; has failed.' ), 'use_id' );
+		$trans['bulk']['comments']     = array( __( 'Your attempt to bulk modify comments has failed.' ), false );
+		$trans['moderate']['comments'] = array( __( 'Your attempt to moderate comments has failed.' ), false );
+
+		$trans['add']['bookmark']      = array( __( 'Your attempt to add this link has failed.' ), false );
+		$trans['delete']['bookmark']   = array( __( 'Your attempt to delete this link: &quot;%s&quot; has failed.' ), 'use_id' );
+		$trans['update']['bookmark']   = array( __( 'Your attempt to edit this link: &quot;%s&quot; has failed.' ), 'use_id' );
+		$trans['bulk']['bookmarks']    = array( __( 'Your attempt to bulk modify links has failed.' ), false );
+
+		$trans['add']['page']          = array( __( 'Your attempt to add this page has failed.' ), false );
+		$trans['delete']['page']       = array( __( 'Your attempt to delete this page: &quot;%s&quot; has failed.' ), 'get_the_title' );
+		$trans['update']['page']       = array( __( 'Your attempt to edit this page: &quot;%s&quot; has failed.' ), 'get_the_title' );
+
+		$trans['edit']['plugin']       = array( __( 'Your attempt to edit this plugin file: &quot;%s&quot; has failed.' ), 'use_id' );
+		$trans['activate']['plugin']   = array( __( 'Your attempt to activate this plugin: &quot;%s&quot; has failed.' ), 'use_id' );
+		$trans['deactivate']['plugin'] = array( __( 'Your attempt to deactivate this plugin: &quot;%s&quot; has failed.' ), 'use_id' );
+		$trans['upgrade']['plugin']    = array( __( 'Your attempt to upgrade this plugin: &quot;%s&quot; has failed.' ), 'use_id' );		
+
+		$trans['add']['post']          = array( __( 'Your attempt to add this post has failed.' ), false );
+		$trans['delete']['post']       = array( __( 'Your attempt to delete this post: &quot;%s&quot; has failed.' ), 'get_the_title' );
+		$trans['update']['post']       = array( __( 'Your attempt to edit this post: &quot;%s&quot; has failed.' ), 'get_the_title' );
+
+		$trans['add']['user']          = array( __( 'Your attempt to add this user has failed.' ), false );
+		$trans['delete']['users']      = array( __( 'Your attempt to delete users has failed.' ), false );
+		$trans['bulk']['users']        = array( __( 'Your attempt to bulk modify users has failed.' ), false );
+		$trans['update']['user']       = array( __( 'Your attempt to edit this user: &quot;%s&quot; has failed.' ), 'get_author_name' );
+		$trans['update']['profile']    = array( __( 'Your attempt to modify the profile for: &quot;%s&quot; has failed.' ), 'get_author_name' );
+
+		$trans['update']['options']    = array( __( 'Your attempt to edit your settings has failed.' ), false );
+		$trans['update']['permalink']  = array( __( 'Your attempt to change your permalink structure to: %s has failed.' ), 'use_id' );
+		$trans['edit']['file']         = array( __( 'Your attempt to edit this file: &quot;%s&quot; has failed.' ), 'use_id' );
+		$trans['edit']['theme']        = array( __( 'Your attempt to edit this theme file: &quot;%s&quot; has failed.' ), 'use_id' );
+		$trans['switch']['theme']      = array( __( 'Your attempt to switch to this theme: &quot;%s&quot; has failed.' ), 'use_id' );
 
-		if ( isset($trans[$verb][$noun]) ) {
-			if ( !empty($trans[$verb][$noun][1]) ) {
+		if ( isset( $trans[$verb][$noun] ) ) {
+			if ( !empty( $trans[$verb][$noun][1] ) ) {
 				$lookup = $trans[$verb][$noun][1];
 				$object = $matches[4];
 				if ( 'use_id' != $lookup )
-					$object = call_user_func($lookup, $object);
-				return sprintf($trans[$verb][$noun][0], $object);
+					$object = call_user_func( $lookup, $object );
+				return sprintf( $trans[$verb][$noun][0], wp_specialchars($object) );
 			} else {
 				return $trans[$verb][$noun][0];
 			}
 		}
 	}
 
-	return apply_filters( 'explain_nonce_' . $verb . '-' . $noun, __('Are you sure you want to do this?'), $matches[4] );
+	return apply_filters( 'explain_nonce_' . $verb . '-' . $noun, __( 'Are you sure you want to do this?' ), $matches[4] );
 }
 
-function wp_nonce_ays($action) {
-	global $pagenow, $menu, $submenu, $parent_file, $submenu_file;
 
-	$adminurl = get_option('siteurl') . '/wp-admin';
+function wp_nonce_ays( $action ) {
+	$title = __( 'WordPress Failure Notice' );
+	$html = wp_specialchars( wp_explain_nonce( $action ) ) . '</p>';
 	if ( wp_get_referer() )
-		$adminurl = clean_url(wp_get_referer());
-
-	$title = __('WordPress Confirmation');
-	// Remove extra layer of slashes.
-	$_POST   = stripslashes_deep($_POST  );
-	if ( $_POST ) {
-		$q = http_build_query($_POST);
-		$q = explode( ini_get('arg_separator.output'), $q);
-		$html .= "\t<form method='post' action='" . attribute_escape($pagenow) . "'>\n";
-		foreach ( (array) $q as $a ) {
-			$v = substr(strstr($a, '='), 1);
-			$k = substr($a, 0, -(strlen($v)+1));
-			$html .= "\t\t<input type='hidden' name='" . attribute_escape(urldecode($k)) . "' value='" . attribute_escape(urldecode($v)) . "' />\n";
-		}
-		$html .= "\t\t<input type='hidden' name='_wpnonce' value='" . wp_create_nonce($action) . "' />\n";
-		$html .= "\t\t<div id='message' class='confirm fade'>\n\t\t<p>" . wp_specialchars(wp_explain_nonce($action)) . "</p>\n\t\t<p><a href='$adminurl'>" . __('No') . "</a> <input type='submit' value='" . __('Yes') . "' /></p>\n\t\t</div>\n\t</form>\n";
-	} else {
-		$html .= "\t<div id='message' class='confirm fade'>\n\t<p>" . wp_specialchars(wp_explain_nonce($action)) . "</p>\n\t<p><a href='$adminurl'>" . __('No') . "</a> <a href='" . clean_url(add_query_arg( '_wpnonce', wp_create_nonce($action), $_SERVER['REQUEST_URI'] )) . "'>" . __('Yes') . "</a></p>\n\t</div>\n";
-	}
-	$html .= "</body>\n</html>";
-	wp_die($html, $title);
+		$html .= "<p><a href='" . remove_query_arg( 'updated', clean_url( wp_get_referer() ) ) . "'>" . __( 'Please try again.' ) . "</a>";
+	wp_die( $html, $title);
 }
 
+
 function wp_die( $message, $title = '' ) {
 	global $wp_locale;
 
 	if ( function_exists( 'is_wp_error' ) && is_wp_error( $message ) ) {
-		if ( empty($title) ) {
+		if ( empty( $title ) ) {
 			$error_data = $message->get_error_data();
-			if ( is_array($error_data) && isset($error_data['title']) )
+			if ( is_array( $error_data ) && isset( $error_data['title'] ) )
 				$title = $error_data['title'];
 		}
 		$errors = $message->get_error_messages();
-		switch ( count($errors) ) :
+		switch ( count( $errors ) ) :
 		case 0 :
 			$message = '';
 			break;
@@ -1344,95 +1370,90 @@
 			$message = "<ul>\n\t\t<li>" . join( "</li>\n\t\t<li>", $errors ) . "</li>\n\t</ul>";
 			break;
 		endswitch;
-	} elseif ( is_string($message) ) {
+	} elseif ( is_string( $message ) ) {
 		$message = "<p>$message</p>";
 	}
 
-	if (strpos($_SERVER['PHP_SELF'], 'wp-admin') !== false)
+	if ( defined( 'WP_SITEURL' ) && '' != WP_SITEURL )
+		$admin_dir = WP_SITEURL . '/wp-admin/';
+	elseif ( function_exists( 'get_bloginfo' ) && '' != get_bloginfo( 'wpurl' ) )
+		$admin_dir = get_bloginfo( 'wpurl' ) . '/wp-admin/';
+	elseif ( strpos( $_SERVER['PHP_SELF'], 'wp-admin' ) !== false )
 		$admin_dir = '';
 	else
 		$admin_dir = 'wp-admin/';
 
-	if ( !did_action('admin_head') ) :
-	header('Content-Type: text/html; charset=utf-8');
-
-	if ( empty($title) )
-		$title = __('WordPress &rsaquo; Error');
-
+	if ( !function_exists( 'did_action' ) || !did_action( 'admin_head' ) ) :
+	if( !headers_sent() ){
+		status_header( 500 );
+		nocache_headers();
+		header( 'Content-Type: text/html; charset=utf-8' );
+	}
 
+	if ( empty($title) ) {
+		if ( function_exists( '__' ) )
+			$title = __( 'WordPress &rsaquo; Error' );
+		else
+			$title = 'WordPress &rsaquo; Error';
+	}
 
 ?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" <?php if ( function_exists('language_attributes') ) language_attributes(); ?>>
+<html xmlns="http://www.w3.org/1999/xhtml" <?php if ( function_exists( 'language_attributes' ) ) language_attributes(); ?>>
 <head>
-	<title><?php echo $title ?></title>
 	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-	<link rel="stylesheet" href="<?php echo $admin_dir; ?>install.css" type="text/css" />
-<?php 
-if ( ( $wp_locale ) && ('rtl' == $wp_locale->text_direction) ) : ?>
-	<link rel="stylesheet" href="<?php echo $admin_dir; ?>install-rtl.css" type="text/css" />
+	<title><?php echo $title ?></title>
+	<link rel="stylesheet" href="<?php echo $admin_dir; ?>css/install.css" type="text/css" />
+<?php
+if ( ( $wp_locale ) && ( 'rtl' == $wp_locale->text_direction ) ) : ?>
+	<link rel="stylesheet" href="<?php echo $admin_dir; ?>css/install-rtl.css" type="text/css" />
 <?php endif; ?>
 </head>
-<body>
+<body id="error-page">
 <?php endif; ?>
-	<h1 id="logo"><img alt="WordPress" src="<?php echo $admin_dir; ?>images/wordpress-logo.png" /></h1>
 	<?php echo $message; ?>
-
 </body>
 </html>
 <?php
 	die();
 }
 
-function _config_wp_home($url = '') {
-	if ( defined( 'WP_HOME' ) ) 
-		return WP_HOME;
-	else return $url;
-}
 
-function _config_wp_siteurl($url = '') {
-	if ( defined( 'WP_SITEURL' ) ) 
-		return WP_SITEURL;
-	else return $url;
+function _config_wp_home( $url = '' ) {
+	if ( defined( 'WP_HOME' ) )
+		return WP_HOME;
+	return $url;
 }
 
-function _mce_set_direction() {
-	global $wp_locale;
 
-	if ('rtl' == $wp_locale->text_direction) {
-		echo 'directionality : "rtl" ,';
-		echo 'theme_advanced_toolbar_align : "right" ,';
-	}
+function _config_wp_siteurl( $url = '' ) {
+	if ( defined( 'WP_SITEURL' ) )
+		return WP_SITEURL;
+	return $url;
 }
 
-function _mce_load_rtl_plugin($input) {
-	global $wp_locale;
-
-	if ('rtl' == $wp_locale->text_direction)
-		$input[] = 'directionality';
-
-	return $input;
-}
 
-function _mce_add_direction_buttons($input) {
+function _mce_set_direction( $input ) {
 	global $wp_locale;
 
-	if ('rtl' == $wp_locale->text_direction) {
-		$new_buttons = array('separator', 'ltr', 'rtl');
-		$input = array_merge($input, $new_buttons);
+	if ( 'rtl' == $wp_locale->text_direction ) {
+		$input['directionality'] = 'rtl';
+		$input['plugins'] .= ',directionality';
+		$input['theme_advanced_buttons1'] .= ',ltr';
 	}
 
 	return $input;
 }
 
+
 function smilies_init() {
 	global $wpsmiliestrans, $wp_smiliessearch, $wp_smiliesreplace;
 
 	// don't bother setting up smilies if they are disabled
-	if ( !get_option('use_smilies') )
+	if ( !get_option( 'use_smilies' ) )
 		return;
 
-	if (!isset($wpsmiliestrans)) {
+	if ( !isset( $wpsmiliestrans ) ) {
 		$wpsmiliestrans = array(
 		':mrgreen:' => 'icon_mrgreen.gif',
 		':neutral:' => 'icon_neutral.gif',
@@ -1481,44 +1502,250 @@
 		);
 	}
 
-	$siteurl = get_option('siteurl');
+	$siteurl = get_option( 'siteurl' );
 	foreach ( (array) $wpsmiliestrans as $smiley => $img ) {
-		$wp_smiliessearch[] = '/(\s|^)'.preg_quote($smiley, '/').'(\s|$)/';
-		$smiley_masked = htmlspecialchars(trim($smiley), ENT_QUOTES);
+		$wp_smiliessearch[] = '/(\s|^)' . preg_quote( $smiley, '/' ) . '(\s|$)/';
+		$smiley_masked = attribute_escape( trim( $smiley ) );
 		$wp_smiliesreplace[] = " <img src='$siteurl/wp-includes/images/smilies/$img' alt='$smiley_masked' class='wp-smiley' /> ";
 	}
 }
 
+
 function wp_parse_args( $args, $defaults = '' ) {
-	if ( is_array( $args ) )
+	if ( is_object( $args ) )
+		$r = get_object_vars( $args );
+	elseif ( is_array( $args ) )
 		$r =& $args;
 	else
 		wp_parse_str( $args, $r );
 
 	if ( is_array( $defaults ) )
 		return array_merge( $defaults, $r );
-	else
-		return $r;
+	return $r;
 }
 
+
 function wp_maybe_load_widgets() {
 	if ( !function_exists( 'dynamic_sidebar' ) ) {
-		require_once ABSPATH . WPINC . '/widgets.php';
+		require_once( ABSPATH . WPINC . '/widgets.php' );
 		add_action( '_admin_menu', 'wp_widgets_add_menu' );
 	}
 }
 
+
 function wp_widgets_add_menu() {
 	global $submenu;
 	$submenu['themes.php'][7] = array( __( 'Widgets' ), 'switch_themes', 'widgets.php' );
-	ksort($submenu['themes.php'], SORT_NUMERIC);
+	ksort( $submenu['themes.php'], SORT_NUMERIC );
 }
 
+
 // For PHP 5.2, make sure all output buffers are flushed
 // before our singletons our destroyed.
-function wp_ob_end_flush_all()
-{
+function wp_ob_end_flush_all() {
 	while ( @ob_end_flush() );
 }
 
+
+/*
+ * require_wp_db() - require_once the correct database class file.
+ *
+ * This function is used to load the database class file either at runtime or by wp-admin/setup-config.php
+ * We must globalise $wpdb to ensure that it is defined globally by the inline code in wp-db.php
+ *
+ * @global $wpdb
+ */
+function require_wp_db() {
+	global $wpdb;
+	if ( file_exists( ABSPATH . 'wp-content/db.php' ) )
+		require_once( ABSPATH . 'wp-content/db.php' );
+	else
+		require_once( ABSPATH . WPINC . '/wp-db.php' );
+}
+
+function dead_db() {
+	global $wpdb;
+
+	// Load custom DB error template, if present.
+	if ( file_exists( ABSPATH . 'wp-content/db-error.php' ) ) {
+		require_once( ABSPATH . 'wp-content/db-error.php' );
+		die();
+	}
+
+	// If installing or in the admin, provide the verbose message.
+	if ( defined('WP_INSTALLING') || defined('WP_ADMIN') )
+		wp_die($wpdb->error);
+
+	// Otherwise, be terse.
+	status_header( 500 );
+	nocache_headers();
+	header( 'Content-Type: text/html; charset=utf-8' );
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" <?php if ( function_exists( 'language_attributes' ) ) language_attributes(); ?>>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+	<title>Database Error</title>
+
+</head>
+<body>
+	<h1>Error establishing a database connection</h1>
+</body>
+</html>
+<?php
+	die();
+}
+
+/**
+ * Converts input to an absolute integer
+ * @param mixed $maybeint data you wish to have convered to an absolute integer
+ * @return int an absolute integer
+ */
+function absint( $maybeint ) {
+	return abs( intval( $maybeint ) );
+}
+
+/**
+ * Determines if the blog can be accessed over SSL
+ * @return bool whether of not SSL access is available
+ */
+function url_is_accessable_via_ssl($url)
+{
+	if (in_array('curl', get_loaded_extensions())) {
+		 $ssl = preg_replace( '/^http:\/\//', 'https://',  $url );
+
+		 $ch = curl_init();
+		 curl_setopt($ch, CURLOPT_URL, $ssl);
+		 curl_setopt($ch, CURLOPT_FAILONERROR, true);
+		 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+		 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+
+		 curl_exec($ch);
+
+		 $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+		 curl_close ($ch);
+
+		 if ($status == 200 || $status == 401) {
+			 return true;
+		 }
+	}
+	return false;
+}
+
+function atom_service_url_filter($url)
+{
+	if ( url_is_accessable_via_ssl($url) )
+		return  preg_replace( '/^http:\/\//', 'https://',  $url );
+	else
+		return $url;
+}
+
+/**
+ * _deprecated_function() - Marks a function as deprecated and informs when it has been used.
+ *
+ * There is a hook deprecated_function_run that will be called that can be used to get the backtrace
+ * up to what file and function called the deprecated function.
+ *
+ * The current behavior is to trigger an user error if WP_DEBUG is defined and is true.
+ *
+ * This function is to be used in every function in depreceated.php
+ *
+ * @package WordPress
+ * @package Debug
+ * @since 2.5
+ * @access private
+ *
+ * @uses do_action() Calls 'deprecated_function_run' and passes the function name and what to use instead.
+ * @uses apply_filters() Calls 'deprecated_function_trigger_error' and expects boolean value of true to do trigger or false to not trigger error.
+ *
+ * @param string $function The function that was called
+ * @param string $version The version of WordPress that depreceated the function
+ * @param string $replacement Optional. The function that should have been called
+ */
+function _deprecated_function($function, $version, $replacement=null) {
+
+	do_action('deprecated_function_run', $function, $replacement);
+
+	// Allow plugin to filter the output error trigger
+	if( defined('WP_DEBUG') && ( true === WP_DEBUG ) && apply_filters( 'deprecated_function_trigger_error', true )) {
+		if( !is_null($replacement) )
+			trigger_error( printf( __("%1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead."), $function, $version, $replacement ) );
+		else
+			trigger_error( printf( __("%1$s is <strong>deprecated</strong> since version %2$s with no alternative available."), $function, $version ) );
+	}
+}
+
+/**
+ * _deprecated_file() - Marks a file as deprecated and informs when it has been used.
+ *
+ * There is a hook deprecated_file_included that will be called that can be used to get the backtrace
+ * up to what file and function included the deprecated file.
+ *
+ * The current behavior is to trigger an user error if WP_DEBUG is defined and is true.
+ *
+ * This function is to be used in every file that is depreceated
+ *
+ * @package WordPress
+ * @package Debug
+ * @since 2.5
+ * @access private
+ *
+ * @uses do_action() Calls 'deprecated_file_included' and passes the file name and what to use instead.
+ * @uses apply_filters() Calls 'deprecated_file_trigger_error' and expects boolean value of true to do trigger or false to not trigger error.
+ *
+ * @param string $file The file that was included
+ * @param string $version The version of WordPress that depreceated the function
+ * @param string $replacement Optional. The function that should have been called
+ */
+function _deprecated_file($file, $version, $replacement=null) {
+
+	do_action('deprecated_file_included', $file, $replacement);
+
+	// Allow plugin to filter the output error trigger
+	if( defined('WP_DEBUG') && ( true === WP_DEBUG ) && apply_filters( 'deprecated_file_trigger_error', true )) {
+		if( !is_null($replacement) )
+			trigger_error( printf( __("%1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead."), $file, $version, $replacement ) );
+		else
+			trigger_error( printf( __("%1$s is <strong>deprecated</strong> since version %2$s with no alternative available."), $file, $version ) );
+	}
+}
+
+/**
+ * is_lighttpd_before_150() - Is the server running earlier than 1.5.0 version of lighttpd
+ *
+ * @return bool Whether the server is running lighttpd < 1.5.0
+ */
+function is_lighttpd_before_150() {
+	$server_parts = explode( '/', isset( $_SERVER['SERVER_SOFTWARE'] )? $_SERVER['SERVER_SOFTWARE'] : '' );
+	$server_parts[1] = isset( $server_parts[1] )? $server_parts[1] : '';
+	return  'lighttpd' == $server_parts[0] && -1 == version_compare( $server_parts[1], '1.5.0' );
+}
+
+/**
+ * apache_mod_loaded() - Does the specified module exist in the apache config?
+ *
+ * @param string $mod e.g. mod_rewrite
+ * @param bool $default The default return value if the module is not found
+ * @return bool
+ */
+function apache_mod_loaded($mod, $default = false) {
+	global $is_apache;
+
+	if ( !$is_apache )
+		return false;
+
+	if ( function_exists('apache_get_modules') ) {
+		$mods = apache_get_modules();
+		if ( in_array($mod, $mods) )
+			return true;
+	} elseif ( function_exists('phpinfo') ) {
+			ob_start();
+			phpinfo(8);
+			$phpinfo = ob_get_clean();
+			if ( false !== strpos($phpinfo, $mod) )
+				return true;
+	}
+	return $default;
+}
+
 ?>
diff -x .svn -aruN 2.2.2.src/wp-includes/general-template.php 2.5.src/wp-includes/general-template.php
--- 2.2.2.src/wp-includes/general-template.php	2007-07-05 15:12:07.000000000 -0500
+++ 2.5.src/wp-includes/general-template.php	2008-03-28 14:05:22.000000000 -0500
@@ -20,9 +20,11 @@
 }
 
 
-function get_sidebar() {
+function get_sidebar( $name = null ) {
 	do_action( 'get_sidebar' );
-	if ( file_exists( TEMPLATEPATH . '/sidebar.php') )
+	if ( isset($name) && file_exists( TEMPLATEPATH . "/sidebar-{$name}.php") )
+		load_template( TEMPLATEPATH . "/sidebar-{$name}.php");
+	elseif ( file_exists( TEMPLATEPATH . '/sidebar.php') )
 		load_template( TEMPLATEPATH . '/sidebar.php');
 	else
 		load_template( ABSPATH . 'wp-content/themes/default/sidebar.php');
@@ -31,9 +33,9 @@
 
 function wp_loginout() {
 	if ( ! is_user_logged_in() )
-		$link = '<a href="' . get_option('siteurl') . '/wp-login.php">' . __('Login') . '</a>';
+		$link = '<a href="' . get_option('siteurl') . '/wp-login.php">' . __('Log in') . '</a>';
 	else
-		$link = '<a href="' . get_option('siteurl') . '/wp-login.php?action=logout">' . __('Logout') . '</a>';
+		$link = '<a href="' . get_option('siteurl') . '/wp-login.php?action=logout">' . __('Log out') . '</a>';
 
 	echo apply_filters('loginout', $link);
 }
@@ -60,28 +62,16 @@
 
 
 function bloginfo($show='') {
-	$info = get_bloginfo($show);
-	
-	// Don't filter URL's.
-	if (strpos($show, 'url') === false &&
-		strpos($show, 'directory') === false &&
-		strpos($show, 'home') === false) {
-		$info = apply_filters('bloginfo', $info, $show);
-		$info = convert_chars($info);
-	} else {
-		$info = apply_filters('bloginfo_url', $info, $show);
-	}
-
-	echo $info;
+	echo get_bloginfo($show, 'display');
 }
 
 /**
- * Note: some of these values are DEPRECATED. Meaning they could be 
- * taken out at any time and shouldn't be relied upon. Options 
- * without "// DEPRECATED" are the preferred and recommended ways 
+ * Note: some of these values are DEPRECATED. Meaning they could be
+ * taken out at any time and shouldn't be relied upon. Options
+ * without "// DEPRECATED" are the preferred and recommended ways
  * to get the information.
  */
-function get_bloginfo($show='') {
+function get_bloginfo($show = '', $filter = 'raw') {
 
 	switch($show) {
 		case 'url' :
@@ -153,16 +143,29 @@
 			$output = get_option('blogname');
 			break;
 	}
+
+	$url = true;
+	if (strpos($show, 'url') === false &&
+		strpos($show, 'directory') === false &&
+		strpos($show, 'home') === false)
+		$url = false;
+
+	if ( 'display' == $filter ) {
+		if ( $url )
+			$output = apply_filters('bloginfo_url', $output, $show);
+		else
+			$output = apply_filters('bloginfo', $output, $show);
+	}
+
 	return $output;
 }
 
 
-function wp_title($sep = '&raquo;', $display = true) {
+function wp_title($sep = '&raquo;', $display = true, $seplocation = '') {
 	global $wpdb, $wp_locale, $wp_query;
 
 	$cat = get_query_var('cat');
-	$p = get_query_var('p');
-	$name = get_query_var('name');
+	$tag = get_query_var('tag_id');
 	$category_name = get_query_var('category_name');
 	$author = get_query_var('author');
 	$author_name = get_query_var('author_name');
@@ -185,8 +188,17 @@
 				else
 					$category_name = $category_name[count($category_name)-2]; // there was a trailling slash
 		}
-		$title = $wpdb->get_var("SELECT cat_name FROM $wpdb->categories WHERE category_nicename = '$category_name'");
-		$title = apply_filters('single_cat_title', $title);
+		$cat = get_term_by('slug', $category_name, 'category', OBJECT, 'display');
+		if ( $cat )
+			$title = apply_filters('single_cat_title', $cat->name);
+	}
+
+	if ( !empty($tag) ) {
+		$tag = get_term($tag, 'post_tag', OBJECT, 'display');
+		if ( is_wp_error( $tag ) )
+			return $tag;
+		if ( ! empty($tag->name) )
+			$title = apply_filters('single_tag_title', $tag->name);
 	}
 
 	// If there's an author
@@ -196,7 +208,7 @@
 	}
 	if ( !empty($author_name) ) {
 		// We do a direct query here because we don't cache by nicename.
-		$title = $wpdb->get_var("SELECT display_name FROM $wpdb->users WHERE user_nicename = '$author_name'");
+		$title = $wpdb->get_var($wpdb->prepare("SELECT display_name FROM $wpdb->users WHERE user_nicename = %s", $author_name));
 	}
 
 	// If there's a month
@@ -225,7 +237,12 @@
 	if ( !empty($title) )
 		$prefix = " $sep ";
 
-	$title = $prefix . $title;
+ 	// Determines position of the separator
+	if ( 'right' == $seplocation )
+		$title = $title . $prefix;
+	else
+		$title = $prefix . $title;
+
 	$title = apply_filters('wp_title', $title, $sep);
 
 	// Send it out
@@ -233,6 +250,7 @@
 		echo $title;
 	else
 		return $title;
+
 }
 
 
@@ -243,7 +261,7 @@
 
 	if ( intval($p) || '' != $name ) {
 		if ( !$p )
-			$p = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_name = '$name'");
+			$p = $wpdb->get_var($wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE post_name = %s", $name));
 		$post = & get_post($p);
 		$title = $post->post_title;
 		$title = apply_filters('single_post_title', $title);
@@ -265,6 +283,29 @@
 			else
 				return strip_tags($my_cat_name);
 		}
+	} else if ( is_tag() ) {
+		return single_tag_title($prefix, $display);
+	}
+}
+
+
+function single_tag_title($prefix = '', $display = true ) {
+	if ( !is_tag() )
+		return;
+
+	$tag_id = intval( get_query_var('tag_id') );
+
+	if ( !empty($tag_id) ) {
+		$my_tag = &get_term($tag_id, 'post_tag', OBJECT, 'display');
+		if ( is_wp_error( $my_tag ) )
+			return false;
+		$my_tag_name = apply_filters('single_tag_title', $my_tag->name);
+		if ( !empty($my_tag_name) ) {
+			if ( $display )
+				echo $prefix . $my_tag_name;
+			else
+				return $my_tag_name;
+		}
 	}
 }
 
@@ -313,22 +354,22 @@
 
 
 function wp_get_archives($args = '') {
-	global $wp_locale, $wpdb;
+	global $wpdb, $wp_locale;
 
-	if ( is_array($args) )
-		$r = &$args;
-	else
-		parse_str($args, $r);
+	$defaults = array(
+		'type' => 'monthly', 'limit' => '',
+		'format' => 'html', 'before' => '',
+		'after' => '', 'show_post_count' => false
+	);
 
-	$defaults = array('type' => 'monthly', 'limit' => '', 'format' => 'html', 'before' => '', 'after' => '', 'show_post_count' => false);
-	$r = array_merge($defaults, $r);
-	extract($r, EXTR_SKIP);
+	$r = wp_parse_args( $args, $defaults );
+	extract( $r, EXTR_SKIP );
 
 	if ( '' == $type )
 		$type = 'monthly';
 
 	if ( '' != $limit ) {
-		$limit = (int) $limit;
+		$limit = absint($limit);
 		$limit = ' LIMIT '.$limit;
 	}
 
@@ -351,27 +392,42 @@
 		$archive_week_end_date_format = get_option('date_format');
 	}
 
-	$add_hours = intval(get_option('gmt_offset'));
-	$add_minutes = intval(60 * (get_option('gmt_offset') - $add_hours));
-
 	//filters
 	$where = apply_filters('getarchives_where', "WHERE post_type = 'post' AND post_status = 'publish'", $r );
 	$join = apply_filters('getarchives_join', "", $r);
 
 	if ( 'monthly' == $type ) {
-		$arcresults = $wpdb->get_results("SELECT DISTINCT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC" . $limit);
+		$query = "SELECT DISTINCT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC $limit";
+		$key = md5($query);
+		$cache = wp_cache_get( 'wp_get_archives' , 'general');
+		if ( !isset( $cache[ $key ] ) ) {
+			$arcresults = $wpdb->get_results($query);
+			$cache[ $key ] = $arcresults;
+			wp_cache_add( 'wp_get_archives', $cache, 'general' );
+		} else {
+			$arcresults = $cache[ $key ];
+		}
 		if ( $arcresults ) {
 			$afterafter = $after;
 			foreach ( $arcresults as $arcresult ) {
 				$url	= get_month_link($arcresult->year,	$arcresult->month);
 				$text = sprintf(__('%1$s %2$d'), $wp_locale->get_month($arcresult->month), $arcresult->year);
-				if ( $show_post_count ) 
+				if ( $show_post_count )
 					$after = '&nbsp;('.$arcresult->posts.')' . $afterafter;
 				echo get_archives_link($url, $text, $format, $before, $after);
 			}
 		}
 	} elseif ('yearly' == $type) {
-         $arcresults = $wpdb->get_results("SELECT DISTINCT YEAR(post_date) AS `year`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date) ORDER BY post_date DESC" . $limit);
+		$query = "SELECT DISTINCT YEAR(post_date) AS `year`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date) ORDER BY post_date DESC $limit";
+		$key = md5($query);
+		$cache = wp_cache_get( 'wp_get_archives' , 'general');
+		if ( !isset( $cache[ $key ] ) ) {
+			$arcresults = $wpdb->get_results($query);
+			$cache[ $key ] = $arcresults;
+			wp_cache_add( 'wp_get_archives', $cache, 'general' );
+		} else {
+			$arcresults = $cache[ $key ];
+		}
 		if ($arcresults) {
 			$afterafter = $after;
 			foreach ($arcresults as $arcresult) {
@@ -383,7 +439,16 @@
 			}
 		}
 	} elseif ( 'daily' == $type ) {
-		$arcresults = $wpdb->get_results("SELECT DISTINCT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, DAYOFMONTH(post_date) AS `dayofmonth`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date), MONTH(post_date), DAYOFMONTH(post_date) ORDER BY post_date DESC" . $limit);
+		$query = "SELECT DISTINCT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, DAYOFMONTH(post_date) AS `dayofmonth`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date), MONTH(post_date), DAYOFMONTH(post_date) ORDER BY post_date DESC $limit";
+		$key = md5($query);
+		$cache = wp_cache_get( 'wp_get_archives' , 'general');
+		if ( !isset( $cache[ $key ] ) ) {
+			$arcresults = $wpdb->get_results($query);
+			$cache[ $key ] = $arcresults;
+			wp_cache_add( 'wp_get_archives', $cache, 'general' );
+		} else {
+			$arcresults = $cache[ $key ];
+		}
 		if ( $arcresults ) {
 			$afterafter = $after;
 			foreach ( $arcresults as $arcresult ) {
@@ -397,7 +462,16 @@
 		}
 	} elseif ( 'weekly' == $type ) {
 		$start_of_week = get_option('start_of_week');
-		$arcresults = $wpdb->get_results("SELECT DISTINCT WEEK(post_date, $start_of_week) AS `week`, YEAR(post_date) AS yr, DATE_FORMAT(post_date, '%Y-%m-%d') AS yyyymmdd, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY WEEK(post_date, $start_of_week), YEAR(post_date) ORDER BY post_date DESC" . $limit);
+		$query = "SELECT DISTINCT WEEK(post_date, $start_of_week) AS `week`, YEAR(post_date) AS yr, DATE_FORMAT(post_date, '%Y-%m-%d') AS yyyymmdd, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY WEEK(post_date, $start_of_week), YEAR(post_date) ORDER BY post_date DESC $limit";
+		$key = md5($query);
+		$cache = wp_cache_get( 'wp_get_archives' , 'general');
+		if ( !isset( $cache[ $key ] ) ) {
+			$arcresults = $wpdb->get_results($query);
+			$cache[ $key ] = $arcresults;
+			wp_cache_add( 'wp_get_archives', $cache, 'general' );
+		} else {
+			$arcresults = $cache[ $key ];
+		}
 		$arc_w_last = '';
 		$afterafter = $after;
 		if ( $arcresults ) {
@@ -418,7 +492,16 @@
 		}
 	} elseif ( ( 'postbypost' == $type ) || ('alpha' == $type) ) {
 		('alpha' == $type) ? $orderby = "post_title ASC " : $orderby = "post_date DESC ";
-		$arcresults = $wpdb->get_results("SELECT * FROM $wpdb->posts $join $where ORDER BY $orderby $limit");
+		$query = "SELECT * FROM $wpdb->posts $join $where ORDER BY $orderby $limit";
+		$key = md5($query);
+		$cache = wp_cache_get( 'wp_get_archives' , 'general');
+		if ( !isset( $cache[ $key ] ) ) {
+			$arcresults = $wpdb->get_results($query);
+			$cache[ $key ] = $arcresults;
+			wp_cache_add( 'wp_get_archives', $cache, 'general' );
+		} else {
+			$arcresults = $cache[ $key ];
+		}
 		if ( $arcresults ) {
 			foreach ( $arcresults as $arcresult ) {
 				if ( $arcresult->post_date != '0000-00-00 00:00:00' ) {
@@ -444,7 +527,7 @@
 
 
 function get_calendar($initial = true) {
-	global $wpdb, $m, $monthnum, $year, $timedifference, $wp_locale, $posts;
+	global $wpdb, $m, $monthnum, $year, $wp_locale, $posts;
 
 	$key = md5( $m . $monthnum . $year );
 	if ( $cache = wp_cache_get( 'get_calendar', 'calendar' ) ) {
@@ -467,8 +550,6 @@
 
 	// week_begins = 0 stands for Sunday
 	$week_begins = intval(get_option('start_of_week'));
-	$add_hours = intval(get_option('gmt_offset'));
-	$add_minutes = intval(60 * (get_option('gmt_offset') - $add_hours));
 
 	// Let's figure out when we are
 	if ( !empty($monthnum) && !empty($year) ) {
@@ -480,7 +561,6 @@
 		$d = (($w - 1) * 7) + 6; //it seems MySQL's weeks disagree with PHP's
 		$thismonth = $wpdb->get_var("SELECT DATE_FORMAT((DATE_ADD('${thisyear}0101', INTERVAL $d DAY) ), '%m')");
 	} elseif ( !empty($m) ) {
-		$calendar = substr($m, 0, 6);
 		$thisyear = ''.intval(substr($m, 0, 4));
 		if ( strlen($m) < 6 )
 				$thismonth = '01';
@@ -509,7 +589,7 @@
 			LIMIT 1");
 
 	echo '<table id="wp-calendar" summary="' . __('Calendar') . '">
-	<caption>' . $wp_locale->get_month($thismonth) . ' ' . date('Y', $unixmonth) . '</caption>
+	<caption>' . sprintf(_c('%1$s %2$s|Used as a calendar caption'), $wp_locale->get_month($thismonth), date('Y', $unixmonth)) . '</caption>
 	<thead>
 	<tr>';
 
@@ -585,10 +665,10 @@
 	);
 	if ( $ak_post_titles ) {
 		foreach ( $ak_post_titles as $ak_post_title ) {
-			
+
 				$post_title = apply_filters( "the_title", $ak_post_title->post_title );
 				$post_title = str_replace('"', '&quot;', wptexturize( $post_title ));
-								
+
 				if ( empty($ak_titles_for_day['day_'.$ak_post_title->dom]) )
 					$ak_titles_for_day['day_'.$ak_post_title->dom] = '';
 				if ( empty($ak_titles_for_day["$ak_post_title->dom"]) ) // first one
@@ -635,7 +715,7 @@
 	ob_end_clean();
 	echo $output;
 	$cache[ $key ] = $output;
-	wp_cache_add( 'get_calendar', $cache, 'calendar' );
+	wp_cache_set( 'get_calendar', $cache, 'calendar' );
 }
 
 function delete_get_calendar_cache() {
@@ -675,7 +755,7 @@
 
 
 function the_date($d='', $before='', $after='', $echo = true) {
-	global $id, $post, $day, $previousday, $newday;
+	global $post, $day, $previousday;
 	$the_date = '';
 	if ( $day != $previousday ) {
 		$the_date .= $before;
@@ -762,7 +842,7 @@
 
 
 function the_weekday() {
-	global $wp_locale, $id, $post;
+	global $wp_locale, $post;
 	$the_weekday = $wp_locale->get_weekday(mysql2date('w', $post->post_date));
 	$the_weekday = apply_filters('the_weekday', $the_weekday);
 	echo $the_weekday;
@@ -770,7 +850,7 @@
 
 
 function the_weekday_date($before='',$after='') {
-	global $wp_locale, $id, $post, $day, $previousweekday;
+	global $wp_locale, $post, $day, $previousweekday;
 	$the_weekday_date = '';
 	if ( $day != $previousweekday ) {
 		$the_weekday_date .= $before;
@@ -791,7 +871,12 @@
 }
 
 function rsd_link() {
-	echo '	<link rel="EditURI" type="application/rsd+xml" title="RSD" href="' . get_bloginfo('wpurl') . "/xmlrpc.php?rsd\" />\n";
+	echo '<link rel="EditURI" type="application/rsd+xml" title="RSD" href="' . get_bloginfo('wpurl') . "/xmlrpc.php?rsd\" />\n";
+}
+
+function wlwmanifest_link() {
+	echo '<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="'
+		. get_bloginfo('wpurl') . '/wp-includes/wlwmanifest.xml" /> ' . "\n";
 }
 
 function noindex() {
@@ -809,10 +894,10 @@
 
 function user_can_richedit() {
 	global $wp_rich_edit, $pagenow;
-	
+
 	if ( !isset( $wp_rich_edit) ) {
-		if ( get_user_option( 'rich_editing' ) == 'true' && 
-			( ( preg_match( '!AppleWebKit/(\d+)!', $_SERVER['HTTP_USER_AGENT'], $match ) && intval($match[1]) >= 420 ) || 
+		if ( get_user_option( 'rich_editing' ) == 'true' &&
+			( ( preg_match( '!AppleWebKit/(\d+)!', $_SERVER['HTTP_USER_AGENT'], $match ) && intval($match[1]) >= 420 ) ||
 				!preg_match( '!opera[ /][2-8]|konqueror|safari!i', $_SERVER['HTTP_USER_AGENT'] ) )
 				&& 'comment.php' != $pagenow ) {
 			$wp_rich_edit = true;
@@ -824,142 +909,120 @@
 	return apply_filters('user_can_richedit', $wp_rich_edit);
 }
 
-function the_editor($content, $id = 'content', $prev_id = 'title') {
+function wp_default_editor() {
+	$r = user_can_richedit() ? 'tinymce' : 'html'; // defaults
+	if ( $user = wp_get_current_user() ) { // look for cookie
+		if ( isset($_COOKIE['wordpress_editor_' . $user->ID]) && in_array($_COOKIE['wordpress_editor_' . $user->ID], array('tinymce', 'html', 'test') ) )
+			$r = $_COOKIE['wordpress_editor_' . $user->ID];
+	}
+	return apply_filters( 'wp_default_editor', $r ); // filter
+}
+
+function the_editor($content, $id = 'content', $prev_id = 'title', $media_buttons = true, $tab_index = 2) {
 	$rows = get_option('default_post_edit_rows');
 	if (($rows < 3) || ($rows > 100))
 		$rows = 12;
 
-	$rows = "rows='$rows'";
-
-	if ( user_can_richedit() ) :
-		add_filter('the_editor_content', 'wp_richedit_pre');
-
-		//	The following line moves the border so that the active button "attaches" to the toolbar. Only IE needs it.
-	?>
-	<style type="text/css">
-		#postdivrich table, #postdivrich #quicktags {border-top: none;}
-		#quicktags {border-bottom: none; padding-bottom: 2px; margin-bottom: -1px;}
-		#edButtons {border-bottom: 1px solid #ccc;}
-	</style>
-	<div id='edButtons' style='display:none;'>
-		<div class='zerosize'><input accesskey='e' type='button' onclick='switchEditors("<?php echo $id; ?>")' /></div>
-		<input id='edButtonPreview' class='edButtonFore' type='button' value='<?php _e('Visual'); ?>' />
-		<input id='edButtonHTML' class='edButtonBack' type='button' value='<?php _e('Code'); ?>' onclick='switchEditors("<?php echo $id; ?>")' />
+	$rows = "rows='$rows'";	?>
+	<div id="editor-toolbar">
+	<?php if ( user_can_richedit() ) {
+		$wp_default_editor = wp_default_editor(); ?>
+		<div class="zerosize"><input accesskey="e" type="button" onclick="switchEditors.go('<?php echo $id; ?>')" /></div>
+		<?php if ( 'tinymce' == $wp_default_editor ) {
+			add_filter('the_editor_content', 'wp_richedit_pre'); ?>
+			<a id="edButtonHTML" onclick="switchEditors.go('<?php echo $id; ?>');"><?php _e('HTML'); ?></a>
+			<a id="edButtonPreview" class="active"><?php _e('Visual'); ?></a>
+		<?php } elseif ( 'html' == $wp_default_editor ) {
+			add_filter('the_editor_content', 'wp_htmledit_pre'); ?>
+			<a id="edButtonHTML" class="active"><?php _e('HTML'); ?></a>
+			<a id="edButtonPreview" onclick="switchEditors.go('<?php echo $id; ?>');"><?php _e('Visual'); ?></a>
+		<?php }
+	}
+
+	if ( $media_buttons ) { ?>
+		<div id="media-buttons" class="hide-if-no-js">
+		<?php do_action( 'media_buttons' ); ?>
+		</div>
+	<?php } ?>
 	</div>
-	<script type="text/javascript">
-	// <![CDATA[
-		if ( typeof tinyMCE != "undefined" && tinyMCE.configs.length > 0 )
-			document.getElementById('edButtons').style.display = 'block';
-	// ]]>
-	</script>
 
-	<?php endif; ?>
 	<div id="quicktags">
 	<?php wp_print_scripts( 'quicktags' ); ?>
 	<script type="text/javascript">edToolbar()</script>
 	</div>
-	<script type="text/javascript">
-	// <![CDATA[
-		if ( typeof tinyMCE != "undefined" && tinyMCE.configs.length > 0 )
-			document.getElementById("quicktags").style.display="none";
-
-		function edInsertContent(myField, myValue) {
-			//IE support
-			if (document.selection) {
-				myField.focus();
-				sel = document.selection.createRange();
-				sel.text = myValue;
-				myField.focus();
-			}
-			//MOZILLA/NETSCAPE support
-			else if (myField.selectionStart || myField.selectionStart == "0") {
-				var startPos = myField.selectionStart;
-				var endPos = myField.selectionEnd;
-				myField.value = myField.value.substring(0, startPos)
-				              + myValue 
-		                      + myField.value.substring(endPos, myField.value.length);
-				myField.focus();
-				myField.selectionStart = startPos + myValue.length;
-				myField.selectionEnd = startPos + myValue.length;
-			} else {
-				myField.value += myValue;
-				myField.focus();
-			}
-		}
-	// ]]>
-	</script>
-	<?php
 
-	$the_editor = apply_filters('the_editor', "<div><textarea class='mceEditor' $rows cols='40' name='$id' tabindex='2' id='$id'>%s</textarea></div>\n");
+    <?php if ( 'html' != $wp_default_editor ) : ?>
+    <script type="text/javascript">
+    // <![CDATA[
+        if ( typeof tinyMCE != "undefined" )
+            document.getElementById("quicktags").style.display="none";
+    // ]]>
+    </script>
+    <?php endif; // 'html' != $wp_default_editor
+
+	$the_editor = apply_filters('the_editor', "<div id='editorcontainer'><textarea class='' $rows cols='40' name='$id' tabindex='$tab_index' id='$id'>%s</textarea></div>\n");
 	$the_editor_content = apply_filters('the_editor_content', $content);
 
 	printf($the_editor, $the_editor_content);
 
 	?>
-	<script type="text/javascript">
-	//<!--
-	edCanvas = document.getElementById('<?php echo $id; ?>');
-	<?php if ( $prev_id && user_can_richedit() ) : ?>
-	// If tinyMCE is defined.
-	if ( typeof tinyMCE != 'undefined' ) {
-	// This code is meant to allow tabbing from Title to Post (TinyMCE).
-		if ( tinyMCE.isMSIE ) {
-			document.getElementById('<?php echo $prev_id; ?>').onkeydown = function (e) {
-				e = e ? e : window.event;
-				if (e.keyCode == 9 && !e.shiftKey && !e.controlKey && !e.altKey) {
-					var i = tinyMCE.getInstanceById('<?php echo $id; ?>');
-					if(typeof i ==  'undefined')
-						return true;
-					tinyMCE.execCommand("mceStartTyping");
-					this.blur();
-					i.contentWindow.focus();
-					e.returnValue = false;
-					return false;
-				}
-			}
-		} else {
-			document.getElementById('<?php echo $prev_id; ?>').onkeypress = function (e) {
-				e = e ? e : window.event;
-				if (e.keyCode == 9 && !e.shiftKey && !e.controlKey && !e.altKey) {
-					var i = tinyMCE.getInstanceById('<?php echo $id; ?>');
-					if(typeof i ==  'undefined')
-						return true;
-					tinyMCE.execCommand("mceStartTyping");
-					this.blur();
-					i.contentWindow.focus();
-					e.returnValue = false;
-					return false;
-				}
-			}
-		}
-	}
-	<?php endif; ?>
-	//-->
-	</script>
-	<?php
+    <script type="text/javascript">
+    // <![CDATA[
+    edCanvas = document.getElementById('<?php echo $id; ?>');
+    <?php if ( $prev_id && user_can_richedit() ) : ?>
+    // If tinyMCE is defined.
+    if ( typeof tinyMCE != 'undefined' ) {
+    // This code is meant to allow tabbing from Title to Post (TinyMCE).
+        document.getElementById('<?php echo $prev_id; ?>').onkeydown = function (e) {
+            e = e || window.event;
+            if (e.keyCode == 9 && !e.shiftKey && !e.controlKey && !e.altKey) {
+                if ( tinyMCE.activeEditor ) {
+                    if ( (jQuery("#post_ID").val() < 1) && (jQuery("#title").val().length > 0) ) { autosave(); }
+                    e = null;
+                    if ( tinyMCE.activeEditor.isHidden() ) return true;
+                    tinyMCE.activeEditor.focus();
+                    return false;
+                }
+                return true;
+            }
+        }
+    }
+    <?php endif; ?>
+    // ]]>
+    </script>
+    <?php
+}
+
+function get_search_query() {
+	return apply_filters( 'get_search_query', stripslashes( get_query_var( 's' ) ) );
 }
 
 function the_search_query() {
-	global $s;
-	echo attribute_escape(stripslashes($s));
+	echo attribute_escape( apply_filters( 'the_search_query', get_search_query() ) );
 }
 
-function language_attributes() {
+function language_attributes($doctype = 'html') {
+	$attributes = array();
 	$output = '';
+
 	if ( $dir = get_bloginfo('text_direction') )
-		$output = "dir=\"$dir\"";
+		$attributes[] = "dir=\"$dir\"";
+
 	if ( $lang = get_bloginfo('language') ) {
-		if ( $dir ) $output .= ' ';
-		if ( get_option('html_type') == 'text/html' )
-			$output .= "lang=\"$lang\"";
-		else $output .= "xml:lang=\"$lang\"";
+		if ( get_option('html_type') == 'text/html' || $doctype == 'xhtml' )
+			$attributes[] = "lang=\"$lang\"";
+
+		if ( get_option('html_type') != 'text/html' || $doctype == 'xhtml' )
+			$attributes[] = "xml:lang=\"$lang\"";
 	}
 
+	$output = implode(' ', $attributes);
+	$output = apply_filters('language_attributes', $output);
 	echo $output;
 }
 
 function paginate_links( $args = '' ) {
-	$defaults = array( 
+	$defaults = array(
 		'base' => '%_%', // http://example.com/all_posts.php%_% : %_% is replaced by format (below)
 		'format' => '?page=%#%', // ?page=%#% : %#% is replaced by the page number
 		'total' => 1,
@@ -1037,4 +1100,90 @@
 	endswitch;
 	return $r;
 }
+
+function wp_admin_css_color($key, $name, $url, $colors = array()) {
+	global $_wp_admin_css_colors;
+
+	if ( !isset($_wp_admin_css_colors) )
+		$_wp_admin_css_colors = array();
+
+	$_wp_admin_css_colors[$key] = (object) array('name' => $name, 'url' => $url, 'colors' => $colors);
+}
+
+function wp_admin_css_uri( $file = 'wp-admin' ) {
+	if ( defined('WP_INSTALLING') ) {
+		$_file = "./$file.css";
+	} else {
+		if ( 'css/colors' == $file || 'css/colors-rtl' == $file ) {
+			global $_wp_admin_css_colors;
+			$color = get_user_option('admin_color');
+			if ( empty($color) || !isset($_wp_admin_css_colors[$color]) )
+				$color = 'fresh';
+			$color = $_wp_admin_css_colors[$color];
+			$_file = $color->url;
+			$_file = ('css/colors-rtl' == $file) ? str_replace('.css','-rtl.css',$_file) : $_file;
+		} else {
+			$_file = get_option( 'siteurl' ) . "/wp-admin/$file.css";
+		}
+	}
+	$_file = add_query_arg( 'version', get_bloginfo( 'version' ),  $_file );
+
+	return apply_filters( 'wp_admin_css_uri', $_file, $file );
+}
+
+function wp_admin_css( $file = 'wp-admin' ) {
+
+	echo apply_filters( 'wp_admin_css', "<link rel='stylesheet' href='" . wp_admin_css_uri( $file ) . "' type='text/css' />\n", $file );
+	if ( 'rtl' == get_bloginfo( 'text_direction' ) ) {
+		$rtl = ( 'wp-admin' == $file ) ? 'rtl' : "$file-rtl";
+		echo apply_filters( 'wp_admin_css', "<link rel='stylesheet' href='" . wp_admin_css_uri( $rtl ) . "' type='text/css' />\n", $rtl );
+	}
+}
+
+/**
+ * Outputs the XHTML generator that is generated on the wp_head hook.
+ */
+function wp_generator()
+{
+	the_generator( apply_filters( 'wp_generator_type', 'xhtml' ) );
+}
+
+/**
+ * Outputs the generator XML or Comment for RSS, ATOM, etc.
+ * @param {String} $type The type of generator to return.
+ */
+function the_generator ( $type ) {
+	echo apply_filters('the_generator',get_the_generator($type),$type) . "\n";
+}
+
+/**
+ * Creates the generator XML or Comment for RSS, ATOM, etc.
+ * @param {String} $type The type of generator to return.
+ */
+function get_the_generator ( $type ) {
+	switch ($type) {
+		case 'html':
+			$gen = '<meta name="generator" content="WordPress ' . get_bloginfo( 'version' ) . '">' . "\n";
+			break;
+		case 'xhtml':
+			$gen = '<meta name="generator" content="WordPress ' . get_bloginfo( 'version' ) . '" />' . "\n";
+			break;
+		case 'atom':
+			$gen = '<generator uri="http://wordpress.org/" version="' . get_bloginfo_rss( 'version' ) . '">WordPress</generator>';
+			break;
+		case 'rss2':
+			$gen = '<generator>http://wordpress.org/?v=' . get_bloginfo_rss( 'version' ) . '</generator>';
+			break;
+		case 'rdf':
+			$gen = '<admin:generatorAgent rdf:resource="http://wordpress.org/?v=' . get_bloginfo_rss( 'version' ) . '" />';
+			break;
+		case 'comment':
+			$gen = '<!-- generator="WordPress/' . get_bloginfo( 'version' ) . '" -->';
+			break;
+		case 'export':
+			$gen = '<!-- generator="WordPress/' . get_bloginfo_rss('version') . '" created="'. date('Y-m-d H:i') . '"-->';
+			break;
+	}
+	return apply_filters( "get_the_generator_{$type}", $gen, $type );
+}
 ?>
diff -x .svn -aruN 2.2.2.src/wp-includes/gettext.php 2.5.src/wp-includes/gettext.php
--- 2.2.2.src/wp-includes/gettext.php	2007-04-13 18:29:47.000000000 -0500
+++ 2.5.src/wp-includes/gettext.php	2008-01-04 14:05:07.000000000 -0600
@@ -1,5 +1,11 @@
 <?php
-/*
+/**
+ * PHP-Gettext External Library: gettext_reader class
+ *
+ * @package External
+ * @subpackage PHP-gettext
+ *
+ * @internal
 	 Copyright (c) 2003 Danilo Segan <danilo@kvota.net>.
 	 Copyright (c) 2005 Nico Kaiser <nico@siriux.net>
 
@@ -114,7 +120,7 @@
 
 		$this->STREAM = $Reader;
 		$magic = $this->readint();
-		if ($magic == ($MAGIC1 & 0xFFFFFFFF) || $magic == ($MAGIC3 & 0xFFFFFFFF)) { // to make sure it works for 64-bit platforms
+		if ($magic == $MAGIC1 || $magic == $MAGIC3) { // to make sure it works for 64-bit platforms
 			$this->BYTEORDER = 0;
 		} elseif ($magic == ($MAGIC2 & 0xFFFFFFFF)) {
 			$this->BYTEORDER = 1;
@@ -391,4 +397,4 @@
 
 }
 
-?>
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/images/audio.png 2.5.src/wp-includes/images/audio.png
--- 2.2.2.src/wp-includes/images/audio.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/images/audio.png	2008-02-21 23:53:47.000000000 -0600
@@ -0,0 +1,8 @@
+PNG
+
+   
IHDR           D   tEXtSoftware Adobe ImageReadyqe<   `PLTE议ᇉĻ`bB?,p0rvɧbV䫹νj.6  tIDATxl҇r  =3:-m!>'/꿆!rٗeP[dO?aVHGzDbi@h@=xV<Df@v`9t
+4v"oTTހxn|SfqQRpW7<1
 )yt[I0˲|ξ>߇݂2{U| Mr`l#U1VXt[&Sh$` k-|D\gl$:Í/ @P;~y *'?n
+@hx<bhz @C
+a%6*^5b;H
+C8I
6O^i,ϳ݊` c
+o    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/images/crystal/archive.png 2.5.src/wp-includes/images/crystal/archive.png
--- 2.2.2.src/wp-includes/images/crystal/archive.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/images/crystal/archive.png	2008-02-29 00:49:05.000000000 -0600
@@ -0,0 +1,10 @@
+PNG
+
+   
IHDR   .   <      tEXtSoftware Adobe ImageReadyqe<  IDATxڼZYok].)%ȖQd؆! s^Sb~$%5ݙ3Us.%v29>`{{[JIN9(ιx038DhcڕX9}EXcV;D\t+|ncsn4\e-%Z(l`e+]6A|kp {PVy^ݞѴG
Spi;
Mxe&ve4(򣣉ADA9͂Ѭ6iȕӼi
mgD^PZkn{&+Ci>,Lh5dc! 
+.8e))ePA[Py)GAYI g0XXm`Q2؟i	reeAi0\$B!A>r̓^ɐ2P4S	)O2ʒV4@P7^V/~:|[NfRV	<ɹ2!=1xI59Z,LeC$eN
+Y:P(wBƁcgFS[|y2}y"MyBc9JJ|u$"dȇ3X@h&F)c$AԀAP"@GV4`|*Z2fh<fY*KF|p%ԐMkY%}g<O51oWXz԰G~J#L*zD1wTJSY2D+NSI,?7c$<rRHS4O=yrwqyߪibdI ,	f% tV\ʶ='ϟdA)A+2[YgAGNN+(ay[I4GR)NR.a1pCg>Ɖӊ(AUl}taowv`; 0$px*OO&\ړ0,i!tDBkiN
my]yRm+[?/CaL3 A?:>tr'&$!(ZIpcJe+ALգ
v> KvՅ`)@Fuhto/,HYź3ZJp}h N1A
RlxT a@Dl|TF2(0bvr8}7&k =MlbVc-jl -^Bf÷ŭm"jN[4@>చPelti[%|:/RԓfFĒ֦և/
|3Zق~WbC[l~7>ۻIҬ>K)@c>:Nj1Dc 'gņ@:fٰ(?qSk+AU@foPZKtB<J(̱2.i666t_9g6g.&[WX-%XԞS\Tl?W_#LY"<^q/6Pc;6mwxd@Ĩ %R?/DN"9(F<pY:chX-:ZgfL ztﲺfWkS?Y+FI,yxƗmrQh(v?h4xLUm:tŵЋ[Q)7PG{
I9DUZ)f
dސ>A5EYH+.A0Ys6( :DҠ]%5?Ö/SVrőޖIn
gBhoZ'Mx8gƺPQk:d.+z02H>52rˠU1/fw
)m`| ?g-
+ӫiDC*C&H C2e@^Pr&R
Xæ[Bb7ynJ
+YYŊvUn._y2'>l=%de¨Y7"
+r.0"߸vi+oT}=3(z}-ߖo?~|~q1,q	+y%mCk(97oWUQty~՝k]xn6+k']m.4ꕋ?S>ǟ`w11@P#LY#+ͫ~\zl5TOwkbrPc:_X`Ҫ@/]|wǓ_u'I1S({o޽;副.猹RHąGw`a؅śqq^孫nݼscݗ3FK-֍
+v;gu[)CS2RXoz,߾%X[Q
+I%!0VkA5$Ds}X)OVz6WIveK9n|nyEkѴ+HOu秮ϛ9n5<4DmDO4@Be6DF6=HK8TV"P58A`qHGG.
~]dXl@݇¤^ԊHW}Ye6X'x$o
.|pۇwCtM:Wu1O[ZbK!xPfiddx܃K[[ޖJ⤓qYJڝ\SABDS#zKЯ셸3&F!uJU٨عh4Is
:N0BJI3↥{8 {C   !	    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/images/crystal/audio.png 2.5.src/wp-includes/images/crystal/audio.png
--- 2.2.2.src/wp-includes/images/crystal/audio.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/images/crystal/audio.png	2008-02-29 00:49:05.000000000 -0600
@@ -0,0 +1,8 @@
+PNG
+
+   
IHDR   .   <      tEXtSoftware Adobe ImageReadyqe<  	IDATxYklGξ4i$NlEIphJC_@E| HR!*> Q!$CHR5-%H-ZJwmڸ/w{ݻnwώXݙt̙l6is!V8i_1v<ϲ,o (gϞ e&!M0I0@y<,z	fu1Pc9N0M`WI&@И&Vh_DsE:!Ӛ5QMF-|{;AG@
Ю3qX``e,te@XsĎ}
r-Sio3Ɩ1ØwA#R-DXCll.Dϭ
<Zue$FK@kqCģ^ m5J*,^;%+

QU몪%p67o=~Cl#-f+A
+&atS	K>)zCiFZ/KrR)JCmJ5_(FvNw+=\p|W^yRjJ] AoJ@E8Dt4@T
x}p}W߻>7iUi(7_<pD^
+˃@8	p3i(Z^Zs
UdY!_c@#J|Z/6^xYNex,C!PY,uS3RՕRt{6i`t'
SCкl&J%bHXCLpѴ&T5 QWܼj_@رM@
ɸVA((SIg[s--~Y0	uOLX60O+~5M݉G=)IpKJ>:\Zk'B4q2hwYNvTy&4"O~73Y֙;J'WVdn'	޷
Yr,S@=3ɲW4$@@$ IT]<D0h8=`s`!O@`P w,
A:o4B򾋂+J@R_)7A=z<B>w0m
+ԋ+CınKȨ{YĴKa<iU~j bIkLwVs!(z;u
+Piņaz)*Ppʓ@bX\"]؛ʕD<tjT,/9;覍ӟ{t0y3?䎭<vXuoy?{¥d?[禎ǁ2>/Oo|uG*3> IjY]_(>Tzo=}a0/|Ƿsw^_ۋ$|jEѭEa)ts~~Ccuo}GN`zbJ҅;奲,ɪ=sXc
|PO읢9W[_GC"_^"hjYXX O/:ejRUkdy]&]o..6ebɉ7xv|7"YBPW@bT\S}o4YbhP'>>ՕuYUs9x1"
\bM|*=vxV_<zmpf˖~h;~~|Z39z(G2.^!?;ٽ?'ޙͤb~5{
+Br0N?qĶѱx$2<4?ylIRI
R<Օy{Ͻ[H&kjg>0:6"bKu+ǎo\vuM)(N^px+H# DOȒ](J(2ǥөթs[WѤҏ}hPɁj:AS,v5\EhY=1m^%׏/|UtL!AvHs{MӠ	I` x]bV_SU `'khU!dw6;W j&]@F MknOisQePG\X5TnqYV7oF=
j2 GM=COvxiV=wgQR9Y%Ffۧ}F1L*dG=^Abỳ;xFCWy%LGMFhxANGC0@o:9cV%lp,*`)	1y/@ɇDȱEF$G[g[KKWh:\DA ֱ7x-}BJ.YzZ 81pv	X%#O9vmAMR$E~199_ :~N    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/images/crystal/code.png 2.5.src/wp-includes/images/crystal/code.png
--- 2.2.2.src/wp-includes/images/crystal/code.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/images/crystal/code.png	2008-02-29 00:49:05.000000000 -0600
@@ -0,0 +1,8 @@
+PNG
+
+   
IHDR   .   <      tEXtSoftware Adobe ImageReadyqe<  IDATxڼSI#  
+OXLj'_tč$FFQ38@5==ݷϽ3uo޼FO\uuuOj~o˥4돏'l\.{ׯ_kBEay	=
.:ĸ.}rjfꚭQP9F~o֘qdhʣ{O)S?5л;DkUc=FLfk`` a-:22xtS텅裿?CsaV jll-h/_&'\[[Ӵۛ8;;c
Yrff9ӧOOTZ]]x܃HCassVeB!Q&e@ss3655簬f{{;FkSn73Q (
+ʯ~C4ikk8ӓ	fvYI8kfN_`ޘ̽I3,kmS~l"F'6IX``K`[Ϟ ÈX,}sO22f`0Nn?sr9|zhdnhh 
NtOe=kQ~l	#]A 5[c |NHÇ)Xggd>XǫW8Ng)RI'BZPN,MJ%y"qhh{lA5x>Lq܄)$d/'ѷoq#m`Ƒt
+I<\G{Z,ea/ 
+iԬ(404ഁ^]]}\DZY[d&`dNs9Fs0
hR.F=99)AH qAeXZ|К_+LZmPD@YRp.29>Kfz
_'cC$B/eC\޽47˗/ĳXRu27dF$&q³_QI}}	"^\\?~$IF(5I"$ Od(cD7}|Cq6TFPg{-e9aڅNe韊_̓n<$ڣA?:p
Bݐo`F$BM"h0z t|qJ,!LPġji⪥b4Mold1kع'Eu"|'N	@fOwRNq *,KlEU	*gX[,̬*'W<IsHbC*_6DP1^^~ۗHJH$	Oɽ)"=+"yjo~~8~||\vlX5w9*g(En]pBaF	ÛTD(d2ԉfQTrL
+B*B$O$2''H.J::b2!H@@;JC<e[OFx;<E:+'}̈;D(Ƃ>;f@8$hv|\o
ɚLDĢz/N?vTק9"~lk<tR{D0KhI^{0J'#xr׿]OHϟ3	$Bǥ7sggwzz @$imxS?>?;;^/Z¥xHXfuuM:U{7\ygHIe
B0(mdLXN6zEU_(f!كWmXP(8lu+5-L {3=x~1bEC,F#$<}n_8,k(䬓fkjx{`N.	bJ{IkOtW>.¿0=mNMZMZ~ߨWKgO[6ߺ$zn }!yďXG 6)Eٓ    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/images/crystal/default.png 2.5.src/wp-includes/images/crystal/default.png
--- 2.2.2.src/wp-includes/images/crystal/default.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/images/crystal/default.png	2008-02-29 00:49:05.000000000 -0600
@@ -0,0 +1,5 @@
+PNG
+
+   
IHDR   .   <      tEXtSoftware Adobe ImageReadyqe<   IDATxęQ E+:ggt]CW৶ZޣCHE4F)8(-bu3zS0nyj_MTL`ڑx7ȃL+9GSiL04zCa9rh\'uOPit~4̕Ә4R@)Iq:-ةf(霋9yP2x̕4^ÊYoL3RS<n~nEaIDM1N)4FtHNK\&f3ٽmO*We
+ji] hܨ8Ш@6WǁČ
+:u
Տt{Sf|l	sNP|Etۦ9Abw?ԗ<+g"OR*H
[/MP4D+I~zET̔UXirs۞4{z)+T44yזCQdj|^z.*$\M/y?  ɯ\    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/images/crystal/document.png 2.5.src/wp-includes/images/crystal/document.png
--- 2.2.2.src/wp-includes/images/crystal/document.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/images/crystal/document.png	2008-02-29 00:49:05.000000000 -0600
@@ -0,0 +1,14 @@
+PNG
+
+   
IHDR   .   <      tEXtSoftware Adobe ImageReadyqe<  IDATxڼYokK.)ޒ(:X"v
H !-Ї>?C
+p^Z-PqZʶJ6rЛ.]rCpf8},vZ>u4!8ncvs;Ƹj4Ϟ=dYxU¿iG*?薄[[<+lClpGy:4dcqD7fPNn@4^(o\S	j|
QeI^YYyj/WR!u.333[ZMx?}7@9Omo?p4A%zi>
+멪ȃrn?^ ޙ6J)[)Ucm>lVWW=&#ɓ'=*.\NcHf8VN)=j|JY_q{ciA<38y3f::-Z1B)`@Ǩd RRLƈe2kb$j0	br"*0;$)wmUH f3`?%"@4CŁ:Ӑ& R2Ami$GxЌd!
+ ^V
+  B@fJ$t9^.̠
D0-Xj,"FjչQH1O Sx)hS.APY䊃ĉun
P&Q1!ܼEˀNj4̰E.#:Љ  !V_z[d2OGH
+_]ǍݫvzJ{ B9MHrSӑ A)@X[q(H
+@6pT<_~tocE7K;߿KKaXa>ݣ?j&O"a
+rM[_Z|W͖XfZFRBQSqmww}ܾY0=+MzGV7UO⯠b衭=,_0>K3
+I(0ZQDd@?^Dɉ|Tl*nml{,ř-i6m}cTRi(Qdѭnl9-	&v	(6ppG(dB b
my);9WxP{騥<?z'Z,EE1Hҡ:"Rd^jہA a!Kt{=xV_AKTvZ֠޹3Z0MT=YƐǒ(sXD" F'sk[~E/W3P o;;pkPDDu6F4O-&+秫ܜ݆b[,f?B,L7~w}ޞC[NU?r{0˵Js&'ڗ[1[wW@0܈֋rt>hB >r꥕Ko?}#l2V+g't!#9ny)E@.NAOW0n_`szh<~ھ`OWRq,q]/,y񒨺F1diBPio:
2<b1`7~LJwaf 6,]itLJIOѬ~ry)YwO
+n=,ZH4v̻}[=mwY IJyr?ށJRWHH 5iijS=1{f;Qo8-}Ņhm;rŒc1ň蚙0AKY@eR8I"߷!aK)߹UVӿ^wA5?Wxro;Yy#j1BP!=;;;h
^a{!Eo||XB9H[ hMyB+qerrr0IIIwvAhFpŹK
7k5jV
+x/<|w*rppH[#9sf1&	!9qAc_a{۷}Ux
+≭}vS\r(o(ݣlv</Ni).^5I{-y?
名޶_ycAf5rx$0#_}E\[[+N^$oe >d     IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/images/crystal/interactive.png 2.5.src/wp-includes/images/crystal/interactive.png
--- 2.2.2.src/wp-includes/images/crystal/interactive.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/images/crystal/interactive.png	2008-02-29 00:49:05.000000000 -0600
@@ -0,0 +1,11 @@
+PNG
+
+   
IHDR   .   <      tEXtSoftware Adobe ImageReadyqe<  
+IDATxڼY[lW>śMb7nn4@@"*G;	D/-RM< !< U
4}	B +TUi4Mbw̹d]n33|ϟjs1F݌1lFl2)ѣG]zְWJyw9p*=c7CnFfKjMvf2p&sȈg͠q4vCr=5hPF}d~X4ۀ8MĆ\|MFdFSr{hr~Y"[=N٧(=滣~Q;~!Rk8M\B ad.5
}JMaڃ!8pR1wrrary3?3w*ų eă+.E+\[MOpiNb7w:Гtɻ<QH%\ZK$R0ŋSy.BiɹwS
bDkp.IdB荷޼% rtSA۞  bǧ{,;Mzo6)SchXI$~EV7Z)0ܣ0-HRD1	6Տ>t|nnN#(YW
-z8HIkMpk\\n6a1# ^cKD@=
+(͕
+\9ym9c_8f/fz|ϮjZUwēJR|V[Z}uyFkzcjkCONjq\&A
ֳs0TЖEM:y
+]de:k5ROSD?A1J-}:A08OB(c{ј+9o?3%5ܢATg	`j}5yܟ-!B8įF.;ᔷ[.S dV&줼P6`?r(rH 4{GtSy@$ؽR.ȸ0FWQcm׿թ~l}$Wf*D;ZIa5R_~	Ob.\IuEH{8~o(2SVvUwPzZ\{vրi4%\4K+)haϞ}@&Y-.[jzlhfBT%JE1֑<TWNӠdOHzE%uU_ڏ~)E]D9J~1rK{,%yVVKˍ )}Ks3%u` 
]8p'vZ}wg%jɩF;!+EP7X!ls{ZTwɍI/.)W\K sXIBݶ.,4 cMZ'5ߙ2d-&""BN8E	`2rGqhA,ĝ"i	0IUp:+Ӳ0s
d.U;Q^!aSGٍ&:$h0Ctw"p^X,QeJȞf$8%p7e8_}u@`(@]A%pTccb3J[F[%Ҁm1Q%7l!)._#<m;C=7BσB"?zŅBf&P%l,]}5֎DO\m% u$:Z
+ jRuI._SSLe"	$-Ij$D#L	PZE`@.ztE[
t}n(0zÊv<mdPk)73H;9M:	upu!S 4 GDh*Ei<F [d@=(:#(CshvϞY\XTgBa1
+Nr_d2\Dve;9^R߷Z<4
+B#GjABC?	O<=H=- T1"2ɐW8+s9荢z_(aYP+x-i`zxI- LQ0l}n'b(ile	a@"N²DȶPpM/JKv27];At\C60D TR>mT6	5ljt$YncahpGՎn#~ijD	nRS1[yyի`=Svu@Ȩt8
-2Z/{Q+`Q`,T+>X!
+'dwḻː<&bi+7vPrRYX?~kk	?pIWD efd}ǏbP۪uڎFZ[sg.h*$%0ŊP#}!mAUP3J Æyf.{ o<t^rSo` @@ۋm-k.pE[@,tZ)~\H}0Qm>,䅛l~㾗x:6ޞl?4r]@6nD-"m4[ǽ9h36^6ȈwG֩X{t#۟W}_2xhK#ocw[2|h ,?E4X    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/images/crystal/license.txt 2.5.src/wp-includes/images/crystal/license.txt
--- 2.2.2.src/wp-includes/images/crystal/license.txt	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/images/crystal/license.txt	2008-03-02 15:34:25.000000000 -0600
@@ -0,0 +1,9 @@
+Crystal Project Icons
+by Everaldo Coelho
+http://everaldo.com
+
+Released under LGPL
+
+Modified February 2008
+for WordPress
+http://wordpress.org
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/images/crystal/spreadsheet.png 2.5.src/wp-includes/images/crystal/spreadsheet.png
--- 2.2.2.src/wp-includes/images/crystal/spreadsheet.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/images/crystal/spreadsheet.png	2008-02-29 00:49:05.000000000 -0600
@@ -0,0 +1,15 @@
+PNG
+
+   
IHDR   .   <      tEXtSoftware Adobe ImageReadyqe<  
+GIDATxڼYoTsƊI)[@IU&PC^"!EQR\!)OR%DSUhQ(rq0mxs;e]/hu49}2sSNIj4AJy|6$I|^m{pp.'OL+L2{<ߡ_18nRd}Q}6F0U5^Cy
+V{
aZ}]x`\7|F[l)kBY}TU,T*&,G$Y&DD"\.0(o},(---mmmETHcҘ!Df F
+dPgrވT!d
+#1&(s#_f,\9hZ
+J	I(b/d9(Ub"g!ҥKDӴJ󍜬4ƂTu떏QC\`ūȰ7wEss3S/7nZ2z+Q2
V0kBR߰NQkiisB:p^:^US|,V֣-	{^ϸ.UOC|PiuxMg޴iBwC )?s||兀ىׯ_>J:XH!/P<X|(_yg4.CifpЙHqX,2"W ChR@Ҙb>pUVjHj:3|EX	P&&&)m\m}`^'g %R>qԢHhw
+1PUZ"^-4(t=HHᰨ(A[*wf A]Tke4?RUPt=\ssρg< Dc<}`o»wv{
B&	#!JP5֯_ m|yfC\a{$:T|#?gRA)
+I~8"(fRcCr3PU~/D[a=B$eあmvn!_s-~յ
T$xg\0vCУq$WӚ׳s7FOlNyy*l]T7,߻w͟bQ- &V>(3'yyǖ%2w2oz̴2<<H$XsT5tj8!
+=ﶭͦ%0\OptIƼw!}|M{%;ĠXFc]2Xeו
C*lVď=9_3bNЋٖZc;[xef]03cu#J;%"XVo_WclK4تi4YP-c>g{D٣TQ49	>8Zt{Op=K5fnε%^nF ׭[{M]===d);w*<"&С_|Wx(`j*0\t
p,((qS G`n;Zi	hKda+o($~O?՗DB_[X˸{EP
+F,5-(>\e;R}dUDa/ߕ/OW;Ӻx^3riu(T4wf_--hqT<Egnjs9L^Mv$zWx{֐W#7Y!bm"	--ɤq8\.RSD"	bDt>'sjԜD8#nCypp-t0*zd'
+W0ZMGBnܗkɞOEۛ7ޔہ)DaTqHt
$.[Kٵ`µpDQȬH<R&CJ+Iuş_M^xɷmsíC{{oJ8MI@Pe]RWxm{-$Ĵjˉ$Jug۞'-X:U4F=>UHB!W) Q
+%؂j;v4pS'4FwTsȫ/	E=vl{Xqq\Z:T8W"IL=egrkYΡ7_W(Ayo>6lltۗݶ/s뵩^\QF$%8絇Kڄu{{7݈-3|<COY	avձ7;gcb\$r(v<m7֦lW|:U+
zj(|ƍ2b&Md5WoooGG}>a̙3#ŶwH0";%|>9dPpGUQuUS}N+8)z.TG,I夕ie՞WV
+3-ve{g|YlD)}$sr୧ZGV7W^Ebq<Ï@ )jIr    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/images/crystal/text.png 2.5.src/wp-includes/images/crystal/text.png
--- 2.2.2.src/wp-includes/images/crystal/text.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/images/crystal/text.png	2008-02-29 00:49:05.000000000 -0600
@@ -0,0 +1,6 @@
+PNG
+
+   
IHDR   .   <      tEXtSoftware Adobe ImageReadyqe<  IDATxڼYَ0J !MBl_K|/35gs2y$MO'e׻n_EWhy^jP)J1It>a!Lǣ\./B6P!oT-^y6֟7V؈\8YĎѐ$hJht;pOТf\.H7f30m$hMߗD<뛪qLMgt:!d׻8lSϦbpz߅N|PHgaaj;E~4Af݂a	Жv%i-!
+3,TnJR0@)`aV(WaAQU̍FCHIh%7``+ye.}r4`Ff7/t׻"*6
P\i6a*fUmwmNImv:<Vh	zqCC͟FqPN6ovyi6N=
+ж)[03èSRb$5Gm%(j0⊞Aжp[u~VMHá.eT(.z0{t/QI
Eʑ};ȶ- J%O&[uhk{gS'c$LtKfL-VC
R87hqc#h`0{D@[v'UgȠl'U["}Z%amrp8dݒ	f4YوF$:Lm%B-f bA *if]j9dh|!ەVI8L
+ nW?'WBY1ѧϬb%=-R\`T*,ޕi,ZV&)g< ܣ+    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/images/crystal/video.png 2.5.src/wp-includes/images/crystal/video.png
--- 2.2.2.src/wp-includes/images/crystal/video.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/images/crystal/video.png	2008-02-29 00:49:05.000000000 -0600
@@ -0,0 +1,12 @@
+PNG
+
+   
IHDR   .   <      tEXtSoftware Adobe ImageReadyqe<  IDATxڴGhUKS313FžPDEc".Dl+EPB (.\bŅ[Ĉ{/}޼-f?_LfUUջw2/YYY
6ϟ36fgg塯&?iРANNΏ?4id~sss
+
+֮]͛ܻwÇO<y)׭[2s$lr֭/__z5sLhA\7oߣG.|-'OX~}%r:?>J/_|g^x88p Eˏ:իeijUZn}Abc({----,,qF$`z\v_~ ;.2rqq144U^۳gP JӦMyoԨS~;v<zÇG
᳨cmp0?Ǝ+{ׯP 	
@Yf<1cǏQRYYyƍwΝ;WaHc=zT=ZZxk׎q:/5J<<,`Ȑ!L}(w͛7?NT#.μY۷o7o\	#,XQ`,LwرcǏo۶-JCϟ%Q%Y!Vv0
]x߿X#8`dou
FRʰJƍEaÆŰ*KgP^H6RwӦMYyѣ'M<;LI\oذO#D"'N4K.߿F(`e5ݹs'"HSNuEVPS=z2_^^NWӧ+~։D
+y0d(Tplܸ(HeTVU0ؽ{
+Lvʕ+5@(ŋE+'j
+N%)ڻvRCq/_.8@o߾0
+ɓ-w!֭[RI۷Ϛ5KNQӁݻcp Ob0ի.A*ʸ	&(P0s
K@&"Nu3 o&eYqQ0N2a'NhW@ǅ 2iݲe+B1)F 3d:_6 (L	( "msZ,f۶m8 tΝ@,u)sŊVLD7KxXM_yPʆmA݊ZxQbf3M'Dљe^(˕ԨX	tF%ڵ{]$U}
6K˸Z(܉oLQqSKdu8lz
7z1`-7&*l-ˑXJEsH8Hh5P#jM)*[V)aQKr
+XLYhDJd#G@*0Ccq7%]veAێ?c0X{24nMJ:*iSl:E2gΜa6pz>A
ܱcy#9qV"ؼ<{;+ŀƾ})هd;kĀƊAHpĈPUUU8FJti	_xӦM4h:{,'Nx$_IX>.;	DRj"]'ҞEDGPj[M)օl/,,<A q֧H݋F1wO&>^ƌC 틋rnW]ʻiӦ͜9s LƺPo*++5N`hƒ&?App?WTTnMXte/S.++$̐D
gCL(
+%Qi\--fcV6"_&>\j[[-M&5RJKK>*m(/Kh4aqŋ	)z)-L\3$dܿK؎Cp*kZGJӼΓ՗FN45SJk
+ܹsnX2Y25:8t
Y^^Np"^=l"մuHcaUdeЛ5^^NNez]Gaz2A[&x$fǔY^b9xFKMnVIM)i&Jg2qSIyd($Cq_/-4Rokc%">&"9{W(PƁycEEEŁ.Wh{49R-Z[ }J    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/images/css.png 2.5.src/wp-includes/images/css.png
--- 2.2.2.src/wp-includes/images/css.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/images/css.png	2008-02-21 23:53:47.000000000 -0600
@@ -0,0 +1,5 @@
+PNG
+
+   
IHDR           D   tEXtSoftware Adobe ImageReadyqe<   `PLTEeeeꦦؐ洴zzz9  KIDATxlْ @Qqa1_N}:EC*YTv], cfmbT
+Ť5}8QHZ3VN)zԑ'h 0/f|Kr4Ǻ3;bRcVW}o.LQb|Z9 UUQRжmQ+ f17c D 8鿄 M)\aeߊI
+fBȱ1h K6S0x0໑S>u4l(=Wk.;8զm(.~}ot' \`ū    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/images/default.png 2.5.src/wp-includes/images/default.png
--- 2.2.2.src/wp-includes/images/default.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/images/default.png	2008-02-21 23:53:47.000000000 -0600
@@ -0,0 +1,3 @@
+PNG
+
+   
IHDR           D   tEXtSoftware Adobe ImageReadyqe<   `PLTEeeeꦦ洴zzz]  IDATxl aRƐ
8E>ϊl 	*I?P:0h!PR,bk9$`̍0"Ak -#Q$d̉AZqFQNg >@])g b]pΗe	F@]:XkDbB=c?ؑ92m:4!1@67&	7(%GMsK4xҧ,"]@~>[2, Q;    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/images/doc.png 2.5.src/wp-includes/images/doc.png
--- 2.2.2.src/wp-includes/images/doc.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/images/doc.png	2008-02-21 23:53:47.000000000 -0600
@@ -0,0 +1,9 @@
+PNG
+
+   
IHDR           D   tEXtSoftware Adobe ImageReadyqe<  PLTE   b۵5V


4ͥSY人ܤXYa.񵵵ޯPTDeQ옙9i䦼R#;ŃHֶiiiݳM✪
4棾M2־9kɠYssrלuX栺eMVhҼ`n@rVؼңxbbbÌRO抱|
  IDATxb`R**@, 4:`g_?\6OCAFo_{;<5#<#qϛ+s\SSb@Uh^34T]]FX(q>O_<7Cfa;£txeDdM)9;
'>ފd5.A^9rA閖vv"]\;/41	_чOC$7O4g6a/aCN\K:ΨJXu\%!؈P s\ωn;W	 )`fӗzu?FP$X'BImjO
MXp3)=@XN9
+yؖK^J>H
+Ĺst2QDQ*'/`"@OGEm{lHR3~DMaaΣb`@6k^]fTс<<%K8WǍj}uEm~\
+X854
+54$"KkPDV,b]rC")e,
+Xr&T9	q=@SUX&dGb
+p B   IO    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/images/exe.png 2.5.src/wp-includes/images/exe.png
--- 2.2.2.src/wp-includes/images/exe.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/images/exe.png	2008-02-21 23:53:47.000000000 -0600
@@ -0,0 +1,5 @@
+PNG
+
+   
IHDR              IDATHQ
+1D%'G,YИBRP*fm2@UwD'	^c1
+) VUߏݍo|<NFgj֚ۛ$ 	H 0E:fP< | T{8P(V=    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/images/html.png 2.5.src/wp-includes/images/html.png
--- 2.2.2.src/wp-includes/images/html.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/images/html.png	2008-02-21 23:53:47.000000000 -0600
@@ -0,0 +1,4 @@
+PNG
+
+   
IHDR           D   tEXtSoftware Adobe ImageReadyqe<   `PLTEeeeɐԦشzzz2
  OIDATxl۶E aCk-,,t0egeSe-RjNa<JS[ "/L}&ۛ+h۶HTg<H ́&|s!7	eC^ }C)8lDsqOSm,wARSTQM(-nNm[?Z9T
d9B@} m%;4
+@zkGa7 1֒$hj䐀J">@a `7PZp)eO`p%+yiE/O ήƓ)    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/images/js.png 2.5.src/wp-includes/images/js.png
--- 2.2.2.src/wp-includes/images/js.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/images/js.png	2008-02-21 23:53:47.000000000 -0600
@@ -0,0 +1,4 @@
+PNG
+
+   
IHDR           D   tEXtSoftware Adobe ImageReadyqe<   `PLTEeeeæΐ洴zzz\u  ;IDATxlY @QGBDH$x,X36Wk+Z0-DZྰf5Fδ kA۶9"ω/ƵڭQ(G_`\}io?@[)' Q!bBem=wM@۶91'Z_D~@N	躮X}E$f$`RoBH<MOzD8eRsMI
+`g3\<Q~҃SqÆsATPJU8{wj?pO].gȃt$,_ş  y    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/images/pdf.png 2.5.src/wp-includes/images/pdf.png
--- 2.2.2.src/wp-includes/images/pdf.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/images/pdf.png	2008-02-21 23:53:47.000000000 -0600
@@ -0,0 +1,11 @@
+PNG
+
+   
IHDR           D   tEXtSoftware Adobe ImageReadyqe<  PLTE     ll  OO    {  q  w  DD}  ||??22>>		  ]]::  ;;  ~    ////e  44i  77\\倀jjNNKK2255BBff  OOO]]z    mmoo555l  TTT  99  

MMBBpp페    !!s  jj}}::		  qq++..    }}y  o  t  n  ﶶMMMGGGGGGxx쉉FF(([[[˨  NNoo@@@!!  ///    %%==  mmNN**  ww!!NN{{""^^  |        ??""&&OOӂ""FF  ɯ99Pa  )IDATxb`6d̀	X9ŕd
+A'Y[[EG͝J37NML)Q+Vޗǉ&Ɨ?yA J;V]sMQyxڗ|F8t^zz~E'nw.OЄEt\ V`z3yx#Y!A
+jn_K4.~j9m
+~%"VM2R?ZZ>k[,tV$%m\䄅\l$;;MO"Aj	k̕**W)%%{f` /
+6|Tۮ)ǌ\LLW;899DP02AX!?8??!,ax		U;;7H/&8@Q
+@5i0yvT\\\N8 W580-x+a%U׋'qO
X196qhP'}tcDh
+aq$
+$Q
+` @ jȕJ    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/images/swf.png 2.5.src/wp-includes/images/swf.png
--- 2.2.2.src/wp-includes/images/swf.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/images/swf.png	2008-02-21 23:53:47.000000000 -0600
@@ -0,0 +1,9 @@
+PNG
+
+   
IHDR           D   tEXtSoftware Adobe ImageReadyqe<  PLTE   <<<999󵵵;;;FScpppIVf===nnn·νђN^pjjjVg{^ivP\jGUe[mJXjtzq>>>YjasSdwlSbv\fsCQ`hr~ˡgzewۚݠXj~dnzP_rv:::|LXgoi}YdriqznmyɫŉQbu{{{cccXh{MZh^pճr̹X_iWWWxK[njy~{y}stttk~̈Wcq۹󯳷btcvVh{]oضXcq]]]bjtRbu


~gggXfx󣭺xQauk액x#  IDATxb` ɟz@`iizςPcq\8
+FV `08V..E+Fp
+Fn0 b +oR\,QhlÄUO*LJNJ	ɥռ T4D޸dMf0* / &Ff	M^QQ/Tc+БX\r9cc	\:UϿцP")qՙf}:>!19LBo
+t}t31ݐ}ARx@ueez?TdecC(VoRzyjg06>#Z
Ub'sr")^WۃNjsoAr[a	@Ij7hJ`QP5͹5)YVP2cDH
+X{b攞`Mcy"RdH_rXeT3~O;'i$B,r>yVRXNa~$\BB,ޛ/fer4;QQ&Ovo77;d(͏.& ubi=a.???0&kwh,]ΎE+ 
+&Q :ŐQyq ff\  t
+    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/images/tar.png 2.5.src/wp-includes/images/tar.png
--- 2.2.2.src/wp-includes/images/tar.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/images/tar.png	2008-02-21 23:53:47.000000000 -0600
@@ -0,0 +1,5 @@
+PNG
+
+   
IHDR           D   tEXtSoftware Adobe ImageReadyqe<  PLTE   mmm$$$+++WWWyyyࢢձ◗bbb;;;Ϛل111KKKəႂ{{{999ooo!!!ď򣣣-0-̆___qqq䬬...ccc;;9rrrQQQtttaaa|||---[[[ppp赵lllkkkTTT:::<<<&&&///≉F+  zIDATxtus@-[qO\ݽWﹻ	4s;o^ О\`ъgIsɘmm[T׮R GHhoL}VN|]^ hJOyNx3T+ѳD>	c91
+y㛶{n55^[ F8QiA2m汁&,czWtCS:x	,A
ݙ`ggå;LJpNݗITw/2_rQsᤏ|لH߯QZ$o(s~|3yP,@E$|_s]d,G}gMPĺwWGhBsQMGKL2)X:sGeɏA[ <<#YAE+f3N,˳ G   09S,t8S ^@=8Rܫ`'9BN($qPSQs&=n^s<}p 
+<[n	AX*փ Xϲk?b*RVL2¬ſYM<jSm8Y EtH-^?@HRTN80w ́̓{*߯?` j^    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/images/text.png 2.5.src/wp-includes/images/text.png
--- 2.2.2.src/wp-includes/images/text.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/images/text.png	2008-02-21 23:53:47.000000000 -0600
@@ -0,0 +1,3 @@
+PNG
+
+   
IHDR           D   tEXtSoftware Adobe ImageReadyqe<  PLTE   Ұ000ͽϹ///Ş]]]ǣklkYYYЏM6*...ں--.D-&ДOKFRL6馦,,-```UUU}}}㴴ý111䓓g^T'#T@2XD5x-#,+*ba??C;73Ǜ|===h\Zͼ{pǾFB?2OQ2vndQQQKXn茶7:;MK?ؚ̂*&NH'Q ID0[VL񳰰࠺ף̾ﵑ}҄}gڛĆNSWt<嵗ѽ***m`YŭϚmm\3.$vypߑZUZHAɿcqr$$$~̿n6䤙dNk] ~l	osglUIRCŐ,,ź@E1PV?sj  IDATxڄcpca${6im6Mm۶Vk۶m۶m۶53۝dfg<7 4\T; B ,1z^Vbߺ/ 07^tL{gڒR0_lJai^pSEmEw͖k sFrT;XY F`l9ѝv	^Ubip.8j`eWO&@`40XA*ѿGe6Nx	(%<CL#P@UL[t0	0H1<Rc	B̀E$@չIdQbZ&3
d&TY),.f !Kp_tbz_2`jB쇗6[j-h8|iYYx@@@mUV5`!
Z9ޚ#^+H<"=8e긁V<O!ǭ	mpv^23 &?>/{$2` ʤ3kc+G\IMaBm_4@:DtF!8O	Ƥur9
~y;N<Q-(4GJ
y:Nx5F%]u?& 	mQ"iP +z
9P8#` H({    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/images/video.png 2.5.src/wp-includes/images/video.png
--- 2.2.2.src/wp-includes/images/video.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/images/video.png	2008-02-21 23:53:47.000000000 -0600
@@ -0,0 +1,4 @@
+PNG
+
+   
IHDR           D   tEXtSoftware Adobe ImageReadyqe<   `PLTETTT싌-6hqtw$Jx5PRUsb螵  IDATx|r E##c|wҞ4N~ވ_ `FW yN
+ƼPZiRRZVxC%$26x_yR S?s !SSyC
b,M麧שT,ܹsO5u'f1"DDނ1T!ƨToIXށS<X1L+Z;2'uA+jӴ1}l(l\*͖̏BQ4<y\7[AչZX
h=	V` gEONJ]
qT2  IJIA!\.	}}"iH,3Ar)qJP3Pju$6P'B/%_ / $IJ    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/images/wlw/wp-comments.png 2.5.src/wp-includes/images/wlw/wp-comments.png
--- 2.2.2.src/wp-includes/images/wlw/wp-comments.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/images/wlw/wp-comments.png	2007-10-08 15:21:29.000000000 -0500
@@ -0,0 +1,11 @@
+PNG
+
+   
IHDR         w=   gAMA  7   tEXtSoftware Adobe ImageReadyqe<  4IDATxڴVoEfw~q[N$5}p(RD% +\s?
+J
+VV"RhpMC";ib;~kwgff=N@p if'~cC<σo P#pyT#B\uyg"Hcۆȫo-(H\zRi<)Qg" ҵܣ_:ub>QΔ;:(lv6wugG>A,H$MqնjCтZN8d25hR"'O|rCOLAzO u4U <K)؎mˆZK럼ąD"QIӖp
+w?~`0dR?0Pt܋hAba@ \V[ݱBMVFh~~huc#/gqPr^Q\1`,A.;87wŕƙɊ~~˙̮g	
+iA*s	0C0<j}멟^IDUE^6LAǰ	
+)
+RI{{q."sH0$䓉8{ZE?G|1LLd}:TIwPW:"B& Q1qz{.JQ9aTď(Be>EK2
+Bimֵ^s˦/T
+ҭ"iJ2`dn
WbEB~jDTPO|&X\eޚ-8yVLѭ!<"tZ'VGJΈ&k6ujgJ
)ULE/!yRs^zq{Ǐw-mϥ;]'6]B%/ƲUz4aV6?&72ў_Myy-jЭJe
 x9uwpًg#ҢPV7b22:'F"إ{oqCLT
ku[!\X\E65={iT|8Bf`7
t44pz.2DцDm7!3M]J6T-U:qnR)kҥK:i_\Ḫ*ٵMv:T~c4Mv0t9ױ)vm˲ʍRd_vnrG&ti
(\GF2qs4@0N_pG6MgAJ؟"r9/6heY:99hY$LMMؓ_w u(0    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/images/wlw/wp-icon.png 2.5.src/wp-includes/images/wlw/wp-icon.png
--- 2.2.2.src/wp-includes/images/wlw/wp-icon.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/images/wlw/wp-icon.png	2007-10-08 15:21:29.000000000 -0500
@@ -0,0 +1,6 @@
+PNG
+
+   
IHDR         a   gAMA  7   tEXtSoftware Adobe ImageReadyqe<  IDATxlSkQ~5ulh56RSmKZ6ui?~zPXB1_|GlSApoSf6teEs?Ϲs;<C^?,}R,X|xdtDݷtj4E@pnT]8ߡh0OR
+a|¢sbE}xv|Sݭ4#ΐD&17$N#O4MI]N:7z=ep=`;0CgccPYSSSCCC,j5%+1g+@"DL@P(0++++S$u< 1|`$rX@ L&J]]F,ccZJ_s/
+RXH#[3{kk_	=.Jsx<N(]d{{W_ȹbw>hu9޷h#R!fss=~@T]})(.$x4#C
H[j*Op8oA2`:|d<bi\Krc,:nk4-? 
`J%LϘc73)EDQvy1]1/,1jyv~U4
+
# 4m/b    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/images/wlw/wp-watermark.png 2.5.src/wp-includes/images/wlw/wp-watermark.png
--- 2.2.2.src/wp-includes/images/wlw/wp-watermark.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/images/wlw/wp-watermark.png	2007-10-08 15:21:29.000000000 -0500
@@ -0,0 +1,34 @@
+PNG
+
+   
IHDR   T   T   k   gAMA  7   tEXtSoftware Adobe ImageReadyqe<  IDATxdUL]P$AE+HT"P cB2Hň J̢b V]g,ZRWսo~'ܷCk]kIk	joqH555Uu:hT,&''nWm?ˇ]s[o馛osíVgٙ~w&&&:nig-yЃ`
3+1?Q{f|hghh|VZo&v̢!Uw
ǂ~{?w>{o _hЎ
}sjmyۏzԣ b۹͆>	k[L
܃63\8pW_=tmBVwݪ>e=Q=(K2?~OSl2nmf|+>@y1ON{^erY $}CԸя~4zW^ve[nPMCxD[=_釅I}@ >ַgՏFs^s{ъ[W%qR˘]gu݈}_ёOxw߽|C@8rٲe
}K_lnN˶!8RPTJ_e3{-Z4a#nK29v;j(8rؒ%Ka\J޻UOzғ
+w jAN7\ƷӞy?	3l(wSz_n]wmvaScܐ
+AEsLNaLg]mF>ώ?O:*qF
ϲKV?Oo7YXڨ6pB-آ|ͫГju-ch}C9St-gOo_3Xj9{y{yJ<B7Y~pSNixWO`1_]qgs3qQ{]-^zcS/ni`b.HT9$c^1?Wr u]]zׂ}k w\[UXcXx/6{=.Հ"/7ٞg(e_׫c9
+'{챓xdjLEP@\"!뱣ͫjG9_jmӟCѣ^xaO|V$!dǑ\ߘ̄;1H	Yt_uY_C=tro'\~Abe &D"-Eի^"vp#` 	Yr|O#\&3߽ګz_\ԁ*de_+T26nQ!GA'N/}K7ӆwT_~yuq?cSS]gSM\
aC)O}S[(k]pvvUQ]ᏈsݔbךG=裏.FA=j +Zxe oc]󽺘wu*fN(u,[2@Ù[ouApfb8tk
+m4A!Bb-Dg".ox
+
+~z!/a~moJJQBu/p즛nZp
2C҈
xnvP >t9qAvs$/8#Py2a:E߼oN<D2C2s+@3KL% b7v}CRWmmnꤓN*;pX0T{pm9u(:Ew"E/ZhqugegA|y9Sr,!Fk4̪ɱFp";΂B (\3̀X|S>2X&P5fOi12|)tE~$&21p|ݯcpG?2ˀX.ãAQιe2F@Lt<|+^Q10Rq'p82R׷j3b$FP
&Ehh171h)%XHz;%up=^W.%߈72x&ր{=v[ǲ$(`;7~y獱[Xtĝ{83Wo}sܯkG:[t]V%d8r}n%0p)oak_n,ոi䫎Rn{c%
+ sALp'<+s
~/!|.n ^cgFc-*	ԍEvznBD/yKscrKCU(S,C\sXX&΀(A6۬&ڲ	$d7h"R\^|, ڰ`7F{r&v{0>ťEHJ3ozMg.땯|eկ~OI
nfȯDPX@X%K}tA1_qLh# ϐv!}x%xA;K[ǷVW*5"H0̼믿"lybX,ja//46llŭmE}L ܰ$PІ}Dd.ab:T:2X]vY	RFwԍ@DP֪Pof=i3q珊JS?(
+&Ȼ0U7a7	wQKgAB/UoqPq`?8L؄pg&o&lP
+4s2.
R94n!GEpo}-t
I69	j-5z%4錀-:K%lOjy7?yY8S-2Ҳ ;鈴sLރcYmaxmϲFaQGuI~{x}	j 6+@0&O~pbd6s
l+X\Ȍ%4U8&䰝vکY:d'SN)*B.gW
g	+pFD2	ڍM6ひ}hp$mvZu饗bGDfzr>9'Gme\TjH.{˦`<	1IK7}<kU
+eܼkЏt 	6/rX/֘$-QrP${-4lM3.f~~1PE=(3u@>W }K_*gPϡ930(#@
+Q&a ]~Q
+2=}Sҳ.</9?M@Pu^V97UHبft]Zpt/ke3ꪑU
++-e>#n
d q9(rT/{*N8~A E&Em<S8T'nN0?P}U@`2Ch34nT
+#LKL|P[
$YV8[Wif@վZϯ]ZJረP2 5 1/~@n
+hq	fq$X„EQzRUCľ>;+_J4-qjgĄOAzN;qeRٹ"/ VOā!JѦ97|0!t`y1
beqeTO7#ϻ|Xӊ}8Tq0.ͱ~g#k A
+4Jq@zDH1p8(lYN&0VME
d&hsեZt-z}xH__H2JR:XÚa[{' 61YG>Y
	 
+
+@\MsT$9|3Y'3LzPHI  ZΪyHfݯIM'iE ~o6M>g[%9uԍ#:VM@݆*9T"ZT/MB0~]@
A3tHBI,z	 	q\ 4t
>WtFzS2-+^^FƜuZ#Li]X=CYh6){F+gDśxEnƛ}:4e=DoCE	MaLY^Wl(ꙶ5b_Ίhcmژ]hrMFUR-Ct6#Fe''&E4\iѣ͆I3MJ`C%HI1
;>]i#@H=meCM91	7M_XkD4J|ŝ %ȡz3rKֽd^I1_tXZ!W^yeQp;(ʮ \utHd#cxNnNj@*"@W)]Dÿ-t`,nN3V[λ	
+5v6DBrO}S˿!gQ4W5z,\#cMHUلn^L4sYZ4v@`.ssGu`āVLH,$M![zU0΀D0q$BĜ2Lgg &S0?)Ky qMaG$(g'1|W(k8WI^s5e t3p{u="-X_.3丁Xz_iR1`HY,˭WD>t@.t@~rXHD_8g-[ab@w1ٴ#
+FCbG\ӚF!/y_	ssbPtDhWCS|T/zZ2?2Y&[`D46Lp8T[)RʹY:<q0'6Rw|`]!	^#2cpv\)Q.l1`ADX"q,Iٍ@AEAuUB f9K8^n&u
̬E>l 6CF<p$~Uteѥ35'O#	Ya⨑l !/ E+d\VѴp
CHm;0;o)N,vڈ5eN	78.V Ԛf/qǢXϵ^swǠ. N}sqi00ܮ:ݭ\=AMq1<S[17 "1밆CZp6~h8dP_77su0FHRC{PL7S1v۵zvo/hYt rX~0101
+V"Ւ#F4ț5v%糌}h~N
+H>Њ
Mi
+l[9px _FA([\Bd0Gi4/qG
+_	}A{ERPFI6J$$ZO%ϷiCE\|ŅMV@Vntq Dhx V`/maLTNEyˌ#A_z au/kL1d,I2zTOiYm1v̳]"ϢcBC9ET-$E3$\r%=aȰuKe3BI`C|"vʭ
n-Tg>󙽊\Y:rg=[Oϳ^b{W+8 [߃_*k8Ν>${ rV wX\LFsH`9bhe,̼t7=œ
@"Z0}L!b
+g}.[\tD7\óp'Ffrk>aJQ!3KWpm}^ؔ-fdpj}mi@v8	K?9.@%op\d4|U`	)oz_gab|;)*mP: "Saɒ%%[!#imz
+xCdFC u{]P" PX*ۜ:[G; }MɐNv8*!>e[Y4\`E{e,Gq
+ݜ=dʥgL6WgK]dBU8T[gL!:!U}xHB@[KEPPt
+\=`4mU}oݤk^!3Q_C;>sKd$,w>'4̴euYfG{XWqU"4xn ́eY膞9餓VxG믰i:#>-5 vEr5TL˛\9ʳV:R#GA.CgB`u< ;׭k\pf[mYg5QkQn9Dg<AMS!UE OK.7ȔR"B$_&Yt{=sӃR^%_.;7dx
D5EIeo&K^\X|Zk/bLhuwp`0@SGy$1;u{Wd0sOx<,"^'NAŮCoY":ZՋ>l!!,`qX8^):'7x㎜uEPvڡs|-$T:>$Bhtኢ
BDA22?l\&8tUCgÁl6i]zx!E~Vzi%.sc(nV"qh_
+A)܁0$E,ua.њFrn]*7Rk^s侞e9ҿe9fBc';3A!>4yxh?,uQғμ^o
=*B S_}p*^aldv\k7}K_WApgwy"&ˉz",Dʉxn"D<3nDXr/&BeLN˳|b{W/A/|\x̉{b&¥/:tXiܤINs}VY㾍Nt8KCgeXNIDIp
kZD<I
+7C:g\΅c~z 
ZxFs9gi%kk<g/;9?0bѸvSEoT܇ z0+!uB.0 ԚF ݚ
+Ohy|OWkZSXW_=i,M9GaB?"f+[pE&5a|	vQDIiz7k_%
t)X ҨQVn=op[ne`McoF3ŋ41_~( M8VxWt<i|`EiXv
+r>6Dp'o[{g+كC9.CPP-ea馛 W\18yQ8 ~ ,5p3~6LB}p3z.Z>tVN ?ye{Fs|xNf믿ɉ~cEs%nZEAi)o&|qh~)d߿Wd&[y`	G7B6o/Icv]SwBegw `X08~[=עkkZ%]? :,vz    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/images/zip.png 2.5.src/wp-includes/images/zip.png
--- 2.2.2.src/wp-includes/images/zip.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/images/zip.png	2008-02-21 23:53:47.000000000 -0600
@@ -0,0 +1,5 @@
+PNG
+
+   
IHDR           D   tEXtSoftware Adobe ImageReadyqe<  PLTE   mmm$$$似+++bbb;;;՗ٖϽᤤWWW!!!{{{999ܨ111KKKooo酅yyy&&&:::ttt;;9عccc[[[䉉-0-lllaaaŧ̟ppp///---rrrҸ<<<___|||...TTTkkk쏏QQQqqqʋގRl  pIDATxtus@-nW9wwwwwww/xK43;󛅅Fd2+zzJUlE]HG!<-m9<v퍧:mH5za[ZG˞"pF:b67Č޶;	\6~_ˆ`qD0qrKY_S
PƭbZح3''_Y`BsUk\?`"@o5Pt.+-<HQ_
+evW:Tڀb:G ͰX
@H$A8V\Y(DZHQolca ,8U"\RqEaYH$J?_eH!*(b+3 q;H2Mzl$'0S 0b6XH'GUdJyR;iD5dQ[h3s!q
+  @'n(ǀr^x% !E'	x,0y@H1A9`x) hj0	s:`/ƿSPˍP,4P Ugw 4    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/autosave.js 2.5.src/wp-includes/js/autosave.js
--- 2.2.2.src/wp-includes/js/autosave.js	2007-03-06 11:35:01.000000000 -0600
+++ 2.5.src/wp-includes/js/autosave.js	2008-03-26 16:00:21.000000000 -0500
@@ -1,158 +1,206 @@
 var autosaveLast = '';
 var autosavePeriodical;
+var autosaveOldMessage = '';
 
-function autosave_start_timer() {
-	var form = $('post');
-	autosaveLast = form.post_title.value+form.content.value;
-	// Keep autosave_interval in sync with edit_post().
-	autosavePeriodical = new PeriodicalExecuter(autosave, autosaveL10n.autosaveInterval);
-	//Disable autosave after the form has been submitted
-	if(form.addEventListener) {
-		form.addEventListener("submit", function () { autosavePeriodical.currentlyExecuting = true; }, false);
-	}
-	if(form.attachEvent) {
-		form.save ? form.save.attachEvent("onclick", function () { autosavePeriodical.currentlyExecuting = true; }) : null;
-		form.submit ? form.submit.attachEvent("onclick", function () { autosavePeriodical.currentlyExecuting = true; }) : null;
-		form.publish ? form.publish.attachEvent("onclick", function () { autosavePeriodical.currentlyExecuting = true; }) : null;
-		form.deletepost ? form.deletepost.attachEvent("onclick", function () { autosavePeriodical.currentlyExecuting = true; }) : null;
-	}
-}
-addLoadEvent(autosave_start_timer)
+jQuery(function($) {
+	autosaveLast = $('#post #title').val()+$('#post #content').val();
+	autosavePeriodical = $.schedule({time: autosaveL10n.autosaveInterval * 1000, func: function() { autosave(); }, repeat: true, protect: true});
 
-function autosave_cur_time() {
-	var now = new Date();
-	return "" + ((now.getHours() >12) ? now.getHours() -12 : now.getHours()) + 
-	((now.getMinutes() < 10) ? ":0" : ":") + now.getMinutes() +
-	((now.getSeconds() < 10) ? ":0" : ":") + now.getSeconds();
-}
+	//Disable autosave after the form has been submitted
+	$("#post").submit(function() { $.cancel(autosavePeriodical); });
+});
 
-function autosave_update_nonce() {
-	var response = nonceAjax.response;
-	document.getElementsByName('_wpnonce')[0].value = response;
+// called when autosaving pre-existing post
+function autosave_saved(response) {
+	var res = wpAjax.parseAjaxResponse(response, 'autosave'); // parse the ajax response
+	var message = '';
+
+	if ( res && res.responses && res.responses.length ) {
+		message = res.responses[0].data; // The saved message or error.
+		// someone else is editing: disable autosave, set errors
+		if ( res.responses[0].supplemental ) {
+			if ( 'disable' == res.responses[0].supplemental['disable_autosave'] ) {
+				autosave = function() {};
+				res = { errors: true };
+			}
+			jQuery.each(res.responses[0].supplemental, function(selector, value) {
+				if ( selector.match(/^replace-/) ) {
+					jQuery('#'+selector.replace('replace-', '')).val(value);
+				}
+			});
+		}
+
+		// if no errors: add preview link and slug UI
+		if ( !res.errors ) {
+			var postID = parseInt( res.responses[0].id );
+			if ( !isNaN(postID) && postID > 0 ) {
+				autosave_update_preview_link(postID);
+				autosave_update_slug(postID);
+			}
+		}
+	}
+	if ( message ) { jQuery('#autosave').html(message); } // update autosave message
+	else if ( autosaveOldMessage && res ) { jQuery('#autosave').html( autosaveOldMessage ); }
+	autosave_enable_buttons(); // re-enable disabled form buttons
+	return res;
+}
+
+// called when autosaving new post
+function autosave_saved_new(response) {
+	var res = autosave_saved(response); // parse the ajax response do the above
+	// if no errors: update post_ID from the temporary value, grab new save-nonce for that new ID
+	if ( res && res.responses.length && !res.errors ) {
+		var tempID = jQuery('#post_ID').val();
+		var postID = parseInt( res.responses[0].id );
+		autosave_update_post_ID( postID );
+		if ( tempID < 0 && postID > 0) // update media buttons
+			jQuery('#media-buttons a').each(function(){
+				this.href = this.href.replace(tempID, postID);
+			});
+	}
 }
 
-function autosave_update_post_ID() {
-	var response = autosaveAjax.response;
-	var res = parseInt(response);
-	var message;
-
-	if(isNaN(res)) {
-		message = autosaveL10n.errorText.replace(/%response%/g, response);
-	} else {
-		message = autosaveL10n.saveText.replace(/%time%/g, autosave_cur_time());
-		$('post_ID').name = "post_ID";
-		$('post_ID').value = res;
+function autosave_update_post_ID( postID ) {
+	if ( !isNaN(postID) && postID > 0 ) {
+		if ( postID == parseInt(jQuery('#post_ID').val()) ) { return; } // no need to do this more than once
+		jQuery('#post_ID').attr({name: "post_ID"});
+		jQuery('#post_ID').val(postID);
 		// We need new nonces
-		nonceAjax = new sack();
-		nonceAjax.element = null;
-		nonceAjax.setVar("action", "autosave-generate-nonces");
-		nonceAjax.setVar("post_ID", res);
-		nonceAjax.setVar("cookie", document.cookie);
-		nonceAjax.setVar("post_type", $('post_type').value);
-		nonceAjax.requestFile = autosaveL10n.requestFile;
-		nonceAjax.onCompletion = autosave_update_nonce;
-		nonceAjax.method = "POST";
-		nonceAjax.runAJAX();
-		$('hiddenaction').value = 'editpost';
+		jQuery.post(autosaveL10n.requestFile, {
+			action: "autosave-generate-nonces",
+			post_ID: postID,
+			autosavenonce: jQuery('#autosavenonce').val(),
+			post_type: jQuery('#post_type').val()
+		}, function(html) {
+			jQuery('#_wpnonce').val(html);
+		});
+		jQuery('#hiddenaction').val('editpost');
 	}
-	$('autosave').innerHTML = message;
-	autosave_enable_buttons();
 }
 
-function autosave_loading() {
-	$('autosave').innerHTML = autosaveL10n.savingText;
+function autosave_update_preview_link(post_id) {
+	// Add preview button if not already there
+	if ( !jQuery('#previewview > *').size() ) {
+		var post_type = jQuery('#post_type').val();
+		var previewText = 'page' == post_type ? autosaveL10n.previewPageText : autosaveL10n.previewPostText;
+		jQuery.post(autosaveL10n.requestFile, {
+			action: "get-permalink",
+			post_id: post_id,
+			getpermalinknonce: jQuery('#getpermalinknonce').val()
+		}, function(permalink) {
+			jQuery('#previewview').html('<a target="_blank" href="'+permalink+'" tabindex="4">'+previewText+'</a>');
+		});
+	}
 }
 
-function autosave_saved() {
-	var response = autosaveAjax.response;
-	var res = parseInt(response);
-	var message;
-
-	if(isNaN(res)) {
-		message = autosaveL10n.errorText.replace(/%response%/g, response);
-	} else {
-		message = autosaveL10n.saveText.replace(/%time%/g, autosave_cur_time());
+function autosave_update_slug(post_id) {
+	// create slug area only if not already there
+	if ( jQuery.isFunction(make_slugedit_clickable) && !jQuery('#edit-slug-box > *').size() ) {
+		jQuery.post(
+			slugL10n.requestFile,
+			{
+				action: 'sample-permalink',
+				post_id: post_id,
+				new_title: jQuery('#title').val(), 
+				samplepermalinknonce: jQuery('#samplepermalinknonce').val()
+			},
+			function(data) {
+				jQuery('#edit-slug-box').html(data);
+				make_slugedit_clickable();
+			}
+		);
 	}
-	$('autosave').innerHTML = message;
-	autosave_enable_buttons();
 }
 
-function autosave_disable_buttons() {
-	var form = $('post');
-	form.save ? form.save.disabled = 'disabled' : null;
-	form.submit ? form.submit.disabled = 'disabled' : null;
-	form.publish ? form.publish.disabled = 'disabled' : null;
-	form.deletepost ? form.deletepost.disabled = 'disabled' : null;
-	setTimeout('autosave_enable_buttons();', 1000); // Re-enable 1 sec later.  Just gives autosave a head start to avoid collisions.
+function autosave_loading() {
+	jQuery('#autosave').html(autosaveL10n.savingText);
 }
 
 function autosave_enable_buttons() {
-	var form = $('post');
-	form.save ? form.save.disabled = '' : null;
-	form.submit ? form.submit.disabled = '' : null;
-	form.publish ? form.publish.disabled = '' : null;
-	form.deletepost ? form.deletepost.disabled = '' : null;
+	jQuery("#submitpost :button:disabled, #submitpost :submit:disabled").attr('disabled', '');
 }
 
-function autosave() {
-	var form = $('post');
-	var rich = ((typeof tinyMCE != "undefined") && tinyMCE.getInstanceById('content')) ? true : false;
+function autosave_disable_buttons() {
+	jQuery("#submitpost :button:enabled, #submitpost :submit:enabled").attr('disabled', 'disabled');
+	setTimeout(autosave_enable_buttons, 1000); // Re-enable 1 sec later.  Just gives autosave a head start to avoid collisions.
+}
 
-	autosaveAjax = new sack();
+var autosave = function() {
+	// (bool) is rich editor enabled and active
+	var rich = (typeof tinyMCE != "undefined") && tinyMCE.activeEditor && !tinyMCE.activeEditor.isHidden();
+	var post_data = {
+		action: "autosave",
+		post_ID:  jQuery("#post_ID").val() || 0,
+		post_title: jQuery("#title").val() || "",
+		autosavenonce: jQuery('#autosavenonce').val(),
+		tags_input: jQuery("#tags-input").val() || "",
+		post_type: jQuery('#post_type').val() || "",
+		autosave: 1
+	};
+
+	// We always send the ajax request in order to keep the post lock fresh.
+	// This (bool) tells whether or not to write the post to the DB during the ajax request.
+	var doAutoSave = true;
+
+	// No autosave while thickbox is open (media buttons)
+	if ( jQuery("#TB_window").css('display') == 'block' )
+		doAutoSave = false;
 
 	/* Gotta do this up here so we can check the length when tinyMCE is in use */
-	if ( typeof tinyMCE == "undefined" || tinyMCE.configs.length < 1 || rich == false ) {
-		autosaveAjax.setVar("content", form.content.value);
-	} else {
-		// Don't run while the TinyMCE spellcheck is on.
-		if(tinyMCE.selectedInstance.spellcheckerOn) return;
-		tinyMCE.wpTriggerSave();
-		autosaveAjax.setVar("content", form.content.value);
-	}
+	if ( rich ) { tinyMCE.triggerSave(); }
 
-	if(form.post_title.value.length==0 || form.content.value.length==0 || form.post_title.value+form.content.value == autosaveLast)
-		return;
+	post_data["content"] = jQuery("#content").val();
+	if ( jQuery('#post_name').val() )
+		post_data["post_name"] = jQuery('#post_name').val();
+
+	// Nothing to save or no change.
+	if( (post_data["post_title"].length==0 && post_data["content"].length==0) || post_data["post_title"] + post_data["content"] == autosaveLast) {
+		doAutoSave = false
+	}
 
 	autosave_disable_buttons();
 
-	autosaveLast = form.post_title.value+form.content.value;
+	var origStatus = jQuery('#original_post_status').val();
+	if ( 'draft' != origStatus ) // autosave currently only turned on for drafts
+		doAutoSave = false;
 
-	cats = document.getElementsByName("post_category[]");
+	autosaveLast = jQuery("#title").val()+jQuery("#content").val();
 	goodcats = ([]);
-	for(i=0;i<cats.length;i++) {
-		if(cats[i].checked)
-			goodcats.push(cats[i].value);
-	}
-	catslist = goodcats.join(",");
-
-	autosaveAjax.setVar("action", "autosave");
-	autosaveAjax.setVar("cookie", document.cookie);
-	autosaveAjax.setVar("catslist", catslist);
-	autosaveAjax.setVar("post_ID", $("post_ID").value);
-	autosaveAjax.setVar("post_title", form.post_title.value);
-	autosaveAjax.setVar("post_type", form.post_type.value);
-	if ( form.comment_status.checked )
-		autosaveAjax.setVar("comment_status", 'open');
-	if ( form.ping_status.checked )
-		autosaveAjax.setVar("ping_status", 'open');
-	if(form.excerpt)
-		autosaveAjax.setVar("excerpt", form.excerpt.value);
-
-	if ( typeof tinyMCE == "undefined" || tinyMCE.configs.length < 1 || rich == false ) {
-		autosaveAjax.setVar("content", form.content.value);
+	jQuery("[@name='post_category[]']:checked").each( function(i) {
+		goodcats.push(this.value);
+	} );
+	post_data["catslist"] = goodcats.join(",");
+
+	if ( jQuery("#comment_status").attr("checked") )
+		post_data["comment_status"] = 'open';
+	if ( jQuery("#ping_status").attr("checked") )
+		post_data["ping_status"] = 'open';
+	if( jQuery("#excerpt"))
+		post_data["excerpt"] = jQuery("#excerpt").val();
+
+	// Don't run while the TinyMCE spellcheck is on.  Why?  Who knows.
+	if ( rich && tinyMCE.activeEditor.plugins.spellchecker && tinyMCE.activeEditor.plugins.spellchecker.active ) {
+		doAutoSave = false;
+	}
+
+	if(parseInt(post_data["post_ID"]) < 1) {
+		post_data["temp_ID"] = post_data["post_ID"];
+		var successCallback = autosave_saved_new;; // new post
 	} else {
-		tinyMCE.wpTriggerSave();
-		autosaveAjax.setVar("content", form.content.value);
+		var successCallback = autosave_saved; // pre-existing post
 	}
 
-	autosaveAjax.requestFile = autosaveL10n.requestFile;
-	autosaveAjax.method = "POST";
-	autosaveAjax.element = null;
-	autosaveAjax.onLoading = autosave_loading;
-	autosaveAjax.onInteractive = autosave_loading;
-	if(parseInt($("post_ID").value) < 1)
-		autosaveAjax.onCompletion = autosave_update_post_ID;
-	else
-		autosaveAjax.onCompletion = autosave_saved;
-	autosaveAjax.runAJAX();
+	if ( !doAutoSave ) {
+		post_data['autosave'] = 0;
+	}
+
+	autosaveOldMessage = jQuery('#autosave').html();
+
+	jQuery.ajax({
+		data: post_data,
+		beforeSend: doAutoSave ? autosave_loading : null,
+		type: "POST",
+		url: autosaveL10n.requestFile,
+		success: successCallback
+	});
 }
diff -x .svn -aruN 2.2.2.src/wp-includes/js/colorpicker.js 2.5.src/wp-includes/js/colorpicker.js
--- 2.2.2.src/wp-includes/js/colorpicker.js	2006-02-12 01:53:23.000000000 -0600
+++ 2.5.src/wp-includes/js/colorpicker.js	2008-02-29 11:09:44.000000000 -0600
@@ -673,15 +673,15 @@
 	var windowRef = (windowMode)?"window.opener.":"";
 	if (windowMode) {
 		cp_contents += "<html><head><title>Select Color</title></head>";
-		cp_contents += "<body marginwidth=0 marginheight=0 leftmargin=0 topmargin=0><center>";
+		cp_contents += "<body marginwidth=0 marginheight=0 leftmargin=0 topmargin=0><span style='text-align: center;'>";
 		}
-	cp_contents += "<table border=0 cellspacing=0 cellpadding=0>";
+	cp_contents += "<table style='border: none;' cellspacing=0 cellpadding=0>";
 	var use_highlight = (document.getElementById || document.all)?true:false;
 	for (var i=0; i<total; i++) {
 		if ((i % width) == 0) { cp_contents += "<tr>"; }
 		if (use_highlight) { var mo = 'onMouseOver="'+windowRef+'ColorPicker_highlightColor(\''+colors[i]+'\',window.document)"'; }
 		else { mo = ""; }
-		cp_contents += '<td bgcolor="'+colors[i]+'"><a href="javascript:void()" onclick="'+windowRef+'ColorPicker_pickColor(\''+colors[i]+'\','+windowRef+'window.popupWindowObjects['+cp.index+']);return false;" '+mo+'>&nbsp;</a></td>';
+		cp_contents += '<td style="background-color: '+colors[i]+';"><a href="javascript:void()" onclick="'+windowRef+'ColorPicker_pickColor(\''+colors[i]+'\','+windowRef+'window.popupWindowObjects['+cp.index+']);return false;" '+mo+'>&nbsp;</a></td>';
 		if ( ((i+1)>=total) || (((i+1) % width) == 0)) { 
 			cp_contents += "</tr>";
 			}
@@ -690,11 +690,11 @@
 	if (document.getElementById) {
 		var width1 = Math.floor(width/2);
 		var width2 = width = width1;
-		cp_contents += "<tr><td colspan='"+width1+"' bgcolor='#ffffff' ID='colorPickerSelectedColor'>&nbsp;</td><td colspan='"+width2+"' align='center' id='colorPickerSelectedColorValue'>#FFFFFF</td></tr>";
+		cp_contents += "<tr><td colspan='"+width1+"' style='background-color: #FFF;' ID='colorPickerSelectedColor'>&nbsp;</td><td colspan='"+width2+"' style='text-align: center;' id='colorPickerSelectedColorValue'>#FFFFFF</td></tr>";
 		}
 	cp_contents += "</table>";
 	if (windowMode) {
-		cp_contents += "</center></body></html>";
+		cp_contents += "</span></body></html>";
 		}
 	// end populate code
 
diff -x .svn -aruN 2.2.2.src/wp-includes/js/dbx.js 2.5.src/wp-includes/js/dbx.js
--- 2.2.2.src/wp-includes/js/dbx.js	2006-08-09 14:39:17.000000000 -0500
+++ 2.5.src/wp-includes/js/dbx.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,6 +0,0 @@
-// DBX2.05 :: Docking Boxes (dbx)
-// *****************************************************
-// DOM scripting by brothercake -- http://www.brothercake.com/
-// GNU Lesser General Public License -- http://www.gnu.org/licenses/lgpl.html
-//******************************************************
-var dbx;function dbxManager(sid){dbx = this;if(!/^[-_a-z0-9]+$/i.test(sid)) { alert('Error from dbxManager:\n"' + sid + '" is an invalid session ID'); return; }this.supported = !(document.getElementsByTagName('*').length == 0 || (navigator.vendor == 'KDE' && typeof window.sidebar == 'undefined'));if(!this.supported) { return; }this.etype = typeof document.addEventListener != 'undefined' ? 'addEventListener' : typeof document.attachEvent != 'undefined' ? 'attachEvent' : 'none';this.eprefix = (this.etype == 'attachEvent' ? 'on' : '');if(typeof window.opera != 'undefined' && parseFloat(navigator.userAgent.toLowerCase().split(/opera[\/ ]/)[1].split(' ')[0], 10) < 7.5){this.etype = 'none';}if(this.etype == 'none') { this.supported = false; return; }this.running = 0;this.sid = sid;this.savedata = {};this.cookiestate = this.getCookieState();};dbxManager.prototype.setCookieState = function(){var now = new Date();now.setTime(now.getTime() + (365*24*60*60*1000));var str = '';for(j in this.savedata){if(typeof this.savedata[j]!='function'){str += j + '=' + this.savedata[j] + '&'}}this.state = str.replace(/^(.+)&$/, '$1');this.cookiestring = this.state.replace(/,/g, '|');this.cookiestring = this.cookiestring.replace(/=/g, ':');if(typeof this.onstatechange == 'undefined' || this.onstatechange()){document.cookie = 'dbx-' + this.sid + '='+ this.cookiestring+ '; expires=' + now.toGMTString()+ '; path=/';}};dbxManager.prototype.getCookieState = function(){this.cookiestate = null;if(document.cookie){if(document.cookie.indexOf('dbx-' + this.sid)!=-1){this.cookie = document.cookie.split('dbx-' + this.sid + '=')[1].split(';')[0].split('&');for(var i in this.cookie){if(typeof this.cookie[i]!='function'){this.cookie[i] = this.cookie[i].replace(/\|/g, ',');this.cookie[i]= this.cookie[i].replace(/:/g, '=');this.cookie[i] = this.cookie[i].split('=');this.cookie[i][1] = this.cookie[i][1].split(',');}}this.cookiestate = {};for(i in this.cookie){if(typeof this.cookie[i]!='function'){this.cookiestate[this.cookie[i][0]] = this.cookie[i][1];}}}}return this.cookiestate;};dbxManager.prototype.addDataMember = function(gid, order){this.savedata[gid] = order;};dbxManager.prototype.createElement = function(tag){return typeof document.createElementNS != 'undefined' ? document.createElementNS('http://www.w3.org/1999/xhtml', tag) : document.createElement(tag);};dbxManager.prototype.getTarget = function(e, pattern, node){if(typeof node != 'undefined'){var target = node;}else{target = typeof e.target != 'undefined' ? e.target : e.srcElement;}var regex = new RegExp(pattern, '');while(!regex.test(target.className)){target = target.parentNode;}return target;};function dbxGroup(gid, dir, thresh, fix, ani, togs, def, open, close, move, toggle, kmove, ktoggle, syntax){if(!/^[-_a-z0-9]+$/i.test(gid)) { alert('Error from dbxGroup:\n"' + gid + '" is an invalid container ID'); return; }this.container = document.getElementById(gid);if(this.container == null || !dbx.supported) { return; }var self = this;this.gid = gid;this.dragok = false;this.box = null;this.vertical = dir == 'vertical';this.threshold = parseInt(thresh, 10);this.restrict = fix == 'yes';this.resolution = parseInt(ani, 10);this.toggles = togs == 'yes';this.defopen = def != 'closed';this.vocab = {'open' : open,'close' : close,'move' : move,'toggle' : toggle,'kmove' : kmove,'ktoggle' : ktoggle,'syntax' : syntax};this.container.style.position = 'relative';this.container.style.display = 'block';if(typeof window.opera != 'undefined'){this.container.style.display = 'run-in';}this.boxes = [];this.buttons = [];this.order = [];this.eles = this.container.getElementsByTagName('*');for(var i=0; i<this.eles.length; i++){if(/dbx\-box/i.test(this.eles[i].className) && !/dbx\-dummy/i.test(this.eles[i].className)){this.eles[i].style.position = 'relative';this.eles[i].style.display = 'block';this.boxes.push(this.eles[i]);this.eles[i].className += ' dbx-box-open';this.eles[i].className += ' dbxid' + this.order.length;this.order.push(this.order.length.toString() + '+');this.eles[i][dbx.etype](dbx.eprefix + 'mousedown', function(e){if(!e) { e = window.event; }self.mousedown(e, dbx.getTarget(e, 'dbx\-box'));}, false);}if(/dbx\-handle/i.test(this.eles[i].className)){this.eles[i].style.position = 'relative';this.eles[i].style.display = 'block';this.eles[i].className += ' dbx-handle-cursor';this.eles[i].setAttribute('title', this.eles[i].getAttribute('title') == null || this.eles[i].title == '' ? this.vocab.move : this.vocab.syntax.replace('%mytitle%', this.eles[i].title).replace('%dbxtitle%', this.vocab.move));if(this.toggles){this.buttons.push(this.addToggleBehavior(this.eles[i]));}else{this.eles[i][dbx.etype](dbx.eprefix + 'key' + (typeof document.uniqueID != 'undefined' || navigator.vendor == 'Apple Computer, Inc.' ? 'down' : 'press'), function(e){if(!e) { e = window.event; }return self.keypress(e, dbx.getTarget(e, 'dbx\-handle'));}, false);this.eles[i][dbx.etype](dbx.eprefix + 'focus', function(e){if(!e) { e = window.event; }self.createTooltip(null, dbx.getTarget(e, 'dbx\-handle'));}, false);this.eles[i][dbx.etype](dbx.eprefix + 'blur', function(){self.removeTooltip();}, false);}}}dbx.addDataMember(this.gid, this.order.join(','));var dummy = this.container.appendChild(dbx.createElement('span'));dummy.className = 'dbx-box dbx-dummy';dummy.style.display = 'block';dummy.style.width = '0';dummy.style.height = '0';dummy.style.overflow = 'hidden';if(this.vertical) { dummy.className += ' dbx-offdummy'; }this.boxes.push(dummy);if(dbx.cookiestate != null && typeof dbx.cookiestate[this.gid] != 'undefined'){var num = dbx.cookiestate[this.gid].length;if(num == this.boxes.length - 1){for(i=0; i<num; i++){var index = parseInt(dbx.cookiestate[this.gid][i], 10);this.container.insertBefore(this.boxes[index], dummy);if(this.toggles && /\-$/.test(dbx.cookiestate[this.gid][i])){this.toggleBoxState(this.buttons[index], false);}}this.getBoxOrder();}}else if(!this.defopen && this.toggles){var len = this.buttons.length;for(i=0; i<len; i++){this.toggleBoxState(this.buttons[i], true);}}document[dbx.etype](dbx.eprefix + 'mouseout', function(e){if(typeof e.target == 'undefined') { e = window.event; e.relatedTarget = e.toElement; }if(e.relatedTarget == null){self.mouseup(e);}}, false);document[dbx.etype](dbx.eprefix + 'mousemove', function(e){self.mousemove(e);return !self.dragok;}, false);document[dbx.etype](dbx.eprefix + 'mouseup', function(e){self.mouseup(e);}, false);this.keydown = false;document[dbx.etype](dbx.eprefix + 'keydown', function(){self.keydown = true;}, false);document[dbx.etype](dbx.eprefix + 'keyup', function(){self.keydown = false;}, false);};dbxGroup.prototype.addToggleBehavior = function(){var self = this;var button = arguments[0].appendChild(dbx.createElement('a'));button.appendChild(document.createTextNode('\u00a0'));button.style.cursor = 'pointer';button.href = 'javascript:void(null)';button.className = 'dbx-toggle dbx-toggle-open';button.setAttribute('title', this.vocab.toggle.replace('%toggle%', this.vocab.close));button.hasfocus = typeof window.opera != 'undefined' || navigator.vendor == 'Apple Computer, Inc.' ? null : false;this.tooltip = null;button.onclick = function(){if(this.hasfocus === true || this.hasfocus === null){self.removeTooltip();self.toggleBoxState(this, true);}};button['onkey' + (typeof document.uniqueID != 'undefined' || navigator.vendor == 'Apple Computer, Inc.' ? 'down' : 'press')] = function(e){if(!e) { e = window.event; }return self.keypress(e, this);};button.onfocus = function(){var len = self.buttons.length;for(var i=0; i<len; i++){self.buttons[i].className = self.buttons[i].className.replace(/[ ](dbx\-toggle\-hilite\-)(open|closed)/, '');}var isopen = (/dbx\-toggle\-open/.test(this.className));this.className += ' dbx-toggle-hilite-' + (isopen ? 'open' : 'closed');self.createTooltip(isopen, this);this.isactive = true;if(this.hasfocus !== null) { this.hasfocus = true; }};button.onblur = function(){this.className = this.className.replace(/[ ](dbx\-toggle\-hilite\-)(open|closed)/, '');self.removeTooltip();if(this.hasfocus !== null) { this.hasfocus = false; }};return button;};dbxGroup.prototype.toggleBoxState = function(button, regen){var isopen = (/dbx\-toggle\-open/.test(button.className));var parent = dbx.getTarget(null, 'dbx\-box', button);dbx.box = parent;dbx.toggle = button;if(typeof dbx.container == 'undefined'){dbx.group = dbx.getTarget(null, 'dbx\-group', parent);}else { dbx.group = dbx.container; }if((!isopen && (typeof dbx.onboxopen == 'undefined' || dbx.onboxopen()))||(isopen && (typeof dbx.onboxclose == 'undefined' || dbx.onboxclose()))){button.className = 'dbx-toggle dbx-toggle-' + (isopen ? 'closed' : 'open');button.title = this.vocab.toggle.replace('%toggle%', isopen ? this.vocab.open : this.vocab.close);if(typeof button.isactive != 'undefined'){button.className += ' dbx-toggle-hilite-' + (isopen ? 'closed' : 'open')}parent.className = parent.className.replace(/[ ](dbx-box-)(open|closed)/, ' $1' + (isopen ? 'closed' : 'open'));if(regen) { this.getBoxOrder(); }}};dbxGroup.prototype.shiftBoxPosition = function(e, anchor, positive){var parent = dbx.getTarget(null, 'dbx\-box', anchor);dbx.group = this.container;dbx.box = parent;dbx.event = e;if(typeof dbx.onboxdrag == 'undefined' || dbx.onboxdrag()){var positions = [];var len = this.boxes.length;for(var i=0; i<len; i++){positions[i] = [i, this.boxes[i][this.vertical ? 'offsetTop' : 'offsetLeft']];if(parent == this.boxes[i]) { this.idref = i; }}positions.sort(this.compare);for(i=0; i<len; i++){if(positions[i][0] == this.idref){if((positive && i < len - 2) || (!positive && i > 0)){var sibling = this.boxes[positions[i + (positive ? 1 : -1)][0]];if(this.resolution > 0){var visipos = { 'x' : parent.offsetLeft, 'y' : parent.offsetTop };var siblingpos = { 'x' : sibling.offsetLeft, 'y' : sibling.offsetTop };}var obj = { 'insert' : (positive ? sibling : parent), 'before' : (positive ? parent : sibling) };this.container.insertBefore(obj.insert, obj.before);if(this.resolution > 0){var animators ={'sibling' : new dbxAnimator(this, sibling, siblingpos, this.resolution, true, anchor),'parent' : new dbxAnimator(this, parent, visipos, this.resolution, true, anchor)};}else{anchor.focus();}break;}}}this.getBoxOrder();}};dbxGroup.prototype.compare = function(a, b){return a[1] - b[1];};dbxGroup.prototype.createTooltip = function(isopen, anchor){if(this.keydown){this.tooltip = this.container.appendChild(dbx.createElement('span'));this.tooltip.style.visibility = 'hidden';this.tooltip.className = 'dbx-tooltip';if(isopen != null){this.tooltip.appendChild(document.createTextNode(this.vocab.kmove + this.vocab.ktoggle.replace('%toggle%', isopen ? this.vocab.close : this.vocab.open)));}else{this.tooltip.appendChild(document.createTextNode(this.vocab.kmove));}var parent = dbx.getTarget(null, 'dbx\-box', anchor);this.tooltip.style.left = parent.offsetLeft + 'px';this.tooltip.style.top = parent.offsetTop + 'px';var tooltip = this.tooltip;window.setTimeout(function(){if(tooltip != null) { tooltip.style.visibility = 'visible'; }}, 500);}};dbxGroup.prototype.removeTooltip = function(){if(this.tooltip != null){this.tooltip.parentNode.removeChild(this.tooltip);this.tooltip = null;}};dbxGroup.prototype.mousedown = function(e, box){var node = typeof e.target != 'undefined' ? e.target : e.srcElement;if(node.nodeName == '#text') { node = node.parentNode; }if(!/dbx\-(toggle|box|group)/i.test(node.className)){while(!/dbx\-(handle|box|group)/i.test(node.className)){node = node.parentNode;}}if(/dbx\-handle/i.test(node.className)){this.removeTooltip();this.released = false;this.initial = { 'x' : e.clientX, 'y' : e.clientY };this.current = { 'x' : 0, 'y' : 0 };this.createCloneBox(box);if(typeof e.preventDefault != 'undefined' ) { e.preventDefault(); }if(typeof document.onselectstart != 'undefined'){document.onselectstart = function() { return false; }}}};dbxGroup.prototype.mousemove = function(e){if(this.dragok && this.box != null){this.positive = this.vertical ? (e.clientY > this.current.y ? true : false) : (e.clientX > this.current.x ? true : false);this.current = { 'x' : e.clientX, 'y' : e.clientY };var overall = { 'x' : this.current.x - this.initial.x, 'y' : this.current.y - this.initial.y };if(((overall.x >= 0 && overall.x <= this.threshold) || (overall.x <= 0 && overall.x >= 0 - this.threshold))&&((overall.y >= 0 && overall.y <= this.threshold) || (overall.y <= 0 && overall.y >= 0 - this.threshold))){this.current.x -= overall.x;this.current.y -= overall.y;}if(this.released || overall.x > this.threshold || overall.x < (0 - this.threshold) || overall.y > this.threshold || overall.y < (0 - this.threshold)){dbx.group = this.container;dbx.box = this.box;dbx.event = e;if(typeof dbx.onboxdrag == 'undefined' || dbx.onboxdrag()){this.released = true;if(!this.restrict || !this.vertical) { this.boxclone.style.left = (this.current.x - this.difference.x) + 'px'; }if(!this.restrict || this.vertical) { this.boxclone.style.top = (this.current.y - this.difference.y) + 'px'; }this.moveOriginalToPosition(this.current.x, this.current.y);if(typeof e.preventDefault != 'undefined' ) { e.preventDefault(); }}}}return true;};dbxGroup.prototype.mouseup = function(e){if(this.box != null){this.moveOriginalToPosition(e.clientX, e.clientY);this.removeCloneBox();this.getBoxOrder();if(typeof document.onselectstart != 'undefined'){document.onselectstart = function() { return true; }}}this.dragok = false;};dbxGroup.prototype.keypress = function(e, anchor){if(/^(3[7-9])|(40)$/.test(e.keyCode)){this.removeTooltip();if((this.vertical && /^(38|40)$/.test(e.keyCode)) || (!this.vertical && /^(37|39)$/.test(e.keyCode))){this.shiftBoxPosition(e, anchor, /^[3][78]$/.test(e.keyCode) ? false : true);if(typeof e.preventDefault != 'undefined') { e.preventDefault(); }else { return false; }typeof e.stopPropagation != 'undefined' ? e.stopPropagation() : e.cancelBubble = true;this.keydown = false;}}return true;};dbxGroup.prototype.getBoxOrder = function(){this.order = [];var len = this.eles.length;for(var j=0; j<len; j++){if(/dbx\-box/i.test(this.eles[j].className) && !/dbx\-(clone|dummy)/i.test(this.eles[j].className)){this.order.push(this.eles[j].className.split('dbxid')[1] + (/dbx\-box\-open/i.test(this.eles[j].className) ? '+' : '-'));}}dbx.savedata[this.gid] = this.order.join(',');dbx.setCookieState();};dbxGroup.prototype.createClone = function(){var clone = this.container.appendChild(arguments[0].cloneNode(true));clone.className += ' dbx-clone';clone.style.position = 'absolute';clone.style.visibility = 'hidden';clone.style.zIndex = arguments[1];clone.style.left = arguments[2].x + 'px';clone.style.top = arguments[2].y + 'px';clone.style.width = arguments[0].offsetWidth + 'px';clone.style.height = arguments[0].offsetHeight + 'px';return clone;};dbxGroup.prototype.createCloneBox = function(box){this.box = box;this.position = { 'x' : this.box.offsetLeft, 'y' : this.box.offsetTop };this.difference = { 'x' : (this.initial.x - this.position.x), 'y' : (this.initial.y - this.position.y) };this.boxclone = this.createClone(this.box, 30000, this.position);this.boxclone.style.cursor = 'move';this.dragok = true;};dbxGroup.prototype.removeCloneBox = function(){this.container.removeChild(this.boxclone);this.box.style.visibility = 'visible';this.box = null;};dbxGroup.prototype.moveOriginalToPosition = function(clientX, clientY){var cloneprops = {'xy' : this.vertical ? clientY - this.difference.y : clientX - this.difference.x,'wh' : this.vertical ? this.boxclone.offsetHeight : this.boxclone.offsetWidth};this.box.style.visibility = 'hidden';this.boxclone.style.visibility = 'visible';var len = this.boxes.length;for(var i=0; i<len; i++){var boxprops = {'xy' : this.vertical ? this.boxes[i].offsetTop : this.boxes[i].offsetLeft,'wh' : this.vertical ? this.boxes[i].offsetHeight : this.boxes[i].offsetWidth};if((this.positive && cloneprops.xy + cloneprops.wh > boxprops.xy && cloneprops.xy < boxprops.xy)||(!this.positive && cloneprops.xy < boxprops.xy && cloneprops.xy + cloneprops.wh > boxprops.xy)){if(this.boxes[i] == this.box) { return; }var sibling = this.box.nextSibling;while(sibling.className == null || !/dbx\-box/.test(sibling.className)){sibling = sibling.nextSibling;}if(this.boxes[i] == sibling) { return; }if(this.resolution > 0){if(this.box[this.vertical ? 'offsetTop' : 'offsetLeft'] < boxprops.xy){var visibox = this.boxes[i].previousSibling;while(visibox.className == null || !/dbx\-box/.test(visibox.className)){visibox = visibox.previousSibling;}}else{visibox = this.boxes[i];}var visipos = { 'x' : visibox.offsetLeft, 'y' : visibox.offsetTop };}var prepos = { 'x' : this.box.offsetLeft, 'y' : this.box.offsetTop };this.container.insertBefore(this.box, this.boxes[i]);this.initial.x += (this.box.offsetLeft - prepos.x);this.initial.y += (this.box.offsetTop - prepos.y);if(this.resolution > 0 && visibox != this.box){var animator = new dbxAnimator(this, visibox, visipos, this.resolution, false, null);}else{}break;}}};function dbxAnimator(caller, box, pos, res, kbd, anchor){this.caller = caller;this.box = box;this.timer = null;var before = pos[this.caller.vertical ? 'y' : 'x'];var after = this.box[this.caller.vertical ? 'offsetTop' : 'offsetLeft'];if(before != after){if(dbx.running > this.caller.boxes.length - 1) { return; }var clone = this.caller.createClone(this.box, 29999, arguments[2]);clone.style.visibility = 'visible';this.box.style.visibility = 'hidden';this.animateClone(clone,before,after > before ? after - before : 0 - (before - after),this.caller.vertical ? 'top' : 'left',res,kbd,anchor);}};dbxAnimator.prototype.animateClone = function(clone, current, change, dir, res, kbd, anchor){var self = this;var count = 0;dbx.running ++;this.timer = window.setInterval(function(){count ++;current += change / res;clone.style[dir] = current + 'px';if(count == res){window.clearTimeout(self.timer);self.timer = null;dbx.running --;self.caller.container.removeChild(clone);self.box.style.visibility = 'visible';if(kbd){if(anchor != null && anchor.parentNode.style.visibility != 'hidden'){anchor.focus();}else if(self.caller.toggles){var button = self.caller.buttons[parseInt(self.box.className.split('dbxid')[1],10)];if(button != null && typeof button.isactive != 'undefined'){button.focus();}}}}}, 20);};if(typeof window.attachEvent != 'undefined'){window.attachEvent('onunload', function(){var ev = ['mousedown', 'mousemove', 'mouseup', 'mouseout', 'click', 'keydown', 'keyup', 'focus', 'blur', 'selectstart', 'statechange', 'boxdrag', 'boxopen', 'boxclose'];var el = ev.length;var dl = document.all.length;for(var i=0; i<dl; i++){for(var j=0; j<el; j++){document.all[i]['on' + ev[j]] = null;}}});}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/fat.js 2.5.src/wp-includes/js/fat.js
--- 2.2.2.src/wp-includes/js/fat.js	2006-03-28 19:51:55.000000000 -0600
+++ 2.5.src/wp-includes/js/fat.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,90 +0,0 @@
-// @name      The Fade Anything Technique
-// @namespace http://www.axentric.com/aside/fat/
-// @version   1.0-RC1
-// @author    Adam Michela
-
-var Fat = {
-	make_hex : function (r,g,b) 
-	{
-		r = r.toString(16); if (r.length == 1) r = '0' + r;
-		g = g.toString(16); if (g.length == 1) g = '0' + g;
-		b = b.toString(16); if (b.length == 1) b = '0' + b;
-		return "#" + r + g + b;
-	},
-	fade_all : function (dur)
-	{
-		var a = document.getElementsByTagName("*");
-		for (var i = 0; i < a.length; i++) 
-		{
-			var o = a[i];
-			var r = /fade-?(\w{3,6})?/.exec(o.className);
-			if (r)
-			{
-				if (!r[1]) r[1] = "";
-				if (o.id) Fat.fade_element(o.id,null,dur,"#"+r[1]);
-			}
-		}
-	},
-	fade_element : function (id, fps, duration, from, to) 
-	{
-		if (!fps) fps = 30;
-		if (!duration) duration = 3000;
-		if (!from || from=="#") from = "#FFFF33";
-		if (!to) to = this.get_bgcolor(id);
-
-		var frames = Math.round(fps * (duration / 1000));
-		var interval = duration / frames;
-		var delay = interval;
-		var frame = 0;
-
-		if (from.length < 7) from += from.substr(1,3);
-		if (to.length < 7) to += to.substr(1,3);
-
-		var rf = parseInt(from.substr(1,2),16);
-		var gf = parseInt(from.substr(3,2),16);
-		var bf = parseInt(from.substr(5,2),16);
-		var rt = parseInt(to.substr(1,2),16);
-		var gt = parseInt(to.substr(3,2),16);
-		var bt = parseInt(to.substr(5,2),16);
-
-		var r,g,b,h;
-		while (frame < frames)
-		{
-			r = Math.floor(rf * ((frames-frame)/frames) + rt * (frame/frames));
-			g = Math.floor(gf * ((frames-frame)/frames) + gt * (frame/frames));
-			b = Math.floor(bf * ((frames-frame)/frames) + bt * (frame/frames));
-			h = this.make_hex(r,g,b);
-
-			setTimeout("Fat.set_bgcolor('"+id+"','"+h+"')", delay);
-
-			frame++;
-			delay = interval * frame; 
-		}
-		setTimeout("Fat.set_bgcolor('"+id+"','"+to+"')", delay);
-	},
-	set_bgcolor : function (id, c)
-	{
-		var o = document.getElementById(id);
-		o.style.backgroundColor = c;
-	},
-	get_bgcolor : function (id)
-	{
-		var o = document.getElementById(id);
-		while(o)
-		{
-			var c;
-			if (window.getComputedStyle) c = window.getComputedStyle(o,null).getPropertyValue("background-color");
-			if (o.currentStyle) c = o.currentStyle.backgroundColor;
-			if ((c != "" && c != "transparent") || o.tagName == "BODY") { break; }
-			o = o.parentNode;
-		}
-		if (c == undefined || c == "" || c == "transparent") c = "#FFFFFF";
-		var rgb = c.match(/rgb\s*\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)/);
-		if (rgb) c = this.make_hex(parseInt(rgb[1]),parseInt(rgb[2]),parseInt(rgb[3]));
-		return c;
-	}
-}
-
-addLoadEvent(function ()  {
-	Fat.fade_all();
-});
diff -x .svn -aruN 2.2.2.src/wp-includes/js/jquery/interface.js 2.5.src/wp-includes/js/jquery/interface.js
--- 2.2.2.src/wp-includes/js/jquery/interface.js	2007-02-20 20:39:07.000000000 -0600
+++ 2.5.src/wp-includes/js/jquery/interface.js	2008-02-05 10:32:20.000000000 -0600
@@ -9,4 +9,4 @@
  *   
  *
  */
- eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('k.f2={2r:u(M){E q.1E(u(){if(!M.aR||!M.aZ)E;D el=q;el.2l={aq:M.aq||cO,aR:M.aR,aZ:M.aZ,8e:M.8e||\'fV\',aJ:M.aJ||\'fV\',2Y:M.2Y&&2g M.2Y==\'u\'?M.2Y:I,3i:M.2Y&&2g M.3i==\'u\'?M.3i:I,7U:M.7U&&2g M.7U==\'u\'?M.7U:I,as:k(M.aR,q),8f:k(M.aZ,q),H:M.H||8J,67:M.67||0};el.2l.8f.2G().B(\'W\',\'9R\').eq(0).B({W:el.2l.aq+\'U\',19:\'2B\'}).2T();el.2l.as.1E(u(2N){q.7X=2N}).gC(u(){k(q).2R(el.2l.aJ)},u(){k(q).4i(el.2l.aJ)}).1J(\'5h\',u(e){if(el.2l.67==q.7X)E;el.2l.as.eq(el.2l.67).4i(el.2l.8e).2T().eq(q.7X).2R(el.2l.8e).2T();el.2l.8f.eq(el.2l.67).5w({W:0},el.2l.H,u(){q.14.19=\'1o\';if(el.2l.3i){el.2l.3i.1D(el,[q])}}).2T().eq(q.7X).1Y().5w({W:el.2l.aq},el.2l.H,u(){q.14.19=\'2B\';if(el.2l.2Y){el.2l.2Y.1D(el,[q])}}).2T();if(el.2l.7U){el.2l.7U.1D(el,[q,el.2l.8f.K(q.7X),el.2l.as.K(el.2l.67),el.2l.8f.K(el.2l.67)])}el.2l.67=q.7X}).eq(0).2R(el.2l.8e).2T();k(q).B(\'W\',k(q).B(\'W\')).B(\'2U\',\'2K\')})}};k.fn.gN=k.f2.2r;k.aA={2r:u(M){E q.1E(u(){D el=q;D 7E=2*18.2Q/f1;D an=2*18.2Q;if(k(el).B(\'Y\')!=\'2s\'&&k(el).B(\'Y\')!=\'1P\'){k(el).B(\'Y\',\'2s\')}el.1l={1R:k(M.1R,q),2F:M.2F,6q:M.6q,aD:M.aD,an:an,1N:k.1a.2o(q),Y:k.1a.3w(q),26:18.2Q/2,bi:M.bi,8p:M.6r,6r:[],aG:I,7E:2*18.2Q/f1};el.1l.fB=(el.1l.1N.w-el.1l.2F)/2;el.1l.7D=(el.1l.1N.h-el.1l.6q-el.1l.6q*el.1l.8p)/2;el.1l.2D=2*18.2Q/el.1l.1R.1N();el.1l.ba=el.1l.1N.w/2;el.1l.b9=el.1l.1N.h/2-el.1l.6q*el.1l.8p;D ak=1h.3F(\'22\');k(ak).B({Y:\'1P\',3I:1,Q:0,O:0});k(el).1S(ak);el.1l.1R.1E(u(2N){a6=k(\'1T\',q).K(0);W=T(el.1l.6q*el.1l.8p);if(k.3a.4t){3E=1h.3F(\'1T\');k(3E).B(\'Y\',\'1P\');3E.2J=a6.2J;3E.14.5E=\'gE 9n:9w.9y.cC(1G=60, 14=1, gB=0, gA=0, gv=0, gF=0)\'}P{3E=1h.3F(\'3E\');if(3E.fD){4L=3E.fD("2d");3E.14.Y=\'1P\';3E.14.W=W+\'U\';3E.14.Z=el.1l.2F+\'U\';3E.W=W;3E.Z=el.1l.2F;4L.gu();4L.gO(0,W);4L.gk(1,-1);4L.gp(a6,0,0,el.1l.2F,W);4L.6H();4L.gm="gG-4l";D ap=4L.hy(0,0,0,W);ap.fs(1,"fr(1V, 1V, 1V, 1)");ap.fs(0,"fr(1V, 1V, 1V, 0.6)");4L.hx=ap;if(hA.hB.3J(\'hw\')!=-1){4L.hv()}P{4L.hu(0,0,el.1l.2F,W)}}}el.1l.6r[2N]=3E;k(ak).1S(3E)}).1J(\'9z\',u(e){el.1l.aG=1b;el.1l.H=el.1l.7E*0.1*el.1l.H/18.3S(el.1l.H);E I}).1J(\'8B\',u(e){el.1l.aG=I;E I});k.aA.7T(el);el.1l.H=el.1l.7E*0.2;el.1l.ht=1X.6V(u(){el.1l.26+=el.1l.H;if(el.1l.26>an)el.1l.26=0;k.aA.7T(el)},20);k(el).1J(\'8B\',u(){el.1l.H=el.1l.7E*0.2*el.1l.H/18.3S(el.1l.H)}).1J(\'3D\',u(e){if(el.1l.aG==I){1s=k.1a.4a(e);fz=el.1l.1N.w-1s.x+el.1l.Y.x;el.1l.H=el.1l.bi*el.1l.7E*(el.1l.1N.w/2-fz)/(el.1l.1N.w/2)}})})},7T:u(el){el.1l.1R.1E(u(2N){b8=el.1l.26+2N*el.1l.2D;x=el.1l.fB*18.5H(b8);y=el.1l.7D*18.83(b8);f9=T(2a*(el.1l.7D+y)/(2*el.1l.7D));fk=(el.1l.7D+y)/(2*el.1l.7D);Z=T((el.1l.2F-el.1l.aD)*fk+el.1l.aD);W=T(Z*el.1l.6q/el.1l.2F);q.14.Q=el.1l.b9+y-W/2+"U";q.14.O=el.1l.ba+x-Z/2+"U";q.14.Z=Z+"U";q.14.W=W+"U";q.14.3I=f9;el.1l.6r[2N].14.Q=T(el.1l.b9+y+W-1-W/2)+"U";el.1l.6r[2N].14.O=T(el.1l.ba+x-Z/2)+"U";el.1l.6r[2N].14.Z=Z+"U";el.1l.6r[2N].14.W=T(W*el.1l.8p)+"U"})}};k.fn.hI=k.aA.2r;k.23({G:{c8:u(p,n,1W,1H,1m){E((-18.5H(p*18.2Q)/2)+0.5)*1H+1W},hK:u(p,n,1W,1H,1m){E 1H*(n/=1m)*n*n+1W},fl:u(p,n,1W,1H,1m){E-1H*((n=n/1m-1)*n*n*n-1)+1W},hm:u(p,n,1W,1H,1m){if((n/=1m/2)<1)E 1H/2*n*n*n*n+1W;E-1H/2*((n-=2)*n*n*n-2)+1W},8l:u(p,n,1W,1H,1m){if((n/=1m)<(1/2.75)){E 1H*(7.aB*n*n)+1W}P if(n<(2/2.75)){E 1H*(7.aB*(n-=(1.5/2.75))*n+.75)+1W}P if(n<(2.5/2.75)){E 1H*(7.aB*(n-=(2.25/2.75))*n+.gY)+1W}P{E 1H*(7.aB*(n-=(2.h2/2.75))*n+.gX)+1W}},cr:u(p,n,1W,1H,1m){if(k.G.8l)E 1H-k.G.8l(p,1m-n,0,1H,1m)+1W;E 1W+1H},gW:u(p,n,1W,1H,1m){if(k.G.cr&&k.G.8l)if(n<1m/2)E k.G.cr(p,n*2,0,1H,1m)*.5+1W;E k.G.8l(p,n*2-1m,0,1H,1m)*.5+1H*.5+1W;E 1W+1H},gQ:u(p,n,1W,1H,1m){D a,s;if(n==0)E 1W;if((n/=1m)==1)E 1W+1H;a=1H*0.3;p=1m*.3;if(a<18.3S(1H)){a=1H;s=p/4}P{s=p/(2*18.2Q)*18.cb(1H/a)}E-(a*18.6b(2,10*(n-=1))*18.83((n*1m-s)*(2*18.2Q)/p))+1W},gT:u(p,n,1W,1H,1m){D a,s;if(n==0)E 1W;if((n/=1m/2)==2)E 1W+1H;a=1H*0.3;p=1m*.3;if(a<18.3S(1H)){a=1H;s=p/4}P{s=p/(2*18.2Q)*18.cb(1H/a)}E a*18.6b(2,-10*n)*18.83((n*1m-s)*(2*18.2Q)/p)+1H+1W},gV:u(p,n,1W,1H,1m){D a,s;if(n==0)E 1W;if((n/=1m/2)==2)E 1W+1H;a=1H*0.3;p=1m*.3;if(a<18.3S(1H)){a=1H;s=p/4}P{s=p/(2*18.2Q)*18.cb(1H/a)}if(n<1){E-.5*(a*18.6b(2,10*(n-=1))*18.83((n*1m-s)*(2*18.2Q)/p))+1W}E a*18.6b(2,-10*(n-=1))*18.83((n*1m-s)*(2*18.2Q)/p)*.5+1H+1W}}});k.6n={2r:u(M){E q.1E(u(){D el=q;el.1F={1R:k(M.1R,q),1Z:k(M.1Z,q),1M:k.1a.3w(q),2F:M.2F,ax:M.ax,7Y:M.7Y,ge:M.ge,51:M.51,6x:M.6x};k.6n.aH(el,0);k(1X).1J(\'gU\',u(){el.1F.1M=k.1a.3w(el);k.6n.aH(el,0);k.6n.7T(el)});k.6n.7T(el);el.1F.1R.1J(\'9z\',u(){k(el.1F.ax,q).K(0).14.19=\'2B\'}).1J(\'8B\',u(){k(el.1F.ax,q).K(0).14.19=\'1o\'});k(1h).1J(\'3D\',u(e){D 1s=k.1a.4a(e);D 5s=0;if(el.1F.51&&el.1F.51==\'cv\')D aI=1s.x-el.1F.1M.x-(el.4c-el.1F.2F*el.1F.1R.1N())/2-el.1F.2F/2;P if(el.1F.51&&el.1F.51==\'2L\')D aI=1s.x-el.1F.1M.x-el.4c+el.1F.2F*el.1F.1R.1N();P D aI=1s.x-el.1F.1M.x;D fP=18.6b(1s.y-el.1F.1M.y-el.5W/2,2);el.1F.1R.1E(u(2N){45=18.ez(18.6b(aI-2N*el.1F.2F,2)+fP);45-=el.1F.2F/2;45=45<0?0:45;45=45>el.1F.7Y?el.1F.7Y:45;45=el.1F.7Y-45;bB=el.1F.6x*45/el.1F.7Y;q.14.Z=el.1F.2F+bB+\'U\';q.14.O=el.1F.2F*2N+5s+\'U\';5s+=bB});k.6n.aH(el,5s)})})},aH:u(el,5s){if(el.1F.51)if(el.1F.51==\'cv\')el.1F.1Z.K(0).14.O=(el.4c-el.1F.2F*el.1F.1R.1N())/2-5s/2+\'U\';P if(el.1F.51==\'O\')el.1F.1Z.K(0).14.O=-5s/el.1F.1R.1N()+\'U\';P if(el.1F.51==\'2L\')el.1F.1Z.K(0).14.O=(el.4c-el.1F.2F*el.1F.1R.1N())-5s/2+\'U\';el.1F.1Z.K(0).14.Z=el.1F.2F*el.1F.1R.1N()+5s+\'U\'},7T:u(el){el.1F.1R.1E(u(2N){q.14.Z=el.1F.2F+\'U\';q.14.O=el.1F.2F*2N+\'U\'})}};k.fn.hi=k.6n.2r;k.N={1c:S,8R:S,3A:S,2I:S,4y:S,cl:S,1d:S,2h:S,1R:S,5o:u(){k.N.8R.5o();if(k.N.3A){k.N.3A.2G()}},4w:u(){k.N.1R=S;k.N.2h=S;k.N.4y=k.N.1d.2y;if(k.N.1c.B(\'19\')==\'2B\'){if(k.N.1d.1f.fx){3m(k.N.1d.1f.fx.1u){1e\'c6\':k.N.1c.7a(k.N.1d.1f.fx.1m,k.N.5o);1r;1e\'1z\':k.N.1c.fq(k.N.1d.1f.fx.1m,k.N.5o);1r;1e\'a7\':k.N.1c.g3(k.N.1d.1f.fx.1m,k.N.5o);1r}}P{k.N.1c.2G()}if(k.N.1d.1f.3i)k.N.1d.1f.3i.1D(k.N.1d,[k.N.1c,k.N.3A])}P{k.N.5o()}1X.bH(k.N.2I)},dQ:u(){D 1d=k.N.1d;D 4d=k.N.aY(1d);if(1d&&4d.3o!=k.N.4y&&4d.3o.1g>=1d.1f.aL){k.N.4y=4d.3o;k.N.cl=4d.3o;81={2n:k(1d).1p(\'hj\')||\'2n\',2y:4d.3o};k.hl({1u:\'hk\',81:k.hf(81),he:u(fZ){1d.1f.4e=k(\'3o\',fZ);1N=1d.1f.4e.1N();if(1N>0){D 5p=\'\';1d.1f.4e.1E(u(2N){5p+=\'<8P 4I="\'+k(\'2y\',q).3g()+\'" 8K="\'+2N+\'" 14="9b: ad;">\'+k(\'3g\',q).3g()+\'</8P>\'});if(1d.1f.aU){D 3M=k(\'2y\',1d.1f.4e.K(0)).3g();1d.2y=4d.3j+3M+1d.1f.3N+4d.66;k.N.6J(1d,4d.3o.1g!=3M.1g?(4d.3j.1g+4d.3o.1g):3M.1g,4d.3o.1g!=3M.1g?(4d.3j.1g+3M.1g):3M.1g)}if(1N>0){k.N.cj(1d,5p)}P{k.N.4w()}}P{k.N.4w()}},5N:1d.1f.aN})}},cj:u(1d,5p){k.N.8R.3x(5p);k.N.1R=k(\'8P\',k.N.8R.K(0));k.N.1R.9z(k.N.di).1J(\'5h\',k.N.dj);D Y=k.1a.3w(1d);D 1N=k.1a.2o(1d);k.N.1c.B(\'Q\',Y.y+1N.hb+\'U\').B(\'O\',Y.x+\'U\').2R(1d.1f.aM);if(k.N.3A){k.N.3A.B(\'19\',\'2B\').B(\'Q\',Y.y+1N.hb+\'U\').B(\'O\',Y.x+\'U\').B(\'Z\',k.N.1c.B(\'Z\')).B(\'W\',k.N.1c.B(\'W\'))}k.N.2h=0;k.N.1R.K(0).3l=1d.1f.7H;k.N.8Q(1d,1d.1f.4e.K(0),\'7J\');if(k.N.1c.B(\'19\')==\'1o\'){if(1d.1f.bV){D cp=k.1a.aT(1d,1b);D cm=k.1a.6U(1d,1b);k.N.1c.B(\'Z\',1d.4c-(k.dF?(cp.l+cp.r+cm.l+cm.r):0)+\'U\')}if(1d.1f.fx){3m(1d.1f.fx.1u){1e\'c6\':k.N.1c.7f(1d.1f.fx.1m);1r;1e\'1z\':k.N.1c.fo(1d.1f.fx.1m);1r;1e\'a7\':k.N.1c.gb(1d.1f.fx.1m);1r}}P{k.N.1c.1Y()}if(k.N.1d.1f.2Y)k.N.1d.1f.2Y.1D(k.N.1d,[k.N.1c,k.N.3A])}},dO:u(){D 1d=q;if(1d.1f.4e){k.N.4y=1d.2y;k.N.cl=1d.2y;D 5p=\'\';1d.1f.4e.1E(u(2N){2y=k(\'2y\',q).3g().6c();fY=1d.2y.6c();if(2y.3J(fY)==0){5p+=\'<8P 4I="\'+k(\'2y\',q).3g()+\'" 8K="\'+2N+\'" 14="9b: ad;">\'+k(\'3g\',q).3g()+\'</8P>\'}});if(5p!=\'\'){k.N.cj(1d,5p);q.1f.9x=1b;E}}1d.1f.4e=S;q.1f.9x=I},6J:u(2n,26,2T){if(2n.b1){D 6t=2n.b1();6t.hp(1b);6t.dI("ck",26);6t.ha("ck",-2T+26);6t.8C()}P if(2n.aF){2n.aF(26,2T)}P{if(2n.5q){2n.5q=26;2n.dN=2T}}2n.6K()},f0:u(2n){if(2n.5q)E 2n.5q;P if(2n.b1){D 6t=1h.6J.dZ();D eX=6t.h9();E 0-eX.dI(\'ck\',-h6)}},aY:u(2n){D 4P={2y:2n.2y,3j:\'\',66:\'\',3o:\'\'};if(2n.1f.aQ){D 8N=I;D 5q=k.N.f0(2n)||0;D 4T=4P.2y.7C(2n.1f.3N);24(D i=0;i<4T.1g;i++){if((4P.3j.1g+4T[i].1g>=5q||5q==0)&&!8N){if(4P.3j.1g<=5q)4P.3o=4T[i];P 4P.66+=4T[i]+(4T[i]!=\'\'?2n.1f.3N:\'\');8N=1b}P if(8N){4P.66+=4T[i]+(4T[i]!=\'\'?2n.1f.3N:\'\')}if(!8N){4P.3j+=4T[i]+(4T.1g>1?2n.1f.3N:\'\')}}}P{4P.3o=4P.2y}E 4P},bU:u(e){1X.bH(k.N.2I);D 1d=k.N.aY(q);D 3K=e.7L||e.7K||-1;if(/13|27|35|36|38|40|9/.48(3K)&&k.N.1R){if(1X.2k){1X.2k.bT=1b;1X.2k.c0=I}P{e.aP();e.aW()}if(k.N.2h!=S)k.N.1R.K(k.N.2h||0).3l=\'\';P k.N.2h=-1;3m(3K){1e 9:1e 13:if(k.N.2h==-1)k.N.2h=0;D 2h=k.N.1R.K(k.N.2h||0);D 3M=2h.5C(\'4I\');q.2y=1d.3j+3M+q.1f.3N+1d.66;k.N.4y=1d.3o;k.N.6J(q,1d.3j.1g+3M.1g+q.1f.3N.1g,1d.3j.1g+3M.1g+q.1f.3N.1g);k.N.4w();if(q.1f.68){4u=T(2h.5C(\'8K\'))||0;k.N.8Q(q,q.1f.4e.K(4u),\'68\')}if(q.7W)q.7W(I);E 3K!=13;1r;1e 27:q.2y=1d.3j+k.N.4y+q.1f.3N+1d.66;q.1f.4e=S;k.N.4w();if(q.7W)q.7W(I);E I;1r;1e 35:k.N.2h=k.N.1R.1N()-1;1r;1e 36:k.N.2h=0;1r;1e 38:k.N.2h--;if(k.N.2h<0)k.N.2h=k.N.1R.1N()-1;1r;1e 40:k.N.2h++;if(k.N.2h==k.N.1R.1N())k.N.2h=0;1r}k.N.8Q(q,q.1f.4e.K(k.N.2h||0),\'7J\');k.N.1R.K(k.N.2h||0).3l=q.1f.7H;if(k.N.1R.K(k.N.2h||0).7W)k.N.1R.K(k.N.2h||0).7W(I);if(q.1f.aU){D aK=k.N.1R.K(k.N.2h||0).5C(\'4I\');q.2y=1d.3j+aK+q.1f.3N+1d.66;if(k.N.4y.1g!=aK.1g)k.N.6J(q,1d.3j.1g+k.N.4y.1g,1d.3j.1g+aK.1g)}E I}k.N.dO.1D(q);if(q.1f.9x==I){if(1d.3o!=k.N.4y&&1d.3o.1g>=q.1f.aL)k.N.2I=1X.9T(k.N.dQ,q.1f.54);if(k.N.1R){k.N.4w()}}E 1b},8Q:u(2n,3o,1u){if(2n.1f[1u]){D 81={};ar=3o.f3(\'*\');24(i=0;i<ar.1g;i++){81[ar[i].4Y]=ar[i].7c.h4}2n.1f[1u].1D(2n,[81])}},di:u(e){if(k.N.1R){if(k.N.2h!=S)k.N.1R.K(k.N.2h||0).3l=\'\';k.N.1R.K(k.N.2h||0).3l=\'\';k.N.2h=T(q.5C(\'8K\'))||0;k.N.1R.K(k.N.2h||0).3l=k.N.1d.1f.7H}},dj:u(2k){1X.bH(k.N.2I);2k=2k||k.2k.gS(1X.2k);2k.aP();2k.aW();D 1d=k.N.aY(k.N.1d);D 3M=q.5C(\'4I\');k.N.1d.2y=1d.3j+3M+k.N.1d.1f.3N+1d.66;k.N.4y=q.5C(\'4I\');k.N.6J(k.N.1d,1d.3j.1g+3M.1g+k.N.1d.1f.3N.1g,1d.3j.1g+3M.1g+k.N.1d.1f.3N.1g);k.N.4w();if(k.N.1d.1f.68){4u=T(q.5C(\'8K\'))||0;k.N.8Q(k.N.1d,k.N.1d.1f.4e.K(4u),\'68\')}E I},eJ:u(e){3K=e.7L||e.7K||-1;if(/13|27|35|36|38|40/.48(3K)&&k.N.1R){if(1X.2k){1X.2k.bT=1b;1X.2k.c0=I}P{e.aP();e.aW()}E I}},2r:u(M){if(!M.aN||!k.1a){E}if(!k.N.1c){if(k.3a.4t){k(\'2e\',1h).1S(\'<3A 14="19:1o;Y:1P;5E:9n:9w.9y.cC(1G=0);" id="ds" 2J="ek:I;" ej="0" ep="cD"></3A>\');k.N.3A=k(\'#ds\')}k(\'2e\',1h).1S(\'<22 id="dr" 14="Y: 1P; Q: 0; O: 0; z-cZ: h3; 19: 1o;"><9h 14="6w: 0;8F: 0; h1-14: 1o; z-cZ: h0;">&7k;</9h></22>\');k.N.1c=k(\'#dr\');k.N.8R=k(\'9h\',k.N.1c)}E q.1E(u(){if(q.4Y!=\'ch\'&&q.5C(\'1u\')!=\'3g\')E;q.1f={};q.1f.aN=M.aN;q.1f.aL=18.3S(T(M.aL)||1);q.1f.aM=M.aM?M.aM:\'\';q.1f.7H=M.7H?M.7H:\'\';q.1f.68=M.68&&M.68.1K==2A?M.68:S;q.1f.2Y=M.2Y&&M.2Y.1K==2A?M.2Y:S;q.1f.3i=M.3i&&M.3i.1K==2A?M.3i:S;q.1f.7J=M.7J&&M.7J.1K==2A?M.7J:S;q.1f.bV=M.bV||I;q.1f.aQ=M.aQ||I;q.1f.3N=q.1f.aQ?(M.3N||\', \'):\'\';q.1f.aU=M.aU?1b:I;q.1f.54=18.3S(T(M.54)||aC);if(M.fx&&M.fx.1K==7M){if(!M.fx.1u||!/c6|1z|a7/.48(M.fx.1u)){M.fx.1u=\'1z\'}if(M.fx.1u==\'1z\'&&!k.fx.1z)E;if(M.fx.1u==\'a7\'&&!k.fx.61)E;M.fx.1m=18.3S(T(M.fx.1m)||8J);if(M.fx.1m>q.1f.54){M.fx.1m=q.1f.54-2a}q.1f.fx=M.fx}q.1f.4e=S;q.1f.9x=I;k(q).1p(\'bU\',\'eN\').6K(u(){k.N.1d=q;k.N.4y=q.2y}).dH(k.N.eJ).6y(k.N.bU).5B(u(){k.N.2I=1X.9T(k.N.4w,hM)})})}};k.fn.hR=k.N.2r;k.1y={2I:S,4Q:S,29:S,2D:10,26:u(el,4J,2D,eG){k.1y.4Q=el;k.1y.29=4J;k.1y.2D=T(2D)||10;k.1y.2I=1X.6V(k.1y.eF,T(eG)||40)},eF:u(){24(i=0;i<k.1y.29.1g;i++){if(!k.1y.29[i].2X){k.1y.29[i].2X=k.23(k.1a.7G(k.1y.29[i]),k.1a.74(k.1y.29[i]),k.1a.6z(k.1y.29[i]))}P{k.1y.29[i].2X.t=k.1y.29[i].3d;k.1y.29[i].2X.l=k.1y.29[i].3c}if(k.1y.4Q.A&&k.1y.4Q.A.7q==1b){69={x:k.1y.4Q.A.2v,y:k.1y.4Q.A.2q,1C:k.1y.4Q.A.1B.1C,hb:k.1y.4Q.A.1B.hb}}P{69=k.23(k.1a.7G(k.1y.4Q),k.1a.74(k.1y.4Q))}if(k.1y.29[i].2X.t>0&&k.1y.29[i].2X.y+k.1y.29[i].2X.t>69.y){k.1y.29[i].3d-=k.1y.2D}P if(k.1y.29[i].2X.t<=k.1y.29[i].2X.h&&k.1y.29[i].2X.t+k.1y.29[i].2X.hb<69.y+69.hb){k.1y.29[i].3d+=k.1y.2D}if(k.1y.29[i].2X.l>0&&k.1y.29[i].2X.x+k.1y.29[i].2X.l>69.x){k.1y.29[i].3c-=k.1y.2D}P if(k.1y.29[i].2X.l<=k.1y.29[i].2X.hP&&k.1y.29[i].2X.l+k.1y.29[i].2X.1C<69.x+69.1C){k.1y.29[i].3c+=k.1y.2D}}},8o:u(){1X.5T(k.1y.2I);k.1y.4Q=S;k.1y.29=S;24(i in k.1y.29){k.1y.29[i].2X=S}}};k.11={1c:S,F:S,4U:u(){E q.1E(u(){if(q.9I){q.A.5e.3q(\'5v\',k.11.bN);q.A=S;q.9I=I;if(k.3a.4t){q.bE="eN"}P{q.14.hq=\'\';q.14.e1=\'\';q.14.e7=\'\'}}})},bN:u(e){if(k.11.F!=S){k.11.9A(e);E I}D C=q.3U;k(1h).1J(\'3D\',k.11.bX).1J(\'5P\',k.11.9A);C.A.1s=k.1a.4a(e);C.A.4B=C.A.1s;C.A.7q=I;C.A.ho=q!=q.3U;k.11.F=C;if(C.A.5i&&q!=q.3U){bS=k.1a.3w(C.31);bQ=k.1a.2o(C);bR={x:T(k.B(C,\'O\'))||0,y:T(k.B(C,\'Q\'))||0};dx=C.A.4B.x-bS.x-bQ.1C/2-bR.x;dy=C.A.4B.y-bS.y-bQ.hb/2-bR.y;k.3b.5c(C,[dx,dy])}E k.7n||I},ea:u(e){D C=k.11.F;C.A.7q=1b;D 9G=C.14;C.A.7V=k.B(C,\'19\');C.A.4n=k.B(C,\'Y\');if(!C.A.cz)C.A.cz=C.A.4n;C.A.2c={x:T(k.B(C,\'O\'))||0,y:T(k.B(C,\'Q\'))||0};C.A.9B=0;C.A.ai=0;if(k.3a.4t){D bW=k.1a.6U(C,1b);C.A.9B=bW.l||0;C.A.ai=bW.t||0}C.A.1B=k.23(k.1a.3w(C),k.1a.2o(C));if(C.A.4n!=\'2s\'&&C.A.4n!=\'1P\'){9G.Y=\'2s\'}k.11.1c.5o();D 5g=C.fI(1b);k(5g).B({19:\'2B\',O:\'2P\',Q:\'2P\'});5g.14.5K=\'0\';5g.14.5z=\'0\';5g.14.5k=\'0\';5g.14.5j=\'0\';k.11.1c.1S(5g);D 3Y=k.11.1c.K(0).14;if(C.A.bD){3Y.Z=\'9F\';3Y.W=\'9F\'}P{3Y.W=C.A.1B.hb+\'U\';3Y.Z=C.A.1B.1C+\'U\'}3Y.19=\'2B\';3Y.5K=\'2P\';3Y.5z=\'2P\';3Y.5k=\'2P\';3Y.5j=\'2P\';k.23(C.A.1B,k.1a.2o(5g));if(C.A.2V){if(C.A.2V.O){C.A.2c.x+=C.A.1s.x-C.A.1B.x-C.A.2V.O;C.A.1B.x=C.A.1s.x-C.A.2V.O}if(C.A.2V.Q){C.A.2c.y+=C.A.1s.y-C.A.1B.y-C.A.2V.Q;C.A.1B.y=C.A.1s.y-C.A.2V.Q}if(C.A.2V.2L){C.A.2c.x+=C.A.1s.x-C.A.1B.x-C.A.1B.hb+C.A.2V.2L;C.A.1B.x=C.A.1s.x-C.A.1B.1C+C.A.2V.2L}if(C.A.2V.4D){C.A.2c.y+=C.A.1s.y-C.A.1B.y-C.A.1B.hb+C.A.2V.4D;C.A.1B.y=C.A.1s.y-C.A.1B.hb+C.A.2V.4D}}C.A.2v=C.A.2c.x;C.A.2q=C.A.2c.y;if(C.A.8s||C.A.2p==\'94\'){8U=k.1a.6U(C.31,1b);C.A.1B.x=C.8t+(k.3a.4t?0:k.3a.7I?-8U.l:8U.l);C.A.1B.y=C.8G+(k.3a.4t?0:k.3a.7I?-8U.t:8U.t);k(C.31).1S(k.11.1c.K(0))}if(C.A.2p){k.11.c5(C);C.A.5t.2p=k.11.ce}if(C.A.5i){k.3b.ct(C)}3Y.O=C.A.1B.x-C.A.9B+\'U\';3Y.Q=C.A.1B.y-C.A.ai+\'U\';3Y.Z=C.A.1B.1C+\'U\';3Y.W=C.A.1B.hb+\'U\';k.11.F.A.9E=I;if(C.A.gx){C.A.5t.6a=k.11.c7}if(C.A.3I!=I){k.11.1c.B(\'3I\',C.A.3I)}if(C.A.1G){k.11.1c.B(\'1G\',C.A.1G);if(1X.71){k.11.1c.B(\'5E\',\'8V(1G=\'+C.A.1G*2a+\')\')}}if(C.A.7O){k.11.1c.2R(C.A.7O);k.11.1c.K(0).7c.14.19=\'1o\'}if(C.A.4o)C.A.4o.1D(C,[5g,C.A.2c.x,C.A.2c.y]);if(k.1x&&k.1x.8D>0){k.1x.ed(C)}if(C.A.46==I){9G.19=\'1o\'}E I},c5:u(C){if(C.A.2p.1K==b0){if(C.A.2p==\'94\'){C.A.28=k.23({x:0,y:0},k.1a.2o(C.31));D 8S=k.1a.6U(C.31,1b);C.A.28.w=C.A.28.1C-8S.l-8S.r;C.A.28.h=C.A.28.hb-8S.t-8S.b}P if(C.A.2p==\'1h\'){D bY=k.1a.bm();C.A.28={x:0,y:0,w:bY.w,h:bY.h}}}P if(C.A.2p.1K==7F){C.A.28={x:T(C.A.2p[0])||0,y:T(C.A.2p[1])||0,w:T(C.A.2p[2])||0,h:T(C.A.2p[3])||0}}C.A.28.dx=C.A.28.x-C.A.1B.x;C.A.28.dy=C.A.28.y-C.A.1B.y},9H:u(F){if(F.A.8s||F.A.2p==\'94\'){k(\'2e\',1h).1S(k.11.1c.K(0))}k.11.1c.5o().2G().B(\'1G\',1);if(1X.71){k.11.1c.B(\'5E\',\'8V(1G=2a)\')}},9A:u(e){k(1h).3q(\'3D\',k.11.bX).3q(\'5P\',k.11.9A);if(k.11.F==S){E}D F=k.11.F;k.11.F=S;if(F.A.7q==I){E I}if(F.A.44==1b){k(F).B(\'Y\',F.A.4n)}D 9G=F.14;if(F.5i){k.11.1c.B(\'9b\',\'8j\')}if(F.A.7O){k.11.1c.4i(F.A.7O)}if(F.A.6N==I){if(F.A.fx>0){if(!F.A.1O||F.A.1O==\'4j\'){D x=12 k.fx(F,{1m:F.A.fx},\'O\');x.1L(F.A.2c.x,F.A.8y)}if(!F.A.1O||F.A.1O==\'49\'){D y=12 k.fx(F,{1m:F.A.fx},\'Q\');y.1L(F.A.2c.y,F.A.8v)}}P{if(!F.A.1O||F.A.1O==\'4j\')F.14.O=F.A.8y+\'U\';if(!F.A.1O||F.A.1O==\'49\')F.14.Q=F.A.8v+\'U\'}k.11.9H(F);if(F.A.46==I){k(F).B(\'19\',F.A.7V)}}P if(F.A.fx>0){F.A.9E=1b;D dh=I;if(k.1x&&k.1t&&F.A.44){dh=k.1a.3w(k.1t.1c.K(0))}k.11.1c.5w({O:dh?dh.x:F.A.1B.x,Q:dh?dh.y:F.A.1B.y},F.A.fx,u(){F.A.9E=I;if(F.A.46==I){F.14.19=F.A.7V}k.11.9H(F)})}P{k.11.9H(F);if(F.A.46==I){k(F).B(\'19\',F.A.7V)}}if(k.1x&&k.1x.8D>0){k.1x.eO(F)}if(k.1t&&F.A.44){k.1t.fC(F)}if(F.A.2Z&&(F.A.8y!=F.A.2c.x||F.A.8v!=F.A.2c.y)){F.A.2Z.1D(F,F.A.b3||[0,0,F.A.8y,F.A.8v])}if(F.A.3T)F.A.3T.1D(F);E I},c7:u(x,y,dx,dy){if(dx!=0)dx=T((dx+(q.A.gx*dx/18.3S(dx))/2)/q.A.gx)*q.A.gx;if(dy!=0)dy=T((dy+(q.A.gy*dy/18.3S(dy))/2)/q.A.gy)*q.A.gy;E{dx:dx,dy:dy,x:0,y:0}},ce:u(x,y,dx,dy){dx=18.3L(18.3r(dx,q.A.28.dx),q.A.28.w+q.A.28.dx-q.A.1B.1C);dy=18.3L(18.3r(dy,q.A.28.dy),q.A.28.h+q.A.28.dy-q.A.1B.hb);E{dx:dx,dy:dy,x:0,y:0}},bX:u(e){if(k.11.F==S||k.11.F.A.9E==1b){E}D F=k.11.F;F.A.4B=k.1a.4a(e);if(F.A.7q==I){45=18.ez(18.6b(F.A.1s.x-F.A.4B.x,2)+18.6b(F.A.1s.y-F.A.4B.y,2));if(45<F.A.6M){E}P{k.11.ea(e)}}D dx=F.A.4B.x-F.A.1s.x;D dy=F.A.4B.y-F.A.1s.y;24(D i in F.A.5t){D 3y=F.A.5t[i].1D(F,[F.A.2c.x+dx,F.A.2c.y+dy,dx,dy]);if(3y&&3y.1K==7M){dx=i!=\'7R\'?3y.dx:(3y.x-F.A.2c.x);dy=i!=\'7R\'?3y.dy:(3y.y-F.A.2c.y)}}F.A.2v=F.A.1B.x+dx-F.A.9B;F.A.2q=F.A.1B.y+dy-F.A.ai;if(F.A.5i&&(F.A.3H||F.A.2Z)){k.3b.3H(F,F.A.2v,F.A.2q)}if(F.A.4m)F.A.4m.1D(F,[F.A.2c.x+dx,F.A.2c.y+dy]);if(!F.A.1O||F.A.1O==\'4j\'){F.A.8y=F.A.2c.x+dx;k.11.1c.K(0).14.O=F.A.2v+\'U\'}if(!F.A.1O||F.A.1O==\'49\'){F.A.8v=F.A.2c.y+dy;k.11.1c.K(0).14.Q=F.A.2q+\'U\'}if(k.1x&&k.1x.8D>0){k.1x.al(F)}E I},2r:u(o){if(!k.11.1c){k(\'2e\',1h).1S(\'<22 id="e8"></22>\');k.11.1c=k(\'#e8\');D el=k.11.1c.K(0);D 4J=el.14;4J.Y=\'1P\';4J.19=\'1o\';4J.9b=\'8j\';4J.eu=\'1o\';4J.2U=\'2K\';if(1X.71){el.bE="e4"}P{4J.gi=\'1o\';4J.e7=\'1o\';4J.e1=\'1o\'}}if(!o){o={}}E q.1E(u(){if(q.9I||!k.1a)E;if(1X.71){q.gh=u(){E I};q.gj=u(){E I}}D el=q;D 5e=o.3v?k(q).gf(o.3v):k(q);if(k.3a.4t){5e.1E(u(){q.bE="e4"})}P{5e.B(\'-gI-7R-8C\',\'1o\');5e.B(\'7R-8C\',\'1o\');5e.B(\'-gH-7R-8C\',\'1o\')}q.A={5e:5e,6N:o.6N?1b:I,46:o.46?1b:I,44:o.44?o.44:I,5i:o.5i?o.5i:I,8s:o.8s?o.8s:I,3I:o.3I?T(o.3I)||0:I,1G:o.1G?2m(o.1G):I,fx:T(o.fx)||S,6R:o.6R?o.6R:I,5t:{},1s:{},4o:o.4o&&o.4o.1K==2A?o.4o:I,3T:o.3T&&o.3T.1K==2A?o.3T:I,2Z:o.2Z&&o.2Z.1K==2A?o.2Z:I,1O:/49|4j/.48(o.1O)?o.1O:I,6M:o.6M?T(o.6M)||0:0,2V:o.2V?o.2V:I,bD:o.bD?1b:I,7O:o.7O||I};if(o.5t&&o.5t.1K==2A)q.A.5t.7R=o.5t;if(o.4m&&o.4m.1K==2A)q.A.4m=o.4m;if(o.2p&&((o.2p.1K==b0&&(o.2p==\'94\'||o.2p==\'1h\'))||(o.2p.1K==7F&&o.2p.1g==4))){q.A.2p=o.2p}if(o.2O){q.A.2O=o.2O}if(o.6a){if(2g o.6a==\'gz\'){q.A.gx=T(o.6a)||1;q.A.gy=T(o.6a)||1}P if(o.6a.1g==2){q.A.gx=T(o.6a[0])||1;q.A.gy=T(o.6a[1])||1}}if(o.3H&&o.3H.1K==2A){q.A.3H=o.3H}q.9I=1b;5e.1E(u(){q.3U=el});5e.1J(\'5v\',k.11.bN)})}};k.fn.23({aS:k.11.4U,7t:k.11.2r});k.1x={du:u(5J,5G,7Q,7S){E 5J<=k.11.F.A.2v&&(5J+7Q)>=(k.11.F.A.2v+k.11.F.A.1B.w)&&5G<=k.11.F.A.2q&&(5G+7S)>=(k.11.F.A.2q+k.11.F.A.1B.h)?1b:I},cV:u(5J,5G,7Q,7S){E!(5J>(k.11.F.A.2v+k.11.F.A.1B.w)||(5J+7Q)<k.11.F.A.2v||5G>(k.11.F.A.2q+k.11.F.A.1B.h)||(5G+7S)<k.11.F.A.2q)?1b:I},1s:u(5J,5G,7Q,7S){E 5J<k.11.F.A.4B.x&&(5J+7Q)>k.11.F.A.4B.x&&5G<k.11.F.A.4B.y&&(5G+7S)>k.11.F.A.4B.y?1b:I},5r:I,3Q:{},8D:0,3P:{},ed:u(C){if(k.11.F==S){E}D i;k.1x.3Q={};D bJ=I;24(i in k.1x.3P){if(k.1x.3P[i]!=S){D 1j=k.1x.3P[i].K(0);if(k(k.11.F).is(\'.\'+1j.1i.a)){if(1j.1i.m==I){1j.1i.p=k.23(k.1a.7G(1j),k.1a.74(1j));1j.1i.m=1b}if(1j.1i.ac){k.1x.3P[i].2R(1j.1i.ac)}k.1x.3Q[i]=k.1x.3P[i];if(k.1t&&1j.1i.s&&k.11.F.A.44){1j.1i.el=k(\'.\'+1j.1i.a,1j);C.14.19=\'1o\';k.1t.cT(1j);1j.1i.ay=k.1t.8x(k.1p(1j,\'id\')).7l;C.14.19=C.A.7V;bJ=1b}if(1j.1i.9i){1j.1i.9i.1D(k.1x.3P[i].K(0),[k.11.F])}}}}if(bJ){k.1t.26()}},dS:u(){k.1x.3Q={};24(i in k.1x.3P){if(k.1x.3P[i]!=S){D 1j=k.1x.3P[i].K(0);if(k(k.11.F).is(\'.\'+1j.1i.a)){1j.1i.p=k.23(k.1a.7G(1j),k.1a.74(1j));if(1j.1i.ac){k.1x.3P[i].2R(1j.1i.ac)}k.1x.3Q[i]=k.1x.3P[i];if(k.1t&&1j.1i.s&&k.11.F.A.44){1j.1i.el=k(\'.\'+1j.1i.a,1j);C.14.19=\'1o\';k.1t.cT(1j);C.14.19=C.A.7V}}}}},al:u(e){if(k.11.F==S){E}k.1x.5r=I;D i;D bK=I;D eQ=0;24(i in k.1x.3Q){D 1j=k.1x.3Q[i].K(0);if(k.1x.5r==I&&k.1x[1j.1i.t](1j.1i.p.x,1j.1i.p.y,1j.1i.p.1C,1j.1i.p.hb)){if(1j.1i.hc&&1j.1i.h==I){k.1x.3Q[i].2R(1j.1i.hc)}if(1j.1i.h==I&&1j.1i.7x){bK=1b}1j.1i.h=1b;k.1x.5r=1j;if(k.1t&&1j.1i.s&&k.11.F.A.44){k.1t.1c.K(0).3l=1j.1i.eV;k.1t.al(1j)}eQ++}P if(1j.1i.h==1b){if(1j.1i.7y){1j.1i.7y.1D(1j,[e,k.11.1c.K(0).7c,1j.1i.fx])}if(1j.1i.hc){k.1x.3Q[i].4i(1j.1i.hc)}1j.1i.h=I}}if(k.1t&&!k.1x.5r&&k.11.F.44){k.1t.1c.K(0).14.19=\'1o\'}if(bK){k.1x.5r.1i.7x.1D(k.1x.5r,[e,k.11.1c.K(0).7c])}},eO:u(e){D i;24(i in k.1x.3Q){D 1j=k.1x.3Q[i].K(0);if(1j.1i.ac){k.1x.3Q[i].4i(1j.1i.ac)}if(1j.1i.hc){k.1x.3Q[i].4i(1j.1i.hc)}if(1j.1i.s){k.1t.7s[k.1t.7s.1g]=i}if(1j.1i.9l&&1j.1i.h==1b){1j.1i.h=I;1j.1i.9l.1D(1j,[e,1j.1i.fx])}1j.1i.m=I;1j.1i.h=I}k.1x.3Q={}},4U:u(){E q.1E(u(){if(q.9j){if(q.1i.s){id=k.1p(q,\'id\');k.1t.5L[id]=S;k(\'.\'+q.1i.a,q).aS()}k.1x.3P[\'d\'+q.c2]=S;q.9j=I;q.f=S}})},2r:u(o){E q.1E(u(){if(q.9j==1b||!o.3C||!k.1a||!k.11){E}q.1i={a:o.3C,ac:o.9J||I,hc:o.a5||I,eV:o.58||I,9l:o.gq||o.9l||I,7x:o.7x||o.dC||I,7y:o.7y||o.fO||I,9i:o.9i||I,t:o.6I&&(o.6I==\'du\'||o.6I==\'cV\')?o.6I:\'1s\',fx:o.fx?o.fx:I,m:I,h:I};if(o.cQ==1b&&k.1t){id=k.1p(q,\'id\');k.1t.5L[id]=q.1i.a;q.1i.s=1b;if(o.2Z){q.1i.2Z=o.2Z;q.1i.ay=k.1t.8x(id).7l}}q.9j=1b;q.c2=T(18.6o()*c9);k.1x.3P[\'d\'+q.c2]=k(q);k.1x.8D++})}};k.fn.23({dR:k.1x.4U,do:k.1x.2r});k.gD=k.1x.dS;k.3B={1c:S,8L:u(){3g=q.2y;if(!3g)E;14={dz:k(q).B(\'dz\')||\'\',4A:k(q).B(\'4A\')||\'\',8Z:k(q).B(\'8Z\')||\'\',dP:k(q).B(\'dP\')||\'\',dT:k(q).B(\'dT\')||\'\',dU:k(q).B(\'dU\')||\'\',c3:k(q).B(\'c3\')||\'\',dY:k(q).B(\'dY\')||\'\'};k.3B.1c.B(14);3x=k.3B.dX(3g);3x=3x.4E(12 bb("\\\\n","g"),"<br />");k.3B.1c.3x(\'gL\');ci=k.3B.1c.K(0).4c;k.3B.1c.3x(3x);Z=k.3B.1c.K(0).4c+ci;if(q.6l.2M&&Z>q.6l.2M[0]){Z=q.6l.2M[0]}q.14.Z=Z+\'U\';if(q.4Y==\'cf\'){W=k.3B.1c.K(0).5W+ci;if(q.6l.2M&&W>q.6l.2M[1]){W=q.6l.2M[1]}q.14.W=W+\'U\'}},dX:u(3g){cg={\'&\':\'&gK;\',\'<\':\'&gJ;\',\'>\':\'&gt;\',\'"\':\'&gs;\'};24(i in cg){3g=3g.4E(12 bb(i,\'g\'),cg[i])}E 3g},2r:u(2M){if(k.3B.1c==S){k(\'2e\',1h).1S(\'<22 id="dE" 14="Y: 1P; Q: 0; O: 0; 3n: 2K;"></22>\');k.3B.1c=k(\'#dE\')}E q.1E(u(){if(/cf|ch/.48(q.4Y)){if(q.4Y==\'ch\'){dB=q.5C(\'1u\');if(!/3g|gr/.48(dB)){E}}if(2M&&(2M.1K==bn||(2M.1K==7F&&2M.1g==2))){if(2M.1K==bn)2M=[2M,2M];P{2M[0]=T(2M[0])||8J;2M[1]=T(2M[1])||8J}q.6l={2M:2M}}k(q).5B(k.3B.8L).6y(k.3B.8L).dH(k.3B.8L);k.3B.8L.1D(q)}})}};k.fn.kc=k.3B.2r;k.4K=u(e){if(/^kd$|^ke$|^ka$|^6L$|^k9$|^k5$|^k4$|^k6$|^k7$|^2e$|^k8$|^kf$|^kg$|^kn$|^ko$|^kp$|^kq$/i.48(e.9N))E I;P E 1b};k.fx.a0=u(e,65){D c=e.7c;D cs=c.14;cs.Y=65.Y;cs.5K=65.3G.t;cs.5j=65.3G.l;cs.5k=65.3G.b;cs.5z=65.3G.r;cs.Q=65.Q+\'U\';cs.O=65.O+\'U\';e.31.ew(c,e);e.31.km(e)};k.fx.9P=u(e){if(!k.4K(e))E I;D t=k(e);D es=e.14;D 73=I;if(t.B(\'19\')==\'1o\'){5Y=t.B(\'3n\');t.B(\'3n\',\'2K\').1Y();73=1b}D V={};V.Y=t.B(\'Y\');V.1q=k.1a.2o(e);V.3G=k.1a.cy(e);D co=e.4Z?e.4Z.ei:t.B(\'hU\');V.Q=T(t.B(\'Q\'))||0;V.O=T(t.B(\'O\'))||0;D eo=\'kl\'+T(18.6o()*c9);D 6u=1h.3F(/^1T$|^br$|^kh$|^hr$|^8C$|^kj$|^8T$|^3A$|^kk$|^k3$|^k2$|^9h$|^dl$|^jM$/i.48(e.9N)?\'22\':e.9N);k.1p(6u,\'id\',eo);D jN=k(6u).2R(\'jO\');D 4h=6u.14;D Q=0;D O=0;if(V.Y==\'2s\'||V.Y==\'1P\'){Q=V.Q;O=V.O}4h.Q=Q+\'U\';4h.O=O+\'U\';4h.Y=V.Y!=\'2s\'&&V.Y!=\'1P\'?\'2s\':V.Y;4h.W=V.1q.hb+\'U\';4h.Z=V.1q.1C+\'U\';4h.5K=V.3G.t;4h.5z=V.3G.r;4h.5k=V.3G.b;4h.5j=V.3G.l;4h.2U=\'2K\';if(k.3a.4t){4h.ei=co}P{4h.jK=co}if(k.3a=="4t"){es.5E="8V(1G="+0.ex*2a+")"}es.1G=0.ex;e.31.ew(6u,e);6u.jF(e);es.5K=\'2P\';es.5z=\'2P\';es.5k=\'2P\';es.5j=\'2P\';es.Y=\'1P\';es.eu=\'1o\';es.Q=\'2P\';es.O=\'2P\';if(73){t.2G();es.3n=5Y}E{V:V,3p:k(6u)}};k.fx.8E={jE:[0,1V,1V],jG:[eD,1V,1V],jH:[e6,e6,jI],jP:[0,0,0],ks:[0,0,1V],jY:[dv,42,42],jZ:[0,1V,1V],k0:[0,0,7w],k1:[0,7w,7w],jX:[cn,cn,cn],jS:[0,2a,0],jR:[jT,jU,eb],jV:[7w,0,7w],kr:[85,eb,47],kP:[1V,eA,0],kN:[kO,50,kx],kF:[7w,0,0],kD:[ku,f8,kt],ky:[kH,0,9C],kL:[1V,0,1V],kM:[1V,kJ,0],kv:[0,6C,0],kA:[75,0,kE],kC:[eD,eB,eA],kG:[kI,kB,eB],kw:[e0,1V,1V],kz:[eL,kK,eL],kQ:[9C,9C,9C],jC:[1V,iy,iz],iA:[1V,1V,e0],iB:[0,1V,0],ix:[1V,0,1V],iv:[6C,0,0],iq:[0,0,6C],ip:[6C,6C,0],ir:[1V,dv,0],it:[1V,ah,iu],iC:[6C,0,6C],iD:[1V,0,0],iK:[ah,ah,ah],iL:[1V,1V,1V],iM:[1V,1V,0]};k.fx.6D=u(4x,dm){if(k.fx.8E[4x])E{r:k.fx.8E[4x][0],g:k.fx.8E[4x][1],b:k.fx.8E[4x][2]};P if(2W=/^6Y\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)$/.a4(4x))E{r:T(2W[1]),g:T(2W[2]),b:T(2W[3])};P if(2W=/6Y\\(\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*\\)$/.a4(4x))E{r:2m(2W[1])*2.55,g:2m(2W[2])*2.55,b:2m(2W[3])*2.55};P if(2W=/^#([a-fA-79-9])([a-fA-79-9])([a-fA-79-9])$/.a4(4x))E{r:T("77"+2W[1]+2W[1]),g:T("77"+2W[2]+2W[2]),b:T("77"+2W[3]+2W[3])};P if(2W=/^#([a-fA-79-9]{2})([a-fA-79-9]{2})([a-fA-79-9]{2})$/.a4(4x))E{r:T("77"+2W[1]),g:T("77"+2W[2]),b:T("77"+2W[3])};P E dm==1b?I:{r:1V,g:1V,b:1V}};k.fx.dD={5Q:1,5b:1,5O:1,4S:1,4D:1,4A:1,W:1,O:1,c3:1,iI:1,5k:1,5j:1,5z:1,5K:1,8b:1,6x:1,8c:1,av:1,1G:1,iE:1,iF:1,5n:1,4X:1,5U:1,5M:1,2L:1,jD:1,Q:1,Z:1,3I:1};k.fx.dA={7i:1,iG:1,iH:1,io:1,im:1,4x:1,i2:1};k.fx.8A=[\'i3\',\'i4\',\'i5\',\'i1\'];k.fx.cc={\'cd\':[\'2E\',\'dK\'],\'a8\':[\'2E\',\'bh\'],\'6w\':[\'6w\',\'\'],\'8F\':[\'8F\',\'\']};k.fn.23({5w:u(5X,H,G,J){E q.1w(u(){D a1=k.H(H,G,J);D e=12 k.dM(q,a1,5X)})},c4:u(H,J){E q.1w(u(){D a1=k.H(H,J);D e=12 k.c4(q,a1)})},8o:u(2D){E q.1E(u(){if(q.6d)k.by(q,2D)})},i0:u(2D){E q.1E(u(){if(q.6d)k.by(q,2D);if(q.1w&&q.1w[\'fx\'])q.1w.fx=[]})}});k.23({c4:u(2f,M){D z=q,3t;z.2D=u(){if(k.fQ(M.21))M.21.1D(2f)};z.2I=6V(u(){z.2D()},M.1m);2f.6d=z},G:{c8:u(p,n,1W,1H,1m){E((-18.5H(p*18.2Q)/2)+0.5)*1H+1W}},dM:u(2f,M,5X){D z=q,3t;D y=2f.14;D fR=k.B(2f,"2U");D 72=k.B(2f,"19");D 2j={};z.9O=(12 7g()).7z();M.G=M.G&&k.G[M.G]?M.G:\'c8\';z.ag=u(2w,43){if(k.fx.dD[2w]){if(43==\'1Y\'||43==\'2G\'||43==\'3R\'){if(!2f.6v)2f.6v={};D r=2m(k.6E(2f,2w));2f.6v[2w]=r&&r>-c9?r:(2m(k.B(2f,2w))||0);43=43==\'3R\'?(72==\'1o\'?\'1Y\':\'2G\'):43;M[43]=1b;2j[2w]=43==\'1Y\'?[0,2f.6v[2w]]:[2f.6v[2w],0];if(2w!=\'1G\')y[2w]=2j[2w][0]+(2w!=\'3I\'&&2w!=\'8Z\'?\'U\':\'\');P k.1p(y,"1G",2j[2w][0])}P{2j[2w]=[2m(k.6E(2f,2w)),2m(43)||0]}}P if(k.fx.dA[2w])2j[2w]=[k.fx.6D(k.6E(2f,2w)),k.fx.6D(43)];P if(/^6w$|8F$|2E$|a8$|cd$/i.48(2w)){D m=43.4E(/\\s+/g,\' \').4E(/6Y\\s*\\(\\s*/g,\'6Y(\').4E(/\\s*,\\s*/g,\',\').4E(/\\s*\\)/g,\')\').d5(/([^\\s]+)/g);3m(2w){1e\'6w\':1e\'8F\':1e\'cd\':1e\'a8\':m[3]=m[3]||m[1]||m[0];m[2]=m[2]||m[0];m[1]=m[1]||m[0];24(D i=0;i<k.fx.8A.1g;i++){D 64=k.fx.cc[2w][0]+k.fx.8A[i]+k.fx.cc[2w][1];2j[64]=2w==\'a8\'?[k.fx.6D(k.6E(2f,64)),k.fx.6D(m[i])]:[2m(k.6E(2f,64)),2m(m[i])]}1r;1e\'2E\':24(D i=0;i<m.1g;i++){D bd=2m(m[i]);D a9=!hX(bd)?\'dK\':(!/cu|1o|2K|hY|hZ|i6|i7|ii|ij|ik|il/i.48(m[i])?\'bh\':I);if(a9){24(D j=0;j<k.fx.8A.1g;j++){64=\'2E\'+k.fx.8A[j]+a9;2j[64]=a9==\'bh\'?[k.fx.6D(k.6E(2f,64)),k.fx.6D(m[i])]:[2m(k.6E(2f,64)),bd]}}P{y[\'ie\']=m[i]}}1r}}P{y[2w]=43}E I};24(p in 5X){if(p==\'14\'){D 5f=k.bl(5X[p]);24(7A in 5f){q.ag(7A,5f[7A])}}P if(p==\'3l\'){if(1h.af)24(D i=0;i<1h.af.1g;i++){D 7e=1h.af[i].7e||1h.af[i].i9||S;if(7e){24(D j=0;j<7e.1g;j++){if(7e[j].i8==\'.\'+5X[p]){D 6X=12 bb(\'\\.\'+5X[p]+\' {\');D 5Z=7e[j].14.9X;D 5f=k.bl(5Z.4E(6X,\'\').4E(/}/g,\'\'));24(7A in 5f){q.ag(7A,5f[7A])}}}}}}P{q.ag(p,5X[p])}}y.19=72==\'1o\'?\'2B\':72;y.2U=\'2K\';z.2D=u(){D t=(12 7g()).7z();if(t>M.1m+z.9O){5T(z.2I);z.2I=S;24(p in 2j){if(p=="1G")k.1p(y,"1G",2j[p][1]);P if(2g 2j[p][1]==\'8T\')y[p]=\'6Y(\'+2j[p][1].r+\',\'+2j[p][1].g+\',\'+2j[p][1].b+\')\';P y[p]=2j[p][1]+(p!=\'3I\'&&p!=\'8Z\'?\'U\':\'\')}if(M.2G||M.1Y)24(D p in 2f.6v)if(p=="1G")k.1p(y,p,2f.6v[p]);P y[p]="";y.19=M.2G?\'1o\':(72!=\'1o\'?72:\'2B\');y.2U=fR;2f.6d=S;if(k.fQ(M.21))M.21.1D(2f)}P{D n=t-q.9O;D 8w=n/M.1m;24(p in 2j){if(2g 2j[p][1]==\'8T\'){y[p]=\'6Y(\'+T(k.G[M.G](8w,n,2j[p][0].r,(2j[p][1].r-2j[p][0].r),M.1m))+\',\'+T(k.G[M.G](8w,n,2j[p][0].g,(2j[p][1].g-2j[p][0].g),M.1m))+\',\'+T(k.G[M.G](8w,n,2j[p][0].b,(2j[p][1].b-2j[p][0].b),M.1m))+\')\'}P{D bz=k.G[M.G](8w,n,2j[p][0],(2j[p][1]-2j[p][0]),M.1m);if(p=="1G")k.1p(y,"1G",bz);P y[p]=bz+(p!=\'3I\'&&p!=\'8Z\'?\'U\':\'\')}}}};z.2I=6V(u(){z.2D()},13);2f.6d=z},by:u(2f,2D){if(2D)2f.6d.9O-=iO;P{1X.5T(2f.6d.2I);2f.6d=S;k.2H(2f,"fx")}}});k.bl=u(5Z){D 5f={};if(2g 5Z==\'4V\'){5Z=5Z.6c().7C(\';\');24(D i=0;i<5Z.1g;i++){6X=5Z[i].7C(\':\');if(6X.1g==2){5f[k.g6(6X[0].4E(/\\-(\\w)/g,u(m,c){E c.jo()}))]=k.g6(6X[1])}}}E 5f};k.fn.23({g3:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.61(q,H,J,\'4F\',G)})},gb:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.61(q,H,J,\'4r\',G)})},jl:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.61(q,H,J,\'fJ\',G)})},jk:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.61(q,H,J,\'O\',G)})},jg:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.61(q,H,J,\'2L\',G)})},jf:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.61(q,H,J,\'fh\',G)})}});k.fx.61=u(e,H,J,2S,G){if(!k.4K(e)){k.2H(e,\'1n\');E I}D z=q;z.el=k(e);z.1N=k.1a.2o(e);z.G=2g J==\'4V\'?J:G||S;if(!e.4s)e.4s=z.el.B(\'19\');if(2S==\'fJ\'){2S=z.el.B(\'19\')==\'1o\'?\'4r\':\'4F\'}P if(2S==\'fh\'){2S=z.el.B(\'19\')==\'1o\'?\'2L\':\'O\'}z.el.1Y();z.H=H;z.J=2g J==\'u\'?J:S;z.fx=k.fx.9P(e);z.2S=2S;z.21=u(){if(z.J&&z.J.1K==2A){z.J.1D(z.el.K(0))}if(z.2S==\'4r\'||z.2S==\'2L\'){z.el.B(\'19\',z.el.K(0).4s==\'1o\'?\'2B\':z.el.K(0).4s)}P{z.el.2G()}k.fx.a0(z.fx.3p.K(0),z.fx.V);k.2H(z.el.K(0),\'1n\')};3m(z.2S){1e\'4F\':63=12 k.fx(z.fx.3p.K(0),k.H(z.H,z.G,z.21),\'W\');63.1L(z.fx.V.1q.hb,0);1r;1e\'4r\':z.fx.3p.B(\'W\',\'9R\');z.el.1Y();63=12 k.fx(z.fx.3p.K(0),k.H(z.H,z.G,z.21),\'W\');63.1L(0,z.fx.V.1q.hb);1r;1e\'O\':63=12 k.fx(z.fx.3p.K(0),k.H(z.H,z.G,z.21),\'Z\');63.1L(z.fx.V.1q.1C,0);1r;1e\'2L\':z.fx.3p.B(\'Z\',\'9R\');z.el.1Y();63=12 k.fx(z.fx.3p.K(0),k.H(z.H,z.G,z.21),\'Z\');63.1L(0,z.fx.V.1q.1C);1r}};k.fn.ji=u(5D,J){E q.1w(\'1n\',u(){if(!k.4K(q)){k.2H(q,\'1n\');E I}D e=12 k.fx.f4(q,5D,J);e.bp()})};k.fx.f4=u(e,5D,J){D z=q;z.el=k(e);z.el.1Y();z.J=J;z.5D=T(5D)||40;z.V={};z.V.Y=z.el.B(\'Y\');z.V.Q=T(z.el.B(\'Q\'))||0;z.V.O=T(z.el.B(\'O\'))||0;if(z.V.Y!=\'2s\'&&z.V.Y!=\'1P\'){z.el.B(\'Y\',\'2s\')}z.3V=5;z.5y=1;z.bp=u(){z.5y++;z.e=12 k.fx(z.el.K(0),{1m:jj,21:u(){z.e=12 k.fx(z.el.K(0),{1m:80,21:u(){z.5D=T(z.5D/2);if(z.5y<=z.3V)z.bp();P{z.el.B(\'Y\',z.V.Y).B(\'Q\',z.V.Q+\'U\').B(\'O\',z.V.O+\'U\');k.2H(z.el.K(0),\'1n\');if(z.J&&z.J.1K==2A){z.J.1D(z.el.K(0))}}}},\'Q\');z.e.1L(z.V.Q-z.5D,z.V.Q)}},\'Q\');z.e.1L(z.V.Q,z.V.Q-z.5D)}};k.fn.23({jy:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.4f(q,H,J,\'4r\',\'4l\',G)})},jz:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.4f(q,H,J,\'4r\',\'in\',G)})},jA:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.4f(q,H,J,\'4r\',\'3R\',G)})},jB:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.4f(q,H,J,\'4F\',\'4l\',G)})},jx:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.4f(q,H,J,\'4F\',\'in\',G)})},jw:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.4f(q,H,J,\'4F\',\'3R\',G)})},js:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.4f(q,H,J,\'O\',\'4l\',G)})},jt:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.4f(q,H,J,\'O\',\'in\',G)})},ju:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.4f(q,H,J,\'O\',\'3R\',G)})},jv:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.4f(q,H,J,\'2L\',\'4l\',G)})},je:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.4f(q,H,J,\'2L\',\'in\',G)})},jd:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.4f(q,H,J,\'2L\',\'3R\',G)})}});k.fx.4f=u(e,H,J,2S,1u,G){if(!k.4K(e)){k.2H(e,\'1n\');E I}D z=q;z.el=k(e);z.G=2g J==\'4V\'?J:G||S;z.V={};z.V.Y=z.el.B(\'Y\');z.V.Q=z.el.B(\'Q\');z.V.O=z.el.B(\'O\');if(!e.4s)e.4s=z.el.B(\'19\');if(1u==\'3R\'){1u=z.el.B(\'19\')==\'1o\'?\'in\':\'4l\'}z.el.1Y();if(z.V.Y!=\'2s\'&&z.V.Y!=\'1P\'){z.el.B(\'Y\',\'2s\')}z.1u=1u;J=2g J==\'u\'?J:S;8H=1;3m(2S){1e\'4F\':z.e=12 k.fx(z.el.K(0),k.H(H-15,z.G,J),\'Q\');z.62=2m(z.V.Q)||0;z.9K=z.fG;8H=-1;1r;1e\'4r\':z.e=12 k.fx(z.el.K(0),k.H(H-15,z.G,J),\'Q\');z.62=2m(z.V.Q)||0;z.9K=z.fG;1r;1e\'2L\':z.e=12 k.fx(z.el.K(0),k.H(H-15,z.G,J),\'O\');z.62=2m(z.V.O)||0;z.9K=z.fy;1r;1e\'O\':z.e=12 k.fx(z.el.K(0),k.H(H-15,z.G,J),\'O\');z.62=2m(z.V.O)||0;z.9K=z.fy;8H=-1;1r}z.e2=12 k.fx(z.el.K(0),k.H(H,z.G,u(){z.el.B(z.V);if(z.1u==\'4l\'){z.el.B(\'19\',\'1o\')}P z.el.B(\'19\',z.el.K(0).4s==\'1o\'?\'2B\':z.el.K(0).4s);k.2H(z.el.K(0),\'1n\')}),\'1G\');if(1u==\'in\'){z.e.1L(z.62+2a*8H,z.62);z.e2.1L(0,1)}P{z.e.1L(z.62,z.62+2a*8H);z.e2.1L(1,0)}};k.fn.23({j0:u(H,W,J,G){E q.1w(\'1n\',u(){12 k.fx.9L(q,H,W,J,\'fp\',G)})},iW:u(H,W,J,G){E q.1w(\'1n\',u(){12 k.fx.9L(q,H,W,J,\'9M\',G)})},iV:u(H,W,J,G){E q.1w(\'1n\',u(){12 k.fx.9L(q,H,W,J,\'3R\',G)})}});k.fx.9L=u(e,H,W,J,1u,G){if(!k.4K(e)){k.2H(e,\'1n\');E I}D z=q;z.el=k(e);z.G=2g J==\'4V\'?J:G||S;z.J=2g J==\'u\'?J:S;if(1u==\'3R\'){1u=z.el.B(\'19\')==\'1o\'?\'9M\':\'fp\'}z.H=H;z.W=W&&W.1K==bn?W:20;z.fx=k.fx.9P(e);z.1u=1u;z.21=u(){if(z.J&&z.J.1K==2A){z.J.1D(z.el.K(0))}if(z.1u==\'9M\'){z.el.1Y()}P{z.el.2G()}k.fx.a0(z.fx.3p.K(0),z.fx.V);k.2H(z.el.K(0),\'1n\')};if(z.1u==\'9M\'){z.el.1Y();z.fx.3p.B(\'W\',z.W+\'U\').B(\'Z\',\'9R\');z.ef=12 k.fx(z.fx.3p.K(0),k.H(z.H,z.G,u(){z.ef=12 k.fx(z.fx.3p.K(0),k.H(z.H,z.G,z.21),\'W\');z.ef.1L(z.W,z.fx.V.1q.hb)}),\'Z\');z.ef.1L(0,z.fx.V.1q.1C)}P{z.ef=12 k.fx(z.fx.3p.K(0),k.H(z.H,z.G,u(){z.ef=12 k.fx(z.fx.3p.K(0),k.H(z.H,z.G,z.21),\'Z\');z.ef.1L(z.fx.V.1q.1C,0)}),\'W\');z.ef.1L(z.fx.V.1q.hb,z.W)}};k.fn.iR=u(H,4x,J,G){E q.1w(\'fv\',u(){q.6W=k(q).1p("14")||\'\';G=2g J==\'4V\'?J:G||S;J=2g J==\'u\'?J:S;D 9S=k(q).B(\'7i\');D 8I=q.31;7d(9S==\'cu\'&&8I){9S=k(8I).B(\'7i\');8I=8I.31}k(q).B(\'7i\',4x);if(2g q.6W==\'8T\')q.6W=q.6W["9X"];k(q).5w({\'7i\':9S},H,G,u(){k.2H(q,\'fv\');if(2g k(q).1p("14")==\'8T\'){k(q).1p("14")["9X"]="";k(q).1p("14")["9X"]=q.6W}P{k(q).1p("14",q.6W)}if(J)J.1D(q)})})};k.fn.23({iT:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.5m(q,H,J,\'49\',\'6g\',G)})},iU:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.5m(q,H,J,\'4j\',\'6g\',G)})},j1:u(H,J,G){E q.1w(\'1n\',u(){if(k.B(q,\'19\')==\'1o\'){12 k.fx.5m(q,H,J,\'4j\',\'6Z\',G)}P{12 k.fx.5m(q,H,J,\'4j\',\'6g\',G)}})},j2:u(H,J,G){E q.1w(\'1n\',u(){if(k.B(q,\'19\')==\'1o\'){12 k.fx.5m(q,H,J,\'49\',\'6Z\',G)}P{12 k.fx.5m(q,H,J,\'49\',\'6g\',G)}})},j9:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.5m(q,H,J,\'49\',\'6Z\',G)})},ja:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.5m(q,H,J,\'4j\',\'6Z\',G)})}});k.fx.5m=u(e,H,J,2S,1u,G){if(!k.4K(e)){k.2H(e,\'1n\');E I}D z=q;D 73=I;z.el=k(e);z.G=2g J==\'4V\'?J:G||S;z.J=2g J==\'u\'?J:S;z.1u=1u;z.H=H;z.2i=k.1a.2o(e);z.V={};z.V.Y=z.el.B(\'Y\');z.V.19=z.el.B(\'19\');if(z.V.19==\'1o\'){5Y=z.el.B(\'3n\');z.el.1Y();73=1b}z.V.Q=z.el.B(\'Q\');z.V.O=z.el.B(\'O\');if(73){z.el.2G();z.el.B(\'3n\',5Y)}z.V.Z=z.2i.w+\'U\';z.V.W=z.2i.h+\'U\';z.V.2U=z.el.B(\'2U\');z.2i.Q=T(z.V.Q)||0;z.2i.O=T(z.V.O)||0;if(z.V.Y!=\'2s\'&&z.V.Y!=\'1P\'){z.el.B(\'Y\',\'2s\')}z.el.B(\'2U\',\'2K\').B(\'W\',1u==\'6Z\'&&2S==\'49\'?1:z.2i.h+\'U\').B(\'Z\',1u==\'6Z\'&&2S==\'4j\'?1:z.2i.w+\'U\');z.21=u(){z.el.B(z.V);if(z.1u==\'6g\')z.el.2G();P z.el.1Y();k.2H(z.el.K(0),\'1n\')};3m(2S){1e\'49\':z.eh=12 k.fx(z.el.K(0),k.H(H-15,z.G,J),\'W\');z.et=12 k.fx(z.el.K(0),k.H(z.H,z.G,z.21),\'Q\');if(z.1u==\'6g\'){z.eh.1L(z.2i.h,0);z.et.1L(z.2i.Q,z.2i.Q+z.2i.h/2)}P{z.eh.1L(0,z.2i.h);z.et.1L(z.2i.Q+z.2i.h/2,z.2i.Q)}1r;1e\'4j\':z.eh=12 k.fx(z.el.K(0),k.H(H-15,z.G,J),\'Z\');z.et=12 k.fx(z.el.K(0),k.H(z.H,z.G,z.21),\'O\');if(z.1u==\'6g\'){z.eh.1L(z.2i.w,0);z.et.1L(z.2i.O,z.2i.O+z.2i.w/2)}P{z.eh.1L(0,z.2i.w);z.et.1L(z.2i.O+z.2i.w/2,z.2i.O)}1r}};k.fn.bg=u(H,3V,J){E q.1w(\'1n\',u(){if(!k.4K(q)){k.2H(q,\'1n\');E I}D fx=12 k.fx.bg(q,H,3V,J);fx.bf()})};k.fx.bg=u(el,H,3V,J){D z=q;z.3V=3V;z.5y=1;z.el=el;z.H=H;z.J=J;k(z.el).1Y();z.bf=u(){z.5y++;z.e=12 k.fx(z.el,k.H(z.H,u(){z.ef=12 k.fx(z.el,k.H(z.H,u(){if(z.5y<=z.3V)z.bf();P{k.2H(z.el,\'1n\');if(z.J&&z.J.1K==2A){z.J.1D(z.el)}}}),\'1G\');z.ef.1L(0,1)}),\'1G\');z.e.1L(1,0)}};k.fn.23({jb:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.6G(q,H,1,2a,1b,J,\'fa\',G)})},jc:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.6G(q,H,2a,1,1b,J,\'b4\',G)})},j8:u(H,J,G){E q.1w(\'1n\',u(){D G=G||\'fl\';12 k.fx.6G(q,H,2a,f8,1b,J,\'6h\',G)})},6G:u(H,57,30,6H,J,G){E q.1w(\'1n\',u(){12 k.fx.6G(q,H,57,30,6H,J,\'6G\',G)})}});k.fx.6G=u(e,H,57,30,6H,J,1u,G){if(!k.4K(e)){k.2H(e,\'1n\');E I}D z=q;z.el=k(e);z.57=T(57)||2a;z.30=T(30)||2a;z.G=2g J==\'4V\'?J:G||S;z.J=2g J==\'u\'?J:S;z.1m=k.H(H).1m;z.6H=6H||S;z.2i=k.1a.2o(e);z.V={Z:z.el.B(\'Z\'),W:z.el.B(\'W\'),4A:z.el.B(\'4A\')||\'2a%\',Y:z.el.B(\'Y\'),19:z.el.B(\'19\'),Q:z.el.B(\'Q\'),O:z.el.B(\'O\'),2U:z.el.B(\'2U\'),4S:z.el.B(\'4S\'),5O:z.el.B(\'5O\'),5Q:z.el.B(\'5Q\'),5b:z.el.B(\'5b\'),5M:z.el.B(\'5M\'),5U:z.el.B(\'5U\'),5n:z.el.B(\'5n\'),4X:z.el.B(\'4X\')};z.Z=T(z.V.Z)||e.4c||0;z.W=T(z.V.W)||e.5W||0;z.Q=T(z.V.Q)||0;z.O=T(z.V.O)||0;1q=[\'em\',\'U\',\'j7\',\'%\'];24(i in 1q){if(z.V.4A.3J(1q[i])>0){z.fg=1q[i];z.4A=2m(z.V.4A)}if(z.V.4S.3J(1q[i])>0){z.fc=1q[i];z.bw=2m(z.V.4S)||0}if(z.V.5O.3J(1q[i])>0){z.fe=1q[i];z.bc=2m(z.V.5O)||0}if(z.V.5Q.3J(1q[i])>0){z.fL=1q[i];z.bA=2m(z.V.5Q)||0}if(z.V.5b.3J(1q[i])>0){z.g8=1q[i];z.bt=2m(z.V.5b)||0}if(z.V.5M.3J(1q[i])>0){z.g4=1q[i];z.bx=2m(z.V.5M)||0}if(z.V.5U.3J(1q[i])>0){z.g9=1q[i];z.bv=2m(z.V.5U)||0}if(z.V.5n.3J(1q[i])>0){z.gc=1q[i];z.bj=2m(z.V.5n)||0}if(z.V.4X.3J(1q[i])>0){z.fK=1q[i];z.b7=2m(z.V.4X)||0}}if(z.V.Y!=\'2s\'&&z.V.Y!=\'1P\'){z.el.B(\'Y\',\'2s\')}z.el.B(\'2U\',\'2K\');z.1u=1u;3m(z.1u){1e\'fa\':z.4b=z.Q+z.2i.h/2;z.5a=z.Q;z.4k=z.O+z.2i.w/2;z.59=z.O;1r;1e\'b4\':z.5a=z.Q+z.2i.h/2;z.4b=z.Q;z.59=z.O+z.2i.w/2;z.4k=z.O;1r;1e\'6h\':z.5a=z.Q-z.2i.h/4;z.4b=z.Q;z.59=z.O-z.2i.w/4;z.4k=z.O;1r}z.be=I;z.t=(12 7g).7z();z.4w=u(){5T(z.2I);z.2I=S};z.2D=u(){if(z.be==I){z.el.1Y();z.be=1b}D t=(12 7g).7z();D n=t-z.t;D p=n/z.1m;if(t>=z.1m+z.t){9T(u(){o=1;if(z.1u){t=z.5a;l=z.59;if(z.1u==\'6h\')o=0}z.bs(z.30,l,t,1b,o)},13);z.4w()}P{o=1;if(!k.G||!k.G[z.G]){s=((-18.5H(p*18.2Q)/2)+0.5)*(z.30-z.57)+z.57}P{s=k.G[z.G](p,n,z.57,(z.30-z.57),z.1m)}if(z.1u){if(!k.G||!k.G[z.G]){t=((-18.5H(p*18.2Q)/2)+0.5)*(z.5a-z.4b)+z.4b;l=((-18.5H(p*18.2Q)/2)+0.5)*(z.59-z.4k)+z.4k;if(z.1u==\'6h\')o=((-18.5H(p*18.2Q)/2)+0.5)*(-0.9Y)+0.9Y}P{t=k.G[z.G](p,n,z.4b,(z.5a-z.4b),z.1m);l=k.G[z.G](p,n,z.4k,(z.59-z.4k),z.1m);if(z.1u==\'6h\')o=k.G[z.G](p,n,0.9Y,-0.9Y,z.1m)}}z.bs(s,l,t,I,o)}};z.2I=6V(u(){z.2D()},13);z.bs=u(4q,O,Q,fM,1G){z.el.B(\'W\',z.W*4q/2a+\'U\').B(\'Z\',z.Z*4q/2a+\'U\').B(\'O\',O+\'U\').B(\'Q\',Q+\'U\').B(\'4A\',z.4A*4q/2a+z.fg);if(z.bw)z.el.B(\'4S\',z.bw*4q/2a+z.fc);if(z.bc)z.el.B(\'5O\',z.bc*4q/2a+z.fe);if(z.bA)z.el.B(\'5Q\',z.bA*4q/2a+z.fL);if(z.bt)z.el.B(\'5b\',z.bt*4q/2a+z.g8);if(z.bx)z.el.B(\'5M\',z.bx*4q/2a+z.g4);if(z.bv)z.el.B(\'5U\',z.bv*4q/2a+z.g9);if(z.bj)z.el.B(\'5n\',z.bj*4q/2a+z.gc);if(z.b7)z.el.B(\'4X\',z.b7*4q/2a+z.fK);if(z.1u==\'6h\'){if(1X.71)z.el.K(0).14.5E="8V(1G="+1G*2a+")";z.el.K(0).14.1G=1G}if(fM){if(z.6H){z.el.B(z.V)}if(z.1u==\'b4\'||z.1u==\'6h\'){z.el.B(\'19\',\'1o\');if(z.1u==\'6h\'){if(1X.71)z.el.K(0).14.5E="8V(1G="+2a+")";z.el.K(0).14.1G=1}}P z.el.B(\'19\',\'2B\');if(z.J)z.J.1D(z.el.K(0));k.2H(z.el.K(0),\'1n\')}}};k.fn.23({9U:u(H,1O,G){o=k.H(H);E q.1w(\'1n\',u(){12 k.fx.9U(q,o,1O,G)})},j6:u(H,1O,G){E q.1E(u(){k(\'a[@3h*="#"]\',q).5h(u(e){fW=q.3h.7C(\'#\');k(\'#\'+fW[1]).9U(H,1O,G);E I})})}});k.fx.9U=u(e,o,1O,G){D z=q;z.o=o;z.e=e;z.1O=/fT|gd/.48(1O)?1O:I;z.G=G;p=k.1a.3w(e);s=k.1a.6z();z.4w=u(){5T(z.2I);z.2I=S;k.2H(z.e,\'1n\')};z.t=(12 7g).7z();s.h=s.h>s.ih?(s.h-s.ih):s.h;s.w=s.w>s.iw?(s.w-s.iw):s.w;z.5a=p.y>s.h?s.h:p.y;z.59=p.x>s.w?s.w:p.x;z.4b=s.t;z.4k=s.l;z.2D=u(){D t=(12 7g).7z();D n=t-z.t;D p=n/z.o.1m;if(t>=z.o.1m+z.t){z.4w();9T(u(){z.d3(z.5a,z.59)},13)}P{if(!z.1O||z.1O==\'fT\'){if(!k.G||!k.G[z.G]){9V=((-18.5H(p*18.2Q)/2)+0.5)*(z.5a-z.4b)+z.4b}P{9V=k.G[z.G](p,n,z.4b,(z.5a-z.4b),z.o.1m)}}P{9V=z.4b}if(!z.1O||z.1O==\'gd\'){if(!k.G||!k.G[z.G]){9W=((-18.5H(p*18.2Q)/2)+0.5)*(z.59-z.4k)+z.4k}P{9W=k.G[z.G](p,n,z.4k,(z.59-z.4k),z.o.1m)}}P{9W=z.4k}z.d3(9V,9W)}};z.d3=u(t,l){1X.j4(l,t)};z.2I=6V(u(){z.2D()},13)};k.fn.cY=u(3V,J){E q.1w(\'1n\',u(){if(!k.4K(q)){k.2H(q,\'1n\');E I}D e=12 k.fx.cY(q,3V,J);e.cG()})};k.fx.cY=u(e,3V,J){D z=q;z.el=k(e);z.el.1Y();z.3V=T(3V)||3;z.J=J;z.5y=1;z.V={};z.V.Y=z.el.B(\'Y\');z.V.Q=T(z.el.B(\'Q\'))||0;z.V.O=T(z.el.B(\'O\'))||0;if(z.V.Y!=\'2s\'&&z.V.Y!=\'1P\'){z.el.B(\'Y\',\'2s\')}z.cG=u(){z.5y++;z.e=12 k.fx(z.el.K(0),{1m:60,21:u(){z.e=12 k.fx(z.el.K(0),{1m:60,21:u(){z.e=12 k.fx(e,{1m:60,21:u(){if(z.5y<=z.3V)z.cG();P{z.el.B(\'Y\',z.V.Y).B(\'Q\',z.V.Q+\'U\').B(\'O\',z.V.O+\'U\');k.2H(z.el.K(0),\'1n\');if(z.J&&z.J.1K==2A){z.J.1D(z.el.K(0))}}}},\'O\');z.e.1L(z.V.O-20,z.V.O)}},\'O\');z.e.1L(z.V.O+20,z.V.O-20)}},\'O\');z.e.1L(z.V.O,z.V.O+20)}};k.fn.23({fo:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.1z(q,H,J,\'4F\',\'in\',G)})},fq:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.1z(q,H,J,\'4F\',\'4l\',G)})},iY:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.1z(q,H,J,\'4F\',\'3R\',G)})},iX:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.1z(q,H,J,\'4r\',\'in\',G)})},jr:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.1z(q,H,J,\'4r\',\'4l\',G)})},jq:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.1z(q,H,J,\'4r\',\'3R\',G)})},jp:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.1z(q,H,J,\'O\',\'in\',G)})},jn:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.1z(q,H,J,\'O\',\'4l\',G)})},jm:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.1z(q,H,J,\'O\',\'3R\',G)})},iP:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.1z(q,H,J,\'2L\',\'in\',G)})},ic:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.1z(q,H,J,\'2L\',\'4l\',G)})},ib:u(H,J,G){E q.1w(\'1n\',u(){12 k.fx.1z(q,H,J,\'2L\',\'3R\',G)})}});k.fx.1z=u(e,H,J,2S,1u,G){if(!k.4K(e)){k.2H(e,\'1n\');E I}D z=q;z.el=k(e);z.G=2g J==\'4V\'?J:G||S;z.J=2g J==\'u\'?J:S;if(1u==\'3R\'){1u=z.el.B(\'19\')==\'1o\'?\'in\':\'4l\'}if(!e.4s)e.4s=z.el.B(\'19\');z.el.1Y();z.H=H;z.fx=k.fx.9P(e);z.1u=1u;z.2S=2S;z.21=u(){if(z.1u==\'4l\')z.el.B(\'3n\',\'2K\');k.fx.a0(z.fx.3p.K(0),z.fx.V);if(z.1u==\'in\'){z.el.B(\'19\',z.el.K(0).4s==\'1o\'?\'2B\':z.el.K(0).4s)}P{z.el.B(\'19\',\'1o\');z.el.B(\'3n\',\'dd\')}if(z.J&&z.J.1K==2A){z.J.1D(z.el.K(0))}k.2H(z.el.K(0),\'1n\')};3m(z.2S){1e\'4F\':z.ef=12 k.fx(z.el.K(0),k.H(z.H,z.G,z.21),\'Q\');z.7v=12 k.fx(z.fx.3p.K(0),k.H(z.H,z.G),\'W\');if(z.1u==\'in\'){z.ef.1L(-z.fx.V.1q.hb,0);z.7v.1L(0,z.fx.V.1q.hb)}P{z.ef.1L(0,-z.fx.V.1q.hb);z.7v.1L(z.fx.V.1q.hb,0)}1r;1e\'4r\':z.ef=12 k.fx(z.el.K(0),k.H(z.H,z.G,z.21),\'Q\');if(z.1u==\'in\'){z.ef.1L(z.fx.V.1q.hb,0)}P{z.ef.1L(0,z.fx.V.1q.hb)}1r;1e\'O\':z.ef=12 k.fx(z.el.K(0),k.H(z.H,z.G,z.21),\'O\');z.7v=12 k.fx(z.fx.3p.K(0),k.H(z.H,z.G),\'Z\');if(z.1u==\'in\'){z.ef.1L(-z.fx.V.1q.1C,0);z.7v.1L(0,z.fx.V.1q.1C)}P{z.ef.1L(0,-z.fx.V.1q.1C);z.7v.1L(z.fx.V.1q.1C,0)}1r;1e\'2L\':z.ef=12 k.fx(z.el.K(0),k.H(z.H,z.G,z.21),\'O\');if(z.1u==\'in\'){z.ef.1L(z.fx.V.1q.1C,0)}P{z.ef.1L(0,z.fx.V.1q.1C)}1r}};k.3f=S;k.fn.ig=u(o){E q.1w(\'1n\',u(){12 k.fx.dG(q,o)})};k.fx.dG=u(e,o){if(k.3f==S){k(\'2e\',1h).1S(\'<22 id="3f"></22>\');k.3f=k(\'#3f\')}k.3f.B(\'19\',\'2B\').B(\'Y\',\'1P\');D z=q;z.el=k(e);if(!o||!o.30){E}if(o.30.1K==b0&&1h.9e(o.30)){o.30=1h.9e(o.30)}P if(!o.30.dq){E}if(!o.1m){o.1m=g5}z.1m=o.1m;z.30=o.30;z.8r=o.3l;z.21=o.21;if(z.8r){k.3f.2R(z.8r)}z.a3=0;z.a2=0;if(k.dF){z.a3=(T(k.3f.B(\'5b\'))||0)+(T(k.3f.B(\'5O\'))||0)+(T(k.3f.B(\'4X\'))||0)+(T(k.3f.B(\'5U\'))||0);z.a2=(T(k.3f.B(\'4S\'))||0)+(T(k.3f.B(\'5Q\'))||0)+(T(k.3f.B(\'5M\'))||0)+(T(k.3f.B(\'5n\'))||0)}z.26=k.23(k.1a.3w(z.el.K(0)),k.1a.2o(z.el.K(0)));z.2T=k.23(k.1a.3w(z.30),k.1a.2o(z.30));z.26.1C-=z.a3;z.26.hb-=z.a2;z.2T.1C-=z.a3;z.2T.hb-=z.a2;z.J=o.21;k.3f.B(\'Z\',z.26.1C+\'U\').B(\'W\',z.26.hb+\'U\').B(\'Q\',z.26.y+\'U\').B(\'O\',z.26.x+\'U\').5w({Q:z.2T.y,O:z.2T.x,Z:z.2T.1C,W:z.2T.hb},z.1m,u(){if(z.8r)k.3f.4i(z.8r);k.3f.B(\'19\',\'1o\');if(z.21&&z.21.1K==2A){z.21.1D(z.el.K(0),[z.30])}k.2H(z.el.K(0),\'1n\')})};k.1v={M:{2E:10,ec:\'1Q/iJ.eZ\',e3:\'<1T 2J="1Q/6g.da" />\',eW:0.8,d8:\'iN a6\',dc:\'57\',3W:8J},jQ:I,jW:I,6j:S,8m:I,8k:I,d1:u(2k){if(!k.1v.8k||k.1v.8m)E;D 3K=2k.7L||2k.7K||-1;3m(3K){1e 35:if(k.1v.6j)k.1v.26(S,k(\'a[@4I=\'+k.1v.6j+\']:jJ\').K(0));1r;1e 36:if(k.1v.6j)k.1v.26(S,k(\'a[@4I=\'+k.1v.6j+\']:jL\').K(0));1r;1e 37:1e 8:1e 33:1e 80:1e kb:D 9p=k(\'#87\');if(9p.K(0).53!=S){9p.K(0).53.1D(9p.K(0))}1r;1e 38:1r;1e 39:1e 34:1e 32:1e gl:1e 78:D 9k=k(\'#88\');if(9k.K(0).53!=S){9k.K(0).53.1D(9k.K(0))}1r;1e 40:1r;1e 27:k.1v.au();1r}},7q:u(M){if(M)k.23(k.1v.M,M);if(1X.2k){k(\'2e\',1h).1J(\'6y\',k.1v.d1)}P{k(1h).1J(\'6y\',k.1v.d1)}k(\'a\').1E(u(){el=k(q);en=el.1p(\'4I\')||\'\';e9=el.1p(\'3h\')||\'\';ev=/\\.da|\\.gw|\\.8X|\\.eZ|\\.gn/g;if(e9.6c().d5(ev)!=S&&en.6c().3J(\'eU\')==0){el.1J(\'5h\',k.1v.26)}});if(k.3a.4t){3A=1h.3F(\'3A\');k(3A).1p({id:\'cN\',2J:\'ek:I;\',ej:\'cD\',ep:\'cD\'}).B({19:\'1o\',Y:\'1P\',Q:\'0\',O:\'0\',5E:\'9n:9w.9y.cC(1G=0)\'});k(\'2e\').1S(3A)}8n=1h.3F(\'22\');k(8n).1p(\'id\',\'cP\').B({Y:\'1P\',19:\'1o\',Q:\'0\',O:\'0\',1G:0}).1S(1h.8M(\' \')).1J(\'5h\',k.1v.au);6A=1h.3F(\'22\');k(6A).1p(\'id\',\'eK\').B({4X:k.1v.M.2E+\'U\'}).1S(1h.8M(\' \'));cE=1h.3F(\'22\');k(cE).1p(\'id\',\'dg\').B({4X:k.1v.M.2E+\'U\',5n:k.1v.M.2E+\'U\'}).1S(1h.8M(\' \'));cF=1h.3F(\'a\');k(cF).1p({id:\'gg\',3h:\'#\'}).B({Y:\'1P\',2L:k.1v.M.2E+\'U\',Q:\'0\'}).1S(k.1v.M.e3).1J(\'5h\',k.1v.au);7m=1h.3F(\'22\');k(7m).1p(\'id\',\'cM\').B({Y:\'2s\',cA:\'O\',6w:\'0 9F\',3I:1}).1S(6A).1S(cE).1S(cF);2b=1h.3F(\'1T\');2b.2J=k.1v.M.ec;k(2b).1p(\'id\',\'eM\').B({Y:\'1P\'});4G=1h.3F(\'a\');k(4G).1p({id:\'87\',3h:\'#\'}).B({Y:\'1P\',19:\'1o\',2U:\'2K\',ey:\'1o\'}).1S(1h.8M(\' \'));4M=1h.3F(\'a\');k(4M).1p({id:\'88\',3h:\'#\'}).B({Y:\'1P\',2U:\'2K\',ey:\'1o\'}).1S(1h.8M(\' \'));1Z=1h.3F(\'22\');k(1Z).1p(\'id\',\'eE\').B({19:\'1o\',Y:\'2s\',2U:\'2K\',cA:\'O\',6w:\'0 9F\',Q:\'0\',O:\'0\',3I:2}).1S([2b,4G,4M]);6F=1h.3F(\'22\');k(6F).1p(\'id\',\'ao\').B({19:\'1o\',Y:\'1P\',2U:\'2K\',Q:\'0\',O:\'0\',cA:\'cv\',7i:\'cu\',hC:\'0\'}).1S([1Z,7m]);k(\'2e\').1S(8n).1S(6F)},26:u(e,C){el=C?k(C):k(q);9t=el.1p(\'4I\');D 6B,4u,4G,4M;if(9t!=\'eU\'){k.1v.6j=9t;8Y=k(\'a[@4I=\'+9t+\']\');6B=8Y.1N();4u=8Y.cZ(C?C:q);4G=8Y.K(4u-1);4M=8Y.K(4u+1)}89=el.1p(\'3h\');6A=el.1p(\'4g\');3O=k.1a.6z();8n=k(\'#cP\');if(!k.1v.8k){k.1v.8k=1b;if(k.3a.4t){k(\'#cN\').B(\'W\',18.3r(3O.ih,3O.h)+\'U\').B(\'Z\',18.3r(3O.iw,3O.w)+\'U\').1Y()}8n.B(\'W\',18.3r(3O.ih,3O.h)+\'U\').B(\'Z\',18.3r(3O.iw,3O.w)+\'U\').1Y().fX(cO,k.1v.M.eW,u(){k.1v.cw(89,6A,3O,6B,4u,4G,4M)});k(\'#ao\').B(\'Z\',18.3r(3O.iw,3O.w)+\'U\')}P{k(\'#87\').K(0).53=S;k(\'#88\').K(0).53=S;k.1v.cw(89,6A,3O,6B,4u,4G,4M)}E I},cw:u(89,gP,3O,6B,4u,4G,4M){k(\'#cW\').bk();aX=k(\'#87\');aX.2G();aO=k(\'#88\');aO.2G();2b=k(\'#eM\');1Z=k(\'#eE\');6F=k(\'#ao\');7m=k(\'#cM\').B(\'3n\',\'2K\');k(\'#eK\').3x(6A);k.1v.8m=1b;if(6B)k(\'#dg\').3x(k.1v.M.d8+\' \'+(4u+1)+\' \'+k.1v.M.dc+\' \'+6B);if(4G){aX.K(0).53=u(){q.5B();k.1v.26(S,4G);E I}}if(4M){aO.K(0).53=u(){q.5B();k.1v.26(S,4M);E I}}2b.1Y();82=k.1a.2o(1Z.K(0));56=18.3r(82.1C,2b.K(0).Z+k.1v.M.2E*2);6f=18.3r(82.hb,2b.K(0).W+k.1v.M.2E*2);2b.B({O:(56-2b.K(0).Z)/2+\'U\',Q:(6f-2b.K(0).W)/2+\'U\'});1Z.B({Z:56+\'U\',W:6f+\'U\'}).1Y();dw=k.1a.bm();6F.B(\'Q\',3O.t+(dw.h/15)+\'U\');if(6F.B(\'19\')==\'1o\'){6F.1Y().7f(k.1v.M.3W)}6k=12 9s;k(6k).1p(\'id\',\'cW\').1J(\'hJ\',u(){56=6k.Z+k.1v.M.2E*2;6f=6k.W+k.1v.M.2E*2;2b.2G();1Z.5w({W:6f},82.hb!=6f?k.1v.M.3W:1,u(){1Z.5w({Z:56},82.1C!=56?k.1v.M.3W:1,u(){1Z.bG(6k);k(6k).B({Y:\'1P\',O:k.1v.M.2E+\'U\',Q:k.1v.M.2E+\'U\'}).7f(k.1v.M.3W,u(){db=k.1a.2o(7m.K(0));if(4G){aX.B({O:k.1v.M.2E+\'U\',Q:k.1v.M.2E+\'U\',Z:56/2-k.1v.M.2E*3+\'U\',W:6f-k.1v.M.2E*2+\'U\'}).1Y()}if(4M){aO.B({O:56/2+k.1v.M.2E*2+\'U\',Q:k.1v.M.2E+\'U\',Z:56/2-k.1v.M.2E*3+\'U\',W:6f-k.1v.M.2E*2+\'U\'}).1Y()}7m.B({Z:56+\'U\',Q:-db.hb+\'U\',3n:\'dd\'}).5w({Q:-1},k.1v.M.3W,u(){k.1v.8m=I})})})})});6k.2J=89},au:u(){k(\'#cW\').bk();k(\'#ao\').2G();k(\'#cM\').B(\'3n\',\'2K\');k(\'#cP\').fX(cO,0,u(){k(q).2G();if(k.3a.4t){k(\'#cN\').2G()}});k(\'#87\').K(0).53=S;k(\'#88\').K(0).53=S;k.1v.6j=S;k.1v.8k=I;k.1v.8m=I;E I}};k.R={1A:S,41:S,F:S,1s:S,1q:S,Y:S,9a:u(e){k.R.F=(q.d0)?q.d0:q;k.R.1s=k.1a.4a(e);k.R.1q={Z:T(k(k.R.F).B(\'Z\'))||0,W:T(k(k.R.F).B(\'W\'))||0};k.R.Y={Q:T(k(k.R.F).B(\'Q\'))||0,O:T(k(k.R.F).B(\'O\'))||0};k(1h).1J(\'3D\',k.R.cR).1J(\'5P\',k.R.cK);if(2g k.R.F.1k.g2===\'u\'){k.R.F.1k.g2.1D(k.R.F)}E I},cK:u(e){k(1h).3q(\'3D\',k.R.cR).3q(\'5P\',k.R.cK);if(2g k.R.F.1k.fN===\'u\'){k.R.F.1k.fN.1D(k.R.F)}k.R.F=S},cR:u(e){if(!k.R.F){E}1s=k.1a.4a(e);7p=k.R.Y.Q-k.R.1s.y+1s.y;7r=k.R.Y.O-k.R.1s.x+1s.x;7p=18.3r(18.3L(7p,k.R.F.1k.8g-k.R.1q.W),k.R.F.1k.7h);7r=18.3r(18.3L(7r,k.R.F.1k.8h-k.R.1q.Z),k.R.F.1k.70);if(2g k.R.F.1k.4m===\'u\'){D 8a=k.R.F.1k.4m.1D(k.R.F,[7r,7p]);if(2g 8a==\'hh\'&&8a.1g==2){7r=8a[0];7p=8a[1]}}k.R.F.14.Q=7p+\'U\';k.R.F.14.O=7r+\'U\';E I},26:u(e){k(1h).1J(\'3D\',k.R.8j).1J(\'5P\',k.R.8o);k.R.1A=q.1A;k.R.41=q.41;k.R.1s=k.1a.4a(e);k.R.1q={Z:T(k(q.1A).B(\'Z\'))||0,W:T(k(q.1A).B(\'W\'))||0};k.R.Y={Q:T(k(q.1A).B(\'Q\'))||0,O:T(k(q.1A).B(\'O\'))||0};if(k.R.1A.1k.4o){k.R.1A.1k.4o.1D(k.R.1A,[q])}E I},8o:u(){k(1h).3q(\'3D\',k.R.8j).3q(\'5P\',k.R.8o);if(k.R.1A.1k.3T){k.R.1A.1k.3T.1D(k.R.1A,[k.R.41])}k.R.1A=S;k.R.41=S},6i:u(dx,az){E 18.3L(18.3r(k.R.1q.Z+dx*az,k.R.1A.1k.av),k.R.1A.1k.6x)},6m:u(dy,az){E 18.3L(18.3r(k.R.1q.W+dy*az,k.R.1A.1k.8c),k.R.1A.1k.8b)},fb:u(W){E 18.3L(18.3r(W,k.R.1A.1k.8c),k.R.1A.1k.8b)},8j:u(e){if(k.R.1A==S){E}1s=k.1a.4a(e);dx=1s.x-k.R.1s.x;dy=1s.y-k.R.1s.y;1I={Z:k.R.1q.Z,W:k.R.1q.W};2z={Q:k.R.Y.Q,O:k.R.Y.O};3m(k.R.41){1e\'e\':1I.Z=k.R.6i(dx,1);1r;1e\'fj\':1I.Z=k.R.6i(dx,1);1I.W=k.R.6m(dy,1);1r;1e\'w\':1I.Z=k.R.6i(dx,-1);2z.O=k.R.Y.O-1I.Z+k.R.1q.Z;1r;1e\'5F\':1I.Z=k.R.6i(dx,-1);2z.O=k.R.Y.O-1I.Z+k.R.1q.Z;1I.W=k.R.6m(dy,1);1r;1e\'76\':1I.W=k.R.6m(dy,-1);2z.Q=k.R.Y.Q-1I.W+k.R.1q.W;1I.Z=k.R.6i(dx,-1);2z.O=k.R.Y.O-1I.Z+k.R.1q.Z;1r;1e\'n\':1I.W=k.R.6m(dy,-1);2z.Q=k.R.Y.Q-1I.W+k.R.1q.W;1r;1e\'at\':1I.W=k.R.6m(dy,-1);2z.Q=k.R.Y.Q-1I.W+k.R.1q.W;1I.Z=k.R.6i(dx,1);1r;1e\'s\':1I.W=k.R.6m(dy,1);1r}if(k.R.1A.1k.4v){if(k.R.41==\'n\'||k.R.41==\'s\')4p=1I.W*k.R.1A.1k.4v;P 4p=1I.Z;4W=k.R.fb(4p*k.R.1A.1k.4v);4p=4W/k.R.1A.1k.4v;3m(k.R.41){1e\'n\':1e\'76\':1e\'at\':2z.Q+=1I.W-4W;1r}3m(k.R.41){1e\'76\':1e\'w\':1e\'5F\':2z.O+=1I.Z-4p;1r}1I.W=4W;1I.Z=4p}if(2z.Q<k.R.1A.1k.7h){4W=1I.W+2z.Q-k.R.1A.1k.7h;2z.Q=k.R.1A.1k.7h;if(k.R.1A.1k.4v){4p=4W/k.R.1A.1k.4v;3m(k.R.41){1e\'76\':1e\'w\':1e\'5F\':2z.O+=1I.Z-4p;1r}1I.Z=4p}1I.W=4W}if(2z.O<k.R.1A.1k.70){4p=1I.Z+2z.O-k.R.1A.1k.70;2z.O=k.R.1A.1k.70;if(k.R.1A.1k.4v){4W=4p*k.R.1A.1k.4v;3m(k.R.41){1e\'n\':1e\'76\':1e\'at\':2z.Q+=1I.W-4W;1r}1I.W=4W}1I.Z=4p}if(2z.Q+1I.W>k.R.1A.1k.8g){1I.W=k.R.1A.1k.8g-2z.Q;if(k.R.1A.1k.4v){1I.Z=1I.W/k.R.1A.1k.4v}}if(2z.O+1I.Z>k.R.1A.1k.8h){1I.Z=k.R.1A.1k.8h-2z.O;if(k.R.1A.1k.4v){1I.W=1I.Z*k.R.1A.1k.4v}}D 6p=I;if(k.R.1A.1k.f7){6p=k.R.1A.1k.f7.1D(k.R.1A,[1I,2z]);if(6p){if(6p.1q){k.23(1I,6p.1q)}if(6p.Y){k.23(2z,6p.Y)}}}8d=k.R.1A.14;8d.O=2z.O+\'U\';8d.Q=2z.Q+\'U\';8d.Z=1I.Z+\'U\';8d.W=1I.W+\'U\';E I},2r:u(M){if(!M||!M.3Z||M.3Z.1K!=7M){E}E q.1E(u(){D el=q;el.1k=M;el.1k.av=M.av||10;el.1k.8c=M.8c||10;el.1k.6x=M.6x||6P;el.1k.8b=M.8b||6P;el.1k.7h=M.7h||-aC;el.1k.70=M.70||-aC;el.1k.8h=M.8h||6P;el.1k.8g=M.8g||6P;d6=k(el).B(\'Y\');if(!(d6==\'2s\'||d6==\'1P\')){el.14.Y=\'2s\'}fS=/n|at|e|fj|s|5F|w|76/g;24(i in el.1k.3Z){if(i.6c().d5(fS)!=S){if(el.1k.3Z[i].1K==b0){3v=k(el.1k.3Z[i]);if(3v.1N()>0){el.1k.3Z[i]=3v.K(0)}}if(el.1k.3Z[i].4Y){el.1k.3Z[i].1A=el;el.1k.3Z[i].41=i;k(el.1k.3Z[i]).1J(\'5v\',k.R.26)}}}if(el.1k.5S){if(2g el.1k.5S===\'4V\'){aV=k(el.1k.5S);if(aV.1N()>0){aV.1E(u(){q.d0=el});aV.1J(\'5v\',k.R.9a)}}P if(el.1k.5S==1b){k(q).1J(\'5v\',k.R.9a)}}})},4U:u(){E q.1E(u(){D el=q;24(i in el.1k.3Z){el.1k.3Z[i].1A=S;el.1k.3Z[i].41=S;k(el.1k.3Z[i]).3q(\'5v\',k.R.26)}if(el.1k.5S){if(2g el.1k.5S===\'4V\'){3v=k(el.1k.5S);if(3v.1N()>0){3v.3q(\'5v\',k.R.9a)}}P if(el.1k.5S==1b){k(q).3q(\'5v\',k.R.9a)}}el.1k=S})}};k.fn.23({hz:k.R.2r,hs:k.R.4U});k.2C=S;k.7n=I;k.3k=S;k.7o=[];k.9v=u(e){D 3K=e.7L||e.7K||-1;if(3K==17||3K==16){k.7n=1b}};k.9u=u(e){k.7n=I};k.dL=u(e){q.f.1s=k.1a.4a(e);q.f.1M=k.23(k.1a.3w(q),k.1a.2o(q));q.f.3e=k.1a.6z(q);q.f.1s.x-=q.f.1M.x;q.f.1s.y-=q.f.1M.y;k(q).1S(k.2C.K(0));if(q.f.hc)k.2C.2R(q.f.hc).B(\'19\',\'2B\');k.2C.B({19:\'2B\',Z:\'2P\',W:\'2P\'});if(q.f.o){k.2C.B(\'1G\',q.f.o)}k.3k=q;k.96=I;k.7o=[];q.f.el.1E(u(){q.1M={x:q.8t+(q.4Z&&!k.3a.7I?T(q.4Z.5b)||0:0)+(k.3k.3c||0),y:q.8G+(q.4Z&&!k.3a.7I?T(q.4Z.4S)||0:0)+(k.3k.3d||0),1C:q.4c,hb:q.5W};if(q.s==1b){if(k.7n==I){q.s=I;k(q).4i(k.3k.f.7j)}P{k.96=1b;k.7o[k.7o.1g]=k.1p(q,\'id\')}}});k.am.1D(q,[e]);k(1h).1J(\'3D\',k.am).1J(\'5P\',k.cX);E I};k.am=u(e){if(!k.3k)E;k.fd.1D(k.3k,[e])};k.fd=u(e){if(!k.3k)E;D 1s=k.1a.4a(e);D 3e=k.1a.6z(k.3k);1s.x+=3e.l-q.f.3e.l-q.f.1M.x;1s.y+=3e.t-q.f.3e.t-q.f.1M.y;D 93=18.3L(1s.x,q.f.1s.x);D 5F=18.3L(18.3S(1s.x-q.f.1s.x),18.3S(q.f.3e.w-93));D 99=18.3L(1s.y,q.f.1s.y);D 9g=18.3L(18.3S(1s.y-q.f.1s.y),18.3S(q.f.3e.h-99));if(q.3d>0&&1s.y-20<q.3d){D 3X=18.3L(3e.t,10);99-=3X;9g+=3X;q.3d-=3X}P if(q.3d+q.f.1M.h<q.f.3e.h&&1s.y+20>q.3d+q.f.1M.h){D 3X=18.3L(q.f.3e.h-q.3d,10);q.3d+=3X;if(q.3d!=3e.t)9g+=3X}if(q.3c>0&&1s.x-20<q.3c){D 3X=18.3L(3e.l,10);93-=3X;5F+=3X;q.3c-=3X}P if(q.3c+q.f.1M.w<q.f.3e.w&&1s.x+20>q.3c+q.f.1M.w){D 3X=18.3L(q.f.3e.w-q.3c,10);q.3c+=3X;if(q.3c!=3e.l)5F+=3X}k.2C.B({O:93+\'U\',Q:99+\'U\',Z:5F+\'U\',W:9g+\'U\'});k.2C.l=93+q.f.3e.l;k.2C.t=99+q.f.3e.t;k.2C.r=k.2C.l+5F;k.2C.b=k.2C.t+9g;k.96=I;q.f.el.1E(u(){aw=k.7o.3J(k.1p(q,\'id\'));if(!(q.1M.x>k.2C.r||(q.1M.x+q.1M.1C)<k.2C.l||q.1M.y>k.2C.b||(q.1M.y+q.1M.hb)<k.2C.t)){k.96=1b;if(q.s!=1b){q.s=1b;k(q).2R(k.3k.f.7j)}if(aw!=-1){q.s=I;k(q).4i(k.3k.f.7j)}}P if((q.s==1b)&&(aw==-1)){q.s=I;k(q).4i(k.3k.f.7j)}P if((!q.s)&&(k.7n==1b)&&(aw!=-1)){q.s=1b;k(q).2R(k.3k.f.7j)}});E I};k.cX=u(e){if(!k.3k)E;k.g0.1D(k.3k,[e])};k.g0=u(e){k(1h).3q(\'3D\',k.am).3q(\'5P\',k.cX);if(!k.3k)E;k.2C.B(\'19\',\'1o\');if(q.f.hc)k.2C.4i(q.f.hc);k.3k=I;k(\'2e\').1S(k.2C.K(0));if(k.96==1b){if(q.f.98)q.f.98(k.cJ(k.1p(q,\'id\')))}P{if(q.f.9d)q.f.9d(k.cJ(k.1p(q,\'id\')))}k.7o=[]};k.cJ=u(s){D h=\'\';D o=[];if(a=k(\'#\'+s)){a.K(0).f.el.1E(u(){if(q.s==1b){if(h.1g>0){h+=\'&\'}h+=s+\'[]=\'+k.1p(q,\'id\');o[o.1g]=k.1p(q,\'id\')}})}E{7l:h,o:o}};k.fn.gZ=u(o){if(!k.2C){k(\'2e\',1h).1S(\'<22 id="2C"></22>\').1J(\'7B\',k.9v).1J(\'6y\',k.9u);k.2C=k(\'#2C\');k.2C.B({Y:\'1P\',19:\'1o\'});if(1X.2k){k(\'2e\',1h).1J(\'7B\',k.9v).1J(\'6y\',k.9u)}P{k(1h).1J(\'7B\',k.9v).1J(\'6y\',k.9u)}}if(!o){o={}}E q.1E(u(){if(q.eP)E;q.eP=1b;q.f={a:o.3C,o:o.1G?2m(o.1G):I,7j:o.eS?o.eS:I,hc:o.58?o.58:I,98:o.98?o.98:I,9d:o.9d?o.9d:I};q.f.el=k(\'.\'+o.3C);k(q).1J(\'5v\',k.dL).B(\'Y\',\'2s\')})};k.3b={bM:1,eH:u(3t){D 3t=3t;E q.1E(u(){q.4z.6s.1E(u(ab){k.3b.5c(q,3t[ab])})})},K:u(){D 3t=[];q.1E(u(cL){if(q.bI){3t[cL]=[];D C=q;D 1q=k.1a.2o(q);q.4z.6s.1E(u(ab){D x=q.8t;D y=q.8G;92=T(x*2a/(1q.w-q.4c));91=T(y*2a/(1q.h-q.5W));3t[cL][ab]=[92||0,91||0,x||0,y||0]})}});E 3t},ct:u(C){C.A.fu=C.A.28.w-C.A.1B.1C;C.A.fw=C.A.28.h-C.A.1B.hb;if(C.9r.4z.bC){9Z=C.9r.4z.6s.K(C.bF+1);if(9Z){C.A.28.w=(T(k(9Z).B(\'O\'))||0)+C.A.1B.1C;C.A.28.h=(T(k(9Z).B(\'Q\'))||0)+C.A.1B.hb}9Q=C.9r.4z.6s.K(C.bF-1);if(9Q){D cU=T(k(9Q).B(\'O\'))||0;D cH=T(k(9Q).B(\'O\'))||0;C.A.28.x+=cU;C.A.28.y+=cH;C.A.28.w-=cU;C.A.28.h-=cH}}C.A.g7=C.A.28.w-C.A.1B.1C;C.A.eC=C.A.28.h-C.A.1B.hb;if(C.A.2O){C.A.gx=((C.A.28.w-C.A.1B.1C)/C.A.2O)||1;C.A.gy=((C.A.28.h-C.A.1B.hb)/C.A.2O)||1;C.A.fU=C.A.g7/C.A.2O;C.A.fH=C.A.eC/C.A.2O}C.A.28.dx=C.A.28.x-C.A.2c.x;C.A.28.dy=C.A.28.y-C.A.2c.y;k.11.1c.B(\'9b\',\'ad\')},3H:u(C,x,y){if(C.A.2O){fE=T(x/C.A.fU);92=fE*2a/C.A.2O;ft=T(y/C.A.fH);91=ft*2a/C.A.2O}P{92=T(x*2a/C.A.fu);91=T(y*2a/C.A.fw)}C.A.b3=[92||0,91||0,x||0,y||0];if(C.A.3H)C.A.3H.1D(C,C.A.b3)},eI:u(2k){3K=2k.7L||2k.7K||-1;3m(3K){1e 35:k.3b.5c(q.3U,[ae,ae]);1r;1e 36:k.3b.5c(q.3U,[-ae,-ae]);1r;1e 37:k.3b.5c(q.3U,[-q.3U.A.gx||-1,0]);1r;1e 38:k.3b.5c(q.3U,[0,-q.3U.A.gy||-1]);1r;1e 39:k.3b.5c(q.3U,[q.3U.A.gx||1,0]);1r;1e 40:k.11.5c(q.3U,[0,q.3U.A.gy||1]);1r}},5c:u(C,Y){if(!C.A){E}C.A.1B=k.23(k.1a.3w(C),k.1a.2o(C));C.A.2c={x:T(k.B(C,\'O\'))||0,y:T(k.B(C,\'Q\'))||0};C.A.4n=k.B(C,\'Y\');if(C.A.4n!=\'2s\'&&C.A.4n!=\'1P\'){C.14.Y=\'2s\'}k.11.c5(C);k.3b.ct(C);dx=T(Y[0])||0;dy=T(Y[1])||0;2v=C.A.2c.x+dx;2q=C.A.2c.y+dy;if(C.A.2O){3y=k.11.c7.1D(C,[2v,2q,dx,dy]);if(3y.1K==7M){dx=3y.dx;dy=3y.dy}2v=C.A.2c.x+dx;2q=C.A.2c.y+dy}3y=k.11.ce.1D(C,[2v,2q,dx,dy]);if(3y&&3y.1K==7M){dx=3y.dx;dy=3y.dy}2v=C.A.2c.x+dx;2q=C.A.2c.y+dy;if(C.A.5i&&(C.A.3H||C.A.2Z)){k.3b.3H(C,2v,2q)}2v=!C.A.1O||C.A.1O==\'4j\'?2v:C.A.2c.x||0;2q=!C.A.1O||C.A.1O==\'49\'?2q:C.A.2c.y||0;C.14.O=2v+\'U\';C.14.Q=2q+\'U\'},2r:u(o){E q.1E(u(){if(q.bI==1b||!o.3C||!k.1a||!k.11||!k.1x){E}5x=k(o.3C,q);if(5x.1N()==0){E}D 4N={2p:\'94\',5i:1b,3H:o.3H&&o.3H.1K==2A?o.3H:S,2Z:o.2Z&&o.2Z.1K==2A?o.2Z:S,3v:q,1G:o.1G||I};if(o.2O&&T(o.2O)){4N.2O=T(o.2O)||1;4N.2O=4N.2O>0?4N.2O:1}if(5x.1N()==1)5x.7t(4N);P{k(5x.K(0)).7t(4N);4N.3v=S;5x.7t(4N)}5x.7B(k.3b.eI);5x.1p(\'bM\',k.3b.bM++);q.bI=1b;q.4z={};q.4z.er=4N.er;q.4z.2O=4N.2O;q.4z.6s=5x;q.4z.bC=o.bC?1b:I;bZ=q;bZ.4z.6s.1E(u(2N){q.bF=2N;q.9r=bZ});if(o.3t&&o.3t.1K==7F){24(i=o.3t.1g-1;i>=0;i--){if(o.3t[i].1K==7F&&o.3t[i].1g==2){el=q.4z.6s.K(i);if(el.4Y){k.3b.5c(el,o.3t[i])}}}}})}};k.fn.23({hN:k.3b.2r,hS:k.3b.eH,hG:k.3b.K});k.2u={5I:[],eg:u(){q.5B();X=q.31;id=k.1p(X,\'id\');if(k.2u.5I[id]!=S){1X.5T(k.2u.5I[id])}1z=X.L.3u+1;if(X.L.1Q.1g<1z){1z=1}1Q=k(\'1T\',X.L.5u);X.L.3u=1z;if(1Q.1N()>0){1Q.7a(X.L.3W,k.2u.95)}},dp:u(){q.5B();X=q.31;id=k.1p(X,\'id\');if(k.2u.5I[id]!=S){1X.5T(k.2u.5I[id])}1z=X.L.3u-1;1Q=k(\'1T\',X.L.5u);if(1z<1){1z=X.L.1Q.1g}X.L.3u=1z;if(1Q.1N()>0){1Q.7a(X.L.3W,k.2u.95)}},2I:u(c){X=1h.9e(c);if(X.L.6o){1z=X.L.3u;7d(1z==X.L.3u){1z=1+T(18.6o()*X.L.1Q.1g)}}P{1z=X.L.3u+1;if(X.L.1Q.1g<1z){1z=1}}1Q=k(\'1T\',X.L.5u);X.L.3u=1z;if(1Q.1N()>0){1Q.7a(X.L.3W,k.2u.95)}},go:u(o){D X;if(o&&o.1K==7M){if(o.2b){X=1h.9e(o.2b.X);5N=1X.hn.3h.7C("#");o.2b.6S=S;if(5N.1g==2){1z=T(5N[1]);1Y=5N[1].4E(1z,\'\');if(k.1p(X,\'id\')!=1Y){1z=1}}P{1z=1}}if(o.90){o.90.5B();X=o.90.31.31;id=k.1p(X,\'id\');if(k.2u.5I[id]!=S){1X.5T(k.2u.5I[id])}5N=o.90.3h.7C("#");1z=T(5N[1]);1Y=5N[1].4E(1z,\'\');if(k.1p(X,\'id\')!=1Y){1z=1}}if(X.L.1Q.1g<1z||1z<1){1z=1}X.L.3u=1z;52=k.1a.2o(X);dt=k.1a.aT(X);d9=k.1a.6U(X);if(X.L.3z){X.L.3z.o.B(\'19\',\'1o\')}if(X.L.3s){X.L.3s.o.B(\'19\',\'1o\')}if(X.L.2b){y=T(dt.t)+T(d9.t);if(X.L.1U){if(X.L.1U.5A==\'Q\'){y+=X.L.1U.4C.hb}P{52.h-=X.L.1U.4C.hb}}if(X.L.2x){if(X.L.2x&&X.L.2x.6Q==\'Q\'){y+=X.L.2x.4C.hb}P{52.h-=X.L.2x.4C.hb}}if(!X.L.c1){X.L.df=o.2b?o.2b.W:(T(X.L.2b.B(\'W\'))||0);X.L.c1=o.2b?o.2b.Z:(T(X.L.2b.B(\'Z\'))||0)}X.L.2b.B(\'Q\',y+(52.h-X.L.df)/2+\'U\');X.L.2b.B(\'O\',(52.1C-X.L.c1)/2+\'U\');X.L.2b.B(\'19\',\'2B\')}1Q=k(\'1T\',X.L.5u);if(1Q.1N()>0){1Q.7a(X.L.3W,k.2u.95)}P{aj=k(\'a\',X.L.1U.o).K(1z-1);k(aj).2R(X.L.1U.5R);D 1T=12 9s();1T.X=k.1p(X,\'id\');1T.1z=1z-1;1T.2J=X.L.1Q[X.L.3u-1].2J;if(1T.21){1T.6S=S;k.2u.19.1D(1T)}P{1T.6S=k.2u.19}if(X.L.2x){X.L.2x.o.3x(X.L.1Q[1z-1].6L)}}}},95:u(){X=q.31.31;X.L.5u.B(\'19\',\'1o\');if(X.L.1U.5R){aj=k(\'a\',X.L.1U.o).4i(X.L.1U.5R).K(X.L.3u-1);k(aj).2R(X.L.1U.5R)}D 1T=12 9s();1T.X=k.1p(X,\'id\');1T.1z=X.L.3u-1;1T.2J=X.L.1Q[X.L.3u-1].2J;if(1T.21){1T.6S=S;k.2u.19.1D(1T)}P{1T.6S=k.2u.19}if(X.L.2x){X.L.2x.o.3x(X.L.1Q[X.L.3u-1].6L)}},19:u(){X=1h.9e(q.X);if(X.L.3z){X.L.3z.o.B(\'19\',\'1o\')}if(X.L.3s){X.L.3s.o.B(\'19\',\'1o\')}52=k.1a.2o(X);y=0;if(X.L.1U){if(X.L.1U.5A==\'Q\'){y+=X.L.1U.4C.hb}P{52.h-=X.L.1U.4C.hb}}if(X.L.2x){if(X.L.2x&&X.L.2x.6Q==\'Q\'){y+=X.L.2x.4C.hb}P{52.h-=X.L.2x.4C.hb}}hg=k(\'.ca\',X);y=y+(52.h-q.W)/2;x=(52.1C-q.Z)/2;X.L.5u.B(\'Q\',y+\'U\').B(\'O\',x+\'U\').3x(\'<1T 2J="\'+q.2J+\'" />\');X.L.5u.7f(X.L.3W);3s=X.L.3u+1;if(3s>X.L.1Q.1g){3s=1}3z=X.L.3u-1;if(3z<1){3z=X.L.1Q.1g}X.L.3s.o.B(\'19\',\'2B\').B(\'Q\',y+\'U\').B(\'O\',x+2*q.Z/3+\'U\').B(\'Z\',q.Z/3+\'U\').B(\'W\',q.W+\'U\').1p(\'4g\',X.L.1Q[3s-1].6L);X.L.3s.o.K(0).3h=\'#\'+3s+k.1p(X,\'id\');X.L.3z.o.B(\'19\',\'2B\').B(\'Q\',y+\'U\').B(\'O\',x+\'U\').B(\'Z\',q.Z/3+\'U\').B(\'W\',q.W+\'U\').1p(\'4g\',X.L.1Q[3z-1].6L);X.L.3z.o.K(0).3h=\'#\'+3z+k.1p(X,\'id\')},2r:u(o){if(!o||!o.1Z||k.2u.5I[o.1Z])E;D 1Z=k(\'#\'+o.1Z);D el=1Z.K(0);if(el.14.Y!=\'1P\'&&el.14.Y!=\'2s\'){el.14.Y=\'2s\'}el.14.2U=\'2K\';if(1Z.1N()==0)E;el.L={};el.L.1Q=o.1Q?o.1Q:[];el.L.6o=o.6o&&o.6o==1b||I;97=el.f3(\'hL\');24(i=0;i<97.1g;i++){7Z=el.L.1Q.1g;el.L.1Q[7Z]={2J:97[i].2J,6L:97[i].4g||97[i].hD||\'\'}}if(el.L.1Q.1g==0){E}el.L.4n=k.23(k.1a.3w(el),k.1a.2o(el));el.L.b5=k.1a.aT(el);el.L.bu=k.1a.6U(el);t=T(el.L.b5.t)+T(el.L.bu.t);b=T(el.L.b5.b)+T(el.L.bu.b);k(\'1T\',el).bk();el.L.3W=o.3W?o.3W:g5;if(o.5A||o.9f||o.5R){el.L.1U={};1Z.1S(\'<22 6T="g1"></22>\');el.L.1U.o=k(\'.g1\',el);if(o.9f){el.L.1U.9f=o.9f;el.L.1U.o.2R(o.9f)}if(o.5R){el.L.1U.5R=o.5R}el.L.1U.o.B(\'Y\',\'1P\').B(\'Z\',el.L.4n.w+\'U\');if(o.5A&&o.5A==\'Q\'){el.L.1U.5A=\'Q\';el.L.1U.o.B(\'Q\',t+\'U\')}P{el.L.1U.5A=\'4D\';el.L.1U.o.B(\'4D\',b+\'U\')}el.L.1U.aE=o.aE?o.aE:\' \';24(D i=0;i<el.L.1Q.1g;i++){7Z=T(i)+1;el.L.1U.o.1S(\'<a 3h="#\'+7Z+o.1Z+\'" 6T="gR" 4g="\'+el.L.1Q[i].6L+\'">\'+7Z+\'</a>\'+(7Z!=el.L.1Q.1g?el.L.1U.aE:\'\'))}k(\'a\',el.L.1U.o).1J(\'5h\',u(){k.2u.go({90:q})});el.L.1U.4C=k.1a.2o(el.L.1U.o.K(0))}if(o.6Q||o.9c){el.L.2x={};1Z.1S(\'<22 6T="dn">&7k;</22>\');el.L.2x.o=k(\'.dn\',el);if(o.9c){el.L.2x.9c=o.9c;el.L.2x.o.2R(o.9c)}el.L.2x.o.B(\'Y\',\'1P\').B(\'Z\',el.L.4n.w+\'U\');if(o.6Q&&o.6Q==\'Q\'){el.L.2x.6Q=\'Q\';el.L.2x.o.B(\'Q\',(el.L.1U&&el.L.1U.5A==\'Q\'?el.L.1U.4C.hb+t:t)+\'U\')}P{el.L.2x.6Q=\'4D\';el.L.2x.o.B(\'4D\',(el.L.1U&&el.L.1U.5A==\'4D\'?el.L.1U.4C.hb+b:b)+\'U\')}el.L.2x.4C=k.1a.2o(el.L.2x.o.K(0))}if(o.9D){el.L.3s={9D:o.9D};1Z.1S(\'<a 3h="#2\'+o.1Z+\'" 6T="eY">&7k;</a>\');el.L.3s.o=k(\'.eY\',el);el.L.3s.o.B(\'Y\',\'1P\').B(\'19\',\'1o\').B(\'2U\',\'2K\').B(\'4A\',\'eR\').2R(el.L.3s.9D);el.L.3s.o.1J(\'5h\',k.2u.eg)}if(o.9o){el.L.3z={9o:o.9o};1Z.1S(\'<a 3h="#0\'+o.1Z+\'" 6T="ee">&7k;</a>\');el.L.3z.o=k(\'.ee\',el);el.L.3z.o.B(\'Y\',\'1P\').B(\'19\',\'1o\').B(\'2U\',\'2K\').B(\'4A\',\'eR\').2R(el.L.3z.9o);el.L.3z.o.1J(\'5h\',k.2u.dp)}1Z.bG(\'<22 6T="ca"></22>\');el.L.5u=k(\'.ca\',el);el.L.5u.B(\'Y\',\'1P\').B(\'Q\',\'2P\').B(\'O\',\'2P\').B(\'19\',\'1o\');if(o.2b){1Z.bG(\'<22 6T="dW" 14="19: 1o;"><1T 2J="\'+o.2b+\'" /></22>\');el.L.2b=k(\'.dW\',el);el.L.2b.B(\'Y\',\'1P\');D 1T=12 9s();1T.X=o.1Z;1T.2J=o.2b;if(1T.21){1T.6S=S;k.2u.go({2b:1T})}P{1T.6S=u(){k.2u.go({2b:q})}}}P{k.2u.go({1Z:el})}if(o.cS){fi=T(o.cS)*aC}k.2u.5I[o.1Z]=o.cS?1X.6V(\'k.2u.2I(\\\'\'+o.1Z+\'\\\')\',fi):S}};k.X=k.2u.2r;k.1t={7s:[],5L:{},1c:I,7u:S,26:u(){if(k.11.F==S){E}D 4O,3G,c,cs;k.1t.1c.K(0).3l=k.11.F.A.6R;4O=k.1t.1c.K(0).14;4O.19=\'2B\';k.1t.1c.1B=k.23(k.1a.3w(k.1t.1c.K(0)),k.1a.2o(k.1t.1c.K(0)));4O.Z=k.11.F.A.1B.1C+\'U\';4O.W=k.11.F.A.1B.hb+\'U\';3G=k.1a.cy(k.11.F);4O.5K=3G.t;4O.5z=3G.r;4O.5k=3G.b;4O.5j=3G.l;if(k.11.F.A.46==1b){c=k.11.F.fI(1b);cs=c.14;cs.5K=\'2P\';cs.5z=\'2P\';cs.5k=\'2P\';cs.5j=\'2P\';cs.19=\'2B\';k.1t.1c.5o().1S(c)}k(k.11.F).f5(k.1t.1c.K(0));k.11.F.14.19=\'1o\'},fC:u(e){if(!e.A.44&&k.1x.5r.cQ){if(e.A.3T)e.A.3T.1D(F);k(e).B(\'Y\',e.A.cz||e.A.4n);k(e).aS();k(k.1x.5r).f6(e)}k.1t.1c.4i(e.A.6R).3x(\'&7k;\');k.1t.7u=S;D 4O=k.1t.1c.K(0).14;4O.19=\'1o\';k.1t.1c.f5(e);if(e.A.fx>0){k(e).7f(e.A.fx)}k(\'2e\').1S(k.1t.1c.K(0));D 86=[];D 8q=I;24(D i=0;i<k.1t.7s.1g;i++){D 1j=k.1x.3P[k.1t.7s[i]].K(0);D id=k.1p(1j,\'id\');D 8i=k.1t.8x(id);if(1j.1i.ay!=8i.7l){1j.1i.ay=8i.7l;if(8q==I&&1j.1i.2Z){8q=1j.1i.2Z}8i.id=id;86[86.1g]=8i}}k.1t.7s=[];if(8q!=I&&86.1g>0){8q(86)}},al:u(e,o){if(!k.11.F)E;D 6e=I;D i=0;if(e.1i.el.1N()>0){24(i=e.1i.el.1N();i>0;i--){if(e.1i.el.K(i-1)!=k.11.F){if(!e.5V.b2){if((e.1i.el.K(i-1).1M.y+e.1i.el.K(i-1).1M.hb/2)>k.11.F.A.2q){6e=e.1i.el.K(i-1)}P{1r}}P{if((e.1i.el.K(i-1).1M.x+e.1i.el.K(i-1).1M.1C/2)>k.11.F.A.2v&&(e.1i.el.K(i-1).1M.y+e.1i.el.K(i-1).1M.hb/2)>k.11.F.A.2q){6e=e.1i.el.K(i-1)}}}}}if(6e&&k.1t.7u!=6e){k.1t.7u=6e;k(6e).h5(k.1t.1c.K(0))}P if(!6e&&(k.1t.7u!=S||k.1t.1c.K(0).31!=e)){k.1t.7u=S;k(e).1S(k.1t.1c.K(0))}k.1t.1c.K(0).14.19=\'2B\'},cT:u(e){if(k.11.F==S){E}e.1i.el.1E(u(){q.1M=k.23(k.1a.74(q),k.1a.7G(q))})},8x:u(s){D i;D h=\'\';D o={};if(s){if(k.1t.5L[s]){o[s]=[];k(\'#\'+s+\' .\'+k.1t.5L[s]).1E(u(){if(h.1g>0){h+=\'&\'}h+=s+\'[]=\'+k.1p(q,\'id\');o[s][o[s].1g]=k.1p(q,\'id\')})}P{24(a in s){if(k.1t.5L[s[a]]){o[s[a]]=[];k(\'#\'+s[a]+\' .\'+k.1t.5L[s[a]]).1E(u(){if(h.1g>0){h+=\'&\'}h+=s[a]+\'[]=\'+k.1p(q,\'id\');o[s[a]][o[s[a]].1g]=k.1p(q,\'id\')})}}}}P{24(i in k.1t.5L){o[i]=[];k(\'#\'+i+\' .\'+k.1t.5L[i]).1E(u(){if(h.1g>0){h+=\'&\'}h+=i+\'[]=\'+k.1p(q,\'id\');o[i][o[i].1g]=k.1p(q,\'id\')})}}E{7l:h,o:o}},fF:u(e){if(!e.dq){E}E q.1E(u(){if(!q.5V||!k(e).is(\'.\'+q.5V.3C))k(e).2R(q.5V.3C);k(e).7t(q.5V.A)})},4U:u(){E q.1E(u(){k(\'.\'+q.5V.3C).aS();k(q).dR();q.5V=S;q.fm=S})},2r:u(o){if(o.3C&&k.1a&&k.11&&k.1x){if(!k.1t.1c){k(\'2e\',1h).1S(\'<22 id="e5">&7k;</22>\');k.1t.1c=k(\'#e5\');k.1t.1c.K(0).14.19=\'1o\'}q.do({3C:o.3C,9J:o.9J?o.9J:I,a5:o.a5?o.a5:I,58:o.58?o.58:I,7x:o.7x||o.dC,7y:o.7y||o.fO,cQ:1b,2Z:o.2Z||o.ia,fx:o.fx?o.fx:I,46:o.46?1b:I,6I:o.6I?o.6I:\'cV\'});E q.1E(u(){D A={6N:o.6N?1b:I,ff:6P,1G:o.1G?2m(o.1G):I,6R:o.58?o.58:I,fx:o.fx?o.fx:I,44:1b,46:o.46?1b:I,3v:o.3v?o.3v:S,2p:o.2p?o.2p:S,4o:o.4o&&o.4o.1K==2A?o.4o:I,4m:o.4m&&o.4m.1K==2A?o.4m:I,3T:o.3T&&o.3T.1K==2A?o.3T:I,1O:/49|4j/.48(o.1O)?o.1O:I,6M:o.6M?T(o.6M)||0:I,2V:o.2V?o.2V:I};k(\'.\'+o.3C,q).7t(A);q.fm=1b;q.5V={3C:o.3C,6N:o.6N?1b:I,ff:6P,1G:o.1G?2m(o.1G):I,6R:o.58?o.58:I,fx:o.fx?o.fx:I,44:1b,46:o.46?1b:I,3v:o.3v?o.3v:S,2p:o.2p?o.2p:S,b2:o.b2?1b:I,A:A}})}}};k.fn.23({j3:k.1t.2r,f6:k.1t.fF,iS:k.1t.4U});k.iZ=k.1t.8x;k.2t={6O:S,7b:I,9m:S,6K:u(e){k.2t.7b=1b;k.2t.1Y(e,q,1b)},cq:u(e){if(k.2t.6O!=q)E;k.2t.7b=I;k.2t.2G(e,q)},1Y:u(e,el,7b){if(k.2t.6O!=S)E;if(!el){el=q}k.2t.6O=el;1M=k.23(k.1a.3w(el),k.1a.2o(el));8u=k(el);4g=8u.1p(\'4g\');3h=8u.1p(\'3h\');if(4g){k.2t.9m=4g;8u.1p(\'4g\',\'\');k(\'#eT\').3x(4g);if(3h)k(\'#bL\').3x(3h.4E(\'jh://\',\'\'));P k(\'#bL\').3x(\'\');1c=k(\'#8z\');if(el.4H.3l){1c.K(0).3l=el.4H.3l}P{1c.K(0).3l=\'\'}bo=k.1a.2o(1c.K(0));ga=7b&&el.4H.Y==\'bO\'?\'4D\':el.4H.Y;3m(ga){1e\'Q\':2q=1M.y-bo.hb;2v=1M.x;1r;1e\'O\':2q=1M.y;2v=1M.x-bo.1C;1r;1e\'2L\':2q=1M.y;2v=1M.x+1M.1C;1r;1e\'bO\':k(\'2e\').1J(\'3D\',k.2t.3D);1s=k.1a.4a(e);2q=1s.y+15;2v=1s.x+15;1r;ad:2q=1M.y+1M.hb;2v=1M.x;1r}1c.B({Q:2q+\'U\',O:2v+\'U\'});if(el.4H.54==I){1c.1Y()}P{1c.7f(el.4H.54)}if(el.4H.2Y)el.4H.2Y.1D(el);8u.1J(\'8B\',k.2t.2G).1J(\'5B\',k.2t.cq)}},3D:u(e){if(k.2t.6O==S){k(\'2e\').3q(\'3D\',k.2t.3D);E}1s=k.1a.4a(e);k(\'#8z\').B({Q:1s.y+15+\'U\',O:1s.x+15+\'U\'})},2G:u(e,el){if(!el){el=q}if(k.2t.7b!=1b&&k.2t.6O==el){k.2t.6O=S;k(\'#8z\').7a(1);k(el).1p(\'4g\',k.2t.9m).3q(\'8B\',k.2t.2G).3q(\'5B\',k.2t.cq);if(el.4H.3i)el.4H.3i.1D(el);k.2t.9m=S}},2r:u(M){if(!k.2t.1c){k(\'2e\').1S(\'<22 id="8z"><22 id="eT"></22><22 id="bL"></22></22>\');k(\'#8z\').B({Y:\'1P\',3I:6P,19:\'1o\'});k.2t.1c=1b}E q.1E(u(){if(k.1p(q,\'4g\')){q.4H={Y:/Q|4D|O|2L|bO/.48(M.Y)?M.Y:\'4D\',3l:M.3l?M.3l:I,54:M.54?M.54:I,2Y:M.2Y&&M.2Y.1K==2A?M.2Y:I,3i:M.3i&&M.3i.1K==2A?M.3i:I};D el=k(q);el.1J(\'9z\',k.2t.1Y);el.1J(\'6K\',k.2t.6K)}})}};k.fn.hO=k.2t.2r;k.84={bq:u(e){3K=e.7L||e.7K||-1;if(3K==9){if(1X.2k){1X.2k.bT=1b;1X.2k.c0=I}P{e.aP();e.aW()}if(q.b1){1h.6J.dZ().3g="\\t";q.dV=u(){q.6K();q.dV=S}}P if(q.aF){26=q.5q;2T=q.dN;q.2y=q.2y.hd(0,26)+"\\t"+q.2y.h8(2T);q.aF(26+1,26+1);q.6K()}E I}},4U:u(){E q.1E(u(){if(q.7P&&q.7P==1b){k(q).3q(\'7B\',k.84.bq);q.7P=I}})},2r:u(){E q.1E(u(){if(q.4Y==\'cf\'&&(!q.7P||q.7P==I)){k(q).1J(\'7B\',k.84.bq);q.7P=1b}})}};k.fn.23({j5:k.84.2r,hH:k.84.4U});k.1a={3w:u(e){D x=0;D y=0;D es=e.14;D bP=I;if(k(e).B(\'19\')==\'1o\'){D 5Y=es.3n;D 9q=es.Y;bP=1b;es.3n=\'2K\';es.19=\'2B\';es.Y=\'1P\'}D el=e;7d(el){x+=el.8t+(el.4Z&&!k.3a.7I?T(el.4Z.5b)||0:0);y+=el.8G+(el.4Z&&!k.3a.7I?T(el.4Z.4S)||0:0);el=el.dJ}el=e;7d(el&&el.4Y&&el.4Y.6c()!=\'2e\'){x-=el.3c||0;y-=el.3d||0;el=el.31}if(bP==1b){es.19=\'1o\';es.Y=9q;es.3n=5Y}E{x:x,y:y}},7G:u(el){D x=0,y=0;7d(el){x+=el.8t||0;y+=el.8G||0;el=el.dJ}E{x:x,y:y}},2o:u(e){D w=k.B(e,\'Z\');D h=k.B(e,\'W\');D 1C=0;D hb=0;D es=e.14;if(k(e).B(\'19\')!=\'1o\'){1C=e.4c;hb=e.5W}P{D 5Y=es.3n;D 9q=es.Y;es.3n=\'2K\';es.19=\'2B\';es.Y=\'1P\';1C=e.4c;hb=e.5W;es.19=\'1o\';es.Y=9q;es.3n=5Y}E{w:w,h:h,1C:1C,hb:hb}},74:u(el){E{1C:el.4c||0,hb:el.5W||0}},bm:u(e){D h,w,de;if(e){w=e.8W;h=e.8O}P{de=1h.5d;w=1X.d4||aa.d4||(de&&de.8W)||1h.2e.8W;h=1X.cB||aa.cB||(de&&de.8O)||1h.2e.8O}E{w:w,h:h}},6z:u(e){D t=0,l=0,w=0,h=0,iw=0,ih=0;if(e&&e.9N.6c()!=\'2e\'){t=e.3d;l=e.3c;w=e.d7;h=e.d2;iw=0;ih=0}P{if(1h.5d){t=1h.5d.3d;l=1h.5d.3c;w=1h.5d.d7;h=1h.5d.d2}P if(1h.2e){t=1h.2e.3d;l=1h.2e.3c;w=1h.2e.d7;h=1h.2e.d2}iw=aa.d4||1h.5d.8W||1h.2e.8W||0;ih=aa.cB||1h.5d.8O||1h.2e.8O||0}E{t:t,l:l,w:w,h:h,iw:iw,ih:ih}},cy:u(e,7N){D el=k(e);D t=el.B(\'5K\')||\'\';D r=el.B(\'5z\')||\'\';D b=el.B(\'5k\')||\'\';D l=el.B(\'5j\')||\'\';if(7N)E{t:T(t)||0,r:T(r)||0,b:T(b)||0,l:T(l)};P E{t:t,r:r,b:b,l:l}},aT:u(e,7N){D el=k(e);D t=el.B(\'5M\')||\'\';D r=el.B(\'5U\')||\'\';D b=el.B(\'5n\')||\'\';D l=el.B(\'4X\')||\'\';if(7N)E{t:T(t)||0,r:T(r)||0,b:T(b)||0,l:T(l)};P E{t:t,r:r,b:b,l:l}},6U:u(e,7N){D el=k(e);D t=el.B(\'4S\')||\'\';D r=el.B(\'5O\')||\'\';D b=el.B(\'5Q\')||\'\';D l=el.B(\'5b\')||\'\';if(7N)E{t:T(t)||0,r:T(r)||0,b:T(b)||0,l:T(l)||0};P E{t:t,r:r,b:b,l:l}},4a:u(2k){D x=2k.hT||(2k.gM+(1h.5d.3c||1h.2e.3c))||0;D y=2k.ki||(2k.iQ+(1h.5d.3d||1h.2e.3d))||0;E{x:x,y:y}},cI:u(4R,cx){cx(4R);4R=4R.7c;7d(4R){k.1a.cI(4R,cx);4R=4R.hQ}},h7:u(4R){k.1a.cI(4R,u(el){24(D 1p in el){if(2g el[1p]===\'u\'){el[1p]=S}}})},hV:u(el,1O){D 5l=k.1a.6z();D b6=k.1a.2o(el);if(!1O||1O==\'49\')k(el).B({Q:5l.t+((18.3r(5l.h,5l.ih)-5l.t-b6.hb)/2)+\'U\'});if(!1O||1O==\'4j\')k(el).B({O:5l.l+((18.3r(5l.w,5l.iw)-5l.l-b6.1C)/2)+\'U\'})},hW:u(el,dk){D 1Q=k(\'1T[@2J*="8X"]\',el||1h),8X;1Q.1E(u(){8X=q.2J;q.2J=dk;q.14.5E="9n:9w.9y.hE(2J=\'"+8X+"\')"})}};[].3J||(7F.hF.3J=u(v,n){n=(n==S)?0:n;D m=q.1g;24(D i=n;i<m;i++)if(q[i]==v)E i;E-1});',62,1293,'||||||||||||||||||||jQuery||||||this||||function||||||dragCfg|css|elm|var|return|dragged|easing|speed|false|callback|get|ss|options|iAuto|left|else|top|iResize|null|parseInt|px|oldStyle|height|slideshow|position|width||iDrag|new||style||||Math|display|iUtil|true|helper|subject|case|autoCFG|length|document|dropCfg|iEL|resizeOptions|carouselCfg|duration|interfaceFX|none|attr|sizes|break|pointer|iSort|type|ImageBox|queue|iDrop|iAutoscroller|slide|resizeElement|oC|wb|apply|each|fisheyeCfg|opacity|delta|newSizes|bind|constructor|custom|pos|size|axis|absolute|images|items|append|img|slideslinks|255|firstNum|window|show|container||complete|div|extend|for||start||cont|elsToScroll|100|loader|oR||body|elem|typeof|selectedItem|oldP|props|event|accordionCfg|parseFloat|field|getSize|containment|ny|build|relative|iTooltip|islideshow|nx|tp|slideCaption|value|newPosition|Function|block|selectHelper|step|border|itemWidth|hide|dequeue|timer|src|hidden|right|limit|nr|fractions|0px|PI|addClass|direction|end|overflow|cursorAt|result|parentData|onShow|onChange|to|parentNode|||||||||browser|iSlider|scrollLeft|scrollTop|scr|transferHelper|text|href|onHide|pre|selectdrug|className|switch|visibility|item|wrapper|unbind|max|nextslide|values|currentslide|handle|getPosition|html|newCoords|prevslide|iframe|iExpander|accept|mousemove|canvas|createElement|margins|onSlide|zIndex|indexOf|pressedKey|min|valueToAdd|multipleSeparator|pageSize|zones|highlighted|toggle|abs|onStop|dragElem|times|fadeDuration|diff|dhs|handlers||resizeDirection||vp|so|distance|ghosting||test|vertically|getPointer|startTop|offsetWidth|subjectValue|lastSuggestion|DropOutDirectiont|title|wrs|removeClass|horizontally|startLeft|out|onDrag|oP|onStart|nWidth|percent|down|ifxFirstDisplay|msie|iteration|ratio|clear|color|lastValue|slideCfg|fontSize|currentPointer|dimm|bottom|replace|up|prevImage|tooltipCFG|rel|els|fxCheckTag|context|nextImage|params|shs|fieldData|elToScroll|nodeEl|borderTopWidth|chunks|destroy|string|nHeight|paddingLeft|tagName|currentStyle||halign|slidePos|onclick|delay||containerW|from|helperclass|endLeft|endTop|borderLeftWidth|dragmoveBy|documentElement|dhe|newStyles|clonedEl|click|si|marginLeft|marginBottom|clientScroll|OpenClose|paddingBottom|empty|toWrite|selectionStart|overzone|toAdd|onDragModifier|holder|mousedown|animate|toDrag|cnt|marginRight|linksPosition|blur|getAttribute|hight|filter|sw|zoney|cos|slideshows|zonex|marginTop|collected|paddingTop|url|borderRightWidth|mouseup|borderBottomWidth|activeLinkClass|dragHandle|clearInterval|paddingRight|sortCfg|offsetHeight|prop|oldVisibility|styles||BlindDirection|point|fxh|nmp|old|post|currentPanel|onSelect|elementData|grid|pow|toLowerCase|animationHandler|cur|containerH|close|puff|getWidth|currentRel|imageEl|Expander|getHeight|iFisheye|random|newDimensions|itemHeight|reflections|sliders|selRange|wr|orig|margin|maxWidth|keyup|getScroll|captionText|totalImages|128|parseColor|curCSS|outerContainer|Scale|restore|tolerance|selection|focus|caption|snapDistance|revert|current|3000|captionPosition|hpc|onload|class|getBorder|setInterval|oldStyleAttr|rule|rgb|open|minLeft|ActiveXObject|oldDisplay|restoreStyle|getSizeLite||nw|0x||F0|fadeOut|focused|firstChild|while|cssRules|fadeIn|Date|minTop|backgroundColor|sc|nbsp|hash|captionEl|selectKeyHelper|selectCurrent|newTop|init|newLeft|changed|Draggable|inFrontOf|efx|139|onHover|onOut|getTime|np|keydown|split|radiusY|increment|Array|getPositionLite|selectClass|opera|onHighlight|keyCode|charCode|Object|toInteger|frameClass|hasTabsEnabled|zonew|user|zoneh|positionItems|onClick|oD|scrollIntoView|accordionPos|proximity|indic||data|containerSize|sin|iTTabs||ts|ImageBoxPrevImage|ImageBoxNextImage|imageSrc|newPos|maxHeight|minHeight|elS|activeClass|panels|maxBottom|maxRight|ser|move|opened|bounceout|animationInProgress|overlay|stop|reflectionSize|fnc|classname|insideParent|offsetLeft|jEl|nRy|pr|serialize|nRx|tooltipHelper|cssSides|mouseout|select|count|namedColors|padding|offsetTop|directionIncrement|parentEl|400|dir|expand|createTextNode|finishedPre|clientHeight|li|applyOn|content|contBorders|object|parentBorders|alpha|clientWidth|png|gallery|fontWeight|link|yproc|xproc|sx|parent|showImage|selectedone|imgs|onselect|sy|startDrag|cursor|captionClass|onselectstop|getElementById|linksClass|sh|ul|onActivate|isDroppable|nextEl|onDrop|oldTitle|progid|prevslideClass|prevEl|oldPosition|SliderContainer|Image|linkRel|selectKeyUp|selectKeyDown|DXImageTransform|inCache|Microsoft|mouseover|dragstop|diffX|211|nextslideClass|prot|auto|dEs|hidehelper|isDraggable|activeclass|unit|DoFold|unfold|nodeName|startTime|buildWrapper|prev|1px|oldColor|setTimeout|ScrollTo|st|sl|cssText|9999|next|destroyWrapper|opt|diffHeight|diffWidth|exec|hoverclass|image|blind|borderColor|sideEnd|self|key||default|2000|styleSheets|getValues|192|diffY|lnk|reflexions|checkhover|selectcheck|maxRotation|ImageBoxOuterContainer|gradient|panelHeight|childs|headers|ne|hideImage|minWidth|iIndex|itemsText|os|side|iCarousel|5625|1000|itemMinWidth|linksSeparator|setSelectionRange|protectRotation|positionContainer|posx|hoverClass|valToAdd|minchars|helperClass|source|nextImageEl|preventDefault|multiple|headerSelector|DraggableDestroy|getPadding|autofill|handleEl|stopPropagation|prevImageEl|getFieldValues|panelSelector|String|createTextRange|floats|lastSi|shrink|oPad|windowSize|paddingLeftSize|angle|paddingY|paddingX|RegExp|borderRightSize|floatVal|firstStep|pulse|Pulsate|Color|rotationSpeed|paddingBottomSize|remove|parseStyle|getClient|Number|helperSize|bounce|doTab||zoom|borderLeftSize|oBor|paddingRightSize|borderTopSize|paddingTopSize|stopAnim|pValue|borderBottomSize|extraWidth|restricted|autoSize|unselectable|SliderIteration|prepend|clearTimeout|isSlider|oneIsSortable|applyOnHover|tooltipURL|tabindex|draginit|mouse|restoreStyles|sliderSize|sliderPos|parentPos|cancelBubble|autocomplete|inputWidth|oldBorder|dragmove|clnt|sliderEl|returnValue|loaderWidth|idsa|letterSpacing|pause|getContainment|fade|snapToGrid|linear|10000|slideshowHolder|asin|cssSidesEnd|borderWidth|fitToContainer|TEXTAREA|entities|INPUT|spacer|writeItems|character|currentValue|paddings|169|oldFloat|borders|hidefocused|bouncein||modifyContainer|transparent|center|loadImage|func|getMargins|initialPosition|textAlign|innerHeight|Alpha|no|captionImages|closeEl|shake|prevTop|traverseDOM|Selectserialize|stopDrag|slider|ImageBoxCaption|ImageBoxIframe|300|ImageBoxOverlay|sortable|moveDrag|autoplay|measure|prevLeft|intersect|ImageBoxCurrentImage|selectstop|Shake|index|dragEl|keyPressed|scrollHeight|scroll|innerWidth|match|elPosition|scrollWidth|textImage|slideBor|jpg|captionSize|textImageFrom|visible||loaderHeight|ImageBoxCaptionImages||hoverItem|clickItem|emptyGIF||notColor|slideshowCaption|Droppable|goprev|childNodes|autocompleteHelper|autocompleteIframe|slidePad|fit|165|clientSize|||fontFamily|colorCssProps|elType|onhover|cssProps|expanderHelper|boxModel|itransferTo|keypress|moveStart|offsetParent|Width|selectstart|fxe|selectionEnd|checkCache|fontStyle|update|DroppableDestroy|remeasure|fontStretch|fontVariant|onblur|slideshowLoader|htmlEntities|wordSpacing|createRange|224|KhtmlUserSelect||closeHTML|on|sortHelper|245|userSelect|dragHelper|hrefAttr|dragstart|107|loaderSRC|highlight|slideshowPrevslide||gonext||styleFloat|frameborder|javascript|||relAttr|wid|scrolling||onslide|||listStyle|imageTypes|insertBefore|999|textDecoration|sqrt|140|230|maxy|240|ImageBoxContainer|doScroll|interval|set|dragmoveByKey|protect|ImageBoxCaptionText|144|ImageBoxLoader|off|checkdrop|isSelectable|hlt|30px|selectedclass|tooltipTitle|imagebox|shc|overlayOpacity|selRange2|slideshowNextSlide|gif|getSelectionStart|360|iAccordion|getElementsByTagName|iBounce|after|SortableAddItem|onResize|150|itemZIndex|grow|getHeightMinMax|borderTopUnit|selectcheckApply|borderRightUnit|zindex|fontUnit|togglehor|time|se|parte|easeout|isSortable||SlideInUp|fold|SlideOutUp|rgba|addColorStop|yfrac|containerMaxx|interfaceColorFX|containerMaxy||leftUnit|mousex||radiusX|check|getContext|xfrac|addItem|topUnit|fracH|cloneNode|togglever|paddingLeftUnit|borderBottomUnit|finish|onDragStop|onout|posy|isFunction|oldOverflow|directions|vertical|fracW|fakeAccordionClass|parts|fadeTo|inputValue|xml|selectstopApply|slideshowLinks|onDragStart|BlindUp|paddingTopUnit|500|trim|maxx|borderLeftUnit|paddingRightUnit|filteredPosition|BlindDown|paddingBottomUnit|horizontal|valign|find|ImageBoxClose|onselectstart|mozUserSelect|ondragstart|scale|110|globalCompositeOperation|bmp||drawImage|ondrop|password|quot||save|starty|jpeg|||number|startx|finishOpacity|hover|recallDroppables|flipv|finishx|destination|khtml|moz|lt|amp|pW|clientX|Accordion|translate|captiontext|elasticin|slideshowLink|fix|elasticout|resize|elasticboth|bounceboth|984375|9375|Selectable|30002|list|625|30001|nodeValue|before|100000|purgeEvents|substr|duplicate|moveEnd|||substring|success|param|par|array|Fisheye|name|POST|ajax|easeboth|location|fromHandler|collapse|MozUserSelect||ResizableDestroy|rotationTimer|fillRect|fill|WebKit|fillStyle|createLinearGradient|Resizable|navigator|appVersion|lineHeigt|alt|AlphaImageLoader|prototype|SliderGetValues|DisableTabs|Carousel|load|easein|IMG|200|Slider|ToolTip|wh|nextSibling|Autocomplete|SliderSetValues|pageX|float|centerEl|fixPNG|isNaN|dotted|dashed|stopAll|Left|outlineColor|Top|Right|Bottom|solid|double|selectorText|rules|onchange|SlideToggleRight|SlideOutRight||borderStyle||TransferTo||groove|ridge|inset|outset|borderTopColor||borderRightColor|olive|navy|orange||pink|203|maroon||magenta|182|193|lightyellow|lime|purple|red|outlineOffset|outlineWidth|borderBottomColor|borderLeftColor|lineHeight|loading|silver|white|yellow|Showing|100000000|SlideInRight|clientY|Highlight|SortableDestroy|CloseVertically|CloseHorizontally|FoldToggle|UnFold|SlideInDown|SlideToggleUp|SortSerialize|Fold|SwitchHorizontally|SwitchVertically|Sortable|scrollTo|EnableTabs|ScrollToAnchors|pt|Puff|OpenVertically|OpenHorizontally|Grow|Shrink|DropToggleRight|DropInRight|BlindToggleHorizontally|BlindRight|http|Bounce|120|BlindLeft|BlindToggleVertically|SlideToggleLeft|SlideOutLeft|toUpperCase|SlideInLeft|SlideToggleDown|SlideOutDown|DropOutLeft|DropInLeft|DropToggleLeft|DropOutRight|DropToggleUp|DropInUp|DropOutDown|DropInDown|DropToggleDown|DropOutUp|lightpink|textIndent|aqua|appendChild|azure|beige|220|last|cssFloat|first|ol|wrapEl|fxWrapper|black|imageLoaded|darkkhaki|darkgreen|189|183|darkmagenta|firstResize|darkgrey|brown|cyan|darkblue|darkcyan|table|form|col|tfoot|colgroup|th|header|thead|tbody|112|Autoexpand|tr|td|script|frame|input|pageY|textarea|button|w_|removeChild|frameset|option|optgroup|meta|darkolivegreen|blue|122|233|green|lightcyan|204|darkviolet|lightgreen|indigo|216|khaki|darksalmon|130|darkred|lightblue|148|173|215|238|fuchsia|gold|darkorchid|153|darkorange|lightgrey'.split('|'),0,{}))
+eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('A.cP={2l:C(c){G B.1y(C(){if(!c.8Y||!c.8P)G;F b=B;b.2a={9M:c.9M||bz,8Y:c.8Y,8P:c.8P,7R:c.7R||\'du\',9c:c.9c||\'du\',2K:c.2K&&28 c.2K==\'C\'?c.2K:H,2V:c.2K&&28 c.2V==\'C\'?c.2V:H,6D:c.6D&&28 c.6D==\'C\'?c.6D:H,8A:A(c.8Y,B),8a:A(c.8P,B),1l:c.1l||7n,5w:c.5w||0};b.2a.8a.2x().E(\'S\',\'9e\').eq(0).E({S:b.2a.9M+\'Q\',11:\'2v\'}).3m();b.2a.8A.1y(C(a){B.6L=a}).ht(C(){A(B).2H(b.2a.9c)},C(){A(B).3S(b.2a.9c)}).1C(\'4U\',C(e){if(b.2a.5w==B.6L)G;b.2a.8A.eq(b.2a.5w).3S(b.2a.7R).3m().eq(B.6L).2H(b.2a.7R).3m();b.2a.8a.eq(b.2a.5w).4S({S:0},b.2a.1l,C(){B.Y.11=\'1k\';if(b.2a.2V){b.2a.2V.1x(b,[B])}}).3m().eq(B.6L).1S().4S({S:b.2a.9M},b.2a.1l,C(){B.Y.11=\'2v\';if(b.2a.2K){b.2a.2K.1x(b,[B])}}).3m();if(b.2a.6D){b.2a.6D.1x(b,[B,b.2a.8a.I(B.6L),b.2a.8A.I(b.2a.5w),b.2a.8a.I(b.2a.5w)])}b.2a.5w=B.6L}).eq(0).2H(b.2a.7R).3m();A(B).E(\'S\',A(B).E(\'S\')).E(\'2N\',\'2B\')})}};A.fn.fe=A.cP.2l;A.8p={2l:C(h){G B.1y(C(){F c=B;F d=2*Z.2F/eD;F f=2*Z.2F;if(A(c).E(\'T\')!=\'2i\'&&A(c).E(\'T\')!=\'1J\'){A(c).E(\'T\',\'2i\')}c.1i={1M:A(h.1M,B),2y:h.2y,61:h.61,9l:h.9l,iu:f,1N:A.12.2f(B),T:A.12.3a(B),2b:Z.2F/2,b4:h.b4,7K:h.5U,5U:[],93:H,7G:2*Z.2F/eD};c.1i.d8=(c.1i.1N.w-c.1i.2y)/2;c.1i.6Y=(c.1i.1N.h-c.1i.61-c.1i.61*c.1i.7K)/2;c.1i.3f=2*Z.2F/c.1i.1M.1N();c.1i.aS=c.1i.1N.w/2;c.1i.aR=c.1i.1N.h/2-c.1i.61*c.1i.7K;F g=1c.3x(\'1W\');A(g).E({T:\'1J\',3j:1,O:0,M:0});A(c).1L(g);c.1i.1M.1y(C(a){8G=A(\'3O\',B).I(0);S=R(c.1i.61*c.1i.7K);if(A.2R.46){3u=1c.3x(\'3O\');A(3u).E(\'T\',\'1J\');3u.2E=8G.2E;3u.Y.4X=\'fu 9x:9C.9E.a6(1E=60, Y=1, fc=0, f9=0, f5=0, f3=0)\'}L{3u=1c.3x(\'3u\');if(3u.bZ){4j=3u.bZ("2d");3u.Y.T=\'1J\';3u.Y.S=S+\'Q\';3u.Y.V=c.1i.2y+\'Q\';3u.S=S;3u.V=c.1i.2y;4j.eR();4j.eM(0,S);4j.eJ(1,-1);4j.jm(8G,0,0,c.1i.2y,S);4j.bL();4j.jl="jh-3U";F b=4j.jf(0,0,0,S);b.es(1,"eg(1O, 1O, 1O, 1)");b.es(0,"eg(1O, 1O, 1O, 0.6)");4j.j9=b;if(j7.j5.3o(\'iX\')!=-1){4j.iV()}L{4j.iS(0,0,c.1i.2y,S)}}}c.1i.5U[a]=3u;A(g).1L(3u)}).1C(\'9r\',C(e){c.1i.93=14;c.1i.1l=c.1i.7G*0.1*c.1i.1l/Z.3B(c.1i.1l);G H}).1C(\'86\',C(e){c.1i.93=H;G H});A.8p.6z(c);c.1i.1l=c.1i.7G*0.2;c.1i.it=1P.5Y(C(){c.1i.2b+=c.1i.1l;if(c.1i.2b>f)c.1i.2b=0;A.8p.6z(c)},20);A(c).1C(\'86\',C(){c.1i.1l=c.1i.7G*0.2*c.1i.1l/Z.3B(c.1i.1l)}).1C(\'3t\',C(e){if(c.1i.93==H){1A=A.12.3W(e);dr=c.1i.1N.w-1A.x+c.1i.T.x;c.1i.1l=c.1i.b4*c.1i.7G*(c.1i.1N.w/2-dr)/(c.1i.1N.w/2)}})})},6z:C(b){b.1i.1M.1y(C(a){b8=b.1i.2b+a*b.1i.3f;x=b.1i.d8*Z.51(b8);y=b.1i.6Y*Z.7L(b8);do=R(1Y*(b.1i.6Y+y)/(2*b.1i.6Y));dm=(b.1i.6Y+y)/(2*b.1i.6Y);V=R((b.1i.2y-b.1i.9l)*dm+b.1i.9l);S=R(V*b.1i.61/b.1i.2y);B.Y.O=b.1i.aR+y-S/2+"Q";B.Y.M=b.1i.aS+x-V/2+"Q";B.Y.V=V+"Q";B.Y.S=S+"Q";B.Y.3j=do;b.1i.5U[a].Y.O=R(b.1i.aR+y+S-1-S/2)+"Q";b.1i.5U[a].Y.M=R(b.1i.aS+x-V/2)+"Q";b.1i.5U[a].Y.V=V+"Q";b.1i.5U[a].Y.S=R(S*b.1i.7K)+"Q"})}};A.fn.hL=A.8p.2l;A.1U({1e:{b1:C(p,n,a,b,c){G((-Z.51(p*Z.2F)/2)+0.5)*b+a},ho:C(p,n,a,b,c){G b*(n/=c)*n*n+a},d2:C(p,n,a,b,c){G-b*((n=n/c-1)*n*n*n-1)+a},hh:C(p,n,a,b,c){if((n/=c/2)<1)G b/2*n*n*n*n+a;G-b/2*((n-=2)*n*n*n-2)+a},7D:C(p,n,a,b,c){if((n/=c)<(1/2.75)){G b*(7.8W*n*n)+a}L if(n<(2/2.75)){G b*(7.8W*(n-=(1.5/2.75))*n+.75)+a}L if(n<(2.5/2.75)){G b*(7.8W*(n-=(2.25/2.75))*n+.gV)+a}L{G b*(7.8W*(n-=(2.gR/2.75))*n+.gN)+a}},aQ:C(p,n,a,b,c){if(A.1e.7D)G b-A.1e.7D(p,c-n,0,b,c)+a;G a+b},gE:C(p,n,a,b,c){if(A.1e.aQ&&A.1e.7D)if(n<c/2)G A.1e.aQ(p,n*2,0,b,c)*.5+a;G A.1e.7D(p,n*2-c,0,b,c)*.5+b*.5+a;G a+b},gz:C(p,n,b,c,d){F a,s;if(n==0)G b;if((n/=d)==1)G b+c;a=c*0.3;p=d*.3;if(a<Z.3B(c)){a=c;s=p/4}L{s=p/(2*Z.2F)*Z.aP(c/a)}G-(a*Z.5j(2,10*(n-=1))*Z.7L((n*d-s)*(2*Z.2F)/p))+b},gg:C(p,n,b,c,d){F a,s;if(n==0)G b;if((n/=d/2)==2)G b+c;a=c*0.3;p=d*.3;if(a<Z.3B(c)){a=c;s=p/4}L{s=p/(2*Z.2F)*Z.aP(c/a)}G a*Z.5j(2,-10*n)*Z.7L((n*d-s)*(2*Z.2F)/p)+c+b},gd:C(p,n,b,c,d){F a,s;if(n==0)G b;if((n/=d/2)==2)G b+c;a=c*0.3;p=d*.3;if(a<Z.3B(c)){a=c;s=p/4}L{s=p/(2*Z.2F)*Z.aP(c/a)}if(n<1){G-.5*(a*Z.5j(2,10*(n-=1))*Z.7L((n*d-s)*(2*Z.2F)/p))+b}G a*Z.5j(2,-10*(n-=1))*Z.7L((n*d-s)*(2*Z.2F)/p)*.5+c+b}}});A.5K={2l:C(h){G B.1y(C(){F g=B;g.1z={1M:A(h.1M,B),2q:A(h.2q,B),1I:A.12.3a(B),2y:h.2y,8K:h.8K,6q:h.6q,cG:h.cG,4I:h.4I,5R:h.5R};A.5K.8F(g,0);A(1P).1C(\'fR\',C(){g.1z.1I=A.12.3a(g);A.5K.8F(g,0);A.5K.6z(g)});A.5K.6z(g);g.1z.1M.1C(\'9r\',C(){A(g.1z.8K,B).I(0).Y.11=\'2v\'}).1C(\'86\',C(){A(g.1z.8K,B).I(0).Y.11=\'1k\'});A(1c).1C(\'3t\',C(e){F b=A.12.3W(e);F c=0;if(g.1z.4I&&g.1z.4I==\'az\')F d=b.x-g.1z.1I.x-(g.3P-g.1z.2y*g.1z.1M.1N())/2-g.1z.2y/2;L if(g.1z.4I&&g.1z.4I==\'2D\')F d=b.x-g.1z.1I.x-g.3P+g.1z.2y*g.1z.1M.1N();L F d=b.x-g.1z.1I.x;F f=Z.5j(b.y-g.1z.1I.y-g.5r/2,2);g.1z.1M.1y(C(a){3J=Z.cB(Z.5j(d-a*g.1z.2y,2)+f);3J-=g.1z.2y/2;3J=3J<0?0:3J;3J=3J>g.1z.6q?g.1z.6q:3J;3J=g.1z.6q-3J;bc=g.1z.5R*3J/g.1z.6q;B.Y.V=g.1z.2y+bc+\'Q\';B.Y.M=g.1z.2y*a+c+\'Q\';c+=bc});A.5K.8F(g,c)})})},8F:C(a,b){if(a.1z.4I)if(a.1z.4I==\'az\')a.1z.2q.I(0).Y.M=(a.3P-a.1z.2y*a.1z.1M.1N())/2-b/2+\'Q\';L if(a.1z.4I==\'M\')a.1z.2q.I(0).Y.M=-b/a.1z.1M.1N()+\'Q\';L if(a.1z.4I==\'2D\')a.1z.2q.I(0).Y.M=(a.3P-a.1z.2y*a.1z.1M.1N())-b/2+\'Q\';a.1z.2q.I(0).Y.V=a.1z.2y*a.1z.1M.1N()+b+\'Q\'},6z:C(b){b.1z.1M.1y(C(a){B.Y.V=b.1z.2y+\'Q\';B.Y.M=b.1z.2y*a+\'Q\'})}};A.fn.fz=A.5K.2l;A.K={18:P,7W:P,3q:P,2A:P,4b:P,af:P,2r:P,2h:P,1M:P,58:C(){A.K.7W.58();if(A.K.3q){A.K.3q.2x()}},4i:C(){A.K.1M=P;A.K.2h=P;A.K.4b=A.K.2r.2m;if(A.K.18.E(\'11\')==\'2v\'){if(A.K.2r.1a.fx){2X(A.K.2r.1a.fx.1K){19\'a4\':A.K.18.6d(A.K.2r.1a.fx.1H,A.K.58);1n;19\'1u\':A.K.18.c6(A.K.2r.1a.fx.1H,A.K.58);1n;19\'8o\':A.K.18.c3(A.K.2r.1a.fx.1H,A.K.58);1n}}L{A.K.18.2x()}if(A.K.2r.1a.2V)A.K.2r.1a.2V.1x(A.K.2r,[A.K.18,A.K.3q])}L{A.K.58()}1P.a2(A.K.2A)},c1:C(){F e=A.K.2r;F f=A.K.8C(e);if(e&&f.3w!=A.K.4b&&f.3w.1b>=e.1a.8N){A.K.4b=f.3w;A.K.af=f.3w;9V={bR:A(e).1m(\'eS\')||\'bR\',2m:f.3w};A.eQ({1K:\'eN\',9V:A.eL(9V),eK:C(b){e.1a.3X=A(\'3w\',b);1N=e.1a.3X.1N();if(1N>0){F c=\'\';e.1a.3X.1y(C(a){c+=\'<7b 4o="\'+A(\'2m\',B).3D()+\'" 8h="\'+a+\'" Y="7z: 8T;">\'+A(\'3D\',B).3D()+\'</7b>\'});if(e.1a.9K){F d=A(\'2m\',e.1a.3X.I(0)).3D();e.2m=f.30+d+e.1a.3y+f.5m;A.K.64(e,f.3w.1b!=d.1b?(f.30.1b+f.3w.1b):d.1b,f.3w.1b!=d.1b?(f.30.1b+d.1b):d.1b)}if(1N>0){A.K.aU(e,c)}L{A.K.4i()}}L{A.K.4i()}},5v:e.1a.96})}},aU:C(a,b){A.K.7W.3i(b);A.K.1M=A(\'7b\',A.K.7W.I(0));A.K.1M.9r(A.K.en).1C(\'4U\',A.K.ed);F c=A.12.3a(a);F d=A.12.2f(a);A.K.18.E(\'O\',c.y+d.hb+\'Q\').E(\'M\',c.x+\'Q\').2H(a.1a.9D);if(A.K.3q){A.K.3q.E(\'11\',\'2v\').E(\'O\',c.y+d.hb+\'Q\').E(\'M\',c.x+\'Q\').E(\'V\',A.K.18.E(\'V\')).E(\'S\',A.K.18.E(\'S\'))}A.K.2h=0;A.K.1M.I(0).2Z=a.1a.72;A.K.7I(a,a.1a.3X.I(0),\'6H\');if(A.K.18.E(\'11\')==\'1k\'){if(a.1a.bv){F e=A.12.9y(a,14);F f=A.12.6b(a,14);A.K.18.E(\'V\',a.3P-(A.e0?(e.l+e.r+f.l+f.r):0)+\'Q\')}if(a.1a.fx){2X(a.1a.fx.1K){19\'a4\':A.K.18.6U(a.1a.fx.1H);1n;19\'1u\':A.K.18.dR(a.1a.fx.1H);1n;19\'8o\':A.K.18.dP(a.1a.fx.1H);1n}}L{A.K.18.1S()}if(A.K.2r.1a.2K)A.K.2r.1a.2K.1x(A.K.2r,[A.K.18,A.K.3q])}},dM:C(){F b=B;if(b.1a.3X){A.K.4b=b.2m;A.K.af=b.2m;F c=\'\';b.1a.3X.1y(C(a){2m=A(\'2m\',B).3D().5u();dH=b.2m.5u();if(2m.3o(dH)==0){c+=\'<7b 4o="\'+A(\'2m\',B).3D()+\'" 8h="\'+a+\'" Y="7z: 8T;">\'+A(\'3D\',B).3D()+\'</7b>\'}});if(c!=\'\'){A.K.aU(b,c);B.1a.9s=14;G}}b.1a.3X=P;B.1a.9s=H},64:C(a,b,c){if(a.9q){F d=a.9q();d.iJ(14);d.dC("bh",b);d.iE("bh",-c+b);d.7Q()}L if(a.9m){a.9m(b,c)}L{if(a.88){a.88=b;a.dA=c}}a.6a()},dw:C(a){if(a.88)G a.88;L if(a.9q){F b=1c.64.dv();F c=b.il();G 0-c.dC(\'bh\',-ij)}},8C:C(a){F b={2m:a.2m,30:\'\',5m:\'\',3w:\'\'};if(a.1a.9k){F c=H;F d=A.K.dw(a)||0;F e=b.2m.6W(a.1a.3y);1V(F i=0;i<e.1b;i++){if((b.30.1b+e[i].1b>=d||d==0)&&!c){if(b.30.1b<=d)b.3w=e[i];L b.5m+=e[i]+(e[i]!=\'\'?a.1a.3y:\'\');c=14}L if(c){b.5m+=e[i]+(e[i]!=\'\'?a.1a.3y:\'\')}if(!c){b.30+=e[i]+(e.1b>1?a.1a.3y:\'\')}}}L{b.3w=b.2m}G b},b9:C(e){1P.a2(A.K.2A);F a=A.K.8C(B);F b=e.6S||e.6R||-1;if(/13|27|35|36|38|40|9/.3M(b)&&A.K.1M){if(1P.3N){1P.3N.b6=14;1P.3N.b5=H}L{e.9b();e.99()}if(A.K.2h!=P)A.K.1M.I(A.K.2h||0).2Z=\'\';L A.K.2h=-1;2X(b){19 9:19 13:if(A.K.2h==-1)A.K.2h=0;F c=A.K.1M.I(A.K.2h||0);F d=c.4Z(\'4o\');B.2m=a.30+d+B.1a.3y+a.5m;A.K.4b=a.3w;A.K.64(B,a.30.1b+d.1b+B.1a.3y.1b,a.30.1b+d.1b+B.1a.3y.1b);A.K.4i();if(B.1a.5p){4E=R(c.4Z(\'8h\'))||0;A.K.7I(B,B.1a.3X.I(4E),\'5p\')}if(B.6O)B.6O(H);G b!=13;1n;19 27:B.2m=a.30+A.K.4b+B.1a.3y+a.5m;B.1a.3X=P;A.K.4i();if(B.6O)B.6O(H);G H;1n;19 35:A.K.2h=A.K.1M.1N()-1;1n;19 36:A.K.2h=0;1n;19 38:A.K.2h--;if(A.K.2h<0)A.K.2h=A.K.1M.1N()-1;1n;19 40:A.K.2h++;if(A.K.2h==A.K.1M.1N())A.K.2h=0;1n}A.K.7I(B,B.1a.3X.I(A.K.2h||0),\'6H\');A.K.1M.I(A.K.2h||0).2Z=B.1a.72;if(A.K.1M.I(A.K.2h||0).6O)A.K.1M.I(A.K.2h||0).6O(H);if(B.1a.9K){F f=A.K.1M.I(A.K.2h||0).4Z(\'4o\');B.2m=a.30+f+B.1a.3y+a.5m;if(A.K.4b.1b!=f.1b)A.K.64(B,a.30.1b+A.K.4b.1b,a.30.1b+f.1b)}G H}A.K.dM.1x(B);if(B.1a.9s==H){if(a.3w!=A.K.4b&&a.3w.1b>=B.1a.8N)A.K.2A=1P.97(A.K.c1,B.1a.4w);if(A.K.1M){A.K.4i()}}G 14},7I:C(a,b,c){if(a.1a[c]){F d={};94=b.dj(\'*\');1V(i=0;i<94.1b;i++){d[94[i].4D]=94[i].6M.hG}a.1a[c].1x(a,[d])}},en:C(e){if(A.K.1M){if(A.K.2h!=P)A.K.1M.I(A.K.2h||0).2Z=\'\';A.K.1M.I(A.K.2h||0).2Z=\'\';A.K.2h=R(B.4Z(\'8h\'))||0;A.K.1M.I(A.K.2h||0).2Z=A.K.2r.1a.72}},ed:C(a){1P.a2(A.K.2A);a=a||A.3N.hD(1P.3N);a.9b();a.99();F b=A.K.8C(A.K.2r);F c=B.4Z(\'4o\');A.K.2r.2m=b.30+c+A.K.2r.1a.3y+b.5m;A.K.4b=B.4Z(\'4o\');A.K.64(A.K.2r,b.30.1b+c.1b+A.K.2r.1a.3y.1b,b.30.1b+c.1b+A.K.2r.1a.3y.1b);A.K.4i();if(A.K.2r.1a.5p){4E=R(B.4Z(\'8h\'))||0;A.K.7I(A.K.2r,A.K.2r.1a.3X.I(4E),\'5p\')}G H},dh:C(e){6K=e.6S||e.6R||-1;if(/13|27|35|36|38|40/.3M(6K)&&A.K.1M){if(1P.3N){1P.3N.b6=14;1P.3N.b5=H}L{e.9b();e.99()}G H}},2l:C(a){if(!a.96||!A.12){G}if(!A.K.18){if(A.2R.46){A(\'23\',1c).1L(\'<3q Y="11:1k;T:1J;4X:9x:9C.9E.a6(1E=0);" id="df" 2E="dc:H;" da="0" d7="b0"></3q>\');A.K.3q=A(\'#df\')}A(\'23\',1c).1L(\'<1W id="d4" Y="T: 1J; O: 0; M: 0; z-aY: hj; 11: 1k;"><90 Y="5X: 0;7E: 0; h9-Y: 1k; z-aY: h8;">&6G;</90></1W>\');A.K.18=A(\'#d4\');A.K.7W=A(\'90\',A.K.18)}G B.1y(C(){if(B.4D!=\'aV\'&&B.4Z(\'1K\')!=\'3D\')G;B.1a={};B.1a.96=a.96;B.1a.8N=Z.3B(R(a.8N)||1);B.1a.9D=a.9D?a.9D:\'\';B.1a.72=a.72?a.72:\'\';B.1a.5p=a.5p&&a.5p.1F==2w?a.5p:P;B.1a.2K=a.2K&&a.2K.1F==2w?a.2K:P;B.1a.2V=a.2V&&a.2V.1F==2w?a.2V:P;B.1a.6H=a.6H&&a.6H.1F==2w?a.6H:P;B.1a.bv=a.bv||H;B.1a.9k=a.9k||H;B.1a.3y=B.1a.9k?(a.3y||\', \'):\'\';B.1a.9K=a.9K?14:H;B.1a.4w=Z.3B(R(a.4w)||8V);if(a.fx&&a.fx.1F==6E){if(!a.fx.1K||!/a4|1u|8o/.3M(a.fx.1K)){a.fx.1K=\'1u\'}if(a.fx.1K==\'1u\'&&!A.fx.1u)G;if(a.fx.1K==\'8o\'&&!A.fx.5l)G;a.fx.1H=Z.3B(R(a.fx.1H)||7n);if(a.fx.1H>B.1a.4w){a.fx.1H=B.1a.4w-1Y}B.1a.fx=a.fx}B.1a.3X=P;B.1a.9s=H;A(B).1m(\'b9\',\'cW\').6a(C(){A.K.2r=B;A.K.4b=B.2m}).cV(A.K.dh).5Q(A.K.b9).4W(C(){A.K.2A=1P.97(A.K.4i,gM)})})}};A.fn.gJ=A.K.2l;A.1t={2A:P,4k:P,1X:P,3f:10,2b:C(a,b,c,d){A.1t.4k=a;A.1t.1X=b;A.1t.3f=R(c)||10;A.1t.2A=1P.5Y(A.1t.cR,R(d)||40)},cR:C(){1V(i=0;i<A.1t.1X.1b;i++){if(!A.1t.1X[i].2J){A.1t.1X[i].2J=A.1U(A.12.6x(A.1t.1X[i]),A.12.6w(A.1t.1X[i]),A.12.5O(A.1t.1X[i]))}L{A.1t.1X[i].2J.t=A.1t.1X[i].2T;A.1t.1X[i].2J.l=A.1t.1X[i].2P}if(A.1t.4k.D&&A.1t.4k.D.6g==14){5a={x:A.1t.4k.D.2n,y:A.1t.4k.D.2j,1D:A.1t.4k.D.1w.1D,hb:A.1t.4k.D.1w.hb}}L{5a=A.1U(A.12.6x(A.1t.4k),A.12.6w(A.1t.4k))}if(A.1t.1X[i].2J.t>0&&A.1t.1X[i].2J.y+A.1t.1X[i].2J.t>5a.y){A.1t.1X[i].2T-=A.1t.3f}L if(A.1t.1X[i].2J.t<=A.1t.1X[i].2J.h&&A.1t.1X[i].2J.t+A.1t.1X[i].2J.hb<5a.y+5a.hb){A.1t.1X[i].2T+=A.1t.3f}if(A.1t.1X[i].2J.l>0&&A.1t.1X[i].2J.x+A.1t.1X[i].2J.l>5a.x){A.1t.1X[i].2P-=A.1t.3f}L if(A.1t.1X[i].2J.l<=A.1t.1X[i].2J.gf&&A.1t.1X[i].2J.l+A.1t.1X[i].2J.1D<5a.x+5a.1D){A.1t.1X[i].2P+=A.1t.3f}}},7w:C(){1P.5h(A.1t.2A);A.1t.4k=P;A.1t.1X=P;1V(i in A.1t.1X){A.1t.1X[i].2J=P}}};A.X={18:P,1g:P,4v:C(){G B.1y(C(){if(B.8L){B.D.cM.3h(\'4R\',A.X.aM);B.D=P;B.8L=H;if(A.2R.46){B.aI="cW"}L{B.Y.g0=\'\';B.Y.cJ=\'\';B.Y.cH=\'\'}}})},aM:C(e){if(A.X.1g!=P){A.X.8I(e);G H}F a=B.3H;A(1c).1C(\'3t\',A.X.aE).1C(\'5n\',A.X.8I);a.D.1A=A.12.3W(e);a.D.4d=a.D.1A;a.D.6g=H;a.D.fY=B!=B.3H;A.X.1g=a;if(a.D.4P&&B!=B.3H){aC=A.12.3a(a.2S);aZ=A.12.2f(a);ay={x:R(A.E(a,\'M\'))||0,y:R(A.E(a,\'O\'))||0};dx=a.D.4d.x-aC.x-aZ.1D/2-ay.x;dy=a.D.4d.y-aC.y-aZ.hb/2-ay.y;A.2Q.4s(a,[dx,dy])}G A.6J||H},cD:C(e){F a=A.X.1g;a.D.6g=14;F b=a.Y;a.D.6o=A.E(a,\'11\');a.D.49=A.E(a,\'T\');if(!a.D.av)a.D.av=a.D.49;a.D.22={x:R(A.E(a,\'M\'))||0,y:R(A.E(a,\'O\'))||0};a.D.8z=0;a.D.8y=0;if(A.2R.46){F c=A.12.6b(a,14);a.D.8z=c.l||0;a.D.8y=c.t||0}a.D.1w=A.1U(A.12.3a(a),A.12.2f(a));if(a.D.49!=\'2i\'&&a.D.49!=\'1J\'){b.T=\'2i\'}A.X.18.58();F d=A(a).cA(14).I(0);A(d).E({11:\'2v\',M:\'2G\',O:\'2G\'});d.Y.4M=\'0\';d.Y.53=\'0\';d.Y.4L=\'0\';d.Y.4K=\'0\';A.X.18.1L(d);F f=A.X.18.I(0).Y;if(a.D.ar){f.V=\'8x\';f.S=\'8x\'}L{f.S=a.D.1w.hb+\'Q\';f.V=a.D.1w.1D+\'Q\'}f.11=\'2v\';f.4M=\'2G\';f.53=\'2G\';f.4L=\'2G\';f.4K=\'2G\';A.1U(a.D.1w,A.12.2f(d));if(a.D.2M){if(a.D.2M.M){a.D.22.x+=a.D.1A.x-a.D.1w.x-a.D.2M.M;a.D.1w.x=a.D.1A.x-a.D.2M.M}if(a.D.2M.O){a.D.22.y+=a.D.1A.y-a.D.1w.y-a.D.2M.O;a.D.1w.y=a.D.1A.y-a.D.2M.O}if(a.D.2M.2D){a.D.22.x+=a.D.1A.x-a.D.1w.x-a.D.1w.hb+a.D.2M.2D;a.D.1w.x=a.D.1A.x-a.D.1w.1D+a.D.2M.2D}if(a.D.2M.4e){a.D.22.y+=a.D.1A.y-a.D.1w.y-a.D.1w.hb+a.D.2M.4e;a.D.1w.y=a.D.1A.y-a.D.1w.hb+a.D.2M.4e}}a.D.2n=a.D.22.x;a.D.2j=a.D.22.y;if(a.D.7V||a.D.2e==\'7X\'){7Z=A.12.6b(a.2S,14);a.D.1w.x=a.7Y+(A.2R.46?0:A.2R.6l?-7Z.l:7Z.l);a.D.1w.y=a.7t+(A.2R.46?0:A.2R.6l?-7Z.t:7Z.t);A(a.2S).1L(A.X.18.I(0))}if(a.D.2e){A.X.ah(a);a.D.4V.2e=A.X.ae}if(a.D.4P){A.2Q.ad(a)}f.M=a.D.1w.x-a.D.8z+\'Q\';f.O=a.D.1w.y-a.D.8y+\'Q\';f.V=a.D.1w.1D+\'Q\';f.S=a.D.1w.hb+\'Q\';A.X.1g.D.8w=H;if(a.D.gx){a.D.4V.5y=A.X.a9}if(a.D.3j!=H){A.X.18.E(\'3j\',a.D.3j)}if(a.D.1E){A.X.18.E(\'1E\',a.D.1E);if(1P.6j){A.X.18.E(\'4X\',\'7s(1E=\'+a.D.1E*1Y+\')\')}}if(a.D.6i){A.X.18.2H(a.D.6i);A.X.18.I(0).6M.Y.11=\'1k\'}if(a.D.4c)a.D.4c.1x(a,[d,a.D.22.x,a.D.22.y]);if(A.1s&&A.1s.7p>0){A.1s.ck(a)}if(a.D.3L==H){b.11=\'1k\'}G H},ah:C(a){if(a.D.2e.1F==8t){if(a.D.2e==\'7X\'){a.D.1Z=A.1U({x:0,y:0},A.12.2f(a.2S));F b=A.12.6b(a.2S,14);a.D.1Z.w=a.D.1Z.1D-b.l-b.r;a.D.1Z.h=a.D.1Z.hb-b.t-b.b}L if(a.D.2e==\'1c\'){F c=A.12.a5();a.D.1Z={x:0,y:0,w:c.w,h:c.h}}}L if(a.D.2e.1F==6h){a.D.1Z={x:R(a.D.2e[0])||0,y:R(a.D.2e[1])||0,w:R(a.D.2e[2])||0,h:R(a.D.2e[3])||0}}a.D.1Z.dx=a.D.1Z.x-a.D.1w.x;a.D.1Z.dy=a.D.1Z.y-a.D.1w.y},8r:C(a){if(a.D.7V||a.D.2e==\'7X\'){A(\'23\',1c).1L(A.X.18.I(0))}A.X.18.58().2x().E(\'1E\',1);if(1P.6j){A.X.18.E(\'4X\',\'7s(1E=1Y)\')}},8I:C(e){A(1c).3h(\'3t\',A.X.aE).3h(\'5n\',A.X.8I);if(A.X.1g==P){G}F a=A.X.1g;A.X.1g=P;if(a.D.6g==H){G H}if(a.D.3I==14){A(a).E(\'T\',a.D.49)}F b=a.Y;if(a.4P){A.X.18.E(\'7z\',\'7g\')}if(a.D.6i){A.X.18.3S(a.D.6i)}if(a.D.5B==H){if(a.D.fx>0){if(!a.D.2g||a.D.2g==\'3Z\'){F x=W A.fx(a,{1H:a.D.fx},\'M\');x.1G(a.D.22.x,a.D.7i)}if(!a.D.2g||a.D.2g==\'3K\'){F y=W A.fx(a,{1H:a.D.fx},\'O\');y.1G(a.D.22.y,a.D.7k)}}L{if(!a.D.2g||a.D.2g==\'3Z\')a.Y.M=a.D.7i+\'Q\';if(!a.D.2g||a.D.2g==\'3K\')a.Y.O=a.D.7k+\'Q\'}A.X.8r(a);if(a.D.3L==H){A(a).E(\'11\',a.D.6o)}}L if(a.D.fx>0){a.D.8w=14;F c=H;if(A.1s&&A.1p&&a.D.3I){c=A.12.3a(A.1p.18.I(0))}A.X.18.4S({M:c?c.x:a.D.1w.x,O:c?c.y:a.D.1w.y},a.D.fx,C(){a.D.8w=H;if(a.D.3L==H){a.Y.11=a.D.6o}A.X.8r(a)})}L{A.X.8r(a);if(a.D.3L==H){A(a).E(\'11\',a.D.6o)}}if(A.1s&&A.1s.7p>0){A.1s.c8(a)}if(A.1p&&a.D.3I){A.1p.c7(a)}if(a.D.2I&&(a.D.7i!=a.D.22.x||a.D.7k!=a.D.22.y)){a.D.2I.1x(a,a.D.aa||[0,0,a.D.7i,a.D.7k])}if(a.D.3C)a.D.3C.1x(a);G H},a9:C(x,y,a,b){if(a!=0)a=R((a+(B.D.gx*a/Z.3B(a))/2)/B.D.gx)*B.D.gx;if(b!=0)b=R((b+(B.D.gy*b/Z.3B(b))/2)/B.D.gy)*B.D.gy;G{dx:a,dy:b,x:0,y:0}},ae:C(x,y,a,b){a=Z.3k(Z.3g(a,B.D.1Z.dx),B.D.1Z.w+B.D.1Z.dx-B.D.1w.1D);b=Z.3k(Z.3g(b,B.D.1Z.dy),B.D.1Z.h+B.D.1Z.dy-B.D.1w.hb);G{dx:a,dy:b,x:0,y:0}},aE:C(e){if(A.X.1g==P||A.X.1g.D.8w==14){G}F a=A.X.1g;a.D.4d=A.12.3W(e);if(a.D.6g==H){3J=Z.cB(Z.5j(a.D.1A.x-a.D.4d.x,2)+Z.5j(a.D.1A.y-a.D.4d.y,2));if(3J<a.D.5D){G}L{A.X.cD(e)}}F b=a.D.4d.x-a.D.1A.x;F c=a.D.4d.y-a.D.1A.y;1V(F i in a.D.4V){F d=a.D.4V[i].1x(a,[a.D.22.x+b,a.D.22.y+c,b,c]);if(d&&d.1F==6E){b=i!=\'6f\'?d.dx:(d.x-a.D.22.x);c=i!=\'6f\'?d.dy:(d.y-a.D.22.y)}}a.D.2n=a.D.1w.x+b-a.D.8z;a.D.2j=a.D.1w.y+c-a.D.8y;if(a.D.4P&&(a.D.3n||a.D.2I)){A.2Q.3n(a,a.D.2n,a.D.2j)}if(a.D.4h)a.D.4h.1x(a,[a.D.22.x+b,a.D.22.y+c]);if(!a.D.2g||a.D.2g==\'3Z\'){a.D.7i=a.D.22.x+b;A.X.18.I(0).Y.M=a.D.2n+\'Q\'}if(!a.D.2g||a.D.2g==\'3K\'){a.D.7k=a.D.22.y+c;A.X.18.I(0).Y.O=a.D.2j+\'Q\'}if(A.1s&&A.1s.7p>0){A.1s.8n(a)}G H},2l:C(o){if(!A.X.18){A(\'23\',1c).1L(\'<1W id="bX"></1W>\');A.X.18=A(\'#bX\');F c=A.X.18.I(0);F d=c.Y;d.T=\'1J\';d.11=\'1k\';d.7z=\'7g\';d.bV=\'1k\';d.2N=\'2B\';if(1P.6j){c.aI="bU"}L{d.eZ=\'1k\';d.cH=\'1k\';d.cJ=\'1k\'}}if(!o){o={}}G B.1y(C(){if(B.8L||!A.12)G;if(1P.6j){B.eX=C(){G H};B.eW=C(){G H}}F a=B;F b=o.3c?A(B).eV(o.3c):A(B);if(A.2R.46){b.1y(C(){B.aI="bU"})}L{b.E(\'-eU-6f-7Q\',\'1k\');b.E(\'6f-7Q\',\'1k\');b.E(\'-eT-6f-7Q\',\'1k\')}B.D={cM:b,5B:o.5B?14:H,3L:o.3L?14:H,3I:o.3I?o.3I:H,4P:o.4P?o.4P:H,7V:o.7V?o.7V:H,3j:o.3j?R(o.3j)||0:H,1E:o.1E?2c(o.1E):H,fx:R(o.fx)||P,5z:o.5z?o.5z:H,4V:{},1A:{},4c:o.4c&&o.4c.1F==2w?o.4c:H,3C:o.3C&&o.3C.1F==2w?o.3C:H,2I:o.2I&&o.2I.1F==2w?o.2I:H,2g:/3K|3Z/.3M(o.2g)?o.2g:H,5D:o.5D?R(o.5D)||0:0,2M:o.2M?o.2M:H,ar:o.ar?14:H,6i:o.6i||H};if(o.4V&&o.4V.1F==2w)B.D.4V.6f=o.4V;if(o.4h&&o.4h.1F==2w)B.D.4h=o.4h;if(o.2e&&((o.2e.1F==8t&&(o.2e==\'7X\'||o.2e==\'1c\'))||(o.2e.1F==6h&&o.2e.1b==4))){B.D.2e=o.2e}if(o.2C){B.D.2C=o.2C}if(o.5y){if(28 o.5y==\'eO\'){B.D.gx=R(o.5y)||1;B.D.gy=R(o.5y)||1}L if(o.5y.1b==2){B.D.gx=R(o.5y[0])||1;B.D.gy=R(o.5y[1])||1}}if(o.3n&&o.3n.1F==2w){B.D.3n=o.3n}B.8L=14;b.1y(C(){B.3H=a});b.1C(\'4R\',A.X.aM)})}};A.fn.1U({8j:A.X.4v,6r:A.X.2l});A.1s={bP:C(a,b,c,d){G a<=A.X.1g.D.2n&&(a+c)>=(A.X.1g.D.2n+A.X.1g.D.1w.w)&&b<=A.X.1g.D.2j&&(b+d)>=(A.X.1g.D.2j+A.X.1g.D.1w.h)?14:H},9S:C(a,b,c,d){G!(a>(A.X.1g.D.2n+A.X.1g.D.1w.w)||(a+c)<A.X.1g.D.2n||b>(A.X.1g.D.2j+A.X.1g.D.1w.h)||(b+d)<A.X.1g.D.2j)?14:H},1A:C(a,b,c,d){G a<A.X.1g.D.4d.x&&(a+c)>A.X.1g.D.4d.x&&b<A.X.1g.D.4d.y&&(b+d)>A.X.1g.D.4d.y?14:H},4T:H,3z:{},7p:0,3p:{},ck:C(a){if(A.X.1g==P){G}F i;A.1s.3z={};F b=H;1V(i in A.1s.3p){if(A.1s.3p[i]!=P){F c=A.1s.3p[i].I(0);if(A(A.X.1g).is(\'.\'+c.1f.a)){if(c.1f.m==H){c.1f.p=A.1U(A.12.6x(c),A.12.6w(c));c.1f.m=14}if(c.1f.ac){A.1s.3p[i].2H(c.1f.ac)}A.1s.3z[i]=A.1s.3p[i];if(A.1p&&c.1f.s&&A.X.1g.D.3I){c.1f.el=A(\'.\'+c.1f.a,c);a.Y.11=\'1k\';A.1p.bM(c);c.1f.9P=A.1p.8g(A.1m(c,\'id\')).6A;a.Y.11=a.D.6o;b=14}if(c.1f.9O){c.1f.9O.1x(A.1s.3p[i].I(0),[A.X.1g])}}}}if(b){A.1p.2b()}},eF:C(){A.1s.3z={};1V(i in A.1s.3p){if(A.1s.3p[i]!=P){F a=A.1s.3p[i].I(0);if(A(A.X.1g).is(\'.\'+a.1f.a)){a.1f.p=A.1U(A.12.6x(a),A.12.6w(a));if(a.1f.ac){A.1s.3p[i].2H(a.1f.ac)}A.1s.3z[i]=A.1s.3p[i];if(A.1p&&a.1f.s&&A.X.1g.D.3I){a.1f.el=A(\'.\'+a.1f.a,a);bJ.Y.11=\'1k\';A.1p.bM(a);bJ.Y.11=bJ.D.6o}}}}},8n:C(e){if(A.X.1g==P){G}A.1s.4T=H;F i;F a=H;F b=0;1V(i in A.1s.3z){F c=A.1s.3z[i].I(0);if(A.1s.4T==H&&A.1s[c.1f.t](c.1f.p.x,c.1f.p.y,c.1f.p.1D,c.1f.p.hb)){if(c.1f.hc&&c.1f.h==H){A.1s.3z[i].2H(c.1f.hc)}if(c.1f.h==H&&c.1f.76){a=14}c.1f.h=14;A.1s.4T=c;if(A.1p&&c.1f.s&&A.X.1g.D.3I){A.1p.18.I(0).2Z=c.1f.eC;A.1p.8n(c)}b++}L if(c.1f.h==14){if(c.1f.6C){c.1f.6C.1x(c,[e,A.X.18.I(0).6M,c.1f.fx])}if(c.1f.hc){A.1s.3z[i].3S(c.1f.hc)}c.1f.h=H}}if(A.1p&&!A.1s.4T&&A.X.1g.3I){A.1p.18.I(0).Y.11=\'1k\'}if(a){A.1s.4T.1f.76.1x(A.1s.4T,[e,A.X.18.I(0).6M])}},c8:C(e){F i;1V(i in A.1s.3z){F a=A.1s.3z[i].I(0);if(a.1f.ac){A.1s.3z[i].3S(a.1f.ac)}if(a.1f.hc){A.1s.3z[i].3S(a.1f.hc)}if(a.1f.s){A.1p.73[A.1p.73.1b]=i}if(a.1f.9I&&a.1f.h==14){a.1f.h=H;a.1f.9I.1x(a,[e,a.1f.fx])}a.1f.m=H;a.1f.h=H}A.1s.3z={}},4v:C(){G B.1y(C(){if(B.8S){if(B.1f.s){id=A.1m(B,\'id\');A.1p.54[id]=P;A(\'.\'+B.1f.a,B).8j()}A.1s.3p[\'d\'+B.bG]=P;B.8S=H;B.f=P}})},2l:C(o){G B.1y(C(){if(B.8S==14||!o.3r||!A.12||!A.X){G}B.1f={a:o.3r,ac:o.9F||H,hc:o.8X||H,eC:o.4G||H,9I:o.je||o.9I||H,76:o.76||o.ev||H,6C:o.6C||o.er||H,9O:o.9O||H,t:o.5T&&(o.5T==\'bP\'||o.5T==\'9S\')?o.5T:\'1A\',fx:o.fx?o.fx:H,m:H,h:H};if(o.bC==14&&A.1p){id=A.1m(B,\'id\');A.1p.54[id]=B.1f.a;B.1f.s=14;if(o.2I){B.1f.2I=o.2I;B.1f.9P=A.1p.8g(id).6A}}B.8S=14;B.bG=R(Z.63()*aW);A.1s.3p[\'d\'+B.bG]=A(B);A.1s.7p++})}};A.fn.1U({ei:A.1s.4v,ee:A.1s.2l});A.jd=A.1s.eF;A.3l={18:P,89:C(){3D=B.2m;if(!3D)G;Y={eb:A(B).E(\'eb\')||\'\',4a:A(B).E(\'4a\')||\'\',87:A(B).E(\'87\')||\'\',e9:A(B).E(\'e9\')||\'\',e8:A(B).E(\'e8\')||\'\',e7:A(B).E(\'e7\')||\'\',bx:A(B).E(\'bx\')||\'\',e6:A(B).E(\'e6\')||\'\'};A.3l.18.E(Y);3i=A.3l.e5(3D);3i=3i.48(W bw("\\\\n","g"),"<br />");A.3l.18.3i(\'j6\');b3=A.3l.18.I(0).3P;A.3l.18.3i(3i);V=A.3l.18.I(0).3P+b3;if(B.66.65&&V>B.66.65[0]){V=B.66.65[0]}B.Y.V=V+\'Q\';if(B.4D==\'bs\'){S=A.3l.18.I(0).5r+b3;if(B.66.65&&S>B.66.65[1]){S=B.66.65[1]}B.Y.S=S+\'Q\'}},e5:C(a){bq={\'&\':\'&j1;\',\'<\':\'&j0;\',\'>\':\'&gt;\',\'"\':\'&iZ;\'};1V(i in bq){a=a.48(W bw(i,\'g\'),bq[i])}G a},2l:C(a){if(A.3l.18==P){A(\'23\',1c).1L(\'<1W id="dX" Y="T: 1J; O: 0; M: 0; 2W: 2B;"></1W>\');A.3l.18=A(\'#dX\')}G B.1y(C(){if(/bs|aV/.3M(B.4D)){if(B.4D==\'aV\'){dT=B.4Z(\'1K\');if(!/3D|iW/.3M(dT)){G}}if(a&&(a.1F==bm||(a.1F==6h&&a.1b==2))){if(a.1F==bm)a=[a,a];L{a[0]=R(a[0])||7n;a[1]=R(a[1])||7n}B.66={65:a}}A(B).4W(A.3l.89).5Q(A.3l.89).cV(A.3l.89);A.3l.89.1x(B)}})}};A.fn.iU=A.3l.2l;A.fn.1U({c3:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.5l(B,a,b,\'4l\',c)})},dP:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.5l(B,a,b,\'41\',c)})},iQ:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.5l(B,a,b,\'dG\',c)})},iM:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.5l(B,a,b,\'M\',c)})},iL:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.5l(B,a,b,\'2D\',c)})},iK:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.5l(B,a,b,\'dF\',c)})}});A.fx.5l=C(e,a,b,c,d){if(!A.4n(e)){A.2z(e,\'1j\');G H}F z=B;z.el=A(e);z.1N=A.12.2f(e);z.1e=28 b==\'4B\'?b:d||P;if(!e.4f)e.4f=z.el.E(\'11\');if(c==\'dG\'){c=z.el.E(\'11\')==\'1k\'?\'41\':\'4l\'}L if(c==\'dF\'){c=z.el.E(\'11\')==\'1k\'?\'2D\':\'M\'}z.el.1S();z.1l=a;z.29=28 b==\'C\'?b:P;z.fx=A.fx.9u(e);z.6T=c;z.1T=C(){if(z.29&&z.29.1F==2w){z.29.1x(z.el.I(0))}if(z.6T==\'41\'||z.6T==\'2D\'){z.el.E(\'11\',z.el.I(0).4f==\'1k\'?\'2v\':z.el.I(0).4f)}L{z.el.2x()}A.fx.9n(z.fx.2Y.I(0),z.fx.U);A.2z(z.el.I(0),\'1j\')};2X(z.6T){19\'4l\':5q=W A.fx(z.fx.2Y.I(0),A.1l(z.1l,z.1e,z.1T),\'S\');5q.1G(z.fx.U.1o.hb,0);1n;19\'41\':z.fx.2Y.E(\'S\',\'9e\');z.el.1S();5q=W A.fx(z.fx.2Y.I(0),A.1l(z.1l,z.1e,z.1T),\'S\');5q.1G(0,z.fx.U.1o.hb);1n;19\'M\':5q=W A.fx(z.fx.2Y.I(0),A.1l(z.1l,z.1e,z.1T),\'V\');5q.1G(z.fx.U.1o.1D,0);1n;19\'2D\':z.fx.2Y.E(\'V\',\'9e\');z.el.1S();5q=W A.fx(z.fx.2Y.I(0),A.1l(z.1l,z.1e,z.1T),\'V\');5q.1G(0,z.fx.U.1o.1D);1n}};A.fn.iA=C(a,b){G B.1r(\'1j\',C(){if(!A.4n(B)){A.2z(B,\'1j\');G H}F e=W A.fx.eu(B,a,b);e.bE()})};A.fx.eu=C(e,a,b){F z=B;z.el=A(e);z.el.1S();z.29=b;z.8e=R(a)||40;z.U={};z.U.T=z.el.E(\'T\');z.U.O=R(z.el.E(\'O\'))||0;z.U.M=R(z.el.E(\'M\'))||0;if(z.U.T!=\'2i\'&&z.U.T!=\'1J\'){z.el.E(\'T\',\'2i\')}z.74=5;z.52=1;z.bE=C(){z.52++;z.e=W A.fx(z.el.I(0),{1H:io,1T:C(){z.e=W A.fx(z.el.I(0),{1H:80,1T:C(){z.8e=R(z.8e/2);if(z.52<=z.74)z.bE();L{z.el.E(\'T\',z.U.T).E(\'O\',z.U.O+\'Q\').E(\'M\',z.U.M+\'Q\');A.2z(z.el.I(0),\'1j\');if(z.29&&z.29.1F==2w){z.29.1x(z.el.I(0))}}}},\'O\');z.e.1G(z.U.O-z.8e,z.U.O)}},\'O\');z.e.1G(z.U.O,z.U.O-z.8e)}};A.fn.1U({im:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.3Y(B,a,b,\'41\',\'3U\',c)})},ik:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.3Y(B,a,b,\'41\',\'in\',c)})},ii:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.3Y(B,a,b,\'41\',\'3E\',c)})},ig:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.3Y(B,a,b,\'4l\',\'3U\',c)})},ie:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.3Y(B,a,b,\'4l\',\'in\',c)})},ic:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.3Y(B,a,b,\'4l\',\'3E\',c)})},ib:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.3Y(B,a,b,\'M\',\'3U\',c)})},ia:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.3Y(B,a,b,\'M\',\'in\',c)})},i9:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.3Y(B,a,b,\'M\',\'3E\',c)})},i8:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.3Y(B,a,b,\'2D\',\'3U\',c)})},i7:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.3Y(B,a,b,\'2D\',\'in\',c)})},i6:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.3Y(B,a,b,\'2D\',\'3E\',c)})}});A.fx.3Y=C(e,a,b,c,d,f){if(!A.4n(e)){A.2z(e,\'1j\');G H}F z=B;z.el=A(e);z.1e=28 b==\'4B\'?b:f||P;z.U={};z.U.T=z.el.E(\'T\');z.U.O=z.el.E(\'O\');z.U.M=z.el.E(\'M\');if(!e.4f)e.4f=z.el.E(\'11\');if(d==\'3E\'){d=z.el.E(\'11\')==\'1k\'?\'in\':\'3U\'}z.el.1S();if(z.U.T!=\'2i\'&&z.U.T!=\'1J\'){z.el.E(\'T\',\'2i\')}z.1K=d;b=28 b==\'C\'?b:P;7N=1;2X(c){19\'4l\':z.e=W A.fx(z.el.I(0),A.1l(a-15,z.1e,b),\'O\');z.5x=2c(z.U.O)||0;z.9i=z.dt;7N=-1;1n;19\'41\':z.e=W A.fx(z.el.I(0),A.1l(a-15,z.1e,b),\'O\');z.5x=2c(z.U.O)||0;z.9i=z.dt;1n;19\'2D\':z.e=W A.fx(z.el.I(0),A.1l(a-15,z.1e,b),\'M\');z.5x=2c(z.U.M)||0;z.9i=z.ds;1n;19\'M\':z.e=W A.fx(z.el.I(0),A.1l(a-15,z.1e,b),\'M\');z.5x=2c(z.U.M)||0;z.9i=z.ds;7N=-1;1n}z.e2=W A.fx(z.el.I(0),A.1l(a,z.1e,C(){z.el.E(z.U);if(z.1K==\'3U\'){z.el.E(\'11\',\'1k\')}L z.el.E(\'11\',z.el.I(0).4f==\'1k\'?\'2v\':z.el.I(0).4f);A.2z(z.el.I(0),\'1j\')}),\'1E\');if(d==\'in\'){z.e.1G(z.5x+1Y*7N,z.5x);z.e2.1G(0,1)}L{z.e.1G(z.5x,z.5x+1Y*7N);z.e2.1G(1,0)}};A.fn.1U({i5:C(a,b,c,d){G B.1r(\'1j\',C(){W A.fx.9h(B,a,b,c,\'dq\',d)})},i4:C(a,b,c,d){G B.1r(\'1j\',C(){W A.fx.9h(B,a,b,c,\'9g\',d)})},i3:C(a,b,c,d){G B.1r(\'1j\',C(){W A.fx.9h(B,a,b,c,\'3E\',d)})}});A.fx.9h=C(e,a,b,c,d,f){if(!A.4n(e)){A.2z(e,\'1j\');G H}F z=B;z.el=A(e);z.1e=28 c==\'4B\'?c:f||P;z.29=28 c==\'C\'?c:P;if(d==\'3E\'){d=z.el.E(\'11\')==\'1k\'?\'9g\':\'dq\'}z.1l=a;z.S=b&&b.1F==bm?b:20;z.fx=A.fx.9u(e);z.1K=d;z.1T=C(){if(z.29&&z.29.1F==2w){z.29.1x(z.el.I(0))}if(z.1K==\'9g\'){z.el.1S()}L{z.el.2x()}A.fx.9n(z.fx.2Y.I(0),z.fx.U);A.2z(z.el.I(0),\'1j\')};if(z.1K==\'9g\'){z.el.1S();z.fx.2Y.E(\'S\',z.S+\'Q\').E(\'V\',\'9e\');z.ef=W A.fx(z.fx.2Y.I(0),A.1l(z.1l,z.1e,C(){z.ef=W A.fx(z.fx.2Y.I(0),A.1l(z.1l,z.1e,z.1T),\'S\');z.ef.1G(z.S,z.fx.U.1o.hb)}),\'V\');z.ef.1G(0,z.fx.U.1o.1D)}L{z.ef=W A.fx(z.fx.2Y.I(0),A.1l(z.1l,z.1e,C(){z.ef=W A.fx(z.fx.2Y.I(0),A.1l(z.1l,z.1e,z.1T),\'V\');z.ef.1G(z.fx.U.1o.1D,0)}),\'S\');z.ef.1G(z.fx.U.1o.hb,z.S)}};A.fn.i2=C(c,d,e,f){G B.1r(\'dp\',C(){B.6Q=A(B).1m("Y")||\'\';f=28 e==\'4B\'?e:f||P;e=28 e==\'C\'?e:P;F a=A(B).E(\'6P\');F b=B.2S;6k(a==\'b7\'&&b){a=A(b).E(\'6P\');b=b.2S}A(B).E(\'6P\',d);if(28 B.6Q==\'7M\')B.6Q=B.6Q["9d"];A(B).4S({\'6P\':a},c,f,C(){A.2z(B,\'dp\');if(28 A(B).1m("Y")==\'7M\'){A(B).1m("Y")["9d"]="";A(B).1m("Y")["9d"]=B.6Q}L{A(B).1m("Y",B.6Q)}if(e)e.1x(B)})})};A.4n=C(e){if(/^i1$|^i0$|^hZ$|^5W$|^hY$|^hX$|^hW$|^hV$|^hU$|^23$|^hT$|^hS$|^hR$|^hQ$|^hP$|^hO$|^hN$/i.3M(e.98))G H;L G 14};A.fx.9n=C(e,a){F c=e.6M;F b=c.Y;b.T=a.T;b.4M=a.3s.t;b.4K=a.3s.l;b.4L=a.3s.b;b.53=a.3s.r;b.O=a.O+\'Q\';b.M=a.M+\'Q\';e.2S.dn(c,e);e.2S.hM(e)};A.fx.9u=C(e){if(!A.4n(e))G H;F t=A(e);F a=e.Y;F b=H;if(t.E(\'11\')==\'1k\'){95=t.E(\'2W\');t.E(\'2W\',\'2B\').1S();b=14}F c={};c.T=t.E(\'T\');c.1o=A.12.2f(e);c.3s=A.12.b2(e);F d=e.4u?e.4u.dk:t.E(\'hK\');c.O=R(t.E(\'O\'))||0;c.M=R(t.E(\'M\'))||0;F f=\'hJ\'+R(Z.63()*aW);F g=1c.3x(/^3O$|^br$|^hI$|^hr$|^7Q$|^hH$|^7M$|^3q$|^hF$|^hE$|^hC$|^90$|^dl$|^hB$/i.3M(e.98)?\'1W\':e.98);A.1m(g,\'id\',f);F h=A(g).2H(\'hA\');F i=g.Y;F j=0;F k=0;if(c.T==\'2i\'||c.T==\'1J\'){j=c.O;k=c.M}i.O=j+\'Q\';i.M=k+\'Q\';i.T=c.T!=\'2i\'&&c.T!=\'1J\'?\'2i\':c.T;i.S=c.1o.hb+\'Q\';i.V=c.1o.1D+\'Q\';i.4M=c.3s.t;i.53=c.3s.r;i.4L=c.3s.b;i.4K=c.3s.l;i.2N=\'2B\';if(A.2R.46){i.dk=d}L{i.hz=d}if(A.2R=="46"){a.4X="7s(1E="+0.dg*1Y+")"}a.1E=0.dg;e.2S.dn(g,e);g.hy(e);a.4M=\'2G\';a.53=\'2G\';a.4L=\'2G\';a.4K=\'2G\';a.T=\'1J\';a.bV=\'1k\';a.O=\'2G\';a.M=\'2G\';if(b){t.2x();a.2W=95}G{U:c,2Y:A(g)}};A.fx.7H={hx:[0,1O,1O],hw:[dd,1O,1O],hv:[db,db,hu],hs:[0,0,0],hq:[0,0,1O],hp:[d6,42,42],hn:[0,1O,1O],hm:[0,0,6N],hl:[0,6N,6N],hk:[aX,aX,aX],hi:[0,1Y,0],hg:[hf,he,cZ],hd:[6N,0,6N],ha:[85,cZ,47],h7:[1O,cY,0],h6:[h5,50,h4],h3:[6N,0,0],h2:[h1,cX,h0],gZ:[gY,0,8U],gX:[1O,0,1O],gW:[1O,gU,0],gT:[0,67,0],gS:[75,0,gQ],gP:[dd,cU,cY],gO:[gL,gK,cU],gI:[cT,1O,1O],gH:[cS,gG,cS],gF:[8U,8U,8U],gD:[1O,gC,gB],gA:[1O,1O,cT],gw:[0,1O,0],gv:[1O,0,1O],gu:[67,0,0],gs:[0,0,67],gr:[67,67,0],gq:[1O,d6,0],gp:[1O,8R,gn],gm:[67,0,67],gl:[1O,0,0],gk:[8R,8R,8R],gj:[1O,1O,1O],gi:[1O,1O,0]};A.fx.5L=C(a,b){if(A.fx.7H[a])G{r:A.fx.7H[a][0],g:A.fx.7H[a][1],b:A.fx.7H[a][2]};L if(2L=/^6v\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)$/.8Q(a))G{r:R(2L[1]),g:R(2L[2]),b:R(2L[3])};L if(2L=/6v\\(\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*\\)$/.8Q(a))G{r:2c(2L[1])*2.55,g:2c(2L[2])*2.55,b:2c(2L[3])*2.55};L if(2L=/^#([a-fA-6t-9])([a-fA-6t-9])([a-fA-6t-9])$/.8Q(a))G{r:R("6s"+2L[1]+2L[1]),g:R("6s"+2L[2]+2L[2]),b:R("6s"+2L[3]+2L[3])};L if(2L=/^#([a-fA-6t-9]{2})([a-fA-6t-9]{2})([a-fA-6t-9]{2})$/.8Q(a))G{r:R("6s"+2L[1]),g:R("6s"+2L[2]),b:R("6s"+2L[3])};L G b==14?H:{r:1O,g:1O,b:1O}};A.fx.cQ={5d:1,4y:1,5i:1,4x:1,4e:1,4a:1,S:1,M:1,bx:1,gh:1,4L:1,4K:1,53:1,4M:1,7y:1,5R:1,7x:1,8O:1,1E:1,ge:1,gc:1,4Q:1,4F:1,5g:1,5b:1,2D:1,gb:1,O:1,V:1,3j:1};A.fx.cN={6P:1,ga:1,g9:1,g8:1,g7:1,g6:1,g5:1};A.fx.7v=[\'g4\',\'g3\',\'g2\',\'g1\'];A.fx.aL={\'aK\':[\'2u\',\'cK\'],\'8E\':[\'2u\',\'aH\'],\'5X\':[\'5X\',\'\'],\'7E\':[\'7E\',\'\']};A.fn.1U({4S:C(b,c,d,f){G B.1r(C(){F a=A.1l(c,d,f);F e=W A.cI(B,a,b)})},aG:C(b,c){G B.1r(C(){F a=A.1l(b,c);F e=W A.aG(B,a)})},7w:C(a){G B.1y(C(){if(B.5e)A.aF(B,a)})},fZ:C(a){G B.1y(C(){if(B.5e)A.aF(B,a);if(B.1r&&B.1r[\'fx\'])B.1r.fx=[]})}});A.1U({aG:C(a,b){F z=B,5f;z.3f=C(){if(A.cF(b.1T))b.1T.1x(a)};z.2A=5Y(C(){z.3f()},b.1H);a.5e=z},1e:{b1:C(p,n,a,b,c){G((-Z.51(p*Z.2F)/2)+0.5)*b+a}},cI:C(f,g,h){F z=B,5f;F y=f.Y;F k=A.E(f,"2N");F l=A.E(f,"11");F o={};z.9a=(W 6p()).6y();g.1e=g.1e&&A.1e[g.1e]?g.1e:\'b1\';z.8H=C(a,b){if(A.fx.cQ[a]){if(b==\'1S\'||b==\'2x\'||b==\'3E\'){if(!f.5I)f.5I={};F r=2c(A.5S(f,a));f.5I[a]=r&&r>-aW?r:(2c(A.E(f,a))||0);b=b==\'3E\'?(l==\'1k\'?\'1S\':\'2x\'):b;g[b]=14;o[a]=b==\'1S\'?[0,f.5I[a]]:[f.5I[a],0];if(a!=\'1E\')y[a]=o[a][0]+(a!=\'3j\'&&a!=\'87\'?\'Q\':\'\');L A.1m(y,"1E",o[a][0])}L{o[a]=[2c(A.5S(f,a)),2c(b)||0]}}L if(A.fx.cN[a])o[a]=[A.fx.5L(A.5S(f,a)),A.fx.5L(b)];L if(/^5X$|7E$|2u$|8E$|aK$/i.3M(a)){F m=b.48(/\\s+/g,\' \').48(/6v\\s*\\(\\s*/g,\'6v(\').48(/\\s*,\\s*/g,\',\').48(/\\s*\\)/g,\')\').aD(/([^\\s]+)/g);2X(a){19\'5X\':19\'7E\':19\'aK\':19\'8E\':m[3]=m[3]||m[1]||m[0];m[2]=m[2]||m[0];m[1]=m[1]||m[0];1V(F i=0;i<A.fx.7v.1b;i++){F c=A.fx.aL[a][0]+A.fx.7v[i]+A.fx.aL[a][1];o[c]=a==\'8E\'?[A.fx.5L(A.5S(f,c)),A.fx.5L(m[i])]:[2c(A.5S(f,c)),2c(m[i])]}1n;19\'2u\':1V(F i=0;i<m.1b;i++){F d=2c(m[i]);F e=!fX(d)?\'cK\':(!/b7|1k|2B|fW|fV|fU|fT|fS|fQ|fP|fO/i.3M(m[i])?\'aH\':H);if(e){1V(F j=0;j<A.fx.7v.1b;j++){c=\'2u\'+A.fx.7v[j]+e;o[c]=e==\'aH\'?[A.fx.5L(A.5S(f,c)),A.fx.5L(m[i])]:[2c(A.5S(f,c)),d]}}L{y[\'fN\']=m[i]}}1n}}L{y[a]=b}G H};1V(p in h){if(p==\'Y\'){F q=A.ax(h[p]);1V(6I in q){B.8H(6I,q[6I])}}L if(p==\'2Z\'){if(1c.8D)1V(F i=0;i<1c.8D.1b;i++){F s=1c.8D[i].fM||1c.8D[i].fL||P;if(s){1V(F j=0;j<s.1b;j++){if(s[j].fK==\'.\'+h[p]){F u=W bw(\'\\.\'+h[p]+\' {\');F v=s[j].Y.9d;F q=A.ax(v.48(u,\'\').48(/}/g,\'\'));1V(6I in q){B.8H(6I,q[6I])}}}}}}L{B.8H(p,h[p])}}y.11=l==\'1k\'?\'2v\':l;y.2N=\'2B\';z.3f=C(){F t=(W 6p()).6y();if(t>g.1H+z.9a){5h(z.2A);z.2A=P;1V(p in o){if(p=="1E")A.1m(y,"1E",o[p][1]);L if(28 o[p][1]==\'7M\')y[p]=\'6v(\'+o[p][1].r+\',\'+o[p][1].g+\',\'+o[p][1].b+\')\';L y[p]=o[p][1]+(p!=\'3j\'&&p!=\'87\'?\'Q\':\'\')}if(g.2x||g.1S)1V(F p in f.5I)if(p=="1E")A.1m(y,p,f.5I[p]);L y[p]="";y.11=g.2x?\'1k\':(l!=\'1k\'?l:\'2v\');y.2N=k;f.5e=P;if(A.cF(g.1T))g.1T.1x(f)}L{F n=t-B.9a;F a=n/g.1H;1V(p in o){if(28 o[p][1]==\'7M\'){y[p]=\'6v(\'+R(A.1e[g.1e](a,n,o[p][0].r,(o[p][1].r-o[p][0].r),g.1H))+\',\'+R(A.1e[g.1e](a,n,o[p][0].g,(o[p][1].g-o[p][0].g),g.1H))+\',\'+R(A.1e[g.1e](a,n,o[p][0].b,(o[p][1].b-o[p][0].b),g.1H))+\')\'}L{F b=A.1e[g.1e](a,n,o[p][0],(o[p][1]-o[p][0]),g.1H);if(p=="1E")A.1m(y,"1E",b);L y[p]=b+(p!=\'3j\'&&p!=\'87\'?\'Q\':\'\')}}}};z.2A=5Y(C(){z.3f()},13);f.5e=z},aF:C(a,b){if(b)a.5e.9a-=fJ;L{1P.5h(a.5e.2A);a.5e=P;A.2z(a,"fx")}}});A.ax=C(a){F b={};if(28 a==\'4B\'){a=a.5u().6W(\';\');1V(F i=0;i<a.1b;i++){8B=a[i].6W(\':\');if(8B.1b==2){b[A.cE(8B[0].48(/\\-(\\w)/g,C(m,c){G c.fI()}))]=A.cE(8B[1])}}}G b};A.fn.1U({fH:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.4N(B,a,b,\'3K\',\'5o\',c)})},fG:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.4N(B,a,b,\'3Z\',\'5o\',c)})},fF:C(a,b,c){G B.1r(\'1j\',C(){if(A.E(B,\'11\')==\'1k\'){W A.fx.4N(B,a,b,\'3Z\',\'6n\',c)}L{W A.fx.4N(B,a,b,\'3Z\',\'5o\',c)}})},fE:C(a,b,c){G B.1r(\'1j\',C(){if(A.E(B,\'11\')==\'1k\'){W A.fx.4N(B,a,b,\'3K\',\'6n\',c)}L{W A.fx.4N(B,a,b,\'3K\',\'5o\',c)}})},fD:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.4N(B,a,b,\'3K\',\'6n\',c)})},fC:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.4N(B,a,b,\'3Z\',\'6n\',c)})}});A.fx.4N=C(e,a,b,c,d,f){if(!A.4n(e)){A.2z(e,\'1j\');G H}F z=B;F g=H;z.el=A(e);z.1e=28 b==\'4B\'?b:f||P;z.29=28 b==\'C\'?b:P;z.1K=d;z.1l=a;z.26=A.12.2f(e);z.U={};z.U.T=z.el.E(\'T\');z.U.11=z.el.E(\'11\');if(z.U.11==\'1k\'){95=z.el.E(\'2W\');z.el.1S();g=14}z.U.O=z.el.E(\'O\');z.U.M=z.el.E(\'M\');if(g){z.el.2x();z.el.E(\'2W\',95)}z.U.V=z.26.w+\'Q\';z.U.S=z.26.h+\'Q\';z.U.2N=z.el.E(\'2N\');z.26.O=R(z.U.O)||0;z.26.M=R(z.U.M)||0;if(z.U.T!=\'2i\'&&z.U.T!=\'1J\'){z.el.E(\'T\',\'2i\')}z.el.E(\'2N\',\'2B\').E(\'S\',d==\'6n\'&&c==\'3K\'?1:z.26.h+\'Q\').E(\'V\',d==\'6n\'&&c==\'3Z\'?1:z.26.w+\'Q\');z.1T=C(){z.el.E(z.U);if(z.1K==\'5o\')z.el.2x();L z.el.1S();A.2z(z.el.I(0),\'1j\')};2X(c){19\'3K\':z.eh=W A.fx(z.el.I(0),A.1l(a-15,z.1e,b),\'S\');z.et=W A.fx(z.el.I(0),A.1l(z.1l,z.1e,z.1T),\'O\');if(z.1K==\'5o\'){z.eh.1G(z.26.h,0);z.et.1G(z.26.O,z.26.O+z.26.h/2)}L{z.eh.1G(0,z.26.h);z.et.1G(z.26.O+z.26.h/2,z.26.O)}1n;19\'3Z\':z.eh=W A.fx(z.el.I(0),A.1l(a-15,z.1e,b),\'V\');z.et=W A.fx(z.el.I(0),A.1l(z.1l,z.1e,z.1T),\'M\');if(z.1K==\'5o\'){z.eh.1G(z.26.w,0);z.et.1G(z.26.M,z.26.M+z.26.w/2)}L{z.eh.1G(0,z.26.w);z.et.1G(z.26.M+z.26.w/2,z.26.M)}1n}};A.fn.au=C(b,c,d){G B.1r(\'1j\',C(){if(!A.4n(B)){A.2z(B,\'1j\');G H}F a=W A.fx.au(B,b,c,d);a.at()})};A.fx.au=C(a,b,c,d){F z=B;z.74=c;z.52=1;z.el=a;z.1l=b;z.29=d;A(z.el).1S();z.at=C(){z.52++;z.e=W A.fx(z.el,A.1l(z.1l,C(){z.ef=W A.fx(z.el,A.1l(z.1l,C(){if(z.52<=z.74)z.at();L{A.2z(z.el,\'1j\');if(z.29&&z.29.1F==2w){z.29.1x(z.el)}}}),\'1E\');z.ef.1G(0,1)}),\'1E\');z.e.1G(1,0)}};A.fn.1U({fB:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.5E(B,a,1,1Y,14,b,\'cz\',c)})},fy:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.5E(B,a,1Y,1,14,b,\'as\',c)})},fw:C(b,c,d){G B.1r(\'1j\',C(){F a=a||\'d2\';W A.fx.5E(B,b,1Y,cX,14,c,\'5c\',a)})},5E:C(a,b,c,d,e,f){G B.1r(\'1j\',C(){W A.fx.5E(B,a,b,c,d,e,\'5E\',f)})}});A.fx.5E=C(e,f,g,h,j,k,m,q){if(!A.4n(e)){A.2z(e,\'1j\');G H}F z=B;z.el=A(e);z.6m=R(g)||1Y;z.3v=R(h)||1Y;z.1e=28 k==\'4B\'?k:q||P;z.29=28 k==\'C\'?k:P;z.1H=A.1l(f).1H;z.bL=j||P;z.26=A.12.2f(e);z.U={V:z.el.E(\'V\'),S:z.el.E(\'S\'),4a:z.el.E(\'4a\')||\'1Y%\',T:z.el.E(\'T\'),11:z.el.E(\'11\'),O:z.el.E(\'O\'),M:z.el.E(\'M\'),2N:z.el.E(\'2N\'),4x:z.el.E(\'4x\'),5i:z.el.E(\'5i\'),5d:z.el.E(\'5d\'),4y:z.el.E(\'4y\'),5b:z.el.E(\'5b\'),5g:z.el.E(\'5g\'),4Q:z.el.E(\'4Q\'),4F:z.el.E(\'4F\')};z.V=R(z.U.V)||e.3P||0;z.S=R(z.U.S)||e.5r||0;z.O=R(z.U.O)||0;z.M=R(z.U.M)||0;1o=[\'em\',\'Q\',\'fv\',\'%\'];1V(i in 1o){if(z.U.4a.3o(1o[i])>0){z.cy=1o[i];z.4a=2c(z.U.4a)}if(z.U.4x.3o(1o[i])>0){z.cx=1o[i];z.aq=2c(z.U.4x)||0}if(z.U.5i.3o(1o[i])>0){z.cw=1o[i];z.ap=2c(z.U.5i)||0}if(z.U.5d.3o(1o[i])>0){z.cv=1o[i];z.ao=2c(z.U.5d)||0}if(z.U.4y.3o(1o[i])>0){z.cu=1o[i];z.an=2c(z.U.4y)||0}if(z.U.5b.3o(1o[i])>0){z.ct=1o[i];z.am=2c(z.U.5b)||0}if(z.U.5g.3o(1o[i])>0){z.cr=1o[i];z.al=2c(z.U.5g)||0}if(z.U.4Q.3o(1o[i])>0){z.cq=1o[i];z.ak=2c(z.U.4Q)||0}if(z.U.4F.3o(1o[i])>0){z.cp=1o[i];z.aj=2c(z.U.4F)||0}}if(z.U.T!=\'2i\'&&z.U.T!=\'1J\'){z.el.E(\'T\',\'2i\')}z.el.E(\'2N\',\'2B\');z.1K=m;2X(z.1K){19\'cz\':z.3V=z.O+z.26.h/2;z.4H=z.O;z.3Q=z.M+z.26.w/2;z.4r=z.M;1n;19\'as\':z.4H=z.O+z.26.h/2;z.3V=z.O;z.4r=z.M+z.26.w/2;z.3Q=z.M;1n;19\'5c\':z.4H=z.O-z.26.h/4;z.3V=z.O;z.4r=z.M-z.26.w/4;z.3Q=z.M;1n}z.ai=H;z.t=(W 6p).6y();z.4i=C(){5h(z.2A);z.2A=P};z.3f=C(){if(z.ai==H){z.el.1S();z.ai=14}F t=(W 6p).6y();F n=t-z.t;F p=n/z.1H;if(t>=z.1H+z.t){97(C(){o=1;if(z.1K){t=z.4H;l=z.4r;if(z.1K==\'5c\')o=0}z.ag(z.3v,l,t,14,o)},13);z.4i()}L{o=1;if(!A.1e||!A.1e[z.1e]){s=((-Z.51(p*Z.2F)/2)+0.5)*(z.3v-z.6m)+z.6m}L{s=A.1e[z.1e](p,n,z.6m,(z.3v-z.6m),z.1H)}if(z.1K){if(!A.1e||!A.1e[z.1e]){t=((-Z.51(p*Z.2F)/2)+0.5)*(z.4H-z.3V)+z.3V;l=((-Z.51(p*Z.2F)/2)+0.5)*(z.4r-z.3Q)+z.3Q;if(z.1K==\'5c\')o=((-Z.51(p*Z.2F)/2)+0.5)*(-0.9B)+0.9B}L{t=A.1e[z.1e](p,n,z.3V,(z.4H-z.3V),z.1H);l=A.1e[z.1e](p,n,z.3Q,(z.4r-z.3Q),z.1H);if(z.1K==\'5c\')o=A.1e[z.1e](p,n,0.9B,-0.9B,z.1H)}}z.ag(s,l,t,H,o)}};z.2A=5Y(C(){z.3f()},13);z.ag=C(a,b,c,d,e){z.el.E(\'S\',z.S*a/1Y+\'Q\').E(\'V\',z.V*a/1Y+\'Q\').E(\'M\',b+\'Q\').E(\'O\',c+\'Q\').E(\'4a\',z.4a*a/1Y+z.cy);if(z.aq)z.el.E(\'4x\',z.aq*a/1Y+z.cx);if(z.ap)z.el.E(\'5i\',z.ap*a/1Y+z.cw);if(z.ao)z.el.E(\'5d\',z.ao*a/1Y+z.cv);if(z.an)z.el.E(\'4y\',z.an*a/1Y+z.cu);if(z.am)z.el.E(\'5b\',z.am*a/1Y+z.ct);if(z.al)z.el.E(\'5g\',z.al*a/1Y+z.cr);if(z.ak)z.el.E(\'4Q\',z.ak*a/1Y+z.cq);if(z.aj)z.el.E(\'4F\',z.aj*a/1Y+z.cp);if(z.1K==\'5c\'){if(1P.6j)z.el.I(0).Y.4X="7s(1E="+e*1Y+")";z.el.I(0).Y.1E=e}if(d){if(z.bL){z.el.E(z.U)}if(z.1K==\'as\'||z.1K==\'5c\'){z.el.E(\'11\',\'1k\');if(z.1K==\'5c\'){if(1P.6j)z.el.I(0).Y.4X="7s(1E="+1Y+")";z.el.I(0).Y.1E=1}}L z.el.E(\'11\',\'2v\');if(z.29)z.29.1x(z.el.I(0));A.2z(z.el.I(0),\'1j\')}}};A.fn.1U({9A:C(a,b,c){o=A.1l(a);G B.1r(\'1j\',C(){W A.fx.9A(B,o,b,c)})},ft:C(a,b,c){G B.1y(C(){A(\'a[@2U*="#"]\',B).4U(C(e){co=B.2U.6W(\'#\');A(\'#\'+co[1]).9A(a,b,c);G H})})}});A.fx.9A=C(e,o,a,b){F z=B;z.o=o;z.e=e;z.2g=/cn|cm/.3M(a)?a:H;z.1e=b;p=A.12.3a(e);s=A.12.5O();z.4i=C(){5h(z.2A);z.2A=P;A.2z(z.e,\'1j\')};z.t=(W 6p).6y();s.h=s.h>s.ih?(s.h-s.ih):s.h;s.w=s.w>s.iw?(s.w-s.iw):s.w;z.4H=p.y>s.h?s.h:p.y;z.4r=p.x>s.w?s.w:p.x;z.3V=s.t;z.3Q=s.l;z.3f=C(){F t=(W 6p).6y();F n=t-z.t;F p=n/z.o.1H;if(t>=z.o.1H+z.t){z.4i();97(C(){z.ab(z.4H,z.4r)},13)}L{if(!z.2g||z.2g==\'cn\'){if(!A.1e||!A.1e[z.1e]){8v=((-Z.51(p*Z.2F)/2)+0.5)*(z.4H-z.3V)+z.3V}L{8v=A.1e[z.1e](p,n,z.3V,(z.4H-z.3V),z.o.1H)}}L{8v=z.3V}if(!z.2g||z.2g==\'cm\'){if(!A.1e||!A.1e[z.1e]){8u=((-Z.51(p*Z.2F)/2)+0.5)*(z.4r-z.3Q)+z.3Q}L{8u=A.1e[z.1e](p,n,z.3Q,(z.4r-z.3Q),z.o.1H)}}L{8u=z.3Q}z.ab(8v,8u)}};z.ab=C(t,l){1P.fs(l,t)};z.2A=5Y(C(){z.3f()},13)};A.fn.a8=C(a,b){G B.1r(\'1j\',C(){if(!A.4n(B)){A.2z(B,\'1j\');G H}F e=W A.fx.a8(B,a,b);e.a7()})};A.fx.a8=C(e,a,b){F z=B;z.el=A(e);z.el.1S();z.74=R(a)||3;z.29=b;z.52=1;z.U={};z.U.T=z.el.E(\'T\');z.U.O=R(z.el.E(\'O\'))||0;z.U.M=R(z.el.E(\'M\'))||0;if(z.U.T!=\'2i\'&&z.U.T!=\'1J\'){z.el.E(\'T\',\'2i\')}z.a7=C(){z.52++;z.e=W A.fx(z.el.I(0),{1H:60,1T:C(){z.e=W A.fx(z.el.I(0),{1H:60,1T:C(){z.e=W A.fx(e,{1H:60,1T:C(){if(z.52<=z.74)z.a7();L{z.el.E(\'T\',z.U.T).E(\'O\',z.U.O+\'Q\').E(\'M\',z.U.M+\'Q\');A.2z(z.el.I(0),\'1j\');if(z.29&&z.29.1F==2w){z.29.1x(z.el.I(0))}}}},\'M\');z.e.1G(z.U.M-20,z.U.M)}},\'M\');z.e.1G(z.U.M+20,z.U.M-20)}},\'M\');z.e.1G(z.U.M,z.U.M+20)}};A.fn.1U({dR:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.1u(B,a,b,\'4l\',\'in\',c)})},c6:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.1u(B,a,b,\'4l\',\'3U\',c)})},fr:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.1u(B,a,b,\'4l\',\'3E\',c)})},fq:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.1u(B,a,b,\'41\',\'in\',c)})},fp:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.1u(B,a,b,\'41\',\'3U\',c)})},fo:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.1u(B,a,b,\'41\',\'3E\',c)})},fm:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.1u(B,a,b,\'M\',\'in\',c)})},fl:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.1u(B,a,b,\'M\',\'3U\',c)})},fk:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.1u(B,a,b,\'M\',\'3E\',c)})},fj:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.1u(B,a,b,\'2D\',\'in\',c)})},fi:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.1u(B,a,b,\'2D\',\'3U\',c)})},fh:C(a,b,c){G B.1r(\'1j\',C(){W A.fx.1u(B,a,b,\'2D\',\'3E\',c)})}});A.fx.1u=C(e,a,b,c,d,f){if(!A.4n(e)){A.2z(e,\'1j\');G H}F z=B;z.el=A(e);z.1e=28 b==\'4B\'?b:f||P;z.29=28 b==\'C\'?b:P;if(d==\'3E\'){d=z.el.E(\'11\')==\'1k\'?\'in\':\'3U\'}if(!e.4f)e.4f=z.el.E(\'11\');z.el.1S();z.1l=a;z.fx=A.fx.9u(e);z.1K=d;z.6T=c;z.1T=C(){if(z.1K==\'3U\')z.el.E(\'2W\',\'2B\');A.fx.9n(z.fx.2Y.I(0),z.fx.U);if(z.1K==\'in\'){z.el.E(\'11\',z.el.I(0).4f==\'1k\'?\'2v\':z.el.I(0).4f)}L{z.el.E(\'11\',\'1k\');z.el.E(\'2W\',\'cl\')}if(z.29&&z.29.1F==2w){z.29.1x(z.el.I(0))}A.2z(z.el.I(0),\'1j\')};2X(z.6T){19\'4l\':z.ef=W A.fx(z.el.I(0),A.1l(z.1l,z.1e,z.1T),\'O\');z.79=W A.fx(z.fx.2Y.I(0),A.1l(z.1l,z.1e),\'S\');if(z.1K==\'in\'){z.ef.1G(-z.fx.U.1o.hb,0);z.79.1G(0,z.fx.U.1o.hb)}L{z.ef.1G(0,-z.fx.U.1o.hb);z.79.1G(z.fx.U.1o.hb,0)}1n;19\'41\':z.ef=W A.fx(z.el.I(0),A.1l(z.1l,z.1e,z.1T),\'O\');if(z.1K==\'in\'){z.ef.1G(z.fx.U.1o.hb,0)}L{z.ef.1G(0,z.fx.U.1o.hb)}1n;19\'M\':z.ef=W A.fx(z.el.I(0),A.1l(z.1l,z.1e,z.1T),\'M\');z.79=W A.fx(z.fx.2Y.I(0),A.1l(z.1l,z.1e),\'V\');if(z.1K==\'in\'){z.ef.1G(-z.fx.U.1o.1D,0);z.79.1G(0,z.fx.U.1o.1D)}L{z.ef.1G(0,-z.fx.U.1o.1D);z.79.1G(z.fx.U.1o.1D,0)}1n;19\'2D\':z.ef=W A.fx(z.el.I(0),A.1l(z.1l,z.1e,z.1T),\'M\');if(z.1K==\'in\'){z.ef.1G(z.fx.U.1o.1D,0)}L{z.ef.1G(0,z.fx.U.1o.1D)}1n}};A.2O=P;A.fn.fg=C(o){G B.1r(\'1j\',C(){W A.fx.cj(B,o)})};A.fx.cj=C(e,o){if(A.2O==P){A(\'23\',1c).1L(\'<1W id="2O"></1W>\');A.2O=A(\'#2O\')}A.2O.E(\'11\',\'2v\').E(\'T\',\'1J\');F z=B;z.el=A(e);if(!o||!o.3v){G}if(o.3v.1F==8t&&1c.7o(o.3v)){o.3v=1c.7o(o.3v)}L if(!o.3v.ci){G}if(!o.1H){o.1H=ch}z.1H=o.1H;z.3v=o.3v;z.7e=o.2Z;z.1T=o.1T;if(z.7e){A.2O.2H(z.7e)}z.8s=0;z.8i=0;if(A.e0){z.8s=(R(A.2O.E(\'4y\'))||0)+(R(A.2O.E(\'5i\'))||0)+(R(A.2O.E(\'4F\'))||0)+(R(A.2O.E(\'5g\'))||0);z.8i=(R(A.2O.E(\'4x\'))||0)+(R(A.2O.E(\'5d\'))||0)+(R(A.2O.E(\'5b\'))||0)+(R(A.2O.E(\'4Q\'))||0)}z.2b=A.1U(A.12.3a(z.el.I(0)),A.12.2f(z.el.I(0)));z.3m=A.1U(A.12.3a(z.3v),A.12.2f(z.3v));z.2b.1D-=z.8s;z.2b.hb-=z.8i;z.3m.1D-=z.8s;z.3m.hb-=z.8i;z.29=o.1T;A.2O.E(\'V\',z.2b.1D+\'Q\').E(\'S\',z.2b.hb+\'Q\').E(\'O\',z.2b.y+\'Q\').E(\'M\',z.2b.x+\'Q\').4S({O:z.3m.y,M:z.3m.x,V:z.3m.1D,S:z.3m.hb},z.1H,C(){if(z.7e)A.2O.3S(z.7e);A.2O.E(\'11\',\'1k\');if(z.1T&&z.1T.1F==2w){z.1T.1x(z.el.I(0),[z.3v])}A.2z(z.el.I(0),\'1j\')})};A.1q={24:{2u:10,cf:\'1R/ff.ce\',cd:\'<3O 2E="1R/5o.cc" />\',cb:0.8,ca:\'fb 8G\',c9:\'6m\',3F:7n},fa:H,f8:H,5A:P,7m:H,7l:H,a3:C(a){if(!A.1q.7l||A.1q.7m)G;F b=a.6S||a.6R||-1;2X(b){19 35:if(A.1q.5A)A.1q.2b(P,A(\'a[@4o=\'+A.1q.5A+\']:f7\').I(0));1n;19 36:if(A.1q.5A)A.1q.2b(P,A(\'a[@4o=\'+A.1q.5A+\']:f6\').I(0));1n;19 37:19 8:19 33:19 80:19 f4:F c=A(\'#7j\');if(c.I(0).4q!=P){c.I(0).4q.1x(c.I(0))}1n;19 38:1n;19 39:19 34:19 32:19 fd:19 78:F d=A(\'#7h\');if(d.I(0).4q!=P){d.I(0).4q.1x(d.I(0))}1n;19 40:1n;19 27:A.1q.8q();1n}},6g:C(a){if(a)A.1U(A.1q.24,a);if(1P.3N){A(\'23\',1c).1C(\'5Q\',A.1q.a3)}L{A(1c).1C(\'5Q\',A.1q.a3)}A(\'a\').1y(C(){el=A(B);c5=el.1m(\'4o\')||\'\';c4=el.1m(\'2U\')||\'\';cg=/\\.cc|\\.f2|\\.7q|\\.ce|\\.f1/g;if(c4.5u().aD(cg)!=P&&c5.5u().3o(\'c2\')==0){el.1C(\'4U\',A.1q.2b)}});if(A.2R.46){3q=1c.3x(\'3q\');A(3q).1m({id:\'a1\',2E:\'dc:H;\',da:\'b0\',d7:\'b0\'}).E({11:\'1k\',T:\'1J\',O:\'0\',M:\'0\',4X:\'9x:9C.9E.a6(1E=0)\'});A(\'23\').1L(3q)}7r=1c.3x(\'1W\');A(7r).1m(\'id\',\'a0\').E({T:\'1J\',11:\'1k\',O:\'0\',M:\'0\',1E:0}).1L(1c.8b(\' \')).1C(\'4U\',A.1q.8q);5C=1c.3x(\'1W\');A(5C).1m(\'id\',\'c0\').E({4F:A.1q.24.2u+\'Q\'}).1L(1c.8b(\' \'));9Z=1c.3x(\'1W\');A(9Z).1m(\'id\',\'bY\').E({4F:A.1q.24.2u+\'Q\',4Q:A.1q.24.2u+\'Q\'}).1L(1c.8b(\' \'));9Y=1c.3x(\'a\');A(9Y).1m({id:\'f0\',2U:\'#\'}).E({T:\'1J\',2D:A.1q.24.2u+\'Q\',O:\'0\'}).1L(A.1q.24.cd).1C(\'4U\',A.1q.8q);6Z=1c.3x(\'1W\');A(6Z).1m(\'id\',\'9X\').E({T:\'2i\',9W:\'M\',5X:\'0 8x\',3j:1}).1L(5C).1L(9Z).1L(9Y);21=1c.3x(\'3O\');21.2E=A.1q.24.cf;A(21).1m(\'id\',\'bW\').E({T:\'1J\'});5G=1c.3x(\'a\');A(5G).1m({id:\'7j\',2U:\'#\'}).E({T:\'1J\',11:\'1k\',2N:\'2B\',cC:\'1k\'}).1L(1c.8b(\' \'));5F=1c.3x(\'a\');A(5F).1m({id:\'7h\',2U:\'#\'}).E({T:\'1J\',2N:\'2B\',cC:\'1k\'}).1L(1c.8b(\' \'));2q=1c.3x(\'1W\');A(2q).1m(\'id\',\'bT\').E({11:\'1k\',T:\'2i\',2N:\'2B\',9W:\'M\',5X:\'0 8x\',O:\'0\',M:\'0\',3j:2}).1L([21,5G,5F]);5Z=1c.3x(\'1W\');A(5Z).1m(\'id\',\'8m\').E({11:\'1k\',T:\'1J\',2N:\'2B\',O:\'0\',M:\'0\',9W:\'az\',6P:\'b7\',eY:\'0\'}).1L([2q,6Z]);A(\'23\').1L(7r).1L(5Z)},2b:C(e,a){el=a?A(a):A(B);8J=el.1m(\'4o\');F b,4E,5G,5F;if(8J!=\'c2\'){A.1q.5A=8J;7F=A(\'a[@4o=\'+8J+\']\');b=7F.1N();4E=7F.aY(a?a:B);5G=7F.I(4E-1);5F=7F.I(4E+1)}aw=el.1m(\'2U\');5C=el.1m(\'3T\');3R=A.12.5O();7r=A(\'#a0\');if(!A.1q.7l){A.1q.7l=14;if(A.2R.46){A(\'#a1\').E(\'S\',Z.3g(3R.ih,3R.h)+\'Q\').E(\'V\',Z.3g(3R.iw,3R.w)+\'Q\').1S()}7r.E(\'S\',Z.3g(3R.ih,3R.h)+\'Q\').E(\'V\',Z.3g(3R.iw,3R.w)+\'Q\').1S().bS(bz,A.1q.24.cb,C(){A.1q.aB(aw,5C,3R,b,4E,5G,5F)});A(\'#8m\').E(\'V\',Z.3g(3R.iw,3R.w)+\'Q\')}L{A(\'#7j\').I(0).4q=P;A(\'#7h\').I(0).4q=P;A.1q.aB(aw,5C,3R,b,4E,5G,5F)}G H},aB:C(a,b,c,d,e,f,g){A(\'#aA\').9U();8l=A(\'#7j\');8l.2x();8k=A(\'#7h\');8k.2x();21=A(\'#bW\');2q=A(\'#bT\');5Z=A(\'#8m\');6Z=A(\'#9X\').E(\'2W\',\'2B\');A(\'#c0\').3i(5C);A.1q.7m=14;if(d)A(\'#bY\').3i(A.1q.24.ca+\' \'+(e+1)+\' \'+A.1q.24.c9+\' \'+d);if(f){8l.I(0).4q=C(){B.4W();A.1q.2b(P,f);G H}}if(g){8k.I(0).4q=C(){B.4W();A.1q.2b(P,g);G H}}21.1S();7u=A.12.2f(2q.I(0));4C=Z.3g(7u.1D,21.I(0).V+A.1q.24.2u*2);59=Z.3g(7u.hb,21.I(0).S+A.1q.24.2u*2);21.E({M:(4C-21.I(0).V)/2+\'Q\',O:(59-21.I(0).S)/2+\'Q\'});2q.E({V:4C+\'Q\',S:59+\'Q\'}).1S();bQ=A.12.a5();5Z.E(\'O\',c.t+(bQ.h/15)+\'Q\');if(5Z.E(\'11\')==\'1k\'){5Z.1S().6U(A.1q.24.3F)}5H=W 8M;A(5H).1m(\'id\',\'aA\').1C(\'eP\',C(){4C=5H.V+A.1q.24.2u*2;59=5H.S+A.1q.24.2u*2;21.2x();2q.4S({S:59},7u.hb!=59?A.1q.24.3F:1,C(){2q.4S({V:4C},7u.1D!=4C?A.1q.24.3F:1,C(){2q.aJ(5H);A(5H).E({T:\'1J\',M:A.1q.24.2u+\'Q\',O:A.1q.24.2u+\'Q\'}).6U(A.1q.24.3F,C(){cL=A.12.2f(6Z.I(0));if(f){8l.E({M:A.1q.24.2u+\'Q\',O:A.1q.24.2u+\'Q\',V:4C/2-A.1q.24.2u*3+\'Q\',S:59-A.1q.24.2u*2+\'Q\'}).1S()}if(g){8k.E({M:4C/2+A.1q.24.2u*2+\'Q\',O:A.1q.24.2u+\'Q\',V:4C/2-A.1q.24.2u*3+\'Q\',S:59-A.1q.24.2u*2+\'Q\'}).1S()}6Z.E({V:4C+\'Q\',O:-cL.hb+\'Q\',2W:\'cl\'}).4S({O:-1},A.1q.24.3F,C(){A.1q.7m=H})})})})});5H.2E=a},8q:C(){A(\'#aA\').9U();A(\'#8m\').2x();A(\'#9X\').E(\'2W\',\'2B\');A(\'#a0\').bS(bz,0,C(){A(B).2x();if(A.2R.46){A(\'#a1\').2x()}});A(\'#7j\').I(0).4q=P;A(\'#7h\').I(0).4q=P;A.1q.5A=P;A.1q.7l=H;A.1q.7m=H;G H}};A.N={1v:P,3A:P,1g:P,1A:P,1o:P,T:P,7f:C(e){A.N.1g=(B.9T)?B.9T:B;A.N.1A=A.12.3W(e);A.N.1o={V:R(A(A.N.1g).E(\'V\'))||0,S:R(A(A.N.1g).E(\'S\'))||0};A.N.T={O:R(A(A.N.1g).E(\'O\'))||0,M:R(A(A.N.1g).E(\'M\'))||0};A(1c).1C(\'3t\',A.N.aO).1C(\'5n\',A.N.aN);if(28 A.N.1g.1h.bO===\'C\'){A.N.1g.1h.bO.1x(A.N.1g)}G H},aN:C(e){A(1c).3h(\'3t\',A.N.aO).3h(\'5n\',A.N.aN);if(28 A.N.1g.1h.cO===\'C\'){A.N.1g.1h.cO.1x(A.N.1g)}A.N.1g=P},aO:C(e){if(!A.N.1g){G}1A=A.12.3W(e);6c=A.N.T.O-A.N.1A.y+1A.y;77=A.N.T.M-A.N.1A.x+1A.x;6c=Z.3g(Z.3k(6c,A.N.1g.1h.7d-A.N.1o.S),A.N.1g.1h.6F);77=Z.3g(Z.3k(77,A.N.1g.1h.7c-A.N.1o.V),A.N.1g.1h.6u);if(28 A.N.1g.1h.4h===\'C\'){F a=A.N.1g.1h.4h.1x(A.N.1g,[77,6c]);if(28 a==\'eI\'&&a.1b==2){77=a[0];6c=a[1]}}A.N.1g.Y.O=6c+\'Q\';A.N.1g.Y.M=77+\'Q\';G H},2b:C(e){A(1c).1C(\'3t\',A.N.7g).1C(\'5n\',A.N.7w);A.N.1v=B.1v;A.N.3A=B.3A;A.N.1A=A.12.3W(e);A.N.1o={V:R(A(B.1v).E(\'V\'))||0,S:R(A(B.1v).E(\'S\'))||0};A.N.T={O:R(A(B.1v).E(\'O\'))||0,M:R(A(B.1v).E(\'M\'))||0};if(A.N.1v.1h.4c){A.N.1v.1h.4c.1x(A.N.1v,[B])}G H},7w:C(){A(1c).3h(\'3t\',A.N.7g).3h(\'5n\',A.N.7w);if(A.N.1v.1h.3C){A.N.1v.1h.3C.1x(A.N.1v,[A.N.3A])}A.N.1v=P;A.N.3A=P},5N:C(a,b){G Z.3k(Z.3g(A.N.1o.V+a*b,A.N.1v.1h.8O),A.N.1v.1h.5R)},5M:C(a,b){G Z.3k(Z.3g(A.N.1o.S+a*b,A.N.1v.1h.7x),A.N.1v.1h.7y)},bN:C(a){G Z.3k(Z.3g(a,A.N.1v.1h.7x),A.N.1v.1h.7y)},7g:C(e){if(A.N.1v==P){G}1A=A.12.3W(e);dx=1A.x-A.N.1A.x;dy=1A.y-A.N.1A.y;1B={V:A.N.1o.V,S:A.N.1o.S};2s={O:A.N.T.O,M:A.N.T.M};2X(A.N.3A){19\'e\':1B.V=A.N.5N(dx,1);1n;19\'eH\':1B.V=A.N.5N(dx,1);1B.S=A.N.5M(dy,1);1n;19\'w\':1B.V=A.N.5N(dx,-1);2s.M=A.N.T.M-1B.V+A.N.1o.V;1n;19\'9R\':1B.V=A.N.5N(dx,-1);2s.M=A.N.T.M-1B.V+A.N.1o.V;1B.S=A.N.5M(dy,1);1n;19\'7a\':1B.S=A.N.5M(dy,-1);2s.O=A.N.T.O-1B.S+A.N.1o.S;1B.V=A.N.5N(dx,-1);2s.M=A.N.T.M-1B.V+A.N.1o.V;1n;19\'n\':1B.S=A.N.5M(dy,-1);2s.O=A.N.T.O-1B.S+A.N.1o.S;1n;19\'9Q\':1B.S=A.N.5M(dy,-1);2s.O=A.N.T.O-1B.S+A.N.1o.S;1B.V=A.N.5N(dx,1);1n;19\'s\':1B.S=A.N.5M(dy,1);1n}if(A.N.1v.1h.44){if(A.N.3A==\'n\'||A.N.3A==\'s\')43=1B.S*A.N.1v.1h.44;L 43=1B.V;4z=A.N.bN(43*A.N.1v.1h.44);43=4z/A.N.1v.1h.44;2X(A.N.3A){19\'n\':19\'7a\':19\'9Q\':2s.O+=1B.S-4z;1n}2X(A.N.3A){19\'7a\':19\'w\':19\'9R\':2s.M+=1B.V-43;1n}1B.S=4z;1B.V=43}if(2s.O<A.N.1v.1h.6F){4z=1B.S+2s.O-A.N.1v.1h.6F;2s.O=A.N.1v.1h.6F;if(A.N.1v.1h.44){43=4z/A.N.1v.1h.44;2X(A.N.3A){19\'7a\':19\'w\':19\'9R\':2s.M+=1B.V-43;1n}1B.V=43}1B.S=4z}if(2s.M<A.N.1v.1h.6u){43=1B.V+2s.M-A.N.1v.1h.6u;2s.M=A.N.1v.1h.6u;if(A.N.1v.1h.44){4z=43*A.N.1v.1h.44;2X(A.N.3A){19\'n\':19\'7a\':19\'9Q\':2s.O+=1B.S-4z;1n}1B.S=4z}1B.V=43}if(2s.O+1B.S>A.N.1v.1h.7d){1B.S=A.N.1v.1h.7d-2s.O;if(A.N.1v.1h.44){1B.V=1B.S/A.N.1v.1h.44}}if(2s.M+1B.V>A.N.1v.1h.7c){1B.V=A.N.1v.1h.7c-2s.M;if(A.N.1v.1h.44){1B.S=1B.V*A.N.1v.1h.44}}F a=H;if(A.N.1v.1h.eG){a=A.N.1v.1h.eG.1x(A.N.1v,[1B,2s]);if(a){if(a.1o){A.1U(1B,a.1o)}if(a.T){A.1U(2s,a.T)}}}8f=A.N.1v.Y;8f.M=2s.M+\'Q\';8f.O=2s.O+\'Q\';8f.V=1B.V+\'Q\';8f.S=1B.S+\'Q\';G H},2l:C(b){if(!b||!b.3G||b.3G.1F!=6E){G}G B.1y(C(){F a=B;a.1h=b;a.1h.8O=b.8O||10;a.1h.7x=b.7x||10;a.1h.5R=b.5R||5P;a.1h.7y=b.7y||5P;a.1h.6F=b.6F||-8V;a.1h.6u=b.6u||-8V;a.1h.7c=b.7c||5P;a.1h.7d=b.7d||5P;bK=A(a).E(\'T\');if(!(bK==\'2i\'||bK==\'1J\')){a.Y.T=\'2i\'}eE=/n|9Q|e|eH|s|9R|w|7a/g;1V(i in a.1h.3G){if(i.5u().aD(eE)!=P){if(a.1h.3G[i].1F==8t){3c=A(a.1h.3G[i]);if(3c.1N()>0){a.1h.3G[i]=3c.I(0)}}if(a.1h.3G[i].4D){a.1h.3G[i].1v=a;a.1h.3G[i].3A=i;A(a.1h.3G[i]).1C(\'4R\',A.N.2b)}}}if(a.1h.5k){if(28 a.1h.5k===\'4B\'){9N=A(a.1h.5k);if(9N.1N()>0){9N.1y(C(){B.9T=a});9N.1C(\'4R\',A.N.7f)}}L if(a.1h.5k==14){A(B).1C(\'4R\',A.N.7f)}}})},4v:C(){G B.1y(C(){F a=B;1V(i in a.1h.3G){a.1h.3G[i].1v=P;a.1h.3G[i].3A=P;A(a.1h.3G[i]).3h(\'4R\',A.N.2b)}if(a.1h.5k){if(28 a.1h.5k===\'4B\'){3c=A(a.1h.5k);if(3c.1N()>0){3c.3h(\'4R\',A.N.7f)}}L if(a.1h.5k==14){A(B).3h(\'4R\',A.N.7f)}}a.1h=P})}};A.fn.1U({jk:A.N.2l,jj:A.N.4v});A.2t=P;A.6J=H;A.31=P;A.6B=[];A.9L=C(e){F a=e.6S||e.6R||-1;if(a==17||a==16){A.6J=14}};A.9J=C(e){A.6J=H};A.eB=C(e){B.f.1A=A.12.3W(e);B.f.1I=A.1U(A.12.3a(B),A.12.2f(B));B.f.4p=A.12.5O(B);B.f.1A.x-=B.f.1I.x;B.f.1A.y-=B.f.1I.y;A(B).1L(A.2t.I(0));if(B.f.hc)A.2t.2H(B.f.hc).E(\'11\',\'2v\');A.2t.E({11:\'2v\',V:\'2G\',S:\'2G\'});if(B.f.o){A.2t.E(\'1E\',B.f.o)}A.31=B;A.7A=H;A.6B=[];B.f.el.1y(C(){B.1I={x:B.7Y+(B.4u&&!A.2R.6l?R(B.4u.4y)||0:0)+(A.31.2P||0),y:B.7t+(B.4u&&!A.2R.6l?R(B.4u.4x)||0:0)+(A.31.2T||0),1D:B.3P,hb:B.5r};if(B.s==14){if(A.6J==H){B.s=H;A(B).3S(A.31.f.71)}L{A.7A=14;A.6B[A.6B.1b]=A.1m(B,\'id\')}}});A.9H.1x(B,[e]);A(1c).1C(\'3t\',A.9H).1C(\'5n\',A.bI);G H};A.9H=C(e){if(!A.31)G;A.eA.1x(A.31,[e])};A.eA=C(e){if(!A.31)G;F a=A.12.3W(e);F b=A.12.5O(A.31);a.x+=b.l-B.f.4p.l-B.f.1I.x;a.y+=b.t-B.f.4p.t-B.f.1I.y;F c=Z.3k(a.x,B.f.1A.x);F d=Z.3k(Z.3B(a.x-B.f.1A.x),Z.3B(B.f.4p.w-c));F f=Z.3k(a.y,B.f.1A.y);F g=Z.3k(Z.3B(a.y-B.f.1A.y),Z.3B(B.f.4p.h-f));if(B.2T>0&&a.y-20<B.2T){F h=Z.3k(b.t,10);f-=h;g+=h;B.2T-=h}L if(B.2T+B.f.1I.h<B.f.4p.h&&a.y+20>B.2T+B.f.1I.h){F h=Z.3k(B.f.4p.h-B.2T,10);B.2T+=h;if(B.2T!=b.t)g+=h}if(B.2P>0&&a.x-20<B.2P){F h=Z.3k(b.l,10);c-=h;d+=h;B.2P-=h}L if(B.2P+B.f.1I.w<B.f.4p.w&&a.x+20>B.2P+B.f.1I.w){F h=Z.3k(B.f.4p.w-B.2P,10);B.2P+=h;if(B.2P!=b.l)d+=h}A.2t.E({M:c+\'Q\',O:f+\'Q\',V:d+\'Q\',S:g+\'Q\'});A.2t.l=c+B.f.4p.l;A.2t.t=f+B.f.4p.t;A.2t.r=A.2t.l+d;A.2t.b=A.2t.t+g;A.7A=H;B.f.el.1y(C(){9G=A.6B.3o(A.1m(B,\'id\'));if(!(B.1I.x>A.2t.r||(B.1I.x+B.1I.1D)<A.2t.l||B.1I.y>A.2t.b||(B.1I.y+B.1I.hb)<A.2t.t)){A.7A=14;if(B.s!=14){B.s=14;A(B).2H(A.31.f.71)}if(9G!=-1){B.s=H;A(B).3S(A.31.f.71)}}L if((B.s==14)&&(9G==-1)){B.s=H;A(B).3S(A.31.f.71)}L if((!B.s)&&(A.6J==14)&&(9G!=-1)){B.s=14;A(B).2H(A.31.f.71)}});G H};A.bI=C(e){if(!A.31)G;A.ez.1x(A.31,[e])};A.ez=C(e){A(1c).3h(\'3t\',A.9H).3h(\'5n\',A.bI);if(!A.31)G;A.2t.E(\'11\',\'1k\');if(B.f.hc)A.2t.3S(B.f.hc);A.31=H;A(\'23\').1L(A.2t.I(0));if(A.7A==14){if(B.f.8d)B.f.8d(A.bF(A.1m(B,\'id\')))}L{if(B.f.8c)B.f.8c(A.bF(A.1m(B,\'id\')))}A.6B=[]};A.bF=C(s){F h=\'\';F o=[];if(a=A(\'#\'+s)){a.I(0).f.el.1y(C(){if(B.s==14){if(h.1b>0){h+=\'&\'}h+=s+\'[]=\'+A.1m(B,\'id\');o[o.1b]=A.1m(B,\'id\')}})}G{6A:h,o:o}};A.fn.jg=C(o){if(!A.2t){A(\'23\',1c).1L(\'<1W id="2t"></1W>\').1C(\'70\',A.9L).1C(\'5Q\',A.9J);A.2t=A(\'#2t\');A.2t.E({T:\'1J\',11:\'1k\'});if(1P.3N){A(\'23\',1c).1C(\'70\',A.9L).1C(\'5Q\',A.9J)}L{A(1c).1C(\'70\',A.9L).1C(\'5Q\',A.9J)}}if(!o){o={}}G B.1y(C(){if(B.ey)G;B.ey=14;B.f={a:o.3r,o:o.1E?2c(o.1E):H,71:o.ex?o.ex:H,hc:o.4G?o.4G:H,8d:o.8d?o.8d:H,8c:o.8c?o.8c:H};B.f.el=A(\'.\'+o.3r);A(B).1C(\'4R\',A.eB).E(\'T\',\'2i\')})};A.2Q={aT:1,ew:C(b){F b=b;G B.1y(C(){B.4g.69.1y(C(a){A.2Q.4s(B,b[a])})})},I:C(){F e=[];B.1y(C(b){if(B.bD){e[b]=[];F c=B;F d=A.12.2f(B);B.4g.69.1y(C(a){F x=B.7Y;F y=B.7t;7B=R(x*1Y/(d.w-B.3P));7C=R(y*1Y/(d.h-B.5r));e[b][a]=[7B||0,7C||0,x||0,y||0]})}});G e},ad:C(a){a.D.ep=a.D.1Z.w-a.D.1w.1D;a.D.eo=a.D.1Z.h-a.D.1w.hb;if(a.92.4g.bB){8Z=a.92.4g.69.I(a.bA+1);if(8Z){a.D.1Z.w=(R(A(8Z).E(\'M\'))||0)+a.D.1w.1D;a.D.1Z.h=(R(A(8Z).E(\'O\'))||0)+a.D.1w.hb}9f=a.92.4g.69.I(a.bA-1);if(9f){F b=R(A(9f).E(\'M\'))||0;F c=R(A(9f).E(\'M\'))||0;a.D.1Z.x+=b;a.D.1Z.y+=c;a.D.1Z.w-=b;a.D.1Z.h-=c}}a.D.ek=a.D.1Z.w-a.D.1w.1D;a.D.ej=a.D.1Z.h-a.D.1w.hb;if(a.D.2C){a.D.gx=((a.D.1Z.w-a.D.1w.1D)/a.D.2C)||1;a.D.gy=((a.D.1Z.h-a.D.1w.hb)/a.D.2C)||1;a.D.d1=a.D.ek/a.D.2C;a.D.d0=a.D.ej/a.D.2C}a.D.1Z.dx=a.D.1Z.x-a.D.22.x;a.D.1Z.dy=a.D.1Z.y-a.D.22.y;A.X.18.E(\'7z\',\'8T\')},3n:C(a,x,y){if(a.D.2C){d9=R(x/a.D.d1);7B=d9*1Y/a.D.2C;d5=R(y/a.D.d0);7C=d5*1Y/a.D.2C}L{7B=R(x*1Y/a.D.ep);7C=R(y*1Y/a.D.eo)}a.D.aa=[7B||0,7C||0,x||0,y||0];if(a.D.3n)a.D.3n.1x(a,a.D.aa)},d3:C(a){6K=a.6S||a.6R||-1;2X(6K){19 35:A.2Q.4s(B.3H,[91,91]);1n;19 36:A.2Q.4s(B.3H,[-91,-91]);1n;19 37:A.2Q.4s(B.3H,[-B.3H.D.gx||-1,0]);1n;19 38:A.2Q.4s(B.3H,[0,-B.3H.D.gy||-1]);1n;19 39:A.2Q.4s(B.3H,[B.3H.D.gx||1,0]);1n;19 40:A.X.4s(B.3H,[0,B.3H.D.gy||1]);1n}},4s:C(a,b){if(!a.D){G}a.D.1w=A.1U(A.12.3a(a),A.12.2f(a));a.D.22={x:R(A.E(a,\'M\'))||0,y:R(A.E(a,\'O\'))||0};a.D.49=A.E(a,\'T\');if(a.D.49!=\'2i\'&&a.D.49!=\'1J\'){a.Y.T=\'2i\'}A.X.ah(a);A.2Q.ad(a);dx=R(b[0])||0;dy=R(b[1])||0;2n=a.D.22.x+dx;2j=a.D.22.y+dy;if(a.D.2C){57=A.X.a9.1x(a,[2n,2j,dx,dy]);if(57.1F==6E){dx=57.dx;dy=57.dy}2n=a.D.22.x+dx;2j=a.D.22.y+dy}57=A.X.ae.1x(a,[2n,2j,dx,dy]);if(57&&57.1F==6E){dx=57.dx;dy=57.dy}2n=a.D.22.x+dx;2j=a.D.22.y+dy;if(a.D.4P&&(a.D.3n||a.D.2I)){A.2Q.3n(a,2n,2j)}2n=!a.D.2g||a.D.2g==\'3Z\'?2n:a.D.22.x||0;2j=!a.D.2g||a.D.2g==\'3K\'?2j:a.D.22.y||0;a.Y.M=2n+\'Q\';a.Y.O=2j+\'Q\'},2l:C(o){G B.1y(C(){if(B.bD==14||!o.3r||!A.12||!A.X||!A.1s){G}4Y=A(o.3r,B);if(4Y.1N()==0){G}F b={2e:\'7X\',4P:14,3n:o.3n&&o.3n.1F==2w?o.3n:P,2I:o.2I&&o.2I.1F==2w?o.2I:P,3c:B,1E:o.1E||H};if(o.2C&&R(o.2C)){b.2C=R(o.2C)||1;b.2C=b.2C>0?b.2C:1}if(4Y.1N()==1)4Y.6r(b);L{A(4Y.I(0)).6r(b);b.3c=P;4Y.6r(b)}4Y.70(A.2Q.d3);4Y.1m(\'aT\',A.2Q.aT++);B.bD=14;B.4g={};B.4g.ec=b.ec;B.4g.2C=b.2C;B.4g.69=4Y;B.4g.bB=o.bB?14:H;by=B;by.4g.69.1y(C(a){B.bA=a;B.92=by});if(o.5f&&o.5f.1F==6h){1V(i=o.5f.1b-1;i>=0;i--){if(o.5f[i].1F==6h&&o.5f[i].1b==2){el=B.4g.69.I(i);if(el.4D){A.2Q.4s(el,o.5f[i])}}}}})}};A.fn.1U({jc:A.2Q.2l,jb:A.2Q.ew,ja:A.2Q.I});A.2p={56:[],ea:C(){B.4W();1d=B.2S;id=A.1m(1d,\'id\');if(A.2p.56[id]!=P){1P.5h(A.2p.56[id])}1u=1d.J.3d+1;if(1d.J.1R.1b<1u){1u=1}1R=A(\'3O\',1d.J.4O);1d.J.3d=1u;if(1R.1N()>0){1R.6d(1d.J.3F,A.2p.7J)}},di:C(){B.4W();1d=B.2S;id=A.1m(1d,\'id\');if(A.2p.56[id]!=P){1P.5h(A.2p.56[id])}1u=1d.J.3d-1;1R=A(\'3O\',1d.J.4O);if(1u<1){1u=1d.J.1R.1b}1d.J.3d=1u;if(1R.1N()>0){1R.6d(1d.J.3F,A.2p.7J)}},2A:C(c){1d=1c.7o(c);if(1d.J.63){1u=1d.J.3d;6k(1u==1d.J.3d){1u=1+R(Z.63()*1d.J.1R.1b)}}L{1u=1d.J.3d+1;if(1d.J.1R.1b<1u){1u=1}}1R=A(\'3O\',1d.J.4O);1d.J.3d=1u;if(1R.1N()>0){1R.6d(1d.J.3F,A.2p.7J)}},go:C(o){F a;if(o&&o.1F==6E){if(o.21){a=1c.7o(o.21.1d);5v=1P.j8.2U.6W("#");o.21.5J=P;if(5v.1b==2){1u=R(5v[1]);1S=5v[1].48(1u,\'\');if(A.1m(a,\'id\')!=1S){1u=1}}L{1u=1}}if(o.84){o.84.4W();a=o.84.2S.2S;id=A.1m(a,\'id\');if(A.2p.56[id]!=P){1P.5h(A.2p.56[id])}5v=o.84.2U.6W("#");1u=R(5v[1]);1S=5v[1].48(1u,\'\');if(A.1m(a,\'id\')!=1S){1u=1}}if(a.J.1R.1b<1u||1u<1){1u=1}a.J.3d=1u;4t=A.12.2f(a);e4=A.12.9y(a);e3=A.12.6b(a);if(a.J.3e){a.J.3e.o.E(\'11\',\'1k\')}if(a.J.3b){a.J.3b.o.E(\'11\',\'1k\')}if(a.J.21){y=R(e4.t)+R(e3.t);if(a.J.1Q){if(a.J.1Q.4J==\'O\'){y+=a.J.1Q.45.hb}L{4t.h-=a.J.1Q.45.hb}}if(a.J.2o){if(a.J.2o&&a.J.2o.5V==\'O\'){y+=a.J.2o.45.hb}L{4t.h-=a.J.2o.45.hb}}if(!a.J.bu){a.J.e1=o.21?o.21.S:(R(a.J.21.E(\'S\'))||0);a.J.bu=o.21?o.21.V:(R(a.J.21.E(\'V\'))||0)}a.J.21.E(\'O\',y+(4t.h-a.J.e1)/2+\'Q\');a.J.21.E(\'M\',(4t.1D-a.J.bu)/2+\'Q\');a.J.21.E(\'11\',\'2v\')}1R=A(\'3O\',a.J.4O);if(1R.1N()>0){1R.6d(a.J.3F,A.2p.7J)}L{9w=A(\'a\',a.J.1Q.o).I(1u-1);A(9w).2H(a.J.1Q.5s);F b=W 8M();b.1d=A.1m(a,\'id\');b.1u=1u-1;b.2E=a.J.1R[a.J.3d-1].2E;if(b.1T){b.5J=P;A.2p.11.1x(b)}L{b.5J=A.2p.11}if(a.J.2o){a.J.2o.o.3i(a.J.1R[1u-1].5W)}}}},7J:C(){1d=B.2S.2S;1d.J.4O.E(\'11\',\'1k\');if(1d.J.1Q.5s){9w=A(\'a\',1d.J.1Q.o).3S(1d.J.1Q.5s).I(1d.J.3d-1);A(9w).2H(1d.J.1Q.5s)}F a=W 8M();a.1d=A.1m(1d,\'id\');a.1u=1d.J.3d-1;a.2E=1d.J.1R[1d.J.3d-1].2E;if(a.1T){a.5J=P;A.2p.11.1x(a)}L{a.5J=A.2p.11}if(1d.J.2o){1d.J.2o.o.3i(1d.J.1R[1d.J.3d-1].5W)}},11:C(){1d=1c.7o(B.1d);if(1d.J.3e){1d.J.3e.o.E(\'11\',\'1k\')}if(1d.J.3b){1d.J.3b.o.E(\'11\',\'1k\')}4t=A.12.2f(1d);y=0;if(1d.J.1Q){if(1d.J.1Q.4J==\'O\'){y+=1d.J.1Q.45.hb}L{4t.h-=1d.J.1Q.45.hb}}if(1d.J.2o){if(1d.J.2o&&1d.J.2o.5V==\'O\'){y+=1d.J.2o.45.hb}L{4t.h-=1d.J.2o.45.hb}}j4=A(\'.bt\',1d);y=y+(4t.h-B.S)/2;x=(4t.1D-B.V)/2;1d.J.4O.E(\'O\',y+\'Q\').E(\'M\',x+\'Q\').3i(\'<3O 2E="\'+B.2E+\'" />\');1d.J.4O.6U(1d.J.3F);3b=1d.J.3d+1;if(3b>1d.J.1R.1b){3b=1}3e=1d.J.3d-1;if(3e<1){3e=1d.J.1R.1b}1d.J.3b.o.E(\'11\',\'2v\').E(\'O\',y+\'Q\').E(\'M\',x+2*B.V/3+\'Q\').E(\'V\',B.V/3+\'Q\').E(\'S\',B.S+\'Q\').1m(\'3T\',1d.J.1R[3b-1].5W);1d.J.3b.o.I(0).2U=\'#\'+3b+A.1m(1d,\'id\');1d.J.3e.o.E(\'11\',\'2v\').E(\'O\',y+\'Q\').E(\'M\',x+\'Q\').E(\'V\',B.V/3+\'Q\').E(\'S\',B.S+\'Q\').1m(\'3T\',1d.J.1R[3e-1].5W);1d.J.3e.o.I(0).2U=\'#\'+3e+A.1m(1d,\'id\')},2l:C(o){if(!o||!o.2q||A.2p.56[o.2q])G;F a=A(\'#\'+o.2q);F c=a.I(0);if(c.Y.T!=\'1J\'&&c.Y.T!=\'2i\'){c.Y.T=\'2i\'}c.Y.2N=\'2B\';if(a.1N()==0)G;c.J={};c.J.1R=o.1R?o.1R:[];c.J.63=o.63&&o.63==14||H;7T=c.dj(\'j3\');1V(i=0;i<7T.1b;i++){6e=c.J.1R.1b;c.J.1R[6e]={2E:7T[i].2E,5W:7T[i].3T||7T[i].j2||\'\'}}if(c.J.1R.1b==0){G}c.J.49=A.1U(A.12.3a(c),A.12.2f(c));c.J.bp=A.12.9y(c);c.J.bo=A.12.6b(c);t=R(c.J.bp.t)+R(c.J.bo.t);b=R(c.J.bp.b)+R(c.J.bo.b);A(\'3O\',c).9U();c.J.3F=o.3F?o.3F:ch;if(o.4J||o.82||o.5s){c.J.1Q={};a.1L(\'<1W 68="dZ"></1W>\');c.J.1Q.o=A(\'.dZ\',c);if(o.82){c.J.1Q.82=o.82;c.J.1Q.o.2H(o.82)}if(o.5s){c.J.1Q.5s=o.5s}c.J.1Q.o.E(\'T\',\'1J\').E(\'V\',c.J.49.w+\'Q\');if(o.4J&&o.4J==\'O\'){c.J.1Q.4J=\'O\';c.J.1Q.o.E(\'O\',t+\'Q\')}L{c.J.1Q.4J=\'4e\';c.J.1Q.o.E(\'4e\',b+\'Q\')}c.J.1Q.9v=o.9v?o.9v:\' \';1V(F i=0;i<c.J.1R.1b;i++){6e=R(i)+1;c.J.1Q.o.1L(\'<a 2U="#\'+6e+o.2q+\'" 68="iY" 3T="\'+c.J.1R[i].5W+\'">\'+6e+\'</a>\'+(6e!=c.J.1R.1b?c.J.1Q.9v:\'\'))}A(\'a\',c.J.1Q.o).1C(\'4U\',C(){A.2p.go({84:B})});c.J.1Q.45=A.12.2f(c.J.1Q.o.I(0))}if(o.5V||o.81){c.J.2o={};a.1L(\'<1W 68="dW">&6G;</1W>\');c.J.2o.o=A(\'.dW\',c);if(o.81){c.J.2o.81=o.81;c.J.2o.o.2H(o.81)}c.J.2o.o.E(\'T\',\'1J\').E(\'V\',c.J.49.w+\'Q\');if(o.5V&&o.5V==\'O\'){c.J.2o.5V=\'O\';c.J.2o.o.E(\'O\',(c.J.1Q&&c.J.1Q.4J==\'O\'?c.J.1Q.45.hb+t:t)+\'Q\')}L{c.J.2o.5V=\'4e\';c.J.2o.o.E(\'4e\',(c.J.1Q&&c.J.1Q.4J==\'4e\'?c.J.1Q.45.hb+b:b)+\'Q\')}c.J.2o.45=A.12.2f(c.J.2o.o.I(0))}if(o.9j){c.J.3b={9j:o.9j};a.1L(\'<a 2U="#2\'+o.2q+\'" 68="dV">&6G;</a>\');c.J.3b.o=A(\'.dV\',c);c.J.3b.o.E(\'T\',\'1J\').E(\'11\',\'1k\').E(\'2N\',\'2B\').E(\'4a\',\'dU\').2H(c.J.3b.9j);c.J.3b.o.1C(\'4U\',A.2p.ea)}if(o.9t){c.J.3e={9t:o.9t};a.1L(\'<a 2U="#0\'+o.2q+\'" 68="dS">&6G;</a>\');c.J.3e.o=A(\'.dS\',c);c.J.3e.o.E(\'T\',\'1J\').E(\'11\',\'1k\').E(\'2N\',\'2B\').E(\'4a\',\'dU\').2H(c.J.3e.9t);c.J.3e.o.1C(\'4U\',A.2p.di)}a.aJ(\'<1W 68="bt"></1W>\');c.J.4O=A(\'.bt\',c);c.J.4O.E(\'T\',\'1J\').E(\'O\',\'2G\').E(\'M\',\'2G\').E(\'11\',\'1k\');if(o.21){a.aJ(\'<1W 68="dz" Y="11: 1k;"><3O 2E="\'+o.21+\'" /></1W>\');c.J.21=A(\'.dz\',c);c.J.21.E(\'T\',\'1J\');F d=W 8M();d.1d=o.2q;d.2E=o.21;if(d.1T){d.5J=P;A.2p.go({21:d})}L{d.5J=C(){A.2p.go({21:B})}}}L{A.2p.go({2q:c})}if(o.ba){dQ=R(o.ba)*8V}A.2p.56[o.2q]=o.ba?1P.5Y(\'A.2p.2A(\\\'\'+o.2q+\'\\\')\',dQ):P}};A.1d=A.2p.2l;A.1p={73:[],54:{},18:H,6X:P,2b:C(){if(A.X.1g==P){G}F a,3s,c,cs;A.1p.18.I(0).2Z=A.X.1g.D.5z;a=A.1p.18.I(0).Y;a.11=\'2v\';A.1p.18.1w=A.1U(A.12.3a(A.1p.18.I(0)),A.12.2f(A.1p.18.I(0)));a.V=A.X.1g.D.1w.1D+\'Q\';a.S=A.X.1g.D.1w.hb+\'Q\';3s=A.12.b2(A.X.1g);a.4M=3s.t;a.53=3s.r;a.4L=3s.b;a.4K=3s.l;if(A.X.1g.D.3L==14){c=A(A.X.1g).cA(14).I(0);cs=c.Y;cs.4M=\'2G\';cs.53=\'2G\';cs.4L=\'2G\';cs.4K=\'2G\';cs.11=\'2v\';A.1p.18.58().1L(c)}A(A.X.1g).dO(A.1p.18.I(0));A.X.1g.Y.11=\'1k\'},c7:C(e){if(!e.D.3I&&A.1s.4T.bC){if(e.D.3C)e.D.3C.1x(1g);A(e).E(\'T\',e.D.av||e.D.49);A(e).8j();A(A.1s.4T).dN(e)}A.1p.18.3S(e.D.5z).3i(\'&6G;\');A.1p.6X=P;F a=A.1p.18.I(0).Y;a.11=\'1k\';A.1p.18.dO(e);if(e.D.fx>0){A(e).6U(e.D.fx)}A(\'23\').1L(A.1p.18.I(0));F b=[];F c=H;1V(F i=0;i<A.1p.73.1b;i++){F d=A.1s.3p[A.1p.73[i]].I(0);F f=A.1m(d,\'id\');F g=A.1p.8g(f);if(d.1f.9P!=g.6A){d.1f.9P=g.6A;if(c==H&&d.1f.2I){c=d.1f.2I}g.id=f;b[b.1b]=g}}A.1p.73=[];if(c!=H&&b.1b>0){c(b)}},8n:C(e,o){if(!A.X.1g)G;F a=H;F i=0;if(e.1f.el.1N()>0){1V(i=e.1f.el.1N();i>0;i--){if(e.1f.el.I(i-1)!=A.X.1g){if(!e.5t.bb){if((e.1f.el.I(i-1).1I.y+e.1f.el.I(i-1).1I.hb/2)>A.X.1g.D.2j){a=e.1f.el.I(i-1)}L{1n}}L{if((e.1f.el.I(i-1).1I.x+e.1f.el.I(i-1).1I.1D/2)>A.X.1g.D.2n&&(e.1f.el.I(i-1).1I.y+e.1f.el.I(i-1).1I.hb/2)>A.X.1g.D.2j){a=e.1f.el.I(i-1)}}}}}if(a&&A.1p.6X!=a){A.1p.6X=a;A(a).iT(A.1p.18.I(0))}L if(!a&&(A.1p.6X!=P||A.1p.18.I(0).2S!=e)){A.1p.6X=P;A(e).1L(A.1p.18.I(0))}A.1p.18.I(0).Y.11=\'2v\'},bM:C(e){if(A.X.1g==P){G}e.1f.el.1y(C(){B.1I=A.1U(A.12.6w(B),A.12.6x(B))})},8g:C(s){F i;F h=\'\';F o={};if(s){if(A.1p.54[s]){o[s]=[];A(\'#\'+s+\' .\'+A.1p.54[s]).1y(C(){if(h.1b>0){h+=\'&\'}h+=s+\'[]=\'+A.1m(B,\'id\');o[s][o[s].1b]=A.1m(B,\'id\')})}L{1V(a in s){if(A.1p.54[s[a]]){o[s[a]]=[];A(\'#\'+s[a]+\' .\'+A.1p.54[s[a]]).1y(C(){if(h.1b>0){h+=\'&\'}h+=s[a]+\'[]=\'+A.1m(B,\'id\');o[s[a]][o[s[a]].1b]=A.1m(B,\'id\')})}}}}L{1V(i in A.1p.54){o[i]=[];A(\'#\'+i+\' .\'+A.1p.54[i]).1y(C(){if(h.1b>0){h+=\'&\'}h+=i+\'[]=\'+A.1m(B,\'id\');o[i][o[i].1b]=A.1m(B,\'id\')})}}G{6A:h,o:o}},dL:C(e){if(!e.ci){G}G B.1y(C(){if(!B.5t||!A(e).is(\'.\'+B.5t.3r))A(e).2H(B.5t.3r);A(e).6r(B.5t.D)})},4v:C(){G B.1y(C(){A(\'.\'+B.5t.3r).8j();A(B).ei();B.5t=P;B.dK=P})},2l:C(o){if(o.3r&&A.12&&A.X&&A.1s){if(!A.1p.18){A(\'23\',1c).1L(\'<1W id="dJ">&6G;</1W>\');A.1p.18=A(\'#dJ\');A.1p.18.I(0).Y.11=\'1k\'}B.ee({3r:o.3r,9F:o.9F?o.9F:H,8X:o.8X?o.8X:H,4G:o.4G?o.4G:H,76:o.76||o.ev,6C:o.6C||o.er,bC:14,2I:o.2I||o.iR,fx:o.fx?o.fx:H,3L:o.3L?14:H,5T:o.5T?o.5T:\'9S\'});G B.1y(C(){F a={5B:o.5B?14:H,dI:5P,1E:o.1E?2c(o.1E):H,5z:o.4G?o.4G:H,fx:o.fx?o.fx:H,3I:14,3L:o.3L?14:H,3c:o.3c?o.3c:P,2e:o.2e?o.2e:P,4c:o.4c&&o.4c.1F==2w?o.4c:H,4h:o.4h&&o.4h.1F==2w?o.4h:H,3C:o.3C&&o.3C.1F==2w?o.3C:H,2g:/3K|3Z/.3M(o.2g)?o.2g:H,5D:o.5D?R(o.5D)||0:H,2M:o.2M?o.2M:H};A(\'.\'+o.3r,B).6r(a);B.dK=14;B.5t={3r:o.3r,5B:o.5B?14:H,dI:5P,1E:o.1E?2c(o.1E):H,5z:o.4G?o.4G:H,fx:o.fx?o.fx:H,3I:14,3L:o.3L?14:H,3c:o.3c?o.3c:P,2e:o.2e?o.2e:P,bb:o.bb?14:H,D:a}})}}};A.fn.1U({iP:A.1p.2l,dN:A.1p.dL,iO:A.1p.4v});A.iN=A.1p.8g;A.2k={62:P,9o:H,9p:P,6a:C(e){A.2k.9o=14;A.2k.1S(e,B,14)},bk:C(e){if(A.2k.62!=B)G;A.2k.9o=H;A.2k.2x(e,B)},1S:C(e,a,b){if(A.2k.62!=P)G;if(!a){a=B}A.2k.62=a;1I=A.1U(A.12.3a(a),A.12.2f(a));7U=A(a);3T=7U.1m(\'3T\');2U=7U.1m(\'2U\');if(3T){A.2k.9p=3T;7U.1m(\'3T\',\'\');A(\'#dE\').3i(3T);if(2U)A(\'#bj\').3i(2U.48(\'iI://\',\'\'));L A(\'#bj\').3i(\'\');18=A(\'#7S\');if(a.4m.2Z){18.I(0).2Z=a.4m.2Z}L{18.I(0).2Z=\'\'}bi=A.12.2f(18.I(0));dD=b&&a.4m.T==\'bn\'?\'4e\':a.4m.T;2X(dD){19\'O\':2j=1I.y-bi.hb;2n=1I.x;1n;19\'M\':2j=1I.y;2n=1I.x-bi.1D;1n;19\'2D\':2j=1I.y;2n=1I.x+1I.1D;1n;19\'bn\':A(\'23\').1C(\'3t\',A.2k.3t);1A=A.12.3W(e);2j=1A.y+15;2n=1A.x+15;1n;8T:2j=1I.y+1I.hb;2n=1I.x;1n}18.E({O:2j+\'Q\',M:2n+\'Q\'});if(a.4m.4w==H){18.1S()}L{18.6U(a.4m.4w)}if(a.4m.2K)a.4m.2K.1x(a);7U.1C(\'86\',A.2k.2x).1C(\'4W\',A.2k.bk)}},3t:C(e){if(A.2k.62==P){A(\'23\').3h(\'3t\',A.2k.3t);G}1A=A.12.3W(e);A(\'#7S\').E({O:1A.y+15+\'Q\',M:1A.x+15+\'Q\'})},2x:C(e,a){if(!a){a=B}if(A.2k.9o!=14&&A.2k.62==a){A.2k.62=P;A(\'#7S\').6d(1);A(a).1m(\'3T\',A.2k.9p).3h(\'86\',A.2k.2x).3h(\'4W\',A.2k.bk);if(a.4m.2V)a.4m.2V.1x(a);A.2k.9p=P}},2l:C(b){if(!A.2k.18){A(\'23\').1L(\'<1W id="7S"><1W id="dE"></1W><1W id="bj"></1W></1W>\');A(\'#7S\').E({T:\'1J\',3j:5P,11:\'1k\'});A.2k.18=14}G B.1y(C(){if(A.1m(B,\'3T\')){B.4m={T:/O|4e|M|2D|bn/.3M(b.T)?b.T:\'4e\',2Z:b.2Z?b.2Z:H,4w:b.4w?b.4w:H,2K:b.2K&&b.2K.1F==2w?b.2K:H,2V:b.2V&&b.2V.1F==2w?b.2V:H};F a=A(B);a.1C(\'9r\',A.2k.1S);a.1C(\'6a\',A.2k.6a)}})}};A.fn.iH=A.2k.2l;A.7O={bl:C(e){6K=e.6S||e.6R||-1;if(6K==9){if(1P.3N){1P.3N.b6=14;1P.3N.b5=H}L{e.9b();e.99()}if(B.9q){1c.64.dv().3D="\\t";B.dB=C(){B.6a();B.dB=P}}L if(B.9m){2b=B.88;3m=B.dA;B.2m=B.2m.iG(0,2b)+"\\t"+B.2m.iF(3m);B.9m(2b+1,2b+1);B.6a()}G H}},4v:C(){G B.1y(C(){if(B.6V&&B.6V==14){A(B).3h(\'70\',A.7O.bl);B.6V=H}})},2l:C(){G B.1y(C(){if(B.4D==\'bs\'&&(!B.6V||B.6V==H)){A(B).1C(\'70\',A.7O.bl);B.6V=14}})}};A.fn.1U({iD:A.7O.2l,iC:A.7O.4v});A.12={3a:C(e){F x=0;F y=0;F a=e.Y;F b=H;if(A(e).E(\'11\')==\'1k\'){F c=a.2W;F d=a.T;b=14;a.2W=\'2B\';a.11=\'2v\';a.T=\'1J\'}F f=e;6k(f){x+=f.7Y+(f.4u&&!A.2R.6l?R(f.4u.4y)||0:0);y+=f.7t+(f.4u&&!A.2R.6l?R(f.4u.4x)||0:0);f=f.dY}f=e;6k(f&&f.4D&&f.4D.5u()!=\'23\'){x-=f.2P||0;y-=f.2T||0;f=f.2S}if(b==14){a.11=\'1k\';a.T=d;a.2W=c}G{x:x,y:y}},6x:C(a){F x=0,y=0;6k(a){x+=a.7Y||0;y+=a.7t||0;a=a.dY}G{x:x,y:y}},2f:C(e){F w=A.E(e,\'V\');F h=A.E(e,\'S\');F a=0;F b=0;F c=e.Y;if(A(e).E(\'11\')!=\'1k\'){a=e.3P;b=e.5r}L{F d=c.2W;F f=c.T;c.2W=\'2B\';c.11=\'2v\';c.T=\'1J\';a=e.3P;b=e.5r;c.11=\'1k\';c.T=f;c.2W=d}G{w:w,h:h,1D:a,hb:b}},6w:C(a){G{1D:a.3P||0,hb:a.5r||0}},a5:C(e){F h,w,de;if(e){w=e.83;h=e.7P}L{de=1c.4A;w=1P.bg||9z.bg||(de&&de.83)||1c.23.83;h=1P.bf||9z.bf||(de&&de.7P)||1c.23.7P}G{w:w,h:h}},5O:C(e){F t=0,l=0,w=0,h=0,iw=0,ih=0;if(e&&e.98.5u()!=\'23\'){t=e.2T;l=e.2P;w=e.be;h=e.bd;iw=0;ih=0}L{if(1c.4A){t=1c.4A.2T;l=1c.4A.2P;w=1c.4A.be;h=1c.4A.bd}L if(1c.23){t=1c.23.2T;l=1c.23.2P;w=1c.23.be;h=1c.23.bd}iw=9z.bg||1c.4A.83||1c.23.83||0;ih=9z.bf||1c.4A.7P||1c.23.7P||0}G{t:t,l:l,w:w,h:h,iw:iw,ih:ih}},b2:C(e,a){F c=A(e);F t=c.E(\'4M\')||\'\';F r=c.E(\'53\')||\'\';F b=c.E(\'4L\')||\'\';F l=c.E(\'4K\')||\'\';if(a)G{t:R(t)||0,r:R(r)||0,b:R(b)||0,l:R(l)};L G{t:t,r:r,b:b,l:l}},9y:C(e,a){F c=A(e);F t=c.E(\'5b\')||\'\';F r=c.E(\'5g\')||\'\';F b=c.E(\'4Q\')||\'\';F l=c.E(\'4F\')||\'\';if(a)G{t:R(t)||0,r:R(r)||0,b:R(b)||0,l:R(l)};L G{t:t,r:r,b:b,l:l}},6b:C(e,a){F c=A(e);F t=c.E(\'4x\')||\'\';F r=c.E(\'5i\')||\'\';F b=c.E(\'5d\')||\'\';F l=c.E(\'4y\')||\'\';if(a)G{t:R(t)||0,r:R(r)||0,b:R(b)||0,l:R(l)||0};L G{t:t,r:r,b:b,l:l}},3W:C(a){F x=a.iB||(a.iz+(1c.4A.2P||1c.23.2P))||0;F y=a.iy||(a.ix+(1c.4A.2T||1c.23.2T))||0;G{x:x,y:y}},bH:C(a,b){b(a);a=a.6M;6k(a){A.12.bH(a,b);a=a.iv}},ji:C(c){A.12.bH(c,C(a){1V(F b in a){if(28 a[b]===\'C\'){a[b]=P}}})},ir:C(a,b){F c=A.12.5O();F d=A.12.2f(a);if(!b||b==\'3K\')A(a).E({O:c.t+((Z.3g(c.h,c.ih)-c.t-d.hb)/2)+\'Q\'});if(!b||b==\'3Z\')A(a).E({M:c.l+((Z.3g(c.w,c.iw)-c.l-d.1D)/2)+\'Q\'})},iq:C(a,b){F c=A(\'3O[@2E*="7q"]\',a||1c),7q;c.1y(C(){7q=B.2E;B.2E=b;B.Y.4X="9x:9C.9E.ip(2E=\'"+7q+"\')"})}};[].3o||(6h.jn.3o=C(v,n){n=(n==P)?0:n;F m=B.1b;1V(F i=n;i<m;i++)if(B[i]==v)G i;G-1});',62,1202,'||||||||||||||||||||||||||||||||||||jQuery|this|function|dragCfg|css|var|return|false|get|ss|iAuto|else|left|iResize|top|null|px|parseInt|height|position|oldStyle|width|new|iDrag|style|Math||display|iUtil||true||||helper|case|autoCFG|length|document|slideshow|easing|dropCfg|dragged|resizeOptions|carouselCfg|interfaceFX|none|speed|attr|break|sizes|iSort|ImageBox|queue|iDrop|iAutoscroller|slide|resizeElement|oC|apply|each|fisheyeCfg|pointer|newSizes|bind|wb|opacity|constructor|custom|duration|pos|absolute|type|append|items|size|255|window|slideslinks|images|show|complete|extend|for|div|elsToScroll|100|cont||loader|oR|body|options||oldP||typeof|callback|accordionCfg|start|parseFloat||containment|getSize|axis|selectedItem|relative|ny|iTooltip|build|value|nx|slideCaption|islideshow|container|subject|newPosition|selectHelper|border|block|Function|hide|itemWidth|dequeue|timer|hidden|fractions|right|src|PI|0px|addClass|onChange|parentData|onShow|result|cursorAt|overflow|transferHelper|scrollLeft|iSlider|browser|parentNode|scrollTop|href|onHide|visibility|switch|wrapper|className|pre|selectdrug|||||||||getPosition|nextslide|handle|currentslide|prevslide|step|max|unbind|html|zIndex|min|iExpander|end|onSlide|indexOf|zones|iframe|accept|margins|mousemove|canvas|to|item|createElement|multipleSeparator|highlighted|resizeDirection|abs|onStop|text|toggle|fadeDuration|handlers|dragElem|so|distance|vertically|ghosting|test|event|img|offsetWidth|startLeft|pageSize|removeClass|title|out|startTop|getPointer|lastSuggestion|DropOutDirectiont|horizontally||down||nWidth|ratio|dimm|msie||replace|oP|fontSize|lastValue|onStart|currentPointer|bottom|ifxFirstDisplay|slideCfg|onDrag|clear|context|elToScroll|up|tooltipCFG|fxCheckTag|rel|scr|onclick|endLeft|dragmoveBy|slidePos|currentStyle|destroy|delay|borderTopWidth|borderLeftWidth|nHeight|documentElement|string|containerW|tagName|iteration|paddingLeft|helperclass|endTop|halign|linksPosition|marginLeft|marginBottom|marginTop|OpenClose|holder|si|paddingBottom|mousedown|animate|overzone|click|onDragModifier|blur|filter|toDrag|getAttribute||cos|cnt|marginRight|collected||slideshows|newCoords|empty|containerH|elementData|paddingTop|puff|borderBottomWidth|animationHandler|values|paddingRight|clearInterval|borderRightWidth|pow|dragHandle|BlindDirection|post|mouseup|close|onSelect|fxh|offsetHeight|activeLinkClass|sortCfg|toLowerCase|url|currentPanel|point|grid|hpc|currentRel|revert|captionText|snapDistance|Scale|nextImage|prevImage|imageEl|orig|onload|iFisheye|parseColor|getHeight|getWidth|getScroll|3000|keyup|maxWidth|curCSS|tolerance|reflections|captionPosition|caption|margin|setInterval|outerContainer||itemHeight|current|random|selection|limit|Expander|128|class|sliders|focus|getBorder|newTop|fadeOut|indic|user|init|Array|frameClass|ActiveXObject|while|opera|from|open|oD|Date|proximity|Draggable|0x|F0|minLeft|rgb|getSizeLite|getPositionLite|getTime|positionItems|hash|selectCurrent|onOut|onClick|Object|minTop|nbsp|onHighlight|np|selectKeyHelper|pressedKey|accordionPos|firstChild|139|scrollIntoView|backgroundColor|oldStyleAttr|keyCode|charCode|direction|fadeIn|hasTabsEnabled|split|inFrontOf|radiusY|captionEl|keydown|sc|selectClass|changed|times||onHover|newLeft||efx|nw|li|maxRight|maxBottom|classname|startDrag|move|ImageBoxNextImage|nRx|ImageBoxPrevImage|nRy|opened|animationInProgress|400|getElementById|count|png|overlay|alpha|offsetTop|containerSize|cssSides|stop|minHeight|maxHeight|cursor|selectedone|xproc|yproc|bounceout|padding|gallery|increment|namedColors|applyOn|showImage|reflectionSize|sin|object|directionIncrement|iTTabs|clientHeight|select|activeClass|tooltipHelper|imgs|jEl|insideParent|content|parent|offsetLeft|parentBorders||captionClass|linksClass|clientWidth|link||mouseout|fontWeight|selectionStart|expand|panels|createTextNode|onselectstop|onselect|hight|elS|serialize|dir|diffHeight|DraggableDestroy|nextImageEl|prevImageEl|ImageBoxOuterContainer|checkhover|blind|iCarousel|hideImage|hidehelper|diffWidth|String|sl|st|prot|auto|diffY|diffX|headers|rule|getFieldValues|styleSheets|borderColor|positionContainer|image|getValues|dragstop|linkRel|itemsText|isDraggable|Image|minchars|minWidth|panelSelector|exec|192|isDroppable|default|211|1000|5625|hoverclass|headerSelector|next|ul|2000|SliderContainer|protectRotation|childs|oldVisibility|source|setTimeout|nodeName|stopPropagation|startTime|preventDefault|hoverClass|cssText|1px|prev|unfold|DoFold|unit|nextslideClass|multiple|itemMinWidth|setSelectionRange|destroyWrapper|focused|oldTitle|createTextRange|mouseover|inCache|prevslideClass|buildWrapper|linksSeparator|lnk|progid|getPadding|self|ScrollTo|9999|DXImageTransform|helperClass|Microsoft|activeclass|iIndex|selectcheck|onDrop|selectKeyUp|autofill|selectKeyDown|panelHeight|handleEl|onActivate|os|ne|sw|intersect|dragEl|remove|data|textAlign|ImageBoxCaption|closeEl|captionImages|ImageBoxOverlay|ImageBoxIframe|clearTimeout|keyPressed|fade|getClient|Alpha|shake|Shake|snapToGrid|lastSi|scroll||modifyContainer|fitToContainer|currentValue|zoom|getContainment|firstStep|paddingLeftSize|paddingBottomSize|paddingRightSize|paddingTopSize|borderLeftSize|borderBottomSize|borderRightSize|borderTopSize|autoSize|shrink|pulse|Pulsate|initialPosition|imageSrc|parseStyle|sliderPos|center|ImageBoxCurrentImage|loadImage|parentPos|match|dragmove|stopAnim|pause|Color|unselectable|prepend|borderWidth|cssSidesEnd|draginit|stopDrag|moveDrag|asin|bouncein|paddingY|paddingX|tabindex|writeItems|INPUT|10000|169|index|sliderSize|no|linear|getMargins|spacer|rotationSpeed|returnValue|cancelBubble|transparent|angle|autocomplete|autoplay|floats|extraWidth|scrollHeight|scrollWidth|innerHeight|innerWidth|character|helperSize|tooltipURL|hidefocused|doTab|Number|mouse|oBor|oPad|entities||TEXTAREA|slideshowHolder|loaderWidth|inputWidth|RegExp|letterSpacing|sliderEl|300|SliderIteration|restricted|sortable|isSlider|bounce|Selectserialize|idsa|traverseDOM|selectstop|elm|elPosition|restore|measure|getHeightMinMax|onDragStart|fit|clientSize|field|fadeTo|ImageBoxContainer|on|listStyle|ImageBoxLoader|dragHelper|ImageBoxCaptionImages|getContext|ImageBoxCaptionText|update|imagebox|BlindUp|hrefAttr|relAttr|SlideOutUp|check|checkdrop|textImageFrom|textImage|overlayOpacity|jpg|closeHTML|gif|loaderSRC|imageTypes|500|childNodes|itransferTo|highlight|visible|horizontal|vertical|parts|paddingLeftUnit|paddingBottomUnit|paddingRightUnit||paddingTopUnit|borderLeftUnit|borderBottomUnit|borderRightUnit|borderTopUnit|fontUnit|grow|clone|sqrt|textDecoration|dragstart|trim|isFunction|valign|userSelect|fxe|KhtmlUserSelect|Width|captionSize|dhe|colorCssProps|onDragStop|iAccordion|cssProps|doScroll|144|224|230|keypress|off|150|140|107|fracH|fracW|easeout|dragmoveByKey|autocompleteHelper|yfrac|165|scrolling|radiusX|xfrac|frameborder|245|javascript|240||autocompleteIframe|999|protect|goprev|getElementsByTagName|styleFloat||parte|insertBefore|itemZIndex|interfaceColorFX|fold|mousex|leftUnit|topUnit|fakeAccordionClass|createRange|getSelectionStart|||slideshowLoader|selectionEnd|onblur|moveStart|filteredPosition|tooltipTitle|togglehor|togglever|inputValue|zindex|sortHelper|isSortable|addItem|checkCache|SortableAddItem|after|BlindDown|time|SlideInUp|slideshowPrevslide|elType|30px|slideshowNextSlide|slideshowCaption|expanderHelper|offsetParent|slideshowLinks|boxModel|loaderHeight||slideBor|slidePad|htmlEntities|wordSpacing|fontVariant|fontStretch|fontStyle|gonext|fontFamily|onslide|clickItem|Droppable||rgba||DroppableDestroy|maxy|maxx|||hoverItem|containerMaxy|containerMaxx||onout|addColorStop||iBounce|onhover|set|selectedclass|isSelectable|selectstopApply|selectcheckApply|selectstart|shc|360|directions|remeasure|onResize|se|array|scale|success|param|translate|POST|number|load|ajax|save|name|khtml|moz|find|ondragstart|onselectstart|lineHeigt|mozUserSelect|ImageBoxClose|bmp|jpeg|finishx|112|starty|first|last|firstResize|startx|imageLoaded|Showing|finishOpacity|110|Accordion|loading|TransferTo|SlideToggleRight|SlideOutRight|SlideInRight|SlideToggleLeft|SlideOutLeft|SlideInLeft||SlideToggleDown|SlideOutDown|SlideInDown|SlideToggleUp|scrollTo|ScrollToAnchors|flipv|pt|Puff||Shrink|Fisheye||Grow|OpenHorizontally|OpenVertically|SwitchVertically|SwitchHorizontally|CloseHorizontally|CloseVertically|toUpperCase|100000000|selectorText|rules|cssRules|borderStyle|outset|inset|ridge|resize|groove|double|solid|dashed|dotted|isNaN|fromHandler|stopAll|MozUserSelect|Left|Bottom|Right|Top|outlineColor|color|borderTopColor|borderRightColor|borderLeftColor|borderBottomColor|textIndent|outlineWidth|elasticboth|outlineOffset|wh|elasticout|lineHeight|yellow|white|silver|red|purple|203||pink|orange|olive|navy||maroon|magenta|lime|||elasticin|lightyellow|193|182|lightpink|bounceboth|lightgrey|238|lightgreen|lightcyan|Autocomplete|216|173|200|984375|lightblue|khaki|130|625|indigo|green|215|9375|gold|fuchsia|148|darkviolet|122|233|darksalmon|darkred|204|153|darkorchid|darkorange|30002|list|darkolivegreen|||darkmagenta|183|189|darkkhaki|easeboth|darkgreen|30001|darkgrey|darkcyan|darkblue|cyan|easein|brown|blue||black|hover|220|beige|azure|aqua|appendChild|cssFloat|fxWrapper|ol|table|fix|form|button|nodeValue|textarea|input|w_|float|Carousel|removeChild|meta|optgroup|option|frameset|frame|script|header|th|colgroup|col|tfoot|thead|tbody|td|tr|Highlight|FoldToggle|UnFold|Fold|DropToggleRight|DropInRight|DropOutRight|DropToggleLeft|DropInLeft|DropOutLeft|DropToggleUp||DropInUp||DropOutUp||DropToggleDown|100000|DropInDown|duplicate|DropOutDown||120|AlphaImageLoader|fixPNG|centerEl||rotationTimer|maxRotation|nextSibling||clientY|pageY|clientX|Bounce|pageX|DisableTabs|EnableTabs|moveEnd|substr|substring|ToolTip|http|collapse|BlindToggleHorizontally|BlindRight|BlindLeft|SortSerialize|SortableDestroy|Sortable|BlindToggleVertically|onchange|fillRect|before|Autoexpand|fill|password|WebKit|slideshowLink|quot|lt|amp|alt|IMG|par|appVersion|pW|navigator|location|fillStyle|SliderGetValues|SliderSetValues|Slider|recallDroppables|ondrop|createLinearGradient|Selectable|destination|purgeEvents|ResizableDestroy|Resizable|globalCompositeOperation|drawImage|prototype'.split('|'),0,{}))
diff -x .svn -aruN 2.2.2.src/wp-includes/js/jquery/jquery.color.js 2.5.src/wp-includes/js/jquery/jquery.color.js
--- 2.2.2.src/wp-includes/js/jquery/jquery.color.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/jquery/jquery.color.js	2008-03-02 15:34:25.000000000 -0600
@@ -0,0 +1,128 @@
+/*
+ * jQuery Color Animations
+ * Copyright 2007 John Resig
+ * Released under the MIT and GPL licenses.
+ */
+
+(function(jQuery){
+
+    // We override the animation for all of these color styles
+    jQuery.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor', 'color', 'outlineColor'], function(i,attr){
+        jQuery.fx.step[attr] = function(fx){
+            if ( fx.state == 0 ) {
+                fx.start = getColor( fx.elem, attr );
+                fx.end = getRGB( fx.end );
+            }
+
+            fx.elem.style[attr] = "rgb(" + [
+                Math.max(Math.min( parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0]), 255), 0),
+                Math.max(Math.min( parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1]), 255), 0),
+                Math.max(Math.min( parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2]), 255), 0)
+            ].join(",") + ")";
+        }
+    });
+
+    // Color Conversion functions from highlightFade
+    // By Blair Mitchelmore
+    // http://jquery.offput.ca/highlightFade/
+
+    // Parse strings looking for color tuples [255,255,255]
+    function getRGB(color) {
+        var result;
+
+        // Check if we're already dealing with an array of colors
+        if ( color && color.constructor == Array && color.length == 3 )
+            return color;
+
+        // Look for rgb(num,num,num)
+        if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
+            return [parseInt(result[1]), parseInt(result[2]), parseInt(result[3])];
+
+        // Look for rgb(num%,num%,num%)
+        if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
+            return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];
+
+        // Look for #a0b1c2
+        if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
+            return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
+
+        // Look for #fff
+        if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
+            return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];
+
+        // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
+        if (result = /rgba\(0, 0, 0, 0\)/.exec(color))
+            return colors['transparent']
+
+        // Otherwise, we're most likely dealing with a named color
+        return colors[jQuery.trim(color).toLowerCase()];
+    }
+
+    function getColor(elem, attr) {
+        var color;
+
+        do {
+            color = jQuery.curCSS(elem, attr);
+
+            // Keep going until we find an element that has color, or we hit the body
+            if ( color != '' && color != 'transparent' || jQuery.nodeName(elem, "body") )
+                break;
+
+            attr = "backgroundColor";
+        } while ( elem = elem.parentNode );
+
+        return getRGB(color);
+    };
+
+    // Some named colors to work with
+    // From Interface by Stefan Petre
+    // http://interface.eyecon.ro/
+
+    var colors = {
+        aqua:[0,255,255],
+        azure:[240,255,255],
+        beige:[245,245,220],
+        black:[0,0,0],
+        blue:[0,0,255],
+        brown:[165,42,42],
+        cyan:[0,255,255],
+        darkblue:[0,0,139],
+        darkcyan:[0,139,139],
+        darkgrey:[169,169,169],
+        darkgreen:[0,100,0],
+        darkkhaki:[189,183,107],
+        darkmagenta:[139,0,139],
+        darkolivegreen:[85,107,47],
+        darkorange:[255,140,0],
+        darkorchid:[153,50,204],
+        darkred:[139,0,0],
+        darksalmon:[233,150,122],
+        darkviolet:[148,0,211],
+        fuchsia:[255,0,255],
+        gold:[255,215,0],
+        green:[0,128,0],
+        indigo:[75,0,130],
+        khaki:[240,230,140],
+        lightblue:[173,216,230],
+        lightcyan:[224,255,255],
+        lightgreen:[144,238,144],
+        lightgrey:[211,211,211],
+        lightpink:[255,182,193],
+        lightyellow:[255,255,224],
+        lime:[0,255,0],
+        magenta:[255,0,255],
+        maroon:[128,0,0],
+        navy:[0,0,128],
+        olive:[128,128,0],
+        orange:[255,165,0],
+        pink:[255,192,203],
+        purple:[128,0,128],
+        violet:[128,0,128],
+        red:[255,0,0],
+        silver:[192,192,192],
+        white:[255,255,255],
+        yellow:[255,255,0],
+        transparent: [255,255,255]
+    };
+
+})(jQuery);
diff -x .svn -aruN 2.2.2.src/wp-includes/js/jquery/jquery.dimensions.min.js 2.5.src/wp-includes/js/jquery/jquery.dimensions.min.js
--- 2.2.2.src/wp-includes/js/jquery/jquery.dimensions.min.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/jquery/jquery.dimensions.min.js	2008-01-05 11:14:21.000000000 -0600
@@ -0,0 +1,12 @@
+/* Copyright (c) 2007 Paul Bakaus (paul.bakaus@googlemail.com) and Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net)
+ * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
+ * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
+ *
+ * $LastChangedDate: 2007-12-20 08:43:48 -0600 (Thu, 20 Dec 2007) $
+ * $Rev: 4257 $
+ *
+ * Version: 1.2
+ *
+ * Requires: jQuery 1.2+
+ */
+(function($){$.dimensions={version:'1.2'};$.each(['Height','Width'],function(i,name){$.fn['inner'+name]=function(){if(!this[0])return;var torl=name=='Height'?'Top':'Left',borr=name=='Height'?'Bottom':'Right';return this.is(':visible')?this[0]['client'+name]:num(this,name.toLowerCase())+num(this,'padding'+torl)+num(this,'padding'+borr);};$.fn['outer'+name]=function(options){if(!this[0])return;var torl=name=='Height'?'Top':'Left',borr=name=='Height'?'Bottom':'Right';options=$.extend({margin:false},options||{});var val=this.is(':visible')?this[0]['offset'+name]:num(this,name.toLowerCase())+num(this,'border'+torl+'Width')+num(this,'border'+borr+'Width')+num(this,'padding'+torl)+num(this,'padding'+borr);return val+(options.margin?(num(this,'margin'+torl)+num(this,'margin'+borr)):0);};});$.each(['Left','Top'],function(i,name){$.fn['scroll'+name]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(name=='Left'?val:$(window)['scrollLeft'](),name=='Top'?val:$(window)['scrollTop']()):this['scroll'+name]=val;}):this[0]==window||this[0]==document?self[(name=='Left'?'pageXOffset':'pageYOffset')]||$.boxModel&&document.documentElement['scroll'+name]||document.body['scroll'+name]:this[0]['scroll'+name];};});$.fn.extend({position:function(){var left=0,top=0,elem=this[0],offset,parentOffset,offsetParent,results;if(elem){offsetParent=this.offsetParent();offset=this.offset();parentOffset=offsetParent.offset();offset.top-=num(elem,'marginTop');offset.left-=num(elem,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&$.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return $(offsetParent);}});function num(el,prop){return parseInt($.curCSS(el.jquery?el[0]:el,prop,true))||0;};})(jQuery);
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/jquery/jquery.form.js 2.5.src/wp-includes/js/jquery/jquery.form.js
--- 2.2.2.src/wp-includes/js/jquery/jquery.form.js	2007-03-02 17:26:35.000000000 -0600
+++ 2.5.src/wp-includes/js/jquery/jquery.form.js	2008-03-02 15:34:25.000000000 -0600
@@ -1,644 +1,872 @@
-/*
- * jQuery form plugin
- * @requires jQuery v1.0.3
- *
- * Dual licensed under the MIT and GPL licenses:
- *   http://www.opensource.org/licenses/mit-license.php
- *   http://www.gnu.org/licenses/gpl.html
- *
- * Revision: $Id$
- * Version: 0.9
- */
-
-/**
- * ajaxSubmit() provides a mechanism for submitting an HTML form using AJAX.
- *
- * ajaxSubmit accepts a single argument which can be either a success callback function
- * or an options Object.  If a function is provided it will be invoked upon successful
- * completion of the submit and will be passed the response from the server.
- * If an options Object is provided, the following attributes are supported:
- *
- *  target:   Identifies the element(s) in the page to be updated with the server response.
- *            This value may be specified as a jQuery selection string, a jQuery object,
- *            or a DOM element.
- *            default value: null
- *
- *  url:      URL to which the form data will be submitted.
- *            default value: value of form's 'action' attribute
- *
- *  method:   @deprecated use 'type'
- *  type:     The method in which the form data should be submitted, 'GET' or 'POST'.
- *            default value: value of form's 'method' attribute (or 'GET' if none found)
- *
- *  before:   @deprecated use 'beforeSubmit'
- *  beforeSubmit:  Callback method to be invoked before the form is submitted.
- *            default value: null
- *
- *  after:    @deprecated use 'success'
- *  success:  Callback method to be invoked after the form has been successfully submitted
- *            and the response has been returned from the server
- *            default value: null
- *
- *  dataType: Expected dataType of the response.  One of: null, 'xml', 'script', or 'json'
- *            default value: null
- *
- *  semantic: Boolean flag indicating whether data must be submitted in semantic order (slower).
- *            default value: false
- *
- *  resetForm: Boolean flag indicating whether the form should be reset if the submit is successful
- *
- *  clearForm: Boolean flag indicating whether the form should be cleared if the submit is successful
- *
- *
- * The 'beforeSubmit' callback can be provided as a hook for running pre-submit logic or for
- * validating the form data.  If the 'beforeSubmit' callback returns false then the form will
- * not be submitted. The 'beforeSubmit' callback is invoked with three arguments: the form data
- * in array format, the jQuery object, and the options object passed into ajaxSubmit.
- * The form data array takes the following form:
- *
- *     [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
- *
- * If a 'success' callback method is provided it is invoked after the response has been returned
- * from the server.  It is passed the responseText or responseXML value (depending on dataType).
- * See jQuery.ajax for further details.
- *
- *
- * The dataType option provides a means for specifying how the server response should be handled.
- * This maps directly to the jQuery.httpData method.  The following values are supported:
- *
- *      'xml':    if dataType == 'xml' the server response is treated as XML and the 'after'
- *                   callback method, if specified, will be passed the responseXML value
- *      'json':   if dataType == 'json' the server response will be evaluted and passed to
- *                   the 'after' callback, if specified
- *      'script': if dataType == 'script' the server response is evaluated in the global context
- *
- *
- * Note that it does not make sense to use both the 'target' and 'dataType' options.  If both
- * are provided the target will be ignored.
- *
- * The semantic argument can be used to force form serialization in semantic order.
- * This is normally true anyway, unless the form contains input elements of type='image'.
- * If your form must be submitted with name/value pairs in semantic order and your form
- * contains an input of type='image" then pass true for this arg, otherwise pass false
- * (or nothing) to avoid the overhead for this logic.
- *
- *
- * When used on its own, ajaxSubmit() is typically bound to a form's submit event like this:
- *
- * $("#form-id").submit(function() {
- *     $(this).ajaxSubmit(options);
- *     return false; // cancel conventional submit
- * });
- *
- * When using ajaxForm(), however, this is done for you.
- *
- * @example
- * $('#myForm').ajaxSubmit(function(data) {
- *     alert('Form submit succeeded! Server returned: ' + data);
- * });
- * @desc Submit form and alert server response
- *
- *
- * @example
- * var options = {
- *     target: '#myTargetDiv'
- * };
- * $('#myForm').ajaxSubmit(options);
- * @desc Submit form and update page element with server response
- *
- *
- * @example
- * var options = {
- *     success: function(responseText) {
- *         alert(responseText);
- *     }
- * };
- * $('#myForm').ajaxSubmit(options);
- * @desc Submit form and alert the server response
- *
- *
- * @example
- * var options = {
- *     beforeSubmit: function(formArray, jqForm) {
- *         if (formArray.length == 0) {
- *             alert('Please enter data.');
- *             return false;
- *         }
- *     }
- * };
- * $('#myForm').ajaxSubmit(options);
- * @desc Pre-submit validation which aborts the submit operation if form data is empty
- *
- *
- * @example
- * var options = {
- *     url: myJsonUrl.php,
- *     dataType: 'json',
- *     success: function(data) {
- *        // 'data' is an object representing the the evaluated json data
- *     }
- * };
- * $('#myForm').ajaxSubmit(options);
- * @desc json data returned and evaluated
- *
- *
- * @example
- * var options = {
- *     url: myXmlUrl.php,
- *     dataType: 'xml',
- *     success: function(responseXML) {
- *        // responseXML is XML document object
- *        var data = $('myElement', responseXML).text();
- *     }
- * };
- * $('#myForm').ajaxSubmit(options);
- * @desc XML data returned from server
- *
- *
- * @example
- * var options = {
- *     resetForm: true
- * };
- * $('#myForm').ajaxSubmit(options);
- * @desc submit form and reset it if successful
- *
- * @example
- * $('#myForm).submit(function() {
- *    $(this).ajaxSubmit();
- *    return false;
- * });
- * @desc Bind form's submit event to use ajaxSubmit
- *
- *
- * @name ajaxSubmit
- * @type jQuery
- * @param options  object literal containing options which control the form submission process
- * @cat Plugins/Form
- * @return jQuery
- * @see formToArray
- * @see ajaxForm
- * @see $.ajax
- * @author jQuery Community
- */
-jQuery.fn.ajaxSubmit = function(options) {
-    if (typeof options == 'function')
-        options = { success: options };
-
-    options = jQuery.extend({
-        url:    this.attr('action') || '',
-        method: this.attr('method') || 'GET'
-    }, options || {});
-
-    // remap deprecated options (temporarily)
-    options.success = options.success || options.after;
-    options.beforeSubmit = options.beforeSubmit || options.before;
-    options.type = options.type || options.method;
-
-    var a = this.formToArray(options.semantic);
-
-    // give pre-submit callback an opportunity to abort the submit
-    if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) return this;
-
-    var q = jQuery.param(a);
-
-    if (options.type.toUpperCase() == 'GET') {
-        // if url already has a '?' then append args after '&'
-        options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
-        options.data = null;  // data is null for 'get'
-    }
-    else
-        options.data = q; // data is the query string for 'post'
-
-    var $form = this, callbacks = [];
-    if (options.resetForm) callbacks.push(function() { $form.resetForm(); });
-    if (options.clearForm) callbacks.push(function() { $form.clearForm(); });
-
-    // perform a load on the target only if dataType is not provided
-    if (!options.dataType && options.target) {
-        var oldSuccess = options.success || function(){};
-        callbacks.push(function(data, status) {
-            jQuery(options.target).attr("innerHTML", data).evalScripts().each(oldSuccess, [data, status]);
-        });
-    }
-    else if (options.success)
-        callbacks.push(options.success);
-
-    options.success = function(data, status) {
-        for (var i=0, max=callbacks.length; i < max; i++)
-            callbacks[i](data, status);
-    };
-
-    jQuery.ajax(options);
-    return this;
-};
-
-/**
- * ajaxForm() provides a mechanism for fully automating form submission.
- *
- * The advantages of using this method instead of ajaxSubmit() are:
- *
- * 1: This method will include coordinates for <input type="image" /> elements (if the element
- *    is used to submit the form).
- * 2. This method will include the submit element's name/value data (for the element that was
- *    used to submit the form).
- * 3. This method binds the submit() method to the form for you.
- *
- * Note that for accurate x/y coordinates of image submit elements in all browsers
- * you need to also use the "dimensions" plugin (this method will auto-detect its presence).
- *
- * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely
- * passes the options argument along after properly binding events for submit elements and
- * the form itself.  See ajaxSubmit for a full description of the options argument.
- *
- *
- * @example
- * var options = {
- *     target: '#myTargetDiv'
- * };
- * $('#myForm').ajaxSForm(options);
- * @desc Bind form's submit event so that 'myTargetDiv' is updated with the server response
- *       when the form is submitted.
- *
- *
- * @example
- * var options = {
- *     success: function(responseText) {
- *         alert(responseText);
- *     }
- * };
- * $('#myForm').ajaxSubmit(options);
- * @desc Bind form's submit event so that server response is alerted after the form is submitted.
- *
- *
- * @example
- * var options = {
- *     beforeSubmit: function(formArray, jqForm) {
- *         if (formArray.length == 0) {
- *             alert('Please enter data.');
- *             return false;
- *         }
- *     }
- * };
- * $('#myForm').ajaxSubmit(options);
- * @desc Bind form's submit event so that pre-submit callback is invoked before the form
- *       is submitted.
- *
- *
- * @name   ajaxForm
- * @param  options  object literal containing options which control the form submission process
- * @return jQuery
- * @cat    Plugins/Form
- * @type   jQuery
- * @see    ajaxSubmit
- * @author jQuery Community
- */
-jQuery.fn.ajaxForm = function(options) {
-    return this.each(function() {
-        jQuery("input:submit,input:image,button:submit", this).click(function(ev) {
-            var $form = this.form;
-            $form.clk = this;
-            if (this.type == 'image') {
-                if (ev.offsetX != undefined) {
-                    $form.clk_x = ev.offsetX;
-                    $form.clk_y = ev.offsetY;
-                } else if (typeof jQuery.fn.offset == 'function') { // try to use dimensions plugin
-                    var offset = jQuery(this).offset();
-                    $form.clk_x = ev.pageX - offset.left;
-                    $form.clk_y = ev.pageY - offset.top;
-                } else {
-                    $form.clk_x = ev.pageX - this.offsetLeft;
-                    $form.clk_y = ev.pageY - this.offsetTop;
-                }
-            }
-            // clear form vars
-            setTimeout(function() {
-                $form.clk = $form.clk_x = $form.clk_y = null;
-                }, 10);
-        })
-    }).submit(function(e) {
-        jQuery(this).ajaxSubmit(options);
-        return false;
-    });
-};
-
-
-/**
- * formToArray() gathers form element data into an array of objects that can
- * be passed to any of the following ajax functions: $.get, $.post, or load.
- * Each object in the array has both a 'name' and 'value' property.  An example of
- * an array for a simple login form might be:
- *
- * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
- *
- * It is this array that is passed to pre-submit callback functions provided to the
- * ajaxSubmit() and ajaxForm() methods.
- *
- * The semantic argument can be used to force form serialization in semantic order.
- * This is normally true anyway, unless the form contains input elements of type='image'.
- * If your form must be submitted with name/value pairs in semantic order and your form
- * contains an input of type='image" then pass true for this arg, otherwise pass false
- * (or nothing) to avoid the overhead for this logic.
- *
- * @example var data = $("#myForm").formToArray();
- * $.post( "myscript.cgi", data );
- * @desc Collect all the data from a form and submit it to the server.
- *
- * @name formToArray
- * @param semantic true if serialization must maintain strict semantic ordering of elements (slower)
- * @type Array<Object>
- * @cat Plugins/Form
- * @see ajaxForm
- * @see ajaxSubmit
- * @author jQuery Community
- */
-jQuery.fn.formToArray = function(semantic) {
-    var a = [];
-    if (this.length == 0) return a;
-
-    var form = this[0];
-    var els = semantic ? form.getElementsByTagName('*') : form.elements;
-    if (!els) return a;
-    for(var i=0, max=els.length; i < max; i++) {
-        var el = els[i];
-        var n = el.name;
-        if (!n) continue;
-
-        if (semantic && form.clk && el.type == "image") {
-            // handle image inputs on the fly when semantic == true
-            if(!el.disabled && form.clk == el)
-                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
-            continue;
-        }
-        var v = jQuery.fieldValue(el, true);
-        if (v === null) continue;
-        if (v.constructor == Array) {
-            for(var j=0, jmax=v.length; j < jmax; j++)
-                a.push({name: n, value: v[j]});
-        }
-        else
-            a.push({name: n, value: v});
-    }
-
-    if (!semantic && form.clk) {
-        // input type=='image' are not found in elements array! handle them here
-        var inputs = form.getElementsByTagName("input");
-        for(var i=0, max=inputs.length; i < max; i++) {
-            var input = inputs[i];
-            var n = input.name;
-            if(n && !input.disabled && input.type == "image" && form.clk == input)
-                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
-        }
-    }
-    return a;
-};
-
-
-/**
- * Serializes form data into a 'submittable' string. This method will return a string
- * in the format: name1=value1&amp;name2=value2
- *
- * The semantic argument can be used to force form serialization in semantic order.
- * If your form must be submitted with name/value pairs in semantic order then pass
- * true for this arg, otherwise pass false (or nothing) to avoid the overhead for
- * this logic (which can be significant for very large forms).
- *
- * @example var data = $("#myForm").formSerialize();
- * $.ajax('POST', "myscript.cgi", data);
- * @desc Collect all the data from a form into a single string
- *
- * @name formSerialize
- * @param semantic true if serialization must maintain strict semantic ordering of elements (slower)
- * @type String
- * @cat Plugins/Form
- * @see formToArray
- * @author jQuery Community
- */
-jQuery.fn.formSerialize = function(semantic) {
-    //hand off to jQuery.param for proper encoding
-    return jQuery.param(this.formToArray(semantic));
-};
-
-
-/**
- * Serializes all field elements in the jQuery object into a query string.
- * This method will return a string in the format: name1=value1&amp;name2=value2
- *
- * The successful argument controls whether or not serialization is limited to
- * 'successful' controls (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
- * The default value of the successful argument is true.
- *
- * @example var data = $("input").formSerialize();
- * @desc Collect the data from all successful input elements into a query string
- *
- * @example var data = $(":radio").formSerialize();
- * @desc Collect the data from all successful radio input elements into a query string
- *
- * @example var data = $("#myForm :checkbox").formSerialize();
- * @desc Collect the data from all successful checkbox input elements in myForm into a query string
- *
- * @example var data = $("#myForm :checkbox").formSerialize(false);
- * @desc Collect the data from all checkbox elements in myForm (even the unchecked ones) into a query string
- *
- * @example var data = $(":input").formSerialize();
- * @desc Collect the data from all successful input, select, textarea and button elements into a query string
- *
- * @name fieldSerialize
- * @param successful true if only successful controls should be serialized (default is true)
- * @type String
- * @cat Plugins/Form
- */
-jQuery.fn.fieldSerialize = function(successful) {
-    var a = [];
-    this.each(function() {
-        var n = this.name;
-        if (!n) return;
-        var v = jQuery.fieldValue(this, successful);
-        if (v && v.constructor == Array) {
-            for (var i=0,max=v.length; i < max; i++)
-                a.push({name: n, value: v[i]});
-        }
-        else if (v !== null && typeof v != 'undefined')
-            a.push({name: this.name, value: v});
-    });
-    //hand off to jQuery.param for proper encoding
-    return jQuery.param(a);
-};
-
-
-/**
- * Returns the value of the field element in the jQuery object.  If there is more than one field element
- * in the jQuery object the value of the first successful one is returned.
- *
- * The successful argument controls whether or not the field element must be 'successful'
- * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
- * The default value of the successful argument is true.  If this value is false then
- * the value of the first field element in the jQuery object is returned.
- *
- * Note: If no valid value can be determined the return value will be undifined.
- *
- * Note: The fieldValue returned for a select-multiple element or for a checkbox input will
- *       always be an array if it is not undefined.
- *
- *
- * @example var data = $("#myPasswordElement").formValue();
- * @desc Gets the current value of the myPasswordElement element
- *
- * @example var data = $("#myForm :input").formValue();
- * @desc Get the value of the first successful control in the jQuery object.
- *
- * @example var data = $("#myForm :checkbox").formValue();
- * @desc Get the array of values for the first set of successful checkbox controls in the jQuery object.
- *
- * @example var data = $("#mySingleSelect").formValue();
- * @desc Get the value of the select control
- *
- * @example var data = $("#myMultiSelect").formValue();
- * @desc Get the array of selected values for the select-multiple control
- *
- * @name fieldValue
- * @param Boolean successful true if value returned must be for a successful controls (default is true)
- * @type String or Array<String>
- * @cat Plugins/Form
- */
-jQuery.fn.fieldValue = function(successful) {
-    var cbVal, cbName;
-
-    // loop until we find a value
-    for (var i=0, max=this.length; i < max; i++) {
-        var el = this[i];
-        var v = jQuery.fieldValue(el, successful);
-        if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))
-            continue;
-
-        // for checkboxes, consider multiple elements, for everything else just return first valid value
-        if (el.type != 'checkbox') return v;
-
-        cbName = cbName || el.name;
-        if (cbName != el.name) // return if we hit a checkbox with a different name
-            return cbVal;
-        cbVal = cbVal || [];
-        cbVal.push(v);
-    }
-    return cbVal;
-};
-
-/**
- * Returns the value of the field element.
- *
- * The successful argument controls whether or not the field element must be 'successful'
- * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
- * The default value of the successful argument is true.  If the given element is not
- * successful and the successful arg is not false then the returned value will be null.
- *
- * Note: The fieldValue returned for a select-multiple element will always be an array.
- *
- * @example var data = jQuery.fieldValue($("#myPasswordElement")[0]);
- * @desc Gets the current value of the myPasswordElement element
- *
- * @name fieldValue
- * @param Element el The DOM element for which the value will be returned
- * @param Boolean successful true if value returned must be for a successful controls (default is true)
- * @type String or Array<String>
- * @cat Plugins/Form
- */
-jQuery.fieldValue = function(el, successful) {
-    var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
-    if (typeof successful == 'undefined') successful = true;
-
-    if (successful && ( !n || el.disabled || t == 'reset' ||
-        (t == 'checkbox' || t == 'radio') && !el.checked ||
-        (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
-        tag == 'select' && el.selectedIndex == -1))
-            return null;
-
-    if (tag == 'select') {
-        var index = el.selectedIndex;
-        if (index < 0) return null;
-        var a = [], ops = el.options;
-        var one = (t == 'select-one');
-        var max = (one ? index+1 : ops.length);
-        for(var i=(one ? index : 0); i < max; i++) {
-            var op = ops[i];
-            if (op.selected) {
-                // extra pain for IE...
-                var v = jQuery.browser.msie && !(op.attributes['value'].specified) ? op.text : op.value;
-                if (one) return v;
-                a.push(v);
-            }
-        }
-        return a;
-    }
-    return el.value;
-};
-
-
-/**
- * Clears the form data.  Takes the following actions on the form's input fields:
- *  - input text fields will have their 'value' property set to the empty string
- *  - select elements will have their 'selectedIndex' property set to -1
- *  - checkbox and radio inputs will have their 'checked' property set to false
- *  - inputs of type submit, button, reset, and hidden will *not* be effected
- *  - button elements will *not* be effected
- *
- * @example $('form').clearForm();
- * @desc Clears all forms on the page.
- *
- * @name clearForm
- * @type jQuery
- * @cat Plugins/Form
- * @see resetForm
- */
-jQuery.fn.clearForm = function() {
-    return this.each(function() {
-        jQuery('input,select,textarea', this).clearFields();
-    });
-};
-
-/**
- * Clears the selected form elements.  Takes the following actions on the matched elements:
- *  - input text fields will have their 'value' property set to the empty string
- *  - select elements will have their 'selectedIndex' property set to -1
- *  - checkbox and radio inputs will have their 'checked' property set to false
- *  - inputs of type submit, button, reset, and hidden will *not* be effected
- *  - button elements will *not* be effected
- *
- * @example $('.myInputs').clearFields();
- * @desc Clears all inputs with class myInputs
- *
- * @name clearFields
- * @type jQuery
- * @cat Plugins/Form
- * @see clearForm
- */
-jQuery.fn.clearFields = jQuery.fn.clearInputs = function() {
-    return this.each(function() {
-        var t = this.type, tag = this.tagName.toLowerCase();
-        if (t == 'text' || t == 'password' || tag == 'textarea')
-            this.value = '';
-        else if (t == 'checkbox' || t == 'radio')
-            this.checked = false;
-        else if (tag == 'select')
-            this.selectedIndex = -1;
-    });
-};
-
-
-/**
- * Resets the form data.  Causes all form elements to be reset to their original value.
- *
- * @example $('form').resetForm();
- * @desc Resets all forms on the page.
- *
- * @name resetForm
- * @type jQuery
- * @cat Plugins/Form
- * @see clearForm
- */
-jQuery.fn.resetForm = function() {
-    return this.each(function() {
-        // guard against an input with the name of 'reset'
-        // note that IE reports the reset function as an 'object'
-        if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType))
-            this.reset();
-    });
-};
+/*
+ * jQuery Form Plugin
+ * version: 2.02 (12/16/2007)
+ * @requires jQuery v1.1 or later
+ *
+ * Examples at: http://malsup.com/jquery/form/
+ * Dual licensed under the MIT and GPL licenses:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *   http://www.gnu.org/licenses/gpl.html
+ *
+ * Revision: $Id$
+ */
+ (function($) {
+/**
+ * ajaxSubmit() provides a mechanism for submitting an HTML form using AJAX.
+ *
+ * ajaxSubmit accepts a single argument which can be either a success callback function
+ * or an options Object.  If a function is provided it will be invoked upon successful
+ * completion of the submit and will be passed the response from the server.
+ * If an options Object is provided, the following attributes are supported:
+ *
+ *  target:   Identifies the element(s) in the page to be updated with the server response.
+ *            This value may be specified as a jQuery selection string, a jQuery object,
+ *            or a DOM element.
+ *            default value: null
+ *
+ *  url:      URL to which the form data will be submitted.
+ *            default value: value of form's 'action' attribute
+ *
+ *  type:     The method in which the form data should be submitted, 'GET' or 'POST'.
+ *            default value: value of form's 'method' attribute (or 'GET' if none found)
+ *
+ *  data:     Additional data to add to the request, specified as key/value pairs (see $.ajax).
+ *
+ *  beforeSubmit:  Callback method to be invoked before the form is submitted.
+ *            default value: null
+ *
+ *  success:  Callback method to be invoked after the form has been successfully submitted
+ *            and the response has been returned from the server
+ *            default value: null
+ *
+ *  dataType: Expected dataType of the response.  One of: null, 'xml', 'script', or 'json'
+ *            default value: null
+ *
+ *  semantic: Boolean flag indicating whether data must be submitted in semantic order (slower).
+ *            default value: false
+ *
+ *  resetForm: Boolean flag indicating whether the form should be reset if the submit is successful
+ *
+ *  clearForm: Boolean flag indicating whether the form should be cleared if the submit is successful
+ *
+ *
+ * The 'beforeSubmit' callback can be provided as a hook for running pre-submit logic or for
+ * validating the form data.  If the 'beforeSubmit' callback returns false then the form will
+ * not be submitted. The 'beforeSubmit' callback is invoked with three arguments: the form data
+ * in array format, the jQuery object, and the options object passed into ajaxSubmit.
+ * The form data array takes the following form:
+ *
+ *     [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
+ *
+ * If a 'success' callback method is provided it is invoked after the response has been returned
+ * from the server.  It is passed the responseText or responseXML value (depending on dataType).
+ * See jQuery.ajax for further details.
+ *
+ *
+ * The dataType option provides a means for specifying how the server response should be handled.
+ * This maps directly to the jQuery.httpData method.  The following values are supported:
+ *
+ *      'xml':    if dataType == 'xml' the server response is treated as XML and the 'success'
+ *                   callback method, if specified, will be passed the responseXML value
+ *      'json':   if dataType == 'json' the server response will be evaluted and passed to
+ *                   the 'success' callback, if specified
+ *      'script': if dataType == 'script' the server response is evaluated in the global context
+ *
+ *
+ * Note that it does not make sense to use both the 'target' and 'dataType' options.  If both
+ * are provided the target will be ignored.
+ *
+ * The semantic argument can be used to force form serialization in semantic order.
+ * This is normally true anyway, unless the form contains input elements of type='image'.
+ * If your form must be submitted with name/value pairs in semantic order and your form
+ * contains an input of type='image" then pass true for this arg, otherwise pass false
+ * (or nothing) to avoid the overhead for this logic.
+ *
+ *
+ * When used on its own, ajaxSubmit() is typically bound to a form's submit event like this:
+ *
+ * $("#form-id").submit(function() {
+ *     $(this).ajaxSubmit(options);
+ *     return false; // cancel conventional submit
+ * });
+ *
+ * When using ajaxForm(), however, this is done for you.
+ *
+ * @example
+ * $('#myForm').ajaxSubmit(function(data) {
+ *     alert('Form submit succeeded! Server returned: ' + data);
+ * });
+ * @desc Submit form and alert server response
+ *
+ *
+ * @example
+ * var options = {
+ *     target: '#myTargetDiv'
+ * };
+ * $('#myForm').ajaxSubmit(options);
+ * @desc Submit form and update page element with server response
+ *
+ *
+ * @example
+ * var options = {
+ *     success: function(responseText) {
+ *         alert(responseText);
+ *     }
+ * };
+ * $('#myForm').ajaxSubmit(options);
+ * @desc Submit form and alert the server response
+ *
+ *
+ * @example
+ * var options = {
+ *     beforeSubmit: function(formArray, jqForm) {
+ *         if (formArray.length == 0) {
+ *             alert('Please enter data.');
+ *             return false;
+ *         }
+ *     }
+ * };
+ * $('#myForm').ajaxSubmit(options);
+ * @desc Pre-submit validation which aborts the submit operation if form data is empty
+ *
+ *
+ * @example
+ * var options = {
+ *     url: myJsonUrl.php,
+ *     dataType: 'json',
+ *     success: function(data) {
+ *        // 'data' is an object representing the the evaluated json data
+ *     }
+ * };
+ * $('#myForm').ajaxSubmit(options);
+ * @desc json data returned and evaluated
+ *
+ *
+ * @example
+ * var options = {
+ *     url: myXmlUrl.php,
+ *     dataType: 'xml',
+ *     success: function(responseXML) {
+ *        // responseXML is XML document object
+ *        var data = $('myElement', responseXML).text();
+ *     }
+ * };
+ * $('#myForm').ajaxSubmit(options);
+ * @desc XML data returned from server
+ *
+ *
+ * @example
+ * var options = {
+ *     resetForm: true
+ * };
+ * $('#myForm').ajaxSubmit(options);
+ * @desc submit form and reset it if successful
+ *
+ * @example
+ * $('#myForm).submit(function() {
+ *    $(this).ajaxSubmit();
+ *    return false;
+ * });
+ * @desc Bind form's submit event to use ajaxSubmit
+ *
+ *
+ * @name ajaxSubmit
+ * @type jQuery
+ * @param options  object literal containing options which control the form submission process
+ * @cat Plugins/Form
+ * @return jQuery
+ */
+$.fn.ajaxSubmit = function(options) {
+    if (typeof options == 'function')
+        options = { success: options };
+
+    options = $.extend({
+        url:  this.attr('action') || window.location.toString(),
+        type: this.attr('method') || 'GET'
+    }, options || {});
+
+    // hook for manipulating the form data before it is extracted;
+    // convenient for use with rich editors like tinyMCE or FCKEditor
+    var veto = {};
+    $.event.trigger('form.pre.serialize', [this, options, veto]);
+    if (veto.veto) return this;
+
+    var a = this.formToArray(options.semantic);
+	if (options.data) {
+	    for (var n in options.data)
+	        a.push( { name: n, value: options.data[n] } );
+	}
+
+    // give pre-submit callback an opportunity to abort the submit
+    if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) return this;
+
+    // fire vetoable 'validate' event
+    $.event.trigger('form.submit.validate', [a, this, options, veto]);
+    if (veto.veto) return this;
+
+    var q = $.param(a);//.replace(/%20/g,'+');
+
+    if (options.type.toUpperCase() == 'GET') {
+        options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
+        options.data = null;  // data is null for 'get'
+    }
+    else
+        options.data = q; // data is the query string for 'post'
+
+    var $form = this, callbacks = [];
+    if (options.resetForm) callbacks.push(function() { $form.resetForm(); });
+    if (options.clearForm) callbacks.push(function() { $form.clearForm(); });
+
+    // perform a load on the target only if dataType is not provided
+    if (!options.dataType && options.target) {
+        var oldSuccess = options.success || function(){};
+        callbacks.push(function(data) {
+            if (this.evalScripts)
+                $(options.target).attr("innerHTML", data).evalScripts().each(oldSuccess, arguments);
+            else // jQuery v1.1.4
+                $(options.target).html(data).each(oldSuccess, arguments);
+        });
+    }
+    else if (options.success)
+        callbacks.push(options.success);
+
+    options.success = function(data, status) {
+        for (var i=0, max=callbacks.length; i < max; i++)
+            callbacks[i](data, status, $form);
+    };
+
+    // are there files to upload?
+    var files = $('input:file', this).fieldValue();
+    var found = false;
+    for (var j=0; j < files.length; j++)
+        if (files[j])
+            found = true;
+
+    // options.iframe allows user to force iframe mode
+   if (options.iframe || found) { 
+       // hack to fix Safari hang (thanks to Tim Molendijk for this)
+       // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
+       if ($.browser.safari && options.closeKeepAlive)
+           $.get(options.closeKeepAlive, fileUpload);
+       else
+           fileUpload();
+       }
+   else
+       $.ajax(options);
+
+    // fire 'notify' event
+    $.event.trigger('form.submit.notify', [this, options]);
+    return this;
+
+
+    // private function for handling file uploads (hat tip to YAHOO!)
+    function fileUpload() {
+        var form = $form[0];
+        var opts = $.extend({}, $.ajaxSettings, options);
+
+        var id = 'jqFormIO' + $.fn.ajaxSubmit.counter++;
+        var $io = $('<iframe id="' + id + '" name="' + id + '" />');
+        var io = $io[0];
+        var op8 = $.browser.opera && window.opera.version() < 9;
+        if ($.browser.msie || op8) io.src = 'javascript:false;document.write("");';
+        $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
+
+        var xhr = { // mock object
+            responseText: null,
+            responseXML: null,
+            status: 0,
+            statusText: 'n/a',
+            getAllResponseHeaders: function() {},
+            getResponseHeader: function() {},
+            setRequestHeader: function() {}
+        };
+
+        var g = opts.global;
+        // trigger ajax global events so that activity/block indicators work like normal
+        if (g && ! $.active++) $.event.trigger("ajaxStart");
+        if (g) $.event.trigger("ajaxSend", [xhr, opts]);
+
+        var cbInvoked = 0;
+        var timedOut = 0;
+
+        // take a breath so that pending repaints get some cpu time before the upload starts
+        setTimeout(function() {
+            // make sure form attrs are set
+            var encAttr = form.encoding ? 'encoding' : 'enctype';
+            var t = $form.attr('target');
+            $form.attr({
+                target:   id,
+                method:  'POST',
+                action:   opts.url
+            });
+            form[encAttr] = 'multipart/form-data';
+
+            // support timout
+            if (opts.timeout)
+                setTimeout(function() { timedOut = true; cb(); }, opts.timeout);
+
+            // add iframe to doc and submit the form
+            $io.appendTo('body');
+            io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
+            form.submit();
+            $form.attr('target', t); // reset target
+        }, 10);
+
+        function cb() {
+            if (cbInvoked++) return;
+
+            io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);
+
+            var ok = true;
+            try {
+                if (timedOut) throw 'timeout';
+                // extract the server response from the iframe
+                var data, doc;
+                doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
+                xhr.responseText = doc.body ? doc.body.innerHTML : null;
+                xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
+
+                if (opts.dataType == 'json' || opts.dataType == 'script') {
+                    var ta = doc.getElementsByTagName('textarea')[0];
+                    data = ta ? ta.value : xhr.responseText;
+                    if (opts.dataType == 'json')
+                        eval("data = " + data);
+                    else
+                        $.globalEval(data);
+                }
+                else if (opts.dataType == 'xml') {
+                    data = xhr.responseXML;
+                    if (!data && xhr.responseText != null)
+                        data = toXml(xhr.responseText);
+                }
+                else {
+                    data = xhr.responseText;
+                }
+            }
+            catch(e){
+                ok = false;
+                $.handleError(opts, xhr, 'error', e);
+            }
+
+            // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
+            if (ok) {
+                opts.success(data, 'success');
+                if (g) $.event.trigger("ajaxSuccess", [xhr, opts]);
+            }
+            if (g) $.event.trigger("ajaxComplete", [xhr, opts]);
+            if (g && ! --$.active) $.event.trigger("ajaxStop");
+            if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error');
+
+            // clean up
+            setTimeout(function() {
+                $io.remove();
+                xhr.responseXML = null;
+            }, 100);
+        };
+
+        function toXml(s, doc) {
+            if (window.ActiveXObject) {
+                doc = new ActiveXObject('Microsoft.XMLDOM');
+                doc.async = 'false';
+                doc.loadXML(s);
+            }
+            else
+                doc = (new DOMParser()).parseFromString(s, 'text/xml');
+            return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null;
+        };
+    };
+};
+$.fn.ajaxSubmit.counter = 0; // used to create unique iframe ids
+
+/**
+ * ajaxForm() provides a mechanism for fully automating form submission.
+ *
+ * The advantages of using this method instead of ajaxSubmit() are:
+ *
+ * 1: This method will include coordinates for <input type="image" /> elements (if the element
+ *    is used to submit the form).
+ * 2. This method will include the submit element's name/value data (for the element that was
+ *    used to submit the form).
+ * 3. This method binds the submit() method to the form for you.
+ *
+ * Note that for accurate x/y coordinates of image submit elements in all browsers
+ * you need to also use the "dimensions" plugin (this method will auto-detect its presence).
+ *
+ * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely
+ * passes the options argument along after properly binding events for submit elements and
+ * the form itself.  See ajaxSubmit for a full description of the options argument.
+ *
+ *
+ * @example
+ * var options = {
+ *     target: '#myTargetDiv'
+ * };
+ * $('#myForm').ajaxSForm(options);
+ * @desc Bind form's submit event so that 'myTargetDiv' is updated with the server response
+ *       when the form is submitted.
+ *
+ *
+ * @example
+ * var options = {
+ *     success: function(responseText) {
+ *         alert(responseText);
+ *     }
+ * };
+ * $('#myForm').ajaxSubmit(options);
+ * @desc Bind form's submit event so that server response is alerted after the form is submitted.
+ *
+ *
+ * @example
+ * var options = {
+ *     beforeSubmit: function(formArray, jqForm) {
+ *         if (formArray.length == 0) {
+ *             alert('Please enter data.');
+ *             return false;
+ *         }
+ *     }
+ * };
+ * $('#myForm').ajaxSubmit(options);
+ * @desc Bind form's submit event so that pre-submit callback is invoked before the form
+ *       is submitted.
+ *
+ *
+ * @name   ajaxForm
+ * @param  options  object literal containing options which control the form submission process
+ * @return jQuery
+ * @cat    Plugins/Form
+ * @type   jQuery
+ */
+$.fn.ajaxForm = function(options) {
+    return this.ajaxFormUnbind().submit(submitHandler).each(function() {
+        // store options in hash
+        this.formPluginId = $.fn.ajaxForm.counter++;
+        $.fn.ajaxForm.optionHash[this.formPluginId] = options;
+        $(":submit,input:image", this).click(clickHandler);
+    });
+};
+
+$.fn.ajaxForm.counter = 1;
+$.fn.ajaxForm.optionHash = {};
+
+function clickHandler(e) {
+    var $form = this.form;
+    $form.clk = this;
+    if (this.type == 'image') {
+        if (e.offsetX != undefined) {
+            $form.clk_x = e.offsetX;
+            $form.clk_y = e.offsetY;
+        } else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
+            var offset = $(this).offset();
+            $form.clk_x = e.pageX - offset.left;
+            $form.clk_y = e.pageY - offset.top;
+        } else {
+            $form.clk_x = e.pageX - this.offsetLeft;
+            $form.clk_y = e.pageY - this.offsetTop;
+        }
+    }
+    // clear form vars
+    setTimeout(function() { $form.clk = $form.clk_x = $form.clk_y = null; }, 10);
+};
+
+function submitHandler() {
+    // retrieve options from hash
+    var id = this.formPluginId;
+    var options = $.fn.ajaxForm.optionHash[id];
+    $(this).ajaxSubmit(options);
+    return false;
+};
+
+/**
+ * ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
+ *
+ * @name   ajaxFormUnbind
+ * @return jQuery
+ * @cat    Plugins/Form
+ * @type   jQuery
+ */
+$.fn.ajaxFormUnbind = function() {
+    this.unbind('submit', submitHandler);
+    return this.each(function() {
+        $(":submit,input:image", this).unbind('click', clickHandler);
+    });
+
+};
+
+/**
+ * formToArray() gathers form element data into an array of objects that can
+ * be passed to any of the following ajax functions: $.get, $.post, or load.
+ * Each object in the array has both a 'name' and 'value' property.  An example of
+ * an array for a simple login form might be:
+ *
+ * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
+ *
+ * It is this array that is passed to pre-submit callback functions provided to the
+ * ajaxSubmit() and ajaxForm() methods.
+ *
+ * The semantic argument can be used to force form serialization in semantic order.
+ * This is normally true anyway, unless the form contains input elements of type='image'.
+ * If your form must be submitted with name/value pairs in semantic order and your form
+ * contains an input of type='image" then pass true for this arg, otherwise pass false
+ * (or nothing) to avoid the overhead for this logic.
+ *
+ * @example var data = $("#myForm").formToArray();
+ * $.post( "myscript.cgi", data );
+ * @desc Collect all the data from a form and submit it to the server.
+ *
+ * @name formToArray
+ * @param semantic true if serialization must maintain strict semantic ordering of elements (slower)
+ * @type Array<Object>
+ * @cat Plugins/Form
+ */
+$.fn.formToArray = function(semantic) {
+    var a = [];
+    if (this.length == 0) return a;
+
+    var form = this[0];
+    var els = semantic ? form.getElementsByTagName('*') : form.elements;
+    if (!els) return a;
+    for(var i=0, max=els.length; i < max; i++) {
+        var el = els[i];
+        var n = el.name;
+        if (!n) continue;
+
+        if (semantic && form.clk && el.type == "image") {
+            // handle image inputs on the fly when semantic == true
+            if(!el.disabled && form.clk == el)
+                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
+            continue;
+        }
+
+        var v = $.fieldValue(el, true);
+        if (v && v.constructor == Array) {
+            for(var j=0, jmax=v.length; j < jmax; j++)
+                a.push({name: n, value: v[j]});
+        }
+        else if (v !== null && typeof v != 'undefined')
+            a.push({name: n, value: v});
+    }
+
+    if (!semantic && form.clk) {
+        // input type=='image' are not found in elements array! handle them here
+        var inputs = form.getElementsByTagName("input");
+        for(var i=0, max=inputs.length; i < max; i++) {
+            var input = inputs[i];
+            var n = input.name;
+            if(n && !input.disabled && input.type == "image" && form.clk == input)
+                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
+        }
+    }
+    return a;
+};
+
+
+/**
+ * Serializes form data into a 'submittable' string. This method will return a string
+ * in the format: name1=value1&amp;name2=value2
+ *
+ * The semantic argument can be used to force form serialization in semantic order.
+ * If your form must be submitted with name/value pairs in semantic order then pass
+ * true for this arg, otherwise pass false (or nothing) to avoid the overhead for
+ * this logic (which can be significant for very large forms).
+ *
+ * @example var data = $("#myForm").formSerialize();
+ * $.ajax('POST', "myscript.cgi", data);
+ * @desc Collect all the data from a form into a single string
+ *
+ * @name formSerialize
+ * @param semantic true if serialization must maintain strict semantic ordering of elements (slower)
+ * @type String
+ * @cat Plugins/Form
+ */
+$.fn.formSerialize = function(semantic) {
+    //hand off to jQuery.param for proper encoding
+    return $.param(this.formToArray(semantic));
+};
+
+
+/**
+ * Serializes all field elements in the jQuery object into a query string.
+ * This method will return a string in the format: name1=value1&amp;name2=value2
+ *
+ * The successful argument controls whether or not serialization is limited to
+ * 'successful' controls (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
+ * The default value of the successful argument is true.
+ *
+ * @example var data = $("input").formSerialize();
+ * @desc Collect the data from all successful input elements into a query string
+ *
+ * @example var data = $(":radio").formSerialize();
+ * @desc Collect the data from all successful radio input elements into a query string
+ *
+ * @example var data = $("#myForm :checkbox").formSerialize();
+ * @desc Collect the data from all successful checkbox input elements in myForm into a query string
+ *
+ * @example var data = $("#myForm :checkbox").formSerialize(false);
+ * @desc Collect the data from all checkbox elements in myForm (even the unchecked ones) into a query string
+ *
+ * @example var data = $(":input").formSerialize();
+ * @desc Collect the data from all successful input, select, textarea and button elements into a query string
+ *
+ * @name fieldSerialize
+ * @param successful true if only successful controls should be serialized (default is true)
+ * @type String
+ * @cat Plugins/Form
+ */
+$.fn.fieldSerialize = function(successful) {
+    var a = [];
+    this.each(function() {
+        var n = this.name;
+        if (!n) return;
+        var v = $.fieldValue(this, successful);
+        if (v && v.constructor == Array) {
+            for (var i=0,max=v.length; i < max; i++)
+                a.push({name: n, value: v[i]});
+        }
+        else if (v !== null && typeof v != 'undefined')
+            a.push({name: this.name, value: v});
+    });
+    //hand off to jQuery.param for proper encoding
+    return $.param(a);
+};
+
+
+/**
+ * Returns the value(s) of the element in the matched set.  For example, consider the following form:
+ *
+ *  <form><fieldset>
+ *      <input name="A" type="text" />
+ *      <input name="A" type="text" />
+ *      <input name="B" type="checkbox" value="B1" />
+ *      <input name="B" type="checkbox" value="B2"/>
+ *      <input name="C" type="radio" value="C1" />
+ *      <input name="C" type="radio" value="C2" />
+ *  </fieldset></form>
+ *
+ *  var v = $(':text').fieldValue();
+ *  // if no values are entered into the text inputs
+ *  v == ['','']
+ *  // if values entered into the text inputs are 'foo' and 'bar'
+ *  v == ['foo','bar']
+ *
+ *  var v = $(':checkbox').fieldValue();
+ *  // if neither checkbox is checked
+ *  v === undefined
+ *  // if both checkboxes are checked
+ *  v == ['B1', 'B2']
+ *
+ *  var v = $(':radio').fieldValue();
+ *  // if neither radio is checked
+ *  v === undefined
+ *  // if first radio is checked
+ *  v == ['C1']
+ *
+ * The successful argument controls whether or not the field element must be 'successful'
+ * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
+ * The default value of the successful argument is true.  If this value is false the value(s)
+ * for each element is returned.
+ *
+ * Note: This method *always* returns an array.  If no valid value can be determined the
+ *       array will be empty, otherwise it will contain one or more values.
+ *
+ * @example var data = $("#myPasswordElement").fieldValue();
+ * alert(data[0]);
+ * @desc Alerts the current value of the myPasswordElement element
+ *
+ * @example var data = $("#myForm :input").fieldValue();
+ * @desc Get the value(s) of the form elements in myForm
+ *
+ * @example var data = $("#myForm :checkbox").fieldValue();
+ * @desc Get the value(s) for the successful checkbox element(s) in the jQuery object.
+ *
+ * @example var data = $("#mySingleSelect").fieldValue();
+ * @desc Get the value(s) of the select control
+ *
+ * @example var data = $(':text').fieldValue();
+ * @desc Get the value(s) of the text input or textarea elements
+ *
+ * @example var data = $("#myMultiSelect").fieldValue();
+ * @desc Get the values for the select-multiple control
+ *
+ * @name fieldValue
+ * @param Boolean successful true if only the values for successful controls should be returned (default is true)
+ * @type Array<String>
+ * @cat Plugins/Form
+ */
+$.fn.fieldValue = function(successful) {
+    for (var val=[], i=0, max=this.length; i < max; i++) {
+        var el = this[i];
+        var v = $.fieldValue(el, successful);
+        if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))
+            continue;
+        v.constructor == Array ? $.merge(val, v) : val.push(v);
+    }
+    return val;
+};
+
+/**
+ * Returns the value of the field element.
+ *
+ * The successful argument controls whether or not the field element must be 'successful'
+ * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
+ * The default value of the successful argument is true.  If the given element is not
+ * successful and the successful arg is not false then the returned value will be null.
+ *
+ * Note: If the successful flag is true (default) but the element is not successful, the return will be null
+ * Note: The value returned for a successful select-multiple element will always be an array.
+ * Note: If the element has no value the return value will be undefined.
+ *
+ * @example var data = jQuery.fieldValue($("#myPasswordElement")[0]);
+ * @desc Gets the current value of the myPasswordElement element
+ *
+ * @name fieldValue
+ * @param Element el The DOM element for which the value will be returned
+ * @param Boolean successful true if value returned must be for a successful controls (default is true)
+ * @type String or Array<String> or null or undefined
+ * @cat Plugins/Form
+ */
+$.fieldValue = function(el, successful) {
+    var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
+    if (typeof successful == 'undefined') successful = true;
+
+    if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
+        (t == 'checkbox' || t == 'radio') && !el.checked ||
+        (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
+        tag == 'select' && el.selectedIndex == -1))
+            return null;
+
+    if (tag == 'select') {
+        var index = el.selectedIndex;
+        if (index < 0) return null;
+        var a = [], ops = el.options;
+        var one = (t == 'select-one');
+        var max = (one ? index+1 : ops.length);
+        for(var i=(one ? index : 0); i < max; i++) {
+            var op = ops[i];
+            if (op.selected) {
+                // extra pain for IE...
+                var v = $.browser.msie && !(op.attributes['value'].specified) ? op.text : op.value;
+                if (one) return v;
+                a.push(v);
+            }
+        }
+        return a;
+    }
+    return el.value;
+};
+
+
+/**
+ * Clears the form data.  Takes the following actions on the form's input fields:
+ *  - input text fields will have their 'value' property set to the empty string
+ *  - select elements will have their 'selectedIndex' property set to -1
+ *  - checkbox and radio inputs will have their 'checked' property set to false
+ *  - inputs of type submit, button, reset, and hidden will *not* be effected
+ *  - button elements will *not* be effected
+ *
+ * @example $('form').clearForm();
+ * @desc Clears all forms on the page.
+ *
+ * @name clearForm
+ * @type jQuery
+ * @cat Plugins/Form
+ */
+$.fn.clearForm = function() {
+    return this.each(function() {
+        $('input,select,textarea', this).clearFields();
+    });
+};
+
+/**
+ * Clears the selected form elements.  Takes the following actions on the matched elements:
+ *  - input text fields will have their 'value' property set to the empty string
+ *  - select elements will have their 'selectedIndex' property set to -1
+ *  - checkbox and radio inputs will have their 'checked' property set to false
+ *  - inputs of type submit, button, reset, and hidden will *not* be effected
+ *  - button elements will *not* be effected
+ *
+ * @example $('.myInputs').clearFields();
+ * @desc Clears all inputs with class myInputs
+ *
+ * @name clearFields
+ * @type jQuery
+ * @cat Plugins/Form
+ */
+$.fn.clearFields = $.fn.clearInputs = function() {
+    return this.each(function() {
+        var t = this.type, tag = this.tagName.toLowerCase();
+        if (t == 'text' || t == 'password' || tag == 'textarea')
+            this.value = '';
+        else if (t == 'checkbox' || t == 'radio')
+            this.checked = false;
+        else if (tag == 'select')
+            this.selectedIndex = -1;
+    });
+};
+
+
+/**
+ * Resets the form data.  Causes all form elements to be reset to their original value.
+ *
+ * @example $('form').resetForm();
+ * @desc Resets all forms on the page.
+ *
+ * @name resetForm
+ * @type jQuery
+ * @cat Plugins/Form
+ */
+$.fn.resetForm = function() {
+    return this.each(function() {
+        // guard against an input with the name of 'reset'
+        // note that IE reports the reset function as an 'object'
+        if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType))
+            this.reset();
+    });
+};
+
+
+/**
+ * Enables or disables any matching elements.
+ *
+ * @example $(':radio').enabled(false);
+ * @desc Disables all radio buttons
+ *
+ * @name select
+ * @type jQuery
+ * @cat Plugins/Form
+ */
+$.fn.enable = function(b) { 
+    if (b == undefined) b = true;
+    return this.each(function() { 
+        this.disabled = !b 
+    });
+};
+
+/**
+ * Checks/unchecks any matching checkboxes or radio buttons and
+ * selects/deselects and matching option elements.
+ *
+ * @example $(':checkbox').selected();
+ * @desc Checks all checkboxes
+ *
+ * @name select
+ * @type jQuery
+ * @cat Plugins/Form
+ */
+$.fn.select = function(select) {
+    if (select == undefined) select = true;
+    return this.each(function() { 
+        var t = this.type;
+        if (t == 'checkbox' || t == 'radio')
+            this.checked = select;
+        else if (this.tagName.toLowerCase() == 'option') {
+            var $sel = $(this).parent('select');
+            if (select && $sel[0] && $sel[0].type == 'select-one') {
+                // deselect all other options
+                $sel.find('option').select(false);
+            }
+            this.selected = select;
+        }
+    });
+};
+
+})(jQuery);
diff -x .svn -aruN 2.2.2.src/wp-includes/js/jquery/jquery.js 2.5.src/wp-includes/js/jquery/jquery.js
--- 2.2.2.src/wp-includes/js/jquery/jquery.js	2007-03-03 11:55:36.000000000 -0600
+++ 2.5.src/wp-includes/js/jquery/jquery.js	2008-03-02 15:34:25.000000000 -0600
@@ -1 +1,11 @@
-eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('7(1C 1w.6=="T"){1w.T=1w.T;B 6=u(a,c){7(1w==q)v 1p 6(a,c);a=a||17;7(6.1t(a))v 1p 6(17)[6.E.27?"27":"2O"](a);7(1C a=="23"){B m=/^[^<]*(<(.|\\s)+>)[^>]*$/.2Q(a);7(m)a=6.3k([m[1]]);J v 1p 6(c).2o(a)}v q.6r(a.1l==2y&&a||(a.3Y||a.I&&a!=1w&&!a.24&&a[0]!=T&&a[0].24)&&6.3M(a)||[a])};7(1C $!="T")6.2S$=$;B $=6;6.E=6.8p={3Y:"1.1.2",8q:u(){v q.I},I:0,2b:u(1T){v 1T==T?6.3M(q):q[1T]},2r:u(a){B L=6(a);L.6p=q;v L},6r:u(a){q.I=0;[].1g.14(q,a);v q},K:u(E,1E){v 6.K(q,E,1E)},2h:u(1c){B 4c=-1;q.K(u(i){7(q==1c)4c=i});v 4c},1I:u(1Y,O,C){B 1c=1Y;7(1Y.1l==3t)7(O==T)v q.I&&6[C||"1I"](q[0],1Y)||T;J{1c={};1c[1Y]=O}v q.K(u(2h){P(B H 1x 1c)6.1I(C?q.1q:q,H,6.H(q,1c[H],C,2h,H))})},1m:u(1Y,O){v q.1I(1Y,O,"30")},2L:u(e){7(1C e=="23")v q.3u().3r(17.8t(e));B t="";6.K(e||q,u(){6.K(q.2I,u(){7(q.24!=8)t+=q.24!=1?q.60:6.E.2L([q])})});v t},2K:u(){B a=6.3k(1A);v q.K(u(){B b=a[0].3l(U);q.11.2X(b,q);22(b.1b)b=b.1b;b.4C(q)})},3r:u(){v q.3j(1A,U,1,u(a){q.4C(a)})},5i:u(){v q.3j(1A,U,-1,u(a){q.2X(a,q.1b)})},5j:u(){v q.3j(1A,12,1,u(a){q.11.2X(a,q)})},5t:u(){v q.3j(1A,12,-1,u(a){q.11.2X(a,q.2e)})},4g:u(){v q.6p||6([])},2o:u(t){v q.2r(6.31(q,u(a){v 6.2o(t,a)}),t)},4Y:u(4N){v q.2r(6.31(q,u(a){B a=a.3l(4N!=T?4N:U);a.$1H=16;v a}))},1D:u(t){v q.2r(6.1t(t)&&6.2q(q,u(2z,2h){v t.14(2z,[2h])})||6.3z(t,q))},2g:u(t){v q.2r(t.1l==3t&&6.3z(t,q,U)||6.2q(q,u(a){v(t.1l==2y||t.3Y)?6.3y(a,t)<0:a!=t}))},1M:u(t){v q.2r(6.2k(q.2b(),t.1l==3t?6(t).2b():t.I!=T&&(!t.1f||t.1f=="8v")?t:[t]))},4l:u(1s){v 1s?6.1D(1s,q).r.I>0:12},1a:u(1a){v 1a==T?(q.I?q[0].O:16):q.1I("O",1a)},4U:u(1a){v 1a==T?(q.I?q[0].2t:16):q.3u().3r(1a)},3j:u(1E,1P,3Z,E){B 4Y=q.I>1;B a=6.3k(1E);7(3Z<0)a.8w();v q.K(u(){B 1c=q;7(1P&&6.1f(q,"1P")&&6.1f(a[0],"3m"))1c=q.5J("20")[0]||q.4C(17.6n("20"));6.K(a,u(){E.14(1c,[4Y?q.3l(U):q])})})}};6.1z=6.E.1z=u(){B 1O=1A[0],a=1;7(1A.I==1){1O=q;a=0}B H;22(H=1A[a++])P(B i 1x H)1O[i]=H[i];v 1O};6.1z({8x:u(){7(6.2S$)$=6.2S$;v 6},1t:u(E){v!!E&&1C E!="23"&&!E.1f&&1C E[0]=="T"&&/u/i.1n(E+"")},4B:u(D){v D.66&&D.5I&&!D.5I.64},1f:u(D,Y){v D.1f&&D.1f.3K()==Y.3K()},K:u(1c,E,1E){7(1c.I==T)P(B i 1x 1c)E.14(1c[i],1E||[i,1c[i]]);J P(B i=0,6q=1c.I;i<6q;i++)7(E.14(1c[i],1E||[i,1c[i]])===12)3O;v 1c},H:u(D,O,C,2h,H){7(6.1t(O))O=O.3n(D,[2h]);B 6s=/z-?2h|7P-?8A|1d|58|8B-?28/i;v O&&O.1l==3Q&&C=="30"&&!6s.1n(H)?O+"4S":O},19:{1M:u(D,c){6.K(c.3o(/\\s+/),u(i,Q){7(!6.19.2V(D.19,Q))D.19+=(D.19?" ":"")+Q})},2f:u(D,c){D.19=c?6.2q(D.19.3o(/\\s+/),u(Q){v!6.19.2V(c,Q)}).6t(" "):""},2V:u(t,c){t=t.19||t;c=c.1R(/([\\.\\\\\\+\\*\\?\\[\\^\\]\\$\\(\\)\\{\\}\\=\\!\\<\\>\\|\\:])/g,"\\\\$1");v t&&1p 4v("(^|\\\\s)"+c+"(\\\\s|$)").1n(t)}},4d:u(e,o,f){P(B i 1x o){e.1q["1N"+i]=e.1q[i];e.1q[i]=o[i]}f.14(e,[]);P(B i 1x o)e.1q[i]=e.1q["1N"+i]},1m:u(e,p){7(p=="28"||p=="3V"){B 1N={},46,3P,d=["7d","8C","8D","8E"];6.K(d,u(){1N["8F"+q]=0;1N["8G"+q+"8H"]=0});6.4d(e,1N,u(){7(6.1m(e,"1h")!="1Z"){46=e.8I;3P=e.8J}J{e=6(e.3l(U)).2o(":4j").5l("2Z").4g().1m({4n:"1G",45:"8K",1h:"2D",7I:"0",8M:"0"}).5z(e.11)[0];B 3d=6.1m(e.11,"45");7(3d==""||3d=="4b")e.11.1q.45="6x";46=e.6y;3P=e.6z;7(3d==""||3d=="4b")e.11.1q.45="4b";e.11.33(e)}});v p=="28"?46:3P}v 6.30(e,p)},30:u(D,H,53){B L;7(H=="1d"&&6.W.1j)v 6.1I(D.1q,"1d");7(H=="4h"||H=="2v")H=6.W.1j?"3T":"2v";7(!53&&D.1q[H])L=D.1q[H];J 7(17.44&&17.44.4W){7(H=="2v"||H=="3T")H="4h";H=H.1R(/([A-Z])/g,"-$1").4m();B Q=17.44.4W(D,16);7(Q)L=Q.55(H);J 7(H=="1h")L="1Z";J 6.4d(D,{1h:"2D"},u(){B c=17.44.4W(q,"");L=c&&c.55(H)||""})}J 7(D.51){B 56=H.1R(/\\-(\\w)/g,u(m,c){v c.3K()});L=D.51[H]||D.51[56]}v L},3k:u(a){B r=[];6.K(a,u(i,1r){7(!1r)v;7(1r.1l==3Q)1r=1r.6C();7(1C 1r=="23"){B s=6.35(1r),1V=17.6n("1V"),2i=[];B 2K=!s.18("<1u")&&[1,"<42>","</42>"]||(!s.18("<6D")||!s.18("<20")||!s.18("<6E"))&&[1,"<1P>","</1P>"]||!s.18("<3m")&&[2,"<1P><20>","</20></1P>"]||(!s.18("<6F")||!s.18("<6G"))&&[3,"<1P><20><3m>","</3m></20></1P>"]||[0,"",""];1V.2t=2K[1]+s+2K[2];22(2K[0]--)1V=1V.1b;7(6.W.1j){7(!s.18("<1P")&&s.18("<20")<0)2i=1V.1b&&1V.1b.2I;J 7(2K[1]=="<1P>"&&s.18("<20")<0)2i=1V.2I;P(B n=2i.I-1;n>=0;--n)7(6.1f(2i[n],"20")&&!2i[n].2I.I)2i[n].11.33(2i[n])}1r=[];P(B i=0,l=1V.2I.I;i<l;i++)1r.1g(1V.2I[i])}7(1r.I===0&&!6.1f(1r,"3w"))v;7(1r[0]==T||6.1f(1r,"3w"))r.1g(1r);J r=6.2k(r,1r)});v r},1I:u(D,Y,O){B 2j=6.4B(D)?{}:{"P":"6J","6L":"19","4h":6.W.1j?"3T":"2v",2v:6.W.1j?"3T":"2v",2t:"2t",19:"19",O:"O",2W:"2W",2Z:"2Z",89:"6N",2Y:"2Y"};7(Y=="1d"&&6.W.1j&&O!=T){D.58=1;v D.1D=D.1D.1R(/4i\\([^\\)]*\\)/6O,"")+(O==1?"":"4i(1d="+O*6g+")")}J 7(Y=="1d"&&6.W.1j)v D.1D?4T(D.1D.6P(/4i\\(1d=(.*)\\)/)[1])/6g:1;7(Y=="1d"&&6.W.3h&&O==1)O=0.6R;7(2j[Y]){7(O!=T)D[2j[Y]]=O;v D[2j[Y]]}J 7(O==T&&6.W.1j&&6.1f(D,"3w")&&(Y=="81"||Y=="80"))v D.6T(Y).60;J 7(D.66){7(O!=T)D.6V(Y,O);7(6.W.1j&&/5E|3e/.1n(Y)&&!6.4B(D))v D.36(Y,2);v D.36(Y)}J{Y=Y.1R(/-([a-z])/6W,u(z,b){v b.3K()});7(O!=T)D[Y]=O;v D[Y]}},35:u(t){v t.1R(/^\\s+|\\s+$/g,"")},3M:u(a){B r=[];7(a.1l!=2y)P(B i=0,2R=a.I;i<2R;i++)r.1g(a[i]);J r=a.3N(0);v r},3y:u(b,a){P(B i=0,2R=a.I;i<2R;i++)7(a[i]==b)v i;v-1},2k:u(2u,3H){B r=[].3N.3n(2u,0);P(B i=0,5b=3H.I;i<5b;i++)7(6.3y(3H[i],r)==-1)2u.1g(3H[i]);v 2u},2q:u(1U,E,4k){7(1C E=="23")E=1p 4w("a","i","v "+E);B 1i=[];P(B i=0,2z=1U.I;i<2z;i++)7(!4k&&E(1U[i],i)||4k&&!E(1U[i],i))1i.1g(1U[i]);v 1i},31:u(1U,E){7(1C E=="23")E=1p 4w("a","v "+E);B 1i=[],r=[];P(B i=0,2z=1U.I;i<2z;i++){B 1a=E(1U[i],i);7(1a!==16&&1a!=T){7(1a.1l!=2y)1a=[1a];1i=1i.6Z(1a)}}B r=1i.I?[1i[0]]:[];5f:P(B i=1,5e=1i.I;i<5e;i++){P(B j=0;j<i;j++)7(1i[i]==r[j])5F 5f;r.1g(1i[i])}v r}});1p u(){B b=7L.71.4m();6.W={2N:/5D/.1n(b),3f:/3f/.1n(b),1j:/1j/.1n(b)&&!/3f/.1n(b),3h:/3h/.1n(b)&&!/(72|5D)/.1n(b)};6.7H=!6.W.1j||17.74=="75"};6.K({5u:"a.11",4z:"6.4z(a)",76:"6.2a(a,2,\'2e\')",7D:"6.2a(a,2,\'5s\')",78:"6.2B(a.11.1b,a)",79:"6.2B(a.1b)"},u(i,n){6.E[i]=u(a){B L=6.31(q,n);7(a&&1C a=="23")L=6.3z(a,L);v q.2r(L)}});6.K({5z:"3r",7b:"5i",2X:"5j",7e:"5t"},u(i,n){6.E[i]=u(){B a=1A;v q.K(u(){P(B j=0,2R=a.I;j<2R;j++)6(a[j])[n](q)})}});6.K({5l:u(1Y){6.1I(q,1Y,"");q.7g(1Y)},7h:u(c){6.19.1M(q,c)},7i:u(c){6.19.2f(q,c)},7k:u(c){6.19[6.19.2V(q,c)?"2f":"1M"](q,c)},2f:u(a){7(!a||6.1D(a,[q]).r.I)q.11.33(q)},3u:u(){22(q.1b)q.33(q.1b)}},u(i,n){6.E[i]=u(){v q.K(n,1A)}});6.K(["5q","5n","5p","5v"],u(i,n){6.E[n]=u(1T,E){v q.1D(":"+n+"("+1T+")",E)}});6.K(["28","3V"],u(i,n){6.E[n]=u(h){v h==T?(q.I?6.1m(q[0],n):16):q.1m(n,h.1l==3t?h:h+"4S")}});6.1z({1s:{"":"m[2]==\'*\'||6.1f(a,m[2])","#":"a.36(\'2J\')==m[2]",":":{5n:"i<m[3]-0",5p:"i>m[3]-0",2a:"m[3]-0==i",5q:"m[3]-0==i",2u:"i==0",2T:"i==r.I-1",5R:"i%2==0",5S:"i%2","2a-3s":"6.2a(a.11.1b,m[3],\'2e\',a)==a","2u-3s":"6.2a(a.11.1b,1,\'2e\')==a","2T-3s":"6.2a(a.11.7n,1,\'5s\')==a","7p-3s":"6.2B(a.11.1b).I==1",5u:"a.1b",3u:"!a.1b",5v:"6.E.2L.14([a]).18(m[3])>=0",3i:\'a.C!="1G"&&6.1m(a,"1h")!="1Z"&&6.1m(a,"4n")!="1G"\',1G:\'a.C=="1G"||6.1m(a,"1h")=="1Z"||6.1m(a,"4n")=="1G"\',7v:"!a.2W",2W:"a.2W",2Z:"a.2Z",2Y:"a.2Y||6.1I(a,\'2Y\')",2L:"a.C==\'2L\'",4j:"a.C==\'4j\'",5x:"a.C==\'5x\'",4G:"a.C==\'4G\'",5y:"a.C==\'5y\'",4R:"a.C==\'4R\'",5A:"a.C==\'5A\'",5B:"a.C==\'5B\'",3x:\'a.C=="3x"||6.1f(a,"3x")\',5C:"/5C|42|7A|3x/i.1n(a.1f)"},".":"6.19.2V(a,m[2])","@":{"=":"z==m[4]","!=":"z!=m[4]","^=":"z&&!z.18(m[4])","$=":"z&&z.2U(z.I - m[4].I,m[4].I)==m[4]","*=":"z&&z.18(m[4])>=0","":"z",4u:u(m){v["",m[1],m[3],m[2],m[5]]},5P:"z=a[m[3]];7(!z||/5E|3e/.1n(m[3]))z=6.1I(a,m[3]);"},"[":"6.2o(m[2],a).I"},5M:[/^\\[ *(@)([a-2m-3C-]*) *([!*$^=]*) *(\'?"?)(.*?)\\4 *\\]/i,/^(\\[)\\s*(.*?(\\[.*?\\])?[^[]*?)\\s*\\]/,/^(:)([a-2m-3C-]*)\\("?\'?(.*?(\\(.*?\\))?[^(]*?)"?\'?\\)/i,/^([:.#]*)([a-2m-3C*-]*)/i],1Q:[/^(\\/?\\.\\.)/,"a.11",/^(>|\\/)/,"6.2B(a.1b)",/^(\\+)/,"6.2a(a,2,\'2e\')",/^(~)/,u(a){B s=6.2B(a.11.1b);v s.3N(6.3y(a,s)+1)}],3z:u(1s,1U,2g){B 1N,Q=[];22(1s&&1s!=1N){1N=1s;B f=6.1D(1s,1U,2g);1s=f.t.1R(/^\\s*,\\s*/,"");Q=2g?1U=f.r:6.2k(Q,f.r)}v Q},2o:u(t,1B){7(1C t!="23")v[t];7(1B&&!1B.24)1B=16;1B=1B||17;7(!t.18("//")){1B=1B.4H;t=t.2U(2,t.I)}J 7(!t.18("/")){1B=1B.4H;t=t.2U(1,t.I);7(t.18("/")>=1)t=t.2U(t.18("/"),t.I)}B L=[1B],2c=[],2T=16;22(t&&2T!=t){B r=[];2T=t;t=6.35(t).1R(/^\\/\\//i,"");B 3B=12;B 1J=/^[\\/>]\\s*([a-2m-9*-]+)/i;B m=1J.2Q(t);7(m){6.K(L,u(){P(B c=q.1b;c;c=c.2e)7(c.24==1&&(6.1f(c,m[1])||m[1]=="*"))r.1g(c)});L=r;t=t.1R(1J,"");7(t.18(" ")==0)5F;3B=U}J{P(B i=0;i<6.1Q.I;i+=2){B 1J=6.1Q[i];B m=1J.2Q(t);7(m){r=L=6.31(L,6.1t(6.1Q[i+1])?6.1Q[i+1]:u(a){v 40(6.1Q[i+1])});t=6.35(t.1R(1J,""));3B=U;3O}}}7(t&&!3B){7(!t.18(",")){7(L[0]==1B)L.4L();6.2k(2c,L);r=L=[1B];t=" "+t.2U(1,t.I)}J{B 34=/^([a-2m-3C-]+)(#)([a-2m-9\\\\*2S-]*)/i;B m=34.2Q(t);7(m){m=[0,m[2],m[3],m[1]]}J{34=/^([#.]?)([a-2m-9\\\\*2S-]*)/i;m=34.2Q(t)}7(m[1]=="#"&&L[L.I-1].4X){B 2l=L[L.I-1].4X(m[2]);7(6.W.1j&&2l&&2l.2J!=m[2])2l=6(\'[@2J="\'+m[2]+\'"]\',L[L.I-1])[0];L=r=2l&&(!m[3]||6.1f(2l,m[3]))?[2l]:[]}J{7(m[1]==".")B 4r=1p 4v("(^|\\\\s)"+m[2]+"(\\\\s|$)");6.K(L,u(){B 3E=m[1]!=""||m[0]==""?"*":m[2];7(6.1f(q,"7J")&&3E=="*")3E="3g";6.2k(r,m[1]!=""&&L.I!=1?6.4x(q,[],m[1],m[2],4r):q.5J(3E))});7(m[1]=="."&&L.I==1)r=6.2q(r,u(e){v 4r.1n(e.19)});7(m[1]=="#"&&L.I==1){B 5K=r;r=[];6.K(5K,u(){7(q.36("2J")==m[2]){r=[q];v 12}})}L=r}t=t.1R(34,"")}}7(t){B 1a=6.1D(t,r);L=r=1a.r;t=6.35(1a.t)}}7(L&&L[0]==1B)L.4L();6.2k(2c,L);v 2c},1D:u(t,r,2g){22(t&&/^[a-z[({<*:.#]/i.1n(t)){B p=6.5M,m;6.K(p,u(i,1J){m=1J.2Q(t);7(m){t=t.7M(m[0].I);7(6.1s[m[1]].4u)m=6.1s[m[1]].4u(m);v 12}});7(m[1]==":"&&m[2]=="2g")r=6.1D(m[3],r,U).r;J 7(m[1]=="."){B 1J=1p 4v("(^|\\\\s)"+m[2]+"(\\\\s|$)");r=6.2q(r,u(e){v 1J.1n(e.19||"")},2g)}J{B f=6.1s[m[1]];7(1C f!="23")f=6.1s[m[1]][m[2]];40("f = u(a,i){"+(6.1s[m[1]].5P||"")+"v "+f+"}");r=6.2q(r,f,2g)}}v{r:r,t:t}},4x:u(o,r,1Q,Y,1J){P(B s=o.1b;s;s=s.2e)7(s.24==1){B 1M=U;7(1Q==".")1M=s.19&&1J.1n(s.19);J 7(1Q=="#")1M=s.36("2J")==Y;7(1M)r.1g(s);7(1Q=="#"&&r.I)3O;7(s.1b)6.4x(s,r,1Q,Y,1J)}v r},4z:u(D){B 4A=[];B Q=D.11;22(Q&&Q!=17){4A.1g(Q);Q=Q.11}v 4A},2a:u(Q,1i,3Z,D){1i=1i||1;B 1T=0;P(;Q;Q=Q[3Z]){7(Q.24==1)1T++;7(1T==1i||1i=="5R"&&1T%2==0&&1T>1&&Q==D||1i=="5S"&&1T%2==1&&Q==D)v Q}},2B:u(n,D){B r=[];P(;n;n=n.2e){7(n.24==1&&(!D||n!=D))r.1g(n)}v r}});6.G={1M:u(S,C,1o,F){7(6.W.1j&&S.3L!=T)S=1w;7(F)1o.F=F;7(!1o.2A)1o.2A=q.2A++;7(!S.$1H)S.$1H={};B 38=S.$1H[C];7(!38){38=S.$1H[C]={};7(S["39"+C])38[0]=S["39"+C]}38[1o.2A]=1o;S["39"+C]=q.5Y;7(!q.1k[C])q.1k[C]=[];q.1k[C].1g(S)},2A:1,1k:{},2f:u(S,C,1o){7(S.$1H){B i,j,k;7(C&&C.C){1o=C.1o;C=C.C}7(C&&S.$1H[C])7(1o)5U S.$1H[C][1o.2A];J P(i 1x S.$1H[C])5U S.$1H[C][i];J P(j 1x S.$1H)q.2f(S,j);P(k 1x S.$1H[C])7(k){k=U;3O}7(!k)S["39"+C]=16}},1S:u(C,F,S){F=6.3M(F||[]);7(!S)6.K(q.1k[C]||[],u(){6.G.1S(C,F,q)});J{B 1o=S["39"+C],1a,E=6.1t(S[C]);7(1o){F.61(q.2j({C:C,1O:S}));7((1a=1o.14(S,F))!==12)q.4F=U}7(E&&1a!==12)S[C]();q.4F=12}},5Y:u(G){7(1C 6=="T"||6.G.4F)v;G=6.G.2j(G||1w.G||{});B 3R;B c=q.$1H[G.C];B 1E=[].3N.3n(1A,1);1E.61(G);P(B j 1x c){1E[0].1o=c[j];1E[0].F=c[j].F;7(c[j].14(q,1E)===12){G.2n();G.2H();3R=12}}7(6.W.1j)G.1O=G.2n=G.2H=G.1o=G.F=16;v 3R},2j:u(G){7(!G.1O&&G.63)G.1O=G.63;7(G.65==T&&G.67!=T){B e=17.4H,b=17.64;G.65=G.67+(e.68||b.68);G.7Y=G.7Z+(e.6c||b.6c)}7(6.W.2N&&G.1O.24==3){B 3a=G;G=6.1z({},3a);G.1O=3a.1O.11;G.2n=u(){v 3a.2n()};G.2H=u(){v 3a.2H()}}7(!G.2n)G.2n=u(){q.3R=12};7(!G.2H)G.2H=u(){q.82=U};v G}};6.E.1z({3U:u(C,F,E){v q.K(u(){6.G.1M(q,C,E||F,F)})},6u:u(C,F,E){v q.K(u(){6.G.1M(q,C,u(G){6(q).6f(G);v(E||F).14(q,1A)},F)})},6f:u(C,E){v q.K(u(){6.G.2f(q,C,E)})},1S:u(C,F){v q.K(u(){6.G.1S(C,F,q)})},3X:u(){B a=1A;v q.6j(u(e){q.4M=q.4M==0?1:0;e.2n();v a[q.4M].14(q,[e])||12})},83:u(f,g){u 4O(e){B p=(e.C=="41"?e.84:e.85)||e.86;22(p&&p!=q)2G{p=p.11}2w(e){p=q};7(p==q)v 12;v(e.C=="41"?f:g).14(q,[e])}v q.41(4O).6k(4O)},27:u(f){7(6.3W)f.14(17,[6]);J{6.3c.1g(u(){v f.14(q,[6])})}v q}});6.1z({3W:12,3c:[],27:u(){7(!6.3W){6.3W=U;7(6.3c){6.K(6.3c,u(){q.14(17)});6.3c=16}7(6.W.3h||6.W.3f)17.87("6o",6.27,12)}}});1p u(){6.K(("88,8a,2O,8b,8d,52,6j,8e,"+"8f,8g,8h,41,6k,8j,42,"+"4R,8k,8l,8m,2C").3o(","),u(i,o){6.E[o]=u(f){v f?q.3U(o,f):q.1S(o)}});7(6.W.3h||6.W.3f)17.8n("6o",6.27,12);J 7(6.W.1j){17.8o("<8r"+"8s 2J=62 8u=U "+"3e=//:><\\/2d>");B 2d=17.4X("62");7(2d)2d.37=u(){7(q.3D!="1X")v;q.11.33(q);6.27()};2d=16}J 7(6.W.2N)6.50=3L(u(){7(17.3D=="8y"||17.3D=="1X"){4p(6.50);6.50=16;6.27()}},10);6.G.1M(1w,"2O",6.27)};7(6.W.1j)6(1w).6u("52",u(){B 1k=6.G.1k;P(B C 1x 1k){B 4Z=1k[C],i=4Z.I;7(i&&C!=\'52\')6w 6.G.2f(4Z[i-1],C);22(--i)}});6.E.1z({6A:u(V,21,M){q.2O(V,21,M,1)},2O:u(V,21,M,1W){7(6.1t(V))v q.3U("2O",V);M=M||u(){};B C="5d";7(21)7(6.1t(21)){M=21;21=16}J{21=6.3g(21);C="5V"}B 4e=q;6.3v({V:V,C:C,F:21,1W:1W,1X:u(2P,15){7(15=="2M"||!1W&&15=="5L")4e.1I("2t",2P.3G).4V().K(M,[2P.3G,15,2P]);J M.14(4e,[2P.3G,15,2P])}});v q},6B:u(){v 6.3g(q)},4V:u(){v q.2o("2d").K(u(){7(q.3e)6.59(q.3e);J 6.4a(q.2L||q.6H||q.2t||"")}).4g()}});7(!1w.3p)3p=u(){v 1p 6I("6K.6M")};6.K("5m,5Q,5O,5W,5N,5H".3o(","),u(i,o){6.E[o]=u(f){v q.3U(o,f)}});6.1z({2b:u(V,F,M,C,1W){7(6.1t(F)){M=F;F=16}v 6.3v({V:V,F:F,2M:M,4t:C,1W:1W})},6Q:u(V,F,M,C){v 6.2b(V,F,M,C,1)},59:u(V,M){v 6.2b(V,16,M,"2d")},6S:u(V,F,M){v 6.2b(V,F,M,"6m")},6U:u(V,F,M,C){7(6.1t(F)){M=F;F={}}v 6.3v({C:"5V",V:V,F:F,2M:M,4t:C})},6X:u(29){6.3q.29=29},6Y:u(5c){6.1z(6.3q,5c)},3q:{1k:U,C:"5d",29:0,5r:"70/x-73-3w-77",5h:U,48:U,F:16},3S:{},3v:u(s){s=6.1z({},6.3q,s);7(s.F){7(s.5h&&1C s.F!="23")s.F=6.3g(s.F);7(s.C.4m()=="2b"){s.V+=((s.V.18("?")>-1)?"&":"?")+s.F;s.F=16}}7(s.1k&&!6.4E++)6.G.1S("5m");B 4y=12;B N=1p 3p();N.7j(s.C,s.V,s.48);7(s.F)N.3A("7l-7m",s.5r);7(s.1W)N.3A("7o-4K-7q",6.3S[s.V]||"7s, 7t 7w 7x 4o:4o:4o 7z");N.3A("X-7B-7C","3p");7(N.7E)N.3A("7F","7G");7(s.5G)s.5G(N);7(s.1k)6.G.1S("5H",[N,s]);B 37=u(4s){7(N&&(N.3D==4||4s=="29")){4y=U;7(3I){4p(3I);3I=16}B 15;2G{15=6.5Z(N)&&4s!="29"?s.1W&&6.69(N,s.V)?"5L":"2M":"2C";7(15!="2C"){B 3F;2G{3F=N.4P("6b-4K")}2w(e){}7(s.1W&&3F)6.3S[s.V]=3F;B F=6.6i(N,s.4t);7(s.2M)s.2M(F,15);7(s.1k)6.G.1S("5N",[N,s])}J 6.3J(s,N,15)}2w(e){15="2C";6.3J(s,N,15,e)}7(s.1k)6.G.1S("5O",[N,s]);7(s.1k&&!--6.4E)6.G.1S("5Q");7(s.1X)s.1X(N,15);7(s.48)N=16}};B 3I=3L(37,13);7(s.29>0)57(u(){7(N){N.7N();7(!4y)37("29")}},s.29);2G{N.7Q(s.F)}2w(e){6.3J(s,N,16,e)}7(!s.48)37();v N},3J:u(s,N,15,e){7(s.2C)s.2C(N,15,e);7(s.1k)6.G.1S("5W",[N,s,e])},4E:0,5Z:u(r){2G{v!r.15&&7V.7W=="4G:"||(r.15>=5X&&r.15<7X)||r.15==6d||6.W.2N&&r.15==T}2w(e){}v 12},69:u(N,V){2G{B 6e=N.4P("6b-4K");v N.15==6d||6e==6.3S[V]||6.W.2N&&N.15==T}2w(e){}v 12},6i:u(r,C){B 4Q=r.4P("8c-C");B F=!C&&4Q&&4Q.18("N")>=0;F=C=="N"||F?r.8i:r.3G;7(C=="2d")6.4a(F);7(C=="6m")40("F = "+F);7(C=="4U")6("<1V>").4U(F).4V();v F},3g:u(a){B s=[];7(a.1l==2y||a.3Y)6.K(a,u(){s.1g(2x(q.Y)+"="+2x(q.O))});J P(B j 1x a)7(a[j]&&a[j].1l==2y)6.K(a[j],u(){s.1g(2x(j)+"="+2x(q))});J s.1g(2x(j)+"="+2x(a[j]));v s.6t("&")},4a:u(F){7(1w.54)1w.54(F);J 7(6.W.2N)1w.57(F,0);J 40.3n(1w,F)}});6.E.1z({1L:u(R,M){B 1G=q.1D(":1G");R?1G.26({28:"1L",3V:"1L",1d:"1L"},R,M):1G.K(u(){q.1q.1h=q.2E?q.2E:"";7(6.1m(q,"1h")=="1Z")q.1q.1h="2D"});v q},1K:u(R,M){B 3i=q.1D(":3i");R?3i.26({28:"1K",3V:"1K",1d:"1K"},R,M):3i.K(u(){q.2E=q.2E||6.1m(q,"1h");7(q.2E=="1Z")q.2E="2D";q.1q.1h="1Z"});v q},5g:6.E.3X,3X:u(E,4I){B 1E=1A;v 6.1t(E)&&6.1t(4I)?q.5g(E,4I):q.K(u(){6(q)[6(q).4l(":1G")?"1L":"1K"].14(6(q),1E)})},7a:u(R,M){v q.26({28:"1L"},R,M)},7c:u(R,M){v q.26({28:"1K"},R,M)},7f:u(R,M){v q.K(u(){B 5k=6(q).4l(":1G")?"1L":"1K";6(q).26({28:5k},R,M)})},7r:u(R,M){v q.26({1d:"1L"},R,M)},7u:u(R,M){v q.26({1d:"1K"},R,M)},7y:u(R,43,M){v q.26({1d:43},R,M)},26:u(H,R,1v,M){v q.1F(u(){q.2F=6.1z({},H);B 1u=6.R(R,1v,M);P(B p 1x H){B e=1p 6.3b(q,1u,p);7(H[p].1l==3Q)e.2s(e.Q(),H[p]);J e[H[p]](H)}})},1F:u(C,E){7(!E){E=C;C="3b"}v q.K(u(){7(!q.1F)q.1F={};7(!q.1F[C])q.1F[C]=[];q.1F[C].1g(E);7(q.1F[C].I==1)E.14(q)})}});6.1z({R:u(R,1v,E){B 1u=R&&R.1l==7K?R:{1X:E||!E&&1v||6.1t(R)&&R,25:R,1v:E&&1v||1v&&1v.1l!=4w&&1v};1u.25=(1u.25&&1u.25.1l==3Q?1u.25:{7R:7S,7T:5X}[1u.25])||7U;1u.1N=1u.1X;1u.1X=u(){6.6a(q,"3b");7(6.1t(1u.1N))1u.1N.14(q)};v 1u},1v:{},1F:{},6a:u(D,C){C=C||"3b";7(D.1F&&D.1F[C]){D.1F[C].4L();B f=D.1F[C][0];7(f)f.14(D)}},3b:u(D,1e,H){B z=q;B y=D.1q;B 4D=6.1m(D,"1h");y.5T="1G";z.a=u(){7(1e.49)1e.49.14(D,[z.2p]);7(H=="1d")6.1I(y,"1d",z.2p);J 7(6l(z.2p))y[H]=6l(z.2p)+"4S";y.1h="2D"};z.6v=u(){v 4T(6.1m(D,H))};z.Q=u(){B r=4T(6.30(D,H));v r&&r>-8z?r:z.6v()};z.2s=u(4f,43){z.4J=(1p 5o()).5w();z.2p=4f;z.a();z.4q=3L(u(){z.49(4f,43)},13)};z.1L=u(){7(!D.1y)D.1y={};D.1y[H]=q.Q();1e.1L=U;z.2s(0,D.1y[H]);7(H!="1d")y[H]="5a"};z.1K=u(){7(!D.1y)D.1y={};D.1y[H]=q.Q();1e.1K=U;z.2s(D.1y[H],0)};z.3X=u(){7(!D.1y)D.1y={};D.1y[H]=q.Q();7(4D=="1Z"){1e.1L=U;7(H!="1d")y[H]="5a";z.2s(0,D.1y[H])}J{1e.1K=U;z.2s(D.1y[H],0)}};z.49=u(32,47){B t=(1p 5o()).5w();7(t>1e.25+z.4J){4p(z.4q);z.4q=16;z.2p=47;z.a();7(D.2F)D.2F[H]=U;B 2c=U;P(B i 1x D.2F)7(D.2F[i]!==U)2c=12;7(2c){y.5T="";y.1h=4D;7(6.1m(D,"1h")=="1Z")y.1h="2D";7(1e.1K)y.1h="1Z";7(1e.1K||1e.1L)P(B p 1x D.2F)7(p=="1d")6.1I(y,p,D.1y[p]);J y[p]=""}7(2c&&6.1t(1e.1X))1e.1X.14(D)}J{B n=t-q.4J;B p=n/1e.25;z.2p=1e.1v&&6.1v[1e.1v]?6.1v[1e.1v](p,n,32,(47-32),1e.25):((-6h.7O(p*6h.8L)/2)+0.5)*(47-32)+32;z.a()}}}})}',62,545,'||||||jQuery|if|||||||||||||||||||this||||function|return||||||var|type|elem|fn|data|event|prop|length|else|each|ret|callback|xml|value|for|cur|speed|element|undefined|true|url|browser||name|||parentNode|false||apply|status|null|document|indexOf|className|val|firstChild|obj|opacity|options|nodeName|push|display|result|msie|global|constructor|css|test|handler|new|style|arg|expr|isFunction|opt|easing|window|in|orig|extend|arguments|context|typeof|filter|args|queue|hidden|events|attr|re|hide|show|add|old|target|table|token|replace|trigger|num|elems|div|ifModified|complete|key|none|tbody|params|while|string|nodeType|duration|animate|ready|height|timeout|nth|get|done|script|nextSibling|remove|not|index|tb|fix|merge|oid|z0|preventDefault|find|now|grep|pushStack|custom|innerHTML|first|cssFloat|catch|encodeURIComponent|Array|el|guid|sibling|error|block|oldblock|curAnim|try|stopPropagation|childNodes|id|wrap|text|success|safari|load|res|exec|al|_|last|substr|has|disabled|insertBefore|selected|checked|curCSS|map|firstNum|removeChild|re2|trim|getAttribute|onreadystatechange|handlers|on|originalEvent|fx|readyList|parPos|src|opera|param|mozilla|visible|domManip|clean|cloneNode|tr|call|split|XMLHttpRequest|ajaxSettings|append|child|String|empty|ajax|form|button|inArray|multiFilter|setRequestHeader|foundToken|9_|readyState|tag|modRes|responseText|second|ival|handleError|toUpperCase|setInterval|makeArray|slice|break|oWidth|Number|returnValue|lastModified|styleFloat|bind|width|isReady|toggle|jquery|dir|eval|mouseover|select|to|defaultView|position|oHeight|lastNum|async|step|globalEval|static|pos|swap|self|from|end|float|alpha|radio|inv|is|toLowerCase|visibility|00|clearInterval|timer|rec|isTimeout|dataType|_resort|RegExp|Function|getAll|requestDone|parents|matched|isXMLDoc|appendChild|oldDisplay|active|triggered|file|documentElement|fn2|startTime|Modified|shift|lastToggle|deep|handleHover|getResponseHeader|ct|submit|px|parseFloat|html|evalScripts|getComputedStyle|getElementById|clone|els|safariTimer|currentStyle|unload|force|execScript|getPropertyValue|newProp|setTimeout|zoom|getScript|1px|sl|settings|GET|rl|check|_toggle|processData|prepend|before|state|removeAttr|ajaxStart|lt|Date|gt|eq|contentType|previousSibling|after|parent|contains|getTime|checkbox|password|appendTo|image|reset|input|webkit|href|continue|beforeSend|ajaxSend|ownerDocument|getElementsByTagName|tmp|notmodified|parse|ajaxSuccess|ajaxComplete|_prefix|ajaxStop|even|odd|overflow|delete|POST|ajaxError|200|handle|httpSuccess|nodeValue|unshift|__ie_init|srcElement|body|pageX|tagName|clientX|scrollLeft|httpNotModified|dequeue|Last|scrollTop|304|xmlRes|unbind|100|Math|httpData|click|mouseout|parseInt|json|createElement|DOMContentLoaded|prevObject|ol|setArray|exclude|join|one|max|do|relative|clientHeight|clientWidth|loadIfModified|serialize|toString|thead|tfoot|td|th|textContent|ActiveXObject|htmlFor|Microsoft|class|XMLHTTP|readOnly|gi|match|getIfModified|9999|getJSON|getAttributeNode|post|setAttribute|ig|ajaxTimeout|ajaxSetup|concat|application|userAgent|compatible|www|compatMode|CSS1Compat|next|urlencoded|siblings|children|slideDown|prependTo|slideUp|Top|insertAfter|slideToggle|removeAttribute|addClass|removeClass|open|toggleClass|Content|Type|lastChild|If|only|Since|fadeIn|Thu|01|fadeOut|enabled|Jan|1970|fadeTo|GMT|textarea|Requested|With|prev|overrideMimeType|Connection|close|boxModel|right|object|Object|navigator|substring|abort|cos|font|send|slow|600|fast|400|location|protocol|300|pageY|clientY|method|action|cancelBubble|hover|fromElement|toElement|relatedTarget|removeEventListener|blur|readonly|focus|resize|content|scroll|dblclick|mousedown|mouseup|mousemove|responseXML|change|keydown|keypress|keyup|addEventListener|write|prototype|size|scr|ipt|createTextNode|defer|FORM|reverse|noConflict|loaded|10000|weight|line|Bottom|Right|Left|padding|border|Width|offsetHeight|offsetWidth|absolute|PI|left'.split('|'),0,{}));jQuery.noConflict();
+/*
+ * jQuery 1.2.3 - New Wave Javascript
+ *
+ * Copyright (c) 2008 John Resig (jquery.com)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * $Date: 2008-02-06 00:21:25 -0500 (Wed, 06 Feb 2008) $
+ * $Rev: 4663 $
+ */
+eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(J(){7(1e.3N)L w=1e.3N;L E=1e.3N=J(a,b){K 1B E.2l.4T(a,b)};7(1e.$)L D=1e.$;1e.$=E;L u=/^[^<]*(<(.|\\s)+>)[^>]*$|^#(\\w+)$/;L G=/^.[^:#\\[\\.]*$/;E.1n=E.2l={4T:J(d,b){d=d||T;7(d.15){6[0]=d;6.M=1;K 6}N 7(1o d=="25"){L c=u.2O(d);7(c&&(c[1]||!b)){7(c[1])d=E.4a([c[1]],b);N{L a=T.5J(c[3]);7(a)7(a.2w!=c[3])K E().2s(d);N{6[0]=a;6.M=1;K 6}N d=[]}}N K 1B E(b).2s(d)}N 7(E.1q(d))K 1B E(T)[E.1n.21?"21":"3U"](d);K 6.6E(d.1k==1M&&d||(d.5h||d.M&&d!=1e&&!d.15&&d[0]!=10&&d[0].15)&&E.2I(d)||[d])},5h:"1.2.3",87:J(){K 6.M},M:0,22:J(a){K a==10?E.2I(6):6[a]},2F:J(b){L a=E(b);a.54=6;K a},6E:J(a){6.M=0;1M.2l.1g.1i(6,a);K 6},R:J(a,b){K E.R(6,a,b)},4X:J(b){L a=-1;6.R(J(i){7(6==b)a=i});K a},1J:J(c,a,b){L d=c;7(c.1k==4e)7(a==10)K 6.M&&E[b||"1J"](6[0],c)||10;N{d={};d[c]=a}K 6.R(J(i){Q(c 1p d)E.1J(b?6.W:6,c,E.1l(6,d[c],b,i,c))})},1j:J(b,a){7((b==\'27\'||b==\'1R\')&&2M(a)<0)a=10;K 6.1J(b,a,"2o")},1u:J(b){7(1o b!="3V"&&b!=V)K 6.4x().3t((6[0]&&6[0].2i||T).5r(b));L a="";E.R(b||6,J(){E.R(6.3p,J(){7(6.15!=8)a+=6.15!=1?6.6K:E.1n.1u([6])})});K a},5m:J(b){7(6[0])E(b,6[0].2i).5k().3o(6[0]).2c(J(){L a=6;2b(a.1C)a=a.1C;K a}).3t(6);K 6},8w:J(a){K 6.R(J(){E(6).6z().5m(a)})},8p:J(a){K 6.R(J(){E(6).5m(a)})},3t:J(){K 6.3O(18,P,S,J(a){7(6.15==1)6.38(a)})},6q:J(){K 6.3O(18,P,P,J(a){7(6.15==1)6.3o(a,6.1C)})},6o:J(){K 6.3O(18,S,S,J(a){6.1a.3o(a,6)})},5a:J(){K 6.3O(18,S,P,J(a){6.1a.3o(a,6.2B)})},3h:J(){K 6.54||E([])},2s:J(b){L c=E.2c(6,J(a){K E.2s(b,a)});K 6.2F(/[^+>] [^+>]/.17(b)||b.1f("..")>-1?E.57(c):c)},5k:J(e){L f=6.2c(J(){7(E.14.1d&&!E.3E(6)){L a=6.69(P),4Y=T.3s("1x");4Y.38(a);K E.4a([4Y.3d])[0]}N K 6.69(P)});L d=f.2s("*").4R().R(J(){7(6[F]!=10)6[F]=V});7(e===P)6.2s("*").4R().R(J(i){7(6.15==3)K;L c=E.O(6,"2R");Q(L a 1p c)Q(L b 1p c[a])E.16.1b(d[i],a,c[a][b],c[a][b].O)});K f},1E:J(b){K 6.2F(E.1q(b)&&E.3y(6,J(a,i){K b.1P(a,i)})||E.3e(b,6))},56:J(b){7(b.1k==4e)7(G.17(b))K 6.2F(E.3e(b,6,P));N b=E.3e(b,6);L a=b.M&&b[b.M-1]!==10&&!b.15;K 6.1E(J(){K a?E.33(6,b)<0:6!=b})},1b:J(a){K!a?6:6.2F(E.37(6.22(),a.1k==4e?E(a).22():a.M!=10&&(!a.12||E.12(a,"3u"))?a:[a]))},3H:J(a){K a?E.3e(a,6).M>0:S},7j:J(a){K 6.3H("."+a)},5O:J(b){7(b==10){7(6.M){L c=6[0];7(E.12(c,"2k")){L e=c.3T,5I=[],11=c.11,2X=c.U=="2k-2X";7(e<0)K V;Q(L i=2X?e:0,2f=2X?e+1:11.M;i<2f;i++){L d=11[i];7(d.2p){b=E.14.1d&&!d.9J.1A.9y?d.1u:d.1A;7(2X)K b;5I.1g(b)}}K 5I}N K(6[0].1A||"").1r(/\\r/g,"")}K 10}K 6.R(J(){7(6.15!=1)K;7(b.1k==1M&&/5u|5t/.17(6.U))6.3k=(E.33(6.1A,b)>=0||E.33(6.31,b)>=0);N 7(E.12(6,"2k")){L a=b.1k==1M?b:[b];E("98",6).R(J(){6.2p=(E.33(6.1A,a)>=0||E.33(6.1u,a)>=0)});7(!a.M)6.3T=-1}N 6.1A=b})},3q:J(a){K a==10?(6.M?6[0].3d:V):6.4x().3t(a)},6S:J(a){K 6.5a(a).1V()},6Z:J(i){K 6.2K(i,i+1)},2K:J(){K 6.2F(1M.2l.2K.1i(6,18))},2c:J(b){K 6.2F(E.2c(6,J(a,i){K b.1P(a,i,a)}))},4R:J(){K 6.1b(6.54)},O:J(d,b){L a=d.23(".");a[1]=a[1]?"."+a[1]:"";7(b==V){L c=6.5n("8P"+a[1]+"!",[a[0]]);7(c==10&&6.M)c=E.O(6[0],d);K c==V&&a[1]?6.O(a[0]):c}N K 6.1N("8K"+a[1]+"!",[a[0],b]).R(J(){E.O(6,d,b)})},35:J(a){K 6.R(J(){E.35(6,a)})},3O:J(g,f,h,d){L e=6.M>1,3n;K 6.R(J(){7(!3n){3n=E.4a(g,6.2i);7(h)3n.8D()}L b=6;7(f&&E.12(6,"1O")&&E.12(3n[0],"4v"))b=6.3S("1U")[0]||6.38(6.2i.3s("1U"));L c=E([]);E.R(3n,J(){L a=e?E(6).5k(P)[0]:6;7(E.12(a,"1m")){c=c.1b(a)}N{7(a.15==1)c=c.1b(E("1m",a).1V());d.1P(b,a)}});c.R(6A)})}};E.2l.4T.2l=E.2l;J 6A(i,a){7(a.3Q)E.3P({1c:a.3Q,3l:S,1H:"1m"});N E.5g(a.1u||a.6x||a.3d||"");7(a.1a)a.1a.34(a)}E.1s=E.1n.1s=J(){L b=18[0]||{},i=1,M=18.M,5c=S,11;7(b.1k==8d){5c=b;b=18[1]||{};i=2}7(1o b!="3V"&&1o b!="J")b={};7(M==1){b=6;i=0}Q(;i<M;i++)7((11=18[i])!=V)Q(L a 1p 11){7(b===11[a])6w;7(5c&&11[a]&&1o 11[a]=="3V"&&b[a]&&!11[a].15)b[a]=E.1s(b[a],11[a]);N 7(11[a]!=10)b[a]=11[a]}K b};L F="3N"+(1B 3v()).3L(),6t=0,5b={};L H=/z-?4X|86-?84|1w|6k|7Z-?1R/i;E.1s({7Y:J(a){1e.$=D;7(a)1e.3N=w;K E},1q:J(a){K!!a&&1o a!="25"&&!a.12&&a.1k!=1M&&/J/i.17(a+"")},3E:J(a){K a.1F&&!a.1h||a.28&&a.2i&&!a.2i.1h},5g:J(a){a=E.3g(a);7(a){L b=T.3S("6f")[0]||T.1F,1m=T.3s("1m");1m.U="1u/4m";7(E.14.1d)1m.1u=a;N 1m.38(T.5r(a));b.38(1m);b.34(1m)}},12:J(b,a){K b.12&&b.12.2E()==a.2E()},1T:{},O:J(c,d,b){c=c==1e?5b:c;L a=c[F];7(!a)a=c[F]=++6t;7(d&&!E.1T[a])E.1T[a]={};7(b!=10)E.1T[a][d]=b;K d?E.1T[a][d]:a},35:J(c,b){c=c==1e?5b:c;L a=c[F];7(b){7(E.1T[a]){2V E.1T[a][b];b="";Q(b 1p E.1T[a])1Q;7(!b)E.35(c)}}N{1S{2V c[F]}1X(e){7(c.52)c.52(F)}2V E.1T[a]}},R:J(c,a,b){7(b){7(c.M==10){Q(L d 1p c)7(a.1i(c[d],b)===S)1Q}N Q(L i=0,M=c.M;i<M;i++)7(a.1i(c[i],b)===S)1Q}N{7(c.M==10){Q(L d 1p c)7(a.1P(c[d],d,c[d])===S)1Q}N Q(L i=0,M=c.M,1A=c[0];i<M&&a.1P(1A,i,1A)!==S;1A=c[++i]){}}K c},1l:J(b,a,c,i,d){7(E.1q(a))a=a.1P(b,i);K a&&a.1k==51&&c=="2o"&&!H.17(d)?a+"2S":a},1t:{1b:J(c,b){E.R((b||"").23(/\\s+/),J(i,a){7(c.15==1&&!E.1t.3Y(c.1t,a))c.1t+=(c.1t?" ":"")+a})},1V:J(c,b){7(c.15==1)c.1t=b!=10?E.3y(c.1t.23(/\\s+/),J(a){K!E.1t.3Y(b,a)}).6a(" "):""},3Y:J(b,a){K E.33(a,(b.1t||b).3X().23(/\\s+/))>-1}},68:J(b,c,a){L e={};Q(L d 1p c){e[d]=b.W[d];b.W[d]=c[d]}a.1P(b);Q(L d 1p c)b.W[d]=e[d]},1j:J(d,e,c){7(e=="27"||e=="1R"){L b,46={43:"4W",4U:"1Z",19:"3D"},3c=e=="27"?["7O","7M"]:["7J","7I"];J 5E(){b=e=="27"?d.7H:d.7F;L a=0,2N=0;E.R(3c,J(){a+=2M(E.2o(d,"7E"+6,P))||0;2N+=2M(E.2o(d,"2N"+6+"5X",P))||0});b-=24.7C(a+2N)}7(E(d).3H(":4d"))5E();N E.68(d,46,5E);K 24.2f(0,b)}K E.2o(d,e,c)},2o:J(e,k,j){L d;J 3x(b){7(!E.14.2d)K S;L a=T.4c.4K(b,V);K!a||a.4M("3x")==""}7(k=="1w"&&E.14.1d){d=E.1J(e.W,"1w");K d==""?"1":d}7(E.14.2z&&k=="19"){L c=e.W.50;e.W.50="0 7r 7o";e.W.50=c}7(k.1D(/4g/i))k=y;7(!j&&e.W&&e.W[k])d=e.W[k];N 7(T.4c&&T.4c.4K){7(k.1D(/4g/i))k="4g";k=k.1r(/([A-Z])/g,"-$1").2h();L h=T.4c.4K(e,V);7(h&&!3x(e))d=h.4M(k);N{L f=[],2C=[];Q(L a=e;a&&3x(a);a=a.1a)2C.4J(a);Q(L i=0;i<2C.M;i++)7(3x(2C[i])){f[i]=2C[i].W.19;2C[i].W.19="3D"}d=k=="19"&&f[2C.M-1]!=V?"2H":(h&&h.4M(k))||"";Q(L i=0;i<f.M;i++)7(f[i]!=V)2C[i].W.19=f[i]}7(k=="1w"&&d=="")d="1"}N 7(e.4n){L g=k.1r(/\\-(\\w)/g,J(a,b){K b.2E()});d=e.4n[k]||e.4n[g];7(!/^\\d+(2S)?$/i.17(d)&&/^\\d/.17(d)){L l=e.W.26,3K=e.3K.26;e.3K.26=e.4n.26;e.W.26=d||0;d=e.W.7f+"2S";e.W.26=l;e.3K.26=3K}}K d},4a:J(l,h){L k=[];h=h||T;7(1o h.3s==\'10\')h=h.2i||h[0]&&h[0].2i||T;E.R(l,J(i,d){7(!d)K;7(d.1k==51)d=d.3X();7(1o d=="25"){d=d.1r(/(<(\\w+)[^>]*?)\\/>/g,J(b,a,c){K c.1D(/^(aa|a6|7e|a5|4D|7a|a0|3m|9W|9U|9S)$/i)?b:a+"></"+c+">"});L f=E.3g(d).2h(),1x=h.3s("1x");L e=!f.1f("<9P")&&[1,"<2k 74=\'74\'>","</2k>"]||!f.1f("<9M")&&[1,"<73>","</73>"]||f.1D(/^<(9G|1U|9E|9B|9x)/)&&[1,"<1O>","</1O>"]||!f.1f("<4v")&&[2,"<1O><1U>","</1U></1O>"]||(!f.1f("<9w")||!f.1f("<9v"))&&[3,"<1O><1U><4v>","</4v></1U></1O>"]||!f.1f("<7e")&&[2,"<1O><1U></1U><6V>","</6V></1O>"]||E.14.1d&&[1,"1x<1x>","</1x>"]||[0,"",""];1x.3d=e[1]+d+e[2];2b(e[0]--)1x=1x.5o;7(E.14.1d){L g=!f.1f("<1O")&&f.1f("<1U")<0?1x.1C&&1x.1C.3p:e[1]=="<1O>"&&f.1f("<1U")<0?1x.3p:[];Q(L j=g.M-1;j>=0;--j)7(E.12(g[j],"1U")&&!g[j].3p.M)g[j].1a.34(g[j]);7(/^\\s/.17(d))1x.3o(h.5r(d.1D(/^\\s*/)[0]),1x.1C)}d=E.2I(1x.3p)}7(d.M===0&&(!E.12(d,"3u")&&!E.12(d,"2k")))K;7(d[0]==10||E.12(d,"3u")||d.11)k.1g(d);N k=E.37(k,d)});K k},1J:J(d,e,c){7(!d||d.15==3||d.15==8)K 10;L f=E.3E(d)?{}:E.46;7(e=="2p"&&E.14.2d)d.1a.3T;7(f[e]){7(c!=10)d[f[e]]=c;K d[f[e]]}N 7(E.14.1d&&e=="W")K E.1J(d.W,"9u",c);N 7(c==10&&E.14.1d&&E.12(d,"3u")&&(e=="9r"||e=="9o"))K d.9m(e).6K;N 7(d.28){7(c!=10){7(e=="U"&&E.12(d,"4D")&&d.1a)6Q"U 9i 9h\'t 9g 9e";d.9b(e,""+c)}7(E.14.1d&&/6O|3Q/.17(e)&&!E.3E(d))K d.4z(e,2);K d.4z(e)}N{7(e=="1w"&&E.14.1d){7(c!=10){d.6k=1;d.1E=(d.1E||"").1r(/6M\\([^)]*\\)/,"")+(2M(c).3X()=="96"?"":"6M(1w="+c*6L+")")}K d.1E&&d.1E.1f("1w=")>=0?(2M(d.1E.1D(/1w=([^)]*)/)[1])/6L).3X():""}e=e.1r(/-([a-z])/95,J(a,b){K b.2E()});7(c!=10)d[e]=c;K d[e]}},3g:J(a){K(a||"").1r(/^\\s+|\\s+$/g,"")},2I:J(b){L a=[];7(1o b!="93")Q(L i=0,M=b.M;i<M;i++)a.1g(b[i]);N a=b.2K(0);K a},33:J(b,a){Q(L i=0,M=a.M;i<M;i++)7(a[i]==b)K i;K-1},37:J(a,b){7(E.14.1d){Q(L i=0;b[i];i++)7(b[i].15!=8)a.1g(b[i])}N Q(L i=0;b[i];i++)a.1g(b[i]);K a},57:J(a){L c=[],2r={};1S{Q(L i=0,M=a.M;i<M;i++){L b=E.O(a[i]);7(!2r[b]){2r[b]=P;c.1g(a[i])}}}1X(e){c=a}K c},3y:J(c,a,d){L b=[];Q(L i=0,M=c.M;i<M;i++)7(!d&&a(c[i],i)||d&&!a(c[i],i))b.1g(c[i]);K b},2c:J(d,a){L c=[];Q(L i=0,M=d.M;i<M;i++){L b=a(d[i],i);7(b!==V&&b!=10){7(b.1k!=1M)b=[b];c=c.71(b)}}K c}});L v=8Y.8W.2h();E.14={5K:(v.1D(/.+(?:8T|8S|8R|8O)[\\/: ]([\\d.]+)/)||[])[1],2d:/77/.17(v),2z:/2z/.17(v),1d:/1d/.17(v)&&!/2z/.17(v),48:/48/.17(v)&&!/(8L|77)/.17(v)};L y=E.14.1d?"6H":"75";E.1s({8I:!E.14.1d||T.6F=="79",46:{"Q":"8F","8E":"1t","4g":y,75:y,6H:y,3d:"3d",1t:"1t",1A:"1A",2Y:"2Y",3k:"3k",8C:"8B",2p:"2p",8A:"8z",3T:"3T",6C:"6C",28:"28",12:"12"}});E.R({6B:J(a){K a.1a},8y:J(a){K E.4u(a,"1a")},8x:J(a){K E.2Z(a,2,"2B")},8v:J(a){K E.2Z(a,2,"4t")},8u:J(a){K E.4u(a,"2B")},8t:J(a){K E.4u(a,"4t")},8s:J(a){K E.5i(a.1a.1C,a)},8r:J(a){K E.5i(a.1C)},6z:J(a){K E.12(a,"8q")?a.8o||a.8n.T:E.2I(a.3p)}},J(c,d){E.1n[c]=J(b){L a=E.2c(6,d);7(b&&1o b=="25")a=E.3e(b,a);K 6.2F(E.57(a))}});E.R({6y:"3t",8m:"6q",3o:"6o",8l:"5a",8k:"6S"},J(c,b){E.1n[c]=J(){L a=18;K 6.R(J(){Q(L i=0,M=a.M;i<M;i++)E(a[i])[b](6)})}});E.R({8j:J(a){E.1J(6,a,"");7(6.15==1)6.52(a)},8i:J(a){E.1t.1b(6,a)},8h:J(a){E.1t.1V(6,a)},8g:J(a){E.1t[E.1t.3Y(6,a)?"1V":"1b"](6,a)},1V:J(a){7(!a||E.1E(a,[6]).r.M){E("*",6).1b(6).R(J(){E.16.1V(6);E.35(6)});7(6.1a)6.1a.34(6)}},4x:J(){E(">*",6).1V();2b(6.1C)6.34(6.1C)}},J(a,b){E.1n[a]=J(){K 6.R(b,18)}});E.R(["8f","5X"],J(i,c){L b=c.2h();E.1n[b]=J(a){K 6[0]==1e?E.14.2z&&T.1h["5e"+c]||E.14.2d&&1e["8e"+c]||T.6F=="79"&&T.1F["5e"+c]||T.1h["5e"+c]:6[0]==T?24.2f(24.2f(T.1h["5d"+c],T.1F["5d"+c]),24.2f(T.1h["5L"+c],T.1F["5L"+c])):a==10?(6.M?E.1j(6[0],b):V):6.1j(b,a.1k==4e?a:a+"2S")}});L C=E.14.2d&&4s(E.14.5K)<8c?"(?:[\\\\w*4r-]|\\\\\\\\.)":"(?:[\\\\w\\8b-\\8a*4r-]|\\\\\\\\.)",6v=1B 4q("^>\\\\s*("+C+"+)"),6u=1B 4q("^("+C+"+)(#)("+C+"+)"),6s=1B 4q("^([#.]?)("+C+"*)");E.1s({6r:{"":J(a,i,m){K m[2]=="*"||E.12(a,m[2])},"#":J(a,i,m){K a.4z("2w")==m[2]},":":{89:J(a,i,m){K i<m[3]-0},88:J(a,i,m){K i>m[3]-0},2Z:J(a,i,m){K m[3]-0==i},6Z:J(a,i,m){K m[3]-0==i},3j:J(a,i){K i==0},3J:J(a,i,m,r){K i==r.M-1},6n:J(a,i){K i%2==0},6l:J(a,i){K i%2},"3j-4p":J(a){K a.1a.3S("*")[0]==a},"3J-4p":J(a){K E.2Z(a.1a.5o,1,"4t")==a},"83-4p":J(a){K!E.2Z(a.1a.5o,2,"4t")},6B:J(a){K a.1C},4x:J(a){K!a.1C},82:J(a,i,m){K(a.6x||a.81||E(a).1u()||"").1f(m[3])>=0},4d:J(a){K"1Z"!=a.U&&E.1j(a,"19")!="2H"&&E.1j(a,"4U")!="1Z"},1Z:J(a){K"1Z"==a.U||E.1j(a,"19")=="2H"||E.1j(a,"4U")=="1Z"},80:J(a){K!a.2Y},2Y:J(a){K a.2Y},3k:J(a){K a.3k},2p:J(a){K a.2p||E.1J(a,"2p")},1u:J(a){K"1u"==a.U},5u:J(a){K"5u"==a.U},5t:J(a){K"5t"==a.U},59:J(a){K"59"==a.U},3I:J(a){K"3I"==a.U},58:J(a){K"58"==a.U},6j:J(a){K"6j"==a.U},6i:J(a){K"6i"==a.U},2G:J(a){K"2G"==a.U||E.12(a,"2G")},4D:J(a){K/4D|2k|6h|2G/i.17(a.12)},3Y:J(a,i,m){K E.2s(m[3],a).M},7X:J(a){K/h\\d/i.17(a.12)},7W:J(a){K E.3y(E.3G,J(b){K a==b.Y}).M}}},6g:[/^(\\[) *@?([\\w-]+) *([!*$^~=]*) *(\'?"?)(.*?)\\4 *\\]/,/^(:)([\\w-]+)\\("?\'?(.*?(\\(.*?\\))?[^(]*?)"?\'?\\)/,1B 4q("^([:.#]*)("+C+"+)")],3e:J(a,c,b){L d,2m=[];2b(a&&a!=d){d=a;L f=E.1E(a,c,b);a=f.t.1r(/^\\s*,\\s*/,"");2m=b?c=f.r:E.37(2m,f.r)}K 2m},2s:J(t,p){7(1o t!="25")K[t];7(p&&p.15!=1&&p.15!=9)K[];p=p||T;L d=[p],2r=[],3J,12;2b(t&&3J!=t){L r=[];3J=t;t=E.3g(t);L o=S;L g=6v;L m=g.2O(t);7(m){12=m[1].2E();Q(L i=0;d[i];i++)Q(L c=d[i].1C;c;c=c.2B)7(c.15==1&&(12=="*"||c.12.2E()==12))r.1g(c);d=r;t=t.1r(g,"");7(t.1f(" ")==0)6w;o=P}N{g=/^([>+~])\\s*(\\w*)/i;7((m=g.2O(t))!=V){r=[];L l={};12=m[2].2E();m=m[1];Q(L j=0,3f=d.M;j<3f;j++){L n=m=="~"||m=="+"?d[j].2B:d[j].1C;Q(;n;n=n.2B)7(n.15==1){L h=E.O(n);7(m=="~"&&l[h])1Q;7(!12||n.12.2E()==12){7(m=="~")l[h]=P;r.1g(n)}7(m=="+")1Q}}d=r;t=E.3g(t.1r(g,""));o=P}}7(t&&!o){7(!t.1f(",")){7(p==d[0])d.4l();2r=E.37(2r,d);r=d=[p];t=" "+t.6e(1,t.M)}N{L k=6u;L m=k.2O(t);7(m){m=[0,m[2],m[3],m[1]]}N{k=6s;m=k.2O(t)}m[2]=m[2].1r(/\\\\/g,"");L f=d[d.M-1];7(m[1]=="#"&&f&&f.5J&&!E.3E(f)){L q=f.5J(m[2]);7((E.14.1d||E.14.2z)&&q&&1o q.2w=="25"&&q.2w!=m[2])q=E(\'[@2w="\'+m[2]+\'"]\',f)[0];d=r=q&&(!m[3]||E.12(q,m[3]))?[q]:[]}N{Q(L i=0;d[i];i++){L a=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];7(a=="*"&&d[i].12.2h()=="3V")a="3m";r=E.37(r,d[i].3S(a))}7(m[1]==".")r=E.55(r,m[2]);7(m[1]=="#"){L e=[];Q(L i=0;r[i];i++)7(r[i].4z("2w")==m[2]){e=[r[i]];1Q}r=e}d=r}t=t.1r(k,"")}}7(t){L b=E.1E(t,r);d=r=b.r;t=E.3g(b.t)}}7(t)d=[];7(d&&p==d[0])d.4l();2r=E.37(2r,d);K 2r},55:J(r,m,a){m=" "+m+" ";L c=[];Q(L i=0;r[i];i++){L b=(" "+r[i].1t+" ").1f(m)>=0;7(!a&&b||a&&!b)c.1g(r[i])}K c},1E:J(t,r,h){L d;2b(t&&t!=d){d=t;L p=E.6g,m;Q(L i=0;p[i];i++){m=p[i].2O(t);7(m){t=t.7V(m[0].M);m[2]=m[2].1r(/\\\\/g,"");1Q}}7(!m)1Q;7(m[1]==":"&&m[2]=="56")r=G.17(m[3])?E.1E(m[3],r,P).r:E(r).56(m[3]);N 7(m[1]==".")r=E.55(r,m[2],h);N 7(m[1]=="["){L g=[],U=m[3];Q(L i=0,3f=r.M;i<3f;i++){L a=r[i],z=a[E.46[m[2]]||m[2]];7(z==V||/6O|3Q|2p/.17(m[2]))z=E.1J(a,m[2])||\'\';7((U==""&&!!z||U=="="&&z==m[5]||U=="!="&&z!=m[5]||U=="^="&&z&&!z.1f(m[5])||U=="$="&&z.6e(z.M-m[5].M)==m[5]||(U=="*="||U=="~=")&&z.1f(m[5])>=0)^h)g.1g(a)}r=g}N 7(m[1]==":"&&m[2]=="2Z-4p"){L e={},g=[],17=/(-?)(\\d*)n((?:\\+|-)?\\d*)/.2O(m[3]=="6n"&&"2n"||m[3]=="6l"&&"2n+1"||!/\\D/.17(m[3])&&"7U+"+m[3]||m[3]),3j=(17[1]+(17[2]||1))-0,d=17[3]-0;Q(L i=0,3f=r.M;i<3f;i++){L j=r[i],1a=j.1a,2w=E.O(1a);7(!e[2w]){L c=1;Q(L n=1a.1C;n;n=n.2B)7(n.15==1)n.4k=c++;e[2w]=P}L b=S;7(3j==0){7(j.4k==d)b=P}N 7((j.4k-d)%3j==0&&(j.4k-d)/3j>=0)b=P;7(b^h)g.1g(j)}r=g}N{L f=E.6r[m[1]];7(1o f=="3V")f=f[m[2]];7(1o f=="25")f=6c("S||J(a,i){K "+f+";}");r=E.3y(r,J(a,i){K f(a,i,m,r)},h)}}K{r:r,t:t}},4u:J(b,c){L d=[];L a=b[c];2b(a&&a!=T){7(a.15==1)d.1g(a);a=a[c]}K d},2Z:J(a,e,c,b){e=e||1;L d=0;Q(;a;a=a[c])7(a.15==1&&++d==e)1Q;K a},5i:J(n,a){L r=[];Q(;n;n=n.2B){7(n.15==1&&(!a||n!=a))r.1g(n)}K r}});E.16={1b:J(f,i,g,e){7(f.15==3||f.15==8)K;7(E.14.1d&&f.53!=10)f=1e;7(!g.2D)g.2D=6.2D++;7(e!=10){L h=g;g=J(){K h.1i(6,18)};g.O=e;g.2D=h.2D}L j=E.O(f,"2R")||E.O(f,"2R",{}),1v=E.O(f,"1v")||E.O(f,"1v",J(){L a;7(1o E=="10"||E.16.5f)K a;a=E.16.1v.1i(18.3R.Y,18);K a});1v.Y=f;E.R(i.23(/\\s+/),J(c,b){L a=b.23(".");b=a[0];g.U=a[1];L d=j[b];7(!d){d=j[b]={};7(!E.16.2y[b]||E.16.2y[b].4j.1P(f)===S){7(f.3F)f.3F(b,1v,S);N 7(f.6b)f.6b("4i"+b,1v)}}d[g.2D]=g;E.16.2a[b]=P});f=V},2D:1,2a:{},1V:J(e,h,f){7(e.15==3||e.15==8)K;L i=E.O(e,"2R"),29,4X;7(i){7(h==10||(1o h=="25"&&h.7T(0)=="."))Q(L g 1p i)6.1V(e,g+(h||""));N{7(h.U){f=h.2q;h=h.U}E.R(h.23(/\\s+/),J(b,a){L c=a.23(".");a=c[0];7(i[a]){7(f)2V i[a][f.2D];N Q(f 1p i[a])7(!c[1]||i[a][f].U==c[1])2V i[a][f];Q(29 1p i[a])1Q;7(!29){7(!E.16.2y[a]||E.16.2y[a].4h.1P(e)===S){7(e.67)e.67(a,E.O(e,"1v"),S);N 7(e.66)e.66("4i"+a,E.O(e,"1v"))}29=V;2V i[a]}}})}Q(29 1p i)1Q;7(!29){L d=E.O(e,"1v");7(d)d.Y=V;E.35(e,"2R");E.35(e,"1v")}}},1N:J(g,c,d,f,h){c=E.2I(c||[]);7(g.1f("!")>=0){g=g.2K(0,-1);L a=P}7(!d){7(6.2a[g])E("*").1b([1e,T]).1N(g,c)}N{7(d.15==3||d.15==8)K 10;L b,29,1n=E.1q(d[g]||V),16=!c[0]||!c[0].36;7(16)c.4J(6.4Z({U:g,2L:d}));c[0].U=g;7(a)c[0].65=P;7(E.1q(E.O(d,"1v")))b=E.O(d,"1v").1i(d,c);7(!1n&&d["4i"+g]&&d["4i"+g].1i(d,c)===S)b=S;7(16)c.4l();7(h&&E.1q(h)){29=h.1i(d,b==V?c:c.71(b));7(29!==10)b=29}7(1n&&f!==S&&b!==S&&!(E.12(d,\'a\')&&g=="4V")){6.5f=P;1S{d[g]()}1X(e){}}6.5f=S}K b},1v:J(c){L a;c=E.16.4Z(c||1e.16||{});L b=c.U.23(".");c.U=b[0];L f=E.O(6,"2R")&&E.O(6,"2R")[c.U],42=1M.2l.2K.1P(18,1);42.4J(c);Q(L j 1p f){L d=f[j];42[0].2q=d;42[0].O=d.O;7(!b[1]&&!c.65||d.U==b[1]){L e=d.1i(6,42);7(a!==S)a=e;7(e===S){c.36();c.44()}}}7(E.14.1d)c.2L=c.36=c.44=c.2q=c.O=V;K a},4Z:J(c){L a=c;c=E.1s({},a);c.36=J(){7(a.36)a.36();a.7S=S};c.44=J(){7(a.44)a.44();a.7R=P};7(!c.2L)c.2L=c.7Q||T;7(c.2L.15==3)c.2L=a.2L.1a;7(!c.4S&&c.5w)c.4S=c.5w==c.2L?c.7P:c.5w;7(c.64==V&&c.63!=V){L b=T.1F,1h=T.1h;c.64=c.63+(b&&b.2v||1h&&1h.2v||0)-(b.62||0);c.7N=c.7L+(b&&b.2x||1h&&1h.2x||0)-(b.60||0)}7(!c.3c&&((c.4f||c.4f===0)?c.4f:c.5Z))c.3c=c.4f||c.5Z;7(!c.7b&&c.5Y)c.7b=c.5Y;7(!c.3c&&c.2G)c.3c=(c.2G&1?1:(c.2G&2?3:(c.2G&4?2:0)));K c},2y:{21:{4j:J(){5M();K},4h:J(){K}},3C:{4j:J(){7(E.14.1d)K S;E(6).2j("4P",E.16.2y.3C.2q);K P},4h:J(){7(E.14.1d)K S;E(6).3w("4P",E.16.2y.3C.2q);K P},2q:J(a){7(I(a,6))K P;18[0].U="3C";K E.16.1v.1i(6,18)}},3B:{4j:J(){7(E.14.1d)K S;E(6).2j("4O",E.16.2y.3B.2q);K P},4h:J(){7(E.14.1d)K S;E(6).3w("4O",E.16.2y.3B.2q);K P},2q:J(a){7(I(a,6))K P;18[0].U="3B";K E.16.1v.1i(6,18)}}}};E.1n.1s({2j:J(c,a,b){K c=="4H"?6.2X(c,a,b):6.R(J(){E.16.1b(6,c,b||a,b&&a)})},2X:J(d,b,c){K 6.R(J(){E.16.1b(6,d,J(a){E(6).3w(a);K(c||b).1i(6,18)},c&&b)})},3w:J(a,b){K 6.R(J(){E.16.1V(6,a,b)})},1N:J(c,a,b){K 6.R(J(){E.16.1N(c,a,6,P,b)})},5n:J(c,a,b){7(6[0])K E.16.1N(c,a,6[0],S,b);K 10},2g:J(){L b=18;K 6.4V(J(a){6.4N=0==6.4N?1:0;a.36();K b[6.4N].1i(6,18)||S})},7D:J(a,b){K 6.2j(\'3C\',a).2j(\'3B\',b)},21:J(a){5M();7(E.2Q)a.1P(T,E);N E.3A.1g(J(){K a.1P(6,E)});K 6}});E.1s({2Q:S,3A:[],21:J(){7(!E.2Q){E.2Q=P;7(E.3A){E.R(E.3A,J(){6.1i(T)});E.3A=V}E(T).5n("21")}}});L x=S;J 5M(){7(x)K;x=P;7(T.3F&&!E.14.2z)T.3F("5W",E.21,S);7(E.14.1d&&1e==3b)(J(){7(E.2Q)K;1S{T.1F.7B("26")}1X(3a){3z(18.3R,0);K}E.21()})();7(E.14.2z)T.3F("5W",J(){7(E.2Q)K;Q(L i=0;i<T.4L.M;i++)7(T.4L[i].2Y){3z(18.3R,0);K}E.21()},S);7(E.14.2d){L a;(J(){7(E.2Q)K;7(T.39!="5V"&&T.39!="1y"){3z(18.3R,0);K}7(a===10)a=E("W, 7a[7A=7z]").M;7(T.4L.M!=a){3z(18.3R,0);K}E.21()})()}E.16.1b(1e,"3U",E.21)}E.R(("7y,7x,3U,7w,5d,4H,4V,7v,"+"7G,7u,7t,4P,4O,7s,2k,"+"58,7K,7q,7p,3a").23(","),J(i,b){E.1n[b]=J(a){K a?6.2j(b,a):6.1N(b)}});L I=J(a,c){L b=a.4S;2b(b&&b!=c)1S{b=b.1a}1X(3a){b=c}K b==c};E(1e).2j("4H",J(){E("*").1b(T).3w()});E.1n.1s({3U:J(g,d,c){7(E.1q(g))K 6.2j("3U",g);L e=g.1f(" ");7(e>=0){L i=g.2K(e,g.M);g=g.2K(0,e)}c=c||J(){};L f="4Q";7(d)7(E.1q(d)){c=d;d=V}N{d=E.3m(d);f="61"}L h=6;E.3P({1c:g,U:f,1H:"3q",O:d,1y:J(a,b){7(b=="1W"||b=="5U")h.3q(i?E("<1x/>").3t(a.4b.1r(/<1m(.|\\s)*?\\/1m>/g,"")).2s(i):a.4b);h.R(c,[a.4b,b,a])}});K 6},7n:J(){K E.3m(6.5T())},5T:J(){K 6.2c(J(){K E.12(6,"3u")?E.2I(6.7m):6}).1E(J(){K 6.31&&!6.2Y&&(6.3k||/2k|6h/i.17(6.12)||/1u|1Z|3I/i.17(6.U))}).2c(J(i,c){L b=E(6).5O();K b==V?V:b.1k==1M?E.2c(b,J(a,i){K{31:c.31,1A:a}}):{31:c.31,1A:b}}).22()}});E.R("5S,6d,5R,6D,5Q,6m".23(","),J(i,o){E.1n[o]=J(f){K 6.2j(o,f)}});L B=(1B 3v).3L();E.1s({22:J(d,b,a,c){7(E.1q(b)){a=b;b=V}K E.3P({U:"4Q",1c:d,O:b,1W:a,1H:c})},7l:J(b,a){K E.22(b,V,a,"1m")},7k:J(c,b,a){K E.22(c,b,a,"3i")},7i:J(d,b,a,c){7(E.1q(b)){a=b;b={}}K E.3P({U:"61",1c:d,O:b,1W:a,1H:c})},85:J(a){E.1s(E.4I,a)},4I:{2a:P,U:"4Q",2U:0,5P:"4o/x-7h-3u-7g",5N:P,3l:P,O:V,6p:V,3I:V,49:{3M:"4o/3M, 1u/3M",3q:"1u/3q",1m:"1u/4m, 4o/4m",3i:"4o/3i, 1u/4m",1u:"1u/a7",4G:"*/*"}},4F:{},3P:J(s){L f,2W=/=\\?(&|$)/g,1z,O;s=E.1s(P,s,E.1s(P,{},E.4I,s));7(s.O&&s.5N&&1o s.O!="25")s.O=E.3m(s.O);7(s.1H=="4E"){7(s.U.2h()=="22"){7(!s.1c.1D(2W))s.1c+=(s.1c.1D(/\\?/)?"&":"?")+(s.4E||"7d")+"=?"}N 7(!s.O||!s.O.1D(2W))s.O=(s.O?s.O+"&":"")+(s.4E||"7d")+"=?";s.1H="3i"}7(s.1H=="3i"&&(s.O&&s.O.1D(2W)||s.1c.1D(2W))){f="4E"+B++;7(s.O)s.O=(s.O+"").1r(2W,"="+f+"$1");s.1c=s.1c.1r(2W,"="+f+"$1");s.1H="1m";1e[f]=J(a){O=a;1W();1y();1e[f]=10;1S{2V 1e[f]}1X(e){}7(h)h.34(g)}}7(s.1H=="1m"&&s.1T==V)s.1T=S;7(s.1T===S&&s.U.2h()=="22"){L i=(1B 3v()).3L();L j=s.1c.1r(/(\\?|&)4r=.*?(&|$)/,"$a4="+i+"$2");s.1c=j+((j==s.1c)?(s.1c.1D(/\\?/)?"&":"?")+"4r="+i:"")}7(s.O&&s.U.2h()=="22"){s.1c+=(s.1c.1D(/\\?/)?"&":"?")+s.O;s.O=V}7(s.2a&&!E.5H++)E.16.1N("5S");7((!s.1c.1f("a3")||!s.1c.1f("//"))&&s.1H=="1m"&&s.U.2h()=="22"){L h=T.3S("6f")[0];L g=T.3s("1m");g.3Q=s.1c;7(s.7c)g.a2=s.7c;7(!f){L l=S;g.9Z=g.9Y=J(){7(!l&&(!6.39||6.39=="5V"||6.39=="1y")){l=P;1W();1y();h.34(g)}}}h.38(g);K 10}L m=S;L k=1e.78?1B 78("9X.9V"):1B 76();k.9T(s.U,s.1c,s.3l,s.6p,s.3I);1S{7(s.O)k.4C("9R-9Q",s.5P);7(s.5C)k.4C("9O-5A-9N",E.4F[s.1c]||"9L, 9K 9I 9H 5z:5z:5z 9F");k.4C("X-9C-9A","76");k.4C("9z",s.1H&&s.49[s.1H]?s.49[s.1H]+", */*":s.49.4G)}1X(e){}7(s.6Y)s.6Y(k);7(s.2a)E.16.1N("6m",[k,s]);L c=J(a){7(!m&&k&&(k.39==4||a=="2U")){m=P;7(d){6I(d);d=V}1z=a=="2U"&&"2U"||!E.6X(k)&&"3a"||s.5C&&E.6J(k,s.1c)&&"5U"||"1W";7(1z=="1W"){1S{O=E.6W(k,s.1H)}1X(e){1z="5x"}}7(1z=="1W"){L b;1S{b=k.5q("6U-5A")}1X(e){}7(s.5C&&b)E.4F[s.1c]=b;7(!f)1W()}N E.5v(s,k,1z);1y();7(s.3l)k=V}};7(s.3l){L d=53(c,13);7(s.2U>0)3z(J(){7(k){k.9t();7(!m)c("2U")}},s.2U)}1S{k.9s(s.O)}1X(e){E.5v(s,k,V,e)}7(!s.3l)c();J 1W(){7(s.1W)s.1W(O,1z);7(s.2a)E.16.1N("5Q",[k,s])}J 1y(){7(s.1y)s.1y(k,1z);7(s.2a)E.16.1N("5R",[k,s]);7(s.2a&&!--E.5H)E.16.1N("6d")}K k},5v:J(s,a,b,e){7(s.3a)s.3a(a,b,e);7(s.2a)E.16.1N("6D",[a,s,e])},5H:0,6X:J(r){1S{K!r.1z&&9q.9p=="59:"||(r.1z>=6T&&r.1z<9n)||r.1z==6R||r.1z==9l||E.14.2d&&r.1z==10}1X(e){}K S},6J:J(a,c){1S{L b=a.5q("6U-5A");K a.1z==6R||b==E.4F[c]||E.14.2d&&a.1z==10}1X(e){}K S},6W:J(r,b){L c=r.5q("9k-U");L d=b=="3M"||!b&&c&&c.1f("3M")>=0;L a=d?r.9j:r.4b;7(d&&a.1F.28=="5x")6Q"5x";7(b=="1m")E.5g(a);7(b=="3i")a=6c("("+a+")");K a},3m:J(a){L s=[];7(a.1k==1M||a.5h)E.R(a,J(){s.1g(3r(6.31)+"="+3r(6.1A))});N Q(L j 1p a)7(a[j]&&a[j].1k==1M)E.R(a[j],J(){s.1g(3r(j)+"="+3r(6))});N s.1g(3r(j)+"="+3r(a[j]));K s.6a("&").1r(/%20/g,"+")}});E.1n.1s({1G:J(c,b){K c?6.2e({1R:"1G",27:"1G",1w:"1G"},c,b):6.1E(":1Z").R(J(){6.W.19=6.5s||"";7(E.1j(6,"19")=="2H"){L a=E("<"+6.28+" />").6y("1h");6.W.19=a.1j("19");7(6.W.19=="2H")6.W.19="3D";a.1V()}}).3h()},1I:J(b,a){K b?6.2e({1R:"1I",27:"1I",1w:"1I"},b,a):6.1E(":4d").R(J(){6.5s=6.5s||E.1j(6,"19");6.W.19="2H"}).3h()},6N:E.1n.2g,2g:J(a,b){K E.1q(a)&&E.1q(b)?6.6N(a,b):a?6.2e({1R:"2g",27:"2g",1w:"2g"},a,b):6.R(J(){E(6)[E(6).3H(":1Z")?"1G":"1I"]()})},9f:J(b,a){K 6.2e({1R:"1G"},b,a)},9d:J(b,a){K 6.2e({1R:"1I"},b,a)},9c:J(b,a){K 6.2e({1R:"2g"},b,a)},9a:J(b,a){K 6.2e({1w:"1G"},b,a)},99:J(b,a){K 6.2e({1w:"1I"},b,a)},97:J(c,a,b){K 6.2e({1w:a},c,b)},2e:J(l,k,j,h){L i=E.6P(k,j,h);K 6[i.2P===S?"R":"2P"](J(){7(6.15!=1)K S;L g=E.1s({},i);L f=E(6).3H(":1Z"),4A=6;Q(L p 1p l){7(l[p]=="1I"&&f||l[p]=="1G"&&!f)K E.1q(g.1y)&&g.1y.1i(6);7(p=="1R"||p=="27"){g.19=E.1j(6,"19");g.32=6.W.32}}7(g.32!=V)6.W.32="1Z";g.40=E.1s({},l);E.R(l,J(c,a){L e=1B E.2t(4A,g,c);7(/2g|1G|1I/.17(a))e[a=="2g"?f?"1G":"1I":a](l);N{L b=a.3X().1D(/^([+-]=)?([\\d+-.]+)(.*)$/),1Y=e.2m(P)||0;7(b){L d=2M(b[2]),2A=b[3]||"2S";7(2A!="2S"){4A.W[c]=(d||1)+2A;1Y=((d||1)/e.2m(P))*1Y;4A.W[c]=1Y+2A}7(b[1])d=((b[1]=="-="?-1:1)*d)+1Y;e.45(1Y,d,2A)}N e.45(1Y,a,"")}});K P})},2P:J(a,b){7(E.1q(a)||(a&&a.1k==1M)){b=a;a="2t"}7(!a||(1o a=="25"&&!b))K A(6[0],a);K 6.R(J(){7(b.1k==1M)A(6,a,b);N{A(6,a).1g(b);7(A(6,a).M==1)b.1i(6)}})},94:J(b,c){L a=E.3G;7(b)6.2P([]);6.R(J(){Q(L i=a.M-1;i>=0;i--)7(a[i].Y==6){7(c)a[i](P);a.72(i,1)}});7(!c)6.5p();K 6}});L A=J(b,c,a){7(!b)K 10;c=c||"2t";L q=E.O(b,c+"2P");7(!q||a)q=E.O(b,c+"2P",a?E.2I(a):[]);K q};E.1n.5p=J(a){a=a||"2t";K 6.R(J(){L q=A(6,a);q.4l();7(q.M)q[0].1i(6)})};E.1s({6P:J(b,a,c){L d=b&&b.1k==92?b:{1y:c||!c&&a||E.1q(b)&&b,2u:b,3Z:c&&a||a&&a.1k!=91&&a};d.2u=(d.2u&&d.2u.1k==51?d.2u:{90:8Z,9D:6T}[d.2u])||8X;d.5y=d.1y;d.1y=J(){7(d.2P!==S)E(6).5p();7(E.1q(d.5y))d.5y.1i(6)};K d},3Z:{70:J(p,n,b,a){K b+a*p},5j:J(p,n,b,a){K((-24.8V(p*24.8U)/2)+0.5)*a+b}},3G:[],3W:V,2t:J(b,c,a){6.11=c;6.Y=b;6.1l=a;7(!c.47)c.47={}}});E.2t.2l={4y:J(){7(6.11.30)6.11.30.1i(6.Y,[6.2J,6]);(E.2t.30[6.1l]||E.2t.30.4G)(6);7(6.1l=="1R"||6.1l=="27")6.Y.W.19="3D"},2m:J(a){7(6.Y[6.1l]!=V&&6.Y.W[6.1l]==V)K 6.Y[6.1l];L r=2M(E.1j(6.Y,6.1l,a));K r&&r>-8Q?r:2M(E.2o(6.Y,6.1l))||0},45:J(c,b,d){6.5B=(1B 3v()).3L();6.1Y=c;6.3h=b;6.2A=d||6.2A||"2S";6.2J=6.1Y;6.4B=6.4w=0;6.4y();L e=6;J t(a){K e.30(a)}t.Y=6.Y;E.3G.1g(t);7(E.3W==V){E.3W=53(J(){L a=E.3G;Q(L i=0;i<a.M;i++)7(!a[i]())a.72(i--,1);7(!a.M){6I(E.3W);E.3W=V}},13)}},1G:J(){6.11.47[6.1l]=E.1J(6.Y.W,6.1l);6.11.1G=P;6.45(0,6.2m());7(6.1l=="27"||6.1l=="1R")6.Y.W[6.1l]="8N";E(6.Y).1G()},1I:J(){6.11.47[6.1l]=E.1J(6.Y.W,6.1l);6.11.1I=P;6.45(6.2m(),0)},30:J(a){L t=(1B 3v()).3L();7(a||t>6.11.2u+6.5B){6.2J=6.3h;6.4B=6.4w=1;6.4y();6.11.40[6.1l]=P;L b=P;Q(L i 1p 6.11.40)7(6.11.40[i]!==P)b=S;7(b){7(6.11.19!=V){6.Y.W.32=6.11.32;6.Y.W.19=6.11.19;7(E.1j(6.Y,"19")=="2H")6.Y.W.19="3D"}7(6.11.1I)6.Y.W.19="2H";7(6.11.1I||6.11.1G)Q(L p 1p 6.11.40)E.1J(6.Y.W,p,6.11.47[p])}7(b&&E.1q(6.11.1y))6.11.1y.1i(6.Y);K S}N{L n=t-6.5B;6.4w=n/6.11.2u;6.4B=E.3Z[6.11.3Z||(E.3Z.5j?"5j":"70")](6.4w,n,0,1,6.11.2u);6.2J=6.1Y+((6.3h-6.1Y)*6.4B);6.4y()}K P}};E.2t.30={2v:J(a){a.Y.2v=a.2J},2x:J(a){a.Y.2x=a.2J},1w:J(a){E.1J(a.Y.W,"1w",a.2J)},4G:J(a){a.Y.W[a.1l]=a.2J+a.2A}};E.1n.5L=J(){L b=0,3b=0,Y=6[0],5l;7(Y)8M(E.14){L d=Y.1a,41=Y,1K=Y.1K,1L=Y.2i,5D=2d&&4s(5K)<8J&&!/a1/i.17(v),2T=E.1j(Y,"43")=="2T";7(Y.6G){L c=Y.6G();1b(c.26+24.2f(1L.1F.2v,1L.1h.2v),c.3b+24.2f(1L.1F.2x,1L.1h.2x));1b(-1L.1F.62,-1L.1F.60)}N{1b(Y.5G,Y.5F);2b(1K){1b(1K.5G,1K.5F);7(48&&!/^t(8H|d|h)$/i.17(1K.28)||2d&&!5D)2N(1K);7(!2T&&E.1j(1K,"43")=="2T")2T=P;41=/^1h$/i.17(1K.28)?41:1K;1K=1K.1K}2b(d&&d.28&&!/^1h|3q$/i.17(d.28)){7(!/^8G|1O.*$/i.17(E.1j(d,"19")))1b(-d.2v,-d.2x);7(48&&E.1j(d,"32")!="4d")2N(d);d=d.1a}7((5D&&(2T||E.1j(41,"43")=="4W"))||(48&&E.1j(41,"43")!="4W"))1b(-1L.1h.5G,-1L.1h.5F);7(2T)1b(24.2f(1L.1F.2v,1L.1h.2v),24.2f(1L.1F.2x,1L.1h.2x))}5l={3b:3b,26:b}}J 2N(a){1b(E.2o(a,"a8",P),E.2o(a,"a9",P))}J 1b(l,t){b+=4s(l)||0;3b+=4s(t)||0}K 5l}})();',62,631,'||||||this|if||||||||||||||||||||||||||||||||||||||function|return|var|length|else|data|true|for|each|false|document|type|null|style||elem||undefined|options|nodeName||browser|nodeType|event|test|arguments|display|parentNode|add|url|msie|window|indexOf|push|body|apply|css|constructor|prop|script|fn|typeof|in|isFunction|replace|extend|className|text|handle|opacity|div|complete|status|value|new|firstChild|match|filter|documentElement|show|dataType|hide|attr|offsetParent|doc|Array|trigger|table|call|break|height|try|cache|tbody|remove|success|catch|start|hidden||ready|get|split|Math|string|left|width|tagName|ret|global|while|map|safari|animate|max|toggle|toLowerCase|ownerDocument|bind|select|prototype|cur||curCSS|selected|handler|done|find|fx|duration|scrollLeft|id|scrollTop|special|opera|unit|nextSibling|stack|guid|toUpperCase|pushStack|button|none|makeArray|now|slice|target|parseFloat|border|exec|queue|isReady|events|px|fixed|timeout|delete|jsre|one|disabled|nth|step|name|overflow|inArray|removeChild|removeData|preventDefault|merge|appendChild|readyState|error|top|which|innerHTML|multiFilter|rl|trim|end|json|first|checked|async|param|elems|insertBefore|childNodes|html|encodeURIComponent|createElement|append|form|Date|unbind|color|grep|setTimeout|readyList|mouseleave|mouseenter|block|isXMLDoc|addEventListener|timers|is|password|last|runtimeStyle|getTime|xml|jQuery|domManip|ajax|src|callee|getElementsByTagName|selectedIndex|load|object|timerId|toString|has|easing|curAnim|offsetChild|args|position|stopPropagation|custom|props|orig|mozilla|accepts|clean|responseText|defaultView|visible|String|charCode|float|teardown|on|setup|nodeIndex|shift|javascript|currentStyle|application|child|RegExp|_|parseInt|previousSibling|dir|tr|state|empty|update|getAttribute|self|pos|setRequestHeader|input|jsonp|lastModified|_default|unload|ajaxSettings|unshift|getComputedStyle|styleSheets|getPropertyValue|lastToggle|mouseout|mouseover|GET|andSelf|relatedTarget|init|visibility|click|absolute|index|container|fix|outline|Number|removeAttribute|setInterval|prevObject|classFilter|not|unique|submit|file|after|windowData|deep|scroll|client|triggered|globalEval|jquery|sibling|swing|clone|results|wrapAll|triggerHandler|lastChild|dequeue|getResponseHeader|createTextNode|oldblock|checkbox|radio|handleError|fromElement|parsererror|old|00|Modified|startTime|ifModified|safari2|getWH|offsetTop|offsetLeft|active|values|getElementById|version|offset|bindReady|processData|val|contentType|ajaxSuccess|ajaxComplete|ajaxStart|serializeArray|notmodified|loaded|DOMContentLoaded|Width|ctrlKey|keyCode|clientTop|POST|clientLeft|clientX|pageX|exclusive|detachEvent|removeEventListener|swap|cloneNode|join|attachEvent|eval|ajaxStop|substr|head|parse|textarea|reset|image|zoom|odd|ajaxSend|even|before|username|prepend|expr|quickClass|uuid|quickID|quickChild|continue|textContent|appendTo|contents|evalScript|parent|defaultValue|ajaxError|setArray|compatMode|getBoundingClientRect|styleFloat|clearInterval|httpNotModified|nodeValue|100|alpha|_toggle|href|speed|throw|304|replaceWith|200|Last|colgroup|httpData|httpSuccess|beforeSend|eq|linear|concat|splice|fieldset|multiple|cssFloat|XMLHttpRequest|webkit|ActiveXObject|CSS1Compat|link|metaKey|scriptCharset|callback|col|pixelLeft|urlencoded|www|post|hasClass|getJSON|getScript|elements|serialize|black|keyup|keypress|solid|change|mousemove|mouseup|dblclick|resize|focus|blur|stylesheet|rel|doScroll|round|hover|padding|offsetHeight|mousedown|offsetWidth|Bottom|Top|keydown|clientY|Right|pageY|Left|toElement|srcElement|cancelBubble|returnValue|charAt|0n|substring|animated|header|noConflict|line|enabled|innerText|contains|only|weight|ajaxSetup|font|size|gt|lt|uFFFF|u0128|417|Boolean|inner|Height|toggleClass|removeClass|addClass|removeAttr|replaceAll|insertAfter|prependTo|contentWindow|contentDocument|wrap|iframe|children|siblings|prevAll|nextAll|prev|wrapInner|next|parents|maxLength|maxlength|readOnly|readonly|reverse|class|htmlFor|inline|able|boxModel|522|setData|compatible|with|1px|ie|getData|10000|ra|it|rv|PI|cos|userAgent|400|navigator|600|slow|Function|Object|array|stop|ig|NaN|fadeTo|option|fadeOut|fadeIn|setAttribute|slideToggle|slideUp|changed|slideDown|be|can|property|responseXML|content|1223|getAttributeNode|300|method|protocol|location|action|send|abort|cssText|th|td|cap|specified|Accept|With|colg|Requested|fast|tfoot|GMT|thead|1970|Jan|attributes|01|Thu|leg|Since|If|opt|Type|Content|embed|open|area|XMLHTTP|hr|Microsoft|onreadystatechange|onload|meta|adobeair|charset|http|1_|img|br|plain|borderLeftWidth|borderTopWidth|abbr'.split('|'),0,{}));jQuery.noConflict();
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/jquery/jquery.schedule.js 2.5.src/wp-includes/js/jquery/jquery.schedule.js
--- 2.2.2.src/wp-includes/js/jquery/jquery.schedule.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/jquery/jquery.schedule.js	2008-01-10 11:35:48.000000000 -0600
@@ -0,0 +1,36 @@
+
+(function($){$.scheduler=function(){this.bucket={};return;};$.scheduler.prototype={schedule:function(){var ctx={"id":null,"time":1000,"repeat":false,"protect":false,"obj":null,"func":function(){},"args":[]};function _isfn(fn){return(!!fn&&typeof fn!="string"&&typeof fn[0]=="undefined"&&RegExp("function","i").test(fn+""));};var i=0;var override=false;if(typeof arguments[i]=="object"&&arguments.length>1){override=true;i++;}
+if(typeof arguments[i]=="object"){for(var option in arguments[i])
+if(typeof ctx[option]!="undefined")
+ctx[option]=arguments[i][option];i++;}
+if(typeof arguments[i]=="number"||(typeof arguments[i]=="string"&&arguments[i].match(RegExp("^[0-9]+[smhdw]$"))))
+ctx["time"]=arguments[i++];if(typeof arguments[i]=="boolean")
+ctx["repeat"]=arguments[i++];if(typeof arguments[i]=="boolean")
+ctx["protect"]=arguments[i++];if(typeof arguments[i]=="object"&&typeof arguments[i+1]=="string"&&_isfn(arguments[i][arguments[i+1]])){ctx["obj"]=arguments[i++];ctx["func"]=arguments[i++];}
+else if(typeof arguments[i]!="undefined"&&(_isfn(arguments[i])||typeof arguments[i]=="string"))
+ctx["func"]=arguments[i++];while(typeof arguments[i]!="undefined")
+ctx["args"].push(arguments[i++]);if(override){if(typeof arguments[1]=="object"){for(var option in arguments[0])
+if(typeof ctx[option]!="undefined"&&typeof arguments[1][option]=="undefined")
+ctx[option]=arguments[0][option];}
+else{for(var option in arguments[0])
+if(typeof ctx[option]!="undefined")
+ctx[option]=arguments[0][option];}
+i++;}
+ctx["_scheduler"]=this;ctx["_handle"]=null;var match=String(ctx["time"]).match(RegExp("^([0-9]+)([smhdw])$"));if(match&&match[0]!="undefined"&&match[1]!="undefined")
+ctx["time"]=String(parseInt(match[1])*{s:1000,m:1000*60,h:1000*60*60,d:1000*60*60*24,w:1000*60*60*24*7}[match[2]]);if(ctx["id"]==null)
+ctx["id"]=(String(ctx["repeat"])+":"
++String(ctx["protect"])+":"
++String(ctx["time"])+":"
++String(ctx["obj"])+":"
++String(ctx["func"])+":"
++String(ctx["args"]));if(ctx["protect"])
+if(typeof this.bucket[ctx["id"]]!="undefined")
+return this.bucket[ctx["id"]];if(!_isfn(ctx["func"])){if(ctx["obj"]!=null&&typeof ctx["obj"]=="object"&&typeof ctx["func"]=="string"&&_isfn(ctx["obj"][ctx["func"]]))
+ctx["func"]=ctx["obj"][ctx["func"]];else
+ctx["func"]=eval("function () { "+ctx["func"]+" }");}
+ctx["_handle"]=this._schedule(ctx);this.bucket[ctx["id"]]=ctx;return ctx;},reschedule:function(ctx){if(typeof ctx=="string")
+ctx=this.bucket[ctx];ctx["_handle"]=this._schedule(ctx);return ctx;},_schedule:function(ctx){var trampoline=function(){var obj=(ctx["obj"]!=null?ctx["obj"]:ctx);(ctx["func"]).apply(obj,ctx["args"]);if(typeof(ctx["_scheduler"]).bucket[ctx["id"]]!="undefined"&&ctx["repeat"])
+(ctx["_scheduler"])._schedule(ctx);else
+delete(ctx["_scheduler"]).bucket[ctx["id"]];};return setTimeout(trampoline,ctx["time"]);},cancel:function(ctx){if(typeof ctx=="string")
+ctx=this.bucket[ctx];if(typeof ctx=="object"){clearTimeout(ctx["_handle"]);delete this.bucket[ctx["id"]];}}};$.extend({scheduler$:new $.scheduler(),schedule:function(){return $.scheduler$.schedule.apply($.scheduler$,arguments)},reschedule:function(){return $.scheduler$.reschedule.apply($.scheduler$,arguments)},cancel:function(){return $.scheduler$.cancel.apply($.scheduler$,arguments)}});$.fn.extend({schedule:function(){var a=[{}];for(var i=0;i<arguments.length;i++)
+a.push(arguments[i]);return this.each(function(){a[0]={"id":this,"obj":this};return $.schedule.apply($,a);});}});})(jQuery);
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/jquery/suggest.js 2.5.src/wp-includes/js/jquery/suggest.js
--- 2.2.2.src/wp-includes/js/jquery/suggest.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/jquery/suggest.js	2008-03-15 17:48:12.000000000 -0500
@@ -0,0 +1,312 @@
+/*
+ *	jquery.suggest 1.1 - 2007-08-06
+ *	
+ *	Uses code and techniques from following libraries:
+ *	1. http://www.dyve.net/jquery/?autocomplete
+ *	2. http://dev.jquery.com/browser/trunk/plugins/interface/iautocompleter.js	
+ *
+ *	All the new stuff written by Peter Vulgaris (www.vulgarisoip.com)	
+ *	Feel free to do whatever you want with this file
+ *
+ */
+
+(function($) {
+
+	$.suggest = function(input, options) {
+
+		var $input = $(input).attr("autocomplete", "off");
+		var $results = $(document.createElement("ul"));
+
+		var timeout = false;		// hold timeout ID for suggestion results to appear	
+		var prevLength = 0;			// last recorded length of $input.val()
+		var cache = [];				// cache MRU list
+		var cacheSize = 0;			// size of cache in chars (bytes?)
+		
+		$results.addClass(options.resultsClass).appendTo('body');
+			
+
+		resetPosition();
+		$(window)
+			.load(resetPosition)		// just in case user is changing size of page while loading
+			.resize(resetPosition);
+
+		$input.blur(function() {
+			setTimeout(function() { $results.hide() }, 200);
+		});
+		
+		
+		// help IE users if possible
+		try {
+			$results.bgiframe();
+		} catch(e) { }
+
+
+		// I really hate browser detection, but I don't see any other way
+		if ($.browser.mozilla)
+			$input.keypress(processKey);	// onkeypress repeats arrow keys in Mozilla/Opera
+		else
+			$input.keydown(processKey);		// onkeydown repeats arrow keys in IE/Safari
+		
+
+
+
+		function resetPosition() {
+			// requires jquery.dimension plugin
+			var offset = $input.offset();
+			$results.css({
+				top: (offset.top + input.offsetHeight) + 'px',
+				left: offset.left + 'px'
+			});
+		}
+		
+		
+		function processKey(e) {
+			
+			// handling up/down/escape requires results to be visible
+			// handling enter/tab requires that AND a result to be selected
+			if ((/27$|38$|40$/.test(e.keyCode) && $results.is(':visible')) ||
+				(/^13$|^9$/.test(e.keyCode) && getCurrentResult())) {
+				
+				if (e.preventDefault)
+					e.preventDefault();
+				if (e.stopPropagation)
+					e.stopPropagation();
+
+				e.cancelBubble = true;
+				e.returnValue = false;
+			
+				switch(e.keyCode) {
+
+					case 38: // up
+						prevResult();
+						break;
+			
+					case 40: // down
+						nextResult();
+						break;
+
+					case 9:  // tab
+					case 13: // return
+						selectCurrentResult();
+						break;
+						
+					case 27: //	escape
+						$results.hide();
+						break;
+
+				}
+				
+			} else if ($input.val().length != prevLength) {
+
+				if (timeout) 
+					clearTimeout(timeout);
+				timeout = setTimeout(suggest, options.delay);
+				prevLength = $input.val().length;
+				
+			}			
+				
+			
+		}
+		
+		
+		function suggest() {
+		
+			var q = $.trim($input.val());
+
+			if (q.length >= options.minchars) {
+				
+				cached = checkCache(q);
+				
+				if (cached) {
+				
+					displayItems(cached['items']);
+					
+				} else {
+				
+					$.get(options.source, {q: q}, function(txt) {
+
+						$results.hide();
+						
+						var items = parseTxt(txt, q);
+						
+						displayItems(items);
+						addToCache(q, items, txt.length);
+						
+					});
+					
+				}
+				
+			} else {
+			
+				$results.hide();
+				
+			}
+				
+		}
+		
+		
+		function checkCache(q) {
+
+			for (var i = 0; i < cache.length; i++)
+				if (cache[i]['q'] == q) {
+					cache.unshift(cache.splice(i, 1)[0]);
+					return cache[0];
+				}
+			
+			return false;
+		
+		}
+		
+		function addToCache(q, items, size) {
+
+			while (cache.length && (cacheSize + size > options.maxCacheSize)) {
+				var cached = cache.pop();
+				cacheSize -= cached['size'];
+			}
+			
+			cache.push({
+				q: q,
+				size: size,
+				items: items
+				});
+				
+			cacheSize += size;
+		
+		}
+		
+		function displayItems(items) {
+			
+			if (!items)
+				return;
+				
+			if (!items.length) {
+				$results.hide();
+				return;
+			}
+
+			resetPosition(); // when the form moves after the page has loaded
+
+			var html = '';
+			for (var i = 0; i < items.length; i++)
+				html += '<li>' + items[i] + '</li>';
+
+			$results.html(html).show();
+			
+			$results
+				.children('li')
+				.mouseover(function() {
+					$results.children('li').removeClass(options.selectClass);
+					$(this).addClass(options.selectClass);
+				})
+				.click(function(e) {
+					e.preventDefault(); 
+					e.stopPropagation();
+					selectCurrentResult();
+				});
+						
+		}
+		
+		function parseTxt(txt, q) {
+			
+			var items = [];
+			var tokens = txt.split(options.delimiter);
+			
+			// parse returned data for non-empty items
+			for (var i = 0; i < tokens.length; i++) {
+				var token = $.trim(tokens[i]);
+				if (token) {
+					token = token.replace(
+						new RegExp(q, 'ig'), 
+						function(q) { return '<span class="' + options.matchClass + '">' + q + '</span>' }
+						);
+					items[items.length] = token;
+				}
+			}
+			
+			return items;
+		}
+		
+		function getCurrentResult() {
+		
+			if (!$results.is(':visible'))
+				return false;
+		
+			var $currentResult = $results.children('li.' + options.selectClass);
+			
+			if (!$currentResult.length)
+				$currentResult = false;
+				
+			return $currentResult;
+
+		}
+		
+		function selectCurrentResult() {
+		
+			$currentResult = getCurrentResult();
+		
+			if ($currentResult) {
+				$input.val($currentResult.text());
+				$results.hide();
+				
+				if (options.onSelect)
+					options.onSelect.apply($input[0]);
+					
+			}
+		
+		}
+		
+		function nextResult() {
+		
+			$currentResult = getCurrentResult();
+		
+			if ($currentResult)
+				$currentResult
+					.removeClass(options.selectClass)
+					.next()
+						.addClass(options.selectClass);
+			else
+				$results.children('li:first-child').addClass(options.selectClass);
+		
+		}
+		
+		function prevResult() {
+		
+			$currentResult = getCurrentResult();
+		
+			if ($currentResult)
+				$currentResult
+					.removeClass(options.selectClass)
+					.prev()
+						.addClass(options.selectClass);
+			else
+				$results.children('li:last-child').addClass(options.selectClass);
+		
+		}
+
+	}
+	
+	$.fn.suggest = function(source, options) {
+	
+		if (!source)
+			return;
+	
+		options = options || {};
+		options.source = source;
+		options.delay = options.delay || 100;
+		options.resultsClass = options.resultsClass || 'ac_results';
+		options.selectClass = options.selectClass || 'ac_over';
+		options.matchClass = options.matchClass || 'ac_match';
+		options.minchars = options.minchars || 2;
+		options.delimiter = options.delimiter || '\n';
+		options.onSelect = options.onSelect || false;
+		options.maxCacheSize = options.maxCacheSize || 65536;
+
+		this.each(function() {
+			new $.suggest(this, options);
+		});
+
+		return this;
+		
+	};
+	
+})(jQuery);
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/jquery/ui.tabs.js 2.5.src/wp-includes/js/jquery/ui.tabs.js
--- 2.2.2.src/wp-includes/js/jquery/ui.tabs.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/jquery/ui.tabs.js	2008-01-10 03:39:35.000000000 -0600
@@ -0,0 +1,529 @@
+/*
+ * Tabs 3 - New Wave Tabs
+ *
+ * Copyright (c) 2007 Klaus Hartl (stilbuero.de)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ */
+
+(function($) {
+
+    // if the UI scope is not availalable, add it
+    $.ui = $.ui || {};
+
+    // tabs initialization
+    $.fn.tabs = function(initial, options) {
+        if (initial && initial.constructor == Object) { // shift arguments
+            options = initial;
+            initial = null;
+        }
+        options = options || {};
+
+        initial = initial && initial.constructor == Number && --initial || 0;
+
+        return this.each(function() {
+            new $.ui.tabs(this, $.extend(options, { initial: initial }));
+        });
+    };
+
+    // other chainable tabs methods
+    $.each(['Add', 'Remove', 'Enable', 'Disable', 'Click', 'Load', 'Href'], function(i, method) {
+        $.fn['tabs' + method] = function() {
+            var args = arguments;
+            return this.each(function() {
+                var instance = $.ui.tabs.getInstance(this);
+                instance[method.toLowerCase()].apply(instance, args);
+            });
+        };
+    });
+    $.fn.tabsSelected = function() {
+        var selected = -1;
+        if (this[0]) {
+            var instance = $.ui.tabs.getInstance(this[0]),
+                $lis = $('li', this);
+            selected = $lis.index( $lis.filter('.' + instance.options.selectedClass)[0] );
+        }
+        return selected >= 0 ? ++selected : -1;
+    };
+
+    // tabs class
+    $.ui.tabs = function(el, options) {
+
+        this.source = el;
+
+        this.options = $.extend({
+
+            // basic setup
+            initial: 0,
+            event: 'click',
+            disabled: [],
+            cookie: null, // pass options object as expected by cookie plugin: { expires: 7, path: '/', domain: 'jquery.com', secure: true }
+            // TODO bookmarkable: $.ajaxHistory ? true : false,
+            unselected: false,
+            unselect: options.unselected ? true : false,
+
+            // Ajax
+            spinner: 'Loading&#8230;',
+            cache: false,
+            idPrefix: 'ui-tabs-',
+            ajaxOptions: {},
+
+            // animations
+            /*fxFade: null,
+            fxSlide: null,
+            fxShow: null,
+            fxHide: null,*/
+            fxSpeed: 'normal',
+            /*fxShowSpeed: null,
+            fxHideSpeed: null,*/
+
+            // callbacks
+            add: function() {},
+            remove: function() {},
+            enable: function() {},
+            disable: function() {},
+            click: function() {},
+            hide: function() {},
+            show: function() {},
+            load: function() {},
+            
+            // templates
+            tabTemplate: '<li><a href="#{href}"><span>#{text}</span></a></li>',
+            panelTemplate: '<div></div>',
+
+            // CSS classes
+            navClass: 'ui-tabs-nav',
+            selectedClass: 'ui-tabs-selected',
+            unselectClass: 'ui-tabs-unselect',
+            disabledClass: 'ui-tabs-disabled',
+            panelClass: 'ui-tabs-panel',
+            hideClass: 'ui-tabs-hide',
+            loadingClass: 'ui-tabs-loading'
+
+        }, options);
+
+        this.options.event += '.ui-tabs'; // namespace event
+        this.options.cookie = $.cookie && $.cookie.constructor == Function && this.options.cookie;
+
+        // save instance for later
+        $.data(el, $.ui.tabs.INSTANCE_KEY, this);
+        
+        // create tabs
+        this.tabify(true);
+    };
+
+    // static
+    $.ui.tabs.INSTANCE_KEY = 'ui_tabs_instance';
+    $.ui.tabs.getInstance = function(el) {
+        return $.data(el, $.ui.tabs.INSTANCE_KEY);
+    };
+
+    // instance methods
+    $.extend($.ui.tabs.prototype, {
+        tabId: function(a) {
+            return a.title ? a.title.replace(/\s/g, '_')
+                : this.options.idPrefix + $.data(a);
+        },
+        tabify: function(init) {
+
+            this.$lis = $('li:has(a[href])', this.source);
+            this.$tabs = this.$lis.map(function() { return $('a', this)[0] });
+            this.$panels = $([]);
+            
+            var self = this, o = this.options;
+            
+            this.$tabs.each(function(i, a) {
+                // inline tab
+                if (a.hash && a.hash.replace('#', '')) { // Safari 2 reports '#' for an empty hash
+                    self.$panels = self.$panels.add(a.hash);
+                }
+                // remote tab
+                else if ($(a).attr('href') != '#') { // prevent loading the page itself if href is just "#"
+                    $.data(a, 'href', a.href);
+                    var id = self.tabId(a);
+                    a.href = '#' + id;
+                    self.$panels = self.$panels.add(
+                        $('#' + id)[0] || $(o.panelTemplate).attr('id', id).addClass(o.panelClass)
+                            .insertAfter( self.$panels[i - 1] || self.source )
+                    );
+                }
+                // invalid tab href
+                else {
+                    o.disabled.push(i + 1);
+                }
+            });
+
+            if (init) {
+
+                // attach necessary classes for styling if not present
+                $(this.source).hasClass(o.navClass) || $(this.source).addClass(o.navClass);
+                this.$panels.each(function() {
+                    var $this = $(this);
+                    $this.hasClass(o.panelClass) || $this.addClass(o.panelClass);
+                });
+                
+                // disabled tabs
+                for (var i = 0, position; position = o.disabled[i]; i++) {
+                    this.disable(position);
+                }
+                
+                // Try to retrieve initial tab:
+                // 1. from fragment identifier in url if present
+                // 2. from cookie
+                // 3. from selected class attribute on <li>
+                // 4. otherwise use given initial argument
+                // 5. check if tab is disabled
+                this.$tabs.each(function(i, a) {
+                    if (location.hash) {
+                        if (a.hash == location.hash) {
+                            o.initial = i;
+                            // prevent page scroll to fragment
+                            //if (($.browser.msie || $.browser.opera) && !o.remote) {
+                            if ($.browser.msie || $.browser.opera) {
+                                var $toShow = $(location.hash), toShowId = $toShow.attr('id');
+                                $toShow.attr('id', '');
+                                setTimeout(function() {
+                                    $toShow.attr('id', toShowId); // restore id
+                                }, 500);
+                            }
+                            scrollTo(0, 0);
+                            return false; // break
+                        }
+                    } else if (o.cookie) {
+                        o.initial = parseInt($.cookie( $.ui.tabs.INSTANCE_KEY + $.data(self.source) )) || 0;
+                        return false; // break
+                    } else if ( self.$lis.eq(i).hasClass(o.selectedClass) ) {
+                        o.initial = i;
+                        return false; // break
+                    }
+                });
+                var n = this.$lis.length;
+                while (this.$lis.eq(o.initial).hasClass(o.disabledClass) && n) {
+                    o.initial = ++o.initial < this.$lis.length ? o.initial : 0;
+                    n--;
+                }
+                if (!n) { // all tabs disabled, set option unselected to true
+                    o.unselected = o.unselect = true;
+                }
+
+                // highlight selected tab
+                this.$panels.addClass(o.hideClass);
+                this.$lis.removeClass(o.selectedClass);
+                if (!o.unselected) {
+                    this.$panels.eq(o.initial).show().removeClass(o.hideClass); // use show and remove class to show in any case no matter how it has been hidden before
+                    this.$lis.eq(o.initial).addClass(o.selectedClass);
+                }
+
+                // load if remote tab
+                var href = !o.unselected && $.data(this.$tabs[o.initial], 'href');
+                if (href) {
+                    this.load(o.initial + 1, href);
+                }
+                
+                // disable click if event is configured to something else
+                if (!/^click/.test(o.event)) {
+                    this.$tabs.bind('click', function(e) { e.preventDefault(); });
+                }
+
+            }
+
+            // setup animations
+            var showAnim = {}, showSpeed = o.fxShowSpeed || o.fxSpeed,
+                hideAnim = {}, hideSpeed = o.fxHideSpeed || o.fxSpeed;
+            if (o.fxSlide || o.fxFade) {
+                if (o.fxSlide) {
+                    showAnim['height'] = 'show';
+                    hideAnim['height'] = 'hide';
+                }
+                if (o.fxFade) {
+                    showAnim['opacity'] = 'show';
+                    hideAnim['opacity'] = 'hide';
+                }
+            } else {
+                if (o.fxShow) {
+                    showAnim = o.fxShow;
+                } else { // use some kind of animation to prevent browser scrolling to the tab
+                    showAnim['min-width'] = 0; // avoid opacity, causes flicker in Firefox
+                    showSpeed = 1; // as little as 1 is sufficient
+                }
+                if (o.fxHide) {
+                    hideAnim = o.fxHide;
+                } else { // use some kind of animation to prevent browser scrolling to the tab
+                    hideAnim['min-width'] = 0; // avoid opacity, causes flicker in Firefox
+                    hideSpeed = 1; // as little as 1 is sufficient
+                }
+            }
+
+            // reset some styles to maintain print style sheets etc.
+            var resetCSS = { display: '', overflow: '', height: '' };
+            if (!$.browser.msie) { // not in IE to prevent ClearType font issue
+                resetCSS['opacity'] = '';
+            }
+
+            // Hide a tab, animation prevents browser scrolling to fragment,
+            // $show is optional.
+            function hideTab(clicked, $hide, $show) {
+                $hide.animate(hideAnim, hideSpeed, function() { //
+                    $hide.addClass(o.hideClass).css(resetCSS); // maintain flexible height and accessibility in print etc.
+                    if ($.browser.msie && hideAnim['opacity']) {
+                        $hide[0].style.filter = '';
+                    }
+                    o.hide(clicked, $hide[0], $show && $show[0] || null);
+                    if ($show) {
+                        showTab(clicked, $show, $hide);
+                    }
+                });
+            }
+
+            // Show a tab, animation prevents browser scrolling to fragment,
+            // $hide is optional
+            function showTab(clicked, $show, $hide) {
+                if (!(o.fxSlide || o.fxFade || o.fxShow)) {
+                    $show.css('display', 'block'); // prevent occasionally occuring flicker in Firefox cause by gap between showing and hiding the tab panels
+                }
+                $show.animate(showAnim, showSpeed, function() {
+                    $show.removeClass(o.hideClass).css(resetCSS); // maintain flexible height and accessibility in print etc.
+                    if ($.browser.msie && showAnim['opacity']) {
+                        $show[0].style.filter = '';
+                    }
+                    o.show(clicked, $show[0], $hide && $hide[0] || null);
+                });
+            }
+
+            // switch a tab
+            function switchTab(clicked, $li, $hide, $show) {
+                /*if (o.bookmarkable && trueClick) { // add to history only if true click occured, not a triggered click
+                    $.ajaxHistory.update(clicked.hash);
+                }*/
+                $li.addClass(o.selectedClass)
+                    .siblings().removeClass(o.selectedClass);
+                hideTab(clicked, $hide, $show);
+            }
+
+            // attach tab event handler, unbind to avoid duplicates from former tabifying...
+            this.$tabs.unbind(o.event).bind(o.event, function() {
+
+                //var trueClick = e.clientX; // add to history only if true click occured, not a triggered click
+                var $li = $(this).parents('li:eq(0)'),
+                    $hide = self.$panels.filter(':visible'),
+                    $show = $(this.hash);
+
+                // If tab is already selected and not unselectable or tab disabled or click callback returns false stop here.
+                // Check if click handler returns false last so that it is not executed for a disabled tab!
+                if (($li.hasClass(o.selectedClass) && !o.unselect) || $li.hasClass(o.disabledClass)
+                    || o.click(this, $show[0], $hide[0]) === false) {
+                    this.blur();
+                    return false;
+                }
+                
+                if (o.cookie) {
+                    $.cookie($.ui.tabs.INSTANCE_KEY + $.data(self.source), self.$tabs.index(this), o.cookie);
+                }
+                    
+                // if tab may be closed
+                if (o.unselect) {
+                    if ($li.hasClass(o.selectedClass)) {
+                        $li.removeClass(o.selectedClass);
+                        self.$panels.stop();
+                        hideTab(this, $hide);
+                        this.blur();
+                        return false;
+                    } else if (!$hide.length) {
+                        self.$panels.stop();
+                        if ($.data(this, 'href')) { // remote tab
+                            var a = this;
+                            self.load(self.$tabs.index(this) + 1, $.data(this, 'href'), function() {
+                                $li.addClass(o.selectedClass).addClass(o.unselectClass);
+                                showTab(a, $show);
+                            });
+                        } else {
+                            $li.addClass(o.selectedClass).addClass(o.unselectClass);
+                            showTab(this, $show);
+                        }
+                        this.blur();
+                        return false;
+                    }
+                }
+
+                // stop possibly running animations
+                self.$panels.stop();
+
+                // show new tab
+                if ($show.length) {
+
+                    // prevent scrollbar scrolling to 0 and than back in IE7, happens only if bookmarking/history is enabled
+                    /*if ($.browser.msie && o.bookmarkable) {
+                        var showId = this.hash.replace('#', '');
+                        $show.attr('id', '');
+                        setTimeout(function() {
+                            $show.attr('id', showId); // restore id
+                        }, 0);
+                    }*/
+
+                    if ($.data(this, 'href')) { // remote tab
+                        var a = this;
+                        self.load(self.$tabs.index(this) + 1, $.data(this, 'href'), function() {
+                            switchTab(a, $li, $hide, $show);
+                        });
+                    } else {
+                        switchTab(this, $li, $hide, $show);
+                    }
+
+                    // Set scrollbar to saved position - need to use timeout with 0 to prevent browser scroll to target of hash
+                    /*var scrollX = window.pageXOffset || document.documentElement && document.documentElement.scrollLeft || document.body.scrollLeft || 0;
+                    var scrollY = window.pageYOffset || document.documentElement && document.documentElement.scrollTop || document.body.scrollTop || 0;
+                    setTimeout(function() {
+                        scrollTo(scrollX, scrollY);
+                    }, 0);*/
+
+                } else {
+                    throw 'jQuery UI Tabs: Mismatching fragment identifier.';
+                }
+
+                // Prevent IE from keeping other link focussed when using the back button
+                // and remove dotted border from clicked link. This is controlled in modern
+                // browsers via CSS, also blur removes focus from address bar in Firefox
+                // which can become a usability and annoying problem with tabsRotate.
+                if ($.browser.msie) {
+                    this.blur(); 
+                }
+
+                //return o.bookmarkable && !!trueClick; // convert trueClick == undefined to Boolean required in IE
+                return false;
+
+            });
+
+        },
+        add: function(url, text, position) {
+            if (url && text) {
+                position = position || this.$tabs.length; // append by default  
+                
+                var o = this.options,
+                    $li = $(o.tabTemplate.replace(/#\{href\}/, url).replace(/#\{text\}/, text));
+                
+                var id = url.indexOf('#') == 0 ? url.replace('#', '') : this.tabId( $('a:first-child', $li)[0] );
+                
+                // try to find an existing element before creating a new one
+                var $panel = $('#' + id);
+                $panel = $panel.length && $panel
+                    || $(o.panelTemplate).attr('id', id).addClass(o.panelClass).addClass(o.hideClass);
+                if (position >= this.$lis.length) {
+                    $li.appendTo(this.source);
+                    $panel.appendTo(this.source.parentNode);
+                } else {
+                    $li.insertBefore(this.$lis[position - 1]);
+                    $panel.insertBefore(this.$panels[position - 1]);
+                }
+                
+                this.tabify();
+                
+                if (this.$tabs.length == 1) {
+                     $li.addClass(o.selectedClass);
+                     $panel.removeClass(o.hideClass);
+                     var href = $.data(this.$tabs[0], 'href');
+                     if (href) {
+                         this.load(position + 1, href);
+                     }
+                }
+                o.add(this.$tabs[position], this.$panels[position]); // callback
+            } else {
+                throw 'jQuery UI Tabs: Not enough arguments to add tab.';
+            }
+        },
+        remove: function(position) {
+            if (position && position.constructor == Number) {                
+                var o = this.options, $li = this.$lis.eq(position - 1).remove(),
+                    $panel = this.$panels.eq(position - 1).remove();
+                    
+                // If selected tab was removed focus tab to the right or
+                // tab to the left if last tab was removed.
+                if ($li.hasClass(o.selectedClass) && this.$tabs.length > 1) {
+                    this.click(position + (position < this.$tabs.length ? 1 : -1));
+                }
+                this.tabify();
+                o.remove($li.end()[0], $panel[0]); // callback
+            }
+        },
+        enable: function(position) {
+            var o = this.options, $li = this.$lis.eq(position - 1);
+            $li.removeClass(o.disabledClass);
+            if ($.browser.safari) { // fix disappearing tab (that used opacity indicating disabling) after enabling in Safari 2...
+                $li.css('display', 'inline-block');
+                setTimeout(function() {
+                    $li.css('display', 'block')
+                }, 0)
+            }
+            o.enable(this.$tabs[position - 1], this.$panels[position - 1]); // callback
+        },
+        disable: function(position) {
+            var o = this.options;      
+            this.$lis.eq(position - 1).addClass(o.disabledClass);
+            o.disable(this.$tabs[position - 1], this.$panels[position - 1]); // callback
+        },
+        click: function(position) {
+            this.$tabs.eq(position - 1).trigger(this.options.event);
+        },
+        load: function(position, url, callback) {
+            var self = this, o = this.options,
+                $a = this.$tabs.eq(position - 1), a = $a[0], $span = $('span', a);
+            
+            // shift arguments
+            if (url && url.constructor == Function) {
+                callback = url;
+                url = null;
+            }
+
+            // set new URL or get existing
+            if (url) {
+                $.data(a, 'href', url);
+            } else {
+                url = $.data(a, 'href');
+            }
+
+            // load
+            if (o.spinner) {
+                $.data(a, 'title', $span.html());
+                $span.html('<em>' + o.spinner + '</em>');
+            }
+            var finish = function() {
+                self.$tabs.filter('.' + o.loadingClass).each(function() {
+                    $(this).removeClass(o.loadingClass);
+                    if (o.spinner) {
+                        $('span', this).html( $.data(this, 'title') );
+                    }
+                });
+                self.xhr = null;
+            };
+            var ajaxOptions = $.extend(o.ajaxOptions, {
+                url: url,
+                success: function(r) {
+                    $(a.hash).html(r);
+                    finish();
+                    // This callback is required because the switch has to take 
+                    // place after loading has completed.
+                    if (callback && callback.constructor == Function) {
+                        callback();
+                    }
+                    if (o.cache) {
+                        $.removeData(a, 'href'); // if loaded once do not load them again
+                    }
+                    o.load(self.$tabs[position - 1], self.$panels[position - 1]); // callback
+                }
+            });
+            if (this.xhr) {
+                // terminate pending requests from other tabs and restore title
+                this.xhr.abort();
+                finish();
+            }
+            $a.addClass(o.loadingClass);
+            setTimeout(function() { // timeout is again required in IE, "wait" for id being restored
+                self.xhr = $.ajax(ajaxOptions);
+            }, 0);
+            
+        },
+        href: function(position, href) {
+            $.data(this.$tabs.eq(position - 1)[0], 'href', href);
+        }
+    });
+
+})(jQuery);
diff -x .svn -aruN 2.2.2.src/wp-includes/js/list-manipulation.js 2.5.src/wp-includes/js/list-manipulation.js
--- 2.2.2.src/wp-includes/js/list-manipulation.js	2007-03-06 11:35:01.000000000 -0600
+++ 2.5.src/wp-includes/js/list-manipulation.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,295 +0,0 @@
-addLoadEvent( function() {
-	if ( 'undefined' != typeof listManL10n )
-		Object.extend(listMan.prototype, listManL10n);
-	theList = new listMan();
-} );
-
-function deleteSomething( what, id, message, obj ) {
-	if ( !obj )
-		obj=theList;
-	if ( !message )
-		message = obj.delText.replace(/%thing%/g, what);
-	if( confirm(message) )
-		return obj.ajaxDelete( what, id );
-	else return false;
-}
-
-function dimSomething( what, id, dimClass, obj ) {
-	if ( !obj )
-		obj = theList;
-	return obj.ajaxDimmer(what,id,dimClass);
-}
-
-var listMan = Class.create();
-Object.extend(listMan.prototype, {
-	ajaxRespEl: 'ajax-response',
-	ajaxHandler: false,
-	inputData: '',
-	clearInputs: [],
-	showLink: true,
-	topAdder: false,
-	alt: 'alternate',
-	altOffset: 0,
-	addComplete: null,
-	delComplete: null,
-	dimComplete: null,
-	dataStore: null,
-	formStore: null,
-
-	jumpText: '', // We get these from listManL10n
-	delText: '',
-
-	initialize: function(theListId) {
-		this.theList = $(theListId ? theListId : 'the-list');
-		if ( !this.theList )
-			return false;
-		Element.cleanWhitespace(this.theList);
-	},
-
-	// sends add-what and fields contained in where
-	// recieves html with top element having an id like what-#
-	ajaxAdder: function( what, where, update ) { // Do NOT wrap TR in TABLE TBODY
-		var ajaxAdd = new WPAjax( this.ajaxHandler, this.ajaxRespEl );
-		if ( ajaxAdd.notInitialized() )
-			return true;
-		var action = ( update ? 'update-' : 'add-' ) + what;
-		ajaxAdd.options.parameters = $H(ajaxAdd.options.parameters).merge({action: action}).merge(this.inputData.toQueryParams()).merge(this.grabInputs( where, ajaxAdd ).toQueryParams());
-
-		var tempObj=this;
-		ajaxAdd.addOnComplete( function(transport) {
-			var newItems = $A(transport.responseXML.getElementsByTagName(what));
-			if ( newItems ) {
-				var showLinkMessage = '';
-				var m = '';
-				newItems.each( function(i) {
-					var id = i.getAttribute('id');
-					var exists = $(what+'-'+id);
-					if ( exists )
-						tempObj.replaceListItem( exists, getNodeValue(i,'response_data'), update );
-					else
-						tempObj.addListItem( getNodeValue(i, 'response_data') );
-					m = getNodeValue(i, 'show-link');
-					showLinkMessage += showLinkMessage ? "<br />\n" : '';
-					if ( m )
-						showLinkMessage += m;
-					else
-						showLinkMessage += "<a href='#" + what + '-' + id + "'>" + tempObj.jumpText + "</a>";
-				});
-				if ( tempObj.showLink && showLinkMessage )
-					Element.update(ajaxAdd.myResponseElement,"<div id='jumplink' class='updated fade'><p>" + showLinkMessage + "</p></div>");
-			}
-			if ( tempObj.addComplete && typeof tempObj.addComplete == 'function' )
-				tempObj.addComplete( what, where, update, transport );
-			tempObj.recolorList();
-			ajaxAdd.restoreInputs = null;
-		});
-		if ( !update )
-			ajaxAdd.addOnWPError( function(transport) { tempObj.restoreForm(ajaxAdd.restoreInputs); });
-		ajaxAdd.request(ajaxAdd.url);
-		if ( !update )
-			this.clear();
-		return false;
-	},
-
-	// sends update-what and fields contained in where
-	// recieves html with top element having an id like what-#
-	ajaxUpdater: function( what, where ) { return this.ajaxAdder( what, where, true ); },
-
-	// sends delete-what and id#
-	ajaxDelete: function( what, id ) {
-		var ajaxDel = new WPAjax( this.ajaxHandler, this.ajaxRespEl );
-		if( ajaxDel.notInitialized() )
-			return true;
-		var tempObj = this;
-		var action = 'delete-' + what;
-		var actionId = action + '&id=' + id;
-		var idName = what.replace('-as-spam','') + '-' + id;
-		ajaxDel.addOnComplete( function(transport) {
-			Element.update(ajaxDel.myResponseElement,'');
-			tempObj.destore(actionId);
-			if( tempObj.delComplete && typeof tempObj.delComplete == 'function' )
-				tempObj.delComplete( what, id, transport );
-		});
-		ajaxDel.addOnWPError( function(transport) { tempObj.restore(actionId, true); });
-		ajaxDel.options.parameters = $H(ajaxDel.options.parameters).merge({action: action, id: id}).merge(this.inputData.toQueryParams());
-		ajaxDel.request(ajaxDel.url);
-		this.store(actionId, idName);
-		tempObj.removeListItem( idName );
-		return false;
-	},
-
-	// Toggles class nomes
-	// sends dim-what and id#
-	ajaxDimmer: function( what, id, dimClass ) {
-		ajaxDim = new WPAjax( this.ajaxHandler, this.ajaxRespEl );
-		if ( ajaxDim.notInitialized() )
-			return true;
-		var tempObj = this;
-		var action = 'dim-' + what;
-		var actionId = action + '&id=' + id;
-		var idName = what + '-' + id;
-		ajaxDim.addOnComplete( function(transport) {
-			Element.update(ajaxDim.myResponseElement,'');
-			tempObj.destore(actionId);
-			if ( tempObj.dimComplete && typeof tempObj.dimComplete == 'function' )
-				tempObj.dimComplete( what, id, dimClass, transport );
-		});
-		ajaxDim.addOnWPError( function(transport) { tempObj.restore(actionId, true); });
-		ajaxDim.options.parameters = $H(ajaxDim.options.parameters).merge({action: action, id: id}).merge(this.inputData.toQueryParams());
-		ajaxDim.request(ajaxDim.url);
-		this.store(actionId, idName);
-		this.dimItem( idName, dimClass );
-		return false;
-	},
-
-	addListItem: function( h ) {
-		new Insertion[this.topAdder ? 'Top' : 'Bottom'](this.theList,h);
-		Element.cleanWhitespace(this.theList);
-		var id = this.topAdder ? this.theList.firstChild.id : this.theList.lastChild.id;
-		if ( this.alt )
-			if ( ( this.theList.childNodes.length + this.altOffset ) % 2 )
-				Element.addClassName($(id),this.alt);
-		Fat.fade_element(id);
-	},
-
-	// only hides the element sa it can be put back again if necessary
-	removeListItem: function( id, noFade ) {
-		id = $(id);
-		if ( !noFade ) {
-			Fat.fade_element(id.id,null,700,'#FF3333');
-			var tempObj = this;
-			var func = function() { id.hide(); tempObj.recolorList(); }
-			setTimeout(func, 705);
-		} else {
-			id.hide();
-			this.recolorList();
-		}
-	},
-
-	replaceListItem: function( id, h, update ) {
-		id = $(id);
-		if ( !update ) {
-			Element.remove(id);
-			this.addListItem( h );
-			return;
-		}
-		id.replace(h);
-		Fat.fade_element(id.id);
-	},
-
-	// toggles class
-	dimItem: function( id, dimClass, noFade ) {
-		id = $(id);
-		if ( Element.hasClassName(id,dimClass) ) {
-			if ( !noFade )
-				Fat.fade_element(id.id,null,700,null);
-			Element.removeClassName(id,dimClass);
-		} else {
-			if ( !noFade )
-				Fat.fade_element(id.id,null,700,'#FF3333');
-			Element.addClassName(id,dimClass);
-		}
-	},
-
-	// store an element in case we need it later
-	store: function(action, id) {
-		if ( !this.dataStore )
-			this.dataStore = $H();
-		this.dataStore[action] = $(id).cloneNode(true);
-	},
-
-	// delete from store
-	destore: function(action) { delete(this.dataStore[action]); },
-
-	// restore element from store into existing (possibly hidden) element of same id
-	restore: function(action, error) {
-		var id = this.dataStore[action].id;
-		this.theList.replaceChild(this.dataStore[action], $(id));
-		delete(this.dataStore[action]);
-		if ( error ) {
-			func = function() { Element.setStyle($(id),{backgroundColor:'#FF3333'}); }
-			func(); setTimeout(func, 705); // Hit it twice in case it's still fading.
-		}
-	},
-
-	// Like Form.serialize, but excludes action and sets up clearInputs
-	grabInputs: function( where, ajaxObj ) {
-		if ( ajaxObj )
-			ajaxObj.restoreInputs = [];
-		var elements = Form.getElements($(where));
-		var queryComponents = new Array();
-		for (var i = 0; i < elements.length; i++) {
-			if ( 'action' == elements[i].name )
-				continue;
-			if ( 'hidden' != elements[i].type && 'submit' != elements[i].type && 'button' != elements[i].type ) {
-				this.clearInputs.push(elements[i]);
-				if ( ajaxObj )
-					ajaxObj.restoreInputs.push([elements[i], elements[i].value]);
-			}
-			var queryComponent = Form.Element.serialize(elements[i]);
-			if (queryComponent) {
-				queryComponents.push(queryComponent);
-			}
-		}
-		return queryComponents.join('&');
-	},
-
-	// form.reset() can only do whole forms.  This can do subsections.
-	clear: function() {
-		this.clearInputs.each( function(i) {
-			i = $(i);
-			if ( 'textarea' == i.tagName.toLowerCase() )
-				i.value = '';
-			else
-				switch ( i.type.toLowerCase() ) {
-					case 'password': case 'text':
-						i.value = '';
-						break;
-					case 'checkbox': case 'radio':
-						i.checked = false;
-						break;
-					case 'select': case 'select-one':
-						i.selectedIndex = null;
-						break;
-					case 'select-multiple':
-						for (var o = 0; o < i.length; o++) i.options[o].selected = false;
-						break;
-				}
-		});
-		this.clearInputs = [];
-	},
-
-	restoreForm: function(elements) {
-		elements.each( function(i) {
-			i[0].value = i[1];
-		});
-	},
-
-	recolorList: function() {
-		if ( !this.alt )
-			return;
-		var alt = this.alt;
-		var offset = this.altOffset;
-		var listItems = $A(this.theList.childNodes).findAll( function(i) { return Element.visible(i) } );
-		listItems.each( function(i,n) {
-			if ( ( n + offset ) % 2 )
-				Element.removeClassName(i,alt);
-			else
-				Element.addClassName(i,alt);
-		});
-	}
-});
-
-//No submit unless code returns true.
-function killSubmit ( code, e ) {
-	e = e ? e : window.event;
-	if ( !e ) return;
-	var t = e.target ? e.target : e.srcElement;
-	if ( ( 'text' == t.type && e.keyCode == 13 ) || ( 'submit' == t.type && 'click' == e.type ) ) {
-		if ( ( 'string' == typeof code && !eval(code) ) || ( 'function' == typeof code && !code() ) ) {
-			e.returnValue = false; e.cancelBubble = true; return false;
-		}
-	}
-}
-//Generic but lame JS closure
-function encloseFunc(f){var a=arguments[1];return function(){return f(a);}}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/prototype.js 2.5.src/wp-includes/js/prototype.js
--- 2.2.2.src/wp-includes/js/prototype.js	2007-05-04 16:48:43.000000000 -0500
+++ 2.5.src/wp-includes/js/prototype.js	2007-12-28 13:17:21.000000000 -0600
@@ -1,38 +1,111 @@
-/*  Prototype JavaScript framework, version 1.5.0
+/*  Prototype JavaScript framework, version 1.6.0
  *  (c) 2005-2007 Sam Stephenson
  *
  *  Prototype is freely distributable under the terms of an MIT-style license.
- *  For details, see the Prototype web site: http://prototype.conio.net/
+ *  For details, see the Prototype web site: http://www.prototypejs.org/
  *
-/*--------------------------------------------------------------------------*/
+ *--------------------------------------------------------------------------*/
 
 var Prototype = {
-  Version: '1.5.0',
+  Version: '1.6.0',
+
+  Browser: {
+    IE:     !!(window.attachEvent && !window.opera),
+    Opera:  !!window.opera,
+    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
+    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1,
+    MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
+  },
+
   BrowserFeatures: {
-    XPath: !!document.evaluate
+    XPath: !!document.evaluate,
+    ElementExtensions: !!window.HTMLElement,
+    SpecificElementExtensions:
+      document.createElement('div').__proto__ &&
+      document.createElement('div').__proto__ !==
+        document.createElement('form').__proto__
   },
 
-  ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',
-  emptyFunction: function() {},
+  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
+  JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,
+
+  emptyFunction: function() { },
   K: function(x) { return x }
-}
+};
+
+if (Prototype.Browser.MobileSafari)
+  Prototype.BrowserFeatures.SpecificElementExtensions = false;
 
+if (Prototype.Browser.WebKit)
+  Prototype.BrowserFeatures.XPath = false;
+
+/* Based on Alex Arnell's inheritance implementation. */
 var Class = {
   create: function() {
-    return function() {
+    var parent = null, properties = $A(arguments);
+    if (Object.isFunction(properties[0]))
+      parent = properties.shift();
+
+    function klass() {
       this.initialize.apply(this, arguments);
     }
+
+    Object.extend(klass, Class.Methods);
+    klass.superclass = parent;
+    klass.subclasses = [];
+
+    if (parent) {
+      var subclass = function() { };
+      subclass.prototype = parent.prototype;
+      klass.prototype = new subclass;
+      parent.subclasses.push(klass);
+    }
+
+    for (var i = 0; i < properties.length; i++)
+      klass.addMethods(properties[i]);
+
+    if (!klass.prototype.initialize)
+      klass.prototype.initialize = Prototype.emptyFunction;
+
+    klass.prototype.constructor = klass;
+
+    return klass;
+  }
+};
+
+Class.Methods = {
+  addMethods: function(source) {
+    var ancestor   = this.superclass && this.superclass.prototype;
+    var properties = Object.keys(source);
+
+    if (!Object.keys({ toString: true }).length)
+      properties.push("toString", "valueOf");
+
+    for (var i = 0, length = properties.length; i < length; i++) {
+      var property = properties[i], value = source[property];
+      if (ancestor && Object.isFunction(value) &&
+          value.argumentNames().first() == "$super") {
+        var method = value, value = Object.extend((function(m) {
+          return function() { return ancestor[m].apply(this, arguments) };
+        })(property).wrap(method), {
+          valueOf:  function() { return method },
+          toString: function() { return method.toString() }
+        });
+      }
+      this.prototype[property] = value;
+    }
+
+    return this;
   }
-}
+};
 
-var Abstract = new Object();
+var Abstract = { };
 
 Object.extend = function(destination, source) {
-  for (var property in source) {
+  for (var property in source)
     destination[property] = source[property];
-  }
   return destination;
-}
+};
 
 Object.extend(Object, {
   inspect: function(object) {
@@ -46,6 +119,37 @@
     }
   },
 
+  toJSON: function(object) {
+    var type = typeof object;
+    switch (type) {
+      case 'undefined':
+      case 'function':
+      case 'unknown': return;
+      case 'boolean': return object.toString();
+    }
+
+    if (object === null) return 'null';
+    if (object.toJSON) return object.toJSON();
+    if (Object.isElement(object)) return;
+
+    var results = [];
+    for (var property in object) {
+      var value = Object.toJSON(object[property]);
+      if (value !== undefined)
+        results.push(property.toJSON() + ': ' + value);
+    }
+
+    return '{' + results.join(', ') + '}';
+  },
+
+  toQueryString: function(object) {
+    return $H(object).toQueryString();
+  },
+
+  toHTML: function(object) {
+    return object && object.toHTML ? object.toHTML() : String.interpret(object);
+  },
+
   keys: function(object) {
     var keys = [];
     for (var property in object)
@@ -61,41 +165,101 @@
   },
 
   clone: function(object) {
-    return Object.extend({}, object);
+    return Object.extend({ }, object);
+  },
+
+  isElement: function(object) {
+    return object && object.nodeType == 1;
+  },
+
+  isArray: function(object) {
+    return object && object.constructor === Array;
+  },
+
+  isHash: function(object) {
+    return object instanceof Hash;
+  },
+
+  isFunction: function(object) {
+    return typeof object == "function";
+  },
+
+  isString: function(object) {
+    return typeof object == "string";
+  },
+
+  isNumber: function(object) {
+    return typeof object == "number";
+  },
+
+  isUndefined: function(object) {
+    return typeof object == "undefined";
   }
 });
 
-Function.prototype.bind = function() {
-  var __method = this, args = $A(arguments), object = args.shift();
-  return function() {
-    return __method.apply(object, args.concat($A(arguments)));
-  }
-}
+Object.extend(Function.prototype, {
+  argumentNames: function() {
+    var names = this.toString().match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",").invoke("strip");
+    return names.length == 1 && !names[0] ? [] : names;
+  },
 
-Function.prototype.bindAsEventListener = function(object) {
-  var __method = this, args = $A(arguments), object = args.shift();
-  return function(event) {
-    return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments)));
-  }
-}
+  bind: function() {
+    if (arguments.length < 2 && arguments[0] === undefined) return this;
+    var __method = this, args = $A(arguments), object = args.shift();
+    return function() {
+      return __method.apply(object, args.concat($A(arguments)));
+    }
+  },
 
-Object.extend(Number.prototype, {
-  toColorPart: function() {
-    var digits = this.toString(16);
-    if (this < 16) return '0' + digits;
-    return digits;
+  bindAsEventListener: function() {
+    var __method = this, args = $A(arguments), object = args.shift();
+    return function(event) {
+      return __method.apply(object, [event || window.event].concat(args));
+    }
   },
 
-  succ: function() {
-    return this + 1;
+  curry: function() {
+    if (!arguments.length) return this;
+    var __method = this, args = $A(arguments);
+    return function() {
+      return __method.apply(this, args.concat($A(arguments)));
+    }
   },
 
-  times: function(iterator) {
-    $R(0, this, true).each(iterator);
-    return this;
+  delay: function() {
+    var __method = this, args = $A(arguments), timeout = args.shift() * 1000;
+    return window.setTimeout(function() {
+      return __method.apply(__method, args);
+    }, timeout);
+  },
+
+  wrap: function(wrapper) {
+    var __method = this;
+    return function() {
+      return wrapper.apply(this, [__method.bind(this)].concat($A(arguments)));
+    }
+  },
+
+  methodize: function() {
+    if (this._methodized) return this._methodized;
+    var __method = this;
+    return this._methodized = function() {
+      return __method.apply(null, [this].concat($A(arguments)));
+    };
   }
 });
 
+Function.prototype.defer = Function.prototype.delay.curry(0.01);
+
+Date.prototype.toJSON = function() {
+  return '"' + this.getUTCFullYear() + '-' +
+    (this.getUTCMonth() + 1).toPaddedString(2) + '-' +
+    this.getUTCDate().toPaddedString(2) + 'T' +
+    this.getUTCHours().toPaddedString(2) + ':' +
+    this.getUTCMinutes().toPaddedString(2) + ':' +
+    this.getUTCSeconds().toPaddedString(2) + 'Z"';
+};
+
 var Try = {
   these: function() {
     var returnValue;
@@ -105,17 +269,22 @@
       try {
         returnValue = lambda();
         break;
-      } catch (e) {}
+      } catch (e) { }
     }
 
     return returnValue;
   }
-}
+};
+
+RegExp.prototype.match = RegExp.prototype.test;
+
+RegExp.escape = function(str) {
+  return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
+};
 
 /*--------------------------------------------------------------------------*/
 
-var PeriodicalExecuter = Class.create();
-PeriodicalExecuter.prototype = {
+var PeriodicalExecuter = Class.create({
   initialize: function(callback, frequency) {
     this.callback = callback;
     this.frequency = frequency;
@@ -128,6 +297,10 @@
     this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
   },
 
+  execute: function() {
+    this.callback(this);
+  },
+
   stop: function() {
     if (!this.timer) return;
     clearInterval(this.timer);
@@ -138,16 +311,26 @@
     if (!this.currentlyExecuting) {
       try {
         this.currentlyExecuting = true;
-        this.callback(this);
+        this.execute();
       } finally {
         this.currentlyExecuting = false;
       }
     }
   }
-}
-String.interpret = function(value){
-  return value == null ? '' : String(value);
-}
+});
+Object.extend(String, {
+  interpret: function(value) {
+    return value == null ? '' : String(value);
+  },
+  specialChar: {
+    '\b': '\\b',
+    '\t': '\\t',
+    '\n': '\\n',
+    '\f': '\\f',
+    '\r': '\\r',
+    '\\': '\\\\'
+  }
+});
 
 Object.extend(String.prototype, {
   gsub: function(pattern, replacement) {
@@ -178,14 +361,14 @@
 
   scan: function(pattern, iterator) {
     this.gsub(pattern, iterator);
-    return this;
+    return String(this);
   },
 
   truncate: function(length, truncation) {
     length = length || 30;
     truncation = truncation === undefined ? '...' : truncation;
     return this.length > length ?
-      this.slice(0, length - truncation.length) + truncation : this;
+      this.slice(0, length - truncation.length) + truncation : String(this);
   },
 
   strip: function() {
@@ -213,35 +396,34 @@
   },
 
   escapeHTML: function() {
-    var div = document.createElement('div');
-    var text = document.createTextNode(this);
-    div.appendChild(text);
-    return div.innerHTML;
+    var self = arguments.callee;
+    self.text.data = this;
+    return self.div.innerHTML;
   },
 
   unescapeHTML: function() {
-    var div = document.createElement('div');
+    var div = new Element('div');
     div.innerHTML = this.stripTags();
     return div.childNodes[0] ? (div.childNodes.length > 1 ?
-      $A(div.childNodes).inject('',function(memo,node){ return memo+node.nodeValue }) :
+      $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) :
       div.childNodes[0].nodeValue) : '';
   },
 
   toQueryParams: function(separator) {
     var match = this.strip().match(/([^?#]*)(#.*)?$/);
-    if (!match) return {};
+    if (!match) return { };
 
-    return match[1].split(separator || '&').inject({}, function(hash, pair) {
+    return match[1].split(separator || '&').inject({ }, function(hash, pair) {
       if ((pair = pair.split('='))[0]) {
-        var name = decodeURIComponent(pair[0]);
-        var value = pair[1] ? decodeURIComponent(pair[1]) : undefined;
-
-        if (hash[name] !== undefined) {
-          if (hash[name].constructor != Array)
-            hash[name] = [hash[name]];
-          if (value) hash[name].push(value);
+        var key = decodeURIComponent(pair.shift());
+        var value = pair.length > 1 ? pair.join('=') : pair[0];
+        if (value != undefined) value = decodeURIComponent(value);
+
+        if (key in hash) {
+          if (!Object.isArray(hash[key])) hash[key] = [hash[key]];
+          hash[key].push(value);
         }
-        else hash[name] = value;
+        else hash[key] = value;
       }
       return hash;
     });
@@ -256,6 +438,10 @@
       String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
   },
 
+  times: function(count) {
+    return count < 1 ? '' : new Array(count + 1).join(this);
+  },
+
   camelize: function() {
     var parts = this.split('-'), len = parts.length;
     if (len == 1) return parts[0];
@@ -270,7 +456,7 @@
     return camelized;
   },
 
-  capitalize: function(){
+  capitalize: function() {
     return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
   },
 
@@ -283,52 +469,128 @@
   },
 
   inspect: function(useDoubleQuotes) {
-    var escapedString = this.replace(/\\/g, '\\\\');
-    if (useDoubleQuotes)
-      return '"' + escapedString.replace(/"/g, '\\"') + '"';
-    else
-      return "'" + escapedString.replace(/'/g, '\\\'') + "'";
+    var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) {
+      var character = String.specialChar[match[0]];
+      return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16);
+    });
+    if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
+    return "'" + escapedString.replace(/'/g, '\\\'') + "'";
+  },
+
+  toJSON: function() {
+    return this.inspect(true);
+  },
+
+  unfilterJSON: function(filter) {
+    return this.sub(filter || Prototype.JSONFilter, '#{1}');
+  },
+
+  isJSON: function() {
+    var str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
+    return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
+  },
+
+  evalJSON: function(sanitize) {
+    var json = this.unfilterJSON();
+    try {
+      if (!sanitize || json.isJSON()) return eval('(' + json + ')');
+    } catch (e) { }
+    throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
+  },
+
+  include: function(pattern) {
+    return this.indexOf(pattern) > -1;
+  },
+
+  startsWith: function(pattern) {
+    return this.indexOf(pattern) === 0;
+  },
+
+  endsWith: function(pattern) {
+    var d = this.length - pattern.length;
+    return d >= 0 && this.lastIndexOf(pattern) === d;
+  },
+
+  empty: function() {
+    return this == '';
+  },
+
+  blank: function() {
+    return /^\s*$/.test(this);
+  },
+
+  interpolate: function(object, pattern) {
+    return new Template(this, pattern).evaluate(object);
+  }
+});
+
+if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, {
+  escapeHTML: function() {
+    return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
+  },
+  unescapeHTML: function() {
+    return this.replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>');
   }
 });
 
 String.prototype.gsub.prepareReplacement = function(replacement) {
-  if (typeof replacement == 'function') return replacement;
+  if (Object.isFunction(replacement)) return replacement;
   var template = new Template(replacement);
   return function(match) { return template.evaluate(match) };
-}
+};
 
 String.prototype.parseQuery = String.prototype.toQueryParams;
 
-var Template = Class.create();
-Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
-Template.prototype = {
+Object.extend(String.prototype.escapeHTML, {
+  div:  document.createElement('div'),
+  text: document.createTextNode('')
+});
+
+with (String.prototype.escapeHTML) div.appendChild(text);
+
+var Template = Class.create({
   initialize: function(template, pattern) {
     this.template = template.toString();
-    this.pattern  = pattern || Template.Pattern;
+    this.pattern = pattern || Template.Pattern;
   },
 
   evaluate: function(object) {
+    if (Object.isFunction(object.toTemplateReplacements))
+      object = object.toTemplateReplacements();
+
     return this.template.gsub(this.pattern, function(match) {
-      var before = match[1];
+      if (object == null) return '';
+
+      var before = match[1] || '';
       if (before == '\\') return match[2];
-      return before + String.interpret(object[match[3]]);
-    });
+
+      var ctx = object, expr = match[3];
+      var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/, match = pattern.exec(expr);
+      if (match == null) return before;
+
+      while (match != null) {
+        var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1];
+        ctx = ctx[comp];
+        if (null == ctx || '' == match[3]) break;
+        expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
+        match = pattern.exec(expr);
+      }
+
+      return before + String.interpret(ctx);
+    }.bind(this));
   }
-}
+});
+Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
 
-var $break    = new Object();
-var $continue = new Object();
+var $break = { };
 
 var Enumerable = {
-  each: function(iterator) {
+  each: function(iterator, context) {
     var index = 0;
+    iterator = iterator.bind(context);
     try {
       this._each(function(value) {
-        try {
-          iterator(value, index++);
-        } catch (e) {
-          if (e != $continue) throw e;
-        }
+        iterator(value, index++);
       });
     } catch (e) {
       if (e != $break) throw e;
@@ -336,40 +598,45 @@
     return this;
   },
 
-  eachSlice: function(number, iterator) {
+  eachSlice: function(number, iterator, context) {
+    iterator = iterator ? iterator.bind(context) : Prototype.K;
     var index = -number, slices = [], array = this.toArray();
     while ((index += number) < array.length)
       slices.push(array.slice(index, index+number));
-    return slices.map(iterator);
+    return slices.collect(iterator, context);
   },
 
-  all: function(iterator) {
+  all: function(iterator, context) {
+    iterator = iterator ? iterator.bind(context) : Prototype.K;
     var result = true;
     this.each(function(value, index) {
-      result = result && !!(iterator || Prototype.K)(value, index);
+      result = result && !!iterator(value, index);
       if (!result) throw $break;
     });
     return result;
   },
 
-  any: function(iterator) {
+  any: function(iterator, context) {
+    iterator = iterator ? iterator.bind(context) : Prototype.K;
     var result = false;
     this.each(function(value, index) {
-      if (result = !!(iterator || Prototype.K)(value, index))
+      if (result = !!iterator(value, index))
         throw $break;
     });
     return result;
   },
 
-  collect: function(iterator) {
+  collect: function(iterator, context) {
+    iterator = iterator ? iterator.bind(context) : Prototype.K;
     var results = [];
     this.each(function(value, index) {
-      results.push((iterator || Prototype.K)(value, index));
+      results.push(iterator(value, index));
     });
     return results;
   },
 
-  detect: function(iterator) {
+  detect: function(iterator, context) {
+    iterator = iterator.bind(context);
     var result;
     this.each(function(value, index) {
       if (iterator(value, index)) {
@@ -380,7 +647,8 @@
     return result;
   },
 
-  findAll: function(iterator) {
+  findAll: function(iterator, context) {
+    iterator = iterator.bind(context);
     var results = [];
     this.each(function(value, index) {
       if (iterator(value, index))
@@ -389,17 +657,24 @@
     return results;
   },
 
-  grep: function(pattern, iterator) {
+  grep: function(filter, iterator, context) {
+    iterator = iterator ? iterator.bind(context) : Prototype.K;
     var results = [];
+
+    if (Object.isString(filter))
+      filter = new RegExp(filter);
+
     this.each(function(value, index) {
-      var stringValue = value.toString();
-      if (stringValue.match(pattern))
-        results.push((iterator || Prototype.K)(value, index));
-    })
+      if (filter.match(value))
+        results.push(iterator(value, index));
+    });
     return results;
   },
 
   include: function(object) {
+    if (Object.isFunction(this.indexOf))
+      if (this.indexOf(object) != -1) return true;
+
     var found = false;
     this.each(function(value) {
       if (value == object) {
@@ -418,7 +693,8 @@
     });
   },
 
-  inject: function(memo, iterator) {
+  inject: function(memo, iterator, context) {
+    iterator = iterator.bind(context);
     this.each(function(value, index) {
       memo = iterator(memo, value, index);
     });
@@ -432,30 +708,33 @@
     });
   },
 
-  max: function(iterator) {
+  max: function(iterator, context) {
+    iterator = iterator ? iterator.bind(context) : Prototype.K;
     var result;
     this.each(function(value, index) {
-      value = (iterator || Prototype.K)(value, index);
+      value = iterator(value, index);
       if (result == undefined || value >= result)
         result = value;
     });
     return result;
   },
 
-  min: function(iterator) {
+  min: function(iterator, context) {
+    iterator = iterator ? iterator.bind(context) : Prototype.K;
     var result;
     this.each(function(value, index) {
-      value = (iterator || Prototype.K)(value, index);
+      value = iterator(value, index);
       if (result == undefined || value < result)
         result = value;
     });
     return result;
   },
 
-  partition: function(iterator) {
+  partition: function(iterator, context) {
+    iterator = iterator ? iterator.bind(context) : Prototype.K;
     var trues = [], falses = [];
     this.each(function(value, index) {
-      ((iterator || Prototype.K)(value, index) ?
+      (iterator(value, index) ?
         trues : falses).push(value);
     });
     return [trues, falses];
@@ -463,13 +742,14 @@
 
   pluck: function(property) {
     var results = [];
-    this.each(function(value, index) {
+    this.each(function(value) {
       results.push(value[property]);
     });
     return results;
   },
 
-  reject: function(iterator) {
+  reject: function(iterator, context) {
+    iterator = iterator.bind(context);
     var results = [];
     this.each(function(value, index) {
       if (!iterator(value, index))
@@ -478,7 +758,8 @@
     return results;
   },
 
-  sortBy: function(iterator) {
+  sortBy: function(iterator, context) {
+    iterator = iterator.bind(context);
     return this.map(function(value, index) {
       return {value: value, criteria: iterator(value, index)};
     }).sort(function(left, right) {
@@ -493,7 +774,7 @@
 
   zip: function() {
     var iterator = Prototype.K, args = $A(arguments);
-    if (typeof args.last() == 'function')
+    if (Object.isFunction(args.last()))
       iterator = args.pop();
 
     var collections = [this].concat(args).map($A);
@@ -509,31 +790,42 @@
   inspect: function() {
     return '#<Enumerable:' + this.toArray().inspect() + '>';
   }
-}
+};
 
 Object.extend(Enumerable, {
   map:     Enumerable.collect,
   find:    Enumerable.detect,
   select:  Enumerable.findAll,
+  filter:  Enumerable.findAll,
   member:  Enumerable.include,
-  entries: Enumerable.toArray
+  entries: Enumerable.toArray,
+  every:   Enumerable.all,
+  some:    Enumerable.any
 });
-var $A = Array.from = function(iterable) {
+function $A(iterable) {
   if (!iterable) return [];
-  if (iterable.toArray) {
-    return iterable.toArray();
-  } else {
-    var results = [];
-    for (var i = 0, length = iterable.length; i < length; i++)
-      results.push(iterable[i]);
+  if (iterable.toArray) return iterable.toArray();
+  var length = iterable.length, results = new Array(length);
+  while (length--) results[length] = iterable[length];
+  return results;
+}
+
+if (Prototype.Browser.WebKit) {
+  function $A(iterable) {
+    if (!iterable) return [];
+    if (!(Object.isFunction(iterable) && iterable == '[object NodeList]') &&
+        iterable.toArray) return iterable.toArray();
+    var length = iterable.length, results = new Array(length);
+    while (length--) results[length] = iterable[length];
     return results;
   }
 }
 
+Array.from = $A;
+
 Object.extend(Array.prototype, Enumerable);
 
-if (!Array.prototype._reverse)
-  Array.prototype._reverse = Array.prototype.reverse;
+if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse;
 
 Object.extend(Array.prototype, {
   _each: function(iterator) {
@@ -562,7 +854,7 @@
 
   flatten: function() {
     return this.inject([], function(array, value) {
-      return array.concat(value && value.constructor == Array ?
+      return array.concat(Object.isArray(value) ?
         value.flatten() : [value]);
     });
   },
@@ -574,12 +866,6 @@
     });
   },
 
-  indexOf: function(object) {
-    for (var i = 0, length = this.length; i < length; i++)
-      if (this[i] == object) return i;
-    return -1;
-  },
-
   reverse: function(inline) {
     return (inline !== false ? this : this.toArray())._reverse();
   },
@@ -588,9 +874,17 @@
     return this.length > 1 ? this : this[0];
   },
 
-  uniq: function() {
-    return this.inject([], function(array, value) {
-      return array.include(value) ? array : array.concat([value]);
+  uniq: function(sorted) {
+    return this.inject([], function(array, value, index) {
+      if (0 == index || (sorted ? array.last() != value : !array.include(value)))
+        array.push(value);
+      return array;
+    });
+  },
+
+  intersect: function(array) {
+    return this.uniq().findAll(function(item) {
+      return array.detect(function(value) { return item === value });
     });
   },
 
@@ -604,125 +898,208 @@
 
   inspect: function() {
     return '[' + this.map(Object.inspect).join(', ') + ']';
+  },
+
+  toJSON: function() {
+    var results = [];
+    this.each(function(object) {
+      var value = Object.toJSON(object);
+      if (value !== undefined) results.push(value);
+    });
+    return '[' + results.join(', ') + ']';
   }
 });
 
+// use native browser JS 1.6 implementation if available
+if (Object.isFunction(Array.prototype.forEach))
+  Array.prototype._each = Array.prototype.forEach;
+
+if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) {
+  i || (i = 0);
+  var length = this.length;
+  if (i < 0) i = length + i;
+  for (; i < length; i++)
+    if (this[i] === item) return i;
+  return -1;
+};
+
+if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) {
+  i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
+  var n = this.slice(0, i).reverse().indexOf(item);
+  return (n < 0) ? n : i - n - 1;
+};
+
 Array.prototype.toArray = Array.prototype.clone;
 
-function $w(string){
+function $w(string) {
+  if (!Object.isString(string)) return [];
   string = string.strip();
   return string ? string.split(/\s+/) : [];
 }
 
-if(window.opera){
-  Array.prototype.concat = function(){
+if (Prototype.Browser.Opera){
+  Array.prototype.concat = function() {
     var array = [];
-    for(var i = 0, length = this.length; i < length; i++) array.push(this[i]);
-    for(var i = 0, length = arguments.length; i < length; i++) {
-      if(arguments[i].constructor == Array) {
-        for(var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
+    for (var i = 0, length = this.length; i < length; i++) array.push(this[i]);
+    for (var i = 0, length = arguments.length; i < length; i++) {
+      if (Object.isArray(arguments[i])) {
+        for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
           array.push(arguments[i][j]);
       } else {
         array.push(arguments[i]);
       }
     }
     return array;
-  }
+  };
 }
-var Hash = function(obj) {
-  Object.extend(this, obj || {});
-};
+Object.extend(Number.prototype, {
+  toColorPart: function() {
+    return this.toPaddedString(2, 16);
+  },
 
-Object.extend(Hash, {
-  toQueryString: function(obj) {
-    var parts = [];
-
-	  this.prototype._each.call(obj, function(pair) {
-      if (!pair.key) return;
-
-      if (pair.value && pair.value.constructor == Array) {
-        var values = pair.value.compact();
-        if (values.length < 2) pair.value = values.reduce();
-        else {
-        	key = encodeURIComponent(pair.key);
-          values.each(function(value) {
-            value = value != undefined ? encodeURIComponent(value) : '';
-            parts.push(key + '=' + encodeURIComponent(value));
-          });
-          return;
-        }
-      }
-      if (pair.value == undefined) pair[1] = '';
-      parts.push(pair.map(encodeURIComponent).join('='));
-	  });
+  succ: function() {
+    return this + 1;
+  },
+
+  times: function(iterator) {
+    $R(0, this, true).each(iterator);
+    return this;
+  },
 
-    return parts.join('&');
+  toPaddedString: function(length, radix) {
+    var string = this.toString(radix || 10);
+    return '0'.times(length - string.length) + string;
+  },
+
+  toJSON: function() {
+    return isFinite(this) ? this.toString() : 'null';
   }
 });
 
-Object.extend(Hash.prototype, Enumerable);
-Object.extend(Hash.prototype, {
-  _each: function(iterator) {
-    for (var key in this) {
-      var value = this[key];
-      if (value && value == Hash.prototype[key]) continue;
+$w('abs round ceil floor').each(function(method){
+  Number.prototype[method] = Math[method].methodize();
+});
+function $H(object) {
+  return new Hash(object);
+};
 
-      var pair = [key, value];
-      pair.key = key;
-      pair.value = value;
-      iterator(pair);
+var Hash = Class.create(Enumerable, (function() {
+  if (function() {
+    var i = 0, Test = function(value) { this.key = value };
+    Test.prototype.key = 'foo';
+    for (var property in new Test('bar')) i++;
+    return i > 1;
+  }()) {
+    function each(iterator) {
+      var cache = [];
+      for (var key in this._object) {
+        var value = this._object[key];
+        if (cache.include(key)) continue;
+        cache.push(key);
+        var pair = [key, value];
+        pair.key = key;
+        pair.value = value;
+        iterator(pair);
+      }
     }
-  },
-
-  keys: function() {
-    return this.pluck('key');
-  },
+  } else {
+    function each(iterator) {
+      for (var key in this._object) {
+        var value = this._object[key], pair = [key, value];
+        pair.key = key;
+        pair.value = value;
+        iterator(pair);
+      }
+    }
+  }
 
-  values: function() {
-    return this.pluck('value');
-  },
+  function toQueryPair(key, value) {
+    if (Object.isUndefined(value)) return key;
+    return key + '=' + encodeURIComponent(String.interpret(value));
+  }
+
+  return {
+    initialize: function(object) {
+      this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
+    },
+
+    _each: each,
+
+    set: function(key, value) {
+      return this._object[key] = value;
+    },
+
+    get: function(key) {
+      return this._object[key];
+    },
+
+    unset: function(key) {
+      var value = this._object[key];
+      delete this._object[key];
+      return value;
+    },
+
+    toObject: function() {
+      return Object.clone(this._object);
+    },
+
+    keys: function() {
+      return this.pluck('key');
+    },
+
+    values: function() {
+      return this.pluck('value');
+    },
+
+    index: function(value) {
+      var match = this.detect(function(pair) {
+        return pair.value === value;
+      });
+      return match && match.key;
+    },
 
-  merge: function(hash) {
-    return $H(hash).inject(this, function(mergedHash, pair) {
-      mergedHash[pair.key] = pair.value;
-      return mergedHash;
-    });
-  },
+    merge: function(object) {
+      return this.clone().update(object);
+    },
+
+    update: function(object) {
+      return new Hash(object).inject(this, function(result, pair) {
+        result.set(pair.key, pair.value);
+        return result;
+      });
+    },
 
-  remove: function() {
-    var result;
-    for(var i = 0, length = arguments.length; i < length; i++) {
-      var value = this[arguments[i]];
-      if (value !== undefined){
-        if (result === undefined) result = value;
-        else {
-          if (result.constructor != Array) result = [result];
-          result.push(value)
+    toQueryString: function() {
+      return this.map(function(pair) {
+        var key = encodeURIComponent(pair.key), values = pair.value;
+
+        if (values && typeof values == 'object') {
+          if (Object.isArray(values))
+            return values.map(toQueryPair.curry(key)).join('&');
         }
-      }
-      delete this[arguments[i]];
-    }
-    return result;
-  },
+        return toQueryPair(key, values);
+      }).join('&');
+    },
 
-  toQueryString: function() {
-    return Hash.toQueryString(this);
-  },
+    inspect: function() {
+      return '#<Hash:{' + this.map(function(pair) {
+        return pair.map(Object.inspect).join(': ');
+      }).join(', ') + '}>';
+    },
 
-  inspect: function() {
-    return '#<Hash:{' + this.map(function(pair) {
-      return pair.map(Object.inspect).join(': ');
-    }).join(', ') + '}>';
+    toJSON: function() {
+      return Object.toJSON(this.toObject());
+    },
+
+    clone: function() {
+      return new Hash(this);
+    }
   }
-});
+})());
 
-function $H(object) {
-  if (object && object.constructor == Hash) return object;
-  return new Hash(object);
-};
-ObjectRange = Class.create();
-Object.extend(ObjectRange.prototype, Enumerable);
-Object.extend(ObjectRange.prototype, {
+Hash.prototype.toTemplateReplacements = Hash.prototype.toObject;
+Hash.from = $H;
+var ObjectRange = Class.create(Enumerable, {
   initialize: function(start, end, exclusive) {
     this.start = start;
     this.end = end;
@@ -748,7 +1125,7 @@
 
 var $R = function(start, end, exclusive) {
   return new ObjectRange(start, end, exclusive);
-}
+};
 
 var Ajax = {
   getTransport: function() {
@@ -760,7 +1137,7 @@
   },
 
   activeRequestCount: 0
-}
+};
 
 Ajax.Responders = {
   responders: [],
@@ -780,10 +1157,10 @@
 
   dispatch: function(callback, request, transport, json) {
     this.each(function(responder) {
-      if (typeof responder[callback] == 'function') {
+      if (Object.isFunction(responder[callback])) {
         try {
           responder[callback].apply(responder, [request, transport, json]);
-        } catch (e) {}
+        } catch (e) { }
       }
     });
   }
@@ -792,49 +1169,42 @@
 Object.extend(Ajax.Responders, Enumerable);
 
 Ajax.Responders.register({
-  onCreate: function() {
-    Ajax.activeRequestCount++;
-  },
-  onComplete: function() {
-    Ajax.activeRequestCount--;
-  }
+  onCreate:   function() { Ajax.activeRequestCount++ },
+  onComplete: function() { Ajax.activeRequestCount-- }
 });
 
-Ajax.Base = function() {};
-Ajax.Base.prototype = {
-  setOptions: function(options) {
+Ajax.Base = Class.create({
+  initialize: function(options) {
     this.options = {
       method:       'post',
       asynchronous: true,
       contentType:  'application/x-www-form-urlencoded',
       encoding:     'UTF-8',
-      parameters:   ''
-    }
-    Object.extend(this.options, options || {});
+      parameters:   '',
+      evalJSON:     true,
+      evalJS:       true
+    };
+    Object.extend(this.options, options || { });
 
     this.options.method = this.options.method.toLowerCase();
-    if (typeof this.options.parameters == 'string')
+    if (Object.isString(this.options.parameters))
       this.options.parameters = this.options.parameters.toQueryParams();
   }
-}
-
-Ajax.Request = Class.create();
-Ajax.Request.Events =
-  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
+});
 
-Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
+Ajax.Request = Class.create(Ajax.Base, {
   _complete: false,
 
-  initialize: function(url, options) {
+  initialize: function($super, url, options) {
+    $super(options);
     this.transport = Ajax.getTransport();
-    this.setOptions(options);
     this.request(url);
   },
 
   request: function(url) {
     this.url = url;
     this.method = this.options.method;
-    var params = this.options.parameters;
+    var params = Object.clone(this.options.parameters);
 
     if (!['get', 'post'].include(this.method)) {
       // simulate other verbs over post
@@ -842,28 +1212,31 @@
       this.method = 'post';
     }
 
-    params = Hash.toQueryString(params);
-    if (params && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) params += '&_='
+    this.parameters = params;
 
-    // when GET, append parameters to URL
-    if (this.method == 'get' && params)
-      this.url += (this.url.indexOf('?') > -1 ? '&' : '?') + params;
+    if (params = Object.toQueryString(params)) {
+      // when GET, append parameters to URL
+      if (this.method == 'get')
+        this.url += (this.url.include('?') ? '&' : '?') + params;
+      else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
+        params += '&_=';
+    }
 
     try {
-      Ajax.Responders.dispatch('onCreate', this, this.transport);
+      var response = new Ajax.Response(this);
+      if (this.options.onCreate) this.options.onCreate(response);
+      Ajax.Responders.dispatch('onCreate', this, response);
 
       this.transport.open(this.method.toUpperCase(), this.url,
         this.options.asynchronous);
 
-      if (this.options.asynchronous)
-        setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10);
+      if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1);
 
       this.transport.onreadystatechange = this.onStateChange.bind(this);
       this.setRequestHeaders();
 
-      var body = this.method == 'post' ? (this.options.postBody || params) : null;
-
-      this.transport.send(body);
+      this.body = this.method == 'post' ? (this.options.postBody || params) : null;
+      this.transport.send(this.body);
 
       /* Force Firefox to handle ready state 4 for synchronous requests */
       if (!this.options.asynchronous && this.transport.overrideMimeType)
@@ -905,7 +1278,7 @@
     if (typeof this.options.requestHeaders == 'object') {
       var extras = this.options.requestHeaders;
 
-      if (typeof extras.push == 'function')
+      if (Object.isFunction(extras.push))
         for (var i = 0, length = extras.length; i < length; i += 2)
           headers[extras[i]] = extras[i+1];
       else
@@ -917,32 +1290,39 @@
   },
 
   success: function() {
-    return !this.transport.status
-        || (this.transport.status >= 200 && this.transport.status < 300);
+    var status = this.getStatus();
+    return !status || (status >= 200 && status < 300);
+  },
+
+  getStatus: function() {
+    try {
+      return this.transport.status || 0;
+    } catch (e) { return 0 }
   },
 
   respondToReadyState: function(readyState) {
-    var state = Ajax.Request.Events[readyState];
-    var transport = this.transport, json = this.evalJSON();
+    var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this);
 
     if (state == 'Complete') {
       try {
         this._complete = true;
-        (this.options['on' + this.transport.status]
+        (this.options['on' + response.status]
          || this.options['on' + (this.success() ? 'Success' : 'Failure')]
-         || Prototype.emptyFunction)(transport, json);
+         || Prototype.emptyFunction)(response, response.headerJSON);
       } catch (e) {
         this.dispatchException(e);
       }
 
-      if ((this.getHeader('Content-type') || 'text/javascript').strip().
-        match(/^(text|application)\/(x-)?(java|ecma)script(;.*)?$/i))
-          this.evalResponse();
+      var contentType = response.getHeader('Content-type');
+      if (this.options.evalJS == 'force'
+          || (this.options.evalJS && contentType
+          && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
+        this.evalResponse();
     }
 
     try {
-      (this.options['on' + state] || Prototype.emptyFunction)(transport, json);
-      Ajax.Responders.dispatch('on' + state, this, transport, json);
+      (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON);
+      Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON);
     } catch (e) {
       this.dispatchException(e);
     }
@@ -959,16 +1339,9 @@
     } catch (e) { return null }
   },
 
-  evalJSON: function() {
-    try {
-      var json = this.getHeader('X-JSON');
-      return json ? eval('(' + json + ')') : null;
-    } catch (e) { return null }
-  },
-
   evalResponse: function() {
     try {
-      return eval(this.transport.responseText);
+      return eval((this.transport.responseText || '').unfilterJSON());
     } catch (e) {
       this.dispatchException(e);
     }
@@ -980,57 +1353,129 @@
   }
 });
 
-Ajax.Updater = Class.create();
+Ajax.Request.Events =
+  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
+
+Ajax.Response = Class.create({
+  initialize: function(request){
+    this.request = request;
+    var transport  = this.transport  = request.transport,
+        readyState = this.readyState = transport.readyState;
 
-Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
-  initialize: function(container, url, options) {
-    this.container = {
-      success: (container.success || container),
-      failure: (container.failure || (container.success ? null : container))
+    if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {
+      this.status       = this.getStatus();
+      this.statusText   = this.getStatusText();
+      this.responseText = String.interpret(transport.responseText);
+      this.headerJSON   = this._getHeaderJSON();
     }
 
-    this.transport = Ajax.getTransport();
-    this.setOptions(options);
+    if(readyState == 4) {
+      var xml = transport.responseXML;
+      this.responseXML  = xml === undefined ? null : xml;
+      this.responseJSON = this._getResponseJSON();
+    }
+  },
 
-    var onComplete = this.options.onComplete || Prototype.emptyFunction;
-    this.options.onComplete = (function(transport, param) {
-      this.updateContent();
-      onComplete(transport, param);
+  status:      0,
+  statusText: '',
+
+  getStatus: Ajax.Request.prototype.getStatus,
+
+  getStatusText: function() {
+    try {
+      return this.transport.statusText || '';
+    } catch (e) { return '' }
+  },
+
+  getHeader: Ajax.Request.prototype.getHeader,
+
+  getAllHeaders: function() {
+    try {
+      return this.getAllResponseHeaders();
+    } catch (e) { return null }
+  },
+
+  getResponseHeader: function(name) {
+    return this.transport.getResponseHeader(name);
+  },
+
+  getAllResponseHeaders: function() {
+    return this.transport.getAllResponseHeaders();
+  },
+
+  _getHeaderJSON: function() {
+    var json = this.getHeader('X-JSON');
+    if (!json) return null;
+    json = decodeURIComponent(escape(json));
+    try {
+      return json.evalJSON(this.request.options.sanitizeJSON);
+    } catch (e) {
+      this.request.dispatchException(e);
+    }
+  },
+
+  _getResponseJSON: function() {
+    var options = this.request.options;
+    if (!options.evalJSON || (options.evalJSON != 'force' &&
+      !(this.getHeader('Content-type') || '').include('application/json')))
+        return null;
+    try {
+      return this.transport.responseText.evalJSON(options.sanitizeJSON);
+    } catch (e) {
+      this.request.dispatchException(e);
+    }
+  }
+});
+
+Ajax.Updater = Class.create(Ajax.Request, {
+  initialize: function($super, container, url, options) {
+    this.container = {
+      success: (container.success || container),
+      failure: (container.failure || (container.success ? null : container))
+    };
+
+    options = options || { };
+    var onComplete = options.onComplete;
+    options.onComplete = (function(response, param) {
+      this.updateContent(response.responseText);
+      if (Object.isFunction(onComplete)) onComplete(response, param);
     }).bind(this);
 
-    this.request(url);
+    $super(url, options);
   },
 
-  updateContent: function() {
-    var receiver = this.container[this.success() ? 'success' : 'failure'];
-    var response = this.transport.responseText;
+  updateContent: function(responseText) {
+    var receiver = this.container[this.success() ? 'success' : 'failure'],
+        options = this.options;
 
-    if (!this.options.evalScripts) response = response.stripScripts();
+    if (!options.evalScripts) responseText = responseText.stripScripts();
 
     if (receiver = $(receiver)) {
-      if (this.options.insertion)
-        new this.options.insertion(receiver, response);
-      else
-        receiver.update(response);
+      if (options.insertion) {
+        if (Object.isString(options.insertion)) {
+          var insertion = { }; insertion[options.insertion] = responseText;
+          receiver.insert(insertion);
+        }
+        else options.insertion(receiver, responseText);
+      }
+      else receiver.update(responseText);
     }
 
     if (this.success()) {
-      if (this.onComplete)
-        setTimeout(this.onComplete.bind(this), 10);
+      if (this.onComplete) this.onComplete.bind(this).defer();
     }
   }
 });
 
-Ajax.PeriodicalUpdater = Class.create();
-Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
-  initialize: function(container, url, options) {
-    this.setOptions(options);
+Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
+  initialize: function($super, container, url, options) {
+    $super(options);
     this.onComplete = this.options.onComplete;
 
     this.frequency = (this.options.frequency || 2);
     this.decay = (this.options.decay || 1);
 
-    this.updater = {};
+    this.updater = { };
     this.container = container;
     this.url = url;
 
@@ -1048,15 +1493,14 @@
     (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
   },
 
-  updateComplete: function(request) {
+  updateComplete: function(response) {
     if (this.options.decay) {
-      this.decay = (request.responseText == this.lastText ?
+      this.decay = (response.responseText == this.lastText ?
         this.decay * this.options.decay : 1);
 
-      this.lastText = request.responseText;
+      this.lastText = response.responseText;
     }
-    this.timer = setTimeout(this.onTimerEvent.bind(this),
-      this.decay * this.frequency * 1000);
+    this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);
   },
 
   onTimerEvent: function() {
@@ -1069,7 +1513,7 @@
       elements.push($(arguments[i]));
     return elements;
   }
-  if (typeof element == 'string')
+  if (Object.isString(element))
     element = document.getElementById(element);
   return Element.extend(element);
 }
@@ -1080,63 +1524,51 @@
     var query = document.evaluate(expression, $(parentElement) || document,
       null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
     for (var i = 0, length = query.snapshotLength; i < length; i++)
-      results.push(query.snapshotItem(i));
+      results.push(Element.extend(query.snapshotItem(i)));
     return results;
   };
 }
 
-document.getElementsByClassName = function(className, parentElement) {
-  if (Prototype.BrowserFeatures.XPath) {
-    var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]";
-    return document._getElementsByXPath(q, parentElement);
-  } else {
-    var children = ($(parentElement) || document.body).getElementsByTagName('*');
-    var elements = [], child;
-    for (var i = 0, length = children.length; i < length; i++) {
-      child = children[i];
-      if (Element.hasClassName(child, className))
-        elements.push(Element.extend(child));
-    }
-    return elements;
-  }
-};
-
 /*--------------------------------------------------------------------------*/
 
-if (!window.Element)
-  var Element = new Object();
-
-Element.extend = function(element) {
-  if (!element || _nativeExtensions || element.nodeType == 3) return element;
-
-  if (!element._extended && element.tagName && element != window) {
-    var methods = Object.clone(Element.Methods), cache = Element.extend.cache;
-
-    if (element.tagName == 'FORM')
-      Object.extend(methods, Form.Methods);
-    if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName))
-      Object.extend(methods, Form.Element.Methods);
+if (!window.Node) var Node = { };
 
-    Object.extend(methods, Element.Methods.Simulated);
+if (!Node.ELEMENT_NODE) {
+  // DOM level 2 ECMAScript Language Binding
+  Object.extend(Node, {
+    ELEMENT_NODE: 1,
+    ATTRIBUTE_NODE: 2,
+    TEXT_NODE: 3,
+    CDATA_SECTION_NODE: 4,
+    ENTITY_REFERENCE_NODE: 5,
+    ENTITY_NODE: 6,
+    PROCESSING_INSTRUCTION_NODE: 7,
+    COMMENT_NODE: 8,
+    DOCUMENT_NODE: 9,
+    DOCUMENT_TYPE_NODE: 10,
+    DOCUMENT_FRAGMENT_NODE: 11,
+    NOTATION_NODE: 12
+  });
+}
 
-    for (var property in methods) {
-      var value = methods[property];
-      if (typeof value == 'function' && !(property in element))
-        element[property] = cache.findOrStore(value);
+(function() {
+  var element = this.Element;
+  this.Element = function(tagName, attributes) {
+    attributes = attributes || { };
+    tagName = tagName.toLowerCase();
+    var cache = Element.cache;
+    if (Prototype.Browser.IE && attributes.name) {
+      tagName = '<' + tagName + ' name="' + attributes.name + '">';
+      delete attributes.name;
+      return Element.writeAttribute(document.createElement(tagName), attributes);
     }
-  }
-
-  element._extended = true;
-  return element;
-};
+    if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName));
+    return Element.writeAttribute(cache[tagName].cloneNode(false), attributes);
+  };
+  Object.extend(this.Element, element || { });
+}).call(window);
 
-Element.extend.cache = {
-  findOrStore: function(value) {
-    return this[value] = this[value] || function() {
-      return value.apply(null, [this].concat($A(arguments)));
-    }
-  }
-};
+Element.cache = { };
 
 Element.Methods = {
   visible: function(element) {
@@ -1165,28 +1597,74 @@
     return element;
   },
 
-  update: function(element, html) {
-    html = typeof html == 'undefined' ? '' : html.toString();
-    $(element).innerHTML = html.stripScripts();
-    setTimeout(function() {html.evalScripts()}, 10);
+  update: function(element, content) {
+    element = $(element);
+    if (content && content.toElement) content = content.toElement();
+    if (Object.isElement(content)) return element.update().insert(content);
+    content = Object.toHTML(content);
+    element.innerHTML = content.stripScripts();
+    content.evalScripts.bind(content).defer();
     return element;
   },
 
-  replace: function(element, html) {
+  replace: function(element, content) {
     element = $(element);
-    html = typeof html == 'undefined' ? '' : html.toString();
-    if (element.outerHTML) {
-      element.outerHTML = html.stripScripts();
-    } else {
+    if (content && content.toElement) content = content.toElement();
+    else if (!Object.isElement(content)) {
+      content = Object.toHTML(content);
       var range = element.ownerDocument.createRange();
-      range.selectNodeContents(element);
-      element.parentNode.replaceChild(
-        range.createContextualFragment(html.stripScripts()), element);
+      range.selectNode(element);
+      content.evalScripts.bind(content).defer();
+      content = range.createContextualFragment(content.stripScripts());
+    }
+    element.parentNode.replaceChild(content, element);
+    return element;
+  },
+
+  insert: function(element, insertions) {
+    element = $(element);
+
+    if (Object.isString(insertions) || Object.isNumber(insertions) ||
+        Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
+          insertions = {bottom:insertions};
+
+    var content, t, range;
+
+    for (position in insertions) {
+      content  = insertions[position];
+      position = position.toLowerCase();
+      t = Element._insertionTranslations[position];
+
+      if (content && content.toElement) content = content.toElement();
+      if (Object.isElement(content)) {
+        t.insert(element, content);
+        continue;
+      }
+
+      content = Object.toHTML(content);
+
+      range = element.ownerDocument.createRange();
+      t.initializeRange(element, range);
+      t.insert(element, range.createContextualFragment(content.stripScripts()));
+
+      content.evalScripts.bind(content).defer();
     }
-    setTimeout(function() {html.evalScripts()}, 10);
+
     return element;
   },
 
+  wrap: function(element, wrapper, attributes) {
+    element = $(element);
+    if (Object.isElement(wrapper))
+      $(wrapper).writeAttribute(attributes || { });
+    else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes);
+    else wrapper = new Element('div', wrapper);
+    if (element.parentNode)
+      element.parentNode.replaceChild(wrapper, element);
+    wrapper.appendChild(element);
+    return wrapper;
+  },
+
   inspect: function(element) {
     element = $(element);
     var result = '<' + element.tagName.toLowerCase();
@@ -1212,7 +1690,13 @@
   },
 
   descendants: function(element) {
-    return $A($(element).getElementsByTagName('*'));
+    return $A($(element).getElementsByTagName('*')).each(Element.extend);
+  },
+
+  firstDescendant: function(element) {
+    element = $(element).firstChild;
+    while (element && element.nodeType != 1) element = element.nextSibling;
+    return $(element);
   },
 
   immediateDescendants: function(element) {
@@ -1236,48 +1720,95 @@
   },
 
   match: function(element, selector) {
-    if (typeof selector == 'string')
+    if (Object.isString(selector))
       selector = new Selector(selector);
     return selector.match($(element));
   },
 
   up: function(element, expression, index) {
-    return Selector.findElement($(element).ancestors(), expression, index);
+    element = $(element);
+    if (arguments.length == 1) return $(element.parentNode);
+    var ancestors = element.ancestors();
+    return expression ? Selector.findElement(ancestors, expression, index) :
+      ancestors[index || 0];
   },
 
   down: function(element, expression, index) {
-    return Selector.findElement($(element).descendants(), expression, index);
+    element = $(element);
+    if (arguments.length == 1) return element.firstDescendant();
+    var descendants = element.descendants();
+    return expression ? Selector.findElement(descendants, expression, index) :
+      descendants[index || 0];
   },
 
   previous: function(element, expression, index) {
-    return Selector.findElement($(element).previousSiblings(), expression, index);
+    element = $(element);
+    if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));
+    var previousSiblings = element.previousSiblings();
+    return expression ? Selector.findElement(previousSiblings, expression, index) :
+      previousSiblings[index || 0];
   },
 
   next: function(element, expression, index) {
-    return Selector.findElement($(element).nextSiblings(), expression, index);
+    element = $(element);
+    if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));
+    var nextSiblings = element.nextSiblings();
+    return expression ? Selector.findElement(nextSiblings, expression, index) :
+      nextSiblings[index || 0];
   },
 
-  getElementsBySelector: function() {
+  select: function() {
     var args = $A(arguments), element = $(args.shift());
     return Selector.findChildElements(element, args);
   },
 
-  getElementsByClassName: function(element, className) {
-    return document.getElementsByClassName(className, element);
+  adjacent: function() {
+    var args = $A(arguments), element = $(args.shift());
+    return Selector.findChildElements(element.parentNode, args).without(element);
+  },
+
+  identify: function(element) {
+    element = $(element);
+    var id = element.readAttribute('id'), self = arguments.callee;
+    if (id) return id;
+    do { id = 'anonymous_element_' + self.counter++ } while ($(id));
+    element.writeAttribute('id', id);
+    return id;
   },
 
   readAttribute: function(element, name) {
     element = $(element);
-    if (document.all && !window.opera) {
-      var t = Element._attributeTranslations;
+    if (Prototype.Browser.IE) {
+      var t = Element._attributeTranslations.read;
       if (t.values[name]) return t.values[name](element, name);
-      if (t.names[name])  name = t.names[name];
-      var attribute = element.attributes[name];
-      if(attribute) return attribute.nodeValue;
+      if (t.names[name]) name = t.names[name];
+      if (name.include(':')) {
+        return (!element.attributes || !element.attributes[name]) ? null :
+         element.attributes[name].value;
+      }
     }
     return element.getAttribute(name);
   },
 
+  writeAttribute: function(element, name, value) {
+    element = $(element);
+    var attributes = { }, t = Element._attributeTranslations.write;
+
+    if (typeof name == 'object') attributes = name;
+    else attributes[name] = value === undefined ? true : value;
+
+    for (var attr in attributes) {
+      var name = t.names[attr] || attr, value = attributes[attr];
+      if (t.values[attr]) name = t.values[attr](element, value);
+      if (value === false || value === null)
+        element.removeAttribute(name);
+      else if (value === true)
+        element.setAttribute(name, name);
+      else element.setAttribute(name, value);
+    }
+    return element;
+  },
+
   getHeight: function(element) {
     return $(element).getDimensions().height;
   },
@@ -1293,39 +1824,28 @@
   hasClassName: function(element, className) {
     if (!(element = $(element))) return;
     var elementClassName = element.className;
-    if (elementClassName.length == 0) return false;
-    if (elementClassName == className ||
-        elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
-      return true;
-    return false;
+    return (elementClassName.length > 0 && (elementClassName == className ||
+      new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
   },
 
   addClassName: function(element, className) {
     if (!(element = $(element))) return;
-    Element.classNames(element).add(className);
+    if (!element.hasClassName(className))
+      element.className += (element.className ? ' ' : '') + className;
     return element;
   },
 
   removeClassName: function(element, className) {
     if (!(element = $(element))) return;
-    Element.classNames(element).remove(className);
+    element.className = element.className.replace(
+      new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();
     return element;
   },
 
   toggleClassName: function(element, className) {
     if (!(element = $(element))) return;
-    Element.classNames(element)[element.hasClassName(className) ? 'remove' : 'add'](className);
-    return element;
-  },
-
-  observe: function() {
-    Event.observe.apply(Event, arguments);
-    return $A(arguments).first();
-  },
-
-  stopObserving: function() {
-    Event.stopObserving.apply(Event, arguments);
-    return $A(arguments).first();
+    return element[element.hasClassName(className) ?
+      'removeClassName' : 'addClassName'](className);
   },
 
   // removes whitespace-only text node children
@@ -1342,11 +1862,25 @@
   },
 
   empty: function(element) {
-    return $(element).innerHTML.match(/^\s*$/);
+    return $(element).innerHTML.blank();
   },
 
   descendantOf: function(element, ancestor) {
     element = $(element), ancestor = $(ancestor);
+
+    if (element.compareDocumentPosition)
+      return (element.compareDocumentPosition(ancestor) & 8) === 8;
+
+    if (element.sourceIndex && !Prototype.Browser.Opera) {
+      var e = element.sourceIndex, a = ancestor.sourceIndex,
+       nextAncestor = ancestor.nextSibling;
+      if (!nextAncestor) {
+        do { ancestor = ancestor.parentNode; }
+        while (!(nextAncestor = ancestor.nextSibling) && ancestor.parentNode);
+      }
+      if (nextAncestor) return (e > a && e < nextAncestor.sourceIndex);
+    }
+
     while (element = element.parentNode)
       if (element == ancestor) return true;
     return false;
@@ -1354,62 +1888,49 @@
 
   scrollTo: function(element) {
     element = $(element);
-    var pos = Position.cumulativeOffset(element);
+    var pos = element.cumulativeOffset();
     window.scrollTo(pos[0], pos[1]);
     return element;
   },
 
   getStyle: function(element, style) {
     element = $(element);
-    if (['float','cssFloat'].include(style))
-      style = (typeof element.style.styleFloat != 'undefined' ? 'styleFloat' : 'cssFloat');
-    style = style.camelize();
+    style = style == 'float' ? 'cssFloat' : style.camelize();
     var value = element.style[style];
     if (!value) {
-      if (document.defaultView && document.defaultView.getComputedStyle) {
-        var css = document.defaultView.getComputedStyle(element, null);
-        value = css ? css[style] : null;
-      } else if (element.currentStyle) {
-        value = element.currentStyle[style];
-      }
-    }
-
-    if((value == 'auto') && ['width','height'].include(style) && (element.getStyle('display') != 'none'))
-      value = element['offset'+style.capitalize()] + 'px';
-
-    if (window.opera && ['left', 'top', 'right', 'bottom'].include(style))
-      if (Element.getStyle(element, 'position') == 'static') value = 'auto';
-    if(style == 'opacity') {
-      if(value) return parseFloat(value);
-      if(value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
-        if(value[1]) return parseFloat(value[1]) / 100;
-      return 1.0;
+      var css = document.defaultView.getComputedStyle(element, null);
+      value = css ? css[style] : null;
     }
+    if (style == 'opacity') return value ? parseFloat(value) : 1.0;
     return value == 'auto' ? null : value;
   },
 
-  setStyle: function(element, style) {
+  getOpacity: function(element) {
+    return $(element).getStyle('opacity');
+  },
+
+  setStyle: function(element, styles) {
     element = $(element);
-    for (var name in style) {
-      var value = style[name];
-      if(name == 'opacity') {
-        if (value == 1) {
-          value = (/Gecko/.test(navigator.userAgent) &&
-            !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : 1.0;
-          if(/MSIE/.test(navigator.userAgent) && !window.opera)
-            element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
-        } else if(value == '') {
-          if(/MSIE/.test(navigator.userAgent) && !window.opera)
-            element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
-        } else {
-          if(value < 0.00001) value = 0;
-          if(/MSIE/.test(navigator.userAgent) && !window.opera)
-            element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'') +
-              'alpha(opacity='+value*100+')';
-        }
-      } else if(['float','cssFloat'].include(name)) name = (typeof element.style.styleFloat != 'undefined') ? 'styleFloat' : 'cssFloat';
-      element.style[name.camelize()] = value;
+    var elementStyle = element.style, match;
+    if (Object.isString(styles)) {
+      element.style.cssText += ';' + styles;
+      return styles.include('opacity') ?
+        element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element;
     }
+    for (var property in styles)
+      if (property == 'opacity') element.setOpacity(styles[property]);
+      else
+        elementStyle[(property == 'float' || property == 'cssFloat') ?
+          (elementStyle.styleFloat === undefined ? 'cssFloat' : 'styleFloat') :
+            property] = styles[property];
+
+    return element;
+  },
+
+  setOpacity: function(element, value) {
+    element = $(element);
+    element.style.opacity = (value == 1 || value === '') ? '' :
+      (value < 0.00001) ? 0 : value;
     return element;
   },
 
@@ -1468,8 +1989,8 @@
   makeClipping: function(element) {
     element = $(element);
     if (element._overflow) return element;
-    element._overflow = element.style.overflow || 'auto';
-    if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')
+    element._overflow = Element.getStyle(element, 'overflow') || 'auto';
+    if (element._overflow !== 'hidden')
       element.style.overflow = 'hidden';
     return element;
   },
@@ -1480,390 +2001,1338 @@
     element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
     element._overflow = null;
     return element;
-  }
-};
-
-Object.extend(Element.Methods, {childOf: Element.Methods.descendantOf});
-
-Element._attributeTranslations = {};
-
-Element._attributeTranslations.names = {
-  colspan:   "colSpan",
-  rowspan:   "rowSpan",
-  valign:    "vAlign",
-  datetime:  "dateTime",
-  accesskey: "accessKey",
-  tabindex:  "tabIndex",
-  enctype:   "encType",
-  maxlength: "maxLength",
-  readonly:  "readOnly",
-  longdesc:  "longDesc"
-};
-
-Element._attributeTranslations.values = {
-  _getAttr: function(element, attribute) {
-    return element.getAttribute(attribute, 2);
   },
 
-  _flag: function(element, attribute) {
-    return $(element).hasAttribute(attribute) ? attribute : null;
+  cumulativeOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      element = element.offsetParent;
+    } while (element);
+    return Element._returnOffset(valueL, valueT);
   },
 
-  style: function(element) {
-    return element.style.cssText.toLowerCase();
+  positionedOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      element = element.offsetParent;
+      if (element) {
+        if (element.tagName == 'BODY') break;
+        var p = Element.getStyle(element, 'position');
+        if (p == 'relative' || p == 'absolute') break;
+      }
+    } while (element);
+    return Element._returnOffset(valueL, valueT);
   },
 
-  title: function(element) {
-    var node = element.getAttributeNode('title');
-    return node.specified ? node.nodeValue : null;
-  }
-};
-
-Object.extend(Element._attributeTranslations.values, {
-  href: Element._attributeTranslations.values._getAttr,
-  src:  Element._attributeTranslations.values._getAttr,
-  disabled: Element._attributeTranslations.values._flag,
-  checked:  Element._attributeTranslations.values._flag,
-  readonly: Element._attributeTranslations.values._flag,
-  multiple: Element._attributeTranslations.values._flag
-});
+  absolutize: function(element) {
+    element = $(element);
+    if (element.getStyle('position') == 'absolute') return;
+    // Position.prepare(); // To be done manually by Scripty when it needs it.
 
-Element.Methods.Simulated = {
-  hasAttribute: function(element, attribute) {
-    var t = Element._attributeTranslations;
-    attribute = t.names[attribute] || attribute;
-    return $(element).getAttributeNode(attribute).specified;
-  }
-};
+    var offsets = element.positionedOffset();
+    var top     = offsets[1];
+    var left    = offsets[0];
+    var width   = element.clientWidth;
+    var height  = element.clientHeight;
 
-// IE is missing .innerHTML support for TABLE-related elements
-if (document.all && !window.opera){
-  Element.Methods.update = function(element, html) {
-    element = $(element);
-    html = typeof html == 'undefined' ? '' : html.toString();
-    var tagName = element.tagName.toUpperCase();
-    if (['THEAD','TBODY','TR','TD'].include(tagName)) {
-      var div = document.createElement('div');
-      switch (tagName) {
-        case 'THEAD':
-        case 'TBODY':
-          div.innerHTML = '<table><tbody>' +  html.stripScripts() + '</tbody></table>';
-          depth = 2;
-          break;
-        case 'TR':
-          div.innerHTML = '<table><tbody><tr>' +  html.stripScripts() + '</tr></tbody></table>';
-          depth = 3;
-          break;
-        case 'TD':
-          div.innerHTML = '<table><tbody><tr><td>' +  html.stripScripts() + '</td></tr></tbody></table>';
-          depth = 4;
-      }
-      $A(element.childNodes).each(function(node){
-        element.removeChild(node)
-      });
-      depth.times(function(){ div = div.firstChild });
+    element._originalLeft   = left - parseFloat(element.style.left  || 0);
+    element._originalTop    = top  - parseFloat(element.style.top || 0);
+    element._originalWidth  = element.style.width;
+    element._originalHeight = element.style.height;
 
-      $A(div.childNodes).each(
-        function(node){ element.appendChild(node) });
-    } else {
-      element.innerHTML = html.stripScripts();
-    }
-    setTimeout(function() {html.evalScripts()}, 10);
+    element.style.position = 'absolute';
+    element.style.top    = top + 'px';
+    element.style.left   = left + 'px';
+    element.style.width  = width + 'px';
+    element.style.height = height + 'px';
     return element;
-  }
-};
+  },
 
-Object.extend(Element, Element.Methods);
+  relativize: function(element) {
+    element = $(element);
+    if (element.getStyle('position') == 'relative') return;
+    // Position.prepare(); // To be done manually by Scripty when it needs it.
 
-var _nativeExtensions = false;
+    element.style.position = 'relative';
+    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
+    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
 
-if(/Konqueror|Safari|KHTML/.test(navigator.userAgent))
-  ['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) {
-    var className = 'HTML' + tag + 'Element';
-    if(window[className]) return;
-    var klass = window[className] = {};
-    klass.prototype = document.createElement(tag ? tag.toLowerCase() : 'div').__proto__;
-  });
+    element.style.top    = top + 'px';
+    element.style.left   = left + 'px';
+    element.style.height = element._originalHeight;
+    element.style.width  = element._originalWidth;
+    return element;
+  },
 
-Element.addMethods = function(methods) {
-  Object.extend(Element.Methods, methods || {});
+  cumulativeScrollOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.scrollTop  || 0;
+      valueL += element.scrollLeft || 0;
+      element = element.parentNode;
+    } while (element);
+    return Element._returnOffset(valueL, valueT);
+  },
 
-  function copy(methods, destination, onlyIfAbsent) {
-    onlyIfAbsent = onlyIfAbsent || false;
-    var cache = Element.extend.cache;
-    for (var property in methods) {
-      var value = methods[property];
-      if (!onlyIfAbsent || !(property in destination))
-        destination[property] = cache.findOrStore(value);
-    }
-  }
+  getOffsetParent: function(element) {
+    if (element.offsetParent) return $(element.offsetParent);
+    if (element == document.body) return $(element);
 
-  if (typeof HTMLElement != 'undefined') {
-    copy(Element.Methods, HTMLElement.prototype);
-    copy(Element.Methods.Simulated, HTMLElement.prototype, true);
-    copy(Form.Methods, HTMLFormElement.prototype);
-    [HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) {
-      copy(Form.Element.Methods, klass.prototype);
-    });
-    _nativeExtensions = true;
-  }
-}
+    while ((element = element.parentNode) && element != document.body)
+      if (Element.getStyle(element, 'position') != 'static')
+        return $(element);
 
-var Toggle = new Object();
-Toggle.display = Element.toggle;
+    return $(document.body);
+  },
 
-/*--------------------------------------------------------------------------*/
+  viewportOffset: function(forElement) {
+    var valueT = 0, valueL = 0;
 
-Abstract.Insertion = function(adjacency) {
-  this.adjacency = adjacency;
-}
+    var element = forElement;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
 
-Abstract.Insertion.prototype = {
-  initialize: function(element, content) {
-    this.element = $(element);
-    this.content = content.stripScripts();
+      // Safari fix
+      if (element.offsetParent == document.body &&
+        Element.getStyle(element, 'position') == 'absolute') break;
 
-    if (this.adjacency && this.element.insertAdjacentHTML) {
-      try {
-        this.element.insertAdjacentHTML(this.adjacency, this.content);
-      } catch (e) {
-        var tagName = this.element.tagName.toUpperCase();
-        if (['TBODY', 'TR'].include(tagName)) {
-          this.insertContent(this.contentFromAnonymousTable());
-        } else {
-          throw e;
-        }
+    } while (element = element.offsetParent);
+
+    element = forElement;
+    do {
+      if (!Prototype.Browser.Opera || element.tagName == 'BODY') {
+        valueT -= element.scrollTop  || 0;
+        valueL -= element.scrollLeft || 0;
       }
-    } else {
-      this.range = this.element.ownerDocument.createRange();
-      if (this.initializeRange) this.initializeRange();
-      this.insertContent([this.range.createContextualFragment(this.content)]);
-    }
+    } while (element = element.parentNode);
 
-    setTimeout(function() {content.evalScripts()}, 10);
+    return Element._returnOffset(valueL, valueT);
   },
 
-  contentFromAnonymousTable: function() {
-    var div = document.createElement('div');
-    div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';
-    return $A(div.childNodes[0].childNodes[0].childNodes);
-  }
-}
-
-var Insertion = new Object();
-
-Insertion.Before = Class.create();
-Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
-  initializeRange: function() {
-    this.range.setStartBefore(this.element);
-  },
+  clonePosition: function(element, source) {
+    var options = Object.extend({
+      setLeft:    true,
+      setTop:     true,
+      setWidth:   true,
+      setHeight:  true,
+      offsetTop:  0,
+      offsetLeft: 0
+    }, arguments[2] || { });
 
-  insertContent: function(fragments) {
-    fragments.each((function(fragment) {
-      this.element.parentNode.insertBefore(fragment, this.element);
-    }).bind(this));
-  }
-});
+    // find page position of source
+    source = $(source);
+    var p = source.viewportOffset();
 
-Insertion.Top = Class.create();
-Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {
-  initializeRange: function() {
-    this.range.selectNodeContents(this.element);
-    this.range.collapse(true);
-  },
+    // find coordinate system to use
+    element = $(element);
+    var delta = [0, 0];
+    var parent = null;
+    // delta [0,0] will do fine with position: fixed elements,
+    // position:absolute needs offsetParent deltas
+    if (Element.getStyle(element, 'position') == 'absolute') {
+      parent = element.getOffsetParent();
+      delta = parent.viewportOffset();
+    }
 
-  insertContent: function(fragments) {
-    fragments.reverse(false).each((function(fragment) {
-      this.element.insertBefore(fragment, this.element.firstChild);
-    }).bind(this));
+    // correct by body offsets (fixes Safari)
+    if (parent == document.body) {
+      delta[0] -= document.body.offsetLeft;
+      delta[1] -= document.body.offsetTop;
+    }
+
+    // set position
+    if (options.setLeft)   element.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
+    if (options.setTop)    element.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
+    if (options.setWidth)  element.style.width = source.offsetWidth + 'px';
+    if (options.setHeight) element.style.height = source.offsetHeight + 'px';
+    return element;
   }
+};
+
+Element.Methods.identify.counter = 1;
+
+Object.extend(Element.Methods, {
+  getElementsBySelector: Element.Methods.select,
+  childElements: Element.Methods.immediateDescendants
 });
 
-Insertion.Bottom = Class.create();
-Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {
-  initializeRange: function() {
-    this.range.selectNodeContents(this.element);
-    this.range.collapse(this.element);
+Element._attributeTranslations = {
+  write: {
+    names: {
+      className: 'class',
+      htmlFor:   'for'
+    },
+    values: { }
+  }
+};
+
+
+if (!document.createRange || Prototype.Browser.Opera) {
+  Element.Methods.insert = function(element, insertions) {
+    element = $(element);
+
+    if (Object.isString(insertions) || Object.isNumber(insertions) ||
+        Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
+          insertions = { bottom: insertions };
+
+    var t = Element._insertionTranslations, content, position, pos, tagName;
+
+    for (position in insertions) {
+      content  = insertions[position];
+      position = position.toLowerCase();
+      pos      = t[position];
+
+      if (content && content.toElement) content = content.toElement();
+      if (Object.isElement(content)) {
+        pos.insert(element, content);
+        continue;
+      }
+
+      content = Object.toHTML(content);
+      tagName = ((position == 'before' || position == 'after')
+        ? element.parentNode : element).tagName.toUpperCase();
+
+      if (t.tags[tagName]) {
+        var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
+        if (position == 'top' || position == 'after') fragments.reverse();
+        fragments.each(pos.insert.curry(element));
+      }
+      else element.insertAdjacentHTML(pos.adjacency, content.stripScripts());
+
+      content.evalScripts.bind(content).defer();
+    }
+
+    return element;
+  };
+}
+
+if (Prototype.Browser.Opera) {
+  Element.Methods._getStyle = Element.Methods.getStyle;
+  Element.Methods.getStyle = function(element, style) {
+    switch(style) {
+      case 'left':
+      case 'top':
+      case 'right':
+      case 'bottom':
+        if (Element._getStyle(element, 'position') == 'static') return null;
+      default: return Element._getStyle(element, style);
+    }
+  };
+  Element.Methods._readAttribute = Element.Methods.readAttribute;
+  Element.Methods.readAttribute = function(element, attribute) {
+    if (attribute == 'title') return element.title;
+    return Element._readAttribute(element, attribute);
+  };
+}
+
+else if (Prototype.Browser.IE) {
+  $w('positionedOffset getOffsetParent viewportOffset').each(function(method) {
+    Element.Methods[method] = Element.Methods[method].wrap(
+      function(proceed, element) {
+        element = $(element);
+        var position = element.getStyle('position');
+        if (position != 'static') return proceed(element);
+        element.setStyle({ position: 'relative' });
+        var value = proceed(element);
+        element.setStyle({ position: position });
+        return value;
+      }
+    );
+  });
+
+  Element.Methods.getStyle = function(element, style) {
+    element = $(element);
+    style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
+    var value = element.style[style];
+    if (!value && element.currentStyle) value = element.currentStyle[style];
+
+    if (style == 'opacity') {
+      if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
+        if (value[1]) return parseFloat(value[1]) / 100;
+      return 1.0;
+    }
+
+    if (value == 'auto') {
+      if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))
+        return element['offset' + style.capitalize()] + 'px';
+      return null;
+    }
+    return value;
+  };
+
+  Element.Methods.setOpacity = function(element, value) {
+    function stripAlpha(filter){
+      return filter.replace(/alpha\([^\)]*\)/gi,'');
+    }
+    element = $(element);
+    var currentStyle = element.currentStyle;
+    if ((currentStyle && !currentStyle.hasLayout) ||
+      (!currentStyle && element.style.zoom == 'normal'))
+        element.style.zoom = 1;
+
+    var filter = element.getStyle('filter'), style = element.style;
+    if (value == 1 || value === '') {
+      (filter = stripAlpha(filter)) ?
+        style.filter = filter : style.removeAttribute('filter');
+      return element;
+    } else if (value < 0.00001) value = 0;
+    style.filter = stripAlpha(filter) +
+      'alpha(opacity=' + (value * 100) + ')';
+    return element;
+  };
+
+  Element._attributeTranslations = {
+    read: {
+      names: {
+        'class': 'className',
+        'for':   'htmlFor'
+      },
+      values: {
+        _getAttr: function(element, attribute) {
+          return element.getAttribute(attribute, 2);
+        },
+        _getAttrNode: function(element, attribute) {
+          var node = element.getAttributeNode(attribute);
+          return node ? node.value : "";
+        },
+        _getEv: function(element, attribute) {
+          var attribute = element.getAttribute(attribute);
+          return attribute ? attribute.toString().slice(23, -2) : null;
+        },
+        _flag: function(element, attribute) {
+          return $(element).hasAttribute(attribute) ? attribute : null;
+        },
+        style: function(element) {
+          return element.style.cssText.toLowerCase();
+        },
+        title: function(element) {
+          return element.title;
+        }
+      }
+    }
+  };
+
+  Element._attributeTranslations.write = {
+    names: Object.clone(Element._attributeTranslations.read.names),
+    values: {
+      checked: function(element, value) {
+        element.checked = !!value;
+      },
+
+      style: function(element, value) {
+        element.style.cssText = value ? value : '';
+      }
+    }
+  };
+
+  Element._attributeTranslations.has = {};
+
+  $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +
+      'encType maxLength readOnly longDesc').each(function(attr) {
+    Element._attributeTranslations.write.names[attr.toLowerCase()] = attr;
+    Element._attributeTranslations.has[attr.toLowerCase()] = attr;
+  });
+
+  (function(v) {
+    Object.extend(v, {
+      href:        v._getAttr,
+      src:         v._getAttr,
+      type:        v._getAttr,
+      action:      v._getAttrNode,
+      disabled:    v._flag,
+      checked:     v._flag,
+      readonly:    v._flag,
+      multiple:    v._flag,
+      onload:      v._getEv,
+      onunload:    v._getEv,
+      onclick:     v._getEv,
+      ondblclick:  v._getEv,
+      onmousedown: v._getEv,
+      onmouseup:   v._getEv,
+      onmouseover: v._getEv,
+      onmousemove: v._getEv,
+      onmouseout:  v._getEv,
+      onfocus:     v._getEv,
+      onblur:      v._getEv,
+      onkeypress:  v._getEv,
+      onkeydown:   v._getEv,
+      onkeyup:     v._getEv,
+      onsubmit:    v._getEv,
+      onreset:     v._getEv,
+      onselect:    v._getEv,
+      onchange:    v._getEv
+    });
+  })(Element._attributeTranslations.read.values);
+}
+
+else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
+  Element.Methods.setOpacity = function(element, value) {
+    element = $(element);
+    element.style.opacity = (value == 1) ? 0.999999 :
+      (value === '') ? '' : (value < 0.00001) ? 0 : value;
+    return element;
+  };
+}
+
+else if (Prototype.Browser.WebKit) {
+  Element.Methods.setOpacity = function(element, value) {
+    element = $(element);
+    element.style.opacity = (value == 1 || value === '') ? '' :
+      (value < 0.00001) ? 0 : value;
+
+    if (value == 1)
+      if(element.tagName == 'IMG' && element.width) {
+        element.width++; element.width--;
+      } else try {
+        var n = document.createTextNode(' ');
+        element.appendChild(n);
+        element.removeChild(n);
+      } catch (e) { }
+
+    return element;
+  };
+
+  // Safari returns margins on body which is incorrect if the child is absolutely
+  // positioned.  For performance reasons, redefine Position.cumulativeOffset for
+  // KHTML/WebKit only.
+  Element.Methods.cumulativeOffset = function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      if (element.offsetParent == document.body)
+        if (Element.getStyle(element, 'position') == 'absolute') break;
+
+      element = element.offsetParent;
+    } while (element);
+
+    return Element._returnOffset(valueL, valueT);
+  };
+}
+
+if (Prototype.Browser.IE || Prototype.Browser.Opera) {
+  // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements
+  Element.Methods.update = function(element, content) {
+    element = $(element);
+
+    if (content && content.toElement) content = content.toElement();
+    if (Object.isElement(content)) return element.update().insert(content);
+
+    content = Object.toHTML(content);
+    var tagName = element.tagName.toUpperCase();
+
+    if (tagName in Element._insertionTranslations.tags) {
+      $A(element.childNodes).each(function(node) { element.removeChild(node) });
+      Element._getContentFromAnonymousElement(tagName, content.stripScripts())
+        .each(function(node) { element.appendChild(node) });
+    }
+    else element.innerHTML = content.stripScripts();
+
+    content.evalScripts.bind(content).defer();
+    return element;
+  };
+}
+
+if (document.createElement('div').outerHTML) {
+  Element.Methods.replace = function(element, content) {
+    element = $(element);
+
+    if (content && content.toElement) content = content.toElement();
+    if (Object.isElement(content)) {
+      element.parentNode.replaceChild(content, element);
+      return element;
+    }
+
+    content = Object.toHTML(content);
+    var parent = element.parentNode, tagName = parent.tagName.toUpperCase();
+
+    if (Element._insertionTranslations.tags[tagName]) {
+      var nextSibling = element.next();
+      var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
+      parent.removeChild(element);
+      if (nextSibling)
+        fragments.each(function(node) { parent.insertBefore(node, nextSibling) });
+      else
+        fragments.each(function(node) { parent.appendChild(node) });
+    }
+    else element.outerHTML = content.stripScripts();
+
+    content.evalScripts.bind(content).defer();
+    return element;
+  };
+}
+
+Element._returnOffset = function(l, t) {
+  var result = [l, t];
+  result.left = l;
+  result.top = t;
+  return result;
+};
+
+Element._getContentFromAnonymousElement = function(tagName, html) {
+  var div = new Element('div'), t = Element._insertionTranslations.tags[tagName];
+  div.innerHTML = t[0] + html + t[1];
+  t[2].times(function() { div = div.firstChild });
+  return $A(div.childNodes);
+};
+
+Element._insertionTranslations = {
+  before: {
+    adjacency: 'beforeBegin',
+    insert: function(element, node) {
+      element.parentNode.insertBefore(node, element);
+    },
+    initializeRange: function(element, range) {
+      range.setStartBefore(element);
+    }
+  },
+  top: {
+    adjacency: 'afterBegin',
+    insert: function(element, node) {
+      element.insertBefore(node, element.firstChild);
+    },
+    initializeRange: function(element, range) {
+      range.selectNodeContents(element);
+      range.collapse(true);
+    }
   },
+  bottom: {
+    adjacency: 'beforeEnd',
+    insert: function(element, node) {
+      element.appendChild(node);
+    }
+  },
+  after: {
+    adjacency: 'afterEnd',
+    insert: function(element, node) {
+      element.parentNode.insertBefore(node, element.nextSibling);
+    },
+    initializeRange: function(element, range) {
+      range.setStartAfter(element);
+    }
+  },
+  tags: {
+    TABLE:  ['<table>',                '</table>',                   1],
+    TBODY:  ['<table><tbody>',         '</tbody></table>',           2],
+    TR:     ['<table><tbody><tr>',     '</tr></tbody></table>',      3],
+    TD:     ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4],
+    SELECT: ['<select>',               '</select>',                  1]
+  }
+};
+
+(function() {
+  this.bottom.initializeRange = this.top.initializeRange;
+  Object.extend(this.tags, {
+    THEAD: this.tags.TBODY,
+    TFOOT: this.tags.TBODY,
+    TH:    this.tags.TD
+  });
+}).call(Element._insertionTranslations);
 
-  insertContent: function(fragments) {
-    fragments.each((function(fragment) {
-      this.element.appendChild(fragment);
-    }).bind(this));
+Element.Methods.Simulated = {
+  hasAttribute: function(element, attribute) {
+    attribute = Element._attributeTranslations.has[attribute] || attribute;
+    var node = $(element).getAttributeNode(attribute);
+    return node && node.specified;
   }
-});
+};
 
-Insertion.After = Class.create();
-Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
-  initializeRange: function() {
-    this.range.setStartAfter(this.element);
-  },
+Element.Methods.ByTag = { };
+
+Object.extend(Element, Element.Methods);
+
+if (!Prototype.BrowserFeatures.ElementExtensions &&
+    document.createElement('div').__proto__) {
+  window.HTMLElement = { };
+  window.HTMLElement.prototype = document.createElement('div').__proto__;
+  Prototype.BrowserFeatures.ElementExtensions = true;
+}
+
+Element.extend = (function() {
+  if (Prototype.BrowserFeatures.SpecificElementExtensions)
+    return Prototype.K;
+
+  var Methods = { }, ByTag = Element.Methods.ByTag;
+
+  var extend = Object.extend(function(element) {
+    if (!element || element._extendedByPrototype ||
+        element.nodeType != 1 || element == window) return element;
+
+    var methods = Object.clone(Methods),
+      tagName = element.tagName, property, value;
+
+    // extend methods for specific tags
+    if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);
 
-  insertContent: function(fragments) {
-    fragments.each((function(fragment) {
-      this.element.parentNode.insertBefore(fragment,
-        this.element.nextSibling);
-    }).bind(this));
+    for (property in methods) {
+      value = methods[property];
+      if (Object.isFunction(value) && !(property in element))
+        element[property] = value.methodize();
+    }
+
+    element._extendedByPrototype = Prototype.emptyFunction;
+    return element;
+
+  }, {
+    refresh: function() {
+      // extend methods for all tags (Safari doesn't need this)
+      if (!Prototype.BrowserFeatures.ElementExtensions) {
+        Object.extend(Methods, Element.Methods);
+        Object.extend(Methods, Element.Methods.Simulated);
+      }
+    }
+  });
+
+  extend.refresh();
+  return extend;
+})();
+
+Element.hasAttribute = function(element, attribute) {
+  if (element.hasAttribute) return element.hasAttribute(attribute);
+  return Element.Methods.Simulated.hasAttribute(element, attribute);
+};
+
+Element.addMethods = function(methods) {
+  var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;
+
+  if (!methods) {
+    Object.extend(Form, Form.Methods);
+    Object.extend(Form.Element, Form.Element.Methods);
+    Object.extend(Element.Methods.ByTag, {
+      "FORM":     Object.clone(Form.Methods),
+      "INPUT":    Object.clone(Form.Element.Methods),
+      "SELECT":   Object.clone(Form.Element.Methods),
+      "TEXTAREA": Object.clone(Form.Element.Methods)
+    });
   }
-});
 
-/*--------------------------------------------------------------------------*/
+  if (arguments.length == 2) {
+    var tagName = methods;
+    methods = arguments[1];
+  }
+
+  if (!tagName) Object.extend(Element.Methods, methods || { });
+  else {
+    if (Object.isArray(tagName)) tagName.each(extend);
+    else extend(tagName);
+  }
+
+  function extend(tagName) {
+    tagName = tagName.toUpperCase();
+    if (!Element.Methods.ByTag[tagName])
+      Element.Methods.ByTag[tagName] = { };
+    Object.extend(Element.Methods.ByTag[tagName], methods);
+  }
 
-Element.ClassNames = Class.create();
-Element.ClassNames.prototype = {
-  initialize: function(element) {
-    this.element = $(element);
-  },
+  function copy(methods, destination, onlyIfAbsent) {
+    onlyIfAbsent = onlyIfAbsent || false;
+    for (var property in methods) {
+      var value = methods[property];
+      if (!Object.isFunction(value)) continue;
+      if (!onlyIfAbsent || !(property in destination))
+        destination[property] = value.methodize();
+    }
+  }
 
-  _each: function(iterator) {
-    this.element.className.split(/\s+/).select(function(name) {
-      return name.length > 0;
-    })._each(iterator);
-  },
+  function findDOMClass(tagName) {
+    var klass;
+    var trans = {
+      "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",
+      "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",
+      "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",
+      "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",
+      "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":
+      "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":
+      "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":
+      "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":
+      "FrameSet", "IFRAME": "IFrame"
+    };
+    if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';
+    if (window[klass]) return window[klass];
+    klass = 'HTML' + tagName + 'Element';
+    if (window[klass]) return window[klass];
+    klass = 'HTML' + tagName.capitalize() + 'Element';
+    if (window[klass]) return window[klass];
+
+    window[klass] = { };
+    window[klass].prototype = document.createElement(tagName).__proto__;
+    return window[klass];
+  }
 
-  set: function(className) {
-    this.element.className = className;
+  if (F.ElementExtensions) {
+    copy(Element.Methods, HTMLElement.prototype);
+    copy(Element.Methods.Simulated, HTMLElement.prototype, true);
+  }
+
+  if (F.SpecificElementExtensions) {
+    for (var tag in Element.Methods.ByTag) {
+      var klass = findDOMClass(tag);
+      if (Object.isUndefined(klass)) continue;
+      copy(T[tag], klass.prototype);
+    }
+  }
+
+  Object.extend(Element, Element.Methods);
+  delete Element.ByTag;
+
+  if (Element.extend.refresh) Element.extend.refresh();
+  Element.cache = { };
+};
+
+document.viewport = {
+  getDimensions: function() {
+    var dimensions = { };
+    $w('width height').each(function(d) {
+      var D = d.capitalize();
+      dimensions[d] = self['inner' + D] ||
+       (document.documentElement['client' + D] || document.body['client' + D]);
+    });
+    return dimensions;
   },
 
-  add: function(classNameToAdd) {
-    if (this.include(classNameToAdd)) return;
-    this.set($A(this).concat(classNameToAdd).join(' '));
+  getWidth: function() {
+    return this.getDimensions().width;
   },
 
-  remove: function(classNameToRemove) {
-    if (!this.include(classNameToRemove)) return;
-    this.set($A(this).without(classNameToRemove).join(' '));
+  getHeight: function() {
+    return this.getDimensions().height;
   },
 
-  toString: function() {
-    return $A(this).join(' ');
+  getScrollOffsets: function() {
+    return Element._returnOffset(
+      window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
+      window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);
   }
 };
+/* Portions of the Selector class are derived from Jack Slocum’s DomQuery,
+ * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style
+ * license.  Please see http://www.yui-ext.com/ for more information. */
 
-Object.extend(Element.ClassNames.prototype, Enumerable);
-var Selector = Class.create();
-Selector.prototype = {
+var Selector = Class.create({
   initialize: function(expression) {
-    this.params = {classNames: []};
-    this.expression = expression.toString().strip();
-    this.parseExpression();
+    this.expression = expression.strip();
     this.compileMatcher();
   },
 
-  parseExpression: function() {
-    function abort(message) { throw 'Parse error in selector: ' + message; }
-
-    if (this.expression == '')  abort('empty expression');
+  compileMatcher: function() {
+    // Selectors with namespaced attributes can't use the XPath version
+    if (Prototype.BrowserFeatures.XPath && !(/(\[[\w-]*?:|:checked)/).test(this.expression))
+      return this.compileXPathMatcher();
+
+    var e = this.expression, ps = Selector.patterns, h = Selector.handlers,
+        c = Selector.criteria, le, p, m;
+
+    if (Selector._cache[e]) {
+      this.matcher = Selector._cache[e];
+      return;
+    }
+
+    this.matcher = ["this.matcher = function(root) {",
+                    "var r = root, h = Selector.handlers, c = false, n;"];
+
+    while (e && le != e && (/\S/).test(e)) {
+      le = e;
+      for (var i in ps) {
+        p = ps[i];
+        if (m = e.match(p)) {
+          this.matcher.push(Object.isFunction(c[i]) ? c[i](m) :
+    	      new Template(c[i]).evaluate(m));
+          e = e.replace(m[0], '');
+          break;
+        }
+      }
+    }
 
-    var params = this.params, expr = this.expression, match, modifier, clause, rest;
-    while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) {
-      params.attributes = params.attributes || [];
-      params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''});
-      expr = match[1];
-    }
-
-    if (expr == '*') return this.params.wildcard = true;
-
-    while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) {
-      modifier = match[1], clause = match[2], rest = match[3];
-      switch (modifier) {
-        case '#':       params.id = clause; break;
-        case '.':       params.classNames.push(clause); break;
-        case '':
-        case undefined: params.tagName = clause.toUpperCase(); break;
-        default:        abort(expr.inspect());
-      }
-      expr = rest;
-    }
-
-    if (expr.length > 0) abort(expr.inspect());
-  },
-
-  buildMatchExpression: function() {
-    var params = this.params, conditions = [], clause;
-
-    if (params.wildcard)
-      conditions.push('true');
-    if (clause = params.id)
-      conditions.push('element.readAttribute("id") == ' + clause.inspect());
-    if (clause = params.tagName)
-      conditions.push('element.tagName.toUpperCase() == ' + clause.inspect());
-    if ((clause = params.classNames).length > 0)
-      for (var i = 0, length = clause.length; i < length; i++)
-        conditions.push('element.hasClassName(' + clause[i].inspect() + ')');
-    if (clause = params.attributes) {
-      clause.each(function(attribute) {
-        var value = 'element.readAttribute(' + attribute.name.inspect() + ')';
-        var splitValueBy = function(delimiter) {
-          return value + ' && ' + value + '.split(' + delimiter.inspect() + ')';
+    this.matcher.push("return h.unique(n);\n}");
+    eval(this.matcher.join('\n'));
+    Selector._cache[this.expression] = this.matcher;
+  },
+
+  compileXPathMatcher: function() {
+    var e = this.expression, ps = Selector.patterns,
+        x = Selector.xpath, le, m;
+
+    if (Selector._cache[e]) {
+      this.xpath = Selector._cache[e]; return;
+    }
+
+    this.matcher = ['.//*'];
+    while (e && le != e && (/\S/).test(e)) {
+      le = e;
+      for (var i in ps) {
+        if (m = e.match(ps[i])) {
+          this.matcher.push(Object.isFunction(x[i]) ? x[i](m) :
+            new Template(x[i]).evaluate(m));
+          e = e.replace(m[0], '');
+          break;
         }
+      }
+    }
+
+    this.xpath = this.matcher.join('');
+    Selector._cache[this.expression] = this.xpath;
+  },
 
-        switch (attribute.operator) {
-          case '=':       conditions.push(value + ' == ' + attribute.value.inspect()); break;
-          case '~=':      conditions.push(splitValueBy(' ') + '.include(' + attribute.value.inspect() + ')'); break;
-          case '|=':      conditions.push(
-                            splitValueBy('-') + '.first().toUpperCase() == ' + attribute.value.toUpperCase().inspect()
-                          ); break;
-          case '!=':      conditions.push(value + ' != ' + attribute.value.inspect()); break;
-          case '':
-          case undefined: conditions.push('element.hasAttribute(' + attribute.name.inspect() + ')'); break;
-          default:        throw 'Unknown operator ' + attribute.operator + ' in selector';
+  findElements: function(root) {
+    root = root || document;
+    if (this.xpath) return document._getElementsByXPath(this.xpath, root);
+    return this.matcher(root);
+  },
+
+  match: function(element) {
+    this.tokens = [];
+
+    var e = this.expression, ps = Selector.patterns, as = Selector.assertions;
+    var le, p, m;
+
+    while (e && le !== e && (/\S/).test(e)) {
+      le = e;
+      for (var i in ps) {
+        p = ps[i];
+        if (m = e.match(p)) {
+          // use the Selector.assertions methods unless the selector
+          // is too complex.
+          if (as[i]) {
+            this.tokens.push([i, Object.clone(m)]);
+            e = e.replace(m[0], '');
+          } else {
+            // reluctantly do a document-wide search
+            // and look for a match in the array
+            return this.findElements(document).include(element);
+          }
         }
-      });
+      }
     }
 
-    return conditions.join(' && ');
+    var match = true, name, matches;
+    for (var i = 0, token; token = this.tokens[i]; i++) {
+      name = token[0], matches = token[1];
+      if (!Selector.assertions[name](element, matches)) {
+        match = false; break;
+      }
+    }
+
+    return match;
   },
 
-  compileMatcher: function() {
-    this.match = new Function('element', 'if (!element.tagName) return false; \
-      element = $(element); \
-      return ' + this.buildMatchExpression());
+  toString: function() {
+    return this.expression;
   },
 
-  findElements: function(scope) {
-    var element;
+  inspect: function() {
+    return "#<Selector:" + this.expression.inspect() + ">";
+  }
+});
 
-    if (element = $(this.params.id))
-      if (this.match(element))
-        if (!scope || Element.childOf(element, scope))
-          return [element];
+Object.extend(Selector, {
+  _cache: { },
+
+  xpath: {
+    descendant:   "//*",
+    child:        "/*",
+    adjacent:     "/following-sibling::*[1]",
+    laterSibling: '/following-sibling::*',
+    tagName:      function(m) {
+      if (m[1] == '*') return '';
+      return "[local-name()='" + m[1].toLowerCase() +
+             "' or local-name()='" + m[1].toUpperCase() + "']";
+    },
+    className:    "[contains(concat(' ', @class, ' '), ' #{1} ')]",
+    id:           "[@id='#{1}']",
+    attrPresence: "[@#{1}]",
+    attr: function(m) {
+      m[3] = m[5] || m[6];
+      return new Template(Selector.xpath.operators[m[2]]).evaluate(m);
+    },
+    pseudo: function(m) {
+      var h = Selector.xpath.pseudos[m[1]];
+      if (!h) return '';
+      if (Object.isFunction(h)) return h(m);
+      return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m);
+    },
+    operators: {
+      '=':  "[@#{1}='#{3}']",
+      '!=': "[@#{1}!='#{3}']",
+      '^=': "[starts-with(@#{1}, '#{3}')]",
+      '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']",
+      '*=': "[contains(@#{1}, '#{3}')]",
+      '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]",
+      '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]"
+    },
+    pseudos: {
+      'first-child': '[not(preceding-sibling::*)]',
+      'last-child':  '[not(following-sibling::*)]',
+      'only-child':  '[not(preceding-sibling::* or following-sibling::*)]',
+      'empty':       "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]",
+      'checked':     "[@checked]",
+      'disabled':    "[@disabled]",
+      'enabled':     "[not(@disabled)]",
+      'not': function(m) {
+        var e = m[6], p = Selector.patterns,
+            x = Selector.xpath, le, m, v;
+
+        var exclusion = [];
+        while (e && le != e && (/\S/).test(e)) {
+          le = e;
+          for (var i in p) {
+            if (m = e.match(p[i])) {
+              v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m);
+              exclusion.push("(" + v.substring(1, v.length - 1) + ")");
+              e = e.replace(m[0], '');
+              break;
+            }
+          }
+        }
+        return "[not(" + exclusion.join(" and ") + ")]";
+      },
+      'nth-child':      function(m) {
+        return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m);
+      },
+      'nth-last-child': function(m) {
+        return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m);
+      },
+      'nth-of-type':    function(m) {
+        return Selector.xpath.pseudos.nth("position() ", m);
+      },
+      'nth-last-of-type': function(m) {
+        return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m);
+      },
+      'first-of-type':  function(m) {
+        m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m);
+      },
+      'last-of-type':   function(m) {
+        m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m);
+      },
+      'only-of-type':   function(m) {
+        var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m);
+      },
+      nth: function(fragment, m) {
+        var mm, formula = m[6], predicate;
+        if (formula == 'even') formula = '2n+0';
+        if (formula == 'odd')  formula = '2n+1';
+        if (mm = formula.match(/^(\d+)$/)) // digit only
+          return '[' + fragment + "= " + mm[1] + ']';
+        if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
+          if (mm[1] == "-") mm[1] = -1;
+          var a = mm[1] ? Number(mm[1]) : 1;
+          var b = mm[2] ? Number(mm[2]) : 0;
+          predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " +
+          "((#{fragment} - #{b}) div #{a} >= 0)]";
+          return new Template(predicate).evaluate({
+            fragment: fragment, a: a, b: b });
+        }
+      }
+    }
+  },
 
-    scope = (scope || document).getElementsByTagName(this.params.tagName || '*');
+  criteria: {
+    tagName:      'n = h.tagName(n, r, "#{1}", c);   c = false;',
+    className:    'n = h.className(n, r, "#{1}", c); c = false;',
+    id:           'n = h.id(n, r, "#{1}", c);        c = false;',
+    attrPresence: 'n = h.attrPresence(n, r, "#{1}"); c = false;',
+    attr: function(m) {
+      m[3] = (m[5] || m[6]);
+      return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}"); c = false;').evaluate(m);
+    },
+    pseudo: function(m) {
+      if (m[6]) m[6] = m[6].replace(/"/g, '\\"');
+      return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m);
+    },
+    descendant:   'c = "descendant";',
+    child:        'c = "child";',
+    adjacent:     'c = "adjacent";',
+    laterSibling: 'c = "laterSibling";'
+  },
+
+  patterns: {
+    // combinators must be listed first
+    // (and descendant needs to be last combinator)
+    laterSibling: /^\s*~\s*/,
+    child:        /^\s*>\s*/,
+    adjacent:     /^\s*\+\s*/,
+    descendant:   /^\s/,
+
+    // selectors follow
+    tagName:      /^\s*(\*|[\w\-]+)(\b|$)?/,
+    id:           /^#([\w\-\*]+)(\b|$)/,
+    className:    /^\.([\w\-\*]+)(\b|$)/,
+    pseudo:       /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s)|(?=:))/,
+    attrPresence: /^\[([\w]+)\]/,
+    attr:         /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/
+  },
+
+  // for Selector.match and Element#match
+  assertions: {
+    tagName: function(element, matches) {
+      return matches[1].toUpperCase() == element.tagName.toUpperCase();
+    },
+
+    className: function(element, matches) {
+      return Element.hasClassName(element, matches[1]);
+    },
+
+    id: function(element, matches) {
+      return element.id === matches[1];
+    },
+
+    attrPresence: function(element, matches) {
+      return Element.hasAttribute(element, matches[1]);
+    },
+
+    attr: function(element, matches) {
+      var nodeValue = Element.readAttribute(element, matches[1]);
+      return Selector.operators[matches[2]](nodeValue, matches[3]);
+    }
+  },
+
+  handlers: {
+    // UTILITY FUNCTIONS
+    // joins two collections
+    concat: function(a, b) {
+      for (var i = 0, node; node = b[i]; i++)
+        a.push(node);
+      return a;
+    },
+
+    // marks an array of nodes for counting
+    mark: function(nodes) {
+      for (var i = 0, node; node = nodes[i]; i++)
+        node._counted = true;
+      return nodes;
+    },
+
+    unmark: function(nodes) {
+      for (var i = 0, node; node = nodes[i]; i++)
+        node._counted = undefined;
+      return nodes;
+    },
+
+    // mark each child node with its position (for nth calls)
+    // "ofType" flag indicates whether we're indexing for nth-of-type
+    // rather than nth-child
+    index: function(parentNode, reverse, ofType) {
+      parentNode._counted = true;
+      if (reverse) {
+        for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) {
+          var node = nodes[i];
+          if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++;
+        }
+      } else {
+        for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++)
+          if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++;
+      }
+    },
 
-    var results = [];
-    for (var i = 0, length = scope.length; i < length; i++)
-      if (this.match(element = scope[i]))
-        results.push(Element.extend(element));
+    // filters out duplicates and extends all nodes
+    unique: function(nodes) {
+      if (nodes.length == 0) return nodes;
+      var results = [], n;
+      for (var i = 0, l = nodes.length; i < l; i++)
+        if (!(n = nodes[i])._counted) {
+          n._counted = true;
+          results.push(Element.extend(n));
+        }
+      return Selector.handlers.unmark(results);
+    },
 
-    return results;
+    // COMBINATOR FUNCTIONS
+    descendant: function(nodes) {
+      var h = Selector.handlers;
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        h.concat(results, node.getElementsByTagName('*'));
+      return results;
+    },
+
+    child: function(nodes) {
+      var h = Selector.handlers;
+      for (var i = 0, results = [], node; node = nodes[i]; i++) {
+        for (var j = 0, children = [], child; child = node.childNodes[j]; j++)
+          if (child.nodeType == 1 && child.tagName != '!') results.push(child);
+      }
+      return results;
+    },
+
+    adjacent: function(nodes) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++) {
+        var next = this.nextElementSibling(node);
+        if (next) results.push(next);
+      }
+      return results;
+    },
+
+    laterSibling: function(nodes) {
+      var h = Selector.handlers;
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        h.concat(results, Element.nextSiblings(node));
+      return results;
+    },
+
+    nextElementSibling: function(node) {
+      while (node = node.nextSibling)
+	      if (node.nodeType == 1) return node;
+      return null;
+    },
+
+    previousElementSibling: function(node) {
+      while (node = node.previousSibling)
+        if (node.nodeType == 1) return node;
+      return null;
+    },
+
+    // TOKEN FUNCTIONS
+    tagName: function(nodes, root, tagName, combinator) {
+      tagName = tagName.toUpperCase();
+      var results = [], h = Selector.handlers;
+      if (nodes) {
+        if (combinator) {
+          // fastlane for ordinary descendant combinators
+          if (combinator == "descendant") {
+            for (var i = 0, node; node = nodes[i]; i++)
+              h.concat(results, node.getElementsByTagName(tagName));
+            return results;
+          } else nodes = this[combinator](nodes);
+          if (tagName == "*") return nodes;
+        }
+        for (var i = 0, node; node = nodes[i]; i++)
+          if (node.tagName.toUpperCase() == tagName) results.push(node);
+        return results;
+      } else return root.getElementsByTagName(tagName);
+    },
+
+    id: function(nodes, root, id, combinator) {
+      var targetNode = $(id), h = Selector.handlers;
+      if (!targetNode) return [];
+      if (!nodes && root == document) return [targetNode];
+      if (nodes) {
+        if (combinator) {
+          if (combinator == 'child') {
+            for (var i = 0, node; node = nodes[i]; i++)
+              if (targetNode.parentNode == node) return [targetNode];
+          } else if (combinator == 'descendant') {
+            for (var i = 0, node; node = nodes[i]; i++)
+              if (Element.descendantOf(targetNode, node)) return [targetNode];
+          } else if (combinator == 'adjacent') {
+            for (var i = 0, node; node = nodes[i]; i++)
+              if (Selector.handlers.previousElementSibling(targetNode) == node)
+                return [targetNode];
+          } else nodes = h[combinator](nodes);
+        }
+        for (var i = 0, node; node = nodes[i]; i++)
+          if (node == targetNode) return [targetNode];
+        return [];
+      }
+      return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : [];
+    },
+
+    className: function(nodes, root, className, combinator) {
+      if (nodes && combinator) nodes = this[combinator](nodes);
+      return Selector.handlers.byClassName(nodes, root, className);
+    },
+
+    byClassName: function(nodes, root, className) {
+      if (!nodes) nodes = Selector.handlers.descendant([root]);
+      var needle = ' ' + className + ' ';
+      for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) {
+        nodeClassName = node.className;
+        if (nodeClassName.length == 0) continue;
+        if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle))
+          results.push(node);
+      }
+      return results;
+    },
+
+    attrPresence: function(nodes, root, attr) {
+      if (!nodes) nodes = root.getElementsByTagName("*");
+      var results = [];
+      for (var i = 0, node; node = nodes[i]; i++)
+        if (Element.hasAttribute(node, attr)) results.push(node);
+      return results;
+    },
+
+    attr: function(nodes, root, attr, value, operator) {
+      if (!nodes) nodes = root.getElementsByTagName("*");
+      var handler = Selector.operators[operator], results = [];
+      for (var i = 0, node; node = nodes[i]; i++) {
+        var nodeValue = Element.readAttribute(node, attr);
+        if (nodeValue === null) continue;
+        if (handler(nodeValue, value)) results.push(node);
+      }
+      return results;
+    },
+
+    pseudo: function(nodes, name, value, root, combinator) {
+      if (nodes && combinator) nodes = this[combinator](nodes);
+      if (!nodes) nodes = root.getElementsByTagName("*");
+      return Selector.pseudos[name](nodes, value, root);
+    }
   },
 
-  toString: function() {
-    return this.expression;
-  }
-}
+  pseudos: {
+    'first-child': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++) {
+        if (Selector.handlers.previousElementSibling(node)) continue;
+          results.push(node);
+      }
+      return results;
+    },
+    'last-child': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++) {
+        if (Selector.handlers.nextElementSibling(node)) continue;
+          results.push(node);
+      }
+      return results;
+    },
+    'only-child': function(nodes, value, root) {
+      var h = Selector.handlers;
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        if (!h.previousElementSibling(node) && !h.nextElementSibling(node))
+          results.push(node);
+      return results;
+    },
+    'nth-child':        function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, formula, root);
+    },
+    'nth-last-child':   function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, formula, root, true);
+    },
+    'nth-of-type':      function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, formula, root, false, true);
+    },
+    'nth-last-of-type': function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, formula, root, true, true);
+    },
+    'first-of-type':    function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, "1", root, false, true);
+    },
+    'last-of-type':     function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, "1", root, true, true);
+    },
+    'only-of-type':     function(nodes, formula, root) {
+      var p = Selector.pseudos;
+      return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root);
+    },
+
+    // handles the an+b logic
+    getIndices: function(a, b, total) {
+      if (a == 0) return b > 0 ? [b] : [];
+      return $R(1, total).inject([], function(memo, i) {
+        if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i);
+        return memo;
+      });
+    },
+
+    // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type
+    nth: function(nodes, formula, root, reverse, ofType) {
+      if (nodes.length == 0) return [];
+      if (formula == 'even') formula = '2n+0';
+      if (formula == 'odd')  formula = '2n+1';
+      var h = Selector.handlers, results = [], indexed = [], m;
+      h.mark(nodes);
+      for (var i = 0, node; node = nodes[i]; i++) {
+        if (!node.parentNode._counted) {
+          h.index(node.parentNode, reverse, ofType);
+          indexed.push(node.parentNode);
+        }
+      }
+      if (formula.match(/^\d+$/)) { // just a number
+        formula = Number(formula);
+        for (var i = 0, node; node = nodes[i]; i++)
+          if (node.nodeIndex == formula) results.push(node);
+      } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
+        if (m[1] == "-") m[1] = -1;
+        var a = m[1] ? Number(m[1]) : 1;
+        var b = m[2] ? Number(m[2]) : 0;
+        var indices = Selector.pseudos.getIndices(a, b, nodes.length);
+        for (var i = 0, node, l = indices.length; node = nodes[i]; i++) {
+          for (var j = 0; j < l; j++)
+            if (node.nodeIndex == indices[j]) results.push(node);
+        }
+      }
+      h.unmark(nodes);
+      h.unmark(indexed);
+      return results;
+    },
+
+    'empty': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++) {
+        // IE treats comments as element nodes
+        if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\s*$/))) continue;
+        results.push(node);
+      }
+      return results;
+    },
+
+    'not': function(nodes, selector, root) {
+      var h = Selector.handlers, selectorType, m;
+      var exclusions = new Selector(selector).findElements(root);
+      h.mark(exclusions);
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        if (!node._counted) results.push(node);
+      h.unmark(exclusions);
+      return results;
+    },
+
+    'enabled': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        if (!node.disabled) results.push(node);
+      return results;
+    },
+
+    'disabled': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        if (node.disabled) results.push(node);
+      return results;
+    },
+
+    'checked': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        if (node.checked) results.push(node);
+      return results;
+    }
+  },
+
+  operators: {
+    '=':  function(nv, v) { return nv == v; },
+    '!=': function(nv, v) { return nv != v; },
+    '^=': function(nv, v) { return nv.startsWith(v); },
+    '$=': function(nv, v) { return nv.endsWith(v); },
+    '*=': function(nv, v) { return nv.include(v); },
+    '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); },
+    '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); }
+  },
 
-Object.extend(Selector, {
   matchElements: function(elements, expression) {
-    var selector = new Selector(expression);
-    return elements.select(selector.match.bind(selector)).map(Element.extend);
+    var matches = new Selector(expression).findElements(), h = Selector.handlers;
+    h.mark(matches);
+    for (var i = 0, results = [], element; element = elements[i]; i++)
+      if (element._counted) results.push(element);
+    h.unmark(matches);
+    return results;
   },
 
   findElement: function(elements, expression, index) {
-    if (typeof expression == 'number') index = expression, expression = false;
+    if (Object.isNumber(expression)) {
+      index = expression; expression = false;
+    }
     return Selector.matchElements(elements, expression || '*')[index || 0];
   },
 
   findChildElements: function(element, expressions) {
-    return expressions.map(function(expression) {
-      return expression.match(/[^\s"]+(?:"[^"]*"[^\s"]+)*/g).inject([null], function(results, expr) {
-        var selector = new Selector(expr);
-        return results.inject([], function(elements, result) {
-          return elements.concat(selector.findElements(result || element));
-        });
-      });
-    }).flatten();
+    var exprs = expressions.join(','), expressions = [];
+    exprs.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
+      expressions.push(m[1].strip());
+    });
+    var results = [], h = Selector.handlers;
+    for (var i = 0, l = expressions.length, selector; i < l; i++) {
+      selector = new Selector(expressions[i].strip());
+      h.concat(results, selector.findElements(element));
+    }
+    return (l > 1) ? h.unique(results) : results;
   }
 });
 
@@ -1876,13 +3345,19 @@
     return form;
   },
 
-  serializeElements: function(elements, getHash) {
-    var data = elements.inject({}, function(result, element) {
+  serializeElements: function(elements, options) {
+    if (typeof options != 'object') options = { hash: !!options };
+    else if (options.hash === undefined) options.hash = true;
+    var key, value, submitted = false, submit = options.submit;
+
+    var data = elements.inject({ }, function(result, element) {
       if (!element.disabled && element.name) {
-        var key = element.name, value = $(element).getValue();
-        if (value != undefined) {
-          if (result[key]) {
-            if (result[key].constructor != Array) result[key] = [result[key]];
+        key = element.name; value = $(element).getValue();
+        if (value != null && (element.type != 'submit' || (!submitted &&
+            submit !== false && (!submit || key == submit) && (submitted = true)))) {
+          if (key in result) {
+            // a key is already present; construct an array of values
+            if (!Object.isArray(result[key])) result[key] = [result[key]];
             result[key].push(value);
           }
           else result[key] = value;
@@ -1891,13 +3366,13 @@
       return result;
     });
 
-    return getHash ? data : Hash.toQueryString(data);
+    return options.hash ? data : Object.toQueryString(data);
   }
 };
 
 Form.Methods = {
-  serialize: function(form, getHash) {
-    return Form.serializeElements(Form.getElements(form), getHash);
+  serialize: function(form, options) {
+    return Form.serializeElements(Form.getElements(form), options);
   },
 
   getElements: function(form) {
@@ -1928,25 +3403,26 @@
 
   disable: function(form) {
     form = $(form);
-    form.getElements().each(function(element) {
-      element.blur();
-      element.disabled = 'true';
-    });
+    Form.getElements(form).invoke('disable');
     return form;
   },
 
   enable: function(form) {
     form = $(form);
-    form.getElements().each(function(element) {
-      element.disabled = '';
-    });
+    Form.getElements(form).invoke('enable');
     return form;
   },
 
   findFirstElement: function(form) {
-    return $(form).getElements().find(function(element) {
-      return element.type != 'hidden' && !element.disabled &&
-        ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
+    var elements = $(form).getElements().findAll(function(element) {
+      return 'hidden' != element.type && !element.disabled;
+    });
+    var firstByIndex = elements.findAll(function(element) {
+      return element.hasAttribute('tabIndex') && element.tabIndex >= 0;
+    }).sortBy(function(element) { return element.tabIndex }).first();
+
+    return firstByIndex ? firstByIndex : elements.find(function(element) {
+      return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
     });
   },
 
@@ -1954,10 +3430,26 @@
     form = $(form);
     form.findFirstElement().activate();
     return form;
-  }
-}
+  },
+
+  request: function(form, options) {
+    form = $(form), options = Object.clone(options || { });
+
+    var params = options.parameters, action = form.readAttribute('action') || '';
+    if (action.blank()) action = window.location.href;
+    options.parameters = form.serialize(true);
 
-Object.extend(Form, Form.Methods);
+    if (params) {
+      if (Object.isString(params)) params = params.toQueryParams();
+      Object.extend(options.parameters, params);
+    }
+
+    if (form.hasAttribute('method') && !options.method)
+      options.method = form.method;
+
+    return new Ajax.Request(action, options);
+  }
+};
 
 /*--------------------------------------------------------------------------*/
 
@@ -1971,7 +3463,7 @@
     $(element).select();
     return element;
   }
-}
+};
 
 Form.Element.Methods = {
   serialize: function(element) {
@@ -1979,9 +3471,9 @@
     if (!element.disabled && element.name) {
       var value = element.getValue();
       if (value != undefined) {
-        var pair = {};
+        var pair = { };
         pair[element.name] = value;
-        return Hash.toQueryString(pair);
+        return Object.toQueryString(pair);
       }
     }
     return '';
@@ -1993,6 +3485,13 @@
     return Form.Element.Serializers[method](element);
   },
 
+  setValue: function(element, value) {
+    element = $(element);
+    var method = element.tagName.toLowerCase();
+    Form.Element.Serializers[method](element, value);
+    return element;
+  },
+
   clear: function(element) {
     $(element).value = '';
     return element;
@@ -2004,55 +3503,75 @@
 
   activate: function(element) {
     element = $(element);
-    element.focus();
-    if (element.select && ( element.tagName.toLowerCase() != 'input' ||
-      !['button', 'reset', 'submit'].include(element.type) ) )
-      element.select();
+    try {
+      element.focus();
+      if (element.select && (element.tagName.toLowerCase() != 'input' ||
+          !['button', 'reset', 'submit'].include(element.type)))
+        element.select();
+    } catch (e) { }
     return element;
   },
 
   disable: function(element) {
     element = $(element);
+    element.blur();
     element.disabled = true;
     return element;
   },
 
   enable: function(element) {
     element = $(element);
-    element.blur();
     element.disabled = false;
     return element;
   }
-}
+};
+
+/*--------------------------------------------------------------------------*/
 
-Object.extend(Form.Element, Form.Element.Methods);
 var Field = Form.Element;
-var $F = Form.Element.getValue;
+var $F = Form.Element.Methods.getValue;
 
 /*--------------------------------------------------------------------------*/
 
 Form.Element.Serializers = {
-  input: function(element) {
+  input: function(element, value) {
     switch (element.type.toLowerCase()) {
       case 'checkbox':
       case 'radio':
-        return Form.Element.Serializers.inputSelector(element);
+        return Form.Element.Serializers.inputSelector(element, value);
       default:
-        return Form.Element.Serializers.textarea(element);
+        return Form.Element.Serializers.textarea(element, value);
     }
   },
 
-  inputSelector: function(element) {
-    return element.checked ? element.value : null;
+  inputSelector: function(element, value) {
+    if (value === undefined) return element.checked ? element.value : null;
+    else element.checked = !!value;
   },
 
-  textarea: function(element) {
-    return element.value;
+  textarea: function(element, value) {
+    if (value === undefined) return element.value;
+    else element.value = value;
   },
 
-  select: function(element) {
-    return this[element.type == 'select-one' ?
-      'selectOne' : 'selectMany'](element);
+  select: function(element, index) {
+    if (index === undefined)
+      return this[element.type == 'select-one' ?
+        'selectOne' : 'selectMany'](element);
+    else {
+      var opt, value, single = !Object.isArray(index);
+      for (var i = 0, length = element.length; i < length; i++) {
+        opt = element.options[i];
+        value = this.optionValue(opt);
+        if (single) {
+          if (value == index) {
+            opt.selected = true;
+            return;
+          }
+        }
+        else opt.selected = index.include(value);
+      }
+    }
   },
 
   selectOne: function(element) {
@@ -2075,219 +3594,436 @@
     // extend element because hasAttribute may not be native
     return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
   }
-}
+};
 
 /*--------------------------------------------------------------------------*/
 
-Abstract.TimedObserver = function() {}
-Abstract.TimedObserver.prototype = {
-  initialize: function(element, frequency, callback) {
-    this.frequency = frequency;
+Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
+  initialize: function($super, element, frequency, callback) {
+    $super(callback, frequency);
     this.element   = $(element);
-    this.callback  = callback;
-
     this.lastValue = this.getValue();
-    this.registerCallback();
   },
 
-  registerCallback: function() {
-    setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+  execute: function() {
+    var value = this.getValue();
+    if (Object.isString(this.lastValue) && Object.isString(value) ?
+        this.lastValue != value : String(this.lastValue) != String(value)) {
+      this.callback(this.element, value);
+      this.lastValue = value;
+    }
+  }
+});
+
+Form.Element.Observer = Class.create(Abstract.TimedObserver, {
+  getValue: function() {
+    return Form.Element.getValue(this.element);
+  }
+});
+
+Form.Observer = Class.create(Abstract.TimedObserver, {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.EventObserver = Class.create({
+  initialize: function(element, callback) {
+    this.element  = $(element);
+    this.callback = callback;
+
+    this.lastValue = this.getValue();
+    if (this.element.tagName.toLowerCase() == 'form')
+      this.registerFormCallbacks();
+    else
+      this.registerCallback(this.element);
   },
 
-  onTimerEvent: function() {
+  onElementEvent: function() {
     var value = this.getValue();
-    var changed = ('string' == typeof this.lastValue && 'string' == typeof value
-      ? this.lastValue != value : String(this.lastValue) != String(value));
-    if (changed) {
+    if (this.lastValue != value) {
       this.callback(this.element, value);
       this.lastValue = value;
     }
+  },
+
+  registerFormCallbacks: function() {
+    Form.getElements(this.element).each(this.registerCallback, this);
+  },
+
+  registerCallback: function(element) {
+    if (element.type) {
+      switch (element.type.toLowerCase()) {
+        case 'checkbox':
+        case 'radio':
+          Event.observe(element, 'click', this.onElementEvent.bind(this));
+          break;
+        default:
+          Event.observe(element, 'change', this.onElementEvent.bind(this));
+          break;
+      }
+    }
   }
-}
+});
 
-Form.Element.Observer = Class.create();
-Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
+Form.Element.EventObserver = Class.create(Abstract.EventObserver, {
   getValue: function() {
     return Form.Element.getValue(this.element);
   }
-});
+});
+
+Form.EventObserver = Class.create(Abstract.EventObserver, {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+if (!window.Event) var Event = { };
+
+Object.extend(Event, {
+  KEY_BACKSPACE: 8,
+  KEY_TAB:       9,
+  KEY_RETURN:   13,
+  KEY_ESC:      27,
+  KEY_LEFT:     37,
+  KEY_UP:       38,
+  KEY_RIGHT:    39,
+  KEY_DOWN:     40,
+  KEY_DELETE:   46,
+  KEY_HOME:     36,
+  KEY_END:      35,
+  KEY_PAGEUP:   33,
+  KEY_PAGEDOWN: 34,
+  KEY_INSERT:   45,
+
+  cache: { },
+
+  relatedTarget: function(event) {
+    var element;
+    switch(event.type) {
+      case 'mouseover': element = event.fromElement; break;
+      case 'mouseout':  element = event.toElement;   break;
+      default: return null;
+    }
+    return Element.extend(element);
+  }
+});
+
+Event.Methods = (function() {
+  var isButton;
+
+  if (Prototype.Browser.IE) {
+    var buttonMap = { 0: 1, 1: 4, 2: 2 };
+    isButton = function(event, code) {
+      return event.button == buttonMap[code];
+    };
+
+  } else if (Prototype.Browser.WebKit) {
+    isButton = function(event, code) {
+      switch (code) {
+        case 0: return event.which == 1 && !event.metaKey;
+        case 1: return event.which == 1 && event.metaKey;
+        default: return false;
+      }
+    };
+
+  } else {
+    isButton = function(event, code) {
+      return event.which ? (event.which === code + 1) : (event.button === code);
+    };
+  }
+
+  return {
+    isLeftClick:   function(event) { return isButton(event, 0) },
+    isMiddleClick: function(event) { return isButton(event, 1) },
+    isRightClick:  function(event) { return isButton(event, 2) },
+
+    element: function(event) {
+      var node = Event.extend(event).target;
+      return Element.extend(node.nodeType == Node.TEXT_NODE ? node.parentNode : node);
+    },
+
+    findElement: function(event, expression) {
+      var element = Event.element(event);
+      return element.match(expression) ? element : element.up(expression);
+    },
+
+    pointer: function(event) {
+      return {
+        x: event.pageX || (event.clientX +
+          (document.documentElement.scrollLeft || document.body.scrollLeft)),
+        y: event.pageY || (event.clientY +
+          (document.documentElement.scrollTop || document.body.scrollTop))
+      };
+    },
+
+    pointerX: function(event) { return Event.pointer(event).x },
+    pointerY: function(event) { return Event.pointer(event).y },
+
+    stop: function(event) {
+      Event.extend(event);
+      event.preventDefault();
+      event.stopPropagation();
+      event.stopped = true;
+    }
+  };
+})();
+
+Event.extend = (function() {
+  var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
+    m[name] = Event.Methods[name].methodize();
+    return m;
+  });
+
+  if (Prototype.Browser.IE) {
+    Object.extend(methods, {
+      stopPropagation: function() { this.cancelBubble = true },
+      preventDefault:  function() { this.returnValue = false },
+      inspect: function() { return "[object Event]" }
+    });
+
+    return function(event) {
+      if (!event) return false;
+      if (event._extendedByPrototype) return event;
+
+      event._extendedByPrototype = Prototype.emptyFunction;
+      var pointer = Event.pointer(event);
+      Object.extend(event, {
+        target: event.srcElement,
+        relatedTarget: Event.relatedTarget(event),
+        pageX:  pointer.x,
+        pageY:  pointer.y
+      });
+      return Object.extend(event, methods);
+    };
+
+  } else {
+    Event.prototype = Event.prototype || document.createEvent("HTMLEvents").__proto__;
+    Object.extend(Event.prototype, methods);
+    return Prototype.K;
+  }
+})();
+
+Object.extend(Event, (function() {
+  var cache = Event.cache;
+
+  function getEventID(element) {
+    if (element._eventID) return element._eventID;
+    arguments.callee.id = arguments.callee.id || 1;
+    return element._eventID = ++arguments.callee.id;
+  }
+
+  function getDOMEventName(eventName) {
+    if (eventName && eventName.include(':')) return "dataavailable";
+    return eventName;
+  }
+
+  function getCacheForID(id) {
+    return cache[id] = cache[id] || { };
+  }
+
+  function getWrappersForEventName(id, eventName) {
+    var c = getCacheForID(id);
+    return c[eventName] = c[eventName] || [];
+  }
+
+  function createWrapper(element, eventName, handler) {
+    var id = getEventID(element);
+    var c = getWrappersForEventName(id, eventName);
+    if (c.pluck("handler").include(handler)) return false;
+
+    var wrapper = function(event) {
+      if (!Event || !Event.extend ||
+        (event.eventName && event.eventName != eventName))
+          return false;
+
+      Event.extend(event);
+      handler.call(element, event)
+    };
+
+    wrapper.handler = handler;
+    c.push(wrapper);
+    return wrapper;
+  }
+
+  function findWrapper(id, eventName, handler) {
+    var c = getWrappersForEventName(id, eventName);
+    return c.find(function(wrapper) { return wrapper.handler == handler });
+  }
+
+  function destroyWrapper(id, eventName, handler) {
+    var c = getCacheForID(id);
+    if (!c[eventName]) return false;
+    c[eventName] = c[eventName].without(findWrapper(id, eventName, handler));
+  }
+
+  function destroyCache() {
+    for (var id in cache)
+      for (var eventName in cache[id])
+        cache[id][eventName] = null;
+  }
 
-Form.Observer = Class.create();
-Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
-  getValue: function() {
-    return Form.serialize(this.element);
+  if (window.attachEvent) {
+    window.attachEvent("onunload", destroyCache);
   }
-});
 
-/*--------------------------------------------------------------------------*/
+  return {
+    observe: function(element, eventName, handler) {
+      element = $(element);
+      var name = getDOMEventName(eventName);
 
-Abstract.EventObserver = function() {}
-Abstract.EventObserver.prototype = {
-  initialize: function(element, callback) {
-    this.element  = $(element);
-    this.callback = callback;
+      var wrapper = createWrapper(element, eventName, handler);
+      if (!wrapper) return element;
 
-    this.lastValue = this.getValue();
-    if (this.element.tagName.toLowerCase() == 'form')
-      this.registerFormCallbacks();
-    else
-      this.registerCallback(this.element);
-  },
+      if (element.addEventListener) {
+        element.addEventListener(name, wrapper, false);
+      } else {
+        element.attachEvent("on" + name, wrapper);
+      }
 
-  onElementEvent: function() {
-    var value = this.getValue();
-    if (this.lastValue != value) {
-      this.callback(this.element, value);
-      this.lastValue = value;
-    }
-  },
+      return element;
+    },
 
-  registerFormCallbacks: function() {
-    Form.getElements(this.element).each(this.registerCallback.bind(this));
-  },
+    stopObserving: function(element, eventName, handler) {
+      element = $(element);
+      var id = getEventID(element), name = getDOMEventName(eventName);
+
+      if (!handler && eventName) {
+        getWrappersForEventName(id, eventName).each(function(wrapper) {
+          element.stopObserving(eventName, wrapper.handler);
+        });
+        return element;
 
-  registerCallback: function(element) {
-    if (element.type) {
-      switch (element.type.toLowerCase()) {
-        case 'checkbox':
-        case 'radio':
-          Event.observe(element, 'click', this.onElementEvent.bind(this));
-          break;
-        default:
-          Event.observe(element, 'change', this.onElementEvent.bind(this));
-          break;
+      } else if (!eventName) {
+        Object.keys(getCacheForID(id)).each(function(eventName) {
+          element.stopObserving(eventName);
+        });
+        return element;
       }
-    }
-  }
-}
 
-Form.Element.EventObserver = Class.create();
-Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
-  getValue: function() {
-    return Form.Element.getValue(this.element);
-  }
-});
+      var wrapper = findWrapper(id, eventName, handler);
+      if (!wrapper) return element;
 
-Form.EventObserver = Class.create();
-Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
-  getValue: function() {
-    return Form.serialize(this.element);
-  }
-});
-if (!window.Event) {
-  var Event = new Object();
-}
+      if (element.removeEventListener) {
+        element.removeEventListener(name, wrapper, false);
+      } else {
+        element.detachEvent("on" + name, wrapper);
+      }
 
-Object.extend(Event, {
-  KEY_BACKSPACE: 8,
-  KEY_TAB:       9,
-  KEY_RETURN:   13,
-  KEY_ESC:      27,
-  KEY_LEFT:     37,
-  KEY_UP:       38,
-  KEY_RIGHT:    39,
-  KEY_DOWN:     40,
-  KEY_DELETE:   46,
-  KEY_HOME:     36,
-  KEY_END:      35,
-  KEY_PAGEUP:   33,
-  KEY_PAGEDOWN: 34,
+      destroyWrapper(id, eventName, handler);
 
-  element: function(event) {
-    return event.target || event.srcElement;
-  },
+      return element;
+    },
 
-  isLeftClick: function(event) {
-    return (((event.which) && (event.which == 1)) ||
-            ((event.button) && (event.button == 1)));
-  },
+    fire: function(element, eventName, memo) {
+      element = $(element);
+      if (element == document && document.createEvent && !element.dispatchEvent)
+        element = document.documentElement;
+
+      if (document.createEvent) {
+        var event = document.createEvent("HTMLEvents");
+        event.initEvent("dataavailable", true, true);
+      } else {
+        var event = document.createEventObject();
+        event.eventType = "ondataavailable";
+      }
 
-  pointerX: function(event) {
-    return event.pageX || (event.clientX +
-      (document.documentElement.scrollLeft || document.body.scrollLeft));
-  },
+      event.eventName = eventName;
+      event.memo = memo || { };
 
-  pointerY: function(event) {
-    return event.pageY || (event.clientY +
-      (document.documentElement.scrollTop || document.body.scrollTop));
-  },
+      if (document.createEvent) {
+        element.dispatchEvent(event);
+      } else {
+        element.fireEvent(event.eventType, event);
+      }
 
-  stop: function(event) {
-    if (event.preventDefault) {
-      event.preventDefault();
-      event.stopPropagation();
-    } else {
-      event.returnValue = false;
-      event.cancelBubble = true;
+      return event;
     }
-  },
+  };
+})());
 
-  // find the first node with the given tagName, starting from the
-  // node the event was triggered on; traverses the DOM upwards
-  findElement: function(event, tagName) {
-    var element = Event.element(event);
-    while (element.parentNode && (!element.tagName ||
-        (element.tagName.toUpperCase() != tagName.toUpperCase())))
-      element = element.parentNode;
-    return element;
-  },
+Object.extend(Event, Event.Methods);
+
+Element.addMethods({
+  fire:          Event.fire,
+  observe:       Event.observe,
+  stopObserving: Event.stopObserving
+});
 
-  observers: false,
+Object.extend(document, {
+  fire:          Element.Methods.fire.methodize(),
+  observe:       Element.Methods.observe.methodize(),
+  stopObserving: Element.Methods.stopObserving.methodize()
+});
 
-  _observeAndCache: function(element, name, observer, useCapture) {
-    if (!this.observers) this.observers = [];
-    if (element.addEventListener) {
-      this.observers.push([element, name, observer, useCapture]);
-      element.addEventListener(name, observer, useCapture);
-    } else if (element.attachEvent) {
-      this.observers.push([element, name, observer, useCapture]);
-      element.attachEvent('on' + name, observer);
-    }
-  },
+(function() {
+  /* Support for the DOMContentLoaded event is based on work by Dan Webb,
+     Matthias Miller, Dean Edwards and John Resig. */
+
+  var timer, fired = false;
+
+  function fireContentLoadedEvent() {
+    if (fired) return;
+    if (timer) window.clearInterval(timer);
+    document.fire("dom:loaded");
+    fired = true;
+  }
+
+  if (document.addEventListener) {
+    if (Prototype.Browser.WebKit) {
+      timer = window.setInterval(function() {
+        if (/loaded|complete/.test(document.readyState))
+          fireContentLoadedEvent();
+      }, 0);
 
-  unloadCache: function() {
-    if (!Event.observers) return;
-    for (var i = 0, length = Event.observers.length; i < length; i++) {
-      Event.stopObserving.apply(this, Event.observers[i]);
-      Event.observers[i][0] = null;
+      Event.observe(window, "load", fireContentLoadedEvent);
+
+    } else {
+      document.addEventListener("DOMContentLoaded",
+        fireContentLoadedEvent, false);
     }
-    Event.observers = false;
-  },
 
-  observe: function(element, name, observer, useCapture) {
-    element = $(element);
-    useCapture = useCapture || false;
+  } else {
+    document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>");
+    $("__onDOMContentLoaded").onreadystatechange = function() {
+      if (this.readyState == "complete") {
+        this.onreadystatechange = null;
+        fireContentLoadedEvent();
+      }
+    };
+  }
+})();
+/*------------------------------- DEPRECATED -------------------------------*/
 
-    if (name == 'keypress' &&
-        (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
-        || element.attachEvent))
-      name = 'keydown';
+Hash.toQueryString = Object.toQueryString;
 
-    Event._observeAndCache(element, name, observer, useCapture);
+var Toggle = { display: Element.toggle };
+
+Element.Methods.childOf = Element.Methods.descendantOf;
+
+var Insertion = {
+  Before: function(element, content) {
+    return Element.insert(element, {before:content});
   },
 
-  stopObserving: function(element, name, observer, useCapture) {
-    element = $(element);
-    useCapture = useCapture || false;
+  Top: function(element, content) {
+    return Element.insert(element, {top:content});
+  },
 
-    if (name == 'keypress' &&
-        (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
-        || element.detachEvent))
-      name = 'keydown';
+  Bottom: function(element, content) {
+    return Element.insert(element, {bottom:content});
+  },
 
-    if (element.removeEventListener) {
-      element.removeEventListener(name, observer, useCapture);
-    } else if (element.detachEvent) {
-      try {
-        element.detachEvent('on' + name, observer);
-      } catch (e) {}
-    }
+  After: function(element, content) {
+    return Element.insert(element, {after:content});
   }
-});
+};
+
+var $continue = new Error('"throw $continue" is deprecated, use "return" instead');
 
-/* prevent memory leaks in IE */
-if (navigator.appVersion.match(/\bMSIE\b/))
-  Event.observe(window, 'unload', Event.unloadCache, false);
+// This should be moved to script.aculo.us; notice the deprecated methods
+// further below, that map to the newer Element methods.
 var Position = {
   // set to true if needed, warning: firefox performance problems
   // NOT neeeded for page scrolling, only if draggable contained in
@@ -2307,59 +4043,13 @@
                 || 0;
   },
 
-  realOffset: function(element) {
-    var valueT = 0, valueL = 0;
-    do {
-      valueT += element.scrollTop  || 0;
-      valueL += element.scrollLeft || 0;
-      element = element.parentNode;
-    } while (element);
-    return [valueL, valueT];
-  },
-
-  cumulativeOffset: function(element) {
-    var valueT = 0, valueL = 0;
-    do {
-      valueT += element.offsetTop  || 0;
-      valueL += element.offsetLeft || 0;
-      element = element.offsetParent;
-    } while (element);
-    return [valueL, valueT];
-  },
-
-  positionedOffset: function(element) {
-    var valueT = 0, valueL = 0;
-    do {
-      valueT += element.offsetTop  || 0;
-      valueL += element.offsetLeft || 0;
-      element = element.offsetParent;
-      if (element) {
-        if(element.tagName=='BODY') break;
-        var p = Element.getStyle(element, 'position');
-        if (p == 'relative' || p == 'absolute') break;
-      }
-    } while (element);
-    return [valueL, valueT];
-  },
-
-  offsetParent: function(element) {
-    if (element.offsetParent) return element.offsetParent;
-    if (element == document.body) return element;
-
-    while ((element = element.parentNode) && element != document.body)
-      if (Element.getStyle(element, 'position') != 'static')
-        return element;
-
-    return document.body;
-  },
-
   // caches x/y coordinate pair to use with overlap
   within: function(element, x, y) {
     if (this.includeScrollOffsets)
       return this.withinIncludingScrolloffsets(element, x, y);
     this.xcomp = x;
     this.ycomp = y;
-    this.offset = this.cumulativeOffset(element);
+    this.offset = Element.cumulativeOffset(element);
 
     return (y >= this.offset[1] &&
             y <  this.offset[1] + element.offsetHeight &&
@@ -2368,11 +4058,11 @@
   },
 
   withinIncludingScrolloffsets: function(element, x, y) {
-    var offsetcache = this.realOffset(element);
+    var offsetcache = Element.cumulativeScrollOffset(element);
 
     this.xcomp = x + offsetcache[0] - this.deltaX;
     this.ycomp = y + offsetcache[1] - this.deltaY;
-    this.offset = this.cumulativeOffset(element);
+    this.offset = Element.cumulativeOffset(element);
 
     return (this.ycomp >= this.offset[1] &&
             this.ycomp <  this.offset[1] + element.offsetHeight &&
@@ -2391,125 +4081,104 @@
         element.offsetWidth;
   },
 
-  page: function(forElement) {
-    var valueT = 0, valueL = 0;
-
-    var element = forElement;
-    do {
-      valueT += element.offsetTop  || 0;
-      valueL += element.offsetLeft || 0;
+  // Deprecation layer -- use newer Element methods now (1.5.2).
 
-      // Safari fix
-      if (element.offsetParent==document.body)
-        if (Element.getStyle(element,'position')=='absolute') break;
+  cumulativeOffset: Element.Methods.cumulativeOffset,
 
-    } while (element = element.offsetParent);
+  positionedOffset: Element.Methods.positionedOffset,
 
-    element = forElement;
-    do {
-      if (!window.opera || element.tagName=='BODY') {
-        valueT -= element.scrollTop  || 0;
-        valueL -= element.scrollLeft || 0;
-      }
-    } while (element = element.parentNode);
+  absolutize: function(element) {
+    Position.prepare();
+    return Element.absolutize(element);
+  },
 
-    return [valueL, valueT];
+  relativize: function(element) {
+    Position.prepare();
+    return Element.relativize(element);
   },
 
-  clone: function(source, target) {
-    var options = Object.extend({
-      setLeft:    true,
-      setTop:     true,
-      setWidth:   true,
-      setHeight:  true,
-      offsetTop:  0,
-      offsetLeft: 0
-    }, arguments[2] || {})
+  realOffset: Element.Methods.cumulativeScrollOffset,
 
-    // find page position of source
-    source = $(source);
-    var p = Position.page(source);
+  offsetParent: Element.Methods.getOffsetParent,
 
-    // find coordinate system to use
-    target = $(target);
-    var delta = [0, 0];
-    var parent = null;
-    // delta [0,0] will do fine with position: fixed elements,
-    // position:absolute needs offsetParent deltas
-    if (Element.getStyle(target,'position') == 'absolute') {
-      parent = Position.offsetParent(target);
-      delta = Position.page(parent);
-    }
+  page: Element.Methods.viewportOffset,
 
-    // correct by body offsets (fixes Safari)
-    if (parent == document.body) {
-      delta[0] -= document.body.offsetLeft;
-      delta[1] -= document.body.offsetTop;
+  clone: function(source, target, options) {
+    options = options || { };
+    return Element.clonePosition(target, source, options);
+  }
+};
+
+/*--------------------------------------------------------------------------*/
+
+if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){
+  function iter(name) {
+    return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]";
+  }
+
+  instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ?
+  function(element, className) {
+    className = className.toString().strip();
+    var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className);
+    return cond ? document._getElementsByXPath('.//*' + cond, element) : [];
+  } : function(element, className) {
+    className = className.toString().strip();
+    var elements = [], classNames = (/\s/.test(className) ? $w(className) : null);
+    if (!classNames && !className) return elements;
+
+    var nodes = $(element).getElementsByTagName('*');
+    className = ' ' + className + ' ';
+
+    for (var i = 0, child, cn; child = nodes[i]; i++) {
+      if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) ||
+          (classNames && classNames.all(function(name) {
+            return !name.toString().blank() && cn.include(' ' + name + ' ');
+          }))))
+        elements.push(Element.extend(child));
     }
+    return elements;
+  };
 
-    // set position
-    if(options.setLeft)   target.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
-    if(options.setTop)    target.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
-    if(options.setWidth)  target.style.width = source.offsetWidth + 'px';
-    if(options.setHeight) target.style.height = source.offsetHeight + 'px';
-  },
+  return function(className, parentElement) {
+    return $(parentElement || document.body).getElementsByClassName(className);
+  };
+}(Element.Methods);
 
-  absolutize: function(element) {
-    element = $(element);
-    if (element.style.position == 'absolute') return;
-    Position.prepare();
+/*--------------------------------------------------------------------------*/
 
-    var offsets = Position.positionedOffset(element);
-    var top     = offsets[1];
-    var left    = offsets[0];
-    var width   = element.clientWidth;
-    var height  = element.clientHeight;
+Element.ClassNames = Class.create();
+Element.ClassNames.prototype = {
+  initialize: function(element) {
+    this.element = $(element);
+  },
 
-    element._originalLeft   = left - parseFloat(element.style.left  || 0);
-    element._originalTop    = top  - parseFloat(element.style.top || 0);
-    element._originalWidth  = element.style.width;
-    element._originalHeight = element.style.height;
+  _each: function(iterator) {
+    this.element.className.split(/\s+/).select(function(name) {
+      return name.length > 0;
+    })._each(iterator);
+  },
 
-    element.style.position = 'absolute';
-    element.style.top    = top + 'px';
-    element.style.left   = left + 'px';
-    element.style.width  = width + 'px';
-    element.style.height = height + 'px';
+  set: function(className) {
+    this.element.className = className;
   },
 
-  relativize: function(element) {
-    element = $(element);
-    if (element.style.position == 'relative') return;
-    Position.prepare();
+  add: function(classNameToAdd) {
+    if (this.include(classNameToAdd)) return;
+    this.set($A(this).concat(classNameToAdd).join(' '));
+  },
 
-    element.style.position = 'relative';
-    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
-    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
+  remove: function(classNameToRemove) {
+    if (!this.include(classNameToRemove)) return;
+    this.set($A(this).without(classNameToRemove).join(' '));
+  },
 
-    element.style.top    = top + 'px';
-    element.style.left   = left + 'px';
-    element.style.height = element._originalHeight;
-    element.style.width  = element._originalWidth;
+  toString: function() {
+    return $A(this).join(' ');
   }
-}
-
-// Safari returns margins on body which is incorrect if the child is absolutely
-// positioned.  For performance reasons, redefine Position.cumulativeOffset for
-// KHTML/WebKit only.
-if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
-  Position.cumulativeOffset = function(element) {
-    var valueT = 0, valueL = 0;
-    do {
-      valueT += element.offsetTop  || 0;
-      valueL += element.offsetLeft || 0;
-      if (element.offsetParent == document.body)
-        if (Element.getStyle(element, 'position') == 'absolute') break;
+};
 
-      element = element.offsetParent;
-    } while (element);
+Object.extend(Element.ClassNames.prototype, Enumerable);
 
-    return [valueL, valueT];
-  }
-}
+/*--------------------------------------------------------------------------*/
 
 Element.addMethods();
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/quicktags.js 2.5.src/wp-includes/js/quicktags.js
--- 2.2.2.src/wp-includes/js/quicktags.js	2007-04-01 11:06:19.000000000 -0500
+++ 2.5.src/wp-includes/js/quicktags.js	2008-03-02 14:17:30.000000000 -0600
@@ -25,15 +25,15 @@
 }
 
 var now = new Date();
-var datetime = now.getUTCFullYear() + '-' + 
+var datetime = now.getUTCFullYear() + '-' +
 zeroise(now.getUTCMonth() + 1, 2) + '-' +
-zeroise(now.getUTCDate(), 2) + 'T' + 
-zeroise(now.getUTCHours(), 2) + ':' + 
-zeroise(now.getUTCMinutes(), 2) + ':' + 
+zeroise(now.getUTCDate(), 2) + 'T' +
+zeroise(now.getUTCHours(), 2) + ':' +
+zeroise(now.getUTCMinutes(), 2) + ':' +
 zeroise(now.getUTCSeconds() ,2) +
 '+00:00';
 
-edButtons[edButtons.length] = 
+edButtons[edButtons.length] =
 new edButton('ed_strong'
 ,'b'
 ,'<strong>'
@@ -41,7 +41,7 @@
 ,'b'
 );
 
-edButtons[edButtons.length] = 
+edButtons[edButtons.length] =
 new edButton('ed_em'
 ,'i'
 ,'<em>'
@@ -49,7 +49,7 @@
 ,'i'
 );
 
-edButtons[edButtons.length] = 
+edButtons[edButtons.length] =
 new edButton('ed_link'
 ,'link'
 ,''
@@ -57,7 +57,7 @@
 ,'a'
 ); // special case
 
-edButtons[edButtons.length] = 
+edButtons[edButtons.length] =
 new edButton('ed_block'
 ,'b-quote'
 ,'\n\n<blockquote>'
@@ -66,7 +66,7 @@
 );
 
 
-edButtons[edButtons.length] = 
+edButtons[edButtons.length] =
 new edButton('ed_del'
 ,'del'
 ,'<del datetime="' + datetime + '">'
@@ -74,7 +74,7 @@
 ,'d'
 );
 
-edButtons[edButtons.length] = 
+edButtons[edButtons.length] =
 new edButton('ed_ins'
 ,'ins'
 ,'<ins datetime="' + datetime + '">'
@@ -82,7 +82,7 @@
 ,'s'
 );
 
-edButtons[edButtons.length] = 
+edButtons[edButtons.length] =
 new edButton('ed_img'
 ,'img'
 ,''
@@ -91,7 +91,7 @@
 ,-1
 ); // special case
 
-edButtons[edButtons.length] = 
+edButtons[edButtons.length] =
 new edButton('ed_ul'
 ,'ul'
 ,'<ul>\n'
@@ -99,7 +99,7 @@
 ,'u'
 );
 
-edButtons[edButtons.length] = 
+edButtons[edButtons.length] =
 new edButton('ed_ol'
 ,'ol'
 ,'<ol>\n'
@@ -107,7 +107,7 @@
 ,'o'
 );
 
-edButtons[edButtons.length] = 
+edButtons[edButtons.length] =
 new edButton('ed_li'
 ,'li'
 ,'\t<li>'
@@ -115,7 +115,7 @@
 ,'l'
 );
 
-edButtons[edButtons.length] = 
+edButtons[edButtons.length] =
 new edButton('ed_code'
 ,'code'
 ,'<code>'
@@ -123,7 +123,7 @@
 ,'c'
 );
 
-edButtons[edButtons.length] = 
+edButtons[edButtons.length] =
 new edButton('ed_more'
 ,'more'
 ,'<!--more-->'
@@ -132,7 +132,7 @@
 ,-1
 );
 /*
-edButtons[edButtons.length] = 
+edButtons[edButtons.length] =
 new edButton('ed_next'
 ,'page'
 ,'<!--nextpage-->'
@@ -220,7 +220,7 @@
 		if (edLinks[i].newWin == 1) {
 			newWin = ' target="_blank"';
 		}
-		var tempStr = '<a href="' + edLinks[i].URL + '"' + newWin + '>' 
+		var tempStr = '<a href="' + edLinks[i].URL + '"' + newWin + '>'
 		            + edLinks[i].display
 		            + '</a>';
 		thisSelect.selectedIndex = 0;
@@ -298,21 +298,21 @@
 		if (startPos != endPos) {
 			myField.value = myField.value.substring(0, startPos)
 			              + edButtons[i].tagStart
-			              + myField.value.substring(startPos, endPos) 
+			              + myField.value.substring(startPos, endPos)
 			              + edButtons[i].tagEnd
 			              + myField.value.substring(endPos, myField.value.length);
 			cursorPos += edButtons[i].tagStart.length + edButtons[i].tagEnd.length;
 		}
 		else {
 			if (!edCheckOpenTags(i) || edButtons[i].tagEnd == '') {
-				myField.value = myField.value.substring(0, startPos) 
+				myField.value = myField.value.substring(0, startPos)
 				              + edButtons[i].tagStart
 				              + myField.value.substring(endPos, myField.value.length);
 				edAddTag(i);
 				cursorPos = startPos + edButtons[i].tagStart.length;
 			}
 			else {
-				myField.value = myField.value.substring(0, startPos) 
+				myField.value = myField.value.substring(0, startPos)
 				              + edButtons[i].tagEnd
 				              + myField.value.substring(endPos, myField.value.length);
 				edRemoveTag(i);
@@ -350,7 +350,7 @@
 		var startPos = myField.selectionStart;
 		var endPos = myField.selectionEnd;
 		myField.value = myField.value.substring(0, startPos)
-		              + myValue 
+		              + myValue
                       + myField.value.substring(endPos, myField.value.length);
 		myField.focus();
 		myField.selectionStart = startPos + myValue.length;
@@ -380,9 +380,9 @@
 function edInsertImage(myField) {
 	var myValue = prompt(quicktagsL10n.enterImageURL, 'http://');
 	if (myValue) {
-		myValue = '<img src="' 
-				+ myValue 
-				+ '" alt="' + prompt(quicktagsL10n.enterImageDescription, '') 
+		myValue = '<img src="'
+				+ myValue
+				+ '" alt="' + prompt(quicktagsL10n.enterImageDescription, '')
 				+ '" />';
 		edInsertContent(myField, myValue);
 	}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/scriptaculous/MIT-LICENSE 2.5.src/wp-includes/js/scriptaculous/MIT-LICENSE
--- 2.2.2.src/wp-includes/js/scriptaculous/MIT-LICENSE	2007-01-25 21:41:17.000000000 -0600
+++ 2.5.src/wp-includes/js/scriptaculous/MIT-LICENSE	2008-03-02 15:34:25.000000000 -0600
@@ -1,20 +1,20 @@
-Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-
-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 AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+
+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 AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/scriptaculous/builder.js 2.5.src/wp-includes/js/scriptaculous/builder.js
--- 2.2.2.src/wp-includes/js/scriptaculous/builder.js	2007-01-25 21:41:17.000000000 -0600
+++ 2.5.src/wp-includes/js/scriptaculous/builder.js	2008-03-02 15:34:25.000000000 -0600
@@ -1,6 +1,6 @@
-// script.aculo.us builder.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
+// script.aculo.us builder.js v1.8.0, Tue Nov 06 15:01:40 +0300 2007
 
-// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
 //
 // script.aculo.us is freely distributable under the terms of an MIT-style license.
 // For details, see the script.aculo.us web site: http://script.aculo.us/
@@ -48,7 +48,8 @@
     // attributes (or text)
     if(arguments[1])
       if(this._isStringOrNumber(arguments[1]) ||
-        (arguments[1] instanceof Array)) {
+        (arguments[1] instanceof Array) ||
+        arguments[1].tagName) {
           this._children(element, arguments[1]);
         } else {
           var attrs = this._attributes(arguments[1]);
@@ -66,7 +67,7 @@
             }
             if(element.tagName.toUpperCase() != elementName)
               element = parentElement.getElementsByTagName(elementName)[0];
-            }
+          }
         } 
 
     // text, or array of children
@@ -88,10 +89,14 @@
     var attrs = [];
     for(attribute in attributes)
       attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) +
-          '="' + attributes[attribute].toString().escapeHTML() + '"');
+          '="' + attributes[attribute].toString().escapeHTML().gsub(/"/,'&quot;') + '"');
     return attrs.join(" ");
   },
   _children: function(element, children) {
+    if(children.tagName) {
+      element.appendChild(children);
+      return;
+    }
     if(typeof children=='object') { // array can hold nodes and text
       children.flatten().each( function(e) {
         if(typeof e=='object')
@@ -101,8 +106,8 @@
             element.appendChild(Builder._text(e));
       });
     } else
-      if(Builder._isStringOrNumber(children)) 
-         element.appendChild(Builder._text(children));
+      if(Builder._isStringOrNumber(children))
+        element.appendChild(Builder._text(children));
   },
   _isStringOrNumber: function(param) {
     return(typeof param=='string' || typeof param=='number');
diff -x .svn -aruN 2.2.2.src/wp-includes/js/scriptaculous/controls.js 2.5.src/wp-includes/js/scriptaculous/controls.js
--- 2.2.2.src/wp-includes/js/scriptaculous/controls.js	2007-01-25 21:41:17.000000000 -0600
+++ 2.5.src/wp-includes/js/scriptaculous/controls.js	2008-03-02 15:34:25.000000000 -0600
@@ -1,8 +1,8 @@
-// script.aculo.us controls.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
+// script.aculo.us controls.js v1.8.0, Tue Nov 06 15:01:40 +0300 2007
 
-// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//           (c) 2005, 2006 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
-//           (c) 2005, 2006 Jon Tirsen (http://www.tirsen.com)
+// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//           (c) 2005-2007 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
+//           (c) 2005-2007 Jon Tirsen (http://www.tirsen.com)
 // Contributors:
 //  Richard Livsey
 //  Rahul Bhargava
@@ -39,22 +39,23 @@
 if(typeof Effect == 'undefined')
   throw("controls.js requires including script.aculo.us' effects.js library");
 
-var Autocompleter = {}
-Autocompleter.Base = function() {};
-Autocompleter.Base.prototype = {
+var Autocompleter = { }
+Autocompleter.Base = Class.create({
   baseInitialize: function(element, update, options) {
-    this.element     = $(element); 
+    element          = $(element)
+    this.element     = element; 
     this.update      = $(update);  
     this.hasFocus    = false; 
     this.changed     = false; 
     this.active      = false; 
     this.index       = 0;     
     this.entryCount  = 0;
+    this.oldElementValue = this.element.value;
 
     if(this.setOptions)
       this.setOptions(options);
     else
-      this.options = options || {};
+      this.options = options || { };
 
     this.options.paramName    = this.options.paramName || this.element.name;
     this.options.tokens       = this.options.tokens || [];
@@ -76,6 +77,9 @@
 
     if(typeof(this.options.tokens) == 'string') 
       this.options.tokens = new Array(this.options.tokens);
+    // Force carriage returns as token delimiters anyway
+    if (!this.options.tokens.include('\n'))
+      this.options.tokens.push('\n');
 
     this.observer = null;
     
@@ -83,15 +87,14 @@
 
     Element.hide(this.update);
 
-    Event.observe(this.element, "blur", this.onBlur.bindAsEventListener(this));
-    Event.observe(this.element, "keypress", this.onKeyPress.bindAsEventListener(this));
+    Event.observe(this.element, 'blur', this.onBlur.bindAsEventListener(this));
+    Event.observe(this.element, 'keypress', this.onKeyPress.bindAsEventListener(this));
   },
 
   show: function() {
     if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
     if(!this.iefix && 
-      (navigator.appVersion.indexOf('MSIE')>0) &&
-      (navigator.userAgent.indexOf('Opera')<0) &&
+      (Prototype.Browser.IE) &&
       (Element.getStyle(this.update, 'position')=='absolute')) {
       new Insertion.After(this.update, 
        '<iframe id="' + this.update.id + '_iefix" '+
@@ -141,17 +144,17 @@
        case Event.KEY_UP:
          this.markPrevious();
          this.render();
-         if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
+         if(Prototype.Browser.WebKit) Event.stop(event);
          return;
        case Event.KEY_DOWN:
          this.markNext();
          this.render();
-         if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
+         if(Prototype.Browser.WebKit) Event.stop(event);
          return;
       }
      else 
        if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN || 
-         (navigator.appVersion.indexOf('AppleWebKit') > 0 && event.keyCode == 0)) return;
+         (Prototype.Browser.WebKit > 0 && event.keyCode == 0)) return;
 
     this.changed = true;
     this.hasFocus = true;
@@ -197,7 +200,6 @@
         this.index==i ? 
           Element.addClassName(this.getEntry(i),"selected") : 
           Element.removeClassName(this.getEntry(i),"selected");
-        
       if(this.hasFocus) { 
         this.show();
         this.active = true;
@@ -240,21 +242,22 @@
     }
     var value = '';
     if (this.options.select) {
-      var nodes = document.getElementsByClassName(this.options.select, selectedElement) || [];
+      var nodes = $(selectedElement).select('.' + this.options.select) || [];
       if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
     } else
       value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
     
-    var lastTokenPos = this.findLastToken();
-    if (lastTokenPos != -1) {
-      var newValue = this.element.value.substr(0, lastTokenPos + 1);
-      var whitespace = this.element.value.substr(lastTokenPos + 1).match(/^\s+/);
+    var bounds = this.getTokenBounds();
+    if (bounds[0] != -1) {
+      var newValue = this.element.value.substr(0, bounds[0]);
+      var whitespace = this.element.value.substr(bounds[0]).match(/^\s+/);
       if (whitespace)
         newValue += whitespace[0];
-      this.element.value = newValue + value;
+      this.element.value = newValue + value + this.element.value.substr(bounds[1]);
     } else {
       this.element.value = value;
     }
+    this.oldElementValue = this.element.value;
     this.element.focus();
     
     if (this.options.afterUpdateElement)
@@ -298,39 +301,48 @@
 
   onObserverEvent: function() {
     this.changed = false;   
+    this.tokenBounds = null;
     if(this.getToken().length>=this.options.minChars) {
-      this.startIndicator();
       this.getUpdatedChoices();
     } else {
       this.active = false;
       this.hide();
     }
+    this.oldElementValue = this.element.value;
   },
 
   getToken: function() {
-    var tokenPos = this.findLastToken();
-    if (tokenPos != -1)
-      var ret = this.element.value.substr(tokenPos + 1).replace(/^\s+/,'').replace(/\s+$/,'');
-    else
-      var ret = this.element.value;
-
-    return /\n/.test(ret) ? '' : ret;
+    var bounds = this.getTokenBounds();
+    return this.element.value.substring(bounds[0], bounds[1]).strip();
   },
 
-  findLastToken: function() {
-    var lastTokenPos = -1;
-
-    for (var i=0; i<this.options.tokens.length; i++) {
-      var thisTokenPos = this.element.value.lastIndexOf(this.options.tokens[i]);
-      if (thisTokenPos > lastTokenPos)
-        lastTokenPos = thisTokenPos;
+  getTokenBounds: function() {
+    if (null != this.tokenBounds) return this.tokenBounds;
+    var value = this.element.value;
+    if (value.strip().empty()) return [-1, 0];
+    var diff = arguments.callee.getFirstDifferencePos(value, this.oldElementValue);
+    var offset = (diff == this.oldElementValue.length ? 1 : 0);
+    var prevTokenPos = -1, nextTokenPos = value.length;
+    var tp;
+    for (var index = 0, l = this.options.tokens.length; index < l; ++index) {
+      tp = value.lastIndexOf(this.options.tokens[index], diff + offset - 1);
+      if (tp > prevTokenPos) prevTokenPos = tp;
+      tp = value.indexOf(this.options.tokens[index], diff + offset);
+      if (-1 != tp && tp < nextTokenPos) nextTokenPos = tp;
     }
-    return lastTokenPos;
+    return (this.tokenBounds = [prevTokenPos + 1, nextTokenPos]);
   }
-}
+});
+
+Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos = function(newS, oldS) {
+  var boundary = Math.min(newS.length, oldS.length);
+  for (var index = 0; index < boundary; ++index)
+    if (newS[index] != oldS[index])
+      return index;
+  return boundary;
+};
 
-Ajax.Autocompleter = Class.create();
-Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), {
+Ajax.Autocompleter = Class.create(Autocompleter.Base, {
   initialize: function(element, update, url, options) {
     this.baseInitialize(element, update, options);
     this.options.asynchronous  = true;
@@ -340,7 +352,9 @@
   },
 
   getUpdatedChoices: function() {
-    entry = encodeURIComponent(this.options.paramName) + '=' + 
+    this.startIndicator();
+    
+    var entry = encodeURIComponent(this.options.paramName) + '=' + 
       encodeURIComponent(this.getToken());
 
     this.options.parameters = this.options.callback ?
@@ -348,14 +362,13 @@
 
     if(this.options.defaultParams) 
       this.options.parameters += '&' + this.options.defaultParams;
-
+    
     new Ajax.Request(this.url, this.options);
   },
 
   onComplete: function(request) {
     this.updateChoices(request.responseText);
   }
-
 });
 
 // The local array autocompleter. Used when you'd prefer to
@@ -393,8 +406,7 @@
 // In that case, the other options above will not apply unless
 // you support them.
 
-Autocompleter.Local = Class.create();
-Autocompleter.Local.prototype = Object.extend(new Autocompleter.Base(), {
+Autocompleter.Local = Class.create(Autocompleter.Base, {
   initialize: function(element, update, array, options) {
     this.baseInitialize(element, update, options);
     this.options.array = array;
@@ -450,13 +462,12 @@
           ret = ret.concat(partial.slice(0, instance.options.choices - ret.length))
         return "<ul>" + ret.join('') + "</ul>";
       }
-    }, options || {});
+    }, options || { });
   }
 });
 
-// AJAX in-place editor
-//
-// see documentation on http://wiki.script.aculo.us/scriptaculous/show/Ajax.InPlaceEditor
+// AJAX in-place editor and collection editor
+// Full rewrite by Christophe Porteneuve <tdd@tddsworld.com> (April 2007).
 
 // Use this if you notice weird scrolling problems on some browsers,
 // the DOM might be a bit confused when this gets called so do this
@@ -467,353 +478,472 @@
   }, 1);
 }
 
-Ajax.InPlaceEditor = Class.create();
-Ajax.InPlaceEditor.defaultHighlightColor = "#FFFF99";
-Ajax.InPlaceEditor.prototype = {
+Ajax.InPlaceEditor = Class.create({
   initialize: function(element, url, options) {
     this.url = url;
-    this.element = $(element);
-
-    this.options = Object.extend({
-      paramName: "value",
-      okButton: true,
-      okText: "ok",
-      cancelLink: true,
-      cancelText: "cancel",
-      savingText: "Saving...",
-      clickToEditText: "Click to edit",
-      okText: "ok",
-      rows: 1,
-      onComplete: function(transport, element) {
-        new Effect.Highlight(element, {startcolor: this.options.highlightcolor});
-      },
-      onFailure: function(transport) {
-        alert("Error communicating with the server: " + transport.responseText.stripTags());
-      },
-      callback: function(form) {
-        return Form.serialize(form);
-      },
-      handleLineBreaks: true,
-      loadingText: 'Loading...',
-      savingClassName: 'inplaceeditor-saving',
-      loadingClassName: 'inplaceeditor-loading',
-      formClassName: 'inplaceeditor-form',
-      highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor,
-      highlightendcolor: "#FFFFFF",
-      externalControl: null,
-      submitOnBlur: false,
-      ajaxOptions: {},
-      evalScripts: false
-    }, options || {});
-
-    if(!this.options.formId && this.element.id) {
-      this.options.formId = this.element.id + "-inplaceeditor";
-      if ($(this.options.formId)) {
-        // there's already a form with that name, don't specify an id
-        this.options.formId = null;
-      }
+    this.element = element = $(element);
+    this.prepareOptions();
+    this._controls = { };
+    arguments.callee.dealWithDeprecatedOptions(options); // DEPRECATION LAYER!!!
+    Object.extend(this.options, options || { });
+    if (!this.options.formId && this.element.id) {
+      this.options.formId = this.element.id + '-inplaceeditor';
+      if ($(this.options.formId))
+        this.options.formId = '';
     }
-    
-    if (this.options.externalControl) {
+    if (this.options.externalControl)
       this.options.externalControl = $(this.options.externalControl);
-    }
-    
-    this.originalBackground = Element.getStyle(this.element, 'background-color');
-    if (!this.originalBackground) {
-      this.originalBackground = "transparent";
-    }
-    
+    if (!this.options.externalControl)
+      this.options.externalControlOnly = false;
+    this._originalBackground = this.element.getStyle('background-color') || 'transparent';
     this.element.title = this.options.clickToEditText;
-    
-    this.onclickListener = this.enterEditMode.bindAsEventListener(this);
-    this.mouseoverListener = this.enterHover.bindAsEventListener(this);
-    this.mouseoutListener = this.leaveHover.bindAsEventListener(this);
-    Event.observe(this.element, 'click', this.onclickListener);
-    Event.observe(this.element, 'mouseover', this.mouseoverListener);
-    Event.observe(this.element, 'mouseout', this.mouseoutListener);
-    if (this.options.externalControl) {
-      Event.observe(this.options.externalControl, 'click', this.onclickListener);
-      Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);
-      Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);
-    }
-  },
-  enterEditMode: function(evt) {
-    if (this.saving) return;
-    if (this.editing) return;
-    this.editing = true;
-    this.onEnterEditMode();
-    if (this.options.externalControl) {
-      Element.hide(this.options.externalControl);
-    }
-    Element.hide(this.element);
-    this.createForm();
-    this.element.parentNode.insertBefore(this.form, this.element);
-    if (!this.options.loadTextURL) Field.scrollFreeActivate(this.editField);
-    // stop the event to avoid a page refresh in Safari
-    if (evt) {
-      Event.stop(evt);
+    this._boundCancelHandler = this.handleFormCancellation.bind(this);
+    this._boundComplete = (this.options.onComplete || Prototype.emptyFunction).bind(this);
+    this._boundFailureHandler = this.handleAJAXFailure.bind(this);
+    this._boundSubmitHandler = this.handleFormSubmission.bind(this);
+    this._boundWrapperHandler = this.wrapUp.bind(this);
+    this.registerListeners();
+  },
+  checkForEscapeOrReturn: function(e) {
+    if (!this._editing || e.ctrlKey || e.altKey || e.shiftKey) return;
+    if (Event.KEY_ESC == e.keyCode)
+      this.handleFormCancellation(e);
+    else if (Event.KEY_RETURN == e.keyCode)
+      this.handleFormSubmission(e);
+  },
+  createControl: function(mode, handler, extraClasses) {
+    var control = this.options[mode + 'Control'];
+    var text = this.options[mode + 'Text'];
+    if ('button' == control) {
+      var btn = document.createElement('input');
+      btn.type = 'submit';
+      btn.value = text;
+      btn.className = 'editor_' + mode + '_button';
+      if ('cancel' == mode)
+        btn.onclick = this._boundCancelHandler;
+      this._form.appendChild(btn);
+      this._controls[mode] = btn;
+    } else if ('link' == control) {
+      var link = document.createElement('a');
+      link.href = '#';
+      link.appendChild(document.createTextNode(text));
+      link.onclick = 'cancel' == mode ? this._boundCancelHandler : this._boundSubmitHandler;
+      link.className = 'editor_' + mode + '_link';
+      if (extraClasses)
+        link.className += ' ' + extraClasses;
+      this._form.appendChild(link);
+      this._controls[mode] = link;
     }
-    return false;
-  },
-  createForm: function() {
-    this.form = document.createElement("form");
-    this.form.id = this.options.formId;
-    Element.addClassName(this.form, this.options.formClassName)
-    this.form.onsubmit = this.onSubmit.bind(this);
-
-    this.createEditField();
-
-    if (this.options.textarea) {
-      var br = document.createElement("br");
-      this.form.appendChild(br);
-    }
-
-    if (this.options.okButton) {
-      okButton = document.createElement("input");
-      okButton.type = "submit";
-      okButton.value = this.options.okText;
-      okButton.className = 'editor_ok_button';
-      this.form.appendChild(okButton);
-    }
-
-    if (this.options.cancelLink) {
-      cancelLink = document.createElement("a");
-      cancelLink.href = "#";
-      cancelLink.appendChild(document.createTextNode(this.options.cancelText));
-      cancelLink.onclick = this.onclickCancel.bind(this);
-      cancelLink.className = 'editor_cancel';      
-      this.form.appendChild(cancelLink);
-    }
-  },
-  hasHTMLLineBreaks: function(string) {
-    if (!this.options.handleLineBreaks) return false;
-    return string.match(/<br/i) || string.match(/<p>/i);
-  },
-  convertHTMLLineBreaks: function(string) {
-    return string.replace(/<br>/gi, "\n").replace(/<br\/>/gi, "\n").replace(/<\/p>/gi, "\n").replace(/<p>/gi, "");
   },
   createEditField: function() {
-    var text;
-    if(this.options.loadTextURL) {
-      text = this.options.loadingText;
-    } else {
-      text = this.getText();
-    }
-
-    var obj = this;
-    
-    if (this.options.rows == 1 && !this.hasHTMLLineBreaks(text)) {
-      this.options.textarea = false;
-      var textField = document.createElement("input");
-      textField.obj = this;
-      textField.type = "text";
-      textField.name = this.options.paramName;
-      textField.value = text;
-      textField.style.backgroundColor = this.options.highlightcolor;
-      textField.className = 'editor_field';
+    var text = (this.options.loadTextURL ? this.options.loadingText : this.getText());
+    var fld;
+    if (1 >= this.options.rows && !/\r|\n/.test(this.getText())) {
+      fld = document.createElement('input');
+      fld.type = 'text';
       var size = this.options.size || this.options.cols || 0;
-      if (size != 0) textField.size = size;
-      if (this.options.submitOnBlur)
-        textField.onblur = this.onSubmit.bind(this);
-      this.editField = textField;
+      if (0 < size) fld.size = size;
     } else {
-      this.options.textarea = true;
-      var textArea = document.createElement("textarea");
-      textArea.obj = this;
-      textArea.name = this.options.paramName;
-      textArea.value = this.convertHTMLLineBreaks(text);
-      textArea.rows = this.options.rows;
-      textArea.cols = this.options.cols || 40;
-      textArea.className = 'editor_field';      
-      if (this.options.submitOnBlur)
-        textArea.onblur = this.onSubmit.bind(this);
-      this.editField = textArea;
-    }
-    
-    if(this.options.loadTextURL) {
+      fld = document.createElement('textarea');
+      fld.rows = (1 >= this.options.rows ? this.options.autoRows : this.options.rows);
+      fld.cols = this.options.cols || 40;
+    }
+    fld.name = this.options.paramName;
+    fld.value = text; // No HTML breaks conversion anymore
+    fld.className = 'editor_field';
+    if (this.options.submitOnBlur)
+      fld.onblur = this._boundSubmitHandler;
+    this._controls.editor = fld;
+    if (this.options.loadTextURL)
       this.loadExternalText();
-    }
-    this.form.appendChild(this.editField);
+    this._form.appendChild(this._controls.editor);
+  },
+  createForm: function() {
+    var ipe = this;
+    function addText(mode, condition) {
+      var text = ipe.options['text' + mode + 'Controls'];
+      if (!text || condition === false) return;
+      ipe._form.appendChild(document.createTextNode(text));
+    };
+    this._form = $(document.createElement('form'));
+    this._form.id = this.options.formId;
+    this._form.addClassName(this.options.formClassName);
+    this._form.onsubmit = this._boundSubmitHandler;
+    this.createEditField();
+    if ('textarea' == this._controls.editor.tagName.toLowerCase())
+      this._form.appendChild(document.createElement('br'));
+    if (this.options.onFormCustomization)
+      this.options.onFormCustomization(this, this._form);
+    addText('Before', this.options.okControl || this.options.cancelControl);
+    this.createControl('ok', this._boundSubmitHandler);
+    addText('Between', this.options.okControl && this.options.cancelControl);
+    this.createControl('cancel', this._boundCancelHandler, 'editor_cancel');
+    addText('After', this.options.okControl || this.options.cancelControl);
+  },
+  destroy: function() {
+    if (this._oldInnerHTML)
+      this.element.innerHTML = this._oldInnerHTML;
+    this.leaveEditMode();
+    this.unregisterListeners();
+  },
+  enterEditMode: function(e) {
+    if (this._saving || this._editing) return;
+    this._editing = true;
+    this.triggerCallback('onEnterEditMode');
+    if (this.options.externalControl)
+      this.options.externalControl.hide();
+    this.element.hide();
+    this.createForm();
+    this.element.parentNode.insertBefore(this._form, this.element);
+    if (!this.options.loadTextURL)
+      this.postProcessEditField();
+    if (e) Event.stop(e);
+  },
+  enterHover: function(e) {
+    if (this.options.hoverClassName)
+      this.element.addClassName(this.options.hoverClassName);
+    if (this._saving) return;
+    this.triggerCallback('onEnterHover');
   },
   getText: function() {
     return this.element.innerHTML;
   },
-  loadExternalText: function() {
-    Element.addClassName(this.form, this.options.loadingClassName);
-    this.editField.disabled = true;
-    new Ajax.Request(
-      this.options.loadTextURL,
-      Object.extend({
-        asynchronous: true,
-        onComplete: this.onLoadedExternalText.bind(this)
-      }, this.options.ajaxOptions)
-    );
-  },
-  onLoadedExternalText: function(transport) {
-    Element.removeClassName(this.form, this.options.loadingClassName);
-    this.editField.disabled = false;
-    this.editField.value = transport.responseText.stripTags();
-    Field.scrollFreeActivate(this.editField);
+  handleAJAXFailure: function(transport) {
+    this.triggerCallback('onFailure', transport);
+    if (this._oldInnerHTML) {
+      this.element.innerHTML = this._oldInnerHTML;
+      this._oldInnerHTML = null;
+    }
+  },
+  handleFormCancellation: function(e) {
+    this.wrapUp();
+    if (e) Event.stop(e);
+  },
+  handleFormSubmission: function(e) {
+    var form = this._form;
+    var value = $F(this._controls.editor);
+    this.prepareSubmission();
+    var params = this.options.callback(form, value) || '';
+    if (Object.isString(params))
+      params = params.toQueryParams();
+    params.editorId = this.element.id;
+    if (this.options.htmlResponse) {
+      var options = Object.extend({ evalScripts: true }, this.options.ajaxOptions);
+      Object.extend(options, {
+        parameters: params,
+        onComplete: this._boundWrapperHandler,
+        onFailure: this._boundFailureHandler
+      });
+      new Ajax.Updater({ success: this.element }, this.url, options);
+    } else {
+      var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
+      Object.extend(options, {
+        parameters: params,
+        onComplete: this._boundWrapperHandler,
+        onFailure: this._boundFailureHandler
+      });
+      new Ajax.Request(this.url, options);
+    }
+    if (e) Event.stop(e);
   },
-  onclickCancel: function() {
-    this.onComplete();
-    this.leaveEditMode();
-    return false;
+  leaveEditMode: function() {
+    this.element.removeClassName(this.options.savingClassName);
+    this.removeForm();
+    this.leaveHover();
+    this.element.style.backgroundColor = this._originalBackground;
+    this.element.show();
+    if (this.options.externalControl)
+      this.options.externalControl.show();
+    this._saving = false;
+    this._editing = false;
+    this._oldInnerHTML = null;
+    this.triggerCallback('onLeaveEditMode');
+  },
+  leaveHover: function(e) {
+    if (this.options.hoverClassName)
+      this.element.removeClassName(this.options.hoverClassName);
+    if (this._saving) return;
+    this.triggerCallback('onLeaveHover');
   },
-  onFailure: function(transport) {
-    this.options.onFailure(transport);
-    if (this.oldInnerHTML) {
-      this.element.innerHTML = this.oldInnerHTML;
-      this.oldInnerHTML = null;
-    }
-    return false;
-  },
-  onSubmit: function() {
-    // onLoading resets these so we need to save them away for the Ajax call
-    var form = this.form;
-    var value = this.editField.value;
-    
-    // do this first, sometimes the ajax call returns before we get a chance to switch on Saving...
-    // which means this will actually switch on Saving... *after* we've left edit mode causing Saving...
-    // to be displayed indefinitely
-    this.onLoading();
-    
-    if (this.options.evalScripts) {
-      new Ajax.Request(
-        this.url, Object.extend({
-          parameters: this.options.callback(form, value),
-          onComplete: this.onComplete.bind(this),
-          onFailure: this.onFailure.bind(this),
-          asynchronous:true, 
-          evalScripts:true
-        }, this.options.ajaxOptions));
-    } else  {
-      new Ajax.Updater(
-        { success: this.element,
-          // don't update on failure (this could be an option)
-          failure: null }, 
-        this.url, Object.extend({
-          parameters: this.options.callback(form, value),
-          onComplete: this.onComplete.bind(this),
-          onFailure: this.onFailure.bind(this)
-        }, this.options.ajaxOptions));
-    }
-    // stop the event to avoid a page refresh in Safari
-    if (arguments.length > 1) {
-      Event.stop(arguments[0]);
-    }
-    return false;
+  loadExternalText: function() {
+    this._form.addClassName(this.options.loadingClassName);
+    this._controls.editor.disabled = true;
+    var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
+    Object.extend(options, {
+      parameters: 'editorId=' + encodeURIComponent(this.element.id),
+      onComplete: Prototype.emptyFunction,
+      onSuccess: function(transport) {
+        this._form.removeClassName(this.options.loadingClassName);
+        var text = transport.responseText;
+        if (this.options.stripLoadedTextTags)
+          text = text.stripTags();
+        this._controls.editor.value = text;
+        this._controls.editor.disabled = false;
+        this.postProcessEditField();
+      }.bind(this),
+      onFailure: this._boundFailureHandler
+    });
+    new Ajax.Request(this.options.loadTextURL, options);
+  },
+  postProcessEditField: function() {
+    var fpc = this.options.fieldPostCreation;
+    if (fpc)
+      $(this._controls.editor)['focus' == fpc ? 'focus' : 'activate']();
+  },
+  prepareOptions: function() {
+    this.options = Object.clone(Ajax.InPlaceEditor.DefaultOptions);
+    Object.extend(this.options, Ajax.InPlaceEditor.DefaultCallbacks);
+    [this._extraDefaultOptions].flatten().compact().each(function(defs) {
+      Object.extend(this.options, defs);
+    }.bind(this));
   },
-  onLoading: function() {
-    this.saving = true;
+  prepareSubmission: function() {
+    this._saving = true;
     this.removeForm();
     this.leaveHover();
     this.showSaving();
   },
-  showSaving: function() {
-    this.oldInnerHTML = this.element.innerHTML;
-    this.element.innerHTML = this.options.savingText;
-    Element.addClassName(this.element, this.options.savingClassName);
-    this.element.style.backgroundColor = this.originalBackground;
-    Element.show(this.element);
+  registerListeners: function() {
+    this._listeners = { };
+    var listener;
+    $H(Ajax.InPlaceEditor.Listeners).each(function(pair) {
+      listener = this[pair.value].bind(this);
+      this._listeners[pair.key] = listener;
+      if (!this.options.externalControlOnly)
+        this.element.observe(pair.key, listener);
+      if (this.options.externalControl)
+        this.options.externalControl.observe(pair.key, listener);
+    }.bind(this));
   },
   removeForm: function() {
-    if(this.form) {
-      if (this.form.parentNode) Element.remove(this.form);
-      this.form = null;
-    }
-  },
-  enterHover: function() {
-    if (this.saving) return;
-    this.element.style.backgroundColor = this.options.highlightcolor;
-    if (this.effect) {
-      this.effect.cancel();
-    }
-    Element.addClassName(this.element, this.options.hoverClassName)
-  },
-  leaveHover: function() {
-    if (this.options.backgroundColor) {
-      this.element.style.backgroundColor = this.oldBackground;
-    }
-    Element.removeClassName(this.element, this.options.hoverClassName)
-    if (this.saving) return;
-    this.effect = new Effect.Highlight(this.element, {
-      startcolor: this.options.highlightcolor,
-      endcolor: this.options.highlightendcolor,
-      restorecolor: this.originalBackground
-    });
+    if (!this._form) return;
+    this._form.remove();
+    this._form = null;
+    this._controls = { };
   },
-  leaveEditMode: function() {
-    Element.removeClassName(this.element, this.options.savingClassName);
-    this.removeForm();
-    this.leaveHover();
-    this.element.style.backgroundColor = this.originalBackground;
-    Element.show(this.element);
-    if (this.options.externalControl) {
-      Element.show(this.options.externalControl);
-    }
-    this.editing = false;
-    this.saving = false;
-    this.oldInnerHTML = null;
-    this.onLeaveEditMode();
+  showSaving: function() {
+    this._oldInnerHTML = this.element.innerHTML;
+    this.element.innerHTML = this.options.savingText;
+    this.element.addClassName(this.options.savingClassName);
+    this.element.style.backgroundColor = this._originalBackground;
+    this.element.show();
+  },
+  triggerCallback: function(cbName, arg) {
+    if ('function' == typeof this.options[cbName]) {
+      this.options[cbName](this, arg);
+    }
+  },
+  unregisterListeners: function() {
+    $H(this._listeners).each(function(pair) {
+      if (!this.options.externalControlOnly)
+        this.element.stopObserving(pair.key, pair.value);
+      if (this.options.externalControl)
+        this.options.externalControl.stopObserving(pair.key, pair.value);
+    }.bind(this));
   },
-  onComplete: function(transport) {
+  wrapUp: function(transport) {
     this.leaveEditMode();
-    this.options.onComplete.bind(this)(transport, this.element);
+    // Can't use triggerCallback due to backward compatibility: requires
+    // binding + direct element
+    this._boundComplete(transport, this.element);
+  }
+});
+
+Object.extend(Ajax.InPlaceEditor.prototype, {
+  dispose: Ajax.InPlaceEditor.prototype.destroy
+});
+
+Ajax.InPlaceCollectionEditor = Class.create(Ajax.InPlaceEditor, {
+  initialize: function($super, element, url, options) {
+    this._extraDefaultOptions = Ajax.InPlaceCollectionEditor.DefaultOptions;
+    $super(element, url, options);
   },
-  onEnterEditMode: function() {},
-  onLeaveEditMode: function() {},
-  dispose: function() {
-    if (this.oldInnerHTML) {
-      this.element.innerHTML = this.oldInnerHTML;
-    }
-    this.leaveEditMode();
-    Event.stopObserving(this.element, 'click', this.onclickListener);
-    Event.stopObserving(this.element, 'mouseover', this.mouseoverListener);
-    Event.stopObserving(this.element, 'mouseout', this.mouseoutListener);
-    if (this.options.externalControl) {
-      Event.stopObserving(this.options.externalControl, 'click', this.onclickListener);
-      Event.stopObserving(this.options.externalControl, 'mouseover', this.mouseoverListener);
-      Event.stopObserving(this.options.externalControl, 'mouseout', this.mouseoutListener);
+
+  createEditField: function() {
+    var list = document.createElement('select');
+    list.name = this.options.paramName;
+    list.size = 1;
+    this._controls.editor = list;
+    this._collection = this.options.collection || [];
+    if (this.options.loadCollectionURL)
+      this.loadCollection();
+    else
+      this.checkForExternalText();
+    this._form.appendChild(this._controls.editor);
+  },
+
+  loadCollection: function() {
+    this._form.addClassName(this.options.loadingClassName);
+    this.showLoadingText(this.options.loadingCollectionText);
+    var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
+    Object.extend(options, {
+      parameters: 'editorId=' + encodeURIComponent(this.element.id),
+      onComplete: Prototype.emptyFunction,
+      onSuccess: function(transport) {
+        var js = transport.responseText.strip();
+        if (!/^\[.*\]$/.test(js)) // TODO: improve sanity check
+          throw 'Server returned an invalid collection representation.';
+        this._collection = eval(js);
+        this.checkForExternalText();
+      }.bind(this),
+      onFailure: this.onFailure
+    });
+    new Ajax.Request(this.options.loadCollectionURL, options);
+  },
+
+  showLoadingText: function(text) {
+    this._controls.editor.disabled = true;
+    var tempOption = this._controls.editor.firstChild;
+    if (!tempOption) {
+      tempOption = document.createElement('option');
+      tempOption.value = '';
+      this._controls.editor.appendChild(tempOption);
+      tempOption.selected = true;
     }
+    tempOption.update((text || '').stripScripts().stripTags());
+  },
+
+  checkForExternalText: function() {
+    this._text = this.getText();
+    if (this.options.loadTextURL)
+      this.loadExternalText();
+    else
+      this.buildOptionList();
+  },
+
+  loadExternalText: function() {
+    this.showLoadingText(this.options.loadingText);
+    var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
+    Object.extend(options, {
+      parameters: 'editorId=' + encodeURIComponent(this.element.id),
+      onComplete: Prototype.emptyFunction,
+      onSuccess: function(transport) {
+        this._text = transport.responseText.strip();
+        this.buildOptionList();
+      }.bind(this),
+      onFailure: this.onFailure
+    });
+    new Ajax.Request(this.options.loadTextURL, options);
+  },
+
+  buildOptionList: function() {
+    this._form.removeClassName(this.options.loadingClassName);
+    this._collection = this._collection.map(function(entry) {
+      return 2 === entry.length ? entry : [entry, entry].flatten();
+    });
+    var marker = ('value' in this.options) ? this.options.value : this._text;
+    var textFound = this._collection.any(function(entry) {
+      return entry[0] == marker;
+    }.bind(this));
+    this._controls.editor.update('');
+    var option;
+    this._collection.each(function(entry, index) {
+      option = document.createElement('option');
+      option.value = entry[0];
+      option.selected = textFound ? entry[0] == marker : 0 == index;
+      option.appendChild(document.createTextNode(entry[1]));
+      this._controls.editor.appendChild(option);
+    }.bind(this));
+    this._controls.editor.disabled = false;
+    Field.scrollFreeActivate(this._controls.editor);
   }
+});
+
+//**** DEPRECATION LAYER FOR InPlace[Collection]Editor! ****
+//**** This only  exists for a while,  in order to  let ****
+//**** users adapt to  the new API.  Read up on the new ****
+//**** API and convert your code to it ASAP!            ****
+
+Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions = function(options) {
+  if (!options) return;
+  function fallback(name, expr) {
+    if (name in options || expr === undefined) return;
+    options[name] = expr;
+  };
+  fallback('cancelControl', (options.cancelLink ? 'link' : (options.cancelButton ? 'button' :
+    options.cancelLink == options.cancelButton == false ? false : undefined)));
+  fallback('okControl', (options.okLink ? 'link' : (options.okButton ? 'button' :
+    options.okLink == options.okButton == false ? false : undefined)));
+  fallback('highlightColor', options.highlightcolor);
+  fallback('highlightEndColor', options.highlightendcolor);
 };
 
-Ajax.InPlaceCollectionEditor = Class.create();
-Object.extend(Ajax.InPlaceCollectionEditor.prototype, Ajax.InPlaceEditor.prototype);
-Object.extend(Ajax.InPlaceCollectionEditor.prototype, {
-  createEditField: function() {
-    if (!this.cached_selectTag) {
-      var selectTag = document.createElement("select");
-      var collection = this.options.collection || [];
-      var optionTag;
-      collection.each(function(e,i) {
-        optionTag = document.createElement("option");
-        optionTag.value = (e instanceof Array) ? e[0] : e;
-        if((typeof this.options.value == 'undefined') && 
-          ((e instanceof Array) ? this.element.innerHTML == e[1] : e == optionTag.value)) optionTag.selected = true;
-        if(this.options.value==optionTag.value) optionTag.selected = true;
-        optionTag.appendChild(document.createTextNode((e instanceof Array) ? e[1] : e));
-        selectTag.appendChild(optionTag);
-      }.bind(this));
-      this.cached_selectTag = selectTag;
-    }
-
-    this.editField = this.cached_selectTag;
-    if(this.options.loadTextURL) this.loadExternalText();
-    this.form.appendChild(this.editField);
-    this.options.callback = function(form, value) {
-      return "value=" + encodeURIComponent(value);
-    }
+Object.extend(Ajax.InPlaceEditor, {
+  DefaultOptions: {
+    ajaxOptions: { },
+    autoRows: 3,                                // Use when multi-line w/ rows == 1
+    cancelControl: 'link',                      // 'link'|'button'|false
+    cancelText: 'cancel',
+    clickToEditText: 'Click to edit',
+    externalControl: null,                      // id|elt
+    externalControlOnly: false,
+    fieldPostCreation: 'activate',              // 'activate'|'focus'|false
+    formClassName: 'inplaceeditor-form',
+    formId: null,                               // id|elt
+    highlightColor: '#ffff99',
+    highlightEndColor: '#ffffff',
+    hoverClassName: '',
+    htmlResponse: true,
+    loadingClassName: 'inplaceeditor-loading',
+    loadingText: 'Loading...',
+    okControl: 'button',                        // 'link'|'button'|false
+    okText: 'ok',
+    paramName: 'value',
+    rows: 1,                                    // If 1 and multi-line, uses autoRows
+    savingClassName: 'inplaceeditor-saving',
+    savingText: 'Saving...',
+    size: 0,
+    stripLoadedTextTags: false,
+    submitOnBlur: false,
+    textAfterControls: '',
+    textBeforeControls: '',
+    textBetweenControls: ''
+  },
+  DefaultCallbacks: {
+    callback: function(form) {
+      return Form.serialize(form);
+    },
+    onComplete: function(transport, element) {
+      // For backward compatibility, this one is bound to the IPE, and passes
+      // the element directly.  It was too often customized, so we don't break it.
+      new Effect.Highlight(element, {
+        startcolor: this.options.highlightColor, keepBackgroundImage: true });
+    },
+    onEnterEditMode: null,
+    onEnterHover: function(ipe) {
+      ipe.element.style.backgroundColor = ipe.options.highlightColor;
+      if (ipe._effect)
+        ipe._effect.cancel();
+    },
+    onFailure: function(transport, ipe) {
+      alert('Error communication with the server: ' + transport.responseText.stripTags());
+    },
+    onFormCustomization: null, // Takes the IPE and its generated form, after editor, before controls.
+    onLeaveEditMode: null,
+    onLeaveHover: function(ipe) {
+      ipe._effect = new Effect.Highlight(ipe.element, {
+        startcolor: ipe.options.highlightColor, endcolor: ipe.options.highlightEndColor,
+        restorecolor: ipe._originalBackground, keepBackgroundImage: true
+      });
+    }
+  },
+  Listeners: {
+    click: 'enterEditMode',
+    keydown: 'checkForEscapeOrReturn',
+    mouseover: 'enterHover',
+    mouseout: 'leaveHover'
   }
 });
 
+Ajax.InPlaceCollectionEditor.DefaultOptions = {
+  loadingCollectionText: 'Loading options...'
+};
+
 // Delayed observer, like Form.Element.Observer, 
 // but waits for delay after last key input
 // Ideal for live-search fields
 
-Form.Element.DelayedObserver = Class.create();
-Form.Element.DelayedObserver.prototype = {
+Form.Element.DelayedObserver = Class.create({
   initialize: function(element, delay, callback) {
     this.delay     = delay || 0.5;
     this.element   = $(element);
@@ -832,4 +962,4 @@
     this.timer = null;
     this.callback(this.element, $F(this.element));
   }
-};
+});
diff -x .svn -aruN 2.2.2.src/wp-includes/js/scriptaculous/dragdrop.js 2.5.src/wp-includes/js/scriptaculous/dragdrop.js
--- 2.2.2.src/wp-includes/js/scriptaculous/dragdrop.js	2007-01-25 21:41:17.000000000 -0600
+++ 2.5.src/wp-includes/js/scriptaculous/dragdrop.js	2008-03-02 15:34:25.000000000 -0600
@@ -1,12 +1,12 @@
-// script.aculo.us dragdrop.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
+// script.aculo.us dragdrop.js v1.8.0, Tue Nov 06 15:01:40 +0300 2007
 
-// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//           (c) 2005, 2006 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)
+// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//           (c) 2005-2007 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)
 // 
 // script.aculo.us is freely distributable under the terms of an MIT-style license.
 // For details, see the script.aculo.us web site: http://script.aculo.us/
 
-if(typeof Effect == 'undefined')
+if(Object.isUndefined(Effect))
   throw("dragdrop.js requires including script.aculo.us' effects.js library");
 
 var Droppables = {
@@ -22,14 +22,13 @@
       greedy:     true,
       hoverclass: null,
       tree:       false
-    }, arguments[1] || {});
+    }, arguments[1] || { });
 
     // cache containers
     if(options.containment) {
       options._containers = [];
       var containment = options.containment;
-      if((typeof containment == 'object') && 
-        (containment.constructor == Array)) {
+      if(Object.isArray(containment)) {
         containment.each( function(c) { options._containers.push($(c)) });
       } else {
         options._containers.push($(containment));
@@ -89,21 +88,23 @@
 
   show: function(point, element) {
     if(!this.drops.length) return;
-    var affected = [];
+    var drop, affected = [];
     
-    if(this.last_active) this.deactivate(this.last_active);
     this.drops.each( function(drop) {
       if(Droppables.isAffected(point, element, drop))
         affected.push(drop);
     });
         
-    if(affected.length>0) {
+    if(affected.length>0)
       drop = Droppables.findDeepestChild(affected);
+
+    if(this.last_active && this.last_active != drop) this.deactivate(this.last_active);
+    if (drop) {
       Position.within(drop.element, point[0], point[1]);
       if(drop.onHover)
         drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
       
-      Droppables.activate(drop);
+      if (drop != this.last_active) Droppables.activate(drop);
     }
   },
 
@@ -112,8 +113,10 @@
     Position.prepare();
 
     if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
-      if (this.last_active.onDrop) 
-        this.last_active.onDrop(element, this.last_active.element, event);
+      if (this.last_active.onDrop) {
+        this.last_active.onDrop(element, this.last_active.element, event); 
+        return true; 
+      }
   },
 
   reset: function() {
@@ -221,10 +224,7 @@
 
 /*--------------------------------------------------------------------------*/
 
-var Draggable = Class.create();
-Draggable._dragging    = {};
-
-Draggable.prototype = {
+var Draggable = Class.create({
   initialize: function(element) {
     var defaults = {
       handle: false,
@@ -235,7 +235,7 @@
         });
       },
       endeffect: function(element) {
-        var toOpacity = typeof element._opacity == 'number' ? element._opacity : 1.0;
+        var toOpacity = Object.isNumber(element._opacity) ? element._opacity : 1.0;
         new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity, 
           queue: {scope:'_draggable', position:'end'},
           afterFinish: function(){ 
@@ -245,6 +245,7 @@
       },
       zindex: 1000,
       revert: false,
+      quiet: false,
       scroll: false,
       scrollSensitivity: 20,
       scrollSpeed: 15,
@@ -252,7 +253,7 @@
       delay: 0
     };
     
-    if(!arguments[1] || typeof arguments[1].endeffect == 'undefined')
+    if(!arguments[1] || Object.isUndefined(arguments[1].endeffect))
       Object.extend(defaults, {
         starteffect: function(element) {
           element._opacity = Element.getOpacity(element);
@@ -261,11 +262,11 @@
         }
       });
     
-    var options = Object.extend(defaults, arguments[1] || {});
+    var options = Object.extend(defaults, arguments[1] || { });
 
     this.element = $(element);
     
-    if(options.handle && (typeof options.handle == 'string'))
+    if(options.handle && Object.isString(options.handle))
       this.handle = this.element.down('.'+options.handle, 0);
     
     if(!this.handle) this.handle = $(options.handle);
@@ -278,7 +279,6 @@
 
     Element.makePositioned(this.element); // fix IE    
 
-    this.delta    = this.currentDelta();
     this.options  = options;
     this.dragging = false;   
 
@@ -300,7 +300,7 @@
   },
   
   initDrag: function(event) {
-    if(typeof Draggable._dragging[this.element] != 'undefined' &&
+    if(!Object.isUndefined(Draggable._dragging[this.element]) &&
       Draggable._dragging[this.element]) return;
     if(Event.isLeftClick(event)) {    
       // abort on form elements, fixes a Firefox issue
@@ -323,6 +323,8 @@
   
   startDrag: function(event) {
     this.dragging = true;
+    if(!this.delta)
+      this.delta = this.currentDelta();
     
     if(this.options.zindex) {
       this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
@@ -331,7 +333,9 @@
     
     if(this.options.ghosting) {
       this._clone = this.element.cloneNode(true);
-      Position.absolutize(this.element);
+      this.element._originallyAbsolute = (this.element.getStyle('position') == 'absolute');
+      if (!this.element._originallyAbsolute)
+        Position.absolutize(this.element);
       this.element.parentNode.insertBefore(this._clone, this.element);
     }
     
@@ -353,8 +357,12 @@
   
   updateDrag: function(event, pointer) {
     if(!this.dragging) this.startDrag(event);
-    Position.prepare();
-    Droppables.show(pointer, this.element);
+    
+    if(!this.options.quiet){
+      Position.prepare();
+      Droppables.show(pointer, this.element);
+    }
+    
     Draggables.notify('onDrag', this, event);
     
     this.draw(pointer);
@@ -382,30 +390,44 @@
     }
     
     // fix AppleWebKit rendering
-    if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
+    if(Prototype.Browser.WebKit) window.scrollBy(0,0);
     
     Event.stop(event);
   },
   
   finishDrag: function(event, success) {
     this.dragging = false;
+    
+    if(this.options.quiet){
+      Position.prepare();
+      var pointer = [Event.pointerX(event), Event.pointerY(event)];
+      Droppables.show(pointer, this.element);
+    }
 
     if(this.options.ghosting) {
-      Position.relativize(this.element);
+      if (!this.element._originallyAbsolute)
+        Position.relativize(this.element);
+      delete this.element._originallyAbsolute;
       Element.remove(this._clone);
       this._clone = null;
     }
 
-    if(success) Droppables.fire(event, this.element);
+    var dropped = false; 
+    if(success) { 
+      dropped = Droppables.fire(event, this.element); 
+      if (!dropped) dropped = false; 
+    }
+    if(dropped && this.options.onDropped) this.options.onDropped(this.element);
     Draggables.notify('onEnd', this, event);
 
     var revert = this.options.revert;
-    if(revert && typeof revert == 'function') revert = revert(this.element);
+    if(revert && Object.isFunction(revert)) revert = revert(this.element);
     
     var d = this.currentDelta();
     if(revert && this.options.reverteffect) {
-      this.options.reverteffect(this.element, 
-        d[1]-this.delta[1], d[0]-this.delta[0]);
+      if (dropped == 0 || revert != 'failure')
+        this.options.reverteffect(this.element,
+          d[1]-this.delta[1], d[0]-this.delta[0]);
     } else {
       this.delta = d;
     }
@@ -453,15 +475,15 @@
     }.bind(this));
     
     if(this.options.snap) {
-      if(typeof this.options.snap == 'function') {
+      if(Object.isFunction(this.options.snap)) {
         p = this.options.snap(p[0],p[1],this);
       } else {
-      if(this.options.snap instanceof Array) {
+      if(Object.isArray(this.options.snap)) {
         p = p.map( function(v, i) {
-          return Math.round(v/this.options.snap[i])*this.options.snap[i] }.bind(this))
+          return (v/this.options.snap[i]).round()*this.options.snap[i] }.bind(this))
       } else {
         p = p.map( function(v) {
-          return Math.round(v/this.options.snap)*this.options.snap }.bind(this))
+          return (v/this.options.snap).round()*this.options.snap }.bind(this))
       }
     }}
     
@@ -545,12 +567,13 @@
     }
     return { top: T, left: L, width: W, height: H };
   }
-}
+});
+
+Draggable._dragging = { };
 
 /*--------------------------------------------------------------------------*/
 
-var SortableObserver = Class.create();
-SortableObserver.prototype = {
+var SortableObserver = Class.create({
   initialize: function(element, observer) {
     this.element   = $(element);
     this.observer  = observer;
@@ -566,12 +589,12 @@
     if(this.lastValue != Sortable.serialize(this.element))
       this.observer(this.element)
   }
-}
+});
 
 var Sortable = {
   SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,
   
-  sortables: {},
+  sortables: { },
   
   _findRootElement: function(element) {
     while (element.tagName.toUpperCase() != "BODY") {  
@@ -614,13 +637,20 @@
       delay:       0,
       hoverclass:  null,
       ghosting:    false,
+      quiet:       false, 
       scroll:      false,
       scrollSensitivity: 20,
       scrollSpeed: 15,
       format:      this.SERIALIZE_RULE,
+      
+      // these take arrays of elements or ids and can be 
+      // used for better initialization performance
+      elements:    false,
+      handles:     false,
+      
       onChange:    Prototype.emptyFunction,
       onUpdate:    Prototype.emptyFunction
-    }, arguments[1] || {});
+    }, arguments[1] || { });
 
     // clear any old sortable with same element
     this.destroy(element);
@@ -628,6 +658,7 @@
     // build options for the draggables
     var options_for_draggable = {
       revert:      true,
+      quiet:       options.quiet,
       scroll:      options.scroll,
       scrollSpeed: options.scrollSpeed,
       scrollSensitivity: options.scrollSensitivity,
@@ -681,10 +712,9 @@
       options.droppables.push(element);
     }
 
-    (this.findElements(element, options) || []).each( function(e) {
-      // handles are per-draggable
-      var handle = options.handle ? 
-        $(e).down('.'+options.handle,0) : e;    
+    (options.elements || this.findElements(element, options) || []).each( function(e,i) {
+      var handle = options.handles ? $(options.handles[i]) :
+        (options.handle ? $(e).select('.' + options.handle)[0] : e); 
       options.draggables.push(
         new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
       Droppables.add(e, options_for_droppable);
@@ -844,7 +874,7 @@
       only: sortableOptions.only,
       name: element.id,
       format: sortableOptions.format
-    }, arguments[1] || {});
+    }, arguments[1] || { });
     
     var root = {
       id: null,
@@ -868,7 +898,7 @@
 
   sequence: function(element) {
     element = $(element);
-    var options = Object.extend(this.options(element), arguments[1] || {});
+    var options = Object.extend(this.options(element), arguments[1] || { });
     
     return $(this.findElements(element, options) || []).map( function(item) {
       return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
@@ -877,9 +907,9 @@
 
   setSequence: function(element, new_sequence) {
     element = $(element);
-    var options = Object.extend(this.options(element), arguments[2] || {});
+    var options = Object.extend(this.options(element), arguments[2] || { });
     
-    var nodeMap = {};
+    var nodeMap = { };
     this.findElements(element, options).each( function(n) {
         if (n.id.match(options.format))
             nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
@@ -897,7 +927,7 @@
   
   serialize: function(element) {
     element = $(element);
-    var options = Object.extend(Sortable.options(element), arguments[1] || {});
+    var options = Object.extend(Sortable.options(element), arguments[1] || { });
     var name = encodeURIComponent(
       (arguments[1] && arguments[1].name) ? arguments[1].name : element.id);
     
@@ -921,7 +951,7 @@
   return Element.isParent(child.parentNode, element);
 }
 
-Element.findChildren = function(element, only, recursive, tagName) {    
+Element.findChildren = function(element, only, recursive, tagName) {   
   if(!element.hasChildNodes()) return null;
   tagName = tagName.toUpperCase();
   if(only) only = [only].flatten();
diff -x .svn -aruN 2.2.2.src/wp-includes/js/scriptaculous/effects.js 2.5.src/wp-includes/js/scriptaculous/effects.js
--- 2.2.2.src/wp-includes/js/scriptaculous/effects.js	2007-01-25 21:41:17.000000000 -0600
+++ 2.5.src/wp-includes/js/scriptaculous/effects.js	2008-03-02 15:34:25.000000000 -0600
@@ -1,6 +1,6 @@
-// script.aculo.us effects.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
+// script.aculo.us effects.js v1.8.0, Tue Nov 06 15:01:40 +0300 2007
 
-// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
 // Contributors:
 //  Justin Palmer (http://encytemedia.com/)
 //  Mark Pilgrim (http://diveintomark.org/)
@@ -13,17 +13,17 @@
 // returns self (or first argument) if not convertable  
 String.prototype.parseColor = function() {  
   var color = '#';
-  if(this.slice(0,4) == 'rgb(') {  
+  if (this.slice(0,4) == 'rgb(') {  
     var cols = this.slice(4,this.length-1).split(',');  
     var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);  
   } else {  
-    if(this.slice(0,1) == '#') {  
-      if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();  
-      if(this.length==7) color = this.toLowerCase();  
+    if (this.slice(0,1) == '#') {  
+      if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();  
+      if (this.length==7) color = this.toLowerCase();  
     }  
   }  
-  return(color.length==7 ? color : (arguments[0] || this));  
-}
+  return (color.length==7 ? color : (arguments[0] || this));  
+};
 
 /*--------------------------------------------------------------------------*/
 
@@ -32,7 +32,7 @@
     return (node.nodeType==3 ? node.nodeValue : 
       (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
   }).flatten().join('');
-}
+};
 
 Element.collectTextNodesIgnoreClass = function(element, className) {  
   return $A($(element).childNodes).collect( function(node) {
@@ -40,26 +40,18 @@
       ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? 
         Element.collectTextNodesIgnoreClass(node, className) : ''));
   }).flatten().join('');
-}
+};
 
 Element.setContentZoom = function(element, percent) {
   element = $(element);  
   element.setStyle({fontSize: (percent/100) + 'em'});   
-  if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
+  if (Prototype.Browser.WebKit) window.scrollBy(0,0);
   return element;
-}
-
-Element.getOpacity = function(element){
-  return $(element).getStyle('opacity');
-}
-
-Element.setOpacity = function(element, value){
-  return $(element).setStyle({opacity:value});
-}
+};
 
 Element.getInlineOpacity = function(element){
   return $(element).style.opacity || '';
-}
+};
 
 Element.forceRerendering = function(element) {
   try {
@@ -72,31 +64,63 @@
 
 /*--------------------------------------------------------------------------*/
 
-Array.prototype.call = function() {
-  var args = arguments;
-  this.each(function(f){ f.apply(this, args) });
-}
-
-/*--------------------------------------------------------------------------*/
-
 var Effect = {
   _elementDoesNotExistError: {
     name: 'ElementDoesNotExistError',
     message: 'The specified DOM element does not exist, but is required for this effect to operate'
   },
+  Transitions: {
+    linear: Prototype.K,
+    sinoidal: function(pos) {
+      return (-Math.cos(pos*Math.PI)/2) + 0.5;
+    },
+    reverse: function(pos) {
+      return 1-pos;
+    },
+    flicker: function(pos) {
+      var pos = ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
+      return pos > 1 ? 1 : pos;
+    },
+    wobble: function(pos) {
+      return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
+    },
+    pulse: function(pos, pulses) { 
+      pulses = pulses || 5; 
+      return (
+        ((pos % (1/pulses)) * pulses).round() == 0 ? 
+              ((pos * pulses * 2) - (pos * pulses * 2).floor()) : 
+          1 - ((pos * pulses * 2) - (pos * pulses * 2).floor())
+        );
+    },
+    spring: function(pos) { 
+      return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6)); 
+    },
+    none: function(pos) {
+      return 0;
+    },
+    full: function(pos) {
+      return 1;
+    }
+  },
+  DefaultOptions: {
+    duration:   1.0,   // seconds
+    fps:        100,   // 100= assume 66fps max.
+    sync:       false, // true for combining
+    from:       0.0,
+    to:         1.0,
+    delay:      0.0,
+    queue:      'parallel'
+  },
   tagifyText: function(element) {
-    if(typeof Builder == 'undefined')
-      throw("Effect.tagifyText requires including script.aculo.us' builder.js library");
-      
     var tagifyStyle = 'position:relative';
-    if(/MSIE/.test(navigator.userAgent) && !window.opera) tagifyStyle += ';zoom:1';
+    if (Prototype.Browser.IE) tagifyStyle += ';zoom:1';
     
     element = $(element);
     $A(element.childNodes).each( function(child) {
-      if(child.nodeType==3) {
+      if (child.nodeType==3) {
         child.nodeValue.toArray().each( function(character) {
           element.insertBefore(
-            Builder.node('span',{style: tagifyStyle},
+            new Element('span', {style: tagifyStyle}).update(
               character == ' ' ? String.fromCharCode(160) : character), 
               child);
         });
@@ -106,8 +130,8 @@
   },
   multiple: function(element, effect) {
     var elements;
-    if(((typeof element == 'object') || 
-        (typeof element == 'function')) && 
+    if (((typeof element == 'object') || 
+        Object.isFunction(element)) && 
        (element.length))
       elements = element;
     else
@@ -116,7 +140,7 @@
     var options = Object.extend({
       speed: 0.1,
       delay: 0.0
-    }, arguments[2] || {});
+    }, arguments[2] || { });
     var masterDelay = options.delay;
 
     $A(elements).each( function(element, index) {
@@ -133,53 +157,20 @@
     effect = (effect || 'appear').toLowerCase();
     var options = Object.extend({
       queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
-    }, arguments[2] || {});
+    }, arguments[2] || { });
     Effect[element.visible() ? 
       Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
   }
 };
 
-var Effect2 = Effect; // deprecated
-
-/* ------------- transitions ------------- */
-
-Effect.Transitions = {
-  linear: Prototype.K,
-  sinoidal: function(pos) {
-    return (-Math.cos(pos*Math.PI)/2) + 0.5;
-  },
-  reverse: function(pos) {
-    return 1-pos;
-  },
-  flicker: function(pos) {
-    return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
-  },
-  wobble: function(pos) {
-    return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
-  },
-  pulse: function(pos, pulses) { 
-    pulses = pulses || 5; 
-    return (
-      Math.round((pos % (1/pulses)) * pulses) == 0 ? 
-            ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) : 
-        1 - ((pos * pulses * 2) - Math.floor(pos * pulses * 2))
-      );
-  },
-  none: function(pos) {
-    return 0;
-  },
-  full: function(pos) {
-    return 1;
-  }
-};
+Effect.DefaultOptions.transition = Effect.Transitions.sinoidal;
 
 /* ------------- core effects ------------- */
 
-Effect.ScopedQueue = Class.create();
-Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
+Effect.ScopedQueue = Class.create(Enumerable, {
   initialize: function() {
     this.effects  = [];
-    this.interval = null;
+    this.interval = null;    
   },
   _each: function(iterator) {
     this.effects._each(iterator);
@@ -187,7 +178,7 @@
   add: function(effect) {
     var timestamp = new Date().getTime();
     
-    var position = (typeof effect.options.queue == 'string') ? 
+    var position = Object.isString(effect.options.queue) ? 
       effect.options.queue : effect.options.queue.position;
     
     switch(position) {
@@ -210,15 +201,15 @@
     effect.startOn  += timestamp;
     effect.finishOn += timestamp;
 
-    if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
+    if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
       this.effects.push(effect);
     
-    if(!this.interval) 
+    if (!this.interval)
       this.interval = setInterval(this.loop.bind(this), 15);
   },
   remove: function(effect) {
     this.effects = this.effects.reject(function(e) { return e==effect });
-    if(this.effects.length == 0) {
+    if (this.effects.length == 0) {
       clearInterval(this.interval);
       this.interval = null;
     }
@@ -226,103 +217,95 @@
   loop: function() {
     var timePos = new Date().getTime();
     for(var i=0, len=this.effects.length;i<len;i++) 
-      if(this.effects[i]) this.effects[i].loop(timePos);
+      this.effects[i] && this.effects[i].loop(timePos);
   }
 });
 
 Effect.Queues = {
   instances: $H(),
   get: function(queueName) {
-    if(typeof queueName != 'string') return queueName;
+    if (!Object.isString(queueName)) return queueName;
     
-    if(!this.instances[queueName])
-      this.instances[queueName] = new Effect.ScopedQueue();
-      
-    return this.instances[queueName];
+    return this.instances.get(queueName) ||
+      this.instances.set(queueName, new Effect.ScopedQueue());
   }
-}
+};
 Effect.Queue = Effect.Queues.get('global');
 
-Effect.DefaultOptions = {
-  transition: Effect.Transitions.sinoidal,
-  duration:   1.0,   // seconds
-  fps:        60.0,  // max. 60fps due to Effect.Queue implementation
-  sync:       false, // true for combining
-  from:       0.0,
-  to:         1.0,
-  delay:      0.0,
-  queue:      'parallel'
-}
-
-Effect.Base = function() {};
-Effect.Base.prototype = {
+Effect.Base = Class.create({
   position: null,
   start: function(options) {
-    this.options      = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});
+    function codeForEvent(options,eventName){
+      return (
+        (options[eventName+'Internal'] ? 'this.options.'+eventName+'Internal(this);' : '') +
+        (options[eventName] ? 'this.options.'+eventName+'(this);' : '')
+      );
+    }
+    if (options && options.transition === false) options.transition = Effect.Transitions.linear;
+    this.options      = Object.extend(Object.extend({ },Effect.DefaultOptions), options || { });
     this.currentFrame = 0;
     this.state        = 'idle';
     this.startOn      = this.options.delay*1000;
-    this.finishOn     = this.startOn + (this.options.duration*1000);
+    this.finishOn     = this.startOn+(this.options.duration*1000);
+    this.fromToDelta  = this.options.to-this.options.from;
+    this.totalTime    = this.finishOn-this.startOn;
+    this.totalFrames  = this.options.fps*this.options.duration;
+    
+    eval('this.render = function(pos){ '+
+      'if (this.state=="idle"){this.state="running";'+
+      codeForEvent(this.options,'beforeSetup')+
+      (this.setup ? 'this.setup();':'')+ 
+      codeForEvent(this.options,'afterSetup')+
+      '};if (this.state=="running"){'+
+      'pos=this.options.transition(pos)*'+this.fromToDelta+'+'+this.options.from+';'+
+      'this.position=pos;'+
+      codeForEvent(this.options,'beforeUpdate')+
+      (this.update ? 'this.update(pos);':'')+
+      codeForEvent(this.options,'afterUpdate')+
+      '}}');
+    
     this.event('beforeStart');
-    if(!this.options.sync)
-      Effect.Queues.get(typeof this.options.queue == 'string' ? 
+    if (!this.options.sync)
+      Effect.Queues.get(Object.isString(this.options.queue) ? 
         'global' : this.options.queue.scope).add(this);
   },
   loop: function(timePos) {
-    if(timePos >= this.startOn) {
-      if(timePos >= this.finishOn) {
+    if (timePos >= this.startOn) {
+      if (timePos >= this.finishOn) {
         this.render(1.0);
         this.cancel();
         this.event('beforeFinish');
-        if(this.finish) this.finish(); 
+        if (this.finish) this.finish(); 
         this.event('afterFinish');
         return;  
       }
-      var pos   = (timePos - this.startOn) / (this.finishOn - this.startOn);
-      var frame = Math.round(pos * this.options.fps * this.options.duration);
-      if(frame > this.currentFrame) {
+      var pos   = (timePos - this.startOn) / this.totalTime,
+          frame = (pos * this.totalFrames).round();
+      if (frame > this.currentFrame) {
         this.render(pos);
         this.currentFrame = frame;
       }
     }
   },
-  render: function(pos) {
-    if(this.state == 'idle') {
-      this.state = 'running';
-      this.event('beforeSetup');
-      if(this.setup) this.setup();
-      this.event('afterSetup');
-    }
-    if(this.state == 'running') {
-      if(this.options.transition) pos = this.options.transition(pos);
-      pos *= (this.options.to-this.options.from);
-      pos += this.options.from;
-      this.position = pos;
-      this.event('beforeUpdate');
-      if(this.update) this.update(pos);
-      this.event('afterUpdate');
-    }
-  },
   cancel: function() {
-    if(!this.options.sync)
-      Effect.Queues.get(typeof this.options.queue == 'string' ? 
+    if (!this.options.sync)
+      Effect.Queues.get(Object.isString(this.options.queue) ? 
         'global' : this.options.queue.scope).remove(this);
     this.state = 'finished';
   },
   event: function(eventName) {
-    if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
-    if(this.options[eventName]) this.options[eventName](this);
+    if (this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
+    if (this.options[eventName]) this.options[eventName](this);
   },
   inspect: function() {
     var data = $H();
     for(property in this)
-      if(typeof this[property] != 'function') data[property] = this[property];
+      if (!Object.isFunction(this[property])) data.set(property, this[property]);
     return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';
   }
-}
+});
 
-Effect.Parallel = Class.create();
-Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
+Effect.Parallel = Class.create(Effect.Base, {
   initialize: function(effects) {
     this.effects = effects || [];
     this.start(arguments[1]);
@@ -335,35 +318,45 @@
       effect.render(1.0);
       effect.cancel();
       effect.event('beforeFinish');
-      if(effect.finish) effect.finish(position);
+      if (effect.finish) effect.finish(position);
       effect.event('afterFinish');
     });
   }
 });
 
-Effect.Event = Class.create();
-Object.extend(Object.extend(Effect.Event.prototype, Effect.Base.prototype), {
+Effect.Tween = Class.create(Effect.Base, {
+  initialize: function(object, from, to) {
+    object = Object.isString(object) ? $(object) : object;
+    var args = $A(arguments), method = args.last(), 
+      options = args.length == 5 ? args[3] : null;
+    this.method = Object.isFunction(method) ? method.bind(object) :
+      Object.isFunction(object[method]) ? object[method].bind(object) : 
+      function(value) { object[method] = value };
+    this.start(Object.extend({ from: from, to: to }, options || { }));
+  },
+  update: function(position) {
+    this.method(position);
+  }
+});
+
+Effect.Event = Class.create(Effect.Base, {
   initialize: function() {
-    var options = Object.extend({
-      duration: 0
-    }, arguments[0] || {});
-    this.start(options);
+    this.start(Object.extend({ duration: 0 }, arguments[0] || { }));
   },
   update: Prototype.emptyFunction
 });
 
-Effect.Opacity = Class.create();
-Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
+Effect.Opacity = Class.create(Effect.Base, {
   initialize: function(element) {
     this.element = $(element);
-    if(!this.element) throw(Effect._elementDoesNotExistError);
+    if (!this.element) throw(Effect._elementDoesNotExistError);
     // make this work on IE on elements without 'layout'
-    if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))
+    if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
       this.element.setStyle({zoom: 1});
     var options = Object.extend({
       from: this.element.getOpacity() || 0.0,
       to:   1.0
-    }, arguments[1] || {});
+    }, arguments[1] || { });
     this.start(options);
   },
   update: function(position) {
@@ -371,36 +364,30 @@
   }
 });
 
-Effect.Move = Class.create();
-Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
+Effect.Move = Class.create(Effect.Base, {
   initialize: function(element) {
     this.element = $(element);
-    if(!this.element) throw(Effect._elementDoesNotExistError);
+    if (!this.element) throw(Effect._elementDoesNotExistError);
     var options = Object.extend({
       x:    0,
       y:    0,
       mode: 'relative'
-    }, arguments[1] || {});
+    }, arguments[1] || { });
     this.start(options);
   },
   setup: function() {
-    // Bug in Opera: Opera returns the "real" position of a static element or
-    // relative element that does not have top/left explicitly set.
-    // ==> Always set top and left for position relative elements in your stylesheets 
-    // (to 0 if you do not need them) 
     this.element.makePositioned();
     this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
     this.originalTop  = parseFloat(this.element.getStyle('top')  || '0');
-    if(this.options.mode == 'absolute') {
-      // absolute movement, so we need to calc deltaX and deltaY
+    if (this.options.mode == 'absolute') {
       this.options.x = this.options.x - this.originalLeft;
       this.options.y = this.options.y - this.originalTop;
     }
   },
   update: function(position) {
     this.element.setStyle({
-      left: Math.round(this.options.x  * position + this.originalLeft) + 'px',
-      top:  Math.round(this.options.y  * position + this.originalTop)  + 'px'
+      left: (this.options.x  * position + this.originalLeft).round() + 'px',
+      top:  (this.options.y  * position + this.originalTop).round()  + 'px'
     });
   }
 });
@@ -408,30 +395,29 @@
 // for backwards compatibility
 Effect.MoveBy = function(element, toTop, toLeft) {
   return new Effect.Move(element, 
-    Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));
+    Object.extend({ x: toLeft, y: toTop }, arguments[3] || { }));
 };
 
-Effect.Scale = Class.create();
-Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
+Effect.Scale = Class.create(Effect.Base, {
   initialize: function(element, percent) {
     this.element = $(element);
-    if(!this.element) throw(Effect._elementDoesNotExistError);
+    if (!this.element) throw(Effect._elementDoesNotExistError);
     var options = Object.extend({
       scaleX: true,
       scaleY: true,
       scaleContent: true,
       scaleFromCenter: false,
-      scaleMode: 'box',        // 'box' or 'contents' or {} with provided values
+      scaleMode: 'box',        // 'box' or 'contents' or { } with provided values
       scaleFrom: 100.0,
       scaleTo:   percent
-    }, arguments[2] || {});
+    }, arguments[2] || { });
     this.start(options);
   },
   setup: function() {
     this.restoreAfterFinish = this.options.restoreAfterFinish || false;
     this.elementPositioning = this.element.getStyle('position');
     
-    this.originalStyle = {};
+    this.originalStyle = { };
     ['top','left','width','height','fontSize'].each( function(k) {
       this.originalStyle[k] = this.element.style[k];
     }.bind(this));
@@ -441,7 +427,7 @@
     
     var fontSize = this.element.getStyle('font-size') || '100%';
     ['em','px','%','pt'].each( function(fontSizeType) {
-      if(fontSize.indexOf(fontSizeType)>0) {
+      if (fontSize.indexOf(fontSizeType)>0) {
         this.fontSize     = parseFloat(fontSize);
         this.fontSizeType = fontSizeType;
       }
@@ -450,62 +436,61 @@
     this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
     
     this.dims = null;
-    if(this.options.scaleMode=='box')
+    if (this.options.scaleMode=='box')
       this.dims = [this.element.offsetHeight, this.element.offsetWidth];
-    if(/^content/.test(this.options.scaleMode))
+    if (/^content/.test(this.options.scaleMode))
       this.dims = [this.element.scrollHeight, this.element.scrollWidth];
-    if(!this.dims)
+    if (!this.dims)
       this.dims = [this.options.scaleMode.originalHeight,
                    this.options.scaleMode.originalWidth];
   },
   update: function(position) {
     var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
-    if(this.options.scaleContent && this.fontSize)
+    if (this.options.scaleContent && this.fontSize)
       this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
     this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
   },
   finish: function(position) {
-    if(this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
+    if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
   },
   setDimensions: function(height, width) {
-    var d = {};
-    if(this.options.scaleX) d.width = Math.round(width) + 'px';
-    if(this.options.scaleY) d.height = Math.round(height) + 'px';
-    if(this.options.scaleFromCenter) {
+    var d = { };
+    if (this.options.scaleX) d.width = width.round() + 'px';
+    if (this.options.scaleY) d.height = height.round() + 'px';
+    if (this.options.scaleFromCenter) {
       var topd  = (height - this.dims[0])/2;
       var leftd = (width  - this.dims[1])/2;
-      if(this.elementPositioning == 'absolute') {
-        if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
-        if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
+      if (this.elementPositioning == 'absolute') {
+        if (this.options.scaleY) d.top = this.originalTop-topd + 'px';
+        if (this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
       } else {
-        if(this.options.scaleY) d.top = -topd + 'px';
-        if(this.options.scaleX) d.left = -leftd + 'px';
+        if (this.options.scaleY) d.top = -topd + 'px';
+        if (this.options.scaleX) d.left = -leftd + 'px';
       }
     }
     this.element.setStyle(d);
   }
 });
 
-Effect.Highlight = Class.create();
-Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
+Effect.Highlight = Class.create(Effect.Base, {
   initialize: function(element) {
     this.element = $(element);
-    if(!this.element) throw(Effect._elementDoesNotExistError);
-    var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
+    if (!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || { });
     this.start(options);
   },
   setup: function() {
     // Prevent executing on elements not in the layout flow
-    if(this.element.getStyle('display')=='none') { this.cancel(); return; }
+    if (this.element.getStyle('display')=='none') { this.cancel(); return; }
     // Disable background image during the effect
-    this.oldStyle = {};
+    this.oldStyle = { };
     if (!this.options.keepBackgroundImage) {
       this.oldStyle.backgroundImage = this.element.getStyle('background-image');
       this.element.setStyle({backgroundImage: 'none'});
     }
-    if(!this.options.endcolor)
+    if (!this.options.endcolor)
       this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
-    if(!this.options.restorecolor)
+    if (!this.options.restorecolor)
       this.options.restorecolor = this.element.getStyle('background-color');
     // init color calculations
     this._base  = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
@@ -513,7 +498,7 @@
   },
   update: function(position) {
     this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
-      return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });
+      return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart()); }.bind(this)) });
   },
   finish: function() {
     this.element.setStyle(Object.extend(this.oldStyle, {
@@ -522,30 +507,21 @@
   }
 });
 
-Effect.ScrollTo = Class.create();
-Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
-  initialize: function(element) {
-    this.element = $(element);
-    this.start(arguments[1] || {});
-  },
-  setup: function() {
-    Position.prepare();
-    var offsets = Position.cumulativeOffset(this.element);
-    if(this.options.offset) offsets[1] += this.options.offset;
-    var max = window.innerHeight ? 
-      window.height - window.innerHeight :
-      document.body.scrollHeight - 
-        (document.documentElement.clientHeight ? 
-          document.documentElement.clientHeight : document.body.clientHeight);
-    this.scrollStart = Position.deltaY;
-    this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
-  },
-  update: function(position) {
-    Position.prepare();
-    window.scrollTo(Position.deltaX, 
-      this.scrollStart + (position*this.delta));
-  }
-});
+Effect.ScrollTo = function(element) {
+  var options = arguments[1] || { },
+    scrollOffsets = document.viewport.getScrollOffsets(),
+    elementOffsets = $(element).cumulativeOffset(),
+    max = (window.height || document.body.scrollHeight) - document.viewport.getHeight();  
+
+  if (options.offset) elementOffsets[1] += options.offset;
+
+  return new Effect.Tween(null,
+    scrollOffsets.top,
+    elementOffsets[1] > max ? max : elementOffsets[1],
+    options,
+    function(p){ scrollTo(scrollOffsets.left, p.round()) }
+  );
+};
 
 /* ------------- combination effects ------------- */
 
@@ -553,14 +529,15 @@
   element = $(element);
   var oldOpacity = element.getInlineOpacity();
   var options = Object.extend({
-  from: element.getOpacity() || 1.0,
-  to:   0.0,
-  afterFinishInternal: function(effect) { 
-    if(effect.options.to!=0) return;
-    effect.element.hide().setStyle({opacity: oldOpacity}); 
-  }}, arguments[1] || {});
+    from: element.getOpacity() || 1.0,
+    to:   0.0,
+    afterFinishInternal: function(effect) { 
+      if (effect.options.to!=0) return;
+      effect.element.hide().setStyle({opacity: oldOpacity}); 
+    }
+  }, arguments[1] || { });
   return new Effect.Opacity(element,options);
-}
+};
 
 Effect.Appear = function(element) {
   element = $(element);
@@ -573,9 +550,9 @@
   },
   beforeSetup: function(effect) {
     effect.element.setOpacity(effect.options.from).show(); 
-  }}, arguments[1] || {});
+  }}, arguments[1] || { });
   return new Effect.Opacity(element,options);
-}
+};
 
 Effect.Puff = function(element) {
   element = $(element);
@@ -597,9 +574,9 @@
       },
       afterFinishInternal: function(effect) {
          effect.effects[0].element.hide().setStyle(oldStyle); }
-     }, arguments[1] || {})
+     }, arguments[1] || { })
    );
-}
+};
 
 Effect.BlindUp = function(element) {
   element = $(element);
@@ -611,9 +588,9 @@
       afterFinishInternal: function(effect) {
         effect.element.hide().undoClipping();
       } 
-    }, arguments[1] || {})
+    }, arguments[1] || { })
   );
-}
+};
 
 Effect.BlindDown = function(element) {
   element = $(element);
@@ -630,8 +607,8 @@
     afterFinishInternal: function(effect) {
       effect.element.undoClipping();
     }
-  }, arguments[1] || {}));
-}
+  }, arguments[1] || { }));
+};
 
 Effect.SwitchOff = function(element) {
   element = $(element);
@@ -652,8 +629,8 @@
         }
       })
     }
-  }, arguments[1] || {}));
-}
+  }, arguments[1] || { }));
+};
 
 Effect.DropOut = function(element) {
   element = $(element);
@@ -672,29 +649,35 @@
         afterFinishInternal: function(effect) {
           effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
         } 
-      }, arguments[1] || {}));
-}
+      }, arguments[1] || { }));
+};
 
 Effect.Shake = function(element) {
   element = $(element);
+  var options = Object.extend({
+    distance: 20,
+    duration: 0.5
+  }, arguments[1] || {});
+  var distance = parseFloat(options.distance);
+  var split = parseFloat(options.duration) / 10.0;
   var oldStyle = {
     top: element.getStyle('top'),
     left: element.getStyle('left') };
-    return new Effect.Move(element, 
-      { x:  20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
+    return new Effect.Move(element,
+      { x:  distance, y: 0, duration: split, afterFinishInternal: function(effect) {
     new Effect.Move(effect.element,
-      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+      { x: -distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
     new Effect.Move(effect.element,
-      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+      { x:  distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
     new Effect.Move(effect.element,
-      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+      { x: -distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
     new Effect.Move(effect.element,
-      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+      { x:  distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
     new Effect.Move(effect.element,
-      { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
+      { x: -distance, y: 0, duration: split, afterFinishInternal: function(effect) {
         effect.element.undoPositioned().setStyle(oldStyle);
   }}) }}) }}) }}) }}) }});
-}
+};
 
 Effect.SlideDown = function(element) {
   element = $(element).cleanWhitespace();
@@ -710,7 +693,7 @@
     afterSetup: function(effect) {
       effect.element.makePositioned();
       effect.element.down().makePositioned();
-      if(window.opera) effect.element.setStyle({top: ''});
+      if (window.opera) effect.element.setStyle({top: ''});
       effect.element.makeClipping().setStyle({height: '0px'}).show(); 
     },
     afterUpdateInternal: function(effect) {
@@ -720,23 +703,25 @@
     afterFinishInternal: function(effect) {
       effect.element.undoClipping().undoPositioned();
       effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }
-    }, arguments[1] || {})
+    }, arguments[1] || { })
   );
-}
+};
 
 Effect.SlideUp = function(element) {
   element = $(element).cleanWhitespace();
   var oldInnerBottom = element.down().getStyle('bottom');
+  var elementDimensions = element.getDimensions();
   return new Effect.Scale(element, window.opera ? 0 : 1,
    Object.extend({ scaleContent: false, 
     scaleX: false, 
     scaleMode: 'box',
     scaleFrom: 100,
+    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
     restoreAfterFinish: true,
-    beforeStartInternal: function(effect) {
+    afterSetup: function(effect) {
       effect.element.makePositioned();
       effect.element.down().makePositioned();
-      if(window.opera) effect.element.setStyle({top: ''});
+      if (window.opera) effect.element.setStyle({top: ''});
       effect.element.makeClipping().show();
     },  
     afterUpdateInternal: function(effect) {
@@ -744,12 +729,12 @@
         (effect.dims[0] - effect.element.clientHeight) + 'px' });
     },
     afterFinishInternal: function(effect) {
-      effect.element.hide().undoClipping().undoPositioned().setStyle({bottom: oldInnerBottom});
-      effect.element.down().undoPositioned();
+      effect.element.hide().undoClipping().undoPositioned();
+      effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom});
     }
-   }, arguments[1] || {})
+   }, arguments[1] || { })
   );
-}
+};
 
 // Bug in opera makes the TD containing this element expand for a instance after finish 
 Effect.Squish = function(element) {
@@ -762,7 +747,7 @@
       effect.element.hide().undoClipping(); 
     }
   });
-}
+};
 
 Effect.Grow = function(element) {
   element = $(element);
@@ -771,7 +756,7 @@
     moveTransition: Effect.Transitions.sinoidal,
     scaleTransition: Effect.Transitions.sinoidal,
     opacityTransition: Effect.Transitions.full
-  }, arguments[1] || {});
+  }, arguments[1] || { });
   var oldStyle = {
     top: element.style.top,
     left: element.style.left,
@@ -836,7 +821,7 @@
       )
     }
   });
-}
+};
 
 Effect.Shrink = function(element) {
   element = $(element);
@@ -845,7 +830,7 @@
     moveTransition: Effect.Transitions.sinoidal,
     scaleTransition: Effect.Transitions.sinoidal,
     opacityTransition: Effect.Transitions.none
-  }, arguments[1] || {});
+  }, arguments[1] || { });
   var oldStyle = {
     top: element.style.top,
     left: element.style.left,
@@ -890,11 +875,11 @@
            effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
        }, options)
   );
-}
+};
 
 Effect.Pulsate = function(element) {
   element = $(element);
-  var options    = arguments[1] || {};
+  var options    = arguments[1] || { };
   var oldOpacity = element.getInlineOpacity();
   var transition = options.transition || Effect.Transitions.sinoidal;
   var reverser   = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) };
@@ -903,7 +888,7 @@
     Object.extend(Object.extend({  duration: 2.0, from: 0,
       afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
     }, options), {transition: reverser}));
-}
+};
 
 Effect.Fold = function(element) {
   element = $(element);
@@ -923,72 +908,71 @@
       afterFinishInternal: function(effect) {
         effect.element.hide().undoClipping().setStyle(oldStyle);
       } });
-  }}, arguments[1] || {}));
+  }}, arguments[1] || { }));
 };
 
-Effect.Morph = Class.create();
-Object.extend(Object.extend(Effect.Morph.prototype, Effect.Base.prototype), {
+Effect.Morph = Class.create(Effect.Base, {
   initialize: function(element) {
     this.element = $(element);
-    if(!this.element) throw(Effect._elementDoesNotExistError);
+    if (!this.element) throw(Effect._elementDoesNotExistError);
     var options = Object.extend({
-      style: {}
-    }, arguments[1] || {});
-    if (typeof options.style == 'string') {
-      if(options.style.indexOf(':') == -1) {
-        var cssText = '', selector = '.' + options.style;
-        $A(document.styleSheets).reverse().each(function(styleSheet) {
-          if (styleSheet.cssRules) cssRules = styleSheet.cssRules;
-          else if (styleSheet.rules) cssRules = styleSheet.rules;
-          $A(cssRules).reverse().each(function(rule) {
-            if (selector == rule.selectorText) {
-              cssText = rule.style.cssText;
-              throw $break;
-            }
-          });
-          if (cssText) throw $break;
+      style: { }
+    }, arguments[1] || { });
+    
+    if (!Object.isString(options.style)) this.style = $H(options.style);
+    else {
+      if (options.style.include(':'))
+        this.style = options.style.parseStyle();
+      else {
+        this.element.addClassName(options.style);
+        this.style = $H(this.element.getStyles());
+        this.element.removeClassName(options.style);
+        var css = this.element.getStyles();
+        this.style = this.style.reject(function(style) {
+          return style.value == css[style.key];
         });
-        this.style = cssText.parseStyle();
-        options.afterFinishInternal = function(effect){
+        options.afterFinishInternal = function(effect) {
           effect.element.addClassName(effect.options.style);
           effect.transforms.each(function(transform) {
-            if(transform.style != 'opacity')
-              effect.element.style[transform.style.camelize()] = '';
+            effect.element.style[transform.style] = '';
           });
         }
-      } else this.style = options.style.parseStyle();
-    } else this.style = $H(options.style)
+      }
+    }
     this.start(options);
   },
+  
   setup: function(){
     function parseColor(color){
-      if(!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
+      if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
       color = color.parseColor();
       return $R(0,2).map(function(i){
         return parseInt( color.slice(i*2+1,i*2+3), 16 ) 
       });
     }
     this.transforms = this.style.map(function(pair){
-      var property = pair[0].underscore().dasherize(), value = pair[1], unit = null;
+      var property = pair[0], value = pair[1], unit = null;
 
-      if(value.parseColor('#zzzzzz') != '#zzzzzz') {
+      if (value.parseColor('#zzzzzz') != '#zzzzzz') {
         value = value.parseColor();
         unit  = 'color';
-      } else if(property == 'opacity') {
+      } else if (property == 'opacity') {
         value = parseFloat(value);
-        if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))
+        if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
           this.element.setStyle({zoom: 1});
-      } else if(Element.CSS_LENGTH.test(value)) 
-        var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/),
-          value = parseFloat(components[1]), unit = (components.length == 3) ? components[2] : null;
+      } else if (Element.CSS_LENGTH.test(value)) {
+          var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/);
+          value = parseFloat(components[1]);
+          unit = (components.length == 3) ? components[2] : null;
+      }
 
       var originalValue = this.element.getStyle(property);
-      return $H({ 
-        style: property, 
+      return { 
+        style: property.camelize(), 
         originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), 
         targetValue: unit=='color' ? parseColor(value) : value,
         unit: unit
-      });
+      };
     }.bind(this)).reject(function(transform){
       return (
         (transform.originalValue == transform.targetValue) ||
@@ -1000,32 +984,35 @@
     });
   },
   update: function(position) {
-    var style = $H(), value = null;
-    this.transforms.each(function(transform){
-      value = transform.unit=='color' ?
-        $R(0,2).inject('#',function(m,v,i){
-          return m+(Math.round(transform.originalValue[i]+
-            (transform.targetValue[i] - transform.originalValue[i])*position)).toColorPart() }) : 
-        transform.originalValue + Math.round(
-          ((transform.targetValue - transform.originalValue) * position) * 1000)/1000 + transform.unit;
-      style[transform.style] = value;
-    });
-    this.element.setStyle(style);
+    var style = { }, transform, i = this.transforms.length;
+    while(i--)
+      style[(transform = this.transforms[i]).style] = 
+        transform.unit=='color' ? '#'+
+          (Math.round(transform.originalValue[0]+
+            (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() +
+          (Math.round(transform.originalValue[1]+
+            (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() +
+          (Math.round(transform.originalValue[2]+
+            (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() :
+        (transform.originalValue +
+          (transform.targetValue - transform.originalValue) * position).toFixed(3) + 
+            (transform.unit === null ? '' : transform.unit);
+    this.element.setStyle(style, true);
   }
 });
 
-Effect.Transform = Class.create();
-Object.extend(Effect.Transform.prototype, {
+Effect.Transform = Class.create({
   initialize: function(tracks){
     this.tracks  = [];
-    this.options = arguments[1] || {};
+    this.options = arguments[1] || { };
     this.addTracks(tracks);
   },
   addTracks: function(tracks){
     tracks.each(function(track){
-      var data = $H(track).values().first();
+      track = $H(track);
+      var data = track.values().first();
       this.tracks.push($H({
-        ids:     $H(track).keys().first(),
+        ids:     track.keys().first(),
         effect:  Effect.Morph,
         options: { style: data }
       }));
@@ -1035,8 +1022,9 @@
   play: function(){
     return new Effect.Parallel(
       this.tracks.map(function(track){
-        var elements = [$(track.ids) || $$(track.ids)].flatten();
-        return elements.map(function(e){ return new track.effect(e, Object.extend({ sync:true }, track.options)) });
+        var ids = track.get('ids'), effect = track.get('effect'), options = track.get('options');
+        var elements = [$(ids) || $$(ids)].flatten();
+        return elements.map(function(e){ return new effect(e, Object.extend({ sync:true }, options)) });
       }).flatten(),
       this.options
     );
@@ -1056,35 +1044,79 @@
   
 Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;
 
+String.__parseStyleElement = document.createElement('div');
 String.prototype.parseStyle = function(){
-  var element = Element.extend(document.createElement('div'));
-  element.innerHTML = '<div style="' + this + '"></div>';
-  var style = element.down().style, styleRules = $H();
+  var style, styleRules = $H();
+  if (Prototype.Browser.WebKit)
+    style = new Element('div',{style:this}).style;
+  else {
+    String.__parseStyleElement.innerHTML = '<div style="' + this + '"></div>';
+    style = String.__parseStyleElement.childNodes[0].style;
+  }
   
   Element.CSS_PROPERTIES.each(function(property){
-    if(style[property]) styleRules[property] = style[property]; 
+    if (style[property]) styleRules.set(property, style[property]); 
   });
-  if(/MSIE/.test(navigator.userAgent) && !window.opera && this.indexOf('opacity') > -1) {
-    styleRules.opacity = this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1];
-  }
+  
+  if (Prototype.Browser.IE && this.include('opacity'))
+    styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]);
+
   return styleRules;
 };
 
-Element.morph = function(element, style) {
-  new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || {}));
-  return element;
+if (document.defaultView && document.defaultView.getComputedStyle) {
+  Element.getStyles = function(element) {
+    var css = document.defaultView.getComputedStyle($(element), null);
+    return Element.CSS_PROPERTIES.inject({ }, function(styles, property) {
+      styles[property] = css[property];
+      return styles;
+    });
+  };
+} else {
+  Element.getStyles = function(element) {
+    element = $(element);
+    var css = element.currentStyle, styles;
+    styles = Element.CSS_PROPERTIES.inject({ }, function(hash, property) {
+      hash.set(property, css[property]);
+      return hash;
+    });
+    if (!styles.opacity) styles.set('opacity', element.getOpacity());
+    return styles;
+  };
 };
 
-['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom',
- 'collectTextNodes','collectTextNodesIgnoreClass','morph'].each( 
-  function(f) { Element.Methods[f] = Element[f]; }
+Effect.Methods = {
+  morph: function(element, style) {
+    element = $(element);
+    new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || { }));
+    return element;
+  },
+  visualEffect: function(element, effect, options) {
+    element = $(element)
+    var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1);
+    new Effect[klass](element, options);
+    return element;
+  },
+  highlight: function(element, options) {
+    element = $(element);
+    new Effect.Highlight(element, options);
+    return element;
+  }
+};
+
+$w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+
+  'pulsate shake puff squish switchOff dropOut').each(
+  function(effect) { 
+    Effect.Methods[effect] = function(element, options){
+      element = $(element);
+      Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options);
+      return element;
+    }
+  }
 );
 
-Element.Methods.visualEffect = function(element, effect, options) {
-  s = effect.gsub(/_/, '-').camelize();
-  effect_class = s.charAt(0).toUpperCase() + s.substring(1);
-  new Effect[effect_class](element, options);
-  return $(element);
-};
+$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each( 
+  function(f) { Effect.Methods[f] = Element[f]; }
+);
 
-Element.addMethods();
\ No newline at end of file
+Element.addMethods(Effect.Methods);
diff -x .svn -aruN 2.2.2.src/wp-includes/js/scriptaculous/prototype.js 2.5.src/wp-includes/js/scriptaculous/prototype.js
--- 2.2.2.src/wp-includes/js/scriptaculous/prototype.js	2007-01-25 21:41:17.000000000 -0600
+++ 2.5.src/wp-includes/js/scriptaculous/prototype.js	2008-03-02 15:34:25.000000000 -0600
@@ -1,38 +1,111 @@
-/*  Prototype JavaScript framework, version 1.5.0
+/*  Prototype JavaScript framework, version 1.6.0
  *  (c) 2005-2007 Sam Stephenson
  *
  *  Prototype is freely distributable under the terms of an MIT-style license.
- *  For details, see the Prototype web site: http://prototype.conio.net/
+ *  For details, see the Prototype web site: http://www.prototypejs.org/
  *
-/*--------------------------------------------------------------------------*/
+ *--------------------------------------------------------------------------*/
 
 var Prototype = {
-  Version: '1.5.0',
+  Version: '1.6.0',
+
+  Browser: {
+    IE:     !!(window.attachEvent && !window.opera),
+    Opera:  !!window.opera,
+    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
+    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1,
+    MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
+  },
+
   BrowserFeatures: {
-    XPath: !!document.evaluate
+    XPath: !!document.evaluate,
+    ElementExtensions: !!window.HTMLElement,
+    SpecificElementExtensions:
+      document.createElement('div').__proto__ &&
+      document.createElement('div').__proto__ !==
+        document.createElement('form').__proto__
   },
 
-  ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',
-  emptyFunction: function() {},
+  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
+  JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,
+
+  emptyFunction: function() { },
   K: function(x) { return x }
-}
+};
+
+if (Prototype.Browser.MobileSafari)
+  Prototype.BrowserFeatures.SpecificElementExtensions = false;
 
+if (Prototype.Browser.WebKit)
+  Prototype.BrowserFeatures.XPath = false;
+
+/* Based on Alex Arnell's inheritance implementation. */
 var Class = {
   create: function() {
-    return function() {
+    var parent = null, properties = $A(arguments);
+    if (Object.isFunction(properties[0]))
+      parent = properties.shift();
+
+    function klass() {
       this.initialize.apply(this, arguments);
     }
+
+    Object.extend(klass, Class.Methods);
+    klass.superclass = parent;
+    klass.subclasses = [];
+
+    if (parent) {
+      var subclass = function() { };
+      subclass.prototype = parent.prototype;
+      klass.prototype = new subclass;
+      parent.subclasses.push(klass);
+    }
+
+    for (var i = 0; i < properties.length; i++)
+      klass.addMethods(properties[i]);
+
+    if (!klass.prototype.initialize)
+      klass.prototype.initialize = Prototype.emptyFunction;
+
+    klass.prototype.constructor = klass;
+
+    return klass;
+  }
+};
+
+Class.Methods = {
+  addMethods: function(source) {
+    var ancestor   = this.superclass && this.superclass.prototype;
+    var properties = Object.keys(source);
+
+    if (!Object.keys({ toString: true }).length)
+      properties.push("toString", "valueOf");
+
+    for (var i = 0, length = properties.length; i < length; i++) {
+      var property = properties[i], value = source[property];
+      if (ancestor && Object.isFunction(value) &&
+          value.argumentNames().first() == "$super") {
+        var method = value, value = Object.extend((function(m) {
+          return function() { return ancestor[m].apply(this, arguments) };
+        })(property).wrap(method), {
+          valueOf:  function() { return method },
+          toString: function() { return method.toString() }
+        });
+      }
+      this.prototype[property] = value;
+    }
+
+    return this;
   }
-}
+};
 
-var Abstract = new Object();
+var Abstract = { };
 
 Object.extend = function(destination, source) {
-  for (var property in source) {
+  for (var property in source)
     destination[property] = source[property];
-  }
   return destination;
-}
+};
 
 Object.extend(Object, {
   inspect: function(object) {
@@ -46,6 +119,37 @@
     }
   },
 
+  toJSON: function(object) {
+    var type = typeof object;
+    switch (type) {
+      case 'undefined':
+      case 'function':
+      case 'unknown': return;
+      case 'boolean': return object.toString();
+    }
+
+    if (object === null) return 'null';
+    if (object.toJSON) return object.toJSON();
+    if (Object.isElement(object)) return;
+
+    var results = [];
+    for (var property in object) {
+      var value = Object.toJSON(object[property]);
+      if (value !== undefined)
+        results.push(property.toJSON() + ': ' + value);
+    }
+
+    return '{' + results.join(', ') + '}';
+  },
+
+  toQueryString: function(object) {
+    return $H(object).toQueryString();
+  },
+
+  toHTML: function(object) {
+    return object && object.toHTML ? object.toHTML() : String.interpret(object);
+  },
+
   keys: function(object) {
     var keys = [];
     for (var property in object)
@@ -61,41 +165,101 @@
   },
 
   clone: function(object) {
-    return Object.extend({}, object);
+    return Object.extend({ }, object);
+  },
+
+  isElement: function(object) {
+    return object && object.nodeType == 1;
+  },
+
+  isArray: function(object) {
+    return object && object.constructor === Array;
+  },
+
+  isHash: function(object) {
+    return object instanceof Hash;
+  },
+
+  isFunction: function(object) {
+    return typeof object == "function";
+  },
+
+  isString: function(object) {
+    return typeof object == "string";
+  },
+
+  isNumber: function(object) {
+    return typeof object == "number";
+  },
+
+  isUndefined: function(object) {
+    return typeof object == "undefined";
   }
 });
 
-Function.prototype.bind = function() {
-  var __method = this, args = $A(arguments), object = args.shift();
-  return function() {
-    return __method.apply(object, args.concat($A(arguments)));
-  }
-}
+Object.extend(Function.prototype, {
+  argumentNames: function() {
+    var names = this.toString().match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",").invoke("strip");
+    return names.length == 1 && !names[0] ? [] : names;
+  },
 
-Function.prototype.bindAsEventListener = function(object) {
-  var __method = this, args = $A(arguments), object = args.shift();
-  return function(event) {
-    return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments)));
-  }
-}
+  bind: function() {
+    if (arguments.length < 2 && arguments[0] === undefined) return this;
+    var __method = this, args = $A(arguments), object = args.shift();
+    return function() {
+      return __method.apply(object, args.concat($A(arguments)));
+    }
+  },
 
-Object.extend(Number.prototype, {
-  toColorPart: function() {
-    var digits = this.toString(16);
-    if (this < 16) return '0' + digits;
-    return digits;
+  bindAsEventListener: function() {
+    var __method = this, args = $A(arguments), object = args.shift();
+    return function(event) {
+      return __method.apply(object, [event || window.event].concat(args));
+    }
   },
 
-  succ: function() {
-    return this + 1;
+  curry: function() {
+    if (!arguments.length) return this;
+    var __method = this, args = $A(arguments);
+    return function() {
+      return __method.apply(this, args.concat($A(arguments)));
+    }
   },
 
-  times: function(iterator) {
-    $R(0, this, true).each(iterator);
-    return this;
+  delay: function() {
+    var __method = this, args = $A(arguments), timeout = args.shift() * 1000;
+    return window.setTimeout(function() {
+      return __method.apply(__method, args);
+    }, timeout);
+  },
+
+  wrap: function(wrapper) {
+    var __method = this;
+    return function() {
+      return wrapper.apply(this, [__method.bind(this)].concat($A(arguments)));
+    }
+  },
+
+  methodize: function() {
+    if (this._methodized) return this._methodized;
+    var __method = this;
+    return this._methodized = function() {
+      return __method.apply(null, [this].concat($A(arguments)));
+    };
   }
 });
 
+Function.prototype.defer = Function.prototype.delay.curry(0.01);
+
+Date.prototype.toJSON = function() {
+  return '"' + this.getUTCFullYear() + '-' +
+    (this.getUTCMonth() + 1).toPaddedString(2) + '-' +
+    this.getUTCDate().toPaddedString(2) + 'T' +
+    this.getUTCHours().toPaddedString(2) + ':' +
+    this.getUTCMinutes().toPaddedString(2) + ':' +
+    this.getUTCSeconds().toPaddedString(2) + 'Z"';
+};
+
 var Try = {
   these: function() {
     var returnValue;
@@ -105,17 +269,22 @@
       try {
         returnValue = lambda();
         break;
-      } catch (e) {}
+      } catch (e) { }
     }
 
     return returnValue;
   }
-}
+};
+
+RegExp.prototype.match = RegExp.prototype.test;
+
+RegExp.escape = function(str) {
+  return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
+};
 
 /*--------------------------------------------------------------------------*/
 
-var PeriodicalExecuter = Class.create();
-PeriodicalExecuter.prototype = {
+var PeriodicalExecuter = Class.create({
   initialize: function(callback, frequency) {
     this.callback = callback;
     this.frequency = frequency;
@@ -128,6 +297,10 @@
     this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
   },
 
+  execute: function() {
+    this.callback(this);
+  },
+
   stop: function() {
     if (!this.timer) return;
     clearInterval(this.timer);
@@ -138,16 +311,26 @@
     if (!this.currentlyExecuting) {
       try {
         this.currentlyExecuting = true;
-        this.callback(this);
+        this.execute();
       } finally {
         this.currentlyExecuting = false;
       }
     }
   }
-}
-String.interpret = function(value){
-  return value == null ? '' : String(value);
-}
+});
+Object.extend(String, {
+  interpret: function(value) {
+    return value == null ? '' : String(value);
+  },
+  specialChar: {
+    '\b': '\\b',
+    '\t': '\\t',
+    '\n': '\\n',
+    '\f': '\\f',
+    '\r': '\\r',
+    '\\': '\\\\'
+  }
+});
 
 Object.extend(String.prototype, {
   gsub: function(pattern, replacement) {
@@ -178,14 +361,14 @@
 
   scan: function(pattern, iterator) {
     this.gsub(pattern, iterator);
-    return this;
+    return String(this);
   },
 
   truncate: function(length, truncation) {
     length = length || 30;
     truncation = truncation === undefined ? '...' : truncation;
     return this.length > length ?
-      this.slice(0, length - truncation.length) + truncation : this;
+      this.slice(0, length - truncation.length) + truncation : String(this);
   },
 
   strip: function() {
@@ -213,35 +396,34 @@
   },
 
   escapeHTML: function() {
-    var div = document.createElement('div');
-    var text = document.createTextNode(this);
-    div.appendChild(text);
-    return div.innerHTML;
+    var self = arguments.callee;
+    self.text.data = this;
+    return self.div.innerHTML;
   },
 
   unescapeHTML: function() {
-    var div = document.createElement('div');
+    var div = new Element('div');
     div.innerHTML = this.stripTags();
     return div.childNodes[0] ? (div.childNodes.length > 1 ?
-      $A(div.childNodes).inject('',function(memo,node){ return memo+node.nodeValue }) :
+      $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) :
       div.childNodes[0].nodeValue) : '';
   },
 
   toQueryParams: function(separator) {
     var match = this.strip().match(/([^?#]*)(#.*)?$/);
-    if (!match) return {};
+    if (!match) return { };
 
-    return match[1].split(separator || '&').inject({}, function(hash, pair) {
+    return match[1].split(separator || '&').inject({ }, function(hash, pair) {
       if ((pair = pair.split('='))[0]) {
-        var name = decodeURIComponent(pair[0]);
-        var value = pair[1] ? decodeURIComponent(pair[1]) : undefined;
-
-        if (hash[name] !== undefined) {
-          if (hash[name].constructor != Array)
-            hash[name] = [hash[name]];
-          if (value) hash[name].push(value);
+        var key = decodeURIComponent(pair.shift());
+        var value = pair.length > 1 ? pair.join('=') : pair[0];
+        if (value != undefined) value = decodeURIComponent(value);
+
+        if (key in hash) {
+          if (!Object.isArray(hash[key])) hash[key] = [hash[key]];
+          hash[key].push(value);
         }
-        else hash[name] = value;
+        else hash[key] = value;
       }
       return hash;
     });
@@ -256,6 +438,10 @@
       String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
   },
 
+  times: function(count) {
+    return count < 1 ? '' : new Array(count + 1).join(this);
+  },
+
   camelize: function() {
     var parts = this.split('-'), len = parts.length;
     if (len == 1) return parts[0];
@@ -270,7 +456,7 @@
     return camelized;
   },
 
-  capitalize: function(){
+  capitalize: function() {
     return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
   },
 
@@ -283,52 +469,128 @@
   },
 
   inspect: function(useDoubleQuotes) {
-    var escapedString = this.replace(/\\/g, '\\\\');
-    if (useDoubleQuotes)
-      return '"' + escapedString.replace(/"/g, '\\"') + '"';
-    else
-      return "'" + escapedString.replace(/'/g, '\\\'') + "'";
+    var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) {
+      var character = String.specialChar[match[0]];
+      return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16);
+    });
+    if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
+    return "'" + escapedString.replace(/'/g, '\\\'') + "'";
+  },
+
+  toJSON: function() {
+    return this.inspect(true);
+  },
+
+  unfilterJSON: function(filter) {
+    return this.sub(filter || Prototype.JSONFilter, '#{1}');
+  },
+
+  isJSON: function() {
+    var str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
+    return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
+  },
+
+  evalJSON: function(sanitize) {
+    var json = this.unfilterJSON();
+    try {
+      if (!sanitize || json.isJSON()) return eval('(' + json + ')');
+    } catch (e) { }
+    throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
+  },
+
+  include: function(pattern) {
+    return this.indexOf(pattern) > -1;
+  },
+
+  startsWith: function(pattern) {
+    return this.indexOf(pattern) === 0;
+  },
+
+  endsWith: function(pattern) {
+    var d = this.length - pattern.length;
+    return d >= 0 && this.lastIndexOf(pattern) === d;
+  },
+
+  empty: function() {
+    return this == '';
+  },
+
+  blank: function() {
+    return /^\s*$/.test(this);
+  },
+
+  interpolate: function(object, pattern) {
+    return new Template(this, pattern).evaluate(object);
+  }
+});
+
+if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, {
+  escapeHTML: function() {
+    return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
+  },
+  unescapeHTML: function() {
+    return this.replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>');
   }
 });
 
 String.prototype.gsub.prepareReplacement = function(replacement) {
-  if (typeof replacement == 'function') return replacement;
+  if (Object.isFunction(replacement)) return replacement;
   var template = new Template(replacement);
   return function(match) { return template.evaluate(match) };
-}
+};
 
 String.prototype.parseQuery = String.prototype.toQueryParams;
 
-var Template = Class.create();
-Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
-Template.prototype = {
+Object.extend(String.prototype.escapeHTML, {
+  div:  document.createElement('div'),
+  text: document.createTextNode('')
+});
+
+with (String.prototype.escapeHTML) div.appendChild(text);
+
+var Template = Class.create({
   initialize: function(template, pattern) {
     this.template = template.toString();
-    this.pattern  = pattern || Template.Pattern;
+    this.pattern = pattern || Template.Pattern;
   },
 
   evaluate: function(object) {
+    if (Object.isFunction(object.toTemplateReplacements))
+      object = object.toTemplateReplacements();
+
     return this.template.gsub(this.pattern, function(match) {
-      var before = match[1];
+      if (object == null) return '';
+
+      var before = match[1] || '';
       if (before == '\\') return match[2];
-      return before + String.interpret(object[match[3]]);
-    });
+
+      var ctx = object, expr = match[3];
+      var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/, match = pattern.exec(expr);
+      if (match == null) return before;
+
+      while (match != null) {
+        var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1];
+        ctx = ctx[comp];
+        if (null == ctx || '' == match[3]) break;
+        expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
+        match = pattern.exec(expr);
+      }
+
+      return before + String.interpret(ctx);
+    }.bind(this));
   }
-}
+});
+Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
 
-var $break    = new Object();
-var $continue = new Object();
+var $break = { };
 
 var Enumerable = {
-  each: function(iterator) {
+  each: function(iterator, context) {
     var index = 0;
+    iterator = iterator.bind(context);
     try {
       this._each(function(value) {
-        try {
-          iterator(value, index++);
-        } catch (e) {
-          if (e != $continue) throw e;
-        }
+        iterator(value, index++);
       });
     } catch (e) {
       if (e != $break) throw e;
@@ -336,40 +598,45 @@
     return this;
   },
 
-  eachSlice: function(number, iterator) {
+  eachSlice: function(number, iterator, context) {
+    iterator = iterator ? iterator.bind(context) : Prototype.K;
     var index = -number, slices = [], array = this.toArray();
     while ((index += number) < array.length)
       slices.push(array.slice(index, index+number));
-    return slices.map(iterator);
+    return slices.collect(iterator, context);
   },
 
-  all: function(iterator) {
+  all: function(iterator, context) {
+    iterator = iterator ? iterator.bind(context) : Prototype.K;
     var result = true;
     this.each(function(value, index) {
-      result = result && !!(iterator || Prototype.K)(value, index);
+      result = result && !!iterator(value, index);
       if (!result) throw $break;
     });
     return result;
   },
 
-  any: function(iterator) {
+  any: function(iterator, context) {
+    iterator = iterator ? iterator.bind(context) : Prototype.K;
     var result = false;
     this.each(function(value, index) {
-      if (result = !!(iterator || Prototype.K)(value, index))
+      if (result = !!iterator(value, index))
         throw $break;
     });
     return result;
   },
 
-  collect: function(iterator) {
+  collect: function(iterator, context) {
+    iterator = iterator ? iterator.bind(context) : Prototype.K;
     var results = [];
     this.each(function(value, index) {
-      results.push((iterator || Prototype.K)(value, index));
+      results.push(iterator(value, index));
     });
     return results;
   },
 
-  detect: function(iterator) {
+  detect: function(iterator, context) {
+    iterator = iterator.bind(context);
     var result;
     this.each(function(value, index) {
       if (iterator(value, index)) {
@@ -380,7 +647,8 @@
     return result;
   },
 
-  findAll: function(iterator) {
+  findAll: function(iterator, context) {
+    iterator = iterator.bind(context);
     var results = [];
     this.each(function(value, index) {
       if (iterator(value, index))
@@ -389,17 +657,24 @@
     return results;
   },
 
-  grep: function(pattern, iterator) {
+  grep: function(filter, iterator, context) {
+    iterator = iterator ? iterator.bind(context) : Prototype.K;
     var results = [];
+
+    if (Object.isString(filter))
+      filter = new RegExp(filter);
+
     this.each(function(value, index) {
-      var stringValue = value.toString();
-      if (stringValue.match(pattern))
-        results.push((iterator || Prototype.K)(value, index));
-    })
+      if (filter.match(value))
+        results.push(iterator(value, index));
+    });
     return results;
   },
 
   include: function(object) {
+    if (Object.isFunction(this.indexOf))
+      if (this.indexOf(object) != -1) return true;
+
     var found = false;
     this.each(function(value) {
       if (value == object) {
@@ -418,7 +693,8 @@
     });
   },
 
-  inject: function(memo, iterator) {
+  inject: function(memo, iterator, context) {
+    iterator = iterator.bind(context);
     this.each(function(value, index) {
       memo = iterator(memo, value, index);
     });
@@ -432,30 +708,33 @@
     });
   },
 
-  max: function(iterator) {
+  max: function(iterator, context) {
+    iterator = iterator ? iterator.bind(context) : Prototype.K;
     var result;
     this.each(function(value, index) {
-      value = (iterator || Prototype.K)(value, index);
+      value = iterator(value, index);
       if (result == undefined || value >= result)
         result = value;
     });
     return result;
   },
 
-  min: function(iterator) {
+  min: function(iterator, context) {
+    iterator = iterator ? iterator.bind(context) : Prototype.K;
     var result;
     this.each(function(value, index) {
-      value = (iterator || Prototype.K)(value, index);
+      value = iterator(value, index);
       if (result == undefined || value < result)
         result = value;
     });
     return result;
   },
 
-  partition: function(iterator) {
+  partition: function(iterator, context) {
+    iterator = iterator ? iterator.bind(context) : Prototype.K;
     var trues = [], falses = [];
     this.each(function(value, index) {
-      ((iterator || Prototype.K)(value, index) ?
+      (iterator(value, index) ?
         trues : falses).push(value);
     });
     return [trues, falses];
@@ -463,13 +742,14 @@
 
   pluck: function(property) {
     var results = [];
-    this.each(function(value, index) {
+    this.each(function(value) {
       results.push(value[property]);
     });
     return results;
   },
 
-  reject: function(iterator) {
+  reject: function(iterator, context) {
+    iterator = iterator.bind(context);
     var results = [];
     this.each(function(value, index) {
       if (!iterator(value, index))
@@ -478,7 +758,8 @@
     return results;
   },
 
-  sortBy: function(iterator) {
+  sortBy: function(iterator, context) {
+    iterator = iterator.bind(context);
     return this.map(function(value, index) {
       return {value: value, criteria: iterator(value, index)};
     }).sort(function(left, right) {
@@ -493,7 +774,7 @@
 
   zip: function() {
     var iterator = Prototype.K, args = $A(arguments);
-    if (typeof args.last() == 'function')
+    if (Object.isFunction(args.last()))
       iterator = args.pop();
 
     var collections = [this].concat(args).map($A);
@@ -509,31 +790,42 @@
   inspect: function() {
     return '#<Enumerable:' + this.toArray().inspect() + '>';
   }
-}
+};
 
 Object.extend(Enumerable, {
   map:     Enumerable.collect,
   find:    Enumerable.detect,
   select:  Enumerable.findAll,
+  filter:  Enumerable.findAll,
   member:  Enumerable.include,
-  entries: Enumerable.toArray
+  entries: Enumerable.toArray,
+  every:   Enumerable.all,
+  some:    Enumerable.any
 });
-var $A = Array.from = function(iterable) {
+function $A(iterable) {
   if (!iterable) return [];
-  if (iterable.toArray) {
-    return iterable.toArray();
-  } else {
-    var results = [];
-    for (var i = 0, length = iterable.length; i < length; i++)
-      results.push(iterable[i]);
+  if (iterable.toArray) return iterable.toArray();
+  var length = iterable.length, results = new Array(length);
+  while (length--) results[length] = iterable[length];
+  return results;
+}
+
+if (Prototype.Browser.WebKit) {
+  function $A(iterable) {
+    if (!iterable) return [];
+    if (!(Object.isFunction(iterable) && iterable == '[object NodeList]') &&
+        iterable.toArray) return iterable.toArray();
+    var length = iterable.length, results = new Array(length);
+    while (length--) results[length] = iterable[length];
     return results;
   }
 }
 
+Array.from = $A;
+
 Object.extend(Array.prototype, Enumerable);
 
-if (!Array.prototype._reverse)
-  Array.prototype._reverse = Array.prototype.reverse;
+if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse;
 
 Object.extend(Array.prototype, {
   _each: function(iterator) {
@@ -562,7 +854,7 @@
 
   flatten: function() {
     return this.inject([], function(array, value) {
-      return array.concat(value && value.constructor == Array ?
+      return array.concat(Object.isArray(value) ?
         value.flatten() : [value]);
     });
   },
@@ -574,12 +866,6 @@
     });
   },
 
-  indexOf: function(object) {
-    for (var i = 0, length = this.length; i < length; i++)
-      if (this[i] == object) return i;
-    return -1;
-  },
-
   reverse: function(inline) {
     return (inline !== false ? this : this.toArray())._reverse();
   },
@@ -588,9 +874,17 @@
     return this.length > 1 ? this : this[0];
   },
 
-  uniq: function() {
-    return this.inject([], function(array, value) {
-      return array.include(value) ? array : array.concat([value]);
+  uniq: function(sorted) {
+    return this.inject([], function(array, value, index) {
+      if (0 == index || (sorted ? array.last() != value : !array.include(value)))
+        array.push(value);
+      return array;
+    });
+  },
+
+  intersect: function(array) {
+    return this.uniq().findAll(function(item) {
+      return array.detect(function(value) { return item === value });
     });
   },
 
@@ -604,125 +898,208 @@
 
   inspect: function() {
     return '[' + this.map(Object.inspect).join(', ') + ']';
+  },
+
+  toJSON: function() {
+    var results = [];
+    this.each(function(object) {
+      var value = Object.toJSON(object);
+      if (value !== undefined) results.push(value);
+    });
+    return '[' + results.join(', ') + ']';
   }
 });
 
+// use native browser JS 1.6 implementation if available
+if (Object.isFunction(Array.prototype.forEach))
+  Array.prototype._each = Array.prototype.forEach;
+
+if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) {
+  i || (i = 0);
+  var length = this.length;
+  if (i < 0) i = length + i;
+  for (; i < length; i++)
+    if (this[i] === item) return i;
+  return -1;
+};
+
+if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) {
+  i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
+  var n = this.slice(0, i).reverse().indexOf(item);
+  return (n < 0) ? n : i - n - 1;
+};
+
 Array.prototype.toArray = Array.prototype.clone;
 
-function $w(string){
+function $w(string) {
+  if (!Object.isString(string)) return [];
   string = string.strip();
   return string ? string.split(/\s+/) : [];
 }
 
-if(window.opera){
-  Array.prototype.concat = function(){
+if (Prototype.Browser.Opera){
+  Array.prototype.concat = function() {
     var array = [];
-    for(var i = 0, length = this.length; i < length; i++) array.push(this[i]);
-    for(var i = 0, length = arguments.length; i < length; i++) {
-      if(arguments[i].constructor == Array) {
-        for(var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
+    for (var i = 0, length = this.length; i < length; i++) array.push(this[i]);
+    for (var i = 0, length = arguments.length; i < length; i++) {
+      if (Object.isArray(arguments[i])) {
+        for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
           array.push(arguments[i][j]);
       } else {
         array.push(arguments[i]);
       }
     }
     return array;
-  }
+  };
 }
-var Hash = function(obj) {
-  Object.extend(this, obj || {});
-};
+Object.extend(Number.prototype, {
+  toColorPart: function() {
+    return this.toPaddedString(2, 16);
+  },
 
-Object.extend(Hash, {
-  toQueryString: function(obj) {
-    var parts = [];
-
-	  this.prototype._each.call(obj, function(pair) {
-      if (!pair.key) return;
-
-      if (pair.value && pair.value.constructor == Array) {
-        var values = pair.value.compact();
-        if (values.length < 2) pair.value = values.reduce();
-        else {
-        	key = encodeURIComponent(pair.key);
-          values.each(function(value) {
-            value = value != undefined ? encodeURIComponent(value) : '';
-            parts.push(key + '=' + encodeURIComponent(value));
-          });
-          return;
-        }
-      }
-      if (pair.value == undefined) pair[1] = '';
-      parts.push(pair.map(encodeURIComponent).join('='));
-	  });
+  succ: function() {
+    return this + 1;
+  },
+
+  times: function(iterator) {
+    $R(0, this, true).each(iterator);
+    return this;
+  },
 
-    return parts.join('&');
+  toPaddedString: function(length, radix) {
+    var string = this.toString(radix || 10);
+    return '0'.times(length - string.length) + string;
+  },
+
+  toJSON: function() {
+    return isFinite(this) ? this.toString() : 'null';
   }
 });
 
-Object.extend(Hash.prototype, Enumerable);
-Object.extend(Hash.prototype, {
-  _each: function(iterator) {
-    for (var key in this) {
-      var value = this[key];
-      if (value && value == Hash.prototype[key]) continue;
+$w('abs round ceil floor').each(function(method){
+  Number.prototype[method] = Math[method].methodize();
+});
+function $H(object) {
+  return new Hash(object);
+};
 
-      var pair = [key, value];
-      pair.key = key;
-      pair.value = value;
-      iterator(pair);
+var Hash = Class.create(Enumerable, (function() {
+  if (function() {
+    var i = 0, Test = function(value) { this.key = value };
+    Test.prototype.key = 'foo';
+    for (var property in new Test('bar')) i++;
+    return i > 1;
+  }()) {
+    function each(iterator) {
+      var cache = [];
+      for (var key in this._object) {
+        var value = this._object[key];
+        if (cache.include(key)) continue;
+        cache.push(key);
+        var pair = [key, value];
+        pair.key = key;
+        pair.value = value;
+        iterator(pair);
+      }
     }
-  },
-
-  keys: function() {
-    return this.pluck('key');
-  },
+  } else {
+    function each(iterator) {
+      for (var key in this._object) {
+        var value = this._object[key], pair = [key, value];
+        pair.key = key;
+        pair.value = value;
+        iterator(pair);
+      }
+    }
+  }
 
-  values: function() {
-    return this.pluck('value');
-  },
+  function toQueryPair(key, value) {
+    if (Object.isUndefined(value)) return key;
+    return key + '=' + encodeURIComponent(String.interpret(value));
+  }
+
+  return {
+    initialize: function(object) {
+      this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
+    },
+
+    _each: each,
+
+    set: function(key, value) {
+      return this._object[key] = value;
+    },
+
+    get: function(key) {
+      return this._object[key];
+    },
+
+    unset: function(key) {
+      var value = this._object[key];
+      delete this._object[key];
+      return value;
+    },
+
+    toObject: function() {
+      return Object.clone(this._object);
+    },
+
+    keys: function() {
+      return this.pluck('key');
+    },
+
+    values: function() {
+      return this.pluck('value');
+    },
+
+    index: function(value) {
+      var match = this.detect(function(pair) {
+        return pair.value === value;
+      });
+      return match && match.key;
+    },
 
-  merge: function(hash) {
-    return $H(hash).inject(this, function(mergedHash, pair) {
-      mergedHash[pair.key] = pair.value;
-      return mergedHash;
-    });
-  },
+    merge: function(object) {
+      return this.clone().update(object);
+    },
+
+    update: function(object) {
+      return new Hash(object).inject(this, function(result, pair) {
+        result.set(pair.key, pair.value);
+        return result;
+      });
+    },
 
-  remove: function() {
-    var result;
-    for(var i = 0, length = arguments.length; i < length; i++) {
-      var value = this[arguments[i]];
-      if (value !== undefined){
-        if (result === undefined) result = value;
-        else {
-          if (result.constructor != Array) result = [result];
-          result.push(value)
+    toQueryString: function() {
+      return this.map(function(pair) {
+        var key = encodeURIComponent(pair.key), values = pair.value;
+
+        if (values && typeof values == 'object') {
+          if (Object.isArray(values))
+            return values.map(toQueryPair.curry(key)).join('&');
         }
-      }
-      delete this[arguments[i]];
-    }
-    return result;
-  },
+        return toQueryPair(key, values);
+      }).join('&');
+    },
 
-  toQueryString: function() {
-    return Hash.toQueryString(this);
-  },
+    inspect: function() {
+      return '#<Hash:{' + this.map(function(pair) {
+        return pair.map(Object.inspect).join(': ');
+      }).join(', ') + '}>';
+    },
 
-  inspect: function() {
-    return '#<Hash:{' + this.map(function(pair) {
-      return pair.map(Object.inspect).join(': ');
-    }).join(', ') + '}>';
+    toJSON: function() {
+      return Object.toJSON(this.toObject());
+    },
+
+    clone: function() {
+      return new Hash(this);
+    }
   }
-});
+})());
 
-function $H(object) {
-  if (object && object.constructor == Hash) return object;
-  return new Hash(object);
-};
-ObjectRange = Class.create();
-Object.extend(ObjectRange.prototype, Enumerable);
-Object.extend(ObjectRange.prototype, {
+Hash.prototype.toTemplateReplacements = Hash.prototype.toObject;
+Hash.from = $H;
+var ObjectRange = Class.create(Enumerable, {
   initialize: function(start, end, exclusive) {
     this.start = start;
     this.end = end;
@@ -748,7 +1125,7 @@
 
 var $R = function(start, end, exclusive) {
   return new ObjectRange(start, end, exclusive);
-}
+};
 
 var Ajax = {
   getTransport: function() {
@@ -760,7 +1137,7 @@
   },
 
   activeRequestCount: 0
-}
+};
 
 Ajax.Responders = {
   responders: [],
@@ -780,10 +1157,10 @@
 
   dispatch: function(callback, request, transport, json) {
     this.each(function(responder) {
-      if (typeof responder[callback] == 'function') {
+      if (Object.isFunction(responder[callback])) {
         try {
           responder[callback].apply(responder, [request, transport, json]);
-        } catch (e) {}
+        } catch (e) { }
       }
     });
   }
@@ -792,49 +1169,42 @@
 Object.extend(Ajax.Responders, Enumerable);
 
 Ajax.Responders.register({
-  onCreate: function() {
-    Ajax.activeRequestCount++;
-  },
-  onComplete: function() {
-    Ajax.activeRequestCount--;
-  }
+  onCreate:   function() { Ajax.activeRequestCount++ },
+  onComplete: function() { Ajax.activeRequestCount-- }
 });
 
-Ajax.Base = function() {};
-Ajax.Base.prototype = {
-  setOptions: function(options) {
+Ajax.Base = Class.create({
+  initialize: function(options) {
     this.options = {
       method:       'post',
       asynchronous: true,
       contentType:  'application/x-www-form-urlencoded',
       encoding:     'UTF-8',
-      parameters:   ''
-    }
-    Object.extend(this.options, options || {});
+      parameters:   '',
+      evalJSON:     true,
+      evalJS:       true
+    };
+    Object.extend(this.options, options || { });
 
     this.options.method = this.options.method.toLowerCase();
-    if (typeof this.options.parameters == 'string')
+    if (Object.isString(this.options.parameters))
       this.options.parameters = this.options.parameters.toQueryParams();
   }
-}
-
-Ajax.Request = Class.create();
-Ajax.Request.Events =
-  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
+});
 
-Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
+Ajax.Request = Class.create(Ajax.Base, {
   _complete: false,
 
-  initialize: function(url, options) {
+  initialize: function($super, url, options) {
+    $super(options);
     this.transport = Ajax.getTransport();
-    this.setOptions(options);
     this.request(url);
   },
 
   request: function(url) {
     this.url = url;
     this.method = this.options.method;
-    var params = this.options.parameters;
+    var params = Object.clone(this.options.parameters);
 
     if (!['get', 'post'].include(this.method)) {
       // simulate other verbs over post
@@ -842,28 +1212,31 @@
       this.method = 'post';
     }
 
-    params = Hash.toQueryString(params);
-    if (params && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) params += '&_='
+    this.parameters = params;
 
-    // when GET, append parameters to URL
-    if (this.method == 'get' && params)
-      this.url += (this.url.indexOf('?') > -1 ? '&' : '?') + params;
+    if (params = Object.toQueryString(params)) {
+      // when GET, append parameters to URL
+      if (this.method == 'get')
+        this.url += (this.url.include('?') ? '&' : '?') + params;
+      else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
+        params += '&_=';
+    }
 
     try {
-      Ajax.Responders.dispatch('onCreate', this, this.transport);
+      var response = new Ajax.Response(this);
+      if (this.options.onCreate) this.options.onCreate(response);
+      Ajax.Responders.dispatch('onCreate', this, response);
 
       this.transport.open(this.method.toUpperCase(), this.url,
         this.options.asynchronous);
 
-      if (this.options.asynchronous)
-        setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10);
+      if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1);
 
       this.transport.onreadystatechange = this.onStateChange.bind(this);
       this.setRequestHeaders();
 
-      var body = this.method == 'post' ? (this.options.postBody || params) : null;
-
-      this.transport.send(body);
+      this.body = this.method == 'post' ? (this.options.postBody || params) : null;
+      this.transport.send(this.body);
 
       /* Force Firefox to handle ready state 4 for synchronous requests */
       if (!this.options.asynchronous && this.transport.overrideMimeType)
@@ -905,7 +1278,7 @@
     if (typeof this.options.requestHeaders == 'object') {
       var extras = this.options.requestHeaders;
 
-      if (typeof extras.push == 'function')
+      if (Object.isFunction(extras.push))
         for (var i = 0, length = extras.length; i < length; i += 2)
           headers[extras[i]] = extras[i+1];
       else
@@ -917,32 +1290,39 @@
   },
 
   success: function() {
-    return !this.transport.status
-        || (this.transport.status >= 200 && this.transport.status < 300);
+    var status = this.getStatus();
+    return !status || (status >= 200 && status < 300);
+  },
+
+  getStatus: function() {
+    try {
+      return this.transport.status || 0;
+    } catch (e) { return 0 }
   },
 
   respondToReadyState: function(readyState) {
-    var state = Ajax.Request.Events[readyState];
-    var transport = this.transport, json = this.evalJSON();
+    var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this);
 
     if (state == 'Complete') {
       try {
         this._complete = true;
-        (this.options['on' + this.transport.status]
+        (this.options['on' + response.status]
          || this.options['on' + (this.success() ? 'Success' : 'Failure')]
-         || Prototype.emptyFunction)(transport, json);
+         || Prototype.emptyFunction)(response, response.headerJSON);
       } catch (e) {
         this.dispatchException(e);
       }
 
-      if ((this.getHeader('Content-type') || 'text/javascript').strip().
-        match(/^(text|application)\/(x-)?(java|ecma)script(;.*)?$/i))
-          this.evalResponse();
+      var contentType = response.getHeader('Content-type');
+      if (this.options.evalJS == 'force'
+          || (this.options.evalJS && contentType
+          && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
+        this.evalResponse();
     }
 
     try {
-      (this.options['on' + state] || Prototype.emptyFunction)(transport, json);
-      Ajax.Responders.dispatch('on' + state, this, transport, json);
+      (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON);
+      Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON);
     } catch (e) {
       this.dispatchException(e);
     }
@@ -959,16 +1339,9 @@
     } catch (e) { return null }
   },
 
-  evalJSON: function() {
-    try {
-      var json = this.getHeader('X-JSON');
-      return json ? eval('(' + json + ')') : null;
-    } catch (e) { return null }
-  },
-
   evalResponse: function() {
     try {
-      return eval(this.transport.responseText);
+      return eval((this.transport.responseText || '').unfilterJSON());
     } catch (e) {
       this.dispatchException(e);
     }
@@ -980,57 +1353,129 @@
   }
 });
 
-Ajax.Updater = Class.create();
+Ajax.Request.Events =
+  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
+
+Ajax.Response = Class.create({
+  initialize: function(request){
+    this.request = request;
+    var transport  = this.transport  = request.transport,
+        readyState = this.readyState = transport.readyState;
 
-Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
-  initialize: function(container, url, options) {
-    this.container = {
-      success: (container.success || container),
-      failure: (container.failure || (container.success ? null : container))
+    if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {
+      this.status       = this.getStatus();
+      this.statusText   = this.getStatusText();
+      this.responseText = String.interpret(transport.responseText);
+      this.headerJSON   = this._getHeaderJSON();
     }
 
-    this.transport = Ajax.getTransport();
-    this.setOptions(options);
+    if(readyState == 4) {
+      var xml = transport.responseXML;
+      this.responseXML  = xml === undefined ? null : xml;
+      this.responseJSON = this._getResponseJSON();
+    }
+  },
 
-    var onComplete = this.options.onComplete || Prototype.emptyFunction;
-    this.options.onComplete = (function(transport, param) {
-      this.updateContent();
-      onComplete(transport, param);
+  status:      0,
+  statusText: '',
+
+  getStatus: Ajax.Request.prototype.getStatus,
+
+  getStatusText: function() {
+    try {
+      return this.transport.statusText || '';
+    } catch (e) { return '' }
+  },
+
+  getHeader: Ajax.Request.prototype.getHeader,
+
+  getAllHeaders: function() {
+    try {
+      return this.getAllResponseHeaders();
+    } catch (e) { return null }
+  },
+
+  getResponseHeader: function(name) {
+    return this.transport.getResponseHeader(name);
+  },
+
+  getAllResponseHeaders: function() {
+    return this.transport.getAllResponseHeaders();
+  },
+
+  _getHeaderJSON: function() {
+    var json = this.getHeader('X-JSON');
+    if (!json) return null;
+    json = decodeURIComponent(escape(json));
+    try {
+      return json.evalJSON(this.request.options.sanitizeJSON);
+    } catch (e) {
+      this.request.dispatchException(e);
+    }
+  },
+
+  _getResponseJSON: function() {
+    var options = this.request.options;
+    if (!options.evalJSON || (options.evalJSON != 'force' &&
+      !(this.getHeader('Content-type') || '').include('application/json')))
+        return null;
+    try {
+      return this.transport.responseText.evalJSON(options.sanitizeJSON);
+    } catch (e) {
+      this.request.dispatchException(e);
+    }
+  }
+});
+
+Ajax.Updater = Class.create(Ajax.Request, {
+  initialize: function($super, container, url, options) {
+    this.container = {
+      success: (container.success || container),
+      failure: (container.failure || (container.success ? null : container))
+    };
+
+    options = options || { };
+    var onComplete = options.onComplete;
+    options.onComplete = (function(response, param) {
+      this.updateContent(response.responseText);
+      if (Object.isFunction(onComplete)) onComplete(response, param);
     }).bind(this);
 
-    this.request(url);
+    $super(url, options);
   },
 
-  updateContent: function() {
-    var receiver = this.container[this.success() ? 'success' : 'failure'];
-    var response = this.transport.responseText;
+  updateContent: function(responseText) {
+    var receiver = this.container[this.success() ? 'success' : 'failure'],
+        options = this.options;
 
-    if (!this.options.evalScripts) response = response.stripScripts();
+    if (!options.evalScripts) responseText = responseText.stripScripts();
 
     if (receiver = $(receiver)) {
-      if (this.options.insertion)
-        new this.options.insertion(receiver, response);
-      else
-        receiver.update(response);
+      if (options.insertion) {
+        if (Object.isString(options.insertion)) {
+          var insertion = { }; insertion[options.insertion] = responseText;
+          receiver.insert(insertion);
+        }
+        else options.insertion(receiver, responseText);
+      }
+      else receiver.update(responseText);
     }
 
     if (this.success()) {
-      if (this.onComplete)
-        setTimeout(this.onComplete.bind(this), 10);
+      if (this.onComplete) this.onComplete.bind(this).defer();
     }
   }
 });
 
-Ajax.PeriodicalUpdater = Class.create();
-Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
-  initialize: function(container, url, options) {
-    this.setOptions(options);
+Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
+  initialize: function($super, container, url, options) {
+    $super(options);
     this.onComplete = this.options.onComplete;
 
     this.frequency = (this.options.frequency || 2);
     this.decay = (this.options.decay || 1);
 
-    this.updater = {};
+    this.updater = { };
     this.container = container;
     this.url = url;
 
@@ -1048,15 +1493,14 @@
     (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
   },
 
-  updateComplete: function(request) {
+  updateComplete: function(response) {
     if (this.options.decay) {
-      this.decay = (request.responseText == this.lastText ?
+      this.decay = (response.responseText == this.lastText ?
         this.decay * this.options.decay : 1);
 
-      this.lastText = request.responseText;
+      this.lastText = response.responseText;
     }
-    this.timer = setTimeout(this.onTimerEvent.bind(this),
-      this.decay * this.frequency * 1000);
+    this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);
   },
 
   onTimerEvent: function() {
@@ -1069,7 +1513,7 @@
       elements.push($(arguments[i]));
     return elements;
   }
-  if (typeof element == 'string')
+  if (Object.isString(element))
     element = document.getElementById(element);
   return Element.extend(element);
 }
@@ -1080,63 +1524,51 @@
     var query = document.evaluate(expression, $(parentElement) || document,
       null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
     for (var i = 0, length = query.snapshotLength; i < length; i++)
-      results.push(query.snapshotItem(i));
+      results.push(Element.extend(query.snapshotItem(i)));
     return results;
   };
 }
 
-document.getElementsByClassName = function(className, parentElement) {
-  if (Prototype.BrowserFeatures.XPath) {
-    var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]";
-    return document._getElementsByXPath(q, parentElement);
-  } else {
-    var children = ($(parentElement) || document.body).getElementsByTagName('*');
-    var elements = [], child;
-    for (var i = 0, length = children.length; i < length; i++) {
-      child = children[i];
-      if (Element.hasClassName(child, className))
-        elements.push(Element.extend(child));
-    }
-    return elements;
-  }
-};
-
 /*--------------------------------------------------------------------------*/
 
-if (!window.Element)
-  var Element = new Object();
-
-Element.extend = function(element) {
-  if (!element || _nativeExtensions || element.nodeType == 3) return element;
-
-  if (!element._extended && element.tagName && element != window) {
-    var methods = Object.clone(Element.Methods), cache = Element.extend.cache;
-
-    if (element.tagName == 'FORM')
-      Object.extend(methods, Form.Methods);
-    if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName))
-      Object.extend(methods, Form.Element.Methods);
+if (!window.Node) var Node = { };
 
-    Object.extend(methods, Element.Methods.Simulated);
+if (!Node.ELEMENT_NODE) {
+  // DOM level 2 ECMAScript Language Binding
+  Object.extend(Node, {
+    ELEMENT_NODE: 1,
+    ATTRIBUTE_NODE: 2,
+    TEXT_NODE: 3,
+    CDATA_SECTION_NODE: 4,
+    ENTITY_REFERENCE_NODE: 5,
+    ENTITY_NODE: 6,
+    PROCESSING_INSTRUCTION_NODE: 7,
+    COMMENT_NODE: 8,
+    DOCUMENT_NODE: 9,
+    DOCUMENT_TYPE_NODE: 10,
+    DOCUMENT_FRAGMENT_NODE: 11,
+    NOTATION_NODE: 12
+  });
+}
 
-    for (var property in methods) {
-      var value = methods[property];
-      if (typeof value == 'function' && !(property in element))
-        element[property] = cache.findOrStore(value);
+(function() {
+  var element = this.Element;
+  this.Element = function(tagName, attributes) {
+    attributes = attributes || { };
+    tagName = tagName.toLowerCase();
+    var cache = Element.cache;
+    if (Prototype.Browser.IE && attributes.name) {
+      tagName = '<' + tagName + ' name="' + attributes.name + '">';
+      delete attributes.name;
+      return Element.writeAttribute(document.createElement(tagName), attributes);
     }
-  }
-
-  element._extended = true;
-  return element;
-};
+    if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName));
+    return Element.writeAttribute(cache[tagName].cloneNode(false), attributes);
+  };
+  Object.extend(this.Element, element || { });
+}).call(window);
 
-Element.extend.cache = {
-  findOrStore: function(value) {
-    return this[value] = this[value] || function() {
-      return value.apply(null, [this].concat($A(arguments)));
-    }
-  }
-};
+Element.cache = { };
 
 Element.Methods = {
   visible: function(element) {
@@ -1165,28 +1597,74 @@
     return element;
   },
 
-  update: function(element, html) {
-    html = typeof html == 'undefined' ? '' : html.toString();
-    $(element).innerHTML = html.stripScripts();
-    setTimeout(function() {html.evalScripts()}, 10);
+  update: function(element, content) {
+    element = $(element);
+    if (content && content.toElement) content = content.toElement();
+    if (Object.isElement(content)) return element.update().insert(content);
+    content = Object.toHTML(content);
+    element.innerHTML = content.stripScripts();
+    content.evalScripts.bind(content).defer();
     return element;
   },
 
-  replace: function(element, html) {
+  replace: function(element, content) {
     element = $(element);
-    html = typeof html == 'undefined' ? '' : html.toString();
-    if (element.outerHTML) {
-      element.outerHTML = html.stripScripts();
-    } else {
+    if (content && content.toElement) content = content.toElement();
+    else if (!Object.isElement(content)) {
+      content = Object.toHTML(content);
       var range = element.ownerDocument.createRange();
-      range.selectNodeContents(element);
-      element.parentNode.replaceChild(
-        range.createContextualFragment(html.stripScripts()), element);
+      range.selectNode(element);
+      content.evalScripts.bind(content).defer();
+      content = range.createContextualFragment(content.stripScripts());
+    }
+    element.parentNode.replaceChild(content, element);
+    return element;
+  },
+
+  insert: function(element, insertions) {
+    element = $(element);
+
+    if (Object.isString(insertions) || Object.isNumber(insertions) ||
+        Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
+          insertions = {bottom:insertions};
+
+    var content, t, range;
+
+    for (position in insertions) {
+      content  = insertions[position];
+      position = position.toLowerCase();
+      t = Element._insertionTranslations[position];
+
+      if (content && content.toElement) content = content.toElement();
+      if (Object.isElement(content)) {
+        t.insert(element, content);
+        continue;
+      }
+
+      content = Object.toHTML(content);
+
+      range = element.ownerDocument.createRange();
+      t.initializeRange(element, range);
+      t.insert(element, range.createContextualFragment(content.stripScripts()));
+
+      content.evalScripts.bind(content).defer();
     }
-    setTimeout(function() {html.evalScripts()}, 10);
+
     return element;
   },
 
+  wrap: function(element, wrapper, attributes) {
+    element = $(element);
+    if (Object.isElement(wrapper))
+      $(wrapper).writeAttribute(attributes || { });
+    else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes);
+    else wrapper = new Element('div', wrapper);
+    if (element.parentNode)
+      element.parentNode.replaceChild(wrapper, element);
+    wrapper.appendChild(element);
+    return wrapper;
+  },
+
   inspect: function(element) {
     element = $(element);
     var result = '<' + element.tagName.toLowerCase();
@@ -1212,7 +1690,13 @@
   },
 
   descendants: function(element) {
-    return $A($(element).getElementsByTagName('*'));
+    return $A($(element).getElementsByTagName('*')).each(Element.extend);
+  },
+
+  firstDescendant: function(element) {
+    element = $(element).firstChild;
+    while (element && element.nodeType != 1) element = element.nextSibling;
+    return $(element);
   },
 
   immediateDescendants: function(element) {
@@ -1236,48 +1720,95 @@
   },
 
   match: function(element, selector) {
-    if (typeof selector == 'string')
+    if (Object.isString(selector))
       selector = new Selector(selector);
     return selector.match($(element));
   },
 
   up: function(element, expression, index) {
-    return Selector.findElement($(element).ancestors(), expression, index);
+    element = $(element);
+    if (arguments.length == 1) return $(element.parentNode);
+    var ancestors = element.ancestors();
+    return expression ? Selector.findElement(ancestors, expression, index) :
+      ancestors[index || 0];
   },
 
   down: function(element, expression, index) {
-    return Selector.findElement($(element).descendants(), expression, index);
+    element = $(element);
+    if (arguments.length == 1) return element.firstDescendant();
+    var descendants = element.descendants();
+    return expression ? Selector.findElement(descendants, expression, index) :
+      descendants[index || 0];
   },
 
   previous: function(element, expression, index) {
-    return Selector.findElement($(element).previousSiblings(), expression, index);
+    element = $(element);
+    if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));
+    var previousSiblings = element.previousSiblings();
+    return expression ? Selector.findElement(previousSiblings, expression, index) :
+      previousSiblings[index || 0];
   },
 
   next: function(element, expression, index) {
-    return Selector.findElement($(element).nextSiblings(), expression, index);
+    element = $(element);
+    if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));
+    var nextSiblings = element.nextSiblings();
+    return expression ? Selector.findElement(nextSiblings, expression, index) :
+      nextSiblings[index || 0];
   },
 
-  getElementsBySelector: function() {
+  select: function() {
     var args = $A(arguments), element = $(args.shift());
     return Selector.findChildElements(element, args);
   },
 
-  getElementsByClassName: function(element, className) {
-    return document.getElementsByClassName(className, element);
+  adjacent: function() {
+    var args = $A(arguments), element = $(args.shift());
+    return Selector.findChildElements(element.parentNode, args).without(element);
+  },
+
+  identify: function(element) {
+    element = $(element);
+    var id = element.readAttribute('id'), self = arguments.callee;
+    if (id) return id;
+    do { id = 'anonymous_element_' + self.counter++ } while ($(id));
+    element.writeAttribute('id', id);
+    return id;
   },
 
   readAttribute: function(element, name) {
     element = $(element);
-    if (document.all && !window.opera) {
-      var t = Element._attributeTranslations;
+    if (Prototype.Browser.IE) {
+      var t = Element._attributeTranslations.read;
       if (t.values[name]) return t.values[name](element, name);
-      if (t.names[name])  name = t.names[name];
-      var attribute = element.attributes[name];
-      if(attribute) return attribute.nodeValue;
+      if (t.names[name]) name = t.names[name];
+      if (name.include(':')) {
+        return (!element.attributes || !element.attributes[name]) ? null :
+         element.attributes[name].value;
+      }
     }
     return element.getAttribute(name);
   },
 
+  writeAttribute: function(element, name, value) {
+    element = $(element);
+    var attributes = { }, t = Element._attributeTranslations.write;
+
+    if (typeof name == 'object') attributes = name;
+    else attributes[name] = value === undefined ? true : value;
+
+    for (var attr in attributes) {
+      var name = t.names[attr] || attr, value = attributes[attr];
+      if (t.values[attr]) name = t.values[attr](element, value);
+      if (value === false || value === null)
+        element.removeAttribute(name);
+      else if (value === true)
+        element.setAttribute(name, name);
+      else element.setAttribute(name, value);
+    }
+    return element;
+  },
+
   getHeight: function(element) {
     return $(element).getDimensions().height;
   },
@@ -1293,39 +1824,28 @@
   hasClassName: function(element, className) {
     if (!(element = $(element))) return;
     var elementClassName = element.className;
-    if (elementClassName.length == 0) return false;
-    if (elementClassName == className ||
-        elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
-      return true;
-    return false;
+    return (elementClassName.length > 0 && (elementClassName == className ||
+      new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
   },
 
   addClassName: function(element, className) {
     if (!(element = $(element))) return;
-    Element.classNames(element).add(className);
+    if (!element.hasClassName(className))
+      element.className += (element.className ? ' ' : '') + className;
     return element;
   },
 
   removeClassName: function(element, className) {
     if (!(element = $(element))) return;
-    Element.classNames(element).remove(className);
+    element.className = element.className.replace(
+      new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();
     return element;
   },
 
   toggleClassName: function(element, className) {
     if (!(element = $(element))) return;
-    Element.classNames(element)[element.hasClassName(className) ? 'remove' : 'add'](className);
-    return element;
-  },
-
-  observe: function() {
-    Event.observe.apply(Event, arguments);
-    return $A(arguments).first();
-  },
-
-  stopObserving: function() {
-    Event.stopObserving.apply(Event, arguments);
-    return $A(arguments).first();
+    return element[element.hasClassName(className) ?
+      'removeClassName' : 'addClassName'](className);
   },
 
   // removes whitespace-only text node children
@@ -1342,11 +1862,25 @@
   },
 
   empty: function(element) {
-    return $(element).innerHTML.match(/^\s*$/);
+    return $(element).innerHTML.blank();
   },
 
   descendantOf: function(element, ancestor) {
     element = $(element), ancestor = $(ancestor);
+
+    if (element.compareDocumentPosition)
+      return (element.compareDocumentPosition(ancestor) & 8) === 8;
+
+    if (element.sourceIndex && !Prototype.Browser.Opera) {
+      var e = element.sourceIndex, a = ancestor.sourceIndex,
+       nextAncestor = ancestor.nextSibling;
+      if (!nextAncestor) {
+        do { ancestor = ancestor.parentNode; }
+        while (!(nextAncestor = ancestor.nextSibling) && ancestor.parentNode);
+      }
+      if (nextAncestor) return (e > a && e < nextAncestor.sourceIndex);
+    }
+
     while (element = element.parentNode)
       if (element == ancestor) return true;
     return false;
@@ -1354,62 +1888,49 @@
 
   scrollTo: function(element) {
     element = $(element);
-    var pos = Position.cumulativeOffset(element);
+    var pos = element.cumulativeOffset();
     window.scrollTo(pos[0], pos[1]);
     return element;
   },
 
   getStyle: function(element, style) {
     element = $(element);
-    if (['float','cssFloat'].include(style))
-      style = (typeof element.style.styleFloat != 'undefined' ? 'styleFloat' : 'cssFloat');
-    style = style.camelize();
+    style = style == 'float' ? 'cssFloat' : style.camelize();
     var value = element.style[style];
     if (!value) {
-      if (document.defaultView && document.defaultView.getComputedStyle) {
-        var css = document.defaultView.getComputedStyle(element, null);
-        value = css ? css[style] : null;
-      } else if (element.currentStyle) {
-        value = element.currentStyle[style];
-      }
-    }
-
-    if((value == 'auto') && ['width','height'].include(style) && (element.getStyle('display') != 'none'))
-      value = element['offset'+style.capitalize()] + 'px';
-
-    if (window.opera && ['left', 'top', 'right', 'bottom'].include(style))
-      if (Element.getStyle(element, 'position') == 'static') value = 'auto';
-    if(style == 'opacity') {
-      if(value) return parseFloat(value);
-      if(value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
-        if(value[1]) return parseFloat(value[1]) / 100;
-      return 1.0;
+      var css = document.defaultView.getComputedStyle(element, null);
+      value = css ? css[style] : null;
     }
+    if (style == 'opacity') return value ? parseFloat(value) : 1.0;
     return value == 'auto' ? null : value;
   },
 
-  setStyle: function(element, style) {
+  getOpacity: function(element) {
+    return $(element).getStyle('opacity');
+  },
+
+  setStyle: function(element, styles) {
     element = $(element);
-    for (var name in style) {
-      var value = style[name];
-      if(name == 'opacity') {
-        if (value == 1) {
-          value = (/Gecko/.test(navigator.userAgent) &&
-            !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : 1.0;
-          if(/MSIE/.test(navigator.userAgent) && !window.opera)
-            element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
-        } else if(value == '') {
-          if(/MSIE/.test(navigator.userAgent) && !window.opera)
-            element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
-        } else {
-          if(value < 0.00001) value = 0;
-          if(/MSIE/.test(navigator.userAgent) && !window.opera)
-            element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'') +
-              'alpha(opacity='+value*100+')';
-        }
-      } else if(['float','cssFloat'].include(name)) name = (typeof element.style.styleFloat != 'undefined') ? 'styleFloat' : 'cssFloat';
-      element.style[name.camelize()] = value;
+    var elementStyle = element.style, match;
+    if (Object.isString(styles)) {
+      element.style.cssText += ';' + styles;
+      return styles.include('opacity') ?
+        element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element;
     }
+    for (var property in styles)
+      if (property == 'opacity') element.setOpacity(styles[property]);
+      else
+        elementStyle[(property == 'float' || property == 'cssFloat') ?
+          (elementStyle.styleFloat === undefined ? 'cssFloat' : 'styleFloat') :
+            property] = styles[property];
+
+    return element;
+  },
+
+  setOpacity: function(element, value) {
+    element = $(element);
+    element.style.opacity = (value == 1 || value === '') ? '' :
+      (value < 0.00001) ? 0 : value;
     return element;
   },
 
@@ -1468,8 +1989,8 @@
   makeClipping: function(element) {
     element = $(element);
     if (element._overflow) return element;
-    element._overflow = element.style.overflow || 'auto';
-    if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')
+    element._overflow = Element.getStyle(element, 'overflow') || 'auto';
+    if (element._overflow !== 'hidden')
       element.style.overflow = 'hidden';
     return element;
   },
@@ -1480,390 +2001,1338 @@
     element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
     element._overflow = null;
     return element;
-  }
-};
-
-Object.extend(Element.Methods, {childOf: Element.Methods.descendantOf});
-
-Element._attributeTranslations = {};
-
-Element._attributeTranslations.names = {
-  colspan:   "colSpan",
-  rowspan:   "rowSpan",
-  valign:    "vAlign",
-  datetime:  "dateTime",
-  accesskey: "accessKey",
-  tabindex:  "tabIndex",
-  enctype:   "encType",
-  maxlength: "maxLength",
-  readonly:  "readOnly",
-  longdesc:  "longDesc"
-};
-
-Element._attributeTranslations.values = {
-  _getAttr: function(element, attribute) {
-    return element.getAttribute(attribute, 2);
   },
 
-  _flag: function(element, attribute) {
-    return $(element).hasAttribute(attribute) ? attribute : null;
+  cumulativeOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      element = element.offsetParent;
+    } while (element);
+    return Element._returnOffset(valueL, valueT);
   },
 
-  style: function(element) {
-    return element.style.cssText.toLowerCase();
+  positionedOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      element = element.offsetParent;
+      if (element) {
+        if (element.tagName == 'BODY') break;
+        var p = Element.getStyle(element, 'position');
+        if (p == 'relative' || p == 'absolute') break;
+      }
+    } while (element);
+    return Element._returnOffset(valueL, valueT);
   },
 
-  title: function(element) {
-    var node = element.getAttributeNode('title');
-    return node.specified ? node.nodeValue : null;
-  }
-};
-
-Object.extend(Element._attributeTranslations.values, {
-  href: Element._attributeTranslations.values._getAttr,
-  src:  Element._attributeTranslations.values._getAttr,
-  disabled: Element._attributeTranslations.values._flag,
-  checked:  Element._attributeTranslations.values._flag,
-  readonly: Element._attributeTranslations.values._flag,
-  multiple: Element._attributeTranslations.values._flag
-});
+  absolutize: function(element) {
+    element = $(element);
+    if (element.getStyle('position') == 'absolute') return;
+    // Position.prepare(); // To be done manually by Scripty when it needs it.
 
-Element.Methods.Simulated = {
-  hasAttribute: function(element, attribute) {
-    var t = Element._attributeTranslations;
-    attribute = t.names[attribute] || attribute;
-    return $(element).getAttributeNode(attribute).specified;
-  }
-};
+    var offsets = element.positionedOffset();
+    var top     = offsets[1];
+    var left    = offsets[0];
+    var width   = element.clientWidth;
+    var height  = element.clientHeight;
 
-// IE is missing .innerHTML support for TABLE-related elements
-if (document.all && !window.opera){
-  Element.Methods.update = function(element, html) {
-    element = $(element);
-    html = typeof html == 'undefined' ? '' : html.toString();
-    var tagName = element.tagName.toUpperCase();
-    if (['THEAD','TBODY','TR','TD'].include(tagName)) {
-      var div = document.createElement('div');
-      switch (tagName) {
-        case 'THEAD':
-        case 'TBODY':
-          div.innerHTML = '<table><tbody>' +  html.stripScripts() + '</tbody></table>';
-          depth = 2;
-          break;
-        case 'TR':
-          div.innerHTML = '<table><tbody><tr>' +  html.stripScripts() + '</tr></tbody></table>';
-          depth = 3;
-          break;
-        case 'TD':
-          div.innerHTML = '<table><tbody><tr><td>' +  html.stripScripts() + '</td></tr></tbody></table>';
-          depth = 4;
-      }
-      $A(element.childNodes).each(function(node){
-        element.removeChild(node)
-      });
-      depth.times(function(){ div = div.firstChild });
+    element._originalLeft   = left - parseFloat(element.style.left  || 0);
+    element._originalTop    = top  - parseFloat(element.style.top || 0);
+    element._originalWidth  = element.style.width;
+    element._originalHeight = element.style.height;
 
-      $A(div.childNodes).each(
-        function(node){ element.appendChild(node) });
-    } else {
-      element.innerHTML = html.stripScripts();
-    }
-    setTimeout(function() {html.evalScripts()}, 10);
+    element.style.position = 'absolute';
+    element.style.top    = top + 'px';
+    element.style.left   = left + 'px';
+    element.style.width  = width + 'px';
+    element.style.height = height + 'px';
     return element;
-  }
-};
+  },
 
-Object.extend(Element, Element.Methods);
+  relativize: function(element) {
+    element = $(element);
+    if (element.getStyle('position') == 'relative') return;
+    // Position.prepare(); // To be done manually by Scripty when it needs it.
 
-var _nativeExtensions = false;
+    element.style.position = 'relative';
+    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
+    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
 
-if(/Konqueror|Safari|KHTML/.test(navigator.userAgent))
-  ['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) {
-    var className = 'HTML' + tag + 'Element';
-    if(window[className]) return;
-    var klass = window[className] = {};
-    klass.prototype = document.createElement(tag ? tag.toLowerCase() : 'div').__proto__;
-  });
+    element.style.top    = top + 'px';
+    element.style.left   = left + 'px';
+    element.style.height = element._originalHeight;
+    element.style.width  = element._originalWidth;
+    return element;
+  },
 
-Element.addMethods = function(methods) {
-  Object.extend(Element.Methods, methods || {});
+  cumulativeScrollOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.scrollTop  || 0;
+      valueL += element.scrollLeft || 0;
+      element = element.parentNode;
+    } while (element);
+    return Element._returnOffset(valueL, valueT);
+  },
 
-  function copy(methods, destination, onlyIfAbsent) {
-    onlyIfAbsent = onlyIfAbsent || false;
-    var cache = Element.extend.cache;
-    for (var property in methods) {
-      var value = methods[property];
-      if (!onlyIfAbsent || !(property in destination))
-        destination[property] = cache.findOrStore(value);
-    }
-  }
+  getOffsetParent: function(element) {
+    if (element.offsetParent) return $(element.offsetParent);
+    if (element == document.body) return $(element);
 
-  if (typeof HTMLElement != 'undefined') {
-    copy(Element.Methods, HTMLElement.prototype);
-    copy(Element.Methods.Simulated, HTMLElement.prototype, true);
-    copy(Form.Methods, HTMLFormElement.prototype);
-    [HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) {
-      copy(Form.Element.Methods, klass.prototype);
-    });
-    _nativeExtensions = true;
-  }
-}
+    while ((element = element.parentNode) && element != document.body)
+      if (Element.getStyle(element, 'position') != 'static')
+        return $(element);
 
-var Toggle = new Object();
-Toggle.display = Element.toggle;
+    return $(document.body);
+  },
 
-/*--------------------------------------------------------------------------*/
+  viewportOffset: function(forElement) {
+    var valueT = 0, valueL = 0;
 
-Abstract.Insertion = function(adjacency) {
-  this.adjacency = adjacency;
-}
+    var element = forElement;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
 
-Abstract.Insertion.prototype = {
-  initialize: function(element, content) {
-    this.element = $(element);
-    this.content = content.stripScripts();
+      // Safari fix
+      if (element.offsetParent == document.body &&
+        Element.getStyle(element, 'position') == 'absolute') break;
 
-    if (this.adjacency && this.element.insertAdjacentHTML) {
-      try {
-        this.element.insertAdjacentHTML(this.adjacency, this.content);
-      } catch (e) {
-        var tagName = this.element.tagName.toUpperCase();
-        if (['TBODY', 'TR'].include(tagName)) {
-          this.insertContent(this.contentFromAnonymousTable());
-        } else {
-          throw e;
-        }
+    } while (element = element.offsetParent);
+
+    element = forElement;
+    do {
+      if (!Prototype.Browser.Opera || element.tagName == 'BODY') {
+        valueT -= element.scrollTop  || 0;
+        valueL -= element.scrollLeft || 0;
       }
-    } else {
-      this.range = this.element.ownerDocument.createRange();
-      if (this.initializeRange) this.initializeRange();
-      this.insertContent([this.range.createContextualFragment(this.content)]);
-    }
+    } while (element = element.parentNode);
 
-    setTimeout(function() {content.evalScripts()}, 10);
+    return Element._returnOffset(valueL, valueT);
   },
 
-  contentFromAnonymousTable: function() {
-    var div = document.createElement('div');
-    div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';
-    return $A(div.childNodes[0].childNodes[0].childNodes);
-  }
-}
-
-var Insertion = new Object();
-
-Insertion.Before = Class.create();
-Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
-  initializeRange: function() {
-    this.range.setStartBefore(this.element);
-  },
+  clonePosition: function(element, source) {
+    var options = Object.extend({
+      setLeft:    true,
+      setTop:     true,
+      setWidth:   true,
+      setHeight:  true,
+      offsetTop:  0,
+      offsetLeft: 0
+    }, arguments[2] || { });
 
-  insertContent: function(fragments) {
-    fragments.each((function(fragment) {
-      this.element.parentNode.insertBefore(fragment, this.element);
-    }).bind(this));
-  }
-});
+    // find page position of source
+    source = $(source);
+    var p = source.viewportOffset();
 
-Insertion.Top = Class.create();
-Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {
-  initializeRange: function() {
-    this.range.selectNodeContents(this.element);
-    this.range.collapse(true);
-  },
+    // find coordinate system to use
+    element = $(element);
+    var delta = [0, 0];
+    var parent = null;
+    // delta [0,0] will do fine with position: fixed elements,
+    // position:absolute needs offsetParent deltas
+    if (Element.getStyle(element, 'position') == 'absolute') {
+      parent = element.getOffsetParent();
+      delta = parent.viewportOffset();
+    }
 
-  insertContent: function(fragments) {
-    fragments.reverse(false).each((function(fragment) {
-      this.element.insertBefore(fragment, this.element.firstChild);
-    }).bind(this));
+    // correct by body offsets (fixes Safari)
+    if (parent == document.body) {
+      delta[0] -= document.body.offsetLeft;
+      delta[1] -= document.body.offsetTop;
+    }
+
+    // set position
+    if (options.setLeft)   element.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
+    if (options.setTop)    element.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
+    if (options.setWidth)  element.style.width = source.offsetWidth + 'px';
+    if (options.setHeight) element.style.height = source.offsetHeight + 'px';
+    return element;
   }
+};
+
+Element.Methods.identify.counter = 1;
+
+Object.extend(Element.Methods, {
+  getElementsBySelector: Element.Methods.select,
+  childElements: Element.Methods.immediateDescendants
 });
 
-Insertion.Bottom = Class.create();
-Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {
-  initializeRange: function() {
-    this.range.selectNodeContents(this.element);
-    this.range.collapse(this.element);
+Element._attributeTranslations = {
+  write: {
+    names: {
+      className: 'class',
+      htmlFor:   'for'
+    },
+    values: { }
+  }
+};
+
+
+if (!document.createRange || Prototype.Browser.Opera) {
+  Element.Methods.insert = function(element, insertions) {
+    element = $(element);
+
+    if (Object.isString(insertions) || Object.isNumber(insertions) ||
+        Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
+          insertions = { bottom: insertions };
+
+    var t = Element._insertionTranslations, content, position, pos, tagName;
+
+    for (position in insertions) {
+      content  = insertions[position];
+      position = position.toLowerCase();
+      pos      = t[position];
+
+      if (content && content.toElement) content = content.toElement();
+      if (Object.isElement(content)) {
+        pos.insert(element, content);
+        continue;
+      }
+
+      content = Object.toHTML(content);
+      tagName = ((position == 'before' || position == 'after')
+        ? element.parentNode : element).tagName.toUpperCase();
+
+      if (t.tags[tagName]) {
+        var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
+        if (position == 'top' || position == 'after') fragments.reverse();
+        fragments.each(pos.insert.curry(element));
+      }
+      else element.insertAdjacentHTML(pos.adjacency, content.stripScripts());
+
+      content.evalScripts.bind(content).defer();
+    }
+
+    return element;
+  };
+}
+
+if (Prototype.Browser.Opera) {
+  Element.Methods._getStyle = Element.Methods.getStyle;
+  Element.Methods.getStyle = function(element, style) {
+    switch(style) {
+      case 'left':
+      case 'top':
+      case 'right':
+      case 'bottom':
+        if (Element._getStyle(element, 'position') == 'static') return null;
+      default: return Element._getStyle(element, style);
+    }
+  };
+  Element.Methods._readAttribute = Element.Methods.readAttribute;
+  Element.Methods.readAttribute = function(element, attribute) {
+    if (attribute == 'title') return element.title;
+    return Element._readAttribute(element, attribute);
+  };
+}
+
+else if (Prototype.Browser.IE) {
+  $w('positionedOffset getOffsetParent viewportOffset').each(function(method) {
+    Element.Methods[method] = Element.Methods[method].wrap(
+      function(proceed, element) {
+        element = $(element);
+        var position = element.getStyle('position');
+        if (position != 'static') return proceed(element);
+        element.setStyle({ position: 'relative' });
+        var value = proceed(element);
+        element.setStyle({ position: position });
+        return value;
+      }
+    );
+  });
+
+  Element.Methods.getStyle = function(element, style) {
+    element = $(element);
+    style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
+    var value = element.style[style];
+    if (!value && element.currentStyle) value = element.currentStyle[style];
+
+    if (style == 'opacity') {
+      if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
+        if (value[1]) return parseFloat(value[1]) / 100;
+      return 1.0;
+    }
+
+    if (value == 'auto') {
+      if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))
+        return element['offset' + style.capitalize()] + 'px';
+      return null;
+    }
+    return value;
+  };
+
+  Element.Methods.setOpacity = function(element, value) {
+    function stripAlpha(filter){
+      return filter.replace(/alpha\([^\)]*\)/gi,'');
+    }
+    element = $(element);
+    var currentStyle = element.currentStyle;
+    if ((currentStyle && !currentStyle.hasLayout) ||
+      (!currentStyle && element.style.zoom == 'normal'))
+        element.style.zoom = 1;
+
+    var filter = element.getStyle('filter'), style = element.style;
+    if (value == 1 || value === '') {
+      (filter = stripAlpha(filter)) ?
+        style.filter = filter : style.removeAttribute('filter');
+      return element;
+    } else if (value < 0.00001) value = 0;
+    style.filter = stripAlpha(filter) +
+      'alpha(opacity=' + (value * 100) + ')';
+    return element;
+  };
+
+  Element._attributeTranslations = {
+    read: {
+      names: {
+        'class': 'className',
+        'for':   'htmlFor'
+      },
+      values: {
+        _getAttr: function(element, attribute) {
+          return element.getAttribute(attribute, 2);
+        },
+        _getAttrNode: function(element, attribute) {
+          var node = element.getAttributeNode(attribute);
+          return node ? node.value : "";
+        },
+        _getEv: function(element, attribute) {
+          var attribute = element.getAttribute(attribute);
+          return attribute ? attribute.toString().slice(23, -2) : null;
+        },
+        _flag: function(element, attribute) {
+          return $(element).hasAttribute(attribute) ? attribute : null;
+        },
+        style: function(element) {
+          return element.style.cssText.toLowerCase();
+        },
+        title: function(element) {
+          return element.title;
+        }
+      }
+    }
+  };
+
+  Element._attributeTranslations.write = {
+    names: Object.clone(Element._attributeTranslations.read.names),
+    values: {
+      checked: function(element, value) {
+        element.checked = !!value;
+      },
+
+      style: function(element, value) {
+        element.style.cssText = value ? value : '';
+      }
+    }
+  };
+
+  Element._attributeTranslations.has = {};
+
+  $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +
+      'encType maxLength readOnly longDesc').each(function(attr) {
+    Element._attributeTranslations.write.names[attr.toLowerCase()] = attr;
+    Element._attributeTranslations.has[attr.toLowerCase()] = attr;
+  });
+
+  (function(v) {
+    Object.extend(v, {
+      href:        v._getAttr,
+      src:         v._getAttr,
+      type:        v._getAttr,
+      action:      v._getAttrNode,
+      disabled:    v._flag,
+      checked:     v._flag,
+      readonly:    v._flag,
+      multiple:    v._flag,
+      onload:      v._getEv,
+      onunload:    v._getEv,
+      onclick:     v._getEv,
+      ondblclick:  v._getEv,
+      onmousedown: v._getEv,
+      onmouseup:   v._getEv,
+      onmouseover: v._getEv,
+      onmousemove: v._getEv,
+      onmouseout:  v._getEv,
+      onfocus:     v._getEv,
+      onblur:      v._getEv,
+      onkeypress:  v._getEv,
+      onkeydown:   v._getEv,
+      onkeyup:     v._getEv,
+      onsubmit:    v._getEv,
+      onreset:     v._getEv,
+      onselect:    v._getEv,
+      onchange:    v._getEv
+    });
+  })(Element._attributeTranslations.read.values);
+}
+
+else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
+  Element.Methods.setOpacity = function(element, value) {
+    element = $(element);
+    element.style.opacity = (value == 1) ? 0.999999 :
+      (value === '') ? '' : (value < 0.00001) ? 0 : value;
+    return element;
+  };
+}
+
+else if (Prototype.Browser.WebKit) {
+  Element.Methods.setOpacity = function(element, value) {
+    element = $(element);
+    element.style.opacity = (value == 1 || value === '') ? '' :
+      (value < 0.00001) ? 0 : value;
+
+    if (value == 1)
+      if(element.tagName == 'IMG' && element.width) {
+        element.width++; element.width--;
+      } else try {
+        var n = document.createTextNode(' ');
+        element.appendChild(n);
+        element.removeChild(n);
+      } catch (e) { }
+
+    return element;
+  };
+
+  // Safari returns margins on body which is incorrect if the child is absolutely
+  // positioned.  For performance reasons, redefine Position.cumulativeOffset for
+  // KHTML/WebKit only.
+  Element.Methods.cumulativeOffset = function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      if (element.offsetParent == document.body)
+        if (Element.getStyle(element, 'position') == 'absolute') break;
+
+      element = element.offsetParent;
+    } while (element);
+
+    return Element._returnOffset(valueL, valueT);
+  };
+}
+
+if (Prototype.Browser.IE || Prototype.Browser.Opera) {
+  // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements
+  Element.Methods.update = function(element, content) {
+    element = $(element);
+
+    if (content && content.toElement) content = content.toElement();
+    if (Object.isElement(content)) return element.update().insert(content);
+
+    content = Object.toHTML(content);
+    var tagName = element.tagName.toUpperCase();
+
+    if (tagName in Element._insertionTranslations.tags) {
+      $A(element.childNodes).each(function(node) { element.removeChild(node) });
+      Element._getContentFromAnonymousElement(tagName, content.stripScripts())
+        .each(function(node) { element.appendChild(node) });
+    }
+    else element.innerHTML = content.stripScripts();
+
+    content.evalScripts.bind(content).defer();
+    return element;
+  };
+}
+
+if (document.createElement('div').outerHTML) {
+  Element.Methods.replace = function(element, content) {
+    element = $(element);
+
+    if (content && content.toElement) content = content.toElement();
+    if (Object.isElement(content)) {
+      element.parentNode.replaceChild(content, element);
+      return element;
+    }
+
+    content = Object.toHTML(content);
+    var parent = element.parentNode, tagName = parent.tagName.toUpperCase();
+
+    if (Element._insertionTranslations.tags[tagName]) {
+      var nextSibling = element.next();
+      var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
+      parent.removeChild(element);
+      if (nextSibling)
+        fragments.each(function(node) { parent.insertBefore(node, nextSibling) });
+      else
+        fragments.each(function(node) { parent.appendChild(node) });
+    }
+    else element.outerHTML = content.stripScripts();
+
+    content.evalScripts.bind(content).defer();
+    return element;
+  };
+}
+
+Element._returnOffset = function(l, t) {
+  var result = [l, t];
+  result.left = l;
+  result.top = t;
+  return result;
+};
+
+Element._getContentFromAnonymousElement = function(tagName, html) {
+  var div = new Element('div'), t = Element._insertionTranslations.tags[tagName];
+  div.innerHTML = t[0] + html + t[1];
+  t[2].times(function() { div = div.firstChild });
+  return $A(div.childNodes);
+};
+
+Element._insertionTranslations = {
+  before: {
+    adjacency: 'beforeBegin',
+    insert: function(element, node) {
+      element.parentNode.insertBefore(node, element);
+    },
+    initializeRange: function(element, range) {
+      range.setStartBefore(element);
+    }
+  },
+  top: {
+    adjacency: 'afterBegin',
+    insert: function(element, node) {
+      element.insertBefore(node, element.firstChild);
+    },
+    initializeRange: function(element, range) {
+      range.selectNodeContents(element);
+      range.collapse(true);
+    }
   },
+  bottom: {
+    adjacency: 'beforeEnd',
+    insert: function(element, node) {
+      element.appendChild(node);
+    }
+  },
+  after: {
+    adjacency: 'afterEnd',
+    insert: function(element, node) {
+      element.parentNode.insertBefore(node, element.nextSibling);
+    },
+    initializeRange: function(element, range) {
+      range.setStartAfter(element);
+    }
+  },
+  tags: {
+    TABLE:  ['<table>',                '</table>',                   1],
+    TBODY:  ['<table><tbody>',         '</tbody></table>',           2],
+    TR:     ['<table><tbody><tr>',     '</tr></tbody></table>',      3],
+    TD:     ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4],
+    SELECT: ['<select>',               '</select>',                  1]
+  }
+};
+
+(function() {
+  this.bottom.initializeRange = this.top.initializeRange;
+  Object.extend(this.tags, {
+    THEAD: this.tags.TBODY,
+    TFOOT: this.tags.TBODY,
+    TH:    this.tags.TD
+  });
+}).call(Element._insertionTranslations);
 
-  insertContent: function(fragments) {
-    fragments.each((function(fragment) {
-      this.element.appendChild(fragment);
-    }).bind(this));
+Element.Methods.Simulated = {
+  hasAttribute: function(element, attribute) {
+    attribute = Element._attributeTranslations.has[attribute] || attribute;
+    var node = $(element).getAttributeNode(attribute);
+    return node && node.specified;
   }
-});
+};
 
-Insertion.After = Class.create();
-Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
-  initializeRange: function() {
-    this.range.setStartAfter(this.element);
-  },
+Element.Methods.ByTag = { };
+
+Object.extend(Element, Element.Methods);
+
+if (!Prototype.BrowserFeatures.ElementExtensions &&
+    document.createElement('div').__proto__) {
+  window.HTMLElement = { };
+  window.HTMLElement.prototype = document.createElement('div').__proto__;
+  Prototype.BrowserFeatures.ElementExtensions = true;
+}
+
+Element.extend = (function() {
+  if (Prototype.BrowserFeatures.SpecificElementExtensions)
+    return Prototype.K;
+
+  var Methods = { }, ByTag = Element.Methods.ByTag;
+
+  var extend = Object.extend(function(element) {
+    if (!element || element._extendedByPrototype ||
+        element.nodeType != 1 || element == window) return element;
+
+    var methods = Object.clone(Methods),
+      tagName = element.tagName, property, value;
+
+    // extend methods for specific tags
+    if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);
 
-  insertContent: function(fragments) {
-    fragments.each((function(fragment) {
-      this.element.parentNode.insertBefore(fragment,
-        this.element.nextSibling);
-    }).bind(this));
+    for (property in methods) {
+      value = methods[property];
+      if (Object.isFunction(value) && !(property in element))
+        element[property] = value.methodize();
+    }
+
+    element._extendedByPrototype = Prototype.emptyFunction;
+    return element;
+
+  }, {
+    refresh: function() {
+      // extend methods for all tags (Safari doesn't need this)
+      if (!Prototype.BrowserFeatures.ElementExtensions) {
+        Object.extend(Methods, Element.Methods);
+        Object.extend(Methods, Element.Methods.Simulated);
+      }
+    }
+  });
+
+  extend.refresh();
+  return extend;
+})();
+
+Element.hasAttribute = function(element, attribute) {
+  if (element.hasAttribute) return element.hasAttribute(attribute);
+  return Element.Methods.Simulated.hasAttribute(element, attribute);
+};
+
+Element.addMethods = function(methods) {
+  var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;
+
+  if (!methods) {
+    Object.extend(Form, Form.Methods);
+    Object.extend(Form.Element, Form.Element.Methods);
+    Object.extend(Element.Methods.ByTag, {
+      "FORM":     Object.clone(Form.Methods),
+      "INPUT":    Object.clone(Form.Element.Methods),
+      "SELECT":   Object.clone(Form.Element.Methods),
+      "TEXTAREA": Object.clone(Form.Element.Methods)
+    });
   }
-});
 
-/*--------------------------------------------------------------------------*/
+  if (arguments.length == 2) {
+    var tagName = methods;
+    methods = arguments[1];
+  }
+
+  if (!tagName) Object.extend(Element.Methods, methods || { });
+  else {
+    if (Object.isArray(tagName)) tagName.each(extend);
+    else extend(tagName);
+  }
+
+  function extend(tagName) {
+    tagName = tagName.toUpperCase();
+    if (!Element.Methods.ByTag[tagName])
+      Element.Methods.ByTag[tagName] = { };
+    Object.extend(Element.Methods.ByTag[tagName], methods);
+  }
 
-Element.ClassNames = Class.create();
-Element.ClassNames.prototype = {
-  initialize: function(element) {
-    this.element = $(element);
-  },
+  function copy(methods, destination, onlyIfAbsent) {
+    onlyIfAbsent = onlyIfAbsent || false;
+    for (var property in methods) {
+      var value = methods[property];
+      if (!Object.isFunction(value)) continue;
+      if (!onlyIfAbsent || !(property in destination))
+        destination[property] = value.methodize();
+    }
+  }
 
-  _each: function(iterator) {
-    this.element.className.split(/\s+/).select(function(name) {
-      return name.length > 0;
-    })._each(iterator);
-  },
+  function findDOMClass(tagName) {
+    var klass;
+    var trans = {
+      "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",
+      "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",
+      "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",
+      "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",
+      "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":
+      "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":
+      "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":
+      "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":
+      "FrameSet", "IFRAME": "IFrame"
+    };
+    if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';
+    if (window[klass]) return window[klass];
+    klass = 'HTML' + tagName + 'Element';
+    if (window[klass]) return window[klass];
+    klass = 'HTML' + tagName.capitalize() + 'Element';
+    if (window[klass]) return window[klass];
+
+    window[klass] = { };
+    window[klass].prototype = document.createElement(tagName).__proto__;
+    return window[klass];
+  }
 
-  set: function(className) {
-    this.element.className = className;
+  if (F.ElementExtensions) {
+    copy(Element.Methods, HTMLElement.prototype);
+    copy(Element.Methods.Simulated, HTMLElement.prototype, true);
+  }
+
+  if (F.SpecificElementExtensions) {
+    for (var tag in Element.Methods.ByTag) {
+      var klass = findDOMClass(tag);
+      if (Object.isUndefined(klass)) continue;
+      copy(T[tag], klass.prototype);
+    }
+  }
+
+  Object.extend(Element, Element.Methods);
+  delete Element.ByTag;
+
+  if (Element.extend.refresh) Element.extend.refresh();
+  Element.cache = { };
+};
+
+document.viewport = {
+  getDimensions: function() {
+    var dimensions = { };
+    $w('width height').each(function(d) {
+      var D = d.capitalize();
+      dimensions[d] = self['inner' + D] ||
+       (document.documentElement['client' + D] || document.body['client' + D]);
+    });
+    return dimensions;
   },
 
-  add: function(classNameToAdd) {
-    if (this.include(classNameToAdd)) return;
-    this.set($A(this).concat(classNameToAdd).join(' '));
+  getWidth: function() {
+    return this.getDimensions().width;
   },
 
-  remove: function(classNameToRemove) {
-    if (!this.include(classNameToRemove)) return;
-    this.set($A(this).without(classNameToRemove).join(' '));
+  getHeight: function() {
+    return this.getDimensions().height;
   },
 
-  toString: function() {
-    return $A(this).join(' ');
+  getScrollOffsets: function() {
+    return Element._returnOffset(
+      window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
+      window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);
   }
 };
+/* Portions of the Selector class are derived from Jack Slocum’s DomQuery,
+ * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style
+ * license.  Please see http://www.yui-ext.com/ for more information. */
 
-Object.extend(Element.ClassNames.prototype, Enumerable);
-var Selector = Class.create();
-Selector.prototype = {
+var Selector = Class.create({
   initialize: function(expression) {
-    this.params = {classNames: []};
-    this.expression = expression.toString().strip();
-    this.parseExpression();
+    this.expression = expression.strip();
     this.compileMatcher();
   },
 
-  parseExpression: function() {
-    function abort(message) { throw 'Parse error in selector: ' + message; }
-
-    if (this.expression == '')  abort('empty expression');
+  compileMatcher: function() {
+    // Selectors with namespaced attributes can't use the XPath version
+    if (Prototype.BrowserFeatures.XPath && !(/(\[[\w-]*?:|:checked)/).test(this.expression))
+      return this.compileXPathMatcher();
+
+    var e = this.expression, ps = Selector.patterns, h = Selector.handlers,
+        c = Selector.criteria, le, p, m;
+
+    if (Selector._cache[e]) {
+      this.matcher = Selector._cache[e];
+      return;
+    }
+
+    this.matcher = ["this.matcher = function(root) {",
+                    "var r = root, h = Selector.handlers, c = false, n;"];
+
+    while (e && le != e && (/\S/).test(e)) {
+      le = e;
+      for (var i in ps) {
+        p = ps[i];
+        if (m = e.match(p)) {
+          this.matcher.push(Object.isFunction(c[i]) ? c[i](m) :
+    	      new Template(c[i]).evaluate(m));
+          e = e.replace(m[0], '');
+          break;
+        }
+      }
+    }
 
-    var params = this.params, expr = this.expression, match, modifier, clause, rest;
-    while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) {
-      params.attributes = params.attributes || [];
-      params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''});
-      expr = match[1];
-    }
-
-    if (expr == '*') return this.params.wildcard = true;
-
-    while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) {
-      modifier = match[1], clause = match[2], rest = match[3];
-      switch (modifier) {
-        case '#':       params.id = clause; break;
-        case '.':       params.classNames.push(clause); break;
-        case '':
-        case undefined: params.tagName = clause.toUpperCase(); break;
-        default:        abort(expr.inspect());
-      }
-      expr = rest;
-    }
-
-    if (expr.length > 0) abort(expr.inspect());
-  },
-
-  buildMatchExpression: function() {
-    var params = this.params, conditions = [], clause;
-
-    if (params.wildcard)
-      conditions.push('true');
-    if (clause = params.id)
-      conditions.push('element.readAttribute("id") == ' + clause.inspect());
-    if (clause = params.tagName)
-      conditions.push('element.tagName.toUpperCase() == ' + clause.inspect());
-    if ((clause = params.classNames).length > 0)
-      for (var i = 0, length = clause.length; i < length; i++)
-        conditions.push('element.hasClassName(' + clause[i].inspect() + ')');
-    if (clause = params.attributes) {
-      clause.each(function(attribute) {
-        var value = 'element.readAttribute(' + attribute.name.inspect() + ')';
-        var splitValueBy = function(delimiter) {
-          return value + ' && ' + value + '.split(' + delimiter.inspect() + ')';
+    this.matcher.push("return h.unique(n);\n}");
+    eval(this.matcher.join('\n'));
+    Selector._cache[this.expression] = this.matcher;
+  },
+
+  compileXPathMatcher: function() {
+    var e = this.expression, ps = Selector.patterns,
+        x = Selector.xpath, le, m;
+
+    if (Selector._cache[e]) {
+      this.xpath = Selector._cache[e]; return;
+    }
+
+    this.matcher = ['.//*'];
+    while (e && le != e && (/\S/).test(e)) {
+      le = e;
+      for (var i in ps) {
+        if (m = e.match(ps[i])) {
+          this.matcher.push(Object.isFunction(x[i]) ? x[i](m) :
+            new Template(x[i]).evaluate(m));
+          e = e.replace(m[0], '');
+          break;
         }
+      }
+    }
+
+    this.xpath = this.matcher.join('');
+    Selector._cache[this.expression] = this.xpath;
+  },
 
-        switch (attribute.operator) {
-          case '=':       conditions.push(value + ' == ' + attribute.value.inspect()); break;
-          case '~=':      conditions.push(splitValueBy(' ') + '.include(' + attribute.value.inspect() + ')'); break;
-          case '|=':      conditions.push(
-                            splitValueBy('-') + '.first().toUpperCase() == ' + attribute.value.toUpperCase().inspect()
-                          ); break;
-          case '!=':      conditions.push(value + ' != ' + attribute.value.inspect()); break;
-          case '':
-          case undefined: conditions.push('element.hasAttribute(' + attribute.name.inspect() + ')'); break;
-          default:        throw 'Unknown operator ' + attribute.operator + ' in selector';
+  findElements: function(root) {
+    root = root || document;
+    if (this.xpath) return document._getElementsByXPath(this.xpath, root);
+    return this.matcher(root);
+  },
+
+  match: function(element) {
+    this.tokens = [];
+
+    var e = this.expression, ps = Selector.patterns, as = Selector.assertions;
+    var le, p, m;
+
+    while (e && le !== e && (/\S/).test(e)) {
+      le = e;
+      for (var i in ps) {
+        p = ps[i];
+        if (m = e.match(p)) {
+          // use the Selector.assertions methods unless the selector
+          // is too complex.
+          if (as[i]) {
+            this.tokens.push([i, Object.clone(m)]);
+            e = e.replace(m[0], '');
+          } else {
+            // reluctantly do a document-wide search
+            // and look for a match in the array
+            return this.findElements(document).include(element);
+          }
         }
-      });
+      }
     }
 
-    return conditions.join(' && ');
+    var match = true, name, matches;
+    for (var i = 0, token; token = this.tokens[i]; i++) {
+      name = token[0], matches = token[1];
+      if (!Selector.assertions[name](element, matches)) {
+        match = false; break;
+      }
+    }
+
+    return match;
   },
 
-  compileMatcher: function() {
-    this.match = new Function('element', 'if (!element.tagName) return false; \
-      element = $(element); \
-      return ' + this.buildMatchExpression());
+  toString: function() {
+    return this.expression;
   },
 
-  findElements: function(scope) {
-    var element;
+  inspect: function() {
+    return "#<Selector:" + this.expression.inspect() + ">";
+  }
+});
 
-    if (element = $(this.params.id))
-      if (this.match(element))
-        if (!scope || Element.childOf(element, scope))
-          return [element];
+Object.extend(Selector, {
+  _cache: { },
+
+  xpath: {
+    descendant:   "//*",
+    child:        "/*",
+    adjacent:     "/following-sibling::*[1]",
+    laterSibling: '/following-sibling::*',
+    tagName:      function(m) {
+      if (m[1] == '*') return '';
+      return "[local-name()='" + m[1].toLowerCase() +
+             "' or local-name()='" + m[1].toUpperCase() + "']";
+    },
+    className:    "[contains(concat(' ', @class, ' '), ' #{1} ')]",
+    id:           "[@id='#{1}']",
+    attrPresence: "[@#{1}]",
+    attr: function(m) {
+      m[3] = m[5] || m[6];
+      return new Template(Selector.xpath.operators[m[2]]).evaluate(m);
+    },
+    pseudo: function(m) {
+      var h = Selector.xpath.pseudos[m[1]];
+      if (!h) return '';
+      if (Object.isFunction(h)) return h(m);
+      return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m);
+    },
+    operators: {
+      '=':  "[@#{1}='#{3}']",
+      '!=': "[@#{1}!='#{3}']",
+      '^=': "[starts-with(@#{1}, '#{3}')]",
+      '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']",
+      '*=': "[contains(@#{1}, '#{3}')]",
+      '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]",
+      '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]"
+    },
+    pseudos: {
+      'first-child': '[not(preceding-sibling::*)]',
+      'last-child':  '[not(following-sibling::*)]',
+      'only-child':  '[not(preceding-sibling::* or following-sibling::*)]',
+      'empty':       "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]",
+      'checked':     "[@checked]",
+      'disabled':    "[@disabled]",
+      'enabled':     "[not(@disabled)]",
+      'not': function(m) {
+        var e = m[6], p = Selector.patterns,
+            x = Selector.xpath, le, m, v;
+
+        var exclusion = [];
+        while (e && le != e && (/\S/).test(e)) {
+          le = e;
+          for (var i in p) {
+            if (m = e.match(p[i])) {
+              v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m);
+              exclusion.push("(" + v.substring(1, v.length - 1) + ")");
+              e = e.replace(m[0], '');
+              break;
+            }
+          }
+        }
+        return "[not(" + exclusion.join(" and ") + ")]";
+      },
+      'nth-child':      function(m) {
+        return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m);
+      },
+      'nth-last-child': function(m) {
+        return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m);
+      },
+      'nth-of-type':    function(m) {
+        return Selector.xpath.pseudos.nth("position() ", m);
+      },
+      'nth-last-of-type': function(m) {
+        return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m);
+      },
+      'first-of-type':  function(m) {
+        m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m);
+      },
+      'last-of-type':   function(m) {
+        m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m);
+      },
+      'only-of-type':   function(m) {
+        var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m);
+      },
+      nth: function(fragment, m) {
+        var mm, formula = m[6], predicate;
+        if (formula == 'even') formula = '2n+0';
+        if (formula == 'odd')  formula = '2n+1';
+        if (mm = formula.match(/^(\d+)$/)) // digit only
+          return '[' + fragment + "= " + mm[1] + ']';
+        if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
+          if (mm[1] == "-") mm[1] = -1;
+          var a = mm[1] ? Number(mm[1]) : 1;
+          var b = mm[2] ? Number(mm[2]) : 0;
+          predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " +
+          "((#{fragment} - #{b}) div #{a} >= 0)]";
+          return new Template(predicate).evaluate({
+            fragment: fragment, a: a, b: b });
+        }
+      }
+    }
+  },
 
-    scope = (scope || document).getElementsByTagName(this.params.tagName || '*');
+  criteria: {
+    tagName:      'n = h.tagName(n, r, "#{1}", c);   c = false;',
+    className:    'n = h.className(n, r, "#{1}", c); c = false;',
+    id:           'n = h.id(n, r, "#{1}", c);        c = false;',
+    attrPresence: 'n = h.attrPresence(n, r, "#{1}"); c = false;',
+    attr: function(m) {
+      m[3] = (m[5] || m[6]);
+      return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}"); c = false;').evaluate(m);
+    },
+    pseudo: function(m) {
+      if (m[6]) m[6] = m[6].replace(/"/g, '\\"');
+      return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m);
+    },
+    descendant:   'c = "descendant";',
+    child:        'c = "child";',
+    adjacent:     'c = "adjacent";',
+    laterSibling: 'c = "laterSibling";'
+  },
+
+  patterns: {
+    // combinators must be listed first
+    // (and descendant needs to be last combinator)
+    laterSibling: /^\s*~\s*/,
+    child:        /^\s*>\s*/,
+    adjacent:     /^\s*\+\s*/,
+    descendant:   /^\s/,
+
+    // selectors follow
+    tagName:      /^\s*(\*|[\w\-]+)(\b|$)?/,
+    id:           /^#([\w\-\*]+)(\b|$)/,
+    className:    /^\.([\w\-\*]+)(\b|$)/,
+    pseudo:       /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s)|(?=:))/,
+    attrPresence: /^\[([\w]+)\]/,
+    attr:         /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/
+  },
+
+  // for Selector.match and Element#match
+  assertions: {
+    tagName: function(element, matches) {
+      return matches[1].toUpperCase() == element.tagName.toUpperCase();
+    },
+
+    className: function(element, matches) {
+      return Element.hasClassName(element, matches[1]);
+    },
+
+    id: function(element, matches) {
+      return element.id === matches[1];
+    },
+
+    attrPresence: function(element, matches) {
+      return Element.hasAttribute(element, matches[1]);
+    },
+
+    attr: function(element, matches) {
+      var nodeValue = Element.readAttribute(element, matches[1]);
+      return Selector.operators[matches[2]](nodeValue, matches[3]);
+    }
+  },
+
+  handlers: {
+    // UTILITY FUNCTIONS
+    // joins two collections
+    concat: function(a, b) {
+      for (var i = 0, node; node = b[i]; i++)
+        a.push(node);
+      return a;
+    },
+
+    // marks an array of nodes for counting
+    mark: function(nodes) {
+      for (var i = 0, node; node = nodes[i]; i++)
+        node._counted = true;
+      return nodes;
+    },
+
+    unmark: function(nodes) {
+      for (var i = 0, node; node = nodes[i]; i++)
+        node._counted = undefined;
+      return nodes;
+    },
+
+    // mark each child node with its position (for nth calls)
+    // "ofType" flag indicates whether we're indexing for nth-of-type
+    // rather than nth-child
+    index: function(parentNode, reverse, ofType) {
+      parentNode._counted = true;
+      if (reverse) {
+        for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) {
+          var node = nodes[i];
+          if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++;
+        }
+      } else {
+        for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++)
+          if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++;
+      }
+    },
 
-    var results = [];
-    for (var i = 0, length = scope.length; i < length; i++)
-      if (this.match(element = scope[i]))
-        results.push(Element.extend(element));
+    // filters out duplicates and extends all nodes
+    unique: function(nodes) {
+      if (nodes.length == 0) return nodes;
+      var results = [], n;
+      for (var i = 0, l = nodes.length; i < l; i++)
+        if (!(n = nodes[i])._counted) {
+          n._counted = true;
+          results.push(Element.extend(n));
+        }
+      return Selector.handlers.unmark(results);
+    },
 
-    return results;
+    // COMBINATOR FUNCTIONS
+    descendant: function(nodes) {
+      var h = Selector.handlers;
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        h.concat(results, node.getElementsByTagName('*'));
+      return results;
+    },
+
+    child: function(nodes) {
+      var h = Selector.handlers;
+      for (var i = 0, results = [], node; node = nodes[i]; i++) {
+        for (var j = 0, children = [], child; child = node.childNodes[j]; j++)
+          if (child.nodeType == 1 && child.tagName != '!') results.push(child);
+      }
+      return results;
+    },
+
+    adjacent: function(nodes) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++) {
+        var next = this.nextElementSibling(node);
+        if (next) results.push(next);
+      }
+      return results;
+    },
+
+    laterSibling: function(nodes) {
+      var h = Selector.handlers;
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        h.concat(results, Element.nextSiblings(node));
+      return results;
+    },
+
+    nextElementSibling: function(node) {
+      while (node = node.nextSibling)
+	      if (node.nodeType == 1) return node;
+      return null;
+    },
+
+    previousElementSibling: function(node) {
+      while (node = node.previousSibling)
+        if (node.nodeType == 1) return node;
+      return null;
+    },
+
+    // TOKEN FUNCTIONS
+    tagName: function(nodes, root, tagName, combinator) {
+      tagName = tagName.toUpperCase();
+      var results = [], h = Selector.handlers;
+      if (nodes) {
+        if (combinator) {
+          // fastlane for ordinary descendant combinators
+          if (combinator == "descendant") {
+            for (var i = 0, node; node = nodes[i]; i++)
+              h.concat(results, node.getElementsByTagName(tagName));
+            return results;
+          } else nodes = this[combinator](nodes);
+          if (tagName == "*") return nodes;
+        }
+        for (var i = 0, node; node = nodes[i]; i++)
+          if (node.tagName.toUpperCase() == tagName) results.push(node);
+        return results;
+      } else return root.getElementsByTagName(tagName);
+    },
+
+    id: function(nodes, root, id, combinator) {
+      var targetNode = $(id), h = Selector.handlers;
+      if (!targetNode) return [];
+      if (!nodes && root == document) return [targetNode];
+      if (nodes) {
+        if (combinator) {
+          if (combinator == 'child') {
+            for (var i = 0, node; node = nodes[i]; i++)
+              if (targetNode.parentNode == node) return [targetNode];
+          } else if (combinator == 'descendant') {
+            for (var i = 0, node; node = nodes[i]; i++)
+              if (Element.descendantOf(targetNode, node)) return [targetNode];
+          } else if (combinator == 'adjacent') {
+            for (var i = 0, node; node = nodes[i]; i++)
+              if (Selector.handlers.previousElementSibling(targetNode) == node)
+                return [targetNode];
+          } else nodes = h[combinator](nodes);
+        }
+        for (var i = 0, node; node = nodes[i]; i++)
+          if (node == targetNode) return [targetNode];
+        return [];
+      }
+      return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : [];
+    },
+
+    className: function(nodes, root, className, combinator) {
+      if (nodes && combinator) nodes = this[combinator](nodes);
+      return Selector.handlers.byClassName(nodes, root, className);
+    },
+
+    byClassName: function(nodes, root, className) {
+      if (!nodes) nodes = Selector.handlers.descendant([root]);
+      var needle = ' ' + className + ' ';
+      for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) {
+        nodeClassName = node.className;
+        if (nodeClassName.length == 0) continue;
+        if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle))
+          results.push(node);
+      }
+      return results;
+    },
+
+    attrPresence: function(nodes, root, attr) {
+      if (!nodes) nodes = root.getElementsByTagName("*");
+      var results = [];
+      for (var i = 0, node; node = nodes[i]; i++)
+        if (Element.hasAttribute(node, attr)) results.push(node);
+      return results;
+    },
+
+    attr: function(nodes, root, attr, value, operator) {
+      if (!nodes) nodes = root.getElementsByTagName("*");
+      var handler = Selector.operators[operator], results = [];
+      for (var i = 0, node; node = nodes[i]; i++) {
+        var nodeValue = Element.readAttribute(node, attr);
+        if (nodeValue === null) continue;
+        if (handler(nodeValue, value)) results.push(node);
+      }
+      return results;
+    },
+
+    pseudo: function(nodes, name, value, root, combinator) {
+      if (nodes && combinator) nodes = this[combinator](nodes);
+      if (!nodes) nodes = root.getElementsByTagName("*");
+      return Selector.pseudos[name](nodes, value, root);
+    }
   },
 
-  toString: function() {
-    return this.expression;
-  }
-}
+  pseudos: {
+    'first-child': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++) {
+        if (Selector.handlers.previousElementSibling(node)) continue;
+          results.push(node);
+      }
+      return results;
+    },
+    'last-child': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++) {
+        if (Selector.handlers.nextElementSibling(node)) continue;
+          results.push(node);
+      }
+      return results;
+    },
+    'only-child': function(nodes, value, root) {
+      var h = Selector.handlers;
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        if (!h.previousElementSibling(node) && !h.nextElementSibling(node))
+          results.push(node);
+      return results;
+    },
+    'nth-child':        function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, formula, root);
+    },
+    'nth-last-child':   function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, formula, root, true);
+    },
+    'nth-of-type':      function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, formula, root, false, true);
+    },
+    'nth-last-of-type': function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, formula, root, true, true);
+    },
+    'first-of-type':    function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, "1", root, false, true);
+    },
+    'last-of-type':     function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, "1", root, true, true);
+    },
+    'only-of-type':     function(nodes, formula, root) {
+      var p = Selector.pseudos;
+      return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root);
+    },
+
+    // handles the an+b logic
+    getIndices: function(a, b, total) {
+      if (a == 0) return b > 0 ? [b] : [];
+      return $R(1, total).inject([], function(memo, i) {
+        if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i);
+        return memo;
+      });
+    },
+
+    // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type
+    nth: function(nodes, formula, root, reverse, ofType) {
+      if (nodes.length == 0) return [];
+      if (formula == 'even') formula = '2n+0';
+      if (formula == 'odd')  formula = '2n+1';
+      var h = Selector.handlers, results = [], indexed = [], m;
+      h.mark(nodes);
+      for (var i = 0, node; node = nodes[i]; i++) {
+        if (!node.parentNode._counted) {
+          h.index(node.parentNode, reverse, ofType);
+          indexed.push(node.parentNode);
+        }
+      }
+      if (formula.match(/^\d+$/)) { // just a number
+        formula = Number(formula);
+        for (var i = 0, node; node = nodes[i]; i++)
+          if (node.nodeIndex == formula) results.push(node);
+      } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
+        if (m[1] == "-") m[1] = -1;
+        var a = m[1] ? Number(m[1]) : 1;
+        var b = m[2] ? Number(m[2]) : 0;
+        var indices = Selector.pseudos.getIndices(a, b, nodes.length);
+        for (var i = 0, node, l = indices.length; node = nodes[i]; i++) {
+          for (var j = 0; j < l; j++)
+            if (node.nodeIndex == indices[j]) results.push(node);
+        }
+      }
+      h.unmark(nodes);
+      h.unmark(indexed);
+      return results;
+    },
+
+    'empty': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++) {
+        // IE treats comments as element nodes
+        if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\s*$/))) continue;
+        results.push(node);
+      }
+      return results;
+    },
+
+    'not': function(nodes, selector, root) {
+      var h = Selector.handlers, selectorType, m;
+      var exclusions = new Selector(selector).findElements(root);
+      h.mark(exclusions);
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        if (!node._counted) results.push(node);
+      h.unmark(exclusions);
+      return results;
+    },
+
+    'enabled': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        if (!node.disabled) results.push(node);
+      return results;
+    },
+
+    'disabled': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        if (node.disabled) results.push(node);
+      return results;
+    },
+
+    'checked': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        if (node.checked) results.push(node);
+      return results;
+    }
+  },
+
+  operators: {
+    '=':  function(nv, v) { return nv == v; },
+    '!=': function(nv, v) { return nv != v; },
+    '^=': function(nv, v) { return nv.startsWith(v); },
+    '$=': function(nv, v) { return nv.endsWith(v); },
+    '*=': function(nv, v) { return nv.include(v); },
+    '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); },
+    '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); }
+  },
 
-Object.extend(Selector, {
   matchElements: function(elements, expression) {
-    var selector = new Selector(expression);
-    return elements.select(selector.match.bind(selector)).map(Element.extend);
+    var matches = new Selector(expression).findElements(), h = Selector.handlers;
+    h.mark(matches);
+    for (var i = 0, results = [], element; element = elements[i]; i++)
+      if (element._counted) results.push(element);
+    h.unmark(matches);
+    return results;
   },
 
   findElement: function(elements, expression, index) {
-    if (typeof expression == 'number') index = expression, expression = false;
+    if (Object.isNumber(expression)) {
+      index = expression; expression = false;
+    }
     return Selector.matchElements(elements, expression || '*')[index || 0];
   },
 
   findChildElements: function(element, expressions) {
-    return expressions.map(function(expression) {
-      return expression.match(/[^\s"]+(?:"[^"]*"[^\s"]+)*/g).inject([null], function(results, expr) {
-        var selector = new Selector(expr);
-        return results.inject([], function(elements, result) {
-          return elements.concat(selector.findElements(result || element));
-        });
-      });
-    }).flatten();
+    var exprs = expressions.join(','), expressions = [];
+    exprs.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
+      expressions.push(m[1].strip());
+    });
+    var results = [], h = Selector.handlers;
+    for (var i = 0, l = expressions.length, selector; i < l; i++) {
+      selector = new Selector(expressions[i].strip());
+      h.concat(results, selector.findElements(element));
+    }
+    return (l > 1) ? h.unique(results) : results;
   }
 });
 
@@ -1876,13 +3345,19 @@
     return form;
   },
 
-  serializeElements: function(elements, getHash) {
-    var data = elements.inject({}, function(result, element) {
+  serializeElements: function(elements, options) {
+    if (typeof options != 'object') options = { hash: !!options };
+    else if (options.hash === undefined) options.hash = true;
+    var key, value, submitted = false, submit = options.submit;
+
+    var data = elements.inject({ }, function(result, element) {
       if (!element.disabled && element.name) {
-        var key = element.name, value = $(element).getValue();
-        if (value != undefined) {
-          if (result[key]) {
-            if (result[key].constructor != Array) result[key] = [result[key]];
+        key = element.name; value = $(element).getValue();
+        if (value != null && (element.type != 'submit' || (!submitted &&
+            submit !== false && (!submit || key == submit) && (submitted = true)))) {
+          if (key in result) {
+            // a key is already present; construct an array of values
+            if (!Object.isArray(result[key])) result[key] = [result[key]];
             result[key].push(value);
           }
           else result[key] = value;
@@ -1891,13 +3366,13 @@
       return result;
     });
 
-    return getHash ? data : Hash.toQueryString(data);
+    return options.hash ? data : Object.toQueryString(data);
   }
 };
 
 Form.Methods = {
-  serialize: function(form, getHash) {
-    return Form.serializeElements(Form.getElements(form), getHash);
+  serialize: function(form, options) {
+    return Form.serializeElements(Form.getElements(form), options);
   },
 
   getElements: function(form) {
@@ -1928,25 +3403,26 @@
 
   disable: function(form) {
     form = $(form);
-    form.getElements().each(function(element) {
-      element.blur();
-      element.disabled = 'true';
-    });
+    Form.getElements(form).invoke('disable');
     return form;
   },
 
   enable: function(form) {
     form = $(form);
-    form.getElements().each(function(element) {
-      element.disabled = '';
-    });
+    Form.getElements(form).invoke('enable');
     return form;
   },
 
   findFirstElement: function(form) {
-    return $(form).getElements().find(function(element) {
-      return element.type != 'hidden' && !element.disabled &&
-        ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
+    var elements = $(form).getElements().findAll(function(element) {
+      return 'hidden' != element.type && !element.disabled;
+    });
+    var firstByIndex = elements.findAll(function(element) {
+      return element.hasAttribute('tabIndex') && element.tabIndex >= 0;
+    }).sortBy(function(element) { return element.tabIndex }).first();
+
+    return firstByIndex ? firstByIndex : elements.find(function(element) {
+      return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
     });
   },
 
@@ -1954,10 +3430,26 @@
     form = $(form);
     form.findFirstElement().activate();
     return form;
-  }
-}
+  },
+
+  request: function(form, options) {
+    form = $(form), options = Object.clone(options || { });
+
+    var params = options.parameters, action = form.readAttribute('action') || '';
+    if (action.blank()) action = window.location.href;
+    options.parameters = form.serialize(true);
 
-Object.extend(Form, Form.Methods);
+    if (params) {
+      if (Object.isString(params)) params = params.toQueryParams();
+      Object.extend(options.parameters, params);
+    }
+
+    if (form.hasAttribute('method') && !options.method)
+      options.method = form.method;
+
+    return new Ajax.Request(action, options);
+  }
+};
 
 /*--------------------------------------------------------------------------*/
 
@@ -1971,7 +3463,7 @@
     $(element).select();
     return element;
   }
-}
+};
 
 Form.Element.Methods = {
   serialize: function(element) {
@@ -1979,9 +3471,9 @@
     if (!element.disabled && element.name) {
       var value = element.getValue();
       if (value != undefined) {
-        var pair = {};
+        var pair = { };
         pair[element.name] = value;
-        return Hash.toQueryString(pair);
+        return Object.toQueryString(pair);
       }
     }
     return '';
@@ -1993,6 +3485,13 @@
     return Form.Element.Serializers[method](element);
   },
 
+  setValue: function(element, value) {
+    element = $(element);
+    var method = element.tagName.toLowerCase();
+    Form.Element.Serializers[method](element, value);
+    return element;
+  },
+
   clear: function(element) {
     $(element).value = '';
     return element;
@@ -2004,55 +3503,75 @@
 
   activate: function(element) {
     element = $(element);
-    element.focus();
-    if (element.select && ( element.tagName.toLowerCase() != 'input' ||
-      !['button', 'reset', 'submit'].include(element.type) ) )
-      element.select();
+    try {
+      element.focus();
+      if (element.select && (element.tagName.toLowerCase() != 'input' ||
+          !['button', 'reset', 'submit'].include(element.type)))
+        element.select();
+    } catch (e) { }
     return element;
   },
 
   disable: function(element) {
     element = $(element);
+    element.blur();
     element.disabled = true;
     return element;
   },
 
   enable: function(element) {
     element = $(element);
-    element.blur();
     element.disabled = false;
     return element;
   }
-}
+};
+
+/*--------------------------------------------------------------------------*/
 
-Object.extend(Form.Element, Form.Element.Methods);
 var Field = Form.Element;
-var $F = Form.Element.getValue;
+var $F = Form.Element.Methods.getValue;
 
 /*--------------------------------------------------------------------------*/
 
 Form.Element.Serializers = {
-  input: function(element) {
+  input: function(element, value) {
     switch (element.type.toLowerCase()) {
       case 'checkbox':
       case 'radio':
-        return Form.Element.Serializers.inputSelector(element);
+        return Form.Element.Serializers.inputSelector(element, value);
       default:
-        return Form.Element.Serializers.textarea(element);
+        return Form.Element.Serializers.textarea(element, value);
     }
   },
 
-  inputSelector: function(element) {
-    return element.checked ? element.value : null;
+  inputSelector: function(element, value) {
+    if (value === undefined) return element.checked ? element.value : null;
+    else element.checked = !!value;
   },
 
-  textarea: function(element) {
-    return element.value;
+  textarea: function(element, value) {
+    if (value === undefined) return element.value;
+    else element.value = value;
   },
 
-  select: function(element) {
-    return this[element.type == 'select-one' ?
-      'selectOne' : 'selectMany'](element);
+  select: function(element, index) {
+    if (index === undefined)
+      return this[element.type == 'select-one' ?
+        'selectOne' : 'selectMany'](element);
+    else {
+      var opt, value, single = !Object.isArray(index);
+      for (var i = 0, length = element.length; i < length; i++) {
+        opt = element.options[i];
+        value = this.optionValue(opt);
+        if (single) {
+          if (value == index) {
+            opt.selected = true;
+            return;
+          }
+        }
+        else opt.selected = index.include(value);
+      }
+    }
   },
 
   selectOne: function(element) {
@@ -2075,219 +3594,436 @@
     // extend element because hasAttribute may not be native
     return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
   }
-}
+};
 
 /*--------------------------------------------------------------------------*/
 
-Abstract.TimedObserver = function() {}
-Abstract.TimedObserver.prototype = {
-  initialize: function(element, frequency, callback) {
-    this.frequency = frequency;
+Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
+  initialize: function($super, element, frequency, callback) {
+    $super(callback, frequency);
     this.element   = $(element);
-    this.callback  = callback;
-
     this.lastValue = this.getValue();
-    this.registerCallback();
   },
 
-  registerCallback: function() {
-    setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+  execute: function() {
+    var value = this.getValue();
+    if (Object.isString(this.lastValue) && Object.isString(value) ?
+        this.lastValue != value : String(this.lastValue) != String(value)) {
+      this.callback(this.element, value);
+      this.lastValue = value;
+    }
+  }
+});
+
+Form.Element.Observer = Class.create(Abstract.TimedObserver, {
+  getValue: function() {
+    return Form.Element.getValue(this.element);
+  }
+});
+
+Form.Observer = Class.create(Abstract.TimedObserver, {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.EventObserver = Class.create({
+  initialize: function(element, callback) {
+    this.element  = $(element);
+    this.callback = callback;
+
+    this.lastValue = this.getValue();
+    if (this.element.tagName.toLowerCase() == 'form')
+      this.registerFormCallbacks();
+    else
+      this.registerCallback(this.element);
   },
 
-  onTimerEvent: function() {
+  onElementEvent: function() {
     var value = this.getValue();
-    var changed = ('string' == typeof this.lastValue && 'string' == typeof value
-      ? this.lastValue != value : String(this.lastValue) != String(value));
-    if (changed) {
+    if (this.lastValue != value) {
       this.callback(this.element, value);
       this.lastValue = value;
     }
+  },
+
+  registerFormCallbacks: function() {
+    Form.getElements(this.element).each(this.registerCallback, this);
+  },
+
+  registerCallback: function(element) {
+    if (element.type) {
+      switch (element.type.toLowerCase()) {
+        case 'checkbox':
+        case 'radio':
+          Event.observe(element, 'click', this.onElementEvent.bind(this));
+          break;
+        default:
+          Event.observe(element, 'change', this.onElementEvent.bind(this));
+          break;
+      }
+    }
   }
-}
+});
 
-Form.Element.Observer = Class.create();
-Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
+Form.Element.EventObserver = Class.create(Abstract.EventObserver, {
   getValue: function() {
     return Form.Element.getValue(this.element);
   }
-});
+});
+
+Form.EventObserver = Class.create(Abstract.EventObserver, {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+if (!window.Event) var Event = { };
+
+Object.extend(Event, {
+  KEY_BACKSPACE: 8,
+  KEY_TAB:       9,
+  KEY_RETURN:   13,
+  KEY_ESC:      27,
+  KEY_LEFT:     37,
+  KEY_UP:       38,
+  KEY_RIGHT:    39,
+  KEY_DOWN:     40,
+  KEY_DELETE:   46,
+  KEY_HOME:     36,
+  KEY_END:      35,
+  KEY_PAGEUP:   33,
+  KEY_PAGEDOWN: 34,
+  KEY_INSERT:   45,
+
+  cache: { },
+
+  relatedTarget: function(event) {
+    var element;
+    switch(event.type) {
+      case 'mouseover': element = event.fromElement; break;
+      case 'mouseout':  element = event.toElement;   break;
+      default: return null;
+    }
+    return Element.extend(element);
+  }
+});
+
+Event.Methods = (function() {
+  var isButton;
+
+  if (Prototype.Browser.IE) {
+    var buttonMap = { 0: 1, 1: 4, 2: 2 };
+    isButton = function(event, code) {
+      return event.button == buttonMap[code];
+    };
+
+  } else if (Prototype.Browser.WebKit) {
+    isButton = function(event, code) {
+      switch (code) {
+        case 0: return event.which == 1 && !event.metaKey;
+        case 1: return event.which == 1 && event.metaKey;
+        default: return false;
+      }
+    };
+
+  } else {
+    isButton = function(event, code) {
+      return event.which ? (event.which === code + 1) : (event.button === code);
+    };
+  }
+
+  return {
+    isLeftClick:   function(event) { return isButton(event, 0) },
+    isMiddleClick: function(event) { return isButton(event, 1) },
+    isRightClick:  function(event) { return isButton(event, 2) },
+
+    element: function(event) {
+      var node = Event.extend(event).target;
+      return Element.extend(node.nodeType == Node.TEXT_NODE ? node.parentNode : node);
+    },
+
+    findElement: function(event, expression) {
+      var element = Event.element(event);
+      return element.match(expression) ? element : element.up(expression);
+    },
+
+    pointer: function(event) {
+      return {
+        x: event.pageX || (event.clientX +
+          (document.documentElement.scrollLeft || document.body.scrollLeft)),
+        y: event.pageY || (event.clientY +
+          (document.documentElement.scrollTop || document.body.scrollTop))
+      };
+    },
+
+    pointerX: function(event) { return Event.pointer(event).x },
+    pointerY: function(event) { return Event.pointer(event).y },
+
+    stop: function(event) {
+      Event.extend(event);
+      event.preventDefault();
+      event.stopPropagation();
+      event.stopped = true;
+    }
+  };
+})();
+
+Event.extend = (function() {
+  var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
+    m[name] = Event.Methods[name].methodize();
+    return m;
+  });
+
+  if (Prototype.Browser.IE) {
+    Object.extend(methods, {
+      stopPropagation: function() { this.cancelBubble = true },
+      preventDefault:  function() { this.returnValue = false },
+      inspect: function() { return "[object Event]" }
+    });
+
+    return function(event) {
+      if (!event) return false;
+      if (event._extendedByPrototype) return event;
+
+      event._extendedByPrototype = Prototype.emptyFunction;
+      var pointer = Event.pointer(event);
+      Object.extend(event, {
+        target: event.srcElement,
+        relatedTarget: Event.relatedTarget(event),
+        pageX:  pointer.x,
+        pageY:  pointer.y
+      });
+      return Object.extend(event, methods);
+    };
+
+  } else {
+    Event.prototype = Event.prototype || document.createEvent("HTMLEvents").__proto__;
+    Object.extend(Event.prototype, methods);
+    return Prototype.K;
+  }
+})();
+
+Object.extend(Event, (function() {
+  var cache = Event.cache;
+
+  function getEventID(element) {
+    if (element._eventID) return element._eventID;
+    arguments.callee.id = arguments.callee.id || 1;
+    return element._eventID = ++arguments.callee.id;
+  }
+
+  function getDOMEventName(eventName) {
+    if (eventName && eventName.include(':')) return "dataavailable";
+    return eventName;
+  }
+
+  function getCacheForID(id) {
+    return cache[id] = cache[id] || { };
+  }
+
+  function getWrappersForEventName(id, eventName) {
+    var c = getCacheForID(id);
+    return c[eventName] = c[eventName] || [];
+  }
+
+  function createWrapper(element, eventName, handler) {
+    var id = getEventID(element);
+    var c = getWrappersForEventName(id, eventName);
+    if (c.pluck("handler").include(handler)) return false;
+
+    var wrapper = function(event) {
+      if (!Event || !Event.extend ||
+        (event.eventName && event.eventName != eventName))
+          return false;
+
+      Event.extend(event);
+      handler.call(element, event)
+    };
+
+    wrapper.handler = handler;
+    c.push(wrapper);
+    return wrapper;
+  }
+
+  function findWrapper(id, eventName, handler) {
+    var c = getWrappersForEventName(id, eventName);
+    return c.find(function(wrapper) { return wrapper.handler == handler });
+  }
+
+  function destroyWrapper(id, eventName, handler) {
+    var c = getCacheForID(id);
+    if (!c[eventName]) return false;
+    c[eventName] = c[eventName].without(findWrapper(id, eventName, handler));
+  }
+
+  function destroyCache() {
+    for (var id in cache)
+      for (var eventName in cache[id])
+        cache[id][eventName] = null;
+  }
 
-Form.Observer = Class.create();
-Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
-  getValue: function() {
-    return Form.serialize(this.element);
+  if (window.attachEvent) {
+    window.attachEvent("onunload", destroyCache);
   }
-});
 
-/*--------------------------------------------------------------------------*/
+  return {
+    observe: function(element, eventName, handler) {
+      element = $(element);
+      var name = getDOMEventName(eventName);
 
-Abstract.EventObserver = function() {}
-Abstract.EventObserver.prototype = {
-  initialize: function(element, callback) {
-    this.element  = $(element);
-    this.callback = callback;
+      var wrapper = createWrapper(element, eventName, handler);
+      if (!wrapper) return element;
 
-    this.lastValue = this.getValue();
-    if (this.element.tagName.toLowerCase() == 'form')
-      this.registerFormCallbacks();
-    else
-      this.registerCallback(this.element);
-  },
+      if (element.addEventListener) {
+        element.addEventListener(name, wrapper, false);
+      } else {
+        element.attachEvent("on" + name, wrapper);
+      }
 
-  onElementEvent: function() {
-    var value = this.getValue();
-    if (this.lastValue != value) {
-      this.callback(this.element, value);
-      this.lastValue = value;
-    }
-  },
+      return element;
+    },
 
-  registerFormCallbacks: function() {
-    Form.getElements(this.element).each(this.registerCallback.bind(this));
-  },
+    stopObserving: function(element, eventName, handler) {
+      element = $(element);
+      var id = getEventID(element), name = getDOMEventName(eventName);
+
+      if (!handler && eventName) {
+        getWrappersForEventName(id, eventName).each(function(wrapper) {
+          element.stopObserving(eventName, wrapper.handler);
+        });
+        return element;
 
-  registerCallback: function(element) {
-    if (element.type) {
-      switch (element.type.toLowerCase()) {
-        case 'checkbox':
-        case 'radio':
-          Event.observe(element, 'click', this.onElementEvent.bind(this));
-          break;
-        default:
-          Event.observe(element, 'change', this.onElementEvent.bind(this));
-          break;
+      } else if (!eventName) {
+        Object.keys(getCacheForID(id)).each(function(eventName) {
+          element.stopObserving(eventName);
+        });
+        return element;
       }
-    }
-  }
-}
 
-Form.Element.EventObserver = Class.create();
-Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
-  getValue: function() {
-    return Form.Element.getValue(this.element);
-  }
-});
+      var wrapper = findWrapper(id, eventName, handler);
+      if (!wrapper) return element;
 
-Form.EventObserver = Class.create();
-Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
-  getValue: function() {
-    return Form.serialize(this.element);
-  }
-});
-if (!window.Event) {
-  var Event = new Object();
-}
+      if (element.removeEventListener) {
+        element.removeEventListener(name, wrapper, false);
+      } else {
+        element.detachEvent("on" + name, wrapper);
+      }
 
-Object.extend(Event, {
-  KEY_BACKSPACE: 8,
-  KEY_TAB:       9,
-  KEY_RETURN:   13,
-  KEY_ESC:      27,
-  KEY_LEFT:     37,
-  KEY_UP:       38,
-  KEY_RIGHT:    39,
-  KEY_DOWN:     40,
-  KEY_DELETE:   46,
-  KEY_HOME:     36,
-  KEY_END:      35,
-  KEY_PAGEUP:   33,
-  KEY_PAGEDOWN: 34,
+      destroyWrapper(id, eventName, handler);
 
-  element: function(event) {
-    return event.target || event.srcElement;
-  },
+      return element;
+    },
 
-  isLeftClick: function(event) {
-    return (((event.which) && (event.which == 1)) ||
-            ((event.button) && (event.button == 1)));
-  },
+    fire: function(element, eventName, memo) {
+      element = $(element);
+      if (element == document && document.createEvent && !element.dispatchEvent)
+        element = document.documentElement;
+
+      if (document.createEvent) {
+        var event = document.createEvent("HTMLEvents");
+        event.initEvent("dataavailable", true, true);
+      } else {
+        var event = document.createEventObject();
+        event.eventType = "ondataavailable";
+      }
 
-  pointerX: function(event) {
-    return event.pageX || (event.clientX +
-      (document.documentElement.scrollLeft || document.body.scrollLeft));
-  },
+      event.eventName = eventName;
+      event.memo = memo || { };
 
-  pointerY: function(event) {
-    return event.pageY || (event.clientY +
-      (document.documentElement.scrollTop || document.body.scrollTop));
-  },
+      if (document.createEvent) {
+        element.dispatchEvent(event);
+      } else {
+        element.fireEvent(event.eventType, event);
+      }
 
-  stop: function(event) {
-    if (event.preventDefault) {
-      event.preventDefault();
-      event.stopPropagation();
-    } else {
-      event.returnValue = false;
-      event.cancelBubble = true;
+      return event;
     }
-  },
+  };
+})());
 
-  // find the first node with the given tagName, starting from the
-  // node the event was triggered on; traverses the DOM upwards
-  findElement: function(event, tagName) {
-    var element = Event.element(event);
-    while (element.parentNode && (!element.tagName ||
-        (element.tagName.toUpperCase() != tagName.toUpperCase())))
-      element = element.parentNode;
-    return element;
-  },
+Object.extend(Event, Event.Methods);
+
+Element.addMethods({
+  fire:          Event.fire,
+  observe:       Event.observe,
+  stopObserving: Event.stopObserving
+});
 
-  observers: false,
+Object.extend(document, {
+  fire:          Element.Methods.fire.methodize(),
+  observe:       Element.Methods.observe.methodize(),
+  stopObserving: Element.Methods.stopObserving.methodize()
+});
 
-  _observeAndCache: function(element, name, observer, useCapture) {
-    if (!this.observers) this.observers = [];
-    if (element.addEventListener) {
-      this.observers.push([element, name, observer, useCapture]);
-      element.addEventListener(name, observer, useCapture);
-    } else if (element.attachEvent) {
-      this.observers.push([element, name, observer, useCapture]);
-      element.attachEvent('on' + name, observer);
-    }
-  },
+(function() {
+  /* Support for the DOMContentLoaded event is based on work by Dan Webb,
+     Matthias Miller, Dean Edwards and John Resig. */
+
+  var timer, fired = false;
+
+  function fireContentLoadedEvent() {
+    if (fired) return;
+    if (timer) window.clearInterval(timer);
+    document.fire("dom:loaded");
+    fired = true;
+  }
+
+  if (document.addEventListener) {
+    if (Prototype.Browser.WebKit) {
+      timer = window.setInterval(function() {
+        if (/loaded|complete/.test(document.readyState))
+          fireContentLoadedEvent();
+      }, 0);
 
-  unloadCache: function() {
-    if (!Event.observers) return;
-    for (var i = 0, length = Event.observers.length; i < length; i++) {
-      Event.stopObserving.apply(this, Event.observers[i]);
-      Event.observers[i][0] = null;
+      Event.observe(window, "load", fireContentLoadedEvent);
+
+    } else {
+      document.addEventListener("DOMContentLoaded",
+        fireContentLoadedEvent, false);
     }
-    Event.observers = false;
-  },
 
-  observe: function(element, name, observer, useCapture) {
-    element = $(element);
-    useCapture = useCapture || false;
+  } else {
+    document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>");
+    $("__onDOMContentLoaded").onreadystatechange = function() {
+      if (this.readyState == "complete") {
+        this.onreadystatechange = null;
+        fireContentLoadedEvent();
+      }
+    };
+  }
+})();
+/*------------------------------- DEPRECATED -------------------------------*/
 
-    if (name == 'keypress' &&
-        (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
-        || element.attachEvent))
-      name = 'keydown';
+Hash.toQueryString = Object.toQueryString;
 
-    Event._observeAndCache(element, name, observer, useCapture);
+var Toggle = { display: Element.toggle };
+
+Element.Methods.childOf = Element.Methods.descendantOf;
+
+var Insertion = {
+  Before: function(element, content) {
+    return Element.insert(element, {before:content});
   },
 
-  stopObserving: function(element, name, observer, useCapture) {
-    element = $(element);
-    useCapture = useCapture || false;
+  Top: function(element, content) {
+    return Element.insert(element, {top:content});
+  },
 
-    if (name == 'keypress' &&
-        (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
-        || element.detachEvent))
-      name = 'keydown';
+  Bottom: function(element, content) {
+    return Element.insert(element, {bottom:content});
+  },
 
-    if (element.removeEventListener) {
-      element.removeEventListener(name, observer, useCapture);
-    } else if (element.detachEvent) {
-      try {
-        element.detachEvent('on' + name, observer);
-      } catch (e) {}
-    }
+  After: function(element, content) {
+    return Element.insert(element, {after:content});
   }
-});
+};
+
+var $continue = new Error('"throw $continue" is deprecated, use "return" instead');
 
-/* prevent memory leaks in IE */
-if (navigator.appVersion.match(/\bMSIE\b/))
-  Event.observe(window, 'unload', Event.unloadCache, false);
+// This should be moved to script.aculo.us; notice the deprecated methods
+// further below, that map to the newer Element methods.
 var Position = {
   // set to true if needed, warning: firefox performance problems
   // NOT neeeded for page scrolling, only if draggable contained in
@@ -2307,59 +4043,13 @@
                 || 0;
   },
 
-  realOffset: function(element) {
-    var valueT = 0, valueL = 0;
-    do {
-      valueT += element.scrollTop  || 0;
-      valueL += element.scrollLeft || 0;
-      element = element.parentNode;
-    } while (element);
-    return [valueL, valueT];
-  },
-
-  cumulativeOffset: function(element) {
-    var valueT = 0, valueL = 0;
-    do {
-      valueT += element.offsetTop  || 0;
-      valueL += element.offsetLeft || 0;
-      element = element.offsetParent;
-    } while (element);
-    return [valueL, valueT];
-  },
-
-  positionedOffset: function(element) {
-    var valueT = 0, valueL = 0;
-    do {
-      valueT += element.offsetTop  || 0;
-      valueL += element.offsetLeft || 0;
-      element = element.offsetParent;
-      if (element) {
-        if(element.tagName=='BODY') break;
-        var p = Element.getStyle(element, 'position');
-        if (p == 'relative' || p == 'absolute') break;
-      }
-    } while (element);
-    return [valueL, valueT];
-  },
-
-  offsetParent: function(element) {
-    if (element.offsetParent) return element.offsetParent;
-    if (element == document.body) return element;
-
-    while ((element = element.parentNode) && element != document.body)
-      if (Element.getStyle(element, 'position') != 'static')
-        return element;
-
-    return document.body;
-  },
-
   // caches x/y coordinate pair to use with overlap
   within: function(element, x, y) {
     if (this.includeScrollOffsets)
       return this.withinIncludingScrolloffsets(element, x, y);
     this.xcomp = x;
     this.ycomp = y;
-    this.offset = this.cumulativeOffset(element);
+    this.offset = Element.cumulativeOffset(element);
 
     return (y >= this.offset[1] &&
             y <  this.offset[1] + element.offsetHeight &&
@@ -2368,11 +4058,11 @@
   },
 
   withinIncludingScrolloffsets: function(element, x, y) {
-    var offsetcache = this.realOffset(element);
+    var offsetcache = Element.cumulativeScrollOffset(element);
 
     this.xcomp = x + offsetcache[0] - this.deltaX;
     this.ycomp = y + offsetcache[1] - this.deltaY;
-    this.offset = this.cumulativeOffset(element);
+    this.offset = Element.cumulativeOffset(element);
 
     return (this.ycomp >= this.offset[1] &&
             this.ycomp <  this.offset[1] + element.offsetHeight &&
@@ -2391,125 +4081,104 @@
         element.offsetWidth;
   },
 
-  page: function(forElement) {
-    var valueT = 0, valueL = 0;
-
-    var element = forElement;
-    do {
-      valueT += element.offsetTop  || 0;
-      valueL += element.offsetLeft || 0;
+  // Deprecation layer -- use newer Element methods now (1.5.2).
 
-      // Safari fix
-      if (element.offsetParent==document.body)
-        if (Element.getStyle(element,'position')=='absolute') break;
+  cumulativeOffset: Element.Methods.cumulativeOffset,
 
-    } while (element = element.offsetParent);
+  positionedOffset: Element.Methods.positionedOffset,
 
-    element = forElement;
-    do {
-      if (!window.opera || element.tagName=='BODY') {
-        valueT -= element.scrollTop  || 0;
-        valueL -= element.scrollLeft || 0;
-      }
-    } while (element = element.parentNode);
+  absolutize: function(element) {
+    Position.prepare();
+    return Element.absolutize(element);
+  },
 
-    return [valueL, valueT];
+  relativize: function(element) {
+    Position.prepare();
+    return Element.relativize(element);
   },
 
-  clone: function(source, target) {
-    var options = Object.extend({
-      setLeft:    true,
-      setTop:     true,
-      setWidth:   true,
-      setHeight:  true,
-      offsetTop:  0,
-      offsetLeft: 0
-    }, arguments[2] || {})
+  realOffset: Element.Methods.cumulativeScrollOffset,
 
-    // find page position of source
-    source = $(source);
-    var p = Position.page(source);
+  offsetParent: Element.Methods.getOffsetParent,
 
-    // find coordinate system to use
-    target = $(target);
-    var delta = [0, 0];
-    var parent = null;
-    // delta [0,0] will do fine with position: fixed elements,
-    // position:absolute needs offsetParent deltas
-    if (Element.getStyle(target,'position') == 'absolute') {
-      parent = Position.offsetParent(target);
-      delta = Position.page(parent);
-    }
+  page: Element.Methods.viewportOffset,
 
-    // correct by body offsets (fixes Safari)
-    if (parent == document.body) {
-      delta[0] -= document.body.offsetLeft;
-      delta[1] -= document.body.offsetTop;
+  clone: function(source, target, options) {
+    options = options || { };
+    return Element.clonePosition(target, source, options);
+  }
+};
+
+/*--------------------------------------------------------------------------*/
+
+if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){
+  function iter(name) {
+    return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]";
+  }
+
+  instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ?
+  function(element, className) {
+    className = className.toString().strip();
+    var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className);
+    return cond ? document._getElementsByXPath('.//*' + cond, element) : [];
+  } : function(element, className) {
+    className = className.toString().strip();
+    var elements = [], classNames = (/\s/.test(className) ? $w(className) : null);
+    if (!classNames && !className) return elements;
+
+    var nodes = $(element).getElementsByTagName('*');
+    className = ' ' + className + ' ';
+
+    for (var i = 0, child, cn; child = nodes[i]; i++) {
+      if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) ||
+          (classNames && classNames.all(function(name) {
+            return !name.toString().blank() && cn.include(' ' + name + ' ');
+          }))))
+        elements.push(Element.extend(child));
     }
+    return elements;
+  };
 
-    // set position
-    if(options.setLeft)   target.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
-    if(options.setTop)    target.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
-    if(options.setWidth)  target.style.width = source.offsetWidth + 'px';
-    if(options.setHeight) target.style.height = source.offsetHeight + 'px';
-  },
+  return function(className, parentElement) {
+    return $(parentElement || document.body).getElementsByClassName(className);
+  };
+}(Element.Methods);
 
-  absolutize: function(element) {
-    element = $(element);
-    if (element.style.position == 'absolute') return;
-    Position.prepare();
+/*--------------------------------------------------------------------------*/
 
-    var offsets = Position.positionedOffset(element);
-    var top     = offsets[1];
-    var left    = offsets[0];
-    var width   = element.clientWidth;
-    var height  = element.clientHeight;
+Element.ClassNames = Class.create();
+Element.ClassNames.prototype = {
+  initialize: function(element) {
+    this.element = $(element);
+  },
 
-    element._originalLeft   = left - parseFloat(element.style.left  || 0);
-    element._originalTop    = top  - parseFloat(element.style.top || 0);
-    element._originalWidth  = element.style.width;
-    element._originalHeight = element.style.height;
+  _each: function(iterator) {
+    this.element.className.split(/\s+/).select(function(name) {
+      return name.length > 0;
+    })._each(iterator);
+  },
 
-    element.style.position = 'absolute';
-    element.style.top    = top + 'px';
-    element.style.left   = left + 'px';
-    element.style.width  = width + 'px';
-    element.style.height = height + 'px';
+  set: function(className) {
+    this.element.className = className;
   },
 
-  relativize: function(element) {
-    element = $(element);
-    if (element.style.position == 'relative') return;
-    Position.prepare();
+  add: function(classNameToAdd) {
+    if (this.include(classNameToAdd)) return;
+    this.set($A(this).concat(classNameToAdd).join(' '));
+  },
 
-    element.style.position = 'relative';
-    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
-    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
+  remove: function(classNameToRemove) {
+    if (!this.include(classNameToRemove)) return;
+    this.set($A(this).without(classNameToRemove).join(' '));
+  },
 
-    element.style.top    = top + 'px';
-    element.style.left   = left + 'px';
-    element.style.height = element._originalHeight;
-    element.style.width  = element._originalWidth;
+  toString: function() {
+    return $A(this).join(' ');
   }
-}
-
-// Safari returns margins on body which is incorrect if the child is absolutely
-// positioned.  For performance reasons, redefine Position.cumulativeOffset for
-// KHTML/WebKit only.
-if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
-  Position.cumulativeOffset = function(element) {
-    var valueT = 0, valueL = 0;
-    do {
-      valueT += element.offsetTop  || 0;
-      valueL += element.offsetLeft || 0;
-      if (element.offsetParent == document.body)
-        if (Element.getStyle(element, 'position') == 'absolute') break;
+};
 
-      element = element.offsetParent;
-    } while (element);
+Object.extend(Element.ClassNames.prototype, Enumerable);
 
-    return [valueL, valueT];
-  }
-}
+/*--------------------------------------------------------------------------*/
 
 Element.addMethods();
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/scriptaculous/scriptaculous.js 2.5.src/wp-includes/js/scriptaculous/scriptaculous.js
--- 2.2.2.src/wp-includes/js/scriptaculous/scriptaculous.js	2007-01-25 21:41:17.000000000 -0600
+++ 2.5.src/wp-includes/js/scriptaculous/scriptaculous.js	2008-03-02 15:34:25.000000000 -0600
@@ -1,6 +1,6 @@
-// script.aculo.us scriptaculous.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
+// script.aculo.us scriptaculous.js v1.8.0, Tue Nov 06 15:01:40 +0300 2007
 
-// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
 // 
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -24,25 +24,32 @@
 // For details, see the script.aculo.us web site: http://script.aculo.us/
 
 var Scriptaculous = {
-  Version: '1.7.0',
+  Version: '1.8.0',
   require: function(libraryName) {
     // inserting via DOM fails in Safari 2.0, so brute force approach
-    document.write('<script type="text/javascript" src="'+libraryName+'"></script>');
+    document.write('<script type="text/javascript" src="'+libraryName+'"><\/script>');
   },
+  REQUIRED_PROTOTYPE: '1.6.0',
   load: function() {
+    function convertVersionString(versionString){
+      var r = versionString.split('.');
+      return parseInt(r[0])*100000 + parseInt(r[1])*1000 + parseInt(r[2]);
+    }
+ 
     if((typeof Prototype=='undefined') || 
        (typeof Element == 'undefined') || 
        (typeof Element.Methods=='undefined') ||
-       parseFloat(Prototype.Version.split(".")[0] + "." +
-                  Prototype.Version.split(".")[1]) < 1.5)
-       throw("script.aculo.us requires the Prototype JavaScript framework >= 1.5.0");
+       (convertVersionString(Prototype.Version) < 
+        convertVersionString(Scriptaculous.REQUIRED_PROTOTYPE)))
+       throw("script.aculo.us requires the Prototype JavaScript framework >= " +
+        Scriptaculous.REQUIRED_PROTOTYPE);
     
     $A(document.getElementsByTagName("script")).findAll( function(s) {
       return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/))
     }).each( function(s) {
       var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,'');
       var includes = s.src.match(/\?.*load=([a-z,]*)/);
-      (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider').split(',').each(
+      (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider,sound').split(',').each(
        function(include) { Scriptaculous.require(path+include+'.js') });
     });
   }
diff -x .svn -aruN 2.2.2.src/wp-includes/js/scriptaculous/slider.js 2.5.src/wp-includes/js/scriptaculous/slider.js
--- 2.2.2.src/wp-includes/js/scriptaculous/slider.js	2007-01-25 21:41:17.000000000 -0600
+++ 2.5.src/wp-includes/js/scriptaculous/slider.js	2008-03-02 15:34:25.000000000 -0600
@@ -1,12 +1,11 @@
-// script.aculo.us slider.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
+// script.aculo.us slider.js v1.8.0, Tue Nov 06 15:01:40 +0300 2007
 
-// Copyright (c) 2005, 2006 Marty Haught, Thomas Fuchs 
+// Copyright (c) 2005-2007 Marty Haught, Thomas Fuchs 
 //
 // script.aculo.us is freely distributable under the terms of an MIT-style license.
 // For details, see the script.aculo.us web site: http://script.aculo.us/
 
-if(!Control) var Control = {};
-Control.Slider = Class.create();
+if (!Control) var Control = { };
 
 // options:
 //  axis: 'vertical', or 'horizontal' (default)
@@ -14,18 +13,18 @@
 // callbacks:
 //  onChange(value)
 //  onSlide(value)
-Control.Slider.prototype = {
+Control.Slider = Class.create({
   initialize: function(handle, track, options) {
     var slider = this;
     
-    if(handle instanceof Array) {
+    if (Object.isArray(handle)) {
       this.handles = handle.collect( function(e) { return $(e) });
     } else {
       this.handles = [$(handle)];
     }
     
     this.track   = $(track);
-    this.options = options || {};
+    this.options = options || { };
 
     this.axis      = this.options.axis || 'horizontal';
     this.increment = this.options.increment || 1;
@@ -59,11 +58,11 @@
     this.dragging = false;
     this.disabled = false;
 
-    if(this.options.disabled) this.setDisabled();
+    if (this.options.disabled) this.setDisabled();
 
     // Allowed values array
     this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;
-    if(this.allowedValues) {
+    if (this.allowedValues) {
       this.minimum = this.allowedValues.min();
       this.maximum = this.allowedValues.max();
     }
@@ -76,16 +75,15 @@
     this.handles.each( function(h,i) {
       i = slider.handles.length-1-i;
       slider.setValue(parseFloat(
-        (slider.options.sliderValue instanceof Array ? 
+        (Object.isArray(slider.options.sliderValue) ? 
           slider.options.sliderValue[i] : slider.options.sliderValue) || 
          slider.range.start), i);
-      Element.makePositioned(h); // fix IE
-      Event.observe(h, "mousedown", slider.eventMouseDown);
+      h.makePositioned().observe("mousedown", slider.eventMouseDown);
     });
     
-    Event.observe(this.track, "mousedown", this.eventMouseDown);
-    Event.observe(document, "mouseup", this.eventMouseUp);
-    Event.observe(document, "mousemove", this.eventMouseMove);
+    this.track.observe("mousedown", this.eventMouseDown);
+    document.observe("mouseup", this.eventMouseUp);
+    document.observe("mousemove", this.eventMouseMove);
     
     this.initialized = true;
   },
@@ -105,36 +103,36 @@
     this.disabled = false;
   },  
   getNearestValue: function(value){
-    if(this.allowedValues){
-      if(value >= this.allowedValues.max()) return(this.allowedValues.max());
-      if(value <= this.allowedValues.min()) return(this.allowedValues.min());
+    if (this.allowedValues){
+      if (value >= this.allowedValues.max()) return(this.allowedValues.max());
+      if (value <= this.allowedValues.min()) return(this.allowedValues.min());
       
       var offset = Math.abs(this.allowedValues[0] - value);
       var newValue = this.allowedValues[0];
       this.allowedValues.each( function(v) {
         var currentOffset = Math.abs(v - value);
-        if(currentOffset <= offset){
+        if (currentOffset <= offset){
           newValue = v;
           offset = currentOffset;
         } 
       });
       return newValue;
     }
-    if(value > this.range.end) return this.range.end;
-    if(value < this.range.start) return this.range.start;
+    if (value > this.range.end) return this.range.end;
+    if (value < this.range.start) return this.range.start;
     return value;
   },
   setValue: function(sliderValue, handleIdx){
-    if(!this.active) {
+    if (!this.active) {
       this.activeHandleIdx = handleIdx || 0;
       this.activeHandle    = this.handles[this.activeHandleIdx];
       this.updateStyles();
     }
     handleIdx = handleIdx || this.activeHandleIdx || 0;
-    if(this.initialized && this.restricted) {
-      if((handleIdx>0) && (sliderValue<this.values[handleIdx-1]))
+    if (this.initialized && this.restricted) {
+      if ((handleIdx>0) && (sliderValue<this.values[handleIdx-1]))
         sliderValue = this.values[handleIdx-1];
-      if((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1]))
+      if ((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1]))
         sliderValue = this.values[handleIdx+1];
     }
     sliderValue = this.getNearestValue(sliderValue);
@@ -145,7 +143,7 @@
       this.translateToPx(sliderValue);
     
     this.drawSpans();
-    if(!this.dragging || !this.event) this.updateFinished();
+    if (!this.dragging || !this.event) this.updateFinished();
   },
   setValueBy: function(delta, handleIdx) {
     this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta, 
@@ -173,24 +171,24 @@
       (this.track.offsetHeight != 0 ? this.track.offsetHeight :
         this.track.style.height.replace(/px$/,"")) - this.alignY : 
       (this.track.offsetWidth != 0 ? this.track.offsetWidth : 
-        this.track.style.width.replace(/px$/,"")) - this.alignY);
+        this.track.style.width.replace(/px$/,"")) - this.alignX);
   },  
   isVertical:  function(){
     return (this.axis == 'vertical');
   },
   drawSpans: function() {
     var slider = this;
-    if(this.spans)
+    if (this.spans)
       $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) });
-    if(this.options.startSpan)
+    if (this.options.startSpan)
       this.setSpan(this.options.startSpan,
         $R(0, this.values.length>1 ? this.getRange(0).min() : this.value ));
-    if(this.options.endSpan)
+    if (this.options.endSpan)
       this.setSpan(this.options.endSpan, 
         $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum));
   },
   setSpan: function(span, range) {
-    if(this.isVertical()) {
+    if (this.isVertical()) {
       span.style.top = this.translateToPx(range.start);
       span.style.height = this.translateToPx(range.end - range.start + this.range.start);
     } else {
@@ -203,14 +201,14 @@
     Element.addClassName(this.activeHandle, 'selected');
   },
   startDrag: function(event) {
-    if(Event.isLeftClick(event)) {
-      if(!this.disabled){
+    if (Event.isLeftClick(event)) {
+      if (!this.disabled){
         this.active = true;
         
         var handle = Event.element(event);
         var pointer  = [Event.pointerX(event), Event.pointerY(event)];
         var track = handle;
-        if(track==this.track) {
+        if (track==this.track) {
           var offsets  = Position.cumulativeOffset(this.track); 
           this.event = event;
           this.setValue(this.translateToValue( 
@@ -224,7 +222,7 @@
           while((this.handles.indexOf(handle) == -1) && handle.parentNode) 
             handle = handle.parentNode;
             
-          if(this.handles.indexOf(handle)!=-1) {
+          if (this.handles.indexOf(handle)!=-1) {
             this.activeHandle    = handle;
             this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
             this.updateStyles();
@@ -239,11 +237,10 @@
     }
   },
   update: function(event) {
-   if(this.active) {
-      if(!this.dragging) this.dragging = true;
+   if (this.active) {
+      if (!this.dragging) this.dragging = true;
       this.draw(event);
-      // fix AppleWebKit rendering
-      if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
+      if (Prototype.Browser.WebKit) window.scrollBy(0,0);
       Event.stop(event);
    }
   },
@@ -254,11 +251,11 @@
     pointer[1] -= this.offsetY + offsets[1];
     this.event = event;
     this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] ));
-    if(this.initialized && this.options.onSlide)
+    if (this.initialized && this.options.onSlide)
       this.options.onSlide(this.values.length>1 ? this.values : this.value, this);
   },
   endDrag: function(event) {
-    if(this.active && this.dragging) {
+    if (this.active && this.dragging) {
       this.finishDrag(event, true);
       Event.stop(event);
     }
@@ -271,8 +268,8 @@
     this.updateFinished();
   },
   updateFinished: function() {
-    if(this.initialized && this.options.onChange) 
+    if (this.initialized && this.options.onChange) 
       this.options.onChange(this.values.length>1 ? this.values : this.value, this);
     this.event = null;
   }
-}
\ No newline at end of file
+});
diff -x .svn -aruN 2.2.2.src/wp-includes/js/scriptaculous/sound.js 2.5.src/wp-includes/js/scriptaculous/sound.js
--- 2.2.2.src/wp-includes/js/scriptaculous/sound.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/scriptaculous/sound.js	2008-03-02 15:34:25.000000000 -0600
@@ -0,0 +1,55 @@
+// script.aculo.us sound.js v1.8.0, Tue Nov 06 15:01:40 +0300 2007
+
+// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//
+// Based on code created by Jules Gravinese (http://www.webveteran.com/)
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+Sound = {
+  tracks: {},
+  _enabled: true,
+  template:
+    new Template('<embed style="height:0" id="sound_#{track}_#{id}" src="#{url}" loop="false" autostart="true" hidden="true"/>'),
+  enable: function(){
+    Sound._enabled = true;
+  },
+  disable: function(){
+    Sound._enabled = false;
+  },
+  play: function(url){
+    if(!Sound._enabled) return;
+    var options = Object.extend({
+      track: 'global', url: url, replace: false
+    }, arguments[1] || {});
+    
+    if(options.replace && this.tracks[options.track]) {
+      $R(0, this.tracks[options.track].id).each(function(id){
+        var sound = $('sound_'+options.track+'_'+id);
+        sound.Stop && sound.Stop();
+        sound.remove();
+      })
+      this.tracks[options.track] = null;
+    }
+      
+    if(!this.tracks[options.track])
+      this.tracks[options.track] = { id: 0 }
+    else
+      this.tracks[options.track].id++;
+      
+    options.id = this.tracks[options.track].id;
+    $$('body')[0].insert( 
+      Prototype.Browser.IE ? new Element('bgsound',{
+        id: 'sound_'+options.track+'_'+options.id,
+        src: options.url, loop: 1, autostart: true
+      }) : Sound.template.evaluate(options));
+  }
+};
+
+if(Prototype.Browser.Gecko && navigator.userAgent.indexOf("Win") > 0){
+  if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('QuickTime') != -1 }))
+    Sound.template = new Template('<object id="sound_#{track}_#{id}" width="0" height="0" type="audio/mpeg" data="#{url}"/>')
+  else
+    Sound.play = function(){}
+}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/scriptaculous/unittest.js 2.5.src/wp-includes/js/scriptaculous/unittest.js
--- 2.2.2.src/wp-includes/js/scriptaculous/unittest.js	2007-01-25 21:41:17.000000000 -0600
+++ 2.5.src/wp-includes/js/scriptaculous/unittest.js	2008-03-02 15:34:25.000000000 -0600
@@ -1,8 +1,8 @@
-// script.aculo.us unittest.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
+// script.aculo.us unittest.js v1.8.0, Tue Nov 06 15:01:40 +0300 2007
 
-// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//           (c) 2005, 2006 Jon Tirsen (http://www.tirsen.com)
-//           (c) 2005, 2006 Michael Schuerig (http://www.schuerig.de/michael/)
+// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//           (c) 2005-2007 Jon Tirsen (http://www.tirsen.com)
+//           (c) 2005-2007 Michael Schuerig (http://www.schuerig.de/michael/)
 //
 // script.aculo.us is freely distributable under the terms of an MIT-style license.
 // For details, see the script.aculo.us web site: http://script.aculo.us/
@@ -524,15 +524,19 @@
     shouldNotBe:     'assertReturnsFalse',
     shouldRespondTo: 'assertRespondsTo'
   };
-  Test.BDDMethods = {};
-  for(m in METHODMAP) {
-    Test.BDDMethods[m] = eval(
-      'function(){'+
-      'var args = $A(arguments);'+
-      'var scope = args.shift();'+
-      'scope.'+METHODMAP[m]+'.apply(scope,(args || []).concat([this])); }');
+  var makeAssertion = function(assertion, args, object) { 
+   	this[assertion].apply(this,(args || []).concat([object]));
   }
-  [Array.prototype, String.prototype, Number.prototype].each(
+  
+  Test.BDDMethods = {};   
+  $H(METHODMAP).each(function(pair) { 
+    Test.BDDMethods[pair.key] = function() { 
+       var args = $A(arguments); 
+       var scope = args.shift(); 
+       makeAssertion.apply(scope, [pair.value, args, this]); }; 
+  });
+  
+  [Array.prototype, String.prototype, Number.prototype, Boolean.prototype].each(
     function(p){ Object.extend(p, Test.BDDMethods) }
   );
 }
diff -x .svn -aruN 2.2.2.src/wp-includes/js/scriptaculous/wp-scriptaculous.js 2.5.src/wp-includes/js/scriptaculous/wp-scriptaculous.js
--- 2.2.2.src/wp-includes/js/scriptaculous/wp-scriptaculous.js	2007-01-25 21:41:17.000000000 -0600
+++ 2.5.src/wp-includes/js/scriptaculous/wp-scriptaculous.js	2008-03-02 15:34:25.000000000 -0600
@@ -1,4 +1,6 @@
-// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// script.aculo.us scriptaculous.js v1.7.1_beta3, Fri May 25 17:19:41 +0200 2007
+
+// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
 // 
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -10,20 +12,37 @@
 // 
 // 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 AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// For details, see the script.aculo.us web site: http://script.aculo.us/
 
 var Scriptaculous = {
-  Version: '1.7.0',
+  Version: '1.8.0',
   require: function(libraryName) {
     // inserting via DOM fails in Safari 2.0, so brute force approach
     document.write('<script type="text/javascript" src="'+libraryName+'"></script>');
   },
+  REQUIRED_PROTOTYPE: '1.6',
   load: function() {
+    function convertVersionString(versionString){
+      var r = versionString.split('.');
+      return parseInt(r[0])*100000 + parseInt(r[1])*1000 + parseInt(r[2]);
+    }
+ 
     if((typeof Prototype=='undefined') || 
        (typeof Element == 'undefined') || 
        (typeof Element.Methods=='undefined') ||
-       parseFloat(Prototype.Version.split(".")[0] + "." +
-                  Prototype.Version.split(".")[1]) < 1.5)
-       throw("script.aculo.us requires the Prototype JavaScript framework >= 1.5.0");
+       (convertVersionString(Prototype.Version) < 
+        convertVersionString(Scriptaculous.REQUIRED_PROTOTYPE)))
+       throw("script.aculo.us requires the Prototype JavaScript framework >= " +
+        Scriptaculous.REQUIRED_PROTOTYPE);
     
     $A(document.getElementsByTagName("script")).findAll( function(s) {
       return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/))
diff -x .svn -aruN 2.2.2.src/wp-includes/js/swfupload/handlers.js 2.5.src/wp-includes/js/swfupload/handlers.js
--- 2.2.2.src/wp-includes/js/swfupload/handlers.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/swfupload/handlers.js	2008-03-21 18:21:27.000000000 -0500
@@ -0,0 +1,225 @@
+function fileDialogStart() {
+	jQuery("#media-upload-error").empty();
+}
+
+// progress and success handlers for media multi uploads
+function fileQueued(fileObj) {
+	// Get rid of unused form
+	jQuery('.media-blank').remove();
+	// Collapse a single item
+	if ( jQuery('.type-form #media-items>*').length == 1 && jQuery('#media-items .hidden').length > 0 ) {
+		jQuery('.toggle').toggle();
+		jQuery('.slidetoggle').slideUp(200).siblings().removeClass('hidden');
+	}
+	// Create a progress bar containing the filename
+	jQuery('#media-items').append('<div id="media-item-' + fileObj.id + '" class="media-item child-of-' + post_id + '"><div class="filename original">' + fileObj.name + '</div><div class="progress"><div class="bar"></div></div></div>');
+
+	// Disable the submit button
+	jQuery('#insert-gallery').attr('disabled', 'disabled');
+}
+
+function uploadStart(fileObj) { return true; }
+
+function uploadProgress(fileObj, bytesDone, bytesTotal) {
+	// Lengthen the progress bar
+	jQuery('#media-item-' + fileObj.id + ' .bar').width(620*bytesDone/bytesTotal);
+
+	if ( bytesDone== bytesTotal )
+		jQuery('#media-item-' + fileObj.id + ' .bar').html('<strong style="display: block; padding-top: 9px; padding-left: 1em;">' + swfuploadL10n.crunching + '</strong>');
+}
+
+function prepareMediaItem(fileObj, serverData) {
+	// Move the progress bar to 100%
+	jQuery('#media-item-' + fileObj.id + ' .bar').remove();
+
+	// Append the HTML returned by the server -- thumbnail and form inputs
+	jQuery('#media-item-' + fileObj.id).append(serverData);
+
+	// Clone the thumbnail as a "pinkynail" -- a tiny image to the left of the filename
+	jQuery('#media-item-' + fileObj.id + ' .thumbnail').clone().attr('className', 'pinkynail toggle').prependTo('#media-item-' + fileObj.id);
+
+	// Replace the original filename with the new (unique) one assigned during upload
+	jQuery('#media-item-' + fileObj.id + ' .filename.original').replaceWith(jQuery('#media-item-' + fileObj.id + ' .filename.new'));
+
+	// Bind toggle function to a new mask over the progress bar area
+	jQuery('#media-item-' + fileObj.id + ' .progress').clone().empty().addClass('clickmask').bind('click', function(){jQuery(this).siblings('.slidetoggle').slideToggle(150);jQuery(this).siblings('.toggle').toggle();}).appendTo('#media-item-' + fileObj.id);
+
+	// Also bind toggle to the links
+	jQuery('#media-item-' + fileObj.id + ' a.toggle').bind('click', function(){jQuery(this).siblings('.slidetoggle').slideToggle(150);jQuery(this).parent().eq(0).children('.toggle').toggle();jQuery(this).siblings('a.toggle').focus();return false;});
+
+	// Bind AJAX to the new Delete button
+	jQuery('#media-item-' + fileObj.id + ' a.delete').bind('click',function(){
+		// Tell the server to delete it. TODO: handle exceptions
+		jQuery.ajax({url:'admin-ajax.php',type:'post',success:deleteSuccess,error:deleteError,id:fileObj.id,data:{
+			id : this.id.replace(/[^0-9]/g,''),
+			action : 'delete-post',
+			_ajax_nonce : this.href.replace(/^.*wpnonce=/,'')}
+			});
+		return false;
+	});
+
+	// Open this item if it says to start open (e.g. to display an error)
+	jQuery('#media-item-' + fileObj.id + '.startopen')
+		.removeClass('startopen')
+		.slideToggle(500)
+		.parent().eq(0).children('.toggle').toggle();
+}
+
+function itemAjaxError(id, html) {
+	var error = jQuery('#media-item-error' + id);
+
+	error.html('<div class="file-error"><button type="button" id="dismiss-'+id+'" class="button dismiss">'+swfuploadL10n.dismiss+'</button>'+html+'</div>');
+	jQuery('#dismiss-'+id).click(function(){jQuery(this).parents('.file-error').slideUp(200, function(){jQuery(this).empty();})});
+}
+
+function deleteSuccess(data, textStatus) {
+	if ( data == '-1' )
+		return itemAjaxError(this.id, 'You do not have permission. Has your session expired?');
+	if ( data == '0' )
+		return itemAjaxError(this.id, 'Could not be deleted. Has it been deleted already?');
+
+	var item = jQuery('#media-item-' + this.id);
+
+	// Decrement the counters.
+	if ( type = jQuery('#type-of-' + this.id).val() )
+		jQuery('#' + type + '-counter').text(jQuery('#' + type + '-counter').text()-1);
+	if ( item.hasClass('child-of-'+post_id) )
+		jQuery('#attachments-count').text(jQuery('#attachments-count').text()-1);
+
+	if ( jQuery('.type-form #media-items>*').length == 1 && jQuery('#media-items .hidden').length > 0 ) {
+		jQuery('.toggle').toggle();
+		jQuery('.slidetoggle').slideUp(200).siblings().removeClass('hidden');
+	}
+
+	// Vanish it.
+	jQuery('#media-item-' + this.id + ' .filename:empty').remove();
+	jQuery('#media-item-' + this.id + ' .filename').append(' <span class="file-error">'+swfuploadL10n.deleted+'</span>').siblings('a.toggle').remove();
+	jQuery('#media-item-' + this.id).children('.describe').css({backgroundColor:'#fff'}).end()
+			.animate({backgroundColor:'#ffc0c0'}, {queue:false,duration:50})
+			.animate({minHeight:0,height:36,}, 400, null, function(){jQuery(this).children('.describe').remove()})
+			.animate({backgroundColor:'#fff'}, 400)
+			.animate({height:0}, 800, null, function(){jQuery(this).remove();updateMediaForm();});
+
+	return;
+}
+
+function deleteError(X, textStatus, errorThrown) {
+	// TODO
+}
+
+function updateMediaForm() {
+	// Just one file, no need for collapsible part
+	if ( jQuery('.type-form #media-items>*').length == 1 ) {
+		jQuery('#media-items .slidetoggle').slideDown(500).parent().eq(0).children('.toggle').toggle();
+		jQuery('.type-form .slidetoggle').siblings().addClass('hidden');
+	}
+
+	// Only show Save buttons when there is at least one file.
+	if ( jQuery('#media-items>*').not('.media-blank').length > 0 )
+		jQuery('.savebutton').show();
+	else
+		jQuery('.savebutton').hide();
+
+	// Only show Gallery button when there are at least two files.
+	if ( jQuery('#media-items>*').length > 1 )
+		jQuery('.insert-gallery').show();
+	else
+		jQuery('.insert-gallery').hide();
+}
+
+function uploadSuccess(fileObj, serverData) {
+	// if async-upload returned an error message, place it in the media item div and return
+	if ( serverData.match('media-upload-error') ) {
+		jQuery('#media-item-' + fileObj.id).html(serverData);
+		return;
+	}
+
+	prepareMediaItem(fileObj, serverData);
+	updateMediaForm();
+
+	// Increment the counter.
+	if ( jQuery('#media-item-' + fileObj.id).hasClass('child-of-' + post_id) )
+		jQuery('#attachments-count').text(1 * jQuery('#attachments-count').text() + 1);
+}
+
+function uploadComplete(fileObj) {
+	// If no more uploads queued, enable the submit button
+	if ( swfu.getStats().files_queued == 0 )
+		jQuery('#insert-gallery').attr('disabled', '');
+}
+
+
+// wp-specific error handlers
+
+// generic message
+function wpQueueError(message) {
+	jQuery('#media-upload-error').show().text(message);
+}
+
+// file-specific message
+function wpFileError(fileObj, message) {
+	jQuery('#media-item-' + fileObj.id + ' .filename').after('<div class="file-error"><button type="button" id="dismiss-' + fileObj.id + '" class="button dismiss">'+swfuploadL10n.dismiss+'</button>'+message+'</div>').siblings('.toggle').remove();
+	jQuery('#dismiss-' + fileObj.id).click(function(){jQuery(this).parents('.media-item').slideUp(200, function(){jQuery(this).remove();})});
+}
+
+function fileQueueError(fileObj, error_code, message)  {
+	// Handle this error separately because we don't want to create a FileProgress element for it.
+	if ( error_code == SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED ) {
+		wpQueueError(swfuploadL10n.queue_limit_exceeded);
+	}
+	else if ( error_code == SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT ) {
+		fileQueued(fileObj);
+		wpFileError(fileObj, swfuploadL10n.file_exceeds_size_limit);
+	}
+	else if ( error_code == SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE ) {
+		fileQueued(fileObj);
+		wpFileError(fileObj, swfuploadL10n.zero_byte_file);
+	}
+	else if ( error_code == SWFUpload.QUEUE_ERROR.INVALID_FILETYPE ) {
+		fileQueued(fileObj);
+		wpFileError(fileObj, swfuploadL10n.invalid_filetype);
+	}
+	else {
+		wpQueueError(swfuploadL10n.default_error);
+	}
+}
+
+function fileDialogComplete(num_files_queued) {
+	try {
+		if (num_files_queued > 0) {
+			this.startUpload();
+		}
+	} catch (ex) {
+		this.debug(ex);
+	}
+}
+
+function uploadError(fileObj, error_code, message) {
+	// first the file specific error
+	if ( error_code == SWFUpload.UPLOAD_ERROR.MISSING_UPLOAD_URL ) {
+		wpFileError(fileObj, swfuploadL10n.missing_upload_url);
+	}
+	else if ( error_code == SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED ) {
+		wpFileError(fileObj, swfuploadL10n.upload_limit_exceeded);
+	}
+	else {
+		wpFileError(fileObj, swfuploadL10n.default_error);
+	}
+
+	// now the general upload status
+	if ( error_code == SWFUpload.UPLOAD_ERROR.HTTP_ERROR ) {
+		wpQueueError(swfuploadL10n.http_error);
+	}
+	else if ( error_code == SWFUpload.UPLOAD_ERROR.UPLOAD_FAILED ) {
+		wpQueueError(swfuploadL10n.upload_failed);
+	}
+	else if ( error_code == SWFUpload.UPLOAD_ERROR.IO_ERROR ) {
+		wpQueueError(swfuploadL10n.io_error);
+	}
+	else if ( error_code == SWFUpload.UPLOAD_ERROR.SECURITY_ERROR ) {
+		wpQueueError(swfuploadL10n.security_error);
+	}
+	else if ( error_code == SWFUpload.UPLOAD_ERROR.FILE_CANCELLED ) {
+		wpQueueError(swfuploadL10n.security_error);
+	}
+}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/swfupload/plugins/swfupload.cookies.js 2.5.src/wp-includes/js/swfupload/plugins/swfupload.cookies.js
--- 2.2.2.src/wp-includes/js/swfupload/plugins/swfupload.cookies.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/swfupload/plugins/swfupload.cookies.js	2008-01-25 13:21:11.000000000 -0600
@@ -0,0 +1,50 @@
+/*
+	Cookie Plug-in
+	
+	This plug in automatically gets all the cookies for this site and adds them to the post_params.
+	Cookies are loaded only on initialization.  The refreshCookies function can be called to update the post_params.
+	The cookies will override any other post params with the same name.
+*/
+
+var SWFUpload;
+if (typeof(SWFUpload) === "function") {
+	SWFUpload.prototype.initSettings = function (old_initSettings) {
+		return function (init_settings) {
+			if (typeof(old_initSettings) === "function") {
+				old_initSettings.call(this, init_settings);
+			}
+			
+			this.refreshCookies(false);	// The false parameter must be sent since SWFUpload has not initialzed at this point
+		};
+	}(SWFUpload.prototype.initSettings);
+	
+	// refreshes the post_params and updates SWFUpload.  The send_to_flash parameters is optional and defaults to True
+	SWFUpload.prototype.refreshCookies = function (send_to_flash) {
+		if (send_to_flash !== false) send_to_flash = true;
+		
+		// Get the post_params object
+		var post_params = this.getSetting("post_params");
+		
+		// Get the cookies
+		var i, cookie_array = document.cookie.split(';'), ca_length = cookie_array.length, c, eq_index, name, value;
+		for(i = 0; i < ca_length; i++) {
+			c = cookie_array[i];
+			
+			// Left Trim spaces
+			while (c.charAt(0) == " ") {
+				c = c.substring(1, c.length);
+			}
+			eq_index = c.indexOf("=");
+			if (eq_index > 0) {
+				name = c.substring(0, eq_index);
+				value = c.substring(eq_index+1);
+				post_params[name] = value;
+			}
+		}
+		
+		if (send_to_flash) {
+			this.setPostParams(post_params);
+		}
+	};
+
+}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/swfupload/plugins/swfupload.documentready.js 2.5.src/wp-includes/js/swfupload/plugins/swfupload.documentready.js
--- 2.2.2.src/wp-includes/js/swfupload/plugins/swfupload.documentready.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/swfupload/plugins/swfupload.documentready.js	2008-01-25 13:21:11.000000000 -0600
@@ -0,0 +1,102 @@
+/*
+	DocumentReady Plug-in
+	
+	This plugin loads SWFUpload as soon as the document is ready.  You should not load SWFUpload inside window.onload using this plugin.
+	You can also chain other functions by calling SWFUpload.DocumentReady(your function).
+	
+	Warning: Embedded Ads or other scripts that overwrite window.onload or use their own document ready functions may interfer with this plugin.  You
+		should not set window.onload when using this plugin.
+	
+	Usage Example:
+	
+	var swfu = new SWFUpload(your settings object);
+	SWFUpload.DocumentReady(function () { alert('Document Ready!'; });
+	
+*/
+
+var SWFUpload;
+if (typeof(SWFUpload) === "function") {
+	// Override iniSWFUpload so SWFUpload gets inited when the document is ready rather than immediately
+	SWFUpload.prototype.initSWFUpload = function (old_initSWFUpload) {
+		return function (init_settings) {
+			var self = this;
+			if  (typeof(old_initSWFUpload) === "function") {
+				SWFUpload.DocumentReady(function () {
+					old_initSWFUpload.call(self, init_settings);
+				});
+			}
+		}
+		
+	}(SWFUpload.prototype.initSWFUpload);
+
+	
+	// The DocumentReady function adds the passed in function to
+	// the functions that will be executed when the document is ready/loaded
+	SWFUpload.DocumentReady = function (fn) {
+		// Add the function to the chain
+		SWFUpload.DocumentReady.InternalOnloadChain = function (previous_link_fn) {
+			return function () {
+				if (typeof(previous_link_fn) === "function") {
+					previous_link_fn();
+				}
+				fn();
+			};
+		}(SWFUpload.DocumentReady.InternalOnloadChain);
+	};
+	SWFUpload.DocumentReady.InternalOnloadChain = null;
+	SWFUpload.DocumentReady.Onload = function () {
+		// Execute the onload function chain
+		if (typeof(SWFUpload.DocumentReady.InternalOnloadChain) === "function") {
+			SWFUpload.DocumentReady.InternalOnloadChain();
+		}
+	};
+	SWFUpload.DocumentReady.SetupComplete = false;
+
+
+	/* ********************************************
+		This portion of the code gets executed as soon it is loaded.
+		It binds the proper event for executing JavaScript is
+		early as possible.  This is a per browser function and so
+		some browser sniffing is used.
+		
+		This solution still has the "exposed" issue (See the Global Delegation section at http://peter.michaux.ca/article/553 )
+		
+		Base solution from http://dean.edwards.name/weblog/2006/06/again/ and http://dean.edwards.name/weblog/2005/09/busted/
+	******************************************** */
+	if (!SWFUpload.DocumentReady.SetupComplete) {
+		// for Internet Explorer (using conditional comments)
+		/*@cc_on @*/
+		/*@if (@_win32)
+		document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
+		var script = document.getElementById("__ie_onload");
+		script.onreadystatechange = function() {
+			if (this.readyState == "complete") {
+				SWFUpload.DocumentReady.Onload(); // call the onload handler
+			}
+		};
+		SWFUpload.DocumentReady.SetupComplete = true;
+		/*@end @*/
+	}
+
+	if (!SWFUpload.DocumentReady.SetupComplete && /WebKit/i.test(navigator.userAgent)) { // sniff
+		var _timer = setInterval(function() {
+			if (/loaded|complete/.test(document.readyState)) {
+				clearInterval(_timer);
+				SWFUpload.DocumentReady.Onload(); // call the onload handler
+			}
+		}, 10);
+		SWFUpload.DocumentReady.SetupComplete = true;
+	}
+
+	/* for Mozilla */
+	if (!SWFUpload.DocumentReady.SetupComplete && document.addEventListener) {
+		document.addEventListener("DOMContentLoaded", SWFUpload.DocumentReady.Onload, false);
+		SWFUpload.DocumentReady.SetupComplete = true;
+	}
+
+	/* for other browsers */
+	if (!SWFUpload.DocumentReady.SetupComplete) {
+		window.onload = SWFUpload.DocumentReady.Onload;
+		SWFUpload.DocumentReady.SetupComplete = true;
+	}
+}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/swfupload/plugins/swfupload.graceful_degradation.js 2.5.src/wp-includes/js/swfupload/plugins/swfupload.graceful_degradation.js
--- 2.2.2.src/wp-includes/js/swfupload/plugins/swfupload.graceful_degradation.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/swfupload/plugins/swfupload.graceful_degradation.js	2008-03-19 19:33:59.000000000 -0500
@@ -0,0 +1,64 @@
+/* 
+	SWFUpload Graceful Degradation Plug-in
+
+	This plugin allows SWFUpload to display only if it is loaded successfully.  Otherwise a default form is left displayed.
+	
+	Usage:
+	
+	To use this plugin create two HTML containers. Each should have an ID defined.  One container should hold the SWFUpload UI.  The other should hold the degraded UI.
+	
+	The SWFUpload container should have its CSS "display" property set to "none".
+	
+	If SWFUpload loads successfully the SWFUpload container will be displayed ("display" set to "block") and the
+	degraded container will be hidden ("display" set to "none").
+	
+	Use the settings "swfupload_element_id" and "degraded_element_id" to indicate your container IDs.  The default values are "swfupload_container" and "degraded_container".
+	
+*/
+
+var SWFUpload;
+if (typeof(SWFUpload) === "function") {
+	SWFUpload.gracefulDegradation = {};
+	SWFUpload.prototype.initSettings = function (old_initSettings) {
+		return function (init_settings) {
+			if (typeof(old_initSettings) === "function") {
+				old_initSettings.call(this, init_settings);
+			}
+			
+			this.addSetting("swfupload_element_id",		  		init_settings.swfupload_element_id,				"swfupload_container");
+			this.addSetting("degraded_element_id",		  		init_settings.degraded_element_id,				"degraded_container");
+			this.addSetting("user_swfUploadLoaded_handler",		init_settings.swfupload_loaded_handler,			SWFUpload.swfUploadLoaded);
+
+			this.swfUploadLoaded_handler = SWFUpload.gracefulDegradation.swfUploadLoaded;
+		};
+	}(SWFUpload.prototype.initSettings);
+
+	SWFUpload.gracefulDegradation.swfUploadLoaded = function () {
+		var swfupload_container_id, swfupload_container, degraded_container_id, degraded_container, user_swfUploadLoaded_handler;
+		try {
+			if (uploadDegradeOptions.is_lighttpd_before_150) throw "Lighttpd versions earlier than 1.5.0 aren't supported!";
+			swfupload_element_id = this.getSetting("swfupload_element_id");
+			degraded_element_id = this.getSetting("degraded_element_id");
+			
+			// Show the UI container
+			swfupload_container = document.getElementById(swfupload_element_id);
+			if (swfupload_container !== null) {
+				swfupload_container.style.display = "block";
+
+				// Now take care of hiding the degraded UI
+				degraded_container = document.getElementById(degraded_element_id);
+				if (degraded_container !== null) {
+					degraded_container.style.display = "none";
+				}
+			}
+		} catch (ex) {
+			this.debug(ex);
+		}
+		
+		user_swfUploadLoaded_handler = this.getSetting("user_swfUploadLoaded_handler");
+		if (typeof(user_swfUploadLoaded_handler) === "function") {
+			user_swfUploadLoaded_handler.apply(this);
+		}
+	};
+
+}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/swfupload/plugins/swfupload.queue.js 2.5.src/wp-includes/js/swfupload/plugins/swfupload.queue.js
--- 2.2.2.src/wp-includes/js/swfupload/plugins/swfupload.queue.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/swfupload/plugins/swfupload.queue.js	2008-01-25 13:21:11.000000000 -0600
@@ -0,0 +1,58 @@
+/*
+	Queue Plug-in
+	
+	Features:
+		cancelQueue method for cancelling the entire queue.
+		All queued files are uploaded when startUpload() is called.
+		If false is returned from uploadComplete then the queue upload is stopped.  If false is not returned (strict comparison) then the queue upload is continued.
+		
+	*/
+
+var SWFUpload;
+if (typeof(SWFUpload) === "function") {
+	SWFUpload.queue = {};
+	
+	SWFUpload.prototype.initSettings = function (old_initSettings) {
+		return function (init_settings) {
+			if (typeof(old_initSettings) === "function") {
+				old_initSettings.call(this, init_settings);
+			}
+			
+			this.customSettings.queue_cancelled_flag = false;
+			
+			this.addSetting("user_upload_complete_handler", init_settings.upload_complete_handler, SWFUpload.uploadComplete);
+			this.uploadComplete_handler = SWFUpload.queue.uploadComplete;
+		};
+	}(SWFUpload.prototype.initSettings);
+
+	SWFUpload.prototype.cancelQueue = function () {
+		var stats = this.getStats();
+		this.customSettings.queue_cancelled_flag = false;
+
+		if (stats.in_progress > 0) {
+			this.customSettings.queue_cancelled_flag = true;
+		}
+		
+		while(stats.files_queued > 0) {
+			this.cancelUpload();
+			stats = this.getStats();
+		}
+	};
+	
+	SWFUpload.queue.uploadComplete = function (file) {
+		var user_upload_complete_handler = this.getSetting("user_upload_complete_handler");
+		var continue_upload = true;
+		if (typeof(user_upload_complete_handler) === "function") {
+			continue_upload = (user_upload_complete_handler.call(this, file) === false) ? false : true;
+		}
+		
+		if (continue_upload) {
+			var stats = this.getStats();
+			if (stats.files_queued > 0 && this.customSettings.queue_cancelled_flag === false) {
+				this.startUpload();
+			} else {
+				this.customSettings.queue_cancelled_flag = false;
+			}
+		}
+	};
+}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/swfupload/swfupload.js 2.5.src/wp-includes/js/swfupload/swfupload.js
--- 2.2.2.src/wp-includes/js/swfupload/swfupload.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/swfupload/swfupload.js	2008-01-25 13:21:11.000000000 -0600
@@ -0,0 +1,1051 @@
+/**
+ * SWFUpload v2.0 by Jacob Roberts, Nov 2007, http://www.swfupload.org, http://linebyline.blogspot.com
+ * -------- -------- -------- -------- -------- -------- -------- --------
+ * SWFUpload is (c) 2006 Lars Huring and Mammon Media and is released under the MIT License:
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * See Changelog.txt for version history
+ *
+ * Development Notes:
+ *  * This version of SWFUpload requires Flash Player 9.0.28 and should autodetect the correct flash version.
+ *  * In Linux Flash Player 9 setting the post file variable name does not work. It is always set to "Filedata".
+ *  * There is a lot of repeated code that could be refactored to single functions.  Feel free.
+ *  * It's dangerous to do "circular calls" between Flash and JavaScript. I've taken steps to try to work around issues
+ *     by having the event calls pipe through setTimeout.  However you should still avoid calling in to Flash from
+ *     within the event handler methods.  Especially the "startUpload" event since it cannot use the setTimeout hack.
+ */
+
+
+/* *********** */
+/* Constructor */
+/* *********** */
+
+var SWFUpload = function (init_settings) {
+	this.initSWFUpload(init_settings);
+};
+
+SWFUpload.prototype.initSWFUpload = function (init_settings) {
+	// Remove background flicker in IE (read this: http://misterpixel.blogspot.com/2006/09/forensic-analysis-of-ie6.html)
+	// This doesn't have anything to do with SWFUpload but can help your UI behave better in IE.
+	try {
+		document.execCommand('BackgroundImageCache', false, true);
+	} catch (ex1) {
+	}
+
+
+	try {
+		this.customSettings = {};	// A container where developers can place their own settings associated with this instance.
+		this.settings = {};
+		this.eventQueue = [];
+		this.movieName = "SWFUpload_" + SWFUpload.movieCount++;
+		this.movieElement = null;
+
+		// Setup global control tracking
+		SWFUpload.instances[this.movieName] = this;
+
+		// Load the settings.  Load the Flash movie.
+		this.initSettings(init_settings);
+		this.loadFlash();
+
+		this.displayDebugInfo();
+
+	} catch (ex2) {
+		this.debug(ex2);
+	}
+}
+
+/* *************** */
+/* Static thingies */
+/* *************** */
+SWFUpload.instances = {};
+SWFUpload.movieCount = 0;
+SWFUpload.QUEUE_ERROR = {
+	QUEUE_LIMIT_EXCEEDED	  		: -100,
+	FILE_EXCEEDS_SIZE_LIMIT  		: -110,
+	ZERO_BYTE_FILE			  		: -120,
+	INVALID_FILETYPE		  		: -130
+};
+SWFUpload.UPLOAD_ERROR = {
+	HTTP_ERROR				  		: -200,
+	MISSING_UPLOAD_URL	      		: -210,
+	IO_ERROR				  		: -220,
+	SECURITY_ERROR			  		: -230,
+	UPLOAD_LIMIT_EXCEEDED	  		: -240,
+	UPLOAD_FAILED			  		: -250,
+	SPECIFIED_FILE_ID_NOT_FOUND		: -260,
+	FILE_VALIDATION_FAILED	  		: -270,
+	FILE_CANCELLED			  		: -280,
+	UPLOAD_STOPPED					: -290
+};
+SWFUpload.FILE_STATUS = {
+	QUEUED		 : -1,
+	IN_PROGRESS	 : -2,
+	ERROR		 : -3,
+	COMPLETE	 : -4,
+	CANCELLED	 : -5
+};
+
+
+/* ***************** */
+/* Instance Thingies */
+/* ***************** */
+// init is a private method that ensures that all the object settings are set, getting a default value if one was not assigned.
+
+SWFUpload.prototype.initSettings = function (init_settings) {
+	// Upload backend settings
+	this.addSetting("upload_url",		 		init_settings.upload_url,		  		"");
+	this.addSetting("file_post_name",	 		init_settings.file_post_name,	  		"Filedata");
+	this.addSetting("post_params",		 		init_settings.post_params,		  		{});
+
+	// File Settings
+	this.addSetting("file_types",			  	init_settings.file_types,				"*.*");
+	this.addSetting("file_types_description", 	init_settings.file_types_description, 	"All Files");
+	this.addSetting("file_size_limit",		  	init_settings.file_size_limit,			"1024");
+	this.addSetting("file_upload_limit",	  	init_settings.file_upload_limit,		"0");
+	this.addSetting("file_queue_limit",		  	init_settings.file_queue_limit,			"0");
+
+	// Flash Settings
+	this.addSetting("flash_url",		  		init_settings.flash_url,				"swfupload.swf");
+	this.addSetting("flash_width",		  		init_settings.flash_width,				"1px");
+	this.addSetting("flash_height",		  		init_settings.flash_height,				"1px");
+	this.addSetting("flash_color",		  		init_settings.flash_color,				"#FFFFFF");
+
+	// Debug Settings
+	this.addSetting("debug_enabled", init_settings.debug,  false);
+
+	// Event Handlers
+	this.flashReady_handler         = SWFUpload.flashReady;	// This is a non-overrideable event handler
+	this.swfUploadLoaded_handler    = this.retrieveSetting(init_settings.swfupload_loaded_handler,	    SWFUpload.swfUploadLoaded);
+	
+	this.fileDialogStart_handler	= this.retrieveSetting(init_settings.file_dialog_start_handler,		SWFUpload.fileDialogStart);
+	this.fileQueued_handler			= this.retrieveSetting(init_settings.file_queued_handler,			SWFUpload.fileQueued);
+	this.fileQueueError_handler		= this.retrieveSetting(init_settings.file_queue_error_handler,		SWFUpload.fileQueueError);
+	this.fileDialogComplete_handler	= this.retrieveSetting(init_settings.file_dialog_complete_handler,	SWFUpload.fileDialogComplete);
+	
+	this.uploadStart_handler		= this.retrieveSetting(init_settings.upload_start_handler,			SWFUpload.uploadStart);
+	this.uploadProgress_handler		= this.retrieveSetting(init_settings.upload_progress_handler,		SWFUpload.uploadProgress);
+	this.uploadError_handler		= this.retrieveSetting(init_settings.upload_error_handler,			SWFUpload.uploadError);
+	this.uploadSuccess_handler		= this.retrieveSetting(init_settings.upload_success_handler,		SWFUpload.uploadSuccess);
+	this.uploadComplete_handler		= this.retrieveSetting(init_settings.upload_complete_handler,		SWFUpload.uploadComplete);
+
+	this.debug_handler				= this.retrieveSetting(init_settings.debug_handler,			   		SWFUpload.debug);
+
+	// Other settings
+	this.customSettings = this.retrieveSetting(init_settings.custom_settings, {});
+};
+
+// loadFlash is a private method that generates the HTML tag for the Flash
+// It then adds the flash to the "target" or to the body and stores a
+// reference to the flash element in "movieElement".
+SWFUpload.prototype.loadFlash = function () {
+	var html, target_element, container;
+
+	// Make sure an element with the ID we are going to use doesn't already exist
+	if (document.getElementById(this.movieName) !== null) {
+		return false;
+	}
+
+	// Get the body tag where we will be adding the flash movie
+	try {
+		target_element = document.getElementsByTagName("body")[0];
+		if (typeof(target_element) === "undefined" || target_element === null) {
+			this.debug('Could not find the BODY element. SWFUpload failed to load.');
+			return false;
+		}
+	} catch (ex) {
+		return false;
+	}
+
+	// Append the container and load the flash
+	container = document.createElement("div");
+	container.style.width = this.getSetting("flash_width");
+	container.style.height = this.getSetting("flash_height");
+
+	target_element.appendChild(container);
+	container.innerHTML = this.getFlashHTML();	// Using innerHTML is non-standard but the only sensible way to dynamically add Flash in IE (and maybe other browsers)
+};
+
+// Generates the embed/object tags needed to embed the flash in to the document
+SWFUpload.prototype.getFlashHTML = function () {
+	var html = "";
+
+	// Create Mozilla Embed HTML
+	if (navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length) {
+		// Build the basic embed html
+		html = '<embed type="application/x-shockwave-flash" src="' + this.getSetting("flash_url") + '" width="' + this.getSetting("flash_width") + '" height="' + this.getSetting("flash_height") + '"';
+		html += ' id="' + this.movieName + '" name="' + this.movieName + '" ';
+		html += 'bgcolor="' + this.getSetting("flash_color") + '" quality="high" menu="false" flashvars="';
+
+		html += this.getFlashVars();
+
+		html += '" />';
+
+		// Create IE Object HTML
+	} else {
+
+		// Build the basic Object tag
+		html = '<object id="' + this.movieName + '" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="' + this.getSetting("flash_width") + '" height="' + this.getSetting("flash_height") + '">';
+		html += '<param name="movie" value="' + this.getSetting("flash_url") + '">';
+
+		html += '<param name="bgcolor" value="' + this.getSetting("flash_color") + '" />';
+		html += '<param name="quality" value="high" />';
+		html += '<param name="menu" value="false" />';
+
+		html += '<param name="flashvars" value="' + this.getFlashVars() + '" />';
+		html += '</object>';
+	}
+
+	return html;
+};
+
+// This private method builds the parameter string that will be passed
+// to flash.
+SWFUpload.prototype.getFlashVars = function () {
+	// Build a string from the post param object
+	var param_string = this.buildParamString();
+
+	// Build the parameter string
+	var html = "";
+	html += "movieName=" + encodeURIComponent(this.movieName);
+	html += "&uploadURL=" + encodeURIComponent(this.getSetting("upload_url"));
+	html += "&params=" + encodeURIComponent(param_string);
+	html += "&filePostName=" + encodeURIComponent(this.getSetting("file_post_name"));
+	html += "&fileTypes=" + encodeURIComponent(this.getSetting("file_types"));
+	html += "&fileTypesDescription=" + encodeURIComponent(this.getSetting("file_types_description"));
+	html += "&fileSizeLimit=" + encodeURIComponent(this.getSetting("file_size_limit"));
+	html += "&fileUploadLimit=" + encodeURIComponent(this.getSetting("file_upload_limit"));
+	html += "&fileQueueLimit=" + encodeURIComponent(this.getSetting("file_queue_limit"));
+	html += "&debugEnabled=" + encodeURIComponent(this.getSetting("debug_enabled"));
+
+	return html;
+};
+
+SWFUpload.prototype.getMovieElement = function () {
+	if (typeof(this.movieElement) === "undefined" || this.movieElement === null) {
+		this.movieElement = document.getElementById(this.movieName);
+
+		// Fix IEs "Flash can't callback when in a form" issue (http://www.extremefx.com.ar/blog/fixing-flash-external-interface-inside-form-on-internet-explorer)
+		// Removed because Revision 6 always adds the flash to the body (inside a containing div)
+		// If you insist on adding the Flash file inside a Form then in IE you have to make you wait until the DOM is ready
+		// and run this code to make the form's ID available from the window object so Flash and JavaScript can communicate.
+		//if (typeof(window[this.movieName]) === "undefined" || window[this.moveName] !== this.movieElement) {
+		//	window[this.movieName] = this.movieElement;
+		//}
+	}
+
+	return this.movieElement;
+};
+
+SWFUpload.prototype.buildParamString = function () {
+	var post_params = this.getSetting("post_params");
+	var param_string_pairs = [];
+	var i, value, name;
+
+	// Retrieve the user defined parameters
+	if (typeof(post_params) === "object") {
+		for (name in post_params) {
+			if (post_params.hasOwnProperty(name)) {
+				if (typeof(post_params[name]) === "string") {
+					param_string_pairs.push(encodeURIComponent(name) + "=" + encodeURIComponent(post_params[name]));
+				}
+			}
+		}
+	}
+
+	return param_string_pairs.join("&");
+};
+
+// Saves a setting.	 If the value given is undefined or null then the default_value is used.
+SWFUpload.prototype.addSetting = function (name, value, default_value) {
+	if (typeof(value) === "undefined" || value === null) {
+		this.settings[name] = default_value;
+	} else {
+		this.settings[name] = value;
+	}
+
+	return this.settings[name];
+};
+
+// Gets a setting.	Returns empty string if not found.
+SWFUpload.prototype.getSetting = function (name) {
+	if (typeof(this.settings[name]) === "undefined") {
+		return "";
+	} else {
+		return this.settings[name];
+	}
+};
+
+// Gets a setting, if the setting is undefined then return the default value
+// This does not affect or use the interal setting object.
+SWFUpload.prototype.retrieveSetting = function (value, default_value) {
+	if (typeof(value) === "undefined" || value === null) {
+		return default_value;
+	} else {
+		return value;
+	}
+};
+
+
+// It loops through all the settings and displays
+// them in the debug Console.
+SWFUpload.prototype.displayDebugInfo = function () {
+	var key, debug_message = "";
+
+	debug_message += "----- SWFUPLOAD SETTINGS     ----\nID: " + this.moveName + "\n";
+
+	debug_message += this.outputObject(this.settings);
+
+	debug_message += "----- SWFUPLOAD SETTINGS END ----\n";
+	debug_message += "\n";
+
+	this.debug(debug_message);
+};
+SWFUpload.prototype.outputObject = function (object, prefix) {
+	var output = "", key;
+
+	if (typeof(prefix) !== "string") {
+		prefix = "";
+	}
+	if (typeof(object) !== "object") {
+		return "";
+	}
+
+	for (key in object) {
+		if (object.hasOwnProperty(key)) {
+			if (typeof(object[key]) === "object") {
+				output += (prefix + key + ": { \n" + this.outputObject(object[key], "\t" + prefix) + prefix + "}" + "\n");
+			} else {
+				output += (prefix + key + ": " + object[key] + "\n");
+			}
+		}
+	}
+
+	return output;
+};
+
+/* *****************************
+	-- Flash control methods --
+	Your UI should use these
+	to operate SWFUpload
+   ***************************** */
+
+SWFUpload.prototype.selectFile = function () {
+	var movie_element = this.getMovieElement();
+	if (movie_element !== null && typeof(movie_element.SelectFile) === "function") {
+		try {
+			movie_element.SelectFile();
+		}
+		catch (ex) {
+			this.debug("Could not call SelectFile: " + ex);
+		}
+	} else {
+		this.debug("Could not find Flash element");
+	}
+
+};
+
+SWFUpload.prototype.selectFiles = function () {
+	var movie_element = this.getMovieElement();
+	if (movie_element !== null && typeof(movie_element.SelectFiles) === "function") {
+		try {
+			movie_element.SelectFiles();
+		}
+		catch (ex) {
+			this.debug("Could not call SelectFiles: " + ex);
+		}
+	} else {
+		this.debug("Could not find Flash element");
+	}
+
+};
+
+
+/* Start the upload.  If a file_id is specified that file is uploaded. Otherwise the first
+ * file in the queue is uploaded.  If no files are in the queue then nothing happens.
+ * This call uses setTimeout since Flash will be calling back in to JavaScript
+ */
+SWFUpload.prototype.startUpload = function (file_id) {
+	var self = this;
+	var movie_element = this.getMovieElement();
+	if (movie_element !== null && typeof(movie_element.StartUpload) === "function") {
+		setTimeout(
+			function () {
+				try {
+					movie_element.StartUpload(file_id);
+				}
+				catch (ex) {
+					self.debug("Could not call StartUpload: " + ex);
+				}
+			}, 0
+		);
+	} else {
+		this.debug("Could not find Flash element");
+	}
+
+};
+
+/* Cancels a the file upload.  You must specify a file_id */
+SWFUpload.prototype.cancelUpload = function (file_id) {
+	var movie_element = this.getMovieElement();
+	if (movie_element !== null && typeof(movie_element.CancelUpload) === "function") {
+		try {
+			movie_element.CancelUpload(file_id);
+		}
+		catch (ex) {
+			this.debug("Could not call CancelUpload: " + ex);
+		}
+	} else {
+		this.debug("Could not find Flash element");
+	}
+
+};
+
+// Stops the current upload.  The file is re-queued.  If nothing is currently uploading then nothing happens.
+SWFUpload.prototype.stopUpload = function () {
+	var movie_element = this.getMovieElement();
+	if (movie_element !== null && typeof(movie_element.StopUpload) === "function") {
+		try {
+			movie_element.StopUpload();
+		}
+		catch (ex) {
+			this.debug("Could not call StopUpload: " + ex);
+		}
+	} else {
+		this.debug("Could not find Flash element");
+	}
+
+};
+
+/* ************************
+ * Settings methods
+ *   These methods change the settings inside SWFUpload
+ *   They shouldn't need to be called in a setTimeout since they
+ *   should not call back from Flash to JavaScript (except perhaps in a Debug call)
+ *   and some need to return data so setTimeout won't work.
+ */
+
+/* Gets the file statistics object.	 It looks like this (where n = number):
+	{
+		files_queued: n,
+		complete_uploads: n,
+		upload_errors: n,
+		uploads_cancelled: n,
+		queue_errors: n
+	}
+*/
+SWFUpload.prototype.getStats = function () {
+	var movie_element = this.getMovieElement();
+	if (movie_element !== null && typeof(movie_element.GetStats) === "function") {
+		try {
+			return movie_element.GetStats();
+		}
+		catch (ex) {
+			this.debug("Could not call GetStats");
+		}
+	} else {
+		this.debug("Could not find Flash element");
+	}
+};
+SWFUpload.prototype.setStats = function (stats_object) {
+	var movie_element = this.getMovieElement();
+	if (movie_element !== null && typeof(movie_element.SetStats) === "function") {
+		try {
+			movie_element.SetStats(stats_object);
+		}
+		catch (ex) {
+			this.debug("Could not call SetStats");
+		}
+	} else {
+		this.debug("Could not find Flash element");
+	}
+};
+
+SWFUpload.prototype.setCredentials = function(name, password) {
+	var movie_element = this.getMovieElement();
+	if (movie_element !== null && typeof(movie_element.SetCredentials) === "function") {
+		try {
+			return movie_element.SetCredentials(name, password);
+		}
+		catch (ex) {
+			this.debug("Could not call SetCredentials");
+		}
+	} else {
+		this.debug("Could not find Flash element");
+	}
+};
+
+SWFUpload.prototype.getFile = function (file_id) {
+	var movie_element = this.getMovieElement();
+			if (typeof(file_id) === "number") {
+				if (movie_element !== null && typeof(movie_element.GetFileByIndex) === "function") {
+					try {
+						return movie_element.GetFileByIndex(file_id);
+					}
+					catch (ex) {
+						this.debug("Could not call GetFileByIndex");
+					}
+				} else {
+					this.debug("Could not find Flash element");
+				}
+			} else {
+				if (movie_element !== null && typeof(movie_element.GetFile) === "function") {
+					try {
+						return movie_element.GetFile(file_id);
+					}
+					catch (ex) {
+						this.debug("Could not call GetFile");
+					}
+				} else {
+					this.debug("Could not find Flash element");
+				}
+			}
+};
+
+SWFUpload.prototype.addFileParam = function (file_id, name, value) {
+	var movie_element = this.getMovieElement();
+	if (movie_element !== null && typeof(movie_element.AddFileParam) === "function") {
+		try {
+			return movie_element.AddFileParam(file_id, name, value);
+		}
+		catch (ex) {
+			this.debug("Could not call AddFileParam");
+		}
+	} else {
+		this.debug("Could not find Flash element");
+	}
+};
+
+SWFUpload.prototype.removeFileParam = function (file_id, name) {
+	var movie_element = this.getMovieElement();
+	if (movie_element !== null && typeof(movie_element.RemoveFileParam) === "function") {
+		try {
+			return movie_element.RemoveFileParam(file_id, name);
+		}
+		catch (ex) {
+			this.debug("Could not call AddFileParam");
+		}
+	} else {
+		this.debug("Could not find Flash element");
+	}
+
+};
+
+SWFUpload.prototype.setUploadURL = function (url) {
+	var movie_element = this.getMovieElement();
+	if (movie_element !== null && typeof(movie_element.SetUploadURL) === "function") {
+		try {
+			this.addSetting("upload_url", url);
+			movie_element.SetUploadURL(this.getSetting("upload_url"));
+		}
+		catch (ex) {
+			this.debug("Could not call SetUploadURL");
+		}
+	} else {
+		this.debug("Could not find Flash element in setUploadURL");
+	}
+};
+
+SWFUpload.prototype.setPostParams = function (param_object) {
+	var movie_element = this.getMovieElement();
+	if (movie_element !== null && typeof(movie_element.SetPostParams) === "function") {
+		try {
+			this.addSetting("post_params", param_object);
+			movie_element.SetPostParams(this.getSetting("post_params"));
+		}
+		catch (ex) {
+			this.debug("Could not call SetPostParams");
+		}
+	} else {
+		this.debug("Could not find Flash element in SetPostParams");
+	}
+};
+
+SWFUpload.prototype.setFileTypes = function (types, description) {
+	var movie_element = this.getMovieElement();
+	if (movie_element !== null && typeof(movie_element.SetFileTypes) === "function") {
+		try {
+			this.addSetting("file_types", types);
+			this.addSetting("file_types_description", description);
+			movie_element.SetFileTypes(this.getSetting("file_types"), this.getSetting("file_types_description"));
+		}
+		catch (ex) {
+			this.debug("Could not call SetFileTypes");
+		}
+	} else {
+		this.debug("Could not find Flash element in SetFileTypes");
+	}
+};
+
+SWFUpload.prototype.setFileSizeLimit = function (file_size_limit) {
+	var movie_element = this.getMovieElement();
+	if (movie_element !== null && typeof(movie_element.SetFileSizeLimit) === "function") {
+		try {
+			this.addSetting("file_size_limit", file_size_limit);
+			movie_element.SetFileSizeLimit(this.getSetting("file_size_limit"));
+		}
+		catch (ex) {
+			this.debug("Could not call SetFileSizeLimit");
+		}
+	} else {
+		this.debug("Could not find Flash element in SetFileSizeLimit");
+	}
+};
+
+SWFUpload.prototype.setFileUploadLimit = function (file_upload_limit) {
+	var movie_element = this.getMovieElement();
+	if (movie_element !== null && typeof(movie_element.SetFileUploadLimit) === "function") {
+		try {
+			this.addSetting("file_upload_limit", file_upload_limit);
+			movie_element.SetFileUploadLimit(this.getSetting("file_upload_limit"));
+		}
+		catch (ex) {
+			this.debug("Could not call SetFileUploadLimit");
+		}
+	} else {
+		this.debug("Could not find Flash element in SetFileUploadLimit");
+	}
+};
+
+SWFUpload.prototype.setFileQueueLimit = function (file_queue_limit) {
+	var movie_element = this.getMovieElement();
+	if (movie_element !== null && typeof(movie_element.SetFileQueueLimit) === "function") {
+		try {
+			this.addSetting("file_queue_limit", file_queue_limit);
+			movie_element.SetFileQueueLimit(this.getSetting("file_queue_limit"));
+		}
+		catch (ex) {
+			this.debug("Could not call SetFileQueueLimit");
+		}
+	} else {
+		this.debug("Could not find Flash element in SetFileQueueLimit");
+	}
+};
+
+SWFUpload.prototype.setFilePostName = function (file_post_name) {
+	var movie_element = this.getMovieElement();
+	if (movie_element !== null && typeof(movie_element.SetFilePostName) === "function") {
+		try {
+			this.addSetting("file_post_name", file_post_name);
+			movie_element.SetFilePostName(this.getSetting("file_post_name"));
+		}
+		catch (ex) {
+			this.debug("Could not call SetFilePostName");
+		}
+	} else {
+		this.debug("Could not find Flash element in SetFilePostName");
+	}
+};
+
+SWFUpload.prototype.setDebugEnabled = function (debug_enabled) {
+	var movie_element = this.getMovieElement();
+	if (movie_element !== null && typeof(movie_element.SetDebugEnabled) === "function") {
+		try {
+			this.addSetting("debug_enabled", debug_enabled);
+			movie_element.SetDebugEnabled(this.getSetting("debug_enabled"));
+		}
+		catch (ex) {
+			this.debug("Could not call SetDebugEnabled");
+		}
+	} else {
+		this.debug("Could not find Flash element in SetDebugEnabled");
+	}
+};
+
+/* *******************************
+	Internal Event Callers
+	Don't override these! These event callers ensure that your custom event handlers
+	are called safely and in order.
+******************************* */
+
+/* This is the callback method that the Flash movie will call when it has been loaded and is ready to go.
+   Calling this or showUI() "manually" will bypass the Flash Detection built in to SWFUpload.
+   Use a ui_function setting if you want to control the UI loading after the flash has loaded.
+*/
+SWFUpload.prototype.flashReady = function () {
+	// Check that the movie element is loaded correctly with its ExternalInterface methods defined
+	var movie_element = this.getMovieElement();
+	if (movie_element === null || typeof(movie_element.StartUpload) !== "function") {
+		this.debug("ExternalInterface methods failed to initialize.");
+		return;
+	}
+	
+	var self = this;
+	if (typeof(self.flashReady_handler) === "function") {
+		this.eventQueue[this.eventQueue.length] = function() { self.flashReady_handler(); };
+		setTimeout(function () { self.executeNextEvent();}, 0);
+	} else {
+		this.debug("flashReady_handler event not defined");
+	}
+};
+
+/*
+	Event Queue.  Rather can call events directly from Flash they events are
+	are placed in a queue and then executed.  This ensures that each event is
+	executed in the order it was called which is not guarenteed when calling
+	setTimeout.  Out of order events was especially problematic in Safari.
+*/
+SWFUpload.prototype.executeNextEvent = function () {
+	var  f = this.eventQueue.shift();
+	if (typeof(f) === "function") {
+		f();
+	}
+}
+
+/* This is a chance to do something before the browse window opens */
+SWFUpload.prototype.fileDialogStart = function () {
+	var self = this;
+	if (typeof(self.fileDialogStart_handler) === "function") {
+		this.eventQueue[this.eventQueue.length] = function() { self.fileDialogStart_handler(); };
+		setTimeout(function () { self.executeNextEvent();}, 0);
+	} else {
+		this.debug("fileDialogStart event not defined");
+	}
+};
+
+
+/* Called when a file is successfully added to the queue. */
+SWFUpload.prototype.fileQueued = function (file) {
+	var self = this;
+	if (typeof(self.fileQueued_handler) === "function") {
+		this.eventQueue[this.eventQueue.length] = function() { self.fileQueued_handler(file); };
+		setTimeout(function () { self.executeNextEvent();}, 0);
+	} else {
+		this.debug("fileQueued event not defined");
+	}
+};
+
+
+/* Handle errors that occur when an attempt to queue a file fails. */
+SWFUpload.prototype.fileQueueError = function (file, error_code, message) {
+	var self = this;
+	if (typeof(self.fileQueueError_handler) === "function") {
+		this.eventQueue[this.eventQueue.length] = function() {  self.fileQueueError_handler(file, error_code, message); };
+		setTimeout(function () { self.executeNextEvent();}, 0);
+	} else {
+		this.debug("fileQueueError event not defined");
+	}
+};
+
+/* Called after the file dialog has closed and the selected files have been queued.
+	You could call startUpload here if you want the queued files to begin uploading immediately. */
+SWFUpload.prototype.fileDialogComplete = function (num_files_selected) {
+	var self = this;
+	if (typeof(self.fileDialogComplete_handler) === "function") {
+		this.eventQueue[this.eventQueue.length] = function() { self.fileDialogComplete_handler(num_files_selected); };
+		setTimeout(function () { self.executeNextEvent();}, 0);
+	} else {
+		this.debug("fileDialogComplete event not defined");
+	}
+};
+
+/* Gets called when a file upload is about to be started.  Return true to continue the upload. Return false to stop the upload.
+	If you return false then uploadError and uploadComplete are called (like normal).
+	
+	This is a good place to do any file validation you need.
+	*/
+SWFUpload.prototype.uploadStart = function (file) {
+	var self = this;
+	if (typeof(self.fileDialogComplete_handler) === "function") {
+		this.eventQueue[this.eventQueue.length] = function() { self.returnUploadStart(self.uploadStart_handler(file)); };
+		setTimeout(function () { self.executeNextEvent();}, 0);
+	} else {
+		this.debug("uploadStart event not defined");
+	}
+};
+
+/* Note: Internal use only.  This function returns the result of uploadStart to
+	flash.  Since returning values in the normal way can result in Flash/JS circular
+	call issues we split up the call in a Timeout.  This is transparent from the API
+	point of view.
+*/
+SWFUpload.prototype.returnUploadStart = function (return_value) {
+	var movie_element = this.getMovieElement();
+	if (movie_element !== null && typeof(movie_element.ReturnUploadStart) === "function") {
+		try {
+			movie_element.ReturnUploadStart(return_value);
+		}
+		catch (ex) {
+			this.debug("Could not call ReturnUploadStart");
+		}
+	} else {
+		this.debug("Could not find Flash element in returnUploadStart");
+	}
+};
+
+
+
+/* Called during upload as the file progresses. Use this event to update your UI. */
+SWFUpload.prototype.uploadProgress = function (file, bytes_complete, bytes_total) {
+	var self = this;
+	if (typeof(self.uploadProgress_handler) === "function") {
+		this.eventQueue[this.eventQueue.length] = function() { self.uploadProgress_handler(file, bytes_complete, bytes_total); };
+		setTimeout(function () { self.executeNextEvent();}, 0);
+	} else {
+		this.debug("uploadProgress event not defined");
+	}
+};
+
+/* Called when an error occurs during an upload. Use error_code and the SWFUpload.UPLOAD_ERROR constants to determine
+   which error occurred. The uploadComplete event is called after an error code indicating that the next file is
+   ready for upload.  For files cancelled out of order the uploadComplete event will not be called. */
+SWFUpload.prototype.uploadError = function (file, error_code, message) {
+	var self = this;
+	if (typeof(this.uploadError_handler) === "function") {
+		this.eventQueue[this.eventQueue.length] = function() { self.uploadError_handler(file, error_code, message); };
+		setTimeout(function () { self.executeNextEvent();}, 0);
+	} else {
+		this.debug("uploadError event not defined");
+	}
+};
+
+/* This gets called when a file finishes uploading and the server-side upload script has completed and returned a 200
+status code. Any text returned by the server is available in server_data.
+**NOTE: The upload script MUST return some text or the uploadSuccess and uploadComplete events will not fire and the
+upload will become 'stuck'. */
+SWFUpload.prototype.uploadSuccess = function (file, server_data) {
+	var self = this;
+	if (typeof(self.uploadSuccess_handler) === "function") {
+		this.eventQueue[this.eventQueue.length] = function() { self.uploadSuccess_handler(file, server_data); };
+		setTimeout(function () { self.executeNextEvent();}, 0);
+	} else {
+		this.debug("uploadSuccess event not defined");
+	}
+};
+
+/* uploadComplete is called when the file is uploaded or an error occurred and SWFUpload is ready to make the next upload.
+   If you want the next upload to start to automatically you can call startUpload() from this event. */
+SWFUpload.prototype.uploadComplete = function (file) {
+	var self = this;
+	if (typeof(self.uploadComplete_handler) === "function") {
+		this.eventQueue[this.eventQueue.length] = function() { self.uploadComplete_handler(file); };
+		setTimeout(function () { self.executeNextEvent();}, 0);
+	} else {
+		this.debug("uploadComplete event not defined");
+	}
+};
+
+/* Called by SWFUpload JavaScript and Flash functions when debug is enabled. By default it writes messages to the
+   internal debug console.  You can override this event and have messages written where you want. */
+SWFUpload.prototype.debug = function (message) {
+	var self = this;
+	if (typeof(self.debug_handler) === "function") {
+		this.eventQueue[this.eventQueue.length] = function() { self.debug_handler(message); };
+		setTimeout(function () { self.executeNextEvent();}, 0);
+	} else {
+		this.eventQueue[this.eventQueue.length] = function() { self.debugMessage(message); };
+		setTimeout(function () { self.executeNextEvent();}, 0);
+	}
+};
+
+
+/* **********************************
+	Default Event Handlers.
+	These event handlers are used by default if an overriding handler is
+	not defined in the SWFUpload settings object.
+	
+	JS Note: even though these are defined on the SWFUpload object (rather than the prototype) they
+	are attached (read: copied) to a SWFUpload instance and 'this' is given the proper context.
+   ********************************** */
+
+/* This is a special event handler that has no override in the settings.  Flash calls this when it has
+   been loaded by the browser and is ready for interaction.  You should not override it.  If you need
+   to do something with SWFUpload has loaded then use the swfupload_loaded_handler setting.
+*/
+SWFUpload.flashReady = function () {
+	try {
+		this.debug("Flash called back and is ready.");
+
+		if (typeof(this.swfUploadLoaded_handler) === "function") {
+			this.swfUploadLoaded_handler();
+		}
+	} catch (ex) {
+		this.debug(ex);
+	}
+};
+
+/* This is a chance to something immediately after SWFUpload has loaded.
+   Like, hide the default/degraded upload form and display the SWFUpload form. */
+SWFUpload.swfUploadLoaded = function () {
+};
+
+/* This is a chance to do something before the browse window opens */
+SWFUpload.fileDialogStart = function () {
+};
+
+
+/* Called when a file is successfully added to the queue. */
+SWFUpload.fileQueued = function (file) {
+};
+
+
+/* Handle errors that occur when an attempt to queue a file fails. */
+SWFUpload.fileQueueError = function (file, error_code, message) {
+	try {
+		switch (error_code) {
+		case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:
+			this.debug("Error Code: File too big, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
+			break;
+		case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:
+			this.debug("Error Code: Zero Byte File, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
+			break;
+		case SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED:
+			this.debug("Error Code: Upload limit reached, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
+			break;
+		case SWFUpload.QUEUE_ERROR.INVALID_FILETYPE:
+			this.debug("Error Code: File extension is not allowed, Message: " + message);
+			break;
+		default:
+			this.debug("Error Code: Unhandled error occured. Errorcode: " + error_code);
+		}
+	} catch (ex) {
+		this.debug(ex);
+	}
+};
+
+/* Called after the file dialog has closed and the selected files have been queued.
+	You could call startUpload here if you want the queued files to begin uploading immediately. */
+SWFUpload.fileDialogComplete = function (num_files_selected) {
+};
+
+/* Gets called when a file upload is about to be started.  Return true to continue the upload. Return false to stop the upload.
+	If you return false then the uploadError callback is called and then uploadComplete (like normal).
+	
+	This is a good place to do any file validation you need.
+	
+	This is the only function that cannot be called on a setTimeout because it must return a value to Flash.
+	You SHOULD NOT make any calls in to Flash (e.i, changing settings, getting stats, etc).  Flash Player bugs prevent
+	calls in to Flash from working reliably.
+*/
+SWFUpload.uploadStart = function (file) {
+	return true;
+};
+
+// Called during upload as the file progresses
+SWFUpload.uploadProgress = function (file, bytes_complete, bytes_total) {
+	this.debug("File Progress: " + file.id + ", Bytes: " + bytes_complete + ". Total: " + bytes_total);
+};
+
+/* This gets called when a file finishes uploading and the upload script has completed and returned a 200 status code.	Any text returned by the
+server is available in server_data.	 The upload script must return some text or uploadSuccess will not fire (neither will uploadComplete). */
+SWFUpload.uploadSuccess = function (file, server_data) {
+	this.debug("Upload Success: " + file.id + ", Server: " + server_data);
+};
+
+/* This is called last.	 The file is uploaded or an error occurred and SWFUpload is ready to make the next upload.
+	If you want to automatically start the next file just call startUpload from here.
+*/
+SWFUpload.uploadComplete = function (file) {
+	this.debug("Upload Complete: " + file.id);
+};
+
+// Called by SWFUpload JavaScript and Flash functions when debug is enabled.
+// Override this method in your settings to call your own debug message handler
+SWFUpload.debug = function (message) {
+	if (this.getSetting("debug_enabled")) {
+		this.debugMessage(message);
+	}
+};
+
+/* Called when an upload occurs during upload.  For HTTP errors 'message' will contain the HTTP STATUS CODE */
+SWFUpload.uploadError = function (file, errcode, msg) {
+	try {
+		switch (errcode) {
+		case SWFUpload.UPLOAD_ERROR.SPECIFIED_FILE_ID_NOT_FOUND:
+			this.debug("Error Code: File ID specified for upload was not found, Message: " + msg);
+			break;
+		case SWFUpload.UPLOAD_ERROR.HTTP_ERROR:
+			this.debug("Error Code: HTTP Error, File name: " + file.name + ", Message: " + msg);
+			break;
+		case SWFUpload.UPLOAD_ERROR.MISSING_UPLOAD_URL:
+			this.debug("Error Code: No backend file, File name: " + file.name + ", Message: " + msg);
+			break;
+		case SWFUpload.UPLOAD_ERROR.IO_ERROR:
+			this.debug("Error Code: IO Error, File name: " + file.name + ", Message: " + msg);
+			break;
+		case SWFUpload.UPLOAD_ERROR.SECURITY_ERROR:
+			this.debug("Error Code: Security Error, File name: " + file.name + ", Message: " + msg);
+			break;
+		case SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED:
+			this.debug("Error Code: Upload limit reached, File name: " + file.name + ", File size: " + file.size + ", Message: " + msg);
+			break;
+		case SWFUpload.UPLOAD_ERROR.UPLOAD_FAILED:
+			this.debug("Error Code: Upload Initialization exception, File name: " + file.name + ", File size: " + file.size + ", Message: " + msg);
+			break;
+		case SWFUpload.UPLOAD_ERROR.FILE_VALIDATION_FAILED:
+			this.debug("Error Code: uploadStart callback returned false, File name: " + file.name + ", File size: " + file.size + ", Message: " + msg);
+			break;
+		case SWFUpload.UPLOAD_ERROR.FILE_CANCELLED:
+			this.debug("Error Code: The file upload was cancelled, File name: " + file.name + ", File size: " + file.size + ", Message: " + msg);
+			break;
+		case SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED:
+			this.debug("Error Code: The file upload was stopped, File name: " + file.name + ", File size: " + file.size + ", Message: " + msg);
+			break;
+		default:
+			this.debug("Error Code: Unhandled error occured. Errorcode: " + errcode);
+		}
+	} catch (ex) {
+		this.debug(ex);
+	}
+};
+
+
+
+/* **********************************
+	Debug Console
+	The debug console is a self contained, in page location
+	for debug message to be sent.  The Debug Console adds
+	itself to the body if necessary.
+
+	The console is automatically scrolled as messages appear.
+	
+	You can override this console (to use FireBug's console for instance) by setting the debug event method to your own function
+	that handles the debug message
+   ********************************** */
+SWFUpload.prototype.debugMessage = function (message) {
+	var exception_message, exception_values;
+
+	if (typeof(message) === "object" && typeof(message.name) === "string" && typeof(message.message) === "string") {
+		exception_message = "";
+		exception_values = [];
+		for (var key in message) {
+			exception_values.push(key + ": " + message[key]);
+		}
+		exception_message = exception_values.join("\n");
+		exception_values = exception_message.split("\n");
+		exception_message = "EXCEPTION: " + exception_values.join("\nEXCEPTION: ");
+		SWFUpload.Console.writeLine(exception_message);
+	} else {
+		SWFUpload.Console.writeLine(message);
+	}
+};
+
+SWFUpload.Console = {};
+SWFUpload.Console.writeLine = function (message) {
+	var console, documentForm;
+
+	try {
+		console = document.getElementById("SWFUpload_Console");
+
+		if (!console) {
+			documentForm = document.createElement("form");
+			document.getElementsByTagName("body")[0].appendChild(documentForm);
+
+			console = document.createElement("textarea");
+			console.id = "SWFUpload_Console";
+			console.style.fontFamily = "monospace";
+			console.setAttribute("wrap", "off");
+			console.wrap = "off";
+			console.style.overflow = "auto";
+			console.style.width = "700px";
+			console.style.height = "350px";
+			console.style.margin = "5px";
+			documentForm.appendChild(console);
+		}
+
+		console.value += message + "\n";
+
+		console.scrollTop = console.scrollHeight - console.clientHeight;
+	} catch (ex) {
+		alert("Exception: " + ex.name + " Message: " + ex.message);
+	}
+};
diff -x .svn -aruN 2.2.2.src/wp-includes/js/swfupload/swfupload_f9.swf 2.5.src/wp-includes/js/swfupload/swfupload_f9.swf
--- 2.2.2.src/wp-includes/js/swfupload/swfupload_f9.swf	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/swfupload/swfupload_f9.swf	2008-01-25 13:21:11.000000000 -0600
@@ -0,0 +1,29 @@
+CWS	C  xڥ|	x׵=3$o0'0FIH%0`#i	dтq$]҆[ں{ڴMtI>tM}-]9wf$%_9s=lwN/e Ͽ1o czP_X9:ڶ!Y(Luo<==<ܼkٵ):3z#_a`ЧT!(lmk"^b:U̥D|&L!yKp2JĻlnR-lWҩJ6'COu˄4*=lLSiҥjeAWlSxvrT.(Q&YɕST1NZn{1s86(c&Bv)9XTjCbՂ}QtΫM1{sma >oXxVI,3)r_Nj};#Z=Nj[يǐC{|~=s40="ܟH;	;oo<
=qVb#TZoP;BFG`.{0UvBrlN ZKf(gO.θT+;dLlZS3p*I)FF+xGi|F4]i(PkT~*MLexo/4~hh44_xP/XsqxNNDۛLj`6_TtuCdFrjED#3SZ:VLյ$HOv)kutnJ'
+ōV3$h%ը6M٧Ŋw*T&fmTb\jGZ&֜2*tЈ~LOgs%'lse9OLU<tZK	q-GT&eZn/9|(n鉒	ׇe.=ZsɩVt
+ ؏fЌcX+CIJa$ry0FظXbsVӛÖUpN!;eN.N7QcMg) 
+xLk]QUV%T$%wIkM嗗N4[ֆ0DD";wঞ}[C0*,<܃}>KkRYV-3m$9tb++_ox$2854;e$$FoJ̊4x2NMs4<.#rCW$Q!V(2Ї'X-sg3.=YwCFLoM6451SALgl5@)r{"Gm`uv{qN0t
+mv3l+C%DFÑсZ}I` Hi)eV PP-bVޞ^To}4U&QLLgN.3wN_?ݣQ(UU^dr]ȚIZJ%<YA*qae4cRMe|fL)<MbG#=#ĊWWoG{{C+qC]CW6C:bVUx955"BhgZ)ÎRHS)jK[W638`tiګP,)ԑfUxxg_ȧ&KRk87;2%wW[u|3V[7SMRHeMfԺg~J#_v#WK*n-WqޛJ5]0ADk߶fX6	Zk,yZJHTӒ)"@LoLyҍo%
6iEeUn{ziEzG!WDW6a9.R]EƳ/;v'L4%-(y\^RҟI[|*MJ}VC{x%*">cX%Y%Sljq>PL2$;JbM\PkR_	*;g
+bI[K v$[P݊W`p^+XqnA:n_B,6ѭP}gRb^]01݊tBrpzD%N-AR?$%/+Ta&(VK3_7/I݊;htZq¤:՗S[Y9~L.͵NZgTH'Z[v0~&va09)h\yfFPX)mƠo9oRώb>bK2r(Lbσb/b-ЂEy)Gm&刲Deaq(f܉$i_*_r;TF%Ue墑A189&""0Q:ӔJϹǅ*36WOWܕOn$&
+6Isr*Vhrtʊ.3hb&LQ8%ZAbe#-Xb*S*+kUPдKlLPYKMb+02lDTOeN]OPkDU*3n+nyUAe<qa5<;V{sj^9
a\sD$69')ܹ1
҉%o~@ny8vd΃&cXtaPN+PεAE=c8v*qWRn5e!Fr+YBwKnH҆I5Zadfc%(kP9h<xҔk9RiG|Pf1R4b*EB֘w	PFbɎλR|XrifIX)aP;
+S+YnZV%^Wۖ},)ʇls9CiT\̥kIp9ŕIJSsP\G
+6o¦3I"aZ32@qoYW^|ދڹDk*ZziaW뺌@
.ZErXg$nUX3crIͥ/id6&E~W:S
+ݺzݭZttK)-W	+(X
+UX+}9Me %O:1jo)%%2:28:,^_sD%ʥґf!xYkyYҙϨxm
Ћ8E))-Z\T*I@\2Fh|{mV.g*+4w3OhlBC'f;q
%s%W[ye?øި8ܨ_LS&d6ҭ/E7sx*Qg}t2I8h]ߺeL^|˚=dހ;aewwa{aeOG1[yZTSj˛WԺW68VwUӽK.9璛K^U9 Z.q;94phe/缙|p+|
k9o|9y9o|;8rNys~Wr8k8Zί|9p^8q|9|7p}p|9|G9-m|(Opr<yss'9Oq~Ü9<y)o<yEΏpppÝR/pnlǁxlp/O} c{Wz~>`{Ilc{kqG^_yۛ[b{c{xO<sxgx"_$,x}ۗ}ױ}wͣ־ݳ~$"glwK;h}Wb{^-ފm۰ۻ$\p8b{ x=VeDOb>;>c8g,Oc,~}A[@i<qVa>H%$s1}>'y~B?<?ñdܺi.K!*zƘ adz8ᤇR.Oĳbn ƃO%^==4"US
+ނJV EjQVk[hQSf%5':O*#E- *	UU>2ONsi^V!br1|tv2`+kn&
+`V2X_Kmz17[
̽
+eB 끡embFlXu}v.j/+u\	f+cuWkX5|k:`mv`'@!N`ukrv4*܏OGL\}D4@w7#^yUM/xX5ؚ[߆j 1Q|&h
+-' l̡tX )إY'DnXSQ>9O<%ozܬ*by`]`[.?i!Qf$%I/Ѡze~6cBn<z80iC33
F0yIŞY&_U{?}ϯ{9kv_	~W߽A;y5_~gC;	އ_vk 
+5&&F.nOѩ6v2|"Rew)h?gSКEbTF{;5h覱 KnnU[{,1ڥ$	)ѩV%ml&񙌮5F 'z y{t>EwBrwtu19݆ۢ
%#'G7>1ڿNj&ݲN&%c=MrG4NV&f։$3u4
ďm7DSimlEk:{& : 
ZYq&^!EoBM`2 X3o<lއ#gOlr`	 B%KГ
!X>Ps	z
+}%iKG}k+d|${*CrM|f
}l禊wB dd>Al5&IbdNáO0:oHàktuϴwncC]▌1Oy޻!^-F{zI^U& $q1S+U}yssCr\I<^Q,ģ[\{!mWFvQCo7k~CgUC?`s>ivU=aW2b+[iW%vzC料RVhsyJȥ`DT6h"hDY^#_@ 8RK
}"j '{AInRs.<<y>p2sȒdt<"	Ӊ࿠_tws:qA&5x1BG^dr8<~d~F:yv~ArdX]55߲9>Ub8l3|
+"وlfȐ;p`>аC#}4?,
+pXʙJ;lb۰{ѥa6>V3sA^	OS+z&	Qz㽌̘{зπ1oU;=Fgۙmqr&Ty
qwo{sd9iΈ0и7-bjs'V,lmsvZ>r8kr>DsjC3ĸ:@	P6S
7(_ga[v9g(ȴ5bN}:DĜcK8_wS'
G➘з=azps$BybNdp\Ƙ3I =Փ'U1oJM^Cy'yWө9#+9hZ=Ş{3[, Iݍy#ߚ35^^/>FsiAL9N	tM7hgť]h'N+'cu{꘺-*lfkea)4fn5Ȩ
+KZs4
+M/0gQ,{<MkԒm!/<g_@݊^w)dMz#c.J#Rc>iroipޥ"fFa؍\lgH.a
E\/"|\m௴߬5NhAOZG}1j͡oS{~<&dsnxyvYS?J6W2G@W06V\@o 
+5o/Hb-|Z2)<_yKy׼0`dZ2"Γ${
G)Y`HǥFf6
+yҌ(-.+
	+U+E㬗о ۍyu#ʎD[x^&E?am,[F]x-oJ~ "Ʃ	U"X$ƩEu
+	,%8P&_T#AR2A[QmC5K	֔	ZjnIrzӔpÔLXW+N`WX¬\r	%tI4z~V$3{J{5XF؀ub+@K>afGt͑~|Ү%$݅a+
Zk~!RހV-EGbQ$ZA%xIhx֨r8GGG
$KPSH^X^#n$|7-Ωb< <^.A11; EK kvd@P}U8	ŗ/cme/W`>#~OfqFp|K)eq$gs|!pRZ!KGw)3@t,'D
!Vb͈0cj*X/N*sNȥ9#H-Tvbr\D?&4,SDJ"dtnЧ{%4uR9*׋`@y`ל]l2p]eq'_^\òU	^f\&^0V0o*SJ	$3'XDf2<c8]޺ObLʱI	?NLx'MȲ<
P5!_E̪..D
uD*#f_H#vҒ;Җ1
o{5]*]YRI[`oJUhIi
G]~x,<AȳtW%~Š˷E!3ў͜}R]ahbQQfې#T`lGW}teu=x}f? &ղ2ƼRcU0%Q(tJ>BwS>lYԠasшEXD~Nd9'Ew6dw% 19wl;.C_+\84bƪ|T4`rGB+̆ B`BenbzhNq\q\1k}ށRLHU{dpű=h`OA`'VD{<LP2]؊r\1'OHO^O%i/@*bk]qqr;<1d͛
+F_5aP9[z({<]x3\M?DAHez< uO5DҲYT7~%x 0F 9Ί_W_{oЂݬNɼM|Q:=zJᦳ_O
+2UIӴApm%uS:MoX7S+ߖfO >̱p3sHQ(t9dny.`lxꓝvEjQv
U,}'1mXb"wdzysZ9)'mr
+̗!ŝs9HI_k
O^(,]aۏQ떑b)ć}L mՔM,^,ċ<"*,B~HH{-^ÜetNiHS;oI{֬L25t1UȉMDsRw %<bEU.P/.bG_U1B܌د^@șhgL",% 7vNtN;Glf"~$,CVA8.!zZ_PO@>hzDֿBnh}^@{J;9wz*bI)-&tbr:z%eɻ
++ɜ!"	Ν1TIʨRlS=S)$1;
}:#;*'9!A9( ŝf ʂ_19Qo[8<kƤ1ձIEN wͫ/Z$:lD KЕZAXB,ܑH=$x;fWc$:]ВAW!a~9x$\v0["Iqt
&jXCYK);ZKC4d'IK/8.>m
+6.L$2\xťNR ݹ	x;	s OY'&!>$>MW{?a)ʸBpQvJ~#ѥ
h[VV8,3{<s(܂~\")F_..*!'jJʆ8rΙ幔k~f-~˼K] @qH
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/thickbox/loadingAnimation.gif 2.5.src/wp-includes/js/thickbox/loadingAnimation.gif
--- 2.2.2.src/wp-includes/js/thickbox/loadingAnimation.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/thickbox/loadingAnimation.gif	2008-01-09 02:14:29.000000000 -0600
@@ -0,0 +1,45 @@
+GIF89a 
                                    !NETSCAPE2.0   !
+  ,     
   @Rihlp,tm#6N+rrD4h@FCjz]Lj]﹬R3-H$wPy|KI\KQ\]PI~$
+~	
+J%:`@XP@AO	2|(D**HE}lF=$ Ƌ@\9LJ()?
+
``C=4RO@>}5TDU^=UQH~Xe֫:<! b`^Ovy':</%ƄEn`ʎ3AƊ~`۸Rf*4LE3DZ[FUպg*>|AoG4Q]V;ޙ
<G)}SvO<}&py ]Xg
X
+`"1A fJh!B 28'm
+uљtbj)򖜊H	s6.7L;jԣJ?p6 l@k[-)PVXfQ9{fĥZ^v	&0
lp)g9P !
+  ,      EMbT5+ksly[J;w3iHʒ:QXR$Á511@eg;=(gڙn%pf"|w}zv[xE%`	+%		1"	
+1Ʒ1++'i1֘~~%t"ݫ'$|dЉ'N7o%pDz:)DH$DEtl̑5żlP4	#y5SRzC> jUzҧ]$jQM
+ ʆķ 7721@ܒDH;܋%ЅqۛXMgNάgMW  z!`dѥ]uja}aݸ6;5լDzTh,5~z~@y[:3M7gG]q=@c5
+
+4u흃5_ _9_AMtB\Kⵘ}" @lDiQu+baq&{#'LHjz"$& $B !
+  ,      EI@*PR*;ò[Ll7DҎ%GI0)mIԲ`I}>ă}-RwFu}y|O(p*"rt{RA>(
^(		"4	
+333..Чɞ

v.*o3uzz(	D.zHa рP*6=%8A%ϤH]JQ&2Lz녆Aɔ>50j(]T.s
+*I@m:nTx^7}v(Hy!8/
+4^ֹGi`zA" ?l8]'STҧX*3  @XMS<@蜮-./Ay5|Uv۬ϰVr4<A:\4bmdvi{˿ӛW'7naq{"8V_u_^2_[koTpbp
:M
skx_"Vؓ !
+  ,      %R4yԬԢ\K٩l'#Q<P:A*4 GZLnq,I\EoIUzqx#)_""
+00+0##I"'20	q+t'k`n܀#|2aqVkoE f
+NC})Tǐ`R8ć=5&D9ۦZ{@滗1M۴͇)TyN39]ƱAoV
j>Z0ՠVTyïe]U4f!Pc0zkW+_^ў`v"Ŋa@x:@O,ȬtK5zsRtH5y3ʥ>yz= 3[/Z|&x@7nGdn B^|{ZCN3Z&$p{f;^C}Co % !
+  ,      %$5,%:k.]#>	B"ZRp]2Shk9E-e<ͩkGj6-twsz|mOQtix41
+)
+U"			BQ
+B)#B+u	)ێ#"pg߿=QǍPaQ*֑Xb<88l$Q,?	y2=0յT#rΗ5
9`jLmgTJ2MWy6jukիKy0 iP0J  Cg&(`oq]혗']u}C* ^\sxaGtKpeÈa  @jvlgVDz$ͣQ>mb16}4 @l`ѪzvsGt2y֐/V+SǊ=^"+Y 	09ڛ>0}ǈ`abqO
+'8^Xd|5 [ahWY7֑W6!i!qHX&(@3&B !
+  ,      Q$@RS"	k;	S]3X'+ζS
+tUik`m0c]wldt$v}k~zq,lryux?)B		
+;	00;+	­G0-g+	.z%$z+l(jx9hNt <; 8O7yxH#|bH$ѼLipȅѐ
 2"-A(P  $tj@{s(W$( =!u5(jmnwmĸoA@w/d1+: 'l1f#|,z20Hg@1}թٯ[3S+|7Uǃ.{P卵0ʶc=+PL03:~p'v{On<~)@uP6
k(àK'vK
+V`I9(ZLG!  !
+  ,      PeRN*',Ԣv*o<bKs M3k>oRsAE1fm):kvvM{wl
rtqPm|uF~?W	a3&
+A66	-3-	.,6o3/h-o	'dzz&(CGo߉Oa9 ќD=
kOOEuj(ǑLʏTIR&K.H=
ttI£B0E:qjԪPhY 	ʾBFdÎT0@ ܝK!Aݽ_aw9h P(!Ѣ,fʓmZ,rƝ[|.1鑣wZh%.:^mRi綽7V޿}c\u;o>oüu+],Ebd]/\.*h3;߯~
|HoXg6]	!  !
+  ,      E9$#%5(,Ԓr(i0.݊`lXtD%ydJ6H^.pl[k=.˿(>Sx~gypv}lNtjx{e>	(	~~	
+--,-(Ĺ'e-/p(u'"	uGN
+šL1:I<9uG '9cɕ-Q$L'lD7UTT ׄ tѦBU@%JJŪ)W?  LSY	bZvmމ Б]xF0I{VXg|-BfE#|.@4OP4 u8S
g֥_n;Ө՞(բQ)wǮ<.(ʳ2?eG|LՅ"x/-/y+,p=E1 dQٷ~  2Kꔛ$r
+` m*YsC
zFn ak}nnI#Q !
+  ,      %R4Ԝ"CA,(~ں8׼دDA֐2hs݌+p]ˤObKw8^>uz`H~htkv"xm|1Z,
+-#51"1''[#,
+,},'	p#h1wa"w#p"b1V-akcB)P@;]XqČ#N-A"߲SyrL4eMʚph\@eq/o	D2(𯘳qs:gu@Fu+QAUӯZ#xbR4vG1
+Mɻ ;8FP`B۩3he11O~	˟>z(C3A=\Z-ڇA a-qiSRYmG(1;Ž=dtqB[ !	
+  ,     
   %dihlp,40T:Ԕn琘9␄\<
+P)JZ+^f(-N	Ǥ4ant#o~$z|u#Svx@"'%	#m#	S%
+	$%§	#ְͽ$&	A"%$#H݃'/9BH
E dOC)Lq#Fo	gBbDIʤC'CRg̙G	4^M=<iEj0ћM-0R=jB+î{u,HYÖ$+vhPzz$W-] &=->F\dd3 X堙Kl٣̊@@T?}IVUT+ol|gr
+TeluӭޒvG]l<ݑsg_D
+)4EQ_i)Pi#!h Da
+%.@qMOQ	`pnyHWC"$s*
+]hp$V
8<c!  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/thickbox/tb-close.png 2.5.src/wp-includes/js/thickbox/tb-close.png
--- 2.2.2.src/wp-includes/js/thickbox/tb-close.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/thickbox/tb-close.png	2008-01-09 02:14:29.000000000 -0600
@@ -0,0 +1,3 @@
+PNG
+
+   
IHDR            	pHYs       IDAT(uRKn"Qfˬ΀$ǚRYg  (g͒jre[\9jHK1f^,OV5MfVI(;N炈ݯZ N$"Ǳ	3
_)Dsdf	zh0`01n6^:NWn*NDbyÃF,<!ʲtx<ky{{X.YD1I3p8޾dYnw]Unr63D|zzYsD8L @UU̪'byf4UUv^%݉,cQ9 !   Fс,pSyWCP培c~\̊H?]7DB    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/thickbox/thickbox.css 2.5.src/wp-includes/js/thickbox/thickbox.css
--- 2.2.2.src/wp-includes/js/thickbox/thickbox.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/thickbox/thickbox.css	2008-01-13 18:20:52.000000000 -0600
@@ -0,0 +1,159 @@
+
+/* ----------------------------------------------------------------------------------------------------------------*/
+/* ---------->>> thickbox specific link and font settings <<<------------------------------------------------------*/
+/* ----------------------------------------------------------------------------------------------------------------*/
+#TB_window {
+	font: 12px Arial, Helvetica, sans-serif;
+	color: #333333;
+}
+
+#TB_secondLine {
+	font: 10px Arial, Helvetica, sans-serif;
+	color:#666666;
+}
+
+#TB_window a:link {color: #666666;}
+#TB_window a:visited {color: #666666;}
+#TB_window a:hover {color: #000;}
+#TB_window a:active {color: #666666;}
+#TB_window a:focus{color: #666666;}
+
+/* ----------------------------------------------------------------------------------------------------------------*/
+/* ---------->>> thickbox settings <<<-----------------------------------------------------------------------------*/
+/* ----------------------------------------------------------------------------------------------------------------*/
+#TB_overlay {
+	position: fixed;
+	z-index:100;
+	top: 0px;
+	left: 0px;
+	height:100%;
+	width:100%;
+}
+
+.TB_overlayMacFFBGHack {background: url(macFFBgHack.png) repeat;}
+.TB_overlayBG {
+	background-color:#000;
+	filter:alpha(opacity=75);
+	-moz-opacity: 0.75;
+	opacity: 0.75;
+}
+
+* html #TB_overlay { /* ie6 hack */
+     position: absolute;
+     height: expression(document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px');
+}
+
+#TB_window {
+	position: fixed;
+	background: #ffffff;
+	z-index: 102;
+	color:#000000;
+	display:none;
+	border: 4px solid #525252;
+	text-align:left;
+	top:50%;
+	left:50%;
+}
+
+* html #TB_window { /* ie6 hack */
+position: absolute;
+margin-top: expression(0 - parseInt(this.offsetHeight / 2) + (TBWindowMargin = document.documentElement && document.documentElement.scrollTop || document.body.scrollTop) + 'px');
+}
+
+#TB_window img#TB_Image {
+	display:block;
+	margin: 15px 0 0 15px;
+	border-right: 1px solid #ccc;
+	border-bottom: 1px solid #ccc;
+	border-top: 1px solid #666;
+	border-left: 1px solid #666;
+}
+
+#TB_caption{
+	height:25px;
+	padding:7px 30px 10px 25px;
+	float:left;
+}
+
+#TB_closeWindow{
+	height:25px;
+	padding:11px 25px 10px 0;
+	float:right;
+}
+
+#TB_closeAjaxWindow{
+	padding:7px 10px 5px 0;
+	margin-bottom:1px;
+	text-align:right;
+	float:right;
+}
+
+#TB_ajaxWindowTitle{
+	float:left;
+	padding:7px 0 5px 10px;
+	margin-bottom:1px;
+}
+
+#TB_title{
+	background-color:#e8e8e8;
+	height:27px;
+}
+
+#TB_ajaxContent{
+	clear:both;
+	padding:2px 15px 15px 15px;
+	overflow:auto;
+	text-align:left;
+	line-height:1.4em;
+}
+
+#TB_ajaxContent.TB_modal{
+	padding:15px;
+}
+
+#TB_ajaxContent p{
+	padding:5px 0px 5px 0px;
+}
+
+#TB_load{
+	position: fixed;
+	display:none;
+	height:13px;
+	width:208px;
+	z-index:103;
+	top: 50%;
+	left: 50%;
+	margin: -6px 0 0 -104px; /* -height/2 0 0 -width/2 */
+}
+
+* html #TB_load { /* ie6 hack */
+position: absolute;
+margin-top: expression(0 - parseInt(this.offsetHeight / 2) + (TBWindowMargin = document.documentElement && document.documentElement.scrollTop || document.body.scrollTop) + 'px');
+}
+
+#TB_HideSelect{
+	z-index:99;
+	position:fixed;
+	top: 0;
+	left: 0;
+	background-color:#fff;
+	border:none;
+	filter:alpha(opacity=0);
+	-moz-opacity: 0;
+	opacity: 0;
+	height:100%;
+	width:100%;
+}
+
+* html #TB_HideSelect { /* ie6 hack */
+     position: absolute;
+     height: expression(document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px');
+}
+
+#TB_iframeContent{
+	clear:both;
+	border:none;
+	margin-bottom:-1px;
+	margin-top:1px;
+	_margin-bottom:1px;
+}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/thickbox/thickbox.js 2.5.src/wp-includes/js/thickbox/thickbox.js
--- 2.2.2.src/wp-includes/js/thickbox/thickbox.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/thickbox/thickbox.js	2008-03-15 17:57:47.000000000 -0500
@@ -0,0 +1,320 @@
+/*
+ * Thickbox 3.1 - One Box To Rule Them All.
+ * By Cody Lindley (http://www.codylindley.com)
+ * Copyright (c) 2007 cody lindley
+ * Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php
+*/
+		  
+var tb_pathToImage = "../wp-includes/js/thickbox/loadingAnimation.gif";
+var tb_closeImage = "../wp-includes/js/thickbox/tb-close.png";
+
+/*!!!!!!!!!!!!!!!!! edit below this line at your own risk !!!!!!!!!!!!!!!!!!!!!!!*/
+
+//on page load call tb_init
+jQuery(document).ready(function(){   
+	tb_init('a.thickbox, area.thickbox, input.thickbox');//pass where to apply thickbox
+	imgLoader = new Image();// preload image
+	imgLoader.src = tb_pathToImage;
+});
+
+//add thickbox to href & area elements that have a class of .thickbox
+function tb_init(domChunk){
+	jQuery(domChunk).click(function(){
+	var t = this.title || this.name || null;
+	var a = this.href || this.alt;
+	var g = this.rel || false;
+	tb_show(t,a,g);
+	this.blur();
+	return false;
+	});
+}
+
+function tb_show(caption, url, imageGroup) {//function called when the user clicks on a thickbox link
+
+	try {
+		if (typeof document.body.style.maxHeight === "undefined") {//if IE 6
+			jQuery("body","html").css({height: "100%", width: "100%"});
+			jQuery("html").css("overflow","hidden");
+			if (document.getElementById("TB_HideSelect") === null) {//iframe to hide select elements in ie6
+				jQuery("body").append("<iframe id='TB_HideSelect'></iframe><div id='TB_overlay'></div><div id='TB_window'></div>");
+				jQuery("#TB_overlay").click(tb_remove);
+			}
+		}else{//all others
+			if(document.getElementById("TB_overlay") === null){
+				jQuery("body").append("<div id='TB_overlay'></div><div id='TB_window'></div>");
+				jQuery("#TB_overlay").click(tb_remove);
+			}
+		}
+		
+		if(tb_detectMacXFF()){
+			jQuery("#TB_overlay").addClass("TB_overlayMacFFBGHack");//use png overlay so hide flash
+		}else{
+			jQuery("#TB_overlay").addClass("TB_overlayBG");//use background and opacity
+		}
+		
+		if(caption===null){caption="";}
+		jQuery("body").append("<div id='TB_load'><img src='"+imgLoader.src+"' /></div>");//add loader to the page
+		jQuery('#TB_load').show();//show loader
+		
+		var baseURL;
+	   if(url.indexOf("?")!==-1){ //ff there is a query string involved
+			baseURL = url.substr(0, url.indexOf("?"));
+	   }else{ 
+	   		baseURL = url;
+	   }
+	   
+	   var urlString = /\.jpg$|\.jpeg$|\.png$|\.gif$|\.bmp$/;
+	   var urlType = baseURL.toLowerCase().match(urlString);
+
+		if(urlType == '.jpg' || urlType == '.jpeg' || urlType == '.png' || urlType == '.gif' || urlType == '.bmp'){//code to show images
+				
+			TB_PrevCaption = "";
+			TB_PrevURL = "";
+			TB_PrevHTML = "";
+			TB_NextCaption = "";
+			TB_NextURL = "";
+			TB_NextHTML = "";
+			TB_imageCount = "";
+			TB_FoundURL = false;
+			if(imageGroup){
+				TB_TempArray = jQuery("a[@rel="+imageGroup+"]").get();
+				for (TB_Counter = 0; ((TB_Counter < TB_TempArray.length) && (TB_NextHTML === "")); TB_Counter++) {
+					var urlTypeTemp = TB_TempArray[TB_Counter].href.toLowerCase().match(urlString);
+						if (!(TB_TempArray[TB_Counter].href == url)) {						
+							if (TB_FoundURL) {
+								TB_NextCaption = TB_TempArray[TB_Counter].title;
+								TB_NextURL = TB_TempArray[TB_Counter].href;
+								TB_NextHTML = "<span id='TB_next'>&nbsp;&nbsp;<a href='#'>Next &gt;</a></span>";
+							} else {
+								TB_PrevCaption = TB_TempArray[TB_Counter].title;
+								TB_PrevURL = TB_TempArray[TB_Counter].href;
+								TB_PrevHTML = "<span id='TB_prev'>&nbsp;&nbsp;<a href='#'>&lt; Prev</a></span>";
+							}
+						} else {
+							TB_FoundURL = true;
+							TB_imageCount = "Image " + (TB_Counter + 1) +" of "+ (TB_TempArray.length);											
+						}
+				}
+			}
+
+			imgPreloader = new Image();
+			imgPreloader.onload = function(){		
+			imgPreloader.onload = null;
+				
+			// Resizing large images - orginal by Christian Montoya edited by me.
+			var pagesize = tb_getPageSize();
+			var x = pagesize[0] - 150;
+			var y = pagesize[1] - 150;
+			var imageWidth = imgPreloader.width;
+			var imageHeight = imgPreloader.height;
+			if (imageWidth > x) {
+				imageHeight = imageHeight * (x / imageWidth); 
+				imageWidth = x; 
+				if (imageHeight > y) { 
+					imageWidth = imageWidth * (y / imageHeight); 
+					imageHeight = y; 
+				}
+			} else if (imageHeight > y) { 
+				imageWidth = imageWidth * (y / imageHeight); 
+				imageHeight = y; 
+				if (imageWidth > x) { 
+					imageHeight = imageHeight * (x / imageWidth); 
+					imageWidth = x;
+				}
+			}
+			// End Resizing
+			
+			TB_WIDTH = imageWidth + 30;
+			TB_HEIGHT = imageHeight + 60;
+			jQuery("#TB_window").append("<a href='' id='TB_ImageOff' title='Close'><img id='TB_Image' src='"+url+"' width='"+imageWidth+"' height='"+imageHeight+"' alt='"+caption+"'/></a>" + "<div id='TB_caption'>"+caption+"<div id='TB_secondLine'>" + TB_imageCount + TB_PrevHTML + TB_NextHTML + "</div></div><div id='TB_closeWindow'><a href='#' id='TB_closeWindowButton' title='Close'><img src='" + tb_closeImage + "' /></a></div>"); 		
+			
+			jQuery("#TB_closeWindowButton").click(tb_remove);
+			
+			if (!(TB_PrevHTML === "")) {
+				function goPrev(){
+					if(jQuery(document).unbind("click",goPrev)){jQuery(document).unbind("click",goPrev);}
+					jQuery("#TB_window").remove();
+					jQuery("body").append("<div id='TB_window'></div>");
+					tb_show(TB_PrevCaption, TB_PrevURL, imageGroup);
+					return false;	
+				}
+				jQuery("#TB_prev").click(goPrev);
+			}
+			
+			if (!(TB_NextHTML === "")) {		
+				function goNext(){
+					jQuery("#TB_window").remove();
+					jQuery("body").append("<div id='TB_window'></div>");
+					tb_show(TB_NextCaption, TB_NextURL, imageGroup);				
+					return false;	
+				}
+				jQuery("#TB_next").click(goNext);
+				
+			}
+
+			document.onkeydown = function(e){ 	
+				if (e == null) { // ie
+					keycode = event.keyCode;
+				} else { // mozilla
+					keycode = e.which;
+				}
+				if(keycode == 27){ // close
+					tb_remove();
+				} else if(keycode == 190){ // display previous image
+					if(!(TB_NextHTML == "")){
+						document.onkeydown = "";
+						goNext();
+					}
+				} else if(keycode == 188){ // display next image
+					if(!(TB_PrevHTML == "")){
+						document.onkeydown = "";
+						goPrev();
+					}
+				}	
+			};
+			
+			tb_position();
+			jQuery("#TB_load").remove();
+			jQuery("#TB_ImageOff").click(tb_remove);
+			jQuery("#TB_window").css({display:"block"}); //for safari using css instead of show
+			};
+			
+			imgPreloader.src = url;
+		}else{//code to show html
+			
+			var queryString = url.replace(/^[^\?]+\??/,'');
+			var params = tb_parseQuery( queryString );
+
+			TB_WIDTH = (params['width']*1) + 30 || 630; //defaults to 630 if no paramaters were added to URL
+			TB_HEIGHT = (params['height']*1) + 40 || 440; //defaults to 440 if no paramaters were added to URL
+			ajaxContentW = TB_WIDTH - 30;
+			ajaxContentH = TB_HEIGHT - 45;
+			
+			if(url.indexOf('TB_iframe') != -1){// either iframe or ajax window		
+					urlNoQuery = url.split('TB_');
+					jQuery("#TB_iframeContent").remove();
+					if(params['modal'] != "true"){//iframe no modal
+						jQuery("#TB_window").append("<div id='TB_title'><div id='TB_ajaxWindowTitle'>"+caption+"</div><div id='TB_closeAjaxWindow'><a href='#' id='TB_closeWindowButton' title='Close'><img src='" + tb_closeImage + "' /></a></div></div><iframe frameborder='0' hspace='0' src='"+urlNoQuery[0]+"' id='TB_iframeContent' name='TB_iframeContent"+Math.round(Math.random()*1000)+"' onload='tb_showIframe()' style='width:"+(ajaxContentW + 29)+"px;height:"+(ajaxContentH + 17)+"px;' > </iframe>");
+					}else{//iframe modal
+					jQuery("#TB_overlay").unbind();
+						jQuery("#TB_window").append("<iframe frameborder='0' hspace='0' src='"+urlNoQuery[0]+"' id='TB_iframeContent' name='TB_iframeContent"+Math.round(Math.random()*1000)+"' onload='tb_showIframe()' style='width:"+(ajaxContentW + 29)+"px;height:"+(ajaxContentH + 17)+"px;'> </iframe>");
+					}
+			}else{// not an iframe, ajax
+					if(jQuery("#TB_window").css("display") != "block"){
+						if(params['modal'] != "true"){//ajax no modal
+						jQuery("#TB_window").append("<div id='TB_title'><div id='TB_ajaxWindowTitle'>"+caption+"</div><div id='TB_closeAjaxWindow'><a href='#' id='TB_closeWindowButton'><img src='" + tb_closeImage + "' /></a></div></div><div id='TB_ajaxContent' style='width:"+ajaxContentW+"px;height:"+ajaxContentH+"px'></div>");
+						}else{//ajax modal
+						jQuery("#TB_overlay").unbind();
+						jQuery("#TB_window").append("<div id='TB_ajaxContent' class='TB_modal' style='width:"+ajaxContentW+"px;height:"+ajaxContentH+"px;'></div>");	
+						}
+					}else{//this means the window is already up, we are just loading new content via ajax
+						jQuery("#TB_ajaxContent")[0].style.width = ajaxContentW +"px";
+						jQuery("#TB_ajaxContent")[0].style.height = ajaxContentH +"px";
+						jQuery("#TB_ajaxContent")[0].scrollTop = 0;
+						jQuery("#TB_ajaxWindowTitle").html(caption);
+					}
+			}
+					
+			jQuery("#TB_closeWindowButton").click(tb_remove);
+			
+				if(url.indexOf('TB_inline') != -1){	
+					jQuery("#TB_ajaxContent").append(jQuery('#' + params['inlineId']).children());
+					jQuery("#TB_window").unload(function () {
+						jQuery('#' + params['inlineId']).append( jQuery("#TB_ajaxContent").children() ); // move elements back when you're finished
+					});
+					tb_position();
+					jQuery("#TB_load").remove();
+					jQuery("#TB_window").css({display:"block"}); 
+				}else if(url.indexOf('TB_iframe') != -1){
+					tb_position();
+					if($.browser.safari){//safari needs help because it will not fire iframe onload
+						jQuery("#TB_load").remove();
+						jQuery("#TB_window").css({display:"block"});
+					}
+				}else{
+					jQuery("#TB_ajaxContent").load(url += "&random=" + (new Date().getTime()),function(){//to do a post change this load method
+						tb_position();
+						jQuery("#TB_load").remove();
+						tb_init("#TB_ajaxContent a.thickbox");
+						jQuery("#TB_window").css({display:"block"});
+					});
+				}
+			
+		}
+
+		if(!params['modal']){
+			document.onkeyup = function(e){ 	
+				if (e == null) { // ie
+					keycode = event.keyCode;
+				} else { // mozilla
+					keycode = e.which;
+				}
+				if(keycode == 27){ // close
+					tb_remove();
+				}	
+			};
+		}
+		
+	} catch(e) {
+		//nothing here
+	}
+}
+
+//helper functions below
+function tb_showIframe(){
+	jQuery("#TB_load").remove();
+	jQuery("#TB_window").css({display:"block"});
+}
+
+function tb_remove() {
+ 	jQuery("#TB_imageOff").unbind("click");
+	jQuery("#TB_closeWindowButton").unbind("click");
+	jQuery("#TB_window").fadeOut("fast",function(){jQuery('#TB_window,#TB_overlay,#TB_HideSelect').trigger("unload").unbind().remove();});
+	jQuery("#TB_load").remove();
+	if (typeof document.body.style.maxHeight == "undefined") {//if IE 6
+		jQuery("body","html").css({height: "auto", width: "auto"});
+		jQuery("html").css("overflow","");
+	}
+	document.onkeydown = "";
+	document.onkeyup = "";
+	return false;
+}
+
+function tb_position() {
+jQuery("#TB_window").css({marginLeft: '-' + parseInt((TB_WIDTH / 2),10) + 'px', width: TB_WIDTH + 'px'});
+	if ( !(jQuery.browser.msie && jQuery.browser.version < 7)) { // take away IE6
+		jQuery("#TB_window").css({marginTop: '-' + parseInt((TB_HEIGHT / 2),10) + 'px'});
+	}
+}
+
+function tb_parseQuery ( query ) {
+   var Params = {};
+   if ( ! query ) {return Params;}// return empty object
+   var Pairs = query.split(/[;&]/);
+   for ( var i = 0; i < Pairs.length; i++ ) {
+      var KeyVal = Pairs[i].split('=');
+      if ( ! KeyVal || KeyVal.length != 2 ) {continue;}
+      var key = unescape( KeyVal[0] );
+      var val = unescape( KeyVal[1] );
+      val = val.replace(/\+/g, ' ');
+      Params[key] = val;
+   }
+   return Params;
+}
+
+function tb_getPageSize(){
+	var de = document.documentElement;
+	var w = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;
+	var h = window.innerHeight || self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight;
+	arrayPageSize = [w,h];
+	return arrayPageSize;
+}
+
+function tb_detectMacXFF() {
+  var userAgent = navigator.userAgent.toLowerCase();
+  if (userAgent.indexOf('mac') != -1 && userAgent.indexOf('firefox')!=-1) {
+    return true;
+  }
+}
+
+
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/blank.htm 2.5.src/wp-includes/js/tinymce/blank.htm
--- 2.2.2.src/wp-includes/js/tinymce/blank.htm	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/blank.htm	2008-01-06 13:15:33.000000000 -0600
@@ -1,7 +1,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-	<title>blank_page</title>
 	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+	<title>blank_page</title>
 </head>
 <body class="mceContentBody">
 
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/langs/en.js 2.5.src/wp-includes/js/tinymce/langs/en.js
--- 2.2.2.src/wp-includes/js/tinymce/langs/en.js	2007-01-16 11:52:13.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/langs/en.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,41 +0,0 @@
-// UK lang variables
-
-tinyMCE.addToLang('',{
-bold_desc : 'Bold (Ctrl+B)',
-italic_desc : 'Italic (Ctrl+I)',
-underline_desc : 'Underline (Ctrl+U)',
-striketrough_desc : 'Strikethrough',
-justifyleft_desc : 'Align left',
-justifycenter_desc : 'Align center',
-justifyright_desc : 'Align right',
-justifyfull_desc : 'Align full',
-bullist_desc : 'Unordered list',
-numlist_desc : 'Ordered list',
-outdent_desc : 'Outdent',
-indent_desc : 'Indent',
-undo_desc : 'Undo (Ctrl+Z)',
-redo_desc : 'Redo (Ctrl+Y)',
-link_desc : 'Insert/edit link',
-unlink_desc : 'Unlink',
-image_desc : 'Insert/edit image',
-cleanup_desc : 'Cleanup messy code',
-focus_alert : 'A editor instance must be focused before using this command.',
-edit_confirm : 'Do you want to use the WYSIWYG mode for this textarea?',
-insert_link_title : 'Insert/edit link',
-insert : 'Insert',
-update : 'Update',
-cancel : 'Cancel',
-insert_link_url : 'Link URL',
-insert_link_target : 'Target',
-insert_link_target_same : 'Open link in the same window',
-insert_link_target_blank : 'Open link in a new window',
-insert_image_title : 'Insert/edit image',
-insert_image_src : 'Image URL',
-insert_image_alt : 'Image description',
-help_desc : 'Help',
-bold_img : "bold.gif",
-italic_img : "italic.gif",
-underline_img : "underline.gif",
-clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',
-popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.'
-});
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/langs/wp-langs.php 2.5.src/wp-includes/js/tinymce/langs/wp-langs.php
--- 2.2.2.src/wp-includes/js/tinymce/langs/wp-langs.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/langs/wp-langs.php	2008-03-18 11:32:05.000000000 -0500
@@ -0,0 +1,401 @@
+<?php
+
+// escape text only if it needs translating
+function mce_escape($text) {
+	global $language;
+	
+	if ( 'en' == $language ) return $text;
+	else return js_escape($text);
+}
+
+$strings = 'tinyMCE.addI18n({' . $language . ':{
+common:{
+edit_confirm:"' . mce_escape( __('Do you want to use the WYSIWYG mode for this textarea?') ) . '",
+apply:"' . mce_escape( __('Apply') ) . '",
+insert:"' . mce_escape( __('Insert') ) . '",
+update:"' . mce_escape( __('Update') ) . '",
+cancel:"' . mce_escape( __('Cancel') ) . '",
+close:"' . mce_escape( __('Close') ) . '",
+browse:"' . mce_escape( __('Browse') ) . '",
+class_name:"' . mce_escape( __('Class') ) . '",
+not_set:"' . mce_escape( __('-- Not set --') ) . '",
+clipboard_msg:"' . mce_escape( __('Copy/Cut/Paste is not available in Mozilla and Firefox.') ) . '",
+clipboard_no_support:"' . mce_escape( __('Currently not supported by your browser, use keyboard shortcuts instead.') ) . '",
+popup_blocked:"' . mce_escape( __('Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.') ) . '",
+invalid_data:"' . mce_escape( __('Error: Invalid values entered, these are marked in red.') ) . '",
+more_colors:"' . mce_escape( __('More colors') ) . '"
+},
+contextmenu:{
+align:"' . mce_escape( __('Alignment') ) . '",
+left:"' . mce_escape( __('Left') ) . '",
+center:"' . mce_escape( __('Center') ) . '",
+right:"' . mce_escape( __('Right') ) . '",
+full:"' . mce_escape( __('Full') ) . '"
+},
+insertdatetime:{
+date_fmt:"' . mce_escape( __('%Y-%m-%d') ) . '",
+time_fmt:"' . mce_escape( __('%H:%M:%S') ) . '",
+insertdate_desc:"' . mce_escape( __('Insert date') ) . '",
+inserttime_desc:"' . mce_escape( __('Insert time') ) . '",
+months_long:"' . mce_escape( __('January').','.__('February').','.__('March').','.__('April').','.__('May').','.__('June').','.__('July').','.__('August').','.__('September').','.__('October').','.__('November').','.__('December') ) . '",
+months_short:"' . mce_escape( __('Jan_January_abbreviation').','.__('Feb_February_abbreviation').','.__('Mar_March_abbreviation').','.__('Apr_April_abbreviation').','.__('May_May_abbreviation').','.__('Jun_June_abbreviation').','.__('Jul_July_abbreviation').','.__('Aug_August_abbreviation').','.__('Sep_September_abbreviation').','.__('Oct_October_abbreviation').','.__('Nov_November_abbreviation').','.__('Dec_December_abbreviation') ) . '",
+day_long:"' . mce_escape( __('Sunday').','.__('Monday').','.__('Tuesday').','.__('Wednesday').','.__('Thursday').','.__('Friday').','.__('Saturday') ) . '",
+day_short:"' . mce_escape( __('Sun').','.__('Mon').','.__('Tue').','.__('Wed').','.__('Thu').','.__('Fri').','.__('Sat') ) . '"
+},
+print:{
+print_desc:"' . mce_escape( __('Print') ) . '"
+},
+preview:{
+preview_desc:"' . mce_escape( __('Preview') ) . '"
+},
+directionality:{
+ltr_desc:"' . mce_escape( __('Direction left to right') ) . '",
+rtl_desc:"' . mce_escape( __('Direction right to left') ) . '"
+},
+layer:{
+insertlayer_desc:"' . mce_escape( __('Insert new layer') ) . '",
+forward_desc:"' . mce_escape( __('Move forward') ) . '",
+backward_desc:"' . mce_escape( __('Move backward') ) . '",
+absolute_desc:"' . mce_escape( __('Toggle absolute positioning') ) . '",
+content:"' . mce_escape( __('New layer...') ) . '"
+},
+save:{
+save_desc:"' . mce_escape( __('Save') ) . '",
+cancel_desc:"' . mce_escape( __('Cancel all changes') ) . '"
+},
+nonbreaking:{
+nonbreaking_desc:"' . mce_escape( __('Insert non-breaking space character') ) . '"
+},
+iespell:{
+iespell_desc:"' . mce_escape( __('Run spell checking') ) . '",
+download:"' . mce_escape( __('ieSpell not detected. Do you want to install it now?') ) . '"
+},
+advhr:{
+advhr_desc:"' . mce_escape( __('Horizontale rule') ) . '"
+},
+emotions:{
+emotions_desc:"' . mce_escape( __('Emotions') ) . '"
+},
+searchreplace:{
+search_desc:"' . mce_escape( __('Find') ) . '",
+replace_desc:"' . mce_escape( __('Find/Replace') ) . '"
+},
+advimage:{
+image_desc:"' . mce_escape( __('Insert/edit image') ) . '"
+},
+advlink:{
+link_desc:"' . mce_escape( __('Insert/edit link') ) . '"
+},
+xhtmlxtras:{
+cite_desc:"' . mce_escape( __('Citation') ) . '",
+abbr_desc:"' . mce_escape( __('Abbreviation') ) . '",
+acronym_desc:"' . mce_escape( __('Acronym') ) . '",
+del_desc:"' . mce_escape( __('Deletion') ) . '",
+ins_desc:"' . mce_escape( __('Insertion') ) . '",
+attribs_desc:"' . mce_escape( __('Insert/Edit Attributes') ) . '"
+},
+style:{
+desc:"' . mce_escape( __('Edit CSS Style') ) . '"
+},
+paste:{
+paste_text_desc:"' . mce_escape( __('Paste as Plain Text') ) . '",
+paste_word_desc:"' . mce_escape( __('Paste from Word') ) . '",
+selectall_desc:"' . mce_escape( __('Select All') ) . '"
+},
+paste_dlg:{
+text_title:"' . mce_escape( __('Use CTRL+V on your keyboard to paste the text into the window.') ) . '",
+text_linebreaks:"' . mce_escape( __('Keep linebreaks') ) . '",
+word_title:"' . mce_escape( __('Use CTRL+V on your keyboard to paste the text into the window.') ) . '"
+},
+table:{
+desc:"' . mce_escape( __('Inserts a new table') ) . '",
+row_before_desc:"' . mce_escape( __('Insert row before') ) . '",
+row_after_desc:"' . mce_escape( __('Insert row after') ) . '",
+delete_row_desc:"' . mce_escape( __('Delete row') ) . '",
+col_before_desc:"' . mce_escape( __('Insert column before') ) . '",
+col_after_desc:"' . mce_escape( __('Insert column after') ) . '",
+delete_col_desc:"' . mce_escape( __('Remove column') ) . '",
+split_cells_desc:"' . mce_escape( __('Split merged table cells') ) . '",
+merge_cells_desc:"' . mce_escape( __('Merge table cells') ) . '",
+row_desc:"' . mce_escape( __('Table row properties') ) . '",
+cell_desc:"' . mce_escape( __('Table cell properties') ) . '",
+props_desc:"' . mce_escape( __('Table properties') ) . '",
+paste_row_before_desc:"' . mce_escape( __('Paste table row before') ) . '",
+paste_row_after_desc:"' . mce_escape( __('Paste table row after') ) . '",
+cut_row_desc:"' . mce_escape( __('Cut table row') ) . '",
+copy_row_desc:"' . mce_escape( __('Copy table row') ) . '",
+del:"' . mce_escape( __('Delete table') ) . '",
+row:"' . mce_escape( __('Row') ) . '",
+col:"' . mce_escape( __('Column') ) . '",
+cell:"' . mce_escape( __('Cell') ) . '"
+},
+autosave:{
+unload_msg:"' . mce_escape( __('The changes you made will be lost if you navigate away from this page.') ) . '"
+},
+fullscreen:{
+desc:"' . mce_escape( __('Toggle fullscreen mode') ) . ' (Alt+Shift+G)"
+},
+media:{
+desc:"' . mce_escape( __('Insert / edit embedded media') ) . '",
+delta_width:"' . mce_escape( _c('0| Extra width for the media popup in pixels') ) . '",
+delta_height:"' . mce_escape( _c('0| Extra height for the media popup in pixels') ) . '",
+edit:"' . mce_escape( __('Edit embedded media') ) . '"
+},
+fullpage:{
+desc:"' . mce_escape( __('Document properties') ) . '"
+},
+template:{
+desc:"' . mce_escape( __('Insert predefined template content') ) . '"
+},
+visualchars:{
+desc:"' . mce_escape( __('Visual control characters on/off.') ) . '"
+},
+spellchecker:{
+desc:"' . mce_escape( __('Toggle spellchecker') ) . ' (Alt+Shift+N)",
+menu:"' . mce_escape( __('Spellchecker settings') ) . '",
+ignore_word:"' . mce_escape( __('Ignore word') ) . '",
+ignore_words:"' . mce_escape( __('Ignore all') ) . '",
+langs:"' . mce_escape( __('Languages') ) . '",
+wait:"' . mce_escape( __('Please wait...') ) . '",
+sug:"' . mce_escape( __('Suggestions') ) . '",
+no_sug:"' . mce_escape( __('No suggestions') ) . '",
+no_mpell:"' . mce_escape( __('No misspellings found.') ) . '"
+},
+pagebreak:{
+desc:"' . mce_escape( __('Insert page break.') ) . '"
+}}});
+
+tinyMCE.addI18n("' . $language . '.advanced",{
+style_select:"' . mce_escape( __('Styles') ) . '",
+font_size:"' . mce_escape( __('Font size') ) . '",
+fontdefault:"' . mce_escape( __('Font family') ) . '",
+block:"' . mce_escape( __('Format') ) . '",
+paragraph:"' . mce_escape( __('Paragraph') ) . '",
+div:"' . mce_escape( __('Div') ) . '",
+address:"' . mce_escape( __('Address') ) . '",
+pre:"' . mce_escape( __('Preformatted') ) . '",
+h1:"' . mce_escape( __('Heading 1') ) . '",
+h2:"' . mce_escape( __('Heading 2') ) . '",
+h3:"' . mce_escape( __('Heading 3') ) . '",
+h4:"' . mce_escape( __('Heading 4') ) . '",
+h5:"' . mce_escape( __('Heading 5') ) . '",
+h6:"' . mce_escape( __('Heading 6') ) . '",
+blockquote:"' . mce_escape( __('Blockquote') ) . '",
+code:"' . mce_escape( __('Code') ) . '",
+samp:"' . mce_escape( __('Code sample') ) . '",
+dt:"' . mce_escape( __('Definition term ') ) . '",
+dd:"' . mce_escape( __('Definition description') ) . '",
+bold_desc:"' . mce_escape( __('Bold') ) . ' (Ctrl / Alt+Shift + B)",
+italic_desc:"' . mce_escape( __('Italic') ) . ' (Ctrl / Alt+Shift + I)",
+underline_desc:"' . mce_escape( __('Underline') ) . '",
+striketrough_desc:"' . mce_escape( __('Strikethrough') ) . ' (Alt+Shift+D)",
+justifyleft_desc:"' . mce_escape( __('Align left') ) . ' (Alt+Shift+L)",
+justifycenter_desc:"' . mce_escape( __('Align center') ) . ' (Alt+Shift+C)",
+justifyright_desc:"' . mce_escape( __('Align right') ) . ' (Alt+Shift+R)",
+justifyfull_desc:"' . mce_escape( __('Align full') ) . ' (Alt+Shift+J)",
+bullist_desc:"' . mce_escape( __('Unordered list') ) . ' (Alt+Shift+U)",
+numlist_desc:"' . mce_escape( __('Ordered list') ) . ' (Alt+Shift+O)",
+outdent_desc:"' . mce_escape( __('Outdent') ) . '",
+indent_desc:"' . mce_escape( __('Indent') ) . '",
+undo_desc:"' . mce_escape( __('Undo') ) . ' (Ctrl+Z)",
+redo_desc:"' . mce_escape( __('Redo') ) . ' (Ctrl+Y)",
+link_desc:"' . mce_escape( __('Insert/edit link') ) . ' (Alt+Shift+A)",
+link_delta_width:"' . mce_escape( _c('0| Extra width for the link popup in pixels') ) . '",
+link_delta_height:"' . mce_escape( _c('0| Extra height for the link popup in pixels') ) . '",
+unlink_desc:"' . mce_escape( __('Unlink') ) . ' (Alt+Shift+S)",
+image_desc:"' . mce_escape( __('Insert/edit image') ) . ' (Alt+Shift+M)",
+image_delta_width:"' . mce_escape( _c('0| Extra width for the image popup in pixels') ) . '",
+image_delta_height:"' . mce_escape( _c('0| Extra height for the image popup in pixels') ) . '",
+cleanup_desc:"' . mce_escape( __('Cleanup messy code') ) . '",
+code_desc:"' . mce_escape( __('Edit HTML Source') ) . '",
+sub_desc:"' . mce_escape( __('Subscript') ) . '",
+sup_desc:"' . mce_escape( __('Superscript') ) . '",
+hr_desc:"' . mce_escape( __('Insert horizontal ruler') ) . '",
+removeformat_desc:"' . mce_escape( __('Remove formatting') ) . '",
+forecolor_desc:"' . mce_escape( __('Select text color') ) . '",
+backcolor_desc:"' . mce_escape( __('Select background color') ) . '",
+charmap_desc:"' . mce_escape( __('Insert custom character') ) . '",
+visualaid_desc:"' . mce_escape( __('Toggle guidelines/invisible elements') ) . '",
+anchor_desc:"' . mce_escape( __('Insert/edit anchor') ) . '",
+cut_desc:"' . mce_escape( __('Cut') ) . '",
+copy_desc:"' . mce_escape( __('Copy') ) . '",
+paste_desc:"' . mce_escape( __('Paste') ) . '",
+image_props_desc:"' . mce_escape( __('Image properties') ) . '",
+newdocument_desc:"' . mce_escape( __('New document') ) . '",
+help_desc:"' . mce_escape( __('Help') ) . '",
+blockquote_desc:"' . mce_escape( __('Blockquote') ) . ' (Alt+Shift+Q)",
+clipboard_msg:"' . mce_escape( __('Copy/Cut/Paste is not available in Mozilla and Firefox.') ) . '",
+path:"' . mce_escape( __('Path') ) . '",
+newdocument:"' . mce_escape( __('Are you sure you want to clear all contents?') ) . '",
+toolbar_focus:"' . mce_escape( __('Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X') ) . '",
+more_colors:"' . mce_escape( __('More colors') ) . '",
+colorpicker_delta_width:"' . mce_escape( _c('0| Extra width for the colorpicker popup in pixels') ) . '",
+colorpicker_delta_height:"' . mce_escape( _c('0| Extra height for the colorpicker popup in pixels') ) . '"
+});
+
+tinyMCE.addI18n("' . $language . '.advanced_dlg",{
+about_title:"' . mce_escape( __('About TinyMCE') ) . '",
+about_general:"' . mce_escape( __('About') ) . '",
+about_help:"' . mce_escape( __('Help') ) . '",
+about_license:"' . mce_escape( __('License') ) . '",
+about_plugins:"' . mce_escape( __('Plugins') ) . '",
+about_plugin:"' . mce_escape( __('Plugin') ) . '",
+about_author:"' . mce_escape( __('Author') ) . '",
+about_version:"' . mce_escape( __('Version') ) . '",
+about_loaded:"' . mce_escape( __('Loaded plugins') ) . '",
+anchor_title:"' . mce_escape( __('Insert/edit anchor') ) . '",
+anchor_name:"' . mce_escape( __('Anchor name') ) . '",
+code_title:"' . mce_escape( __('HTML Source Editor') ) . '",
+code_wordwrap:"' . mce_escape( __('Word wrap') ) . '",
+colorpicker_title:"' . mce_escape( __('Select a color') ) . '",
+colorpicker_picker_tab:"' . mce_escape( __('Picker') ) . '",
+colorpicker_picker_title:"' . mce_escape( __('Color picker') ) . '",
+colorpicker_palette_tab:"' . mce_escape( __('Palette') ) . '",
+colorpicker_palette_title:"' . mce_escape( __('Palette colors') ) . '",
+colorpicker_named_tab:"' . mce_escape( __('Named') ) . '",
+colorpicker_named_title:"' . mce_escape( __('Named colors') ) . '",
+colorpicker_color:"' . mce_escape( __('Color:') ) . '",
+colorpicker_name:"' . mce_escape( __('Name:') ) . '",
+charmap_title:"' . mce_escape( __('Select custom character') ) . '",
+image_title:"' . mce_escape( __('Insert/edit image') ) . '",
+image_src:"' . mce_escape( __('Image URL') ) . '",
+image_alt:"' . mce_escape( __('Image description') ) . '",
+image_list:"' . mce_escape( __('Image list') ) . '",
+image_border:"' . mce_escape( __('Border') ) . '",
+image_dimensions:"' . mce_escape( __('Dimensions') ) . '",
+image_vspace:"' . mce_escape( __('Vertical space') ) . '",
+image_hspace:"' . mce_escape( __('Horizontal space') ) . '",
+image_align:"' . mce_escape( __('Alignment') ) . '",
+image_align_baseline:"' . mce_escape( __('Baseline') ) . '",
+image_align_top:"' . mce_escape( __('Top') ) . '",
+image_align_middle:"' . mce_escape( __('Middle') ) . '",
+image_align_bottom:"' . mce_escape( __('Bottom') ) . '",
+image_align_texttop:"' . mce_escape( __('Text top') ) . '",
+image_align_textbottom:"' . mce_escape( __('Text bottom') ) . '",
+image_align_left:"' . mce_escape( __('Left') ) . '",
+image_align_right:"' . mce_escape( __('Right') ) . '",
+link_title:"' . mce_escape( __('Insert/edit link') ) . '",
+link_url:"' . mce_escape( __('Link URL') ) . '",
+link_target:"' . mce_escape( __('Target') ) . '",
+link_target_same:"' . mce_escape( __('Open link in the same window') ) . '",
+link_target_blank:"' . mce_escape( __('Open link in a new window') ) . '",
+link_titlefield:"' . mce_escape( __('Title') ) . '",
+link_is_email:"' . mce_escape( __('The URL you entered seems to be an email address, do you want to add the required mailto: prefix?') ) . '",
+link_is_external:"' . mce_escape( __('The URL you entered seems to external link, do you want to add the required http:// prefix?') ) . '",
+link_list:"' . mce_escape( __('Link list') ) . '"
+});
+
+tinyMCE.addI18n("' . $language . '.media_dlg",{
+title:"' . mce_escape( __('Insert / edit embedded media') ) . '",
+general:"' . mce_escape( __('General') ) . '",
+advanced:"' . mce_escape( __('Advanced') ) . '",
+file:"' . mce_escape( __('File/URL') ) . '",
+list:"' . mce_escape( __('List') ) . '",
+size:"' . mce_escape( __('Dimensions') ) . '",
+preview:"' . mce_escape( __('Preview') ) . '",
+constrain_proportions:"' . mce_escape( __('Constrain proportions') ) . '",
+type:"' . mce_escape( __('Type') ) . '",
+id:"' . mce_escape( __('Id') ) . '",
+name:"' . mce_escape( __('Name') ) . '",
+class_name:"' . mce_escape( __('Class') ) . '",
+vspace:"' . mce_escape( __('V-Space') ) . '",
+hspace:"' . mce_escape( __('H-Space') ) . '",
+play:"' . mce_escape( __('Auto play') ) . '",
+loop:"' . mce_escape( __('Loop') ) . '",
+menu:"' . mce_escape( __('Show menu') ) . '",
+quality:"' . mce_escape( __('Quality') ) . '",
+scale:"' . mce_escape( __('Scale') ) . '",
+align:"' . mce_escape( __('Align') ) . '",
+salign:"' . mce_escape( __('SAlign') ) . '",
+wmode:"' . mce_escape( __('WMode') ) . '",
+bgcolor:"' . mce_escape( __('Background') ) . '",
+base:"' . mce_escape( __('Base') ) . '",
+flashvars:"' . mce_escape( __('Flashvars') ) . '",
+liveconnect:"' . mce_escape( __('SWLiveConnect') ) . '",
+autohref:"' . mce_escape( __('AutoHREF') ) . '",
+cache:"' . mce_escape( __('Cache') ) . '",
+hidden:"' . mce_escape( __('Hidden') ) . '",
+controller:"' . mce_escape( __('Controller') ) . '",
+kioskmode:"' . mce_escape( __('Kiosk mode') ) . '",
+playeveryframe:"' . mce_escape( __('Play every frame') ) . '",
+targetcache:"' . mce_escape( __('Target cache') ) . '",
+correction:"' . mce_escape( __('No correction') ) . '",
+enablejavascript:"' . mce_escape( __('Enable JavaScript') ) . '",
+starttime:"' . mce_escape( __('Start time') ) . '",
+endtime:"' . mce_escape( __('End time') ) . '",
+href:"' . mce_escape( __('Href') ) . '",
+qtsrcchokespeed:"' . mce_escape( __('Choke speed') ) . '",
+target:"' . mce_escape( __('Target') ) . '",
+volume:"' . mce_escape( __('Volume') ) . '",
+autostart:"' . mce_escape( __('Auto start') ) . '",
+enabled:"' . mce_escape( __('Enabled') ) . '",
+fullscreen:"' . mce_escape( __('Fullscreen') ) . '",
+invokeurls:"' . mce_escape( __('Invoke URLs') ) . '",
+mute:"' . mce_escape( __('Mute') ) . '",
+stretchtofit:"' . mce_escape( __('Stretch to fit') ) . '",
+windowlessvideo:"' . mce_escape( __('Windowless video') ) . '",
+balance:"' . mce_escape( __('Balance') ) . '",
+baseurl:"' . mce_escape( __('Base URL') ) . '",
+captioningid:"' . mce_escape( __('Captioning id') ) . '",
+currentmarker:"' . mce_escape( __('Current marker') ) . '",
+currentposition:"' . mce_escape( __('Current position') ) . '",
+defaultframe:"' . mce_escape( __('Default frame') ) . '",
+playcount:"' . mce_escape( __('Play count') ) . '",
+rate:"' . mce_escape( __('Rate') ) . '",
+uimode:"' . mce_escape( __('UI Mode') ) . '",
+flash_options:"' . mce_escape( __('Flash options') ) . '",
+qt_options:"' . mce_escape( __('Quicktime options') ) . '",
+wmp_options:"' . mce_escape( __('Windows media player options') ) . '",
+rmp_options:"' . mce_escape( __('Real media player options') ) . '",
+shockwave_options:"' . mce_escape( __('Shockwave options') ) . '",
+autogotourl:"' . mce_escape( __('Auto goto URL') ) . '",
+center:"' . mce_escape( __('Center') ) . '",
+imagestatus:"' . mce_escape( __('Image status') ) . '",
+maintainaspect:"' . mce_escape( __('Maintain aspect') ) . '",
+nojava:"' . mce_escape( __('No java') ) . '",
+prefetch:"' . mce_escape( __('Prefetch') ) . '",
+shuffle:"' . mce_escape( __('Shuffle') ) . '",
+console:"' . mce_escape( __('Console') ) . '",
+numloop:"' . mce_escape( __('Num loops') ) . '",
+controls:"' . mce_escape( __('Controls') ) . '",
+scriptcallbacks:"' . mce_escape( __('Script callbacks') ) . '",
+swstretchstyle:"' . mce_escape( __('Stretch style') ) . '",
+swstretchhalign:"' . mce_escape( __('Stretch H-Align') ) . '",
+swstretchvalign:"' . mce_escape( __('Stretch V-Align') ) . '",
+sound:"' . mce_escape( __('Sound') ) . '",
+progress:"' . mce_escape( __('Progress') ) . '",
+qtsrc:"' . mce_escape( __('QT Src') ) . '",
+qt_stream_warn:"' . mce_escape( __('Streamed rtsp resources should be added to the QT Src field under the advanced tab.') ) . '",
+align_top:"' . mce_escape( __('Top') ) . '",
+align_right:"' . mce_escape( __('Right') ) . '",
+align_bottom:"' . mce_escape( __('Bottom') ) . '",
+align_left:"' . mce_escape( __('Left') ) . '",
+align_center:"' . mce_escape( __('Center') ) . '",
+align_top_left:"' . mce_escape( __('Top left') ) . '",
+align_top_right:"' . mce_escape( __('Top right') ) . '",
+align_bottom_left:"' . mce_escape( __('Bottom left') ) . '",
+align_bottom_right:"' . mce_escape( __('Bottom right') ) . '",
+flv_options:"' . mce_escape( __('Flash video options') ) . '",
+flv_scalemode:"' . mce_escape( __('Scale mode') ) . '",
+flv_buffer:"' . mce_escape( __('Buffer') ) . '",
+flv_startimage:"' . mce_escape( __('Start image') ) . '",
+flv_starttime:"' . mce_escape( __('Start time') ) . '",
+flv_defaultvolume:"' . mce_escape( __('Default volume') ) . '",
+flv_hiddengui:"' . mce_escape( __('Hidden GUI') ) . '",
+flv_autostart:"' . mce_escape( __('Auto start') ) . '",
+flv_loop:"' . mce_escape( __('Loop') ) . '",
+flv_showscalemodes:"' . mce_escape( __('Show scale modes') ) . '",
+flv_smoothvideo:"' . mce_escape( __('Smooth video') ) . '",
+flv_jscallback:"' . mce_escape( __('JS Callback') ) . '"
+});
+
+tinyMCE.addI18n("' . $language . '.wordpress",{
+wp_adv_desc:"' . mce_escape( __('Show/Hide Kitchen Sink') )  . ' (Alt+Shift+Z)",
+wp_more_desc:"' . mce_escape( __('Insert More tag') ) . ' (Alt+Shift+T)",
+wp_page_desc:"' . mce_escape( __('Insert Page break') ) . ' (Alt+Shift+P)",
+wp_help_desc:"' . mce_escape( __('Help') ) . ' (Alt+Shift+H)",
+wp_more_alt:"' . mce_escape( __('More...') ) . '",
+wp_page_alt:"' . mce_escape( __('Next page...') ) . '"
+});
+'; 
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/license.html 2.5.src/wp-includes/js/tinymce/license.html
--- 2.2.2.src/wp-includes/js/tinymce/license.html	2005-11-17 11:47:29.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/license.html	1969-12-31 18:00:00.000000000 -0600
@@ -1,465 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>TinyMCE License (LGPL)</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
-	<h1>TinyMCE License (LGPL)</h1>
-</div>
-
-<div class="content">
-<p>
-Visit the <a href="faq.html">FAQ</a> for general answers surrounding TinyMCE. Or visit <a href="http://www.fsf.org" target="_blank">http://www.fsf.org</a> for more information about Open-Source licenses.
-</p>
-<pre>
-		  GNU LIBRARY GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1991 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the library GPL.  It is
- numbered 2 because it goes with version 2 of the ordinary GPL.]
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
-  This license, the Library General Public License, applies to some
-specially designated Free Software Foundation software, and to any
-other libraries whose authors decide to use it.  You can use it for
-your libraries, 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 library, or if you modify it.
-
-  For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you.  You must make sure that they, too, receive or can get the source
-code.  If you link a program with the library, you must provide
-complete object files to the recipients so that they can relink them
-with the library, after making changes to the library and recompiling
-it.  And you must show them these terms so they know their rights.
-
-  Our method of protecting your rights has two steps: (1) copyright
-the library, and (2) offer you this license which gives you legal
-permission to copy, distribute and/or modify the library.
-
-  Also, for each distributor's protection, we want to make certain
-that everyone understands that there is no warranty for this free
-library.  If the library is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original
-version, 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 companies distributing free
-software will individually obtain patent licenses, thus in effect
-transforming the program into proprietary software.  To prevent this,
-we have made it clear that any patent must be licensed for everyone's
-free use or not licensed at all.
-
-  Most GNU software, including some libraries, is covered by the ordinary
-GNU General Public License, which was designed for utility programs.  This
-license, the GNU Library General Public License, applies to certain
-designated libraries.  This license is quite different from the ordinary
-one; be sure to read it in full, and don't assume that anything in it is
-the same as in the ordinary license.
-
-  The reason we have a separate public license for some libraries is that
-they blur the distinction we usually make between modifying or adding to a
-program and simply using it.  Linking a program with a library, without
-changing the library, is in some sense simply using the library, and is
-analogous to running a utility program or application program.  However, in
-a textual and legal sense, the linked executable is a combined work, a
-derivative of the original library, and the ordinary General Public License
-treats it as such.
-
-  Because of this blurred distinction, using the ordinary General
-Public License for libraries did not effectively promote software
-sharing, because most developers did not use the libraries.  We
-concluded that weaker conditions might promote sharing better.
-
-  However, unrestricted linking of non-free programs would deprive the
-users of those programs of all benefit from the free status of the
-libraries themselves.  This Library General Public License is intended to
-permit developers of non-free programs to use free libraries, while
-preserving your freedom as a user of such programs to change the free
-libraries that are incorporated in them.  (We have not seen how to achieve
-this as regards changes in header files, but we have achieved it as regards
-changes in the actual functions of the Library.)  The hope is that this
-will lead to faster development of free libraries.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.  Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library".  The
-former contains code derived from the library, while the latter only
-works together with the library.
-
-  Note that it is possible for a library to be covered by the ordinary
-General Public License rather than by this special one.
-.
-		  GNU LIBRARY GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License Agreement applies to any software library which
-contains a notice placed by the copyright holder or other authorized
-party saying it may be distributed under the terms of this Library
-General Public License (also called "this License").  Each licensee is
-addressed as "you".
-
-  A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
-  The "Library", below, refers to any such software library or work
-which has been distributed under these terms.  A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language.  (Hereinafter, translation is
-included without limitation in the term "modification".)
-
-  "Source code" for a work means the preferred form of the work for
-making modifications to it.  For a library, 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 library.
-
-  Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it).  Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-  
-  1. You may copy and distribute verbatim copies of the Library's
-complete 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 distribute a copy of this License along with the
-Library.
-
-  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 Library or any portion
-of it, thus forming a work based on the Library, 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) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no
-    charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a
-    table of data to be supplied by an application program that uses
-    the facility, other than as an argument passed when the facility
-    is invoked, then you must make a good faith effort to ensure that,
-    in the event an application does not supply such function or
-    table, the facility still operates, and performs whatever part of
-    its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has
-    a purpose that is entirely well-defined independent of the
-    application.  Therefore, Subsection 2d requires that any
-    application-supplied function or table used by this function must
-    be optional: if the application does not supply it, the square
-    root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Library,
-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 Library, 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 Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library.  To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License.  (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.)  Do not make any other change in
-these notices.
-.
-  Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
-  This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
-  4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you 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.
-
-  If distribution of 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 satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library".  Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
-  However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library".  The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
-  When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library.  The
-threshold for this to be true is not precisely defined by law.
-
-  If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work.  (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
-  Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-.
-  6. As an exception to the Sections above, you may also compile or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
-  You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License.  You must supply a copy of this License.  If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License.  Also, you must do one
-of these things:
-
-    a) Accompany the work with the complete corresponding
-    machine-readable source code for the Library including whatever
-    changes were used in the work (which must be distributed under
-    Sections 1 and 2 above); and, if the work is an executable linked
-    with the Library, with the complete machine-readable "work that
-    uses the Library", as object code and/or source code, so that the
-    user can modify the Library and then relink to produce a modified
-    executable containing the modified Library.  (It is understood
-    that the user who changes the contents of definitions files in the
-    Library will not necessarily be able to recompile the application
-    to use the modified definitions.)
-
-    b) Accompany the work with a written offer, valid for at
-    least three years, to give the same user the materials
-    specified in Subsection 6a, above, for a charge no more
-    than the cost of performing this distribution.
-
-    c) If distribution of the work is made by offering access to copy
-    from a designated place, offer equivalent access to copy the above
-    specified materials from the same place.
-
-    d) Verify that the user has already received a copy of these
-    materials or that you have already sent this user a copy.
-
-  For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it.  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.
-
-  It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system.  Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-.
-  7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work
-    based on the Library, uncombined with any other library
-    facilities.  This must be distributed under the terms of the
-    Sections above.
-
-    b) Give prominent notice with the combined library of the fact
-    that part of it is a work based on the Library, and explaining
-    where to find the accompanying uncombined form of the same work.
-
-  8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License.  Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library 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.
-
-  9. 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 Library or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
-  10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-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.
-.
-  11. 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 Library at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Library 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 Library.
-
-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.
-
-  12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library 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.
-
-  13. The Free Software Foundation may publish revised and/or new
-versions of the Library 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 Library
-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 Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-.
-  14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-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
-
-  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "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
-LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. 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 LIBRARY 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
-LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-</pre>
-</div>
-
-<div class="footer">
-	<div class="helpindexlink"><a href="index.html">Index</a></div>
-	<div class="copyright">Copyright &copy; 2005 Moxiecode Systems AB</div>
-	<br style="clear: both" />
-</div>
-
-</body>
-</html>
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/autosave/editor_plugin.js 2.5.src/wp-includes/js/tinymce/plugins/autosave/editor_plugin.js
--- 2.2.2.src/wp-includes/js/tinymce/plugins/autosave/editor_plugin.js	2007-04-12 12:04:03.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/plugins/autosave/editor_plugin.js	2008-01-31 12:10:46.000000000 -0600
@@ -1,46 +1 @@
-/**
- * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $
- *
- * @author Moxiecode
- * @copyright Copyright  2004-2007, Moxiecode Systems AB, All rights reserved.
- */
-
-/* Import plugin specific language pack */
-tinyMCE.importPluginLanguagePack('autosave');
-
-var TinyMCE_AutoSavePlugin = {
-	getInfo : function() {
-		return {
-			longname : 'Auto save',
-			author : 'Moxiecode Systems AB',
-			authorurl : 'http://tinymce.moxiecode.com',
-			infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autosave',
-			version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
-		};
-	},
-
-	// Private plugin internal methods
-
-	_beforeUnloadHandler : function() {
-		var n, inst, anyDirty = false, msg = tinyMCE.getLang("lang_autosave_unload_msg");
-
-		if (tinyMCE.getParam("fullscreen_is_enabled"))
-			return;
-
-		for (n in tinyMCE.instances) {
-			inst = tinyMCE.instances[n];
-
-			if (!tinyMCE.isInstance(inst))
-				continue;
-
-			if (inst.isDirty())
-				return msg;
-		}
-
-		return;
-	}
-};
-
-window.onbeforeunload = TinyMCE_AutoSavePlugin._beforeUnloadHandler;
-
-tinyMCE.addPlugin("autosave", TinyMCE_AutoSavePlugin);
+(function(){tinymce.create('tinymce.plugins.AutoSavePlugin',{init:function(ed,url){var t=this;t.editor=ed;window.onbeforeunload=tinymce.plugins.AutoSavePlugin._beforeUnloadHandler;},getInfo:function(){return{longname:'Auto save',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autosave',version:tinymce.majorVersion+"."+tinymce.minorVersion};},'static':{_beforeUnloadHandler:function(){var msg;tinymce.each(tinyMCE.editors,function(ed){if(ed.getParam("fullscreen_is_enabled"))return;if(ed.isDirty()){msg=ed.getLang("autosave.unload_msg");return false;}});return msg;}}});tinymce.PluginManager.add('autosave',tinymce.plugins.AutoSavePlugin);})();
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/autosave/editor_plugin_src.js 2.5.src/wp-includes/js/tinymce/plugins/autosave/editor_plugin_src.js
--- 2.2.2.src/wp-includes/js/tinymce/plugins/autosave/editor_plugin_src.js	2007-01-16 11:52:13.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/autosave/editor_plugin_src.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,30 +0,0 @@
-/* Import plugin specific language pack */
-tinyMCE.importPluginLanguagePack('autosave', 'en,sv,cs,he,no,hu,de,da,ru,ru_KOI8-R,ru_UTF-8,fi,cy,es,is,pl');
-
-function TinyMCE_autosave_getInfo() {
-	return {
-		longname : 'Auto save',
-		author : 'Moxiecode Systems',
-		authorurl : 'http://tinymce.moxiecode.com',
-		infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_autosave.html',
-		version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
-	};
-};
-
-function TinyMCE_autosave_beforeUnloadHandler() {
-	var msg = tinyMCE.getLang("lang_autosave_unload_msg");
-
-	var anyDirty = false;
-	for (var n in tinyMCE.instances) {
-		var inst = tinyMCE.instances[n];
-		if (!tinyMCE.isInstance(inst))
-			continue;
-
-		if (inst.isDirty())
-			return msg;
-	}
-
-	return;
-}
-
-window.onbeforeunload = TinyMCE_autosave_beforeUnloadHandler;
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/autosave/langs/en.js 2.5.src/wp-includes/js/tinymce/plugins/autosave/langs/en.js
--- 2.2.2.src/wp-includes/js/tinymce/plugins/autosave/langs/en.js	2007-01-16 11:52:13.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/autosave/langs/en.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,5 +0,0 @@
-// EN lang variables
-
-tinyMCE.addToLang('',{
-autosave_unload_msg : 'The changes you made will be lost if you navigate away from this page.'
-});
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/directionality/editor_plugin.js 2.5.src/wp-includes/js/tinymce/plugins/directionality/editor_plugin.js
--- 2.2.2.src/wp-includes/js/tinymce/plugins/directionality/editor_plugin.js	2007-04-12 12:04:03.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/plugins/directionality/editor_plugin.js	2008-01-31 12:10:46.000000000 -0600
@@ -1,90 +1 @@
-/**
- * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $
- *
- * @author Moxiecode
- * @copyright Copyright  2004-2007, Moxiecode Systems AB, All rights reserved.
- */
-
-/* Import plugin specific language pack */
-tinyMCE.importPluginLanguagePack('directionality');
-
-var TinyMCE_DirectionalityPlugin = {
-	getInfo : function() {
-		return {
-			longname : 'Directionality',
-			author : 'Moxiecode Systems AB',
-			authorurl : 'http://tinymce.moxiecode.com',
-			infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/directionality',
-			version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
-		};
-	},
-
-	getControlHTML : function(cn) {
-		switch (cn) {
-			case "ltr":
-				return tinyMCE.getButtonHTML(cn, 'lang_directionality_ltr_desc', '{$pluginurl}/images/ltr.gif', 'mceDirectionLTR');
-
-			case "rtl":
-				return tinyMCE.getButtonHTML(cn, 'lang_directionality_rtl_desc', '{$pluginurl}/images/rtl.gif', 'mceDirectionRTL');
-		}
-
-		return "";
-	},
-
-	execCommand : function(editor_id, element, command, user_interface, value) {
-		// Handle commands
-		switch (command) {
-			case "mceDirectionLTR":
-				var inst = tinyMCE.getInstanceById(editor_id);
-				var elm = tinyMCE.getParentElement(inst.getFocusElement(), "p,div,td,h1,h2,h3,h4,h5,h6,pre,address");
-
-				if (elm)
-					elm.setAttribute("dir", "ltr");
-
-				tinyMCE.triggerNodeChange(false);
-				return true;
-
-			case "mceDirectionRTL":
-				var inst = tinyMCE.getInstanceById(editor_id);
-				var elm = tinyMCE.getParentElement(inst.getFocusElement(), "p,div,td,h1,h2,h3,h4,h5,h6,pre,address");
-
-				if (elm)
-					elm.setAttribute("dir", "rtl");
-
-				tinyMCE.triggerNodeChange(false);
-				return true;
-		}
-
-		// Pass to next handler in chain
-		return false;
-	},
-
-	handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {
-		function getAttrib(elm, name) {
-			return elm.getAttribute(name) ? elm.getAttribute(name) : "";
-		}
-
-		if (node == null)
-			return;
-
-		var elm = tinyMCE.getParentElement(node, "p,div,td,h1,h2,h3,h4,h5,h6,pre,address");
-		if (!elm) {
-			tinyMCE.switchClass(editor_id + '_ltr', 'mceButtonDisabled');
-			tinyMCE.switchClass(editor_id + '_rtl', 'mceButtonDisabled');
-			return true;
-		}
-
-		tinyMCE.switchClass(editor_id + '_ltr', 'mceButtonNormal');
-		tinyMCE.switchClass(editor_id + '_rtl', 'mceButtonNormal');
-
-		var dir = getAttrib(elm, "dir");
-		if (dir == "ltr" || dir == "")
-			tinyMCE.switchClass(editor_id + '_ltr', 'mceButtonSelected');
-		else
-			tinyMCE.switchClass(editor_id + '_rtl', 'mceButtonSelected');
-
-		return true;
-	}
-};
-
-tinyMCE.addPlugin("directionality", TinyMCE_DirectionalityPlugin);
+(function(){tinymce.create('tinymce.plugins.Directionality',{init:function(ed,url){var t=this;t.editor=ed;ed.addCommand('mceDirectionLTR',function(){var e=ed.dom.getParent(ed.selection.getNode(),ed.dom.isBlock);if(e){if(ed.dom.getAttrib(e,"dir")!="ltr")ed.dom.setAttrib(e,"dir","ltr");else ed.dom.setAttrib(e,"dir","");}ed.nodeChanged();});ed.addCommand('mceDirectionRTL',function(){var e=ed.dom.getParent(ed.selection.getNode(),ed.dom.isBlock);if(e){if(ed.dom.getAttrib(e,"dir")!="rtl")ed.dom.setAttrib(e,"dir","rtl");else ed.dom.setAttrib(e,"dir","");}ed.nodeChanged();});ed.addButton('ltr',{title:'directionality.ltr_desc',cmd:'mceDirectionLTR'});ed.addButton('rtl',{title:'directionality.rtl_desc',cmd:'mceDirectionRTL'});ed.onNodeChange.add(t._nodeChange,t);},getInfo:function(){return{longname:'Directionality',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/directionality',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_nodeChange:function(ed,cm,n){var dom=ed.dom,dir;n=dom.getParent(n,dom.isBlock);if(!n){cm.setDisabled('ltr',1);cm.setDisabled('rtl',1);return;}dir=dom.getAttrib(n,'dir');cm.setActive('ltr',dir=="ltr");cm.setDisabled('ltr',0);cm.setActive('rtl',dir=="rtl");cm.setDisabled('rtl',0);}});tinymce.PluginManager.add('directionality',tinymce.plugins.Directionality);})();
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/directionality/images/ltr.gif 2.5.src/wp-includes/js/tinymce/plugins/directionality/images/ltr.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/directionality/images/ltr.gif	2005-11-30 11:15:43.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/directionality/images/ltr.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a   *LZ^[N|@=@xxxBne'/'RJR   !   ,       HI8{7^@8X1J	-H<kQ0 0P@m	veR/6D.ht ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/directionality/images/rtl.gif 2.5.src/wp-includes/js/tinymce/plugins/directionality/images/rtl.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/directionality/images/rtl.gif	2005-11-30 11:15:43.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/directionality/images/rtl.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-GIF89a  
 .ROMO^Jr><>jni}7_   !   ,       FI8ͻNs
-%@KCq`
- &Q
-B c$a1Njƪb׏xL. ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/directionality/langs/en.js 2.5.src/wp-includes/js/tinymce/plugins/directionality/langs/en.js
--- 2.2.2.src/wp-includes/js/tinymce/plugins/directionality/langs/en.js	2007-01-16 11:52:13.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/directionality/langs/en.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,6 +0,0 @@
-// UK lang variables
-
-tinyMCE.addToLang('',{
-directionality_ltr_desc : 'Direction left to right (Alt-.)',
-directionality_rtl_desc : 'Direction right to left (Alt-,)'
-});
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/fullscreen/editor_plugin.js 2.5.src/wp-includes/js/tinymce/plugins/fullscreen/editor_plugin.js
--- 2.2.2.src/wp-includes/js/tinymce/plugins/fullscreen/editor_plugin.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/fullscreen/editor_plugin.js	2008-03-12 17:47:11.000000000 -0500
@@ -0,0 +1 @@
+(function(){var DOM=tinymce.DOM;tinymce.create('tinymce.plugins.FullScreenPlugin',{init:function(ed,url){var t=this,s={},vp;t.editor=ed;ed.addCommand('mceFullScreen',function(){var win,de=document.documentElement;if(ed.getParam('fullscreen_is_enabled')){if(ed.getParam('fullscreen_new_window'))closeFullscreen();else{window.setTimeout(function(){tinymce.dom.Event.remove(window,'resize',t.resizeFunc);tinyMCE.get(ed.getParam('fullscreen_editor_id')).setContent(ed.getContent({format:'raw'}),{format:'raw'});tinyMCE.remove(ed);DOM.remove('mce_fullscreen_container');de.style.overflow=ed.getParam('fullscreen_html_overflow');DOM.setStyle(document.body,'overflow',ed.getParam('fullscreen_overflow'));window.scrollTo(ed.getParam('fullscreen_scrollx'),ed.getParam('fullscreen_scrolly'));tinyMCE.settings=tinyMCE.oldSettings;},10);}return;}if(ed.getParam('fullscreen_new_window')){win=window.open(url+"/fullscreen.htm","mceFullScreenPopup","fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=yes,left=0,top=0,width="+screen.availWidth+",height="+screen.availHeight);try{win.resizeTo(screen.availWidth,screen.availHeight);}catch(e){}}else{tinyMCE.oldSettings=tinyMCE.settings;s.fullscreen_overflow=DOM.getStyle(document.body,'overflow',1)||'auto';s.fullscreen_html_overflow=DOM.getStyle(de,'overflow',1);vp=DOM.getViewPort();s.fullscreen_scrollx=vp.x;s.fullscreen_scrolly=vp.y;if(tinymce.isOpera&&s.fullscreen_overflow=='visible')s.fullscreen_overflow='auto';if(tinymce.isIE&&s.fullscreen_overflow=='scroll')s.fullscreen_overflow='auto';if(s.fullscreen_overflow=='0px')s.fullscreen_overflow='';DOM.setStyle(document.body,'overflow','hidden');de.style.overflow='hidden';vp=DOM.getViewPort();window.scrollTo(0,0);if(tinymce.isIE)vp.h-=1;n=DOM.add(document.body,'div',{id:'mce_fullscreen_container',style:'position:absolute;top:0;left:0;width:'+vp.w+'px;height:'+vp.h+'px;z-index:150;'});DOM.add(n,'div',{id:'mce_fullscreen'});tinymce.each(ed.settings,function(v,n){s[n]=v;});s.id='mce_fullscreen';s.width=n.clientWidth;s.height=n.clientHeight-15;s.fullscreen_is_enabled=true;s.fullscreen_editor_id=ed.id;s.theme_advanced_resizing=false;s.save_onsavecallback=function(){ed.setContent(tinyMCE.get(s.id).getContent({format:'raw'}),{format:'raw'});ed.execCommand('mceSave');};tinymce.each(ed.getParam('fullscreen_settings'),function(v,k){s[k]=v;});if(s.theme_advanced_toolbar_location==='external')s.theme_advanced_toolbar_location='top';t.fullscreenEditor=new tinymce.Editor('mce_fullscreen',s);t.fullscreenEditor.onInit.add(function(){t.fullscreenEditor.setContent(ed.getContent());});t.fullscreenEditor.render();tinyMCE.add(t.fullscreenEditor);t.fullscreenElement=new tinymce.dom.Element('mce_fullscreen_container');t.fullscreenElement.update();t.resizeFunc=tinymce.dom.Event.add(window,'resize',function(){var vp=tinymce.DOM.getViewPort();t.fullscreenEditor.theme.resizeTo(vp.w,vp.h);});}});ed.addButton('fullscreen',{title:'fullscreen.desc',cmd:'mceFullScreen'});ed.onNodeChange.add(function(ed,cm){cm.setActive('fullscreen',ed.getParam('fullscreen_is_enabled'));});},getInfo:function(){return{longname:'Fullscreen',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullscreen',version:tinymce.majorVersion+"."+tinymce.minorVersion};}});tinymce.PluginManager.add('fullscreen',tinymce.plugins.FullScreenPlugin);})();
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/fullscreen/fullscreen.htm 2.5.src/wp-includes/js/tinymce/plugins/fullscreen/fullscreen.htm
--- 2.2.2.src/wp-includes/js/tinymce/plugins/fullscreen/fullscreen.htm	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/fullscreen/fullscreen.htm	2008-02-26 23:36:42.000000000 -0600
@@ -0,0 +1,111 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title></title>
+	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+	<script type="text/javascript" src="../../tiny_mce.js"></script>
+	<script type="text/javascript">
+		function patchCallback(settings, key) {
+			if (settings[key])
+				settings[key] = "window.opener." + settings[key];
+		}
+
+		var settings = {}, paSe = window.opener.tinyMCE.activeEditor.settings;
+
+		// Clone array
+		for (var n in paSe)
+			settings[n] = paSe[n];
+
+		// Override options for fullscreen
+		for (var n in paSe.fullscreen_settings)
+			settings[n] = paSe.fullscreen_settings[n];
+
+		// Patch callbacks, make them point to window.opener
+		patchCallback(settings, 'urlconverter_callback');
+		patchCallback(settings, 'insertlink_callback');
+		patchCallback(settings, 'insertimage_callback');
+		patchCallback(settings, 'setupcontent_callback');
+		patchCallback(settings, 'save_callback');
+		patchCallback(settings, 'onchange_callback');
+		patchCallback(settings, 'init_instance_callback');
+		patchCallback(settings, 'file_browser_callback');
+		patchCallback(settings, 'cleanup_callback');
+		patchCallback(settings, 'execcommand_callback');
+		patchCallback(settings, 'oninit');
+
+		// Set options
+		delete settings.id;
+		settings['mode'] = 'exact';
+		settings['elements'] = 'fullscreenarea';
+		settings['add_unload_trigger'] = false;
+		settings['ask'] = false;
+		settings['document_base_url'] = window.opener.tinyMCE.activeEditor.documentBaseURI.getURI();
+		settings['fullscreen_is_enabled'] = true;
+		settings['fullscreen_editor_id'] = window.opener.tinyMCE.activeEditor.id;
+		settings['theme_advanced_resizing'] = false;
+		settings['strict_loading_mode'] = true;
+
+		settings.save_onsavecallback = function() {
+			window.opener.tinyMCE.activeEditor.setContent(tinyMCE.get('fullscreenarea').getContent({format : 'raw'}), {format : 'raw'});
+			window.opener.tinyMCE.activeEditor.execCommand('mceSave');
+			window.close();
+		};
+
+		function unloadHandler(e) {
+			moveContent();
+		}
+
+		function moveContent() {
+			window.opener.tinyMCE.activeEditor.setContent(tinyMCE.activeEditor.getContent());
+		}
+
+		function closeFullscreen() {
+			moveContent();
+			window.close();
+		}
+
+		function doParentSubmit() {
+			moveContent();
+
+			if (window.opener.tinyMCE.selectedInstance.formElement.form)
+				window.opener.tinyMCE.selectedInstance.formElement.form.submit();
+
+			window.close();
+
+			return false;
+		}
+
+		function render() {
+			var e = document.getElementById('fullscreenarea'), vp, ed, ow, oh, dom = tinymce.DOM;
+
+			e.value = window.opener.tinyMCE.activeEditor.getContent();
+
+			vp = dom.getViewPort();
+			settings.width = vp.w;
+			settings.height = vp.h - 15;
+
+			tinymce.dom.Event.add(window, 'resize', function() {
+				var vp = dom.getViewPort();
+
+				tinyMCE.activeEditor.theme.resizeTo(vp.w, vp.h);
+			});
+
+			tinyMCE.init(settings);
+		}
+
+		// Add onunload
+		tinymce.dom.Event.add(window, "beforeunload", unloadHandler);
+	</script>
+	<base target="_self" />
+</head>
+<body style="margin:0;overflow:hidden;width:100%;height:100%" scrolling="no" scroll="no">
+<form onsubmit="doParentSubmit();">
+<textarea id="fullscreenarea" style="width:100%; height:100%"></textarea>
+</form>
+
+<script type="text/javascript">
+	render();
+</script>
+
+</body>
+</html>
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/css/inlinepopup.css 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/css/inlinepopup.css
--- 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/css/inlinepopup.css	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/css/inlinepopup.css	1969-12-31 18:00:00.000000000 -0600
@@ -1,69 +0,0 @@
-/* Window classes */
-
-.mceWindow {
-	position: absolute;
-	left: 0;
-	top: 0;
-	border: 1px solid black;
-	background-color: #D4D0C8;
-}
-
-.mceWindowHead {
-	background-color: #334F8D;
-	width: 100%;
-	height: 18px;
-	cursor: move;
-	overflow: hidden;
-}
-
-.mceWindowBody {
-	clear: both;
-	background-color: white;
-}
-
-.mceWindowStatusbar {
-	background-color: #D4D0C8;
-	height: 12px;
-	border-top: 1px solid black;
-}
-
-.mceWindowTitle {
-	float: left;
-	font-family: "MS Sans Serif";
-	font-size: 9pt;
-	font-weight: bold;
-	line-height: 18px;
-	color: white;
-	margin-left: 2px;
-	overflow: hidden;
-}
-
-.mceWindowHeadTools {
-	margin-right: 2px;
-}
-
-.mceWindowClose, .mceWindowMinimize, .mceWindowMaximize {
-	display: block;
-	float: right;
-	overflow: hidden;
-	margin-top: 2px;
-}
-
-.mceWindowClose {
-	margin-left: 2px;
-}
-
-.mceWindowMinimize {
-}
-
-.mceWindowMaximize {
-}
-
-.mceWindowResize {
-	display: block;
-	float: right;
-	overflow: hidden;
-	cursor: se-resize;
-	width: 12px;
-	height: 12px;
-}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/editor_plugin.js 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/editor_plugin.js
--- 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/editor_plugin.js	2007-04-12 12:04:03.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/editor_plugin.js	2008-03-25 22:22:53.000000000 -0500
@@ -1,817 +1 @@
-/**
- * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $
- *
- * Moxiecode DHTML Windows script.
- *
- * @author Moxiecode
- * @copyright Copyright  2004-2007, Moxiecode Systems AB, All rights reserved.
- */
-
-// Patch openWindow, closeWindow TinyMCE functions
-
-var TinyMCE_InlinePopupsPlugin = {
-	getInfo : function() {
-		return {
-			longname : 'Inline Popups',
-			author : 'Moxiecode Systems AB',
-			authorurl : 'http://tinymce.moxiecode.com',
-			infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/inlinepopups',
-			version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
-		};
-	}
-};
-
-tinyMCE.addPlugin("inlinepopups", TinyMCE_InlinePopupsPlugin);
-
-// Patch openWindow, closeWindow TinyMCE functions
-
-TinyMCE_Engine.prototype.orgOpenWindow = TinyMCE_Engine.prototype.openWindow;
-TinyMCE_Engine.prototype.orgCloseWindow = TinyMCE_Engine.prototype.closeWindow;
-
-TinyMCE_Engine.prototype.openWindow = function(template, args) {
-	// Does the caller support inline
-	if (args['inline'] != "yes" || tinyMCE.isOpera || tinyMCE.getParam("plugins").indexOf('inlinepopups') == -1) {
-		mcWindows.selectedWindow = null;
-		args['mce_inside_iframe'] = false;
-		this.orgOpenWindow(template, args);
-		return;
-	}
-
-	var url, resizable, scrollbars;
-
-	args['mce_inside_iframe'] = true;
-	tinyMCE.windowArgs = args;
-
-	if (template['file'].charAt(0) != '/' && template['file'].indexOf('://') == -1)
-		url = tinyMCE.baseURL + "/themes/" + tinyMCE.getParam("theme") + "/" + template['file'];
-	else
-		url = template['file'];
-
-	if (!(width = parseInt(template['width'])))
-		width = 320;
-
-	if (!(height = parseInt(template['height'])))
-		height = 200;
-
-	if (!(minWidth = parseInt(template['minWidth'])))
-		minWidth = 100;
-
-	if (!(minHeight = parseInt(template['minHeight'])))
-		minHeight = 100;
-
-	resizable = (args && args['resizable']) ? args['resizable'] : "no";
-	scrollbars = (args && args['scrollbars']) ? args['scrollbars'] : "no";
-
-	height += 18;
-
-	// Replace all args as variables in URL
-	for (var name in args) {
-		if (typeof(args[name]) == 'function')
-			continue;
-
-		url = tinyMCE.replaceVar(url, name, escape(args[name]));
-	}
-
-	var elm = document.getElementById(this.selectedInstance.editorId + '_parent');
-
-	if (tinyMCE.hasPlugin('fullscreen') && this.selectedInstance.getData('fullscreen').enabled)
-		pos = { absLeft: 0, absTop: 0 };
-	else
-		pos = tinyMCE.getAbsPosition(elm);
-
-	// Center div in editor area
-	pos.absLeft += Math.round((elm.firstChild.clientWidth / 2) - (width / 2));
-	pos.absTop += Math.round((elm.firstChild.clientHeight / 2) - (height / 2));
-
-	url += tinyMCE.settings['imp_version'] ? (url.indexOf('?')==-1?'?':'&') + 'ver=' + tinyMCE.settings['imp_version'] : ''; // WordPress cache buster
-
-	mcWindows.open(url, mcWindows.idCounter++, "modal=yes,width=" + width+ ",height=" + height + ",resizable=" + resizable + ",scrollbars=" + scrollbars + ",statusbar=" + resizable + ",left=" + pos.absLeft + ",top=" + pos.absTop + ",minWidth=" + minWidth + ",minHeight=" + minHeight );
-};
-
-TinyMCE_Engine.prototype.closeWindow = function(win) {
-	var gotit = false, n, w;
-	for (n in mcWindows.windows) {
-		w = mcWindows.windows[n];
-		if (typeof(w) == 'function') continue;
-		if (win.name == w.id + '_iframe') {
-			w.close();
-			gotit = true;
-		}
-	}
-	if (!gotit)
-		this.orgCloseWindow(win);
-
-	tinyMCE.selectedInstance.getWin().focus(); 
-};
-
-TinyMCE_Engine.prototype.setWindowTitle = function(win_ref, title) {
-	for (var n in mcWindows.windows) {
-		var win = mcWindows.windows[n];
-		if (typeof(win) == 'function')
-			continue;
-
-		if (win_ref.name == win.id + "_iframe")
-			window.frames[win.id + "_iframe"].document.getElementById(win.id + '_title').innerHTML = title;
-	}
-};
-
-// * * * * * TinyMCE_Windows classes below
-
-// Windows handler
-function TinyMCE_Windows() {
-	this.settings = new Array();
-	this.windows = new Array();
-	this.isMSIE = (navigator.appName == "Microsoft Internet Explorer");
-	this.isGecko = navigator.userAgent.indexOf('Gecko') != -1;
-	this.isSafari = navigator.userAgent.indexOf('Safari') != -1;
-	this.isMac = navigator.userAgent.indexOf('Mac') != -1;
-	this.isMSIE5_0 = this.isMSIE && (navigator.userAgent.indexOf('MSIE 5.0') != -1);
-	this.action = "none";
-	this.selectedWindow = null;
-	this.lastSelectedWindow = null;
-	this.zindex = 1001;
-	this.mouseDownScreenX = 0;
-	this.mouseDownScreenY = 0;
-	this.mouseDownLayerX = 0;
-	this.mouseDownLayerY = 0;
-	this.mouseDownWidth = 0;
-	this.mouseDownHeight = 0;
-	this.idCounter = 0;
-};
-
-TinyMCE_Windows.prototype.init = function(settings) {
-	this.settings = settings;
-
-	if (this.isMSIE)
-		this.addEvent(document, "mousemove", mcWindows.eventDispatcher);
-	else
-		this.addEvent(window, "mousemove", mcWindows.eventDispatcher);
-
-	this.addEvent(document, "mouseup", mcWindows.eventDispatcher);
-
-	this.addEvent(window, "resize", mcWindows.eventDispatcher);
-	this.addEvent(document, "scroll", mcWindows.eventDispatcher);
-
-	this.doc = document;
-};
-
-TinyMCE_Windows.prototype.getBounds = function() {
-	if (!this.bounds) {
-		var vp = tinyMCE.getViewPort(window);
-		var top, left, bottom, right, docEl = this.doc.documentElement;
-
-		top    = vp.top;
-		left   = vp.left;
-		bottom = vp.height + top - 2;
-		right  = vp.width  + left - 22; // TODO this number is platform dependant
-		// x1, y1, x2, y2
-		this.bounds = [left, top, right, bottom];
-	}
-	return this.bounds;
-};
-
-TinyMCE_Windows.prototype.clampBoxPosition = function(x, y, w, h, minW, minH) {
-	var bounds = this.getBounds();
-
-	x = Math.max(bounds[0], Math.min(bounds[2], x + w) - w);
-	y = Math.max(bounds[1], Math.min(bounds[3], y + h) - h);
-
-	return this.clampBoxSize(x, y, w, h, minW, minH);
-};
-
-TinyMCE_Windows.prototype.clampBoxSize = function(x, y, w, h, minW, minH) {
-	var bounds = this.getBounds();
-
-	return [
-		x, y,
-		Math.max(minW, Math.min(bounds[2], x + w) - x),
-		Math.max(minH, Math.min(bounds[3], y + h) - y)
-	];
-};
-
-TinyMCE_Windows.prototype.getParam = function(name, default_value) {
-	var value = null;
-
-	value = (typeof(this.settings[name]) == "undefined") ? default_value : this.settings[name];
-
-	// Fix bool values
-	if (value == "true" || value == "false")
-		return (value == "true");
-
-	return value;
-};
-
-TinyMCE_Windows.prototype.eventDispatcher = function(e) {
-	e = typeof(e) == "undefined" ? window.event : e;
-
-	if (mcWindows.selectedWindow == null)
-		return;
-
-	// Switch focus
-	if (mcWindows.isGecko && e.type == "mousedown") {
-		var elm = e.currentTarget;
-
-		for (var n in mcWindows.windows) {
-			var win = mcWindows.windows[n];
-
-			if (win.headElement == elm || win.resizeElement == elm) {
-				win.focus();
-				break;
-			}
-		}
-	}
-
-	switch (e.type) {
-		case "mousemove":
-			mcWindows.selectedWindow.onMouseMove(e);
-			break;
-
-		case "mouseup":
-			mcWindows.selectedWindow.onMouseUp(e);
-			break;
-
-		case "mousedown":
-			mcWindows.selectedWindow.onMouseDown(e);
-			break;
-
-		case "focus":
-			mcWindows.selectedWindow.onFocus(e);
-			break;
-		case "scroll":
-		case "resize":
-			if (mcWindows.clampUpdateTimeout)
-				clearTimeout(mcWindows.clampUpdateTimeout);
-			mcWindows.clampEventType = e.type;
-			mcWindows.clampUpdateTimeout =
-				setTimeout(function () {mcWindows.updateClamping()}, 100);
-			break;
-	}
-};
-
-TinyMCE_Windows.prototype.updateClamping = function () {
-	var clamp, oversize, etype = mcWindows.clampEventType;
-
-	this.bounds = null; // Recalc window bounds on resize/scroll
-	this.clampUpdateTimeout = null;
-
-	for (var n in this.windows) {
-		win = this.windows[n];
-		if (typeof(win) == 'function' || ! win.winElement) continue;
-
-		clamp = mcWindows.clampBoxPosition(
-			win.left, win.top,
-			win.winElement.scrollWidth,
-			win.winElement.scrollHeight,
-			win.features.minWidth,
-			win.features.minHeight
-		);
-		oversize = (
-			clamp[2] != win.winElement.scrollWidth ||
-			clamp[3] != win.winElement.scrollHeight
-		) ? true : false;
-
-		if (!oversize || win.features.resizable == "yes" || etype != "scroll")
-			win.moveTo(clamp[0], clamp[1]);
-		if (oversize && win.features.resizable == "yes")
-			win.resizeTo(clamp[2], clamp[3]);
-	}
-};
-
-TinyMCE_Windows.prototype.addEvent = function(obj, name, handler) {
-	if (this.isMSIE)
-		obj.attachEvent("on" + name, handler);
-	else
-		obj.addEventListener(name, handler, false);
-};
-
-TinyMCE_Windows.prototype.cancelEvent = function(e) {
-	if (this.isMSIE) {
-		e.returnValue = false;
-		e.cancelBubble = true;
-	} else
-		e.preventDefault();
-};
-
-TinyMCE_Windows.prototype.parseFeatures = function(opts) {
-	// Cleanup the options
-	opts = opts.toLowerCase();
-	opts = opts.replace(/;/g, ",");
-	opts = opts.replace(/[^0-9a-z=,]/g, "");
-
-	var optionChunks = opts.split(',');
-	var options = new Array();
-
-	options['left'] = "10";
-	options['top'] = "10";
-	options['width'] = "300";
-	options['height'] = "300";
-	options['minwidth'] = "100";
-	options['minheight'] = "100";
-	options['resizable'] = "yes";
-	options['minimizable'] = "yes";
-	options['maximizable'] = "yes";
-	options['close'] = "yes";
-	options['movable'] = "yes";
-	options['statusbar'] = "yes";
-	options['scrollbars'] = "auto";
-	options['modal'] = "no";
-
-	if (opts == "")
-		return options;
-
-	for (var i=0; i<optionChunks.length; i++) {
-		var parts = optionChunks[i].split('=');
-
-		if (parts.length == 2)
-			options[parts[0]] = parts[1];
-	}
-
-	options['left'] = parseInt(options['left']);
-	options['top'] = parseInt(options['top']);
-	options['width'] = parseInt(options['width']);
-	options['height'] = parseInt(options['height']);
-	options['minWidth'] = parseInt(options['minwidth']);
-	options['minHeight'] = parseInt(options['minheight']);
-
-	return options;
-};
-
-TinyMCE_Windows.prototype.open = function(url, name, features) {
-	this.lastSelectedWindow = this.selectedWindow;
-
-	var win = new TinyMCE_Window();
-	var winDiv, html = "", id;
-	var imgPath = this.getParam("images_path");
-
-	features = this.parseFeatures(features);
-
-	// Clamp specified dimensions
-	var clamp = mcWindows.clampBoxPosition(
-		features['left'], features['top'],
-		features['width'], features['height'],
-		features['minWidth'], features['minHeight']
-	);
-
-	features['left'] = clamp[0];
-	features['top'] = clamp[1];
-
-	if (features['resizable'] == "yes") {
-		features['width'] = clamp[2];
-		features['height'] = clamp[3];
-	}
-
-	// Create div
-	id = "mcWindow_" + name;
-	win.deltaHeight = 18;
-
-	if (features['statusbar'] == "yes") {
-		win.deltaHeight += 13;
-
-		if (this.isMSIE)
-			win.deltaHeight += 1;
-	}
-
-	width = parseInt(features['width']);
-	height = parseInt(features['height'])-win.deltaHeight;
-
-	if (this.isMSIE)
-		width -= 2;
-
-	// Setup first part of window
-	win.id = id;
-	win.url = url;
-	win.name = name;
-	win.features = features;
-	this.windows[name] = win;
-
-	iframeWidth = width;
-	iframeHeight = height;
-
-	// Create inner content
-	html += '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">';
-	html += '<html>';
-	html += '<head>';
-	html += '<title>Wrapper iframe</title>';
-	if (this.isMac) html += '<style type="text/css">.mceWindowTitle{float:none;margin:0;width:100%;text-align:center;}.mceWindowClose{float:none;position:absolute;left:0px;top:0px;}</style>';
-	html += '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">';
-	html += '<link href="' + this.getParam("css_file") + '" rel="stylesheet" type="text/css" />';
-	html += '</head>';
-	html += '<body onload="parent.mcWindows.onLoad(\'' + name + '\');">';
-
-	html += '<div id="' + id + '_container" class="mceWindow">';
-	html += '<div id="' + id + '_head" class="mceWindowHead" onmousedown="parent.mcWindows.windows[\'' + name + '\'].focus();">';
-	html += '  <div id="' + id + '_title" class="mceWindowTitle"';
-	html += '  onselectstart="return false;" unselectable="on" style="-moz-user-select: none !important;"></div>';
-	html += '    <div class="mceWindowHeadTools">';
-	html += '      <a href="javascript:parent.mcWindows.windows[\'' + name + '\'].close();" target="_self" onmousedown="return false;" class="mceWindowClose"><img border="0" src="' + imgPath + '/window_close.gif" /></a>';
-	if (features['resizable'] == "yes" && features['maximizable'] == "yes")
-		html += '      <a href="javascript:parent.mcWindows.windows[\'' + name + '\'].maximize();" target="_self" onmousedown="return false;" class="mceWindowMaximize"><img border="0" src="' + imgPath + '/window_maximize.gif" /></a>';
-	// html += '      <a href="javascript:mcWindows.windows[\'' + name + '\'].minimize();" target="_self" onmousedown="return false;" class="mceWindowMinimize"></a>';
-	html += '    </div>';
-	html += '</div><div id="' + id + '_body" class="mceWindowBody" style="width: ' + width + 'px; height: ' + height + 'px;">';
-	html += '<iframe id="' + id + '_iframe" name="' + id + '_iframe" frameborder="0" width="' + iframeWidth + '" height="' + iframeHeight + '" src="' + url + '" class="mceWindowBodyIframe" scrolling="' + features['scrollbars'] + '"></iframe></div>';
-
-	if (features['statusbar'] == "yes") {
-		html += '<div id="' + id + '_statusbar" class="mceWindowStatusbar" onmousedown="parent.mcWindows.windows[\'' + name + '\'].focus();">';
-
-		if (features['resizable'] == "yes") {
-			if (this.isGecko)
-				html += '<div id="' + id + '_resize" class="mceWindowResize"><div style="background-image: url(\'' + imgPath + '/window_resize.gif\'); width: 12px; height: 12px;"></div></div>';
-			else
-				html += '<div id="' + id + '_resize" class="mceWindowResize"><img onmousedown="parent.mcWindows.windows[\'' + name + '\'].focus();" border="0" src="' + imgPath + '/window_resize.gif" /></div>';
-		}
-
-		html += '</div>';
-	}
-
-	html += '</div>';
-
-	html += '</body>';
-	html += '</html>';
-
-	// Create iframe
-	this.createFloatingIFrame(id, features['left'], features['top'], features['width'], features['height'], html);
-};
-
-// Blocks the document events by placing a image over the whole document
-TinyMCE_Windows.prototype.setDocumentLock = function(state) {
-	var elm = document.getElementById('mcWindowEventBlocker');
-
-	if (state) {
-		if (elm == null) {
-			elm = document.createElement("div");
-
-			elm.id = "mcWindowEventBlocker";
-			elm.style.position = "absolute";
-			elm.style.left = "0";
-			elm.style.top = "0";
-
-			document.body.appendChild(elm);
-		}
-
-		elm.style.display = "none";
-
-		var imgPath = this.getParam("images_path");
-		var width = document.body.clientWidth;
-		var height = document.body.clientHeight;
-
-		elm.style.width = width;
-		elm.style.height = height;
-		elm.innerHTML = '<img src="' + imgPath + '/spacer.gif" width="' + width + '" height="' + height + '" />';
-
-		elm.style.zIndex = mcWindows.zindex-1;
-		elm.style.display = "block";
-	} else if (elm != null) {
-		if (mcWindows.windows.length == 0)
-			elm.parentNode.removeChild(elm);
-		else
-			elm.style.zIndex = mcWindows.zindex-1;
-	}
-};
-
-// Gets called when wrapper iframe is initialized
-TinyMCE_Windows.prototype.onLoad = function(name) {
-	var win = mcWindows.windows[name];
-	var id = "mcWindow_" + name;
-	var wrapperIframe = window.frames[id + "_iframe"].frames[0];
-	var wrapperDoc = window.frames[id + "_iframe"].document;
-	var doc = window.frames[id + "_iframe"].document;
-	var winDiv = document.getElementById("mcWindow_" + name + "_div");
-	var realIframe = window.frames[id + "_iframe"].frames[0];
-
-	// Set window data
-	win.id = "mcWindow_" + name;
-	win.winElement = winDiv;
-	win.bodyElement = doc.getElementById(id + '_body');
-	win.iframeElement = doc.getElementById(id + '_iframe');
-	win.headElement = doc.getElementById(id + '_head');
-	win.titleElement = doc.getElementById(id + '_title');
-	win.resizeElement = doc.getElementById(id + '_resize');
-	win.containerElement = doc.getElementById(id + '_container');
-	win.left = win.features['left'];
-	win.top = win.features['top'];
-	win.frame = window.frames[id + '_iframe'].frames[0];
-	win.wrapperFrame = window.frames[id + '_iframe'];
-	win.wrapperIFrameElement = document.getElementById(id + "_iframe");
-
-	// Add event handlers
-	mcWindows.addEvent(win.headElement, "mousedown", mcWindows.eventDispatcher);
-
-	if (win.resizeElement != null)
-		mcWindows.addEvent(win.resizeElement, "mousedown", mcWindows.eventDispatcher);
-
-	if (mcWindows.isMSIE) {
-		mcWindows.addEvent(realIframe.document, "mousemove", mcWindows.eventDispatcher);
-		mcWindows.addEvent(realIframe.document, "mouseup", mcWindows.eventDispatcher);
-	} else {
-		mcWindows.addEvent(realIframe, "mousemove", mcWindows.eventDispatcher);
-		mcWindows.addEvent(realIframe, "mouseup", mcWindows.eventDispatcher);
-		mcWindows.addEvent(realIframe, "focus", mcWindows.eventDispatcher);
-	}
-
-	for (var i=0; i<window.frames.length; i++) {
-		if (!window.frames[i]._hasMouseHandlers) {
-			if (mcWindows.isMSIE) {
-				mcWindows.addEvent(window.frames[i].document, "mousemove", mcWindows.eventDispatcher);
-				mcWindows.addEvent(window.frames[i].document, "mouseup", mcWindows.eventDispatcher);
-			} else {
-				mcWindows.addEvent(window.frames[i], "mousemove", mcWindows.eventDispatcher);
-				mcWindows.addEvent(window.frames[i], "mouseup", mcWindows.eventDispatcher);
-			}
-
-			window.frames[i]._hasMouseHandlers = true;
-		}
-	}
-
-	if (mcWindows.isMSIE) {
-		mcWindows.addEvent(win.frame.document, "mousemove", mcWindows.eventDispatcher);
-		mcWindows.addEvent(win.frame.document, "mouseup", mcWindows.eventDispatcher);
-	} else {
-		mcWindows.addEvent(win.frame, "mousemove", mcWindows.eventDispatcher);
-		mcWindows.addEvent(win.frame, "mouseup", mcWindows.eventDispatcher);
-		mcWindows.addEvent(win.frame, "focus", mcWindows.eventDispatcher);
-	}
-
-	// Dispatch open window event
-	var func = this.getParam("on_open_window", "");
-	if (func != "")
-		eval(func + "(win);");
-
-	win.focus();
-
-	if (win.features['modal'] == "yes")
-		mcWindows.setDocumentLock(true);
-};
-
-TinyMCE_Windows.prototype.createFloatingIFrame = function(id_prefix, left, top, width, height, html) {
-	var iframe = document.createElement("iframe");
-	var div = document.createElement("div"), doc;
-
-	width = parseInt(width);
-	height = parseInt(height)+1;
-
-	// Create wrapper div
-	div.setAttribute("id", id_prefix + "_div");
-	div.setAttribute("width", width);
-	div.setAttribute("height", (height));
-	div.style.position = "absolute";
-
-	div.style.left = left + "px";
-	div.style.top = top + "px";
-	div.style.width = width + "px";
-	div.style.height = (height) + "px";
-	div.style.backgroundColor = "white";
-	div.style.display = "none";
-
-	if (this.isGecko) {
-		iframeWidth = width + 2;
-		iframeHeight = height + 2;
-	} else {
-		iframeWidth = width;
-		iframeHeight = height + 1;
-	}
-
-	// Create iframe
-	iframe.setAttribute("id", id_prefix + "_iframe");
-	iframe.setAttribute("name", id_prefix + "_iframe");
-	iframe.setAttribute("border", "0");
-	iframe.setAttribute("frameBorder", "0");
-	iframe.setAttribute("marginWidth", "0");
-	iframe.setAttribute("marginHeight", "0");
-	iframe.setAttribute("leftMargin", "0");
-	iframe.setAttribute("topMargin", "0");
-	iframe.setAttribute("width", iframeWidth);
-	iframe.setAttribute("height", iframeHeight);
-	// iframe.setAttribute("src", "../jscripts/tiny_mce/blank.htm");
-	// iframe.setAttribute("allowtransparency", "false");
-	iframe.setAttribute("scrolling", "no");
-	iframe.style.width = iframeWidth + "px";
-	iframe.style.height = iframeHeight + "px";
-	iframe.style.backgroundColor = "white";
-	div.appendChild(iframe);
-
-	document.body.appendChild(div);
-
-	// Fixed MSIE 5.0 issue
-	div.innerHTML = div.innerHTML;
-
-	if (this.isSafari) {
-		// Give Safari some time to setup
-		window.setTimeout(function() {
-			var doc = window.frames[id_prefix + '_iframe'].document;
-			doc.open();
-			doc.write(html);
-			doc.close();
-		}, 10);
-	} else {
-		doc = window.frames[id_prefix + '_iframe'].window.document;
-		doc.open();
-		doc.write(html);
-		doc.close();
-	}
-
-	div.style.display = "block";
-
-	return div;
-};
-
-// Window instance
-function TinyMCE_Window() {
-};
-
-TinyMCE_Window.prototype.focus = function() {
-	if (this != mcWindows.selectedWindow) {
-		this.winElement.style.zIndex = ++mcWindows.zindex;
-		mcWindows.lastSelectedWindow = mcWindows.selectedWindow;
-		mcWindows.selectedWindow = this;
-	}
-};
-
-TinyMCE_Window.prototype.minimize = function() {
-};
-
-TinyMCE_Window.prototype.maximize = function() {
-	if (this.restoreSize) {
-		this.moveTo(this.restoreSize[0], this.restoreSize[1]);
-		this.resizeTo(this.restoreSize[2], this.restoreSize[3]);
-		this.updateClamping();
-		this.restoreSize = null;
-	} else {
-		var bounds = mcWindows.getBounds();
-		this.restoreSize = [
-			this.left, this.top,
-			this.winElement.scrollWidth,
-			this.winElement.scrollHeight
-		];
-		this.moveTo(bounds[0], bounds[1]);
-		this.resizeTo(
-			bounds[2] - bounds[0],
-			bounds[3] - bounds[1]
-		);
-	}
-};
-
-TinyMCE_Window.prototype.startResize = function() {
-	mcWindows.action = "resize";
-};
-
-TinyMCE_Window.prototype.startMove = function(e) {
-	mcWindows.action = "move";
-};
-
-TinyMCE_Window.prototype.close = function() {
-	if (this.frame && this.frame['tinyMCEPopup'])
-		this.frame['tinyMCEPopup'].restoreSelection();
-
-	if (mcWindows.lastSelectedWindow != null)
-		mcWindows.lastSelectedWindow.focus();
-
-	var mcWindowsNew = new Array();
-	for (var n in mcWindows.windows) {
-		var win = mcWindows.windows[n];
-		if (typeof(win) == 'function')
-			continue;
-
-		if (win.name != this.name)
-			mcWindowsNew[n] = win;
-	}
-
-	mcWindows.windows = mcWindowsNew;
-
-	// alert(mcWindows.doc.getElementById(this.id + "_iframe"));
-
-	var e = mcWindows.doc.getElementById(this.id + "_iframe");
-	e.parentNode.removeChild(e);
-
-	var e = mcWindows.doc.getElementById(this.id + "_div");
-	e.parentNode.removeChild(e);
-
-	mcWindows.setDocumentLock(false);
-};
-
-TinyMCE_Window.prototype.onMouseMove = function(e) {
-	var clamp;
-	// Calculate real X, Y
-	var dx = e.screenX - mcWindows.mouseDownScreenX;
-	var dy = e.screenY - mcWindows.mouseDownScreenY;
-
-	switch (mcWindows.action) {
-		case "resize":
-			clamp = mcWindows.clampBoxSize(
-				this.left, this.top,
-				mcWindows.mouseDownWidth + (e.screenX - mcWindows.mouseDownScreenX),
-				mcWindows.mouseDownHeight + (e.screenY - mcWindows.mouseDownScreenY),
-				this.features.minWidth, this.features.minHeight
-			);
-
-			this.resizeTo(clamp[2], clamp[3]);
-
-			mcWindows.cancelEvent(e);
-			break;
-
-		case "move":
-			this.left = mcWindows.mouseDownLayerX + (e.screenX - mcWindows.mouseDownScreenX);
-			this.top = mcWindows.mouseDownLayerY + (e.screenY - mcWindows.mouseDownScreenY);
-			this.updateClamping();
-
-			mcWindows.cancelEvent(e);
-			break;
-	}
-};
-
-TinyMCE_Window.prototype.moveTo = function (x, y) {
-	this.left = x;
-	this.top = y;
-
-	this.winElement.style.left = this.left + "px";
-	this.winElement.style.top = this.top + "px";
-};
-
-TinyMCE_Window.prototype.resizeTo = function (width, height) {
-	this.wrapperIFrameElement.style.width = (width+2) + 'px';
-	this.wrapperIFrameElement.style.height = (height+2) + 'px';
-	this.wrapperIFrameElement.width = width+2;
-	this.wrapperIFrameElement.height = height+2;
-	this.winElement.style.width = width + 'px';
-	this.winElement.style.height = height + 'px';
-
-	height = height - this.deltaHeight;
-
-	this.containerElement.style.width = width + 'px';
-	this.iframeElement.style.width = width + 'px';
-	this.iframeElement.style.height = height + 'px';
-	this.bodyElement.style.width = width + 'px';
-	this.bodyElement.style.height = height + 'px';
-	this.headElement.style.width = width + 'px';
-	//this.statusElement.style.width = width + 'px';
-};
-
-TinyMCE_Window.prototype.updateClamping = function () {
-	var clamp, oversize;
-
-	clamp = mcWindows.clampBoxPosition(
-		this.left, this.top,
-		this.winElement.scrollWidth,
-		this.winElement.scrollHeight,
-		this.features.minWidth, this.features.minHeight
-	);
-	oversize = (
-		clamp[2] != this.winElement.scrollWidth ||
-		clamp[3] != this.winElement.scrollHeight
-	) ? true : false;
-
-	this.moveTo(clamp[0], clamp[1]);
-	if (this.features.resizable == "yes" && oversize)
-		this.resizeTo(clamp[2], clamp[3]);
-};
-
-function debug(msg) {
-	document.getElementById('debug').value += msg + "\n";
-}
-
-TinyMCE_Window.prototype.onMouseUp = function(e) {
-	mcWindows.action = "none";
-};
-
-TinyMCE_Window.prototype.onFocus = function(e) {
-	// Gecko only handler
-	var winRef = e.currentTarget;
-
-	for (var n in mcWindows.windows) {
-		var win = mcWindows.windows[n];
-		if (typeof(win) == 'function')
-			continue;
-
-		if (winRef.name == win.id + "_iframe") {
-			win.focus();
-			return;
-		}
-	}
-};
-
-TinyMCE_Window.prototype.onMouseDown = function(e) {
-	var elm = mcWindows.isMSIE ? this.wrapperFrame.event.srcElement : e.target;
-
-	mcWindows.mouseDownScreenX = e.screenX;
-	mcWindows.mouseDownScreenY = e.screenY;
-	mcWindows.mouseDownLayerX = this.left;
-	mcWindows.mouseDownLayerY = this.top;
-	mcWindows.mouseDownWidth = parseInt(this.winElement.style.width);
-	mcWindows.mouseDownHeight = parseInt(this.winElement.style.height);
-
-	if (this.resizeElement != null && elm == this.resizeElement.firstChild)
-		this.startResize(e);
-	else
-		this.startMove(e);
-
-	mcWindows.cancelEvent(e);
-};
-
-// Global instance
-var mcWindows = new TinyMCE_Windows();
-
-// Initialize windows
-mcWindows.init({
-	images_path : tinyMCE.baseURL + "/plugins/inlinepopups/images",
-	css_file : tinyMCE.baseURL + "/plugins/inlinepopups/css/inlinepopup.css"
-});
+(function(){var DOM=tinymce.DOM,Element=tinymce.dom.Element,Event=tinymce.dom.Event,each=tinymce.each,is=tinymce.is;tinymce.create('tinymce.plugins.InlinePopups',{init:function(ed,url){ed.onBeforeRenderUI.add(function(){ed.windowManager=new tinymce.InlineWindowManager(ed);DOM.loadCSS(url+'/skins/'+(ed.settings.inlinepopups_skin||'clearlooks2')+"/window.css");});},getInfo:function(){return{longname:'InlinePopups',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/inlinepopups',version:tinymce.majorVersion+"."+tinymce.minorVersion};}});tinymce.create('tinymce.InlineWindowManager:tinymce.WindowManager',{InlineWindowManager:function(ed){var t=this;t.parent(ed);t.zIndex=1000;t.count=0;},open:function(f,p){var t=this,id,opt='',ed=t.editor,dw=0,dh=0,vp,po,mdf,clf,we,w,u;f=f||{};p=p||{};if(!f.inline)return t.parent(f,p);if(!f.type)t.bookmark=ed.selection.getBookmark('simple');id=DOM.uniqueId();vp=DOM.getViewPort();f.width=parseInt(f.width||320);f.height=parseInt(f.height||240)+(tinymce.isIE?8:0);f.min_width=parseInt(f.min_width||150);f.min_height=parseInt(f.min_height||100);f.max_width=parseInt(f.max_width||2000);f.max_height=parseInt(f.max_height||2000);f.left=f.left||Math.round(Math.max(vp.x,vp.x+(vp.w/ 2.0) - (f.width /2.0)));f.top=f.top||Math.round(Math.max(vp.y,vp.y+(vp.h/ 2.0) - (f.height /2.0)));f.movable=f.resizable=true;p.mce_width=f.width;p.mce_height=f.height;p.mce_inline=true;p.mce_window_id=id;p.mce_auto_focus=f.auto_focus;t.features=f;t.params=p;t.onOpen.dispatch(t,f,p);if(f.type){opt+=' mceModal';if(f.type)opt+=' mce'+f.type.substring(0,1).toUpperCase()+f.type.substring(1);f.resizable=false;}if(f.statusbar)opt+=' mceStatusbar';if(f.resizable)opt+=' mceResizable';if(f.minimizable)opt+=' mceMinimizable';if(f.maximizable)opt+=' mceMaximizable';if(f.movable)opt+=' mceMovable';t._addAll(document.body,['div',{id:id,'class':ed.settings.inlinepopups_skin||'clearlooks2',dir:'ltr',style:'width:100px;height:100px'},['div',{id:id+'_wrapper','class':'mceWrapper'+opt},['div',{id:id+'_top','class':'mceTop'},['div',{'class':'mceLeft'}],['div',{'class':'mceCenter'}],['div',{'class':'mceRight'}],['span',{id:id+'_title'},f.title||'']],['div',{id:id+'_middle','class':'mceMiddle'},['div',{id:id+'_left','class':'mceLeft'}],['span',{id:id+'_content'}],['div',{id:id+'_right','class':'mceRight'}]],['div',{id:id+'_bottom','class':'mceBottom'},['div',{'class':'mceLeft'}],['div',{'class':'mceCenter'}],['div',{'class':'mceRight'}],['span',{id:id+'_status'},'Content']],['a',{'class':'mceMove',tabindex:'-1',href:'javascript:;'}],['a',{'class':'mceMin',tabindex:'-1',href:'javascript:;',onmousedown:'return false;'}],['a',{'class':'mceMax',tabindex:'-1',href:'javascript:;',onmousedown:'return false;'}],['a',{'class':'mceMed',tabindex:'-1',href:'javascript:;',onmousedown:'return false;'}],['a',{'class':'mceClose',tabindex:'-1',href:'javascript:;',onmousedown:'return false;'}],['a',{id:id+'_resize_n','class':'mceResize mceResizeN',tabindex:'-1',href:'javascript:;'}],['a',{id:id+'_resize_s','class':'mceResize mceResizeS',tabindex:'-1',href:'javascript:;'}],['a',{id:id+'_resize_w','class':'mceResize mceResizeW',tabindex:'-1',href:'javascript:;'}],['a',{id:id+'_resize_e','class':'mceResize mceResizeE',tabindex:'-1',href:'javascript:;'}],['a',{id:id+'_resize_nw','class':'mceResize mceResizeNW',tabindex:'-1',href:'javascript:;'}],['a',{id:id+'_resize_ne','class':'mceResize mceResizeNE',tabindex:'-1',href:'javascript:;'}],['a',{id:id+'_resize_sw','class':'mceResize mceResizeSW',tabindex:'-1',href:'javascript:;'}],['a',{id:id+'_resize_se','class':'mceResize mceResizeSE',tabindex:'-1',href:'javascript:;'}]]]);DOM.setStyles(id,{top:-10000,left:-10000});if(tinymce.isGecko)DOM.setStyle(id,'overflow','auto');if(!f.type){dw+=DOM.get(id+'_left').clientWidth;dw+=DOM.get(id+'_right').clientWidth;dh+=DOM.get(id+'_top').clientHeight;dh+=DOM.get(id+'_bottom').clientHeight;}DOM.setStyles(id,{top:f.top,left:f.left,width:f.width+dw,height:f.height+dh});u=f.url||f.file;if(u&&tinymce.relaxedDomain)u+=(u.indexOf('?')==-1?'?':'&')+'mce_rdomain='+tinymce.relaxedDomain;if(!f.type){DOM.add(id+'_content','iframe',{id:id+'_ifr',src:'javascript:""',frameBorder:0,style:'border:0;width:10px;height:10px'});DOM.setStyles(id+'_ifr',{width:f.width,height:f.height});DOM.setAttrib(id+'_ifr','src',u);}else{DOM.add(id+'_wrapper','a',{id:id+'_ok','class':'mceButton mceOk',href:'javascript:;',onmousedown:'return false;'},'Ok');if(f.type=='confirm')DOM.add(id+'_wrapper','a',{'class':'mceButton mceCancel',href:'javascript:;',onmousedown:'return false;'},'Cancel');DOM.add(id+'_middle','div',{'class':'mceIcon'});DOM.setHTML(id+'_content',f.content.replace('\n','<br />'));}mdf=Event.add(id,'mousedown',function(e){var n=e.target,w,vp;w=t.windows[id];t.focus(id);if(n.nodeName=='A'||n.nodeName=='a'){if(n.className=='mceMax'){w.oldPos=w.element.getXY();w.oldSize=w.element.getSize();vp=DOM.getViewPort();vp.w-=2;vp.h-=2;w.element.moveTo(vp.x,vp.y);w.element.resizeTo(vp.w,vp.h);DOM.setStyles(id+'_ifr',{width:vp.w-w.deltaWidth,height:vp.h-w.deltaHeight});DOM.addClass(id+'_wrapper','mceMaximized');}else if(n.className=='mceMed'){w.element.moveTo(w.oldPos.x,w.oldPos.y);w.element.resizeTo(w.oldSize.w,w.oldSize.h);w.iframeElement.resizeTo(w.oldSize.w-w.deltaWidth,w.oldSize.h-w.deltaHeight);DOM.removeClass(id+'_wrapper','mceMaximized');}else if(n.className=='mceMove')return t._startDrag(id,e,n.className);else if(DOM.hasClass(n,'mceResize'))return t._startDrag(id,e,n.className.substring(13));}});clf=Event.add(id,'click',function(e){var n=e.target;t.focus(id);if(n.nodeName=='A'||n.nodeName=='a'){switch(n.className){case'mceClose':t.close(null,id);return Event.cancel(e);case'mceButton mceOk':case'mceButton mceCancel':f.button_func(n.className=='mceButton mceOk');return Event.cancel(e);}}});t.windows=t.windows||{};w=t.windows[id]={id:id,mousedown_func:mdf,click_func:clf,element:new Element(id,{blocker:1,container:ed.getContainer()}),iframeElement:new Element(id+'_ifr'),features:f,deltaWidth:dw,deltaHeight:dh};w.iframeElement.on('focus',function(){t.focus(id);});if(t.count==0&&t.editor.getParam('dialog_type')=='modal'){DOM.add(DOM.doc.body,'div',{id:'mceModalBlocker','class':(t.editor.settings.inlinepopups_skin||'clearlooks2')+'_modalBlocker',style:{left:vp.x,top:vp.y,zIndex:t.zIndex-1}});DOM.show('mceModalBlocker');}else DOM.setStyle('mceModalBlocker','z-index',t.zIndex-1);t.focus(id);t._fixIELayout(id,1);if(DOM.get(id+'_ok'))DOM.get(id+'_ok').focus();t.count++;return w;},focus:function(id){var t=this,w=t.windows[id];w.zIndex=this.zIndex++;w.element.setStyle('zIndex',w.zIndex);w.element.update();id=id+'_wrapper';DOM.removeClass(t.lastId,'mceFocus');DOM.addClass(id,'mceFocus');t.lastId=id;},_addAll:function(te,ne){var i,n,t=this,dom=tinymce.DOM;if(is(ne,'string'))te.appendChild(dom.doc.createTextNode(ne));else if(ne.length){te=te.appendChild(dom.create(ne[0],ne[1]));for(i=2;i<ne.length;i++)t._addAll(te,ne[i]);}},_startDrag:function(id,se,ac){var t=this,mu,mm,d=document,eb,w=t.windows[id],we=w.element,sp=we.getXY(),p,sz,ph,cp,vp,sx,sy,sex,sey,dx,dy,dw,dh;cp={x:0,y:0};vp=DOM.getViewPort();vp.w-=2;vp.h-=2;sex=se.screenX;sey=se.screenY;dx=dy=dw=dh=0;mu=Event.add(d,'mouseup',function(e){Event.remove(d,'mouseup',mu);Event.remove(d,'mousemove',mm);if(eb)eb.remove();we.moveBy(dx,dy);we.resizeBy(dw,dh);sz=we.getSize();DOM.setStyles(id+'_ifr',{width:sz.w-w.deltaWidth,height:sz.h-w.deltaHeight});t._fixIELayout(id,1);return Event.cancel(e);});if(ac!='Move')startMove();function startMove(){if(eb)return;t._fixIELayout(id,0);DOM.add(d.body,'div',{id:'mceEventBlocker','class':'mceEventBlocker '+(t.editor.settings.inlinepopups_skin||'clearlooks2'),style:{left:vp.x,top:vp.y,zIndex:20001}});eb=new Element('mceEventBlocker');eb.update();p=we.getXY();sz=we.getSize();sx=cp.x+p.x-vp.x;sy=cp.y+p.y-vp.y;DOM.add(eb.get(),'div',{id:'mcePlaceHolder','class':'mcePlaceHolder',style:{left:sx,top:sy,width:sz.w,height:sz.h}});ph=new Element('mcePlaceHolder');};mm=Event.add(d,'mousemove',function(e){var x,y,v;startMove();x=e.screenX-sex;y=e.screenY-sey;switch(ac){case'ResizeW':dx=x;dw=0-x;break;case'ResizeE':dw=x;break;case'ResizeN':case'ResizeNW':case'ResizeNE':if(ac=="ResizeNW"){dx=x;dw=0-x;}else if(ac=="ResizeNE")dw=x;dy=y;dh=0-y;break;case'ResizeS':case'ResizeSW':case'ResizeSE':if(ac=="ResizeSW"){dx=x;dw=0-x;}else if(ac=="ResizeSE")dw=x;dh=y;break;case'mceMove':dx=x;dy=y;break;}if(dw<(v=w.features.min_width-sz.w)){if(dx!==0)dx+=dw-v;dw=v;}if(dh<(v=w.features.min_height-sz.h)){if(dy!==0)dy+=dh-v;dh=v;}dw=Math.min(dw,w.features.max_width-sz.w);dh=Math.min(dh,w.features.max_height-sz.h);dx=Math.max(dx,vp.x-(sx+vp.x));dy=Math.max(dy,vp.y-(sy+vp.y));dx=Math.min(dx,(vp.w+vp.x)-(sx+sz.w+vp.x));dy=Math.min(dy,(vp.h+vp.y)-(sy+sz.h+vp.y));if(dx+dy!==0){if(sx+dx<0)dx=0;if(sy+dy<0)dy=0;ph.moveTo(sx+dx,sy+dy);}if(dw+dh!==0)ph.resizeTo(sz.w+dw,sz.h+dh);return Event.cancel(e);});return Event.cancel(se);},resizeBy:function(dw,dh,id){var w=this.windows[id];if(w){w.element.resizeBy(dw,dh);w.iframeElement.resizeBy(dw,dh);}},close:function(win,id){var t=this,w,d=document,ix=0,fw;t.count--;if(t.count==0)DOM.remove('mceModalBlocker');if(!id&&win){t.parent(win);return;}if(w=t.windows[id]){t.onClose.dispatch(t);Event.remove(d,'mousedown',w.mousedownFunc);Event.remove(d,'click',w.clickFunc);DOM.setAttrib(id+'_ifr','src','javascript:""');w.element.remove();delete t.windows[id];each(t.windows,function(w){if(w.zIndex>ix){fw=w;ix=w.zIndex;}});if(fw)t.focus(fw.id);}},setTitle:function(ti,id){var e;if(e=DOM.get(id+'_title'))e.innerHTML=DOM.encode(ti);},alert:function(txt,cb,s){var t=this,w;w=t.open({title:t,type:'alert',button_func:function(s){if(cb)cb.call(s||t,s);t.close(null,w.id);},content:DOM.encode(t.editor.getLang(txt,txt)),inline:1,width:400,height:130});},confirm:function(txt,cb,s){var t=this,w;w=t.open({title:t,type:'confirm',button_func:function(s){if(cb)cb.call(s||t,s);t.close(null,w.id);},content:DOM.encode(t.editor.getLang(txt,txt)),inline:1,width:400,height:130});},_fixIELayout:function(id,s){var w,img;if(!tinymce.isIE6)return;each(['n','s','w','e','nw','ne','sw','se'],function(v){var e=DOM.get(id+'_resize_'+v);DOM.setStyles(e,{width:s?e.clientWidth:'',height:s?e.clientHeight:'',cursor:DOM.getStyle(e,'cursor',1)});DOM.setStyle(id+"_bottom",'bottom','-1px');e=0;});if(w=this.windows[id]){w.element.hide();w.element.show();each(DOM.select('div,a',id),function(e,i){if(e.currentStyle.backgroundImage!='none'){img=new Image();img.src=e.currentStyle.backgroundImage.replace(/url\(\"(.+)\"\)/,'$1');}});DOM.get(id).style.filter='';}}});tinymce.PluginManager.add('inlinepopups',tinymce.plugins.InlinePopups);})();
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/images/spacer.gif 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/images/spacer.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/images/spacer.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/images/spacer.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a       !   ,       D ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/images/window_close.gif 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/images/window_close.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/images/window_close.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/images/window_close.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a    @@@            !     ,       3(! )ɣ8ZǘvI!P~Sr5[Y"aH,ȤrL  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/images/window_maximize.gif 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/images/window_maximize.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/images/window_maximize.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/images/window_maximize.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a       @@@         !     ,       482 )ɋ!k-[] _`wjKT5rrC(Grl* ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/images/window_minimize.gif 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/images/window_minimize.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/images/window_minimize.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/images/window_minimize.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a       @@@         !     ,       582 )ɛ!zޑy7~ai|⬊R: "H`l:	 ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/images/window_resize.gif 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/images/window_resize.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/images/window_resize.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/images/window_resize.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a    Ȁ   !     ,        |܃VwgqUeFW ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/jscripts/mcwindows.js 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/jscripts/mcwindows.js
--- 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/jscripts/mcwindows.js	2007-01-16 11:52:13.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/jscripts/mcwindows.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,453 +0,0 @@
-/**
- * $Id: mcwindows.js 18 2006-06-29 14:11:23Z spocke $
- *
- * Moxiecode DHTML Windows script.
- *
- * @author Moxiecode
- * @copyright Copyright  2004, Moxiecode Systems AB, All rights reserved.
- */
-
-// Windows handler
-function MCWindows() {
-	this.settings = new Array();
-	this.windows = new Array();
-	this.isMSIE = (navigator.appName == "Microsoft Internet Explorer");
-	this.isGecko = navigator.userAgent.indexOf('Gecko') != -1;
-	this.isSafari = navigator.userAgent.indexOf('Safari') != -1;
-	this.isMac = navigator.userAgent.indexOf('Mac') != -1;
-	this.isMSIE5_0 = this.isMSIE && (navigator.userAgent.indexOf('MSIE 5.0') != -1);
-	this.action = "none";
-	this.selectedWindow = null;
-	this.zindex = 100;
-	this.mouseDownScreenX = 0;
-	this.mouseDownScreenY = 0;
-	this.mouseDownLayerX = 0;
-	this.mouseDownLayerY = 0;
-	this.mouseDownWidth = 0;
-	this.mouseDownHeight = 0;
-};
-
-MCWindows.prototype.init = function(settings) {
-	this.settings = settings;
-
-	if (this.isMSIE)
-		this.addEvent(document, "mousemove", mcWindows.eventDispatcher);
-	else
-		this.addEvent(window, "mousemove", mcWindows.eventDispatcher);
-
-	this.addEvent(document, "mouseup", mcWindows.eventDispatcher);
-};
-
-MCWindows.prototype.getParam = function(name, default_value) {
-	var value = null;
-
-	value = (typeof(this.settings[name]) == "undefined") ? default_value : this.settings[name];
-
-	// Fix bool values
-	if (value == "true" || value == "false")
-		return (value == "true");
-
-	return value;
-};
-
-MCWindows.prototype.eventDispatcher = function(e) {
-	e = typeof(e) == "undefined" ? window.event : e;
-
-	if (mcWindows.selectedWindow == null)
-		return;
-
-	// Switch focus
-	if (mcWindows.isGecko && e.type == "mousedown") {
-		var elm = e.currentTarget;
-
-		for (var n in mcWindows.windows) {
-			var win = mcWindows.windows[n];
-			if (typeof(win) == 'function')
-				continue;
-
-			if (win.headElement == elm || win.resizeElement == elm) {
-				win.focus();
-				break;
-			}
-		}
-	}
-
-	switch (e.type) {
-		case "mousemove":
-			mcWindows.selectedWindow.onMouseMove(e);
-			break;
-
-		case "mouseup":
-			mcWindows.selectedWindow.onMouseUp(e);
-			break;
-
-		case "mousedown":
-			mcWindows.selectedWindow.onMouseDown(e);
-			break;
-
-		case "focus":
-			mcWindows.selectedWindow.onFocus(e);
-			break;
-	}
-}
-
-MCWindows.prototype.addEvent = function(obj, name, handler) {
-	if (this.isMSIE)
-		obj.attachEvent("on" + name, handler);
-	else
-		obj.addEventListener(name, handler, true);
-};
-
-MCWindows.prototype.cancelEvent = function(e) {
-	if (this.isMSIE) {
-		e.returnValue = false;
-		e.cancelBubble = true;
-	} else
-		e.preventDefault();
-};
-
-MCWindows.prototype.parseFeatures = function(opts) {
-	// Cleanup the options
-	opts = opts.toLowerCase();
-	opts = opts.replace(/;/g, ",");
-	opts = opts.replace(/[^0-9a-z=,]/g, "");
-
-	var optionChunks = opts.split(',');
-	var options = new Array();
-
-	options['left'] = 10;
-	options['top'] = 10;
-	options['width'] = 300;
-	options['height'] = 300;
-	options['resizable'] = true;
-	options['minimizable'] = true;
-	options['maximizable'] = true;
-	options['close'] = true;
-	options['movable'] = true;
-
-	if (opts == "")
-		return options;
-
-	for (var i=0; i<optionChunks.length; i++) {
-		var parts = optionChunks[i].split('=');
-
-		if (parts.length == 2)
-			options[parts[0]] = parts[1];
-	}
-
-	return options;
-};
-
-MCWindows.prototype.open = function(url, name, features) {
-	var win = new MCWindow();
-	var winDiv, html = "", id;
-
-	features = this.parseFeatures(features);
-
-	// Create div
-	id = "mcWindow_" + name;
-
-	width = parseInt(features['width']);
-	height = parseInt(features['height'])-12-19;
-
-	if (this.isMSIE)
-		width -= 2;
-
-	// Setup first part of window
-	win.id = id;
-	win.url = url;
-	win.name = name;
-	win.features = features;
-	this.windows[name] = win;
-
-	iframeWidth = width;
-	iframeHeight = height;
-
-	// Create inner content
-	html += '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">';
-	html += '<html>';
-	html += '<head>';
-	html += '<title>Wrapper iframe</title>';
-	html += '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">';
-	html += '<link href="../jscripts/tiny_mce/themes/advanced/css/editor_ui.css" rel="stylesheet" type="text/css" />';
-	html += '</head>';
-	html += '<body onload="parent.mcWindows.onLoad(\'' + name + '\');">';
-
-	html += '<div id="' + id + '_container" class="mceWindow">';
-	html += '<div id="' + id + '_head" class="mceWindowHead" onmousedown="parent.mcWindows.windows[\'' + name + '\'].focus();">';
-	html += '  <div id="' + id + '_title" class="mceWindowTitle"';
-	html += '  onselectstart="return false;" unselectable="on" style="-moz-user-select: none !important;">No name window</div>';
-	html += '    <div class="mceWindowHeadTools">';
-	html += '      <a href="javascript:parent.mcWindows.windows[\'' + name + '\'].close();" onmousedown="return false;" class="mceWindowClose"><img border="0" src="../jscripts/tiny_mce/themes/advanced/images/window_close.gif" /></a>';
-//	html += '      <a href="javascript:mcWindows.windows[\'' + name + '\'].maximize();" onmousedown="return false;" class="mceWindowMaximize"></a>';
-//	html += '      <a href="javascript:mcWindows.windows[\'' + name + '\'].minimize();" onmousedown="return false;" class="mceWindowMinimize"></a>';
-	html += '    </div>';
-	html += '</div><div id="' + id + '_body" class="mceWindowBody" style="width: ' + width + 'px; height: ' + height + 'px;">';
-	html += '<iframe id="' + id + '_iframe" name="' + id + '_iframe" onfocus="parent.mcWindows.windows[\'' + name + '\'].focus();" frameborder="0" width="' + iframeWidth + '" height="' + iframeHeight + '" src="' + url + '" class="mceWindowBodyIframe"></iframe></div>';
-	html += '<div id="' + id + '_statusbar" class="mceWindowStatusbar" onmousedown="parent.mcWindows.windows[\'' + name + '\'].focus();">';
-	html += '<div id="' + id + '_resize" class="mceWindowResize"><img onmousedown="parent.mcWindows.windows[\'' + name + '\'].focus();" border="0" src="../jscripts/tiny_mce/themes/advanced/images/window_resize.gif" /></div>';
-	html += '</div>';
-	html += '</div>';
-
-	html += '</body>';
-	html += '</html>';
-
-	// Create iframe
-	this.createFloatingIFrame(id, features['left'], features['top'], features['width'], features['height'], html);
-};
-
-// Gets called when wrapper iframe is initialized
-MCWindows.prototype.onLoad = function(name) {
-	var win = mcWindows.windows[name];
-	var id = "mcWindow_" + name;
-	var wrapperIframe = window.frames[id + "_iframe"].frames[0];
-	var wrapperDoc = window.frames[id + "_iframe"].document;
-	var doc = window.frames[id + "_iframe"].document;
-	var winDiv = document.getElementById("mcWindow_" + name + "_div");
-	var realIframe = window.frames[id + "_iframe"].frames[0];
-
-	// Set window data
-	win.id = "mcWindow_" + name + "_iframe";
-	win.winElement = winDiv;
-	win.bodyElement = doc.getElementById(id + '_body');
-	win.iframeElement = doc.getElementById(id + '_iframe');
-	win.headElement = doc.getElementById(id + '_head');
-	win.titleElement = doc.getElementById(id + '_title');
-	win.resizeElement = doc.getElementById(id + '_resize');
-	win.containerElement = doc.getElementById(id + '_container');
-	win.left = win.features['left'];
-	win.top = win.features['top'];
-	win.frame = window.frames[id + '_iframe'].frames[0];
-	win.wrapperFrame = window.frames[id + '_iframe'];
-	win.wrapperIFrameElement = document.getElementById(id + "_iframe");
-
-	// Add event handlers
-	mcWindows.addEvent(win.headElement, "mousedown", mcWindows.eventDispatcher);
-	mcWindows.addEvent(win.resizeElement, "mousedown", mcWindows.eventDispatcher);
-
-	if (mcWindows.isMSIE) {
-		mcWindows.addEvent(realIframe.document, "mousemove", mcWindows.eventDispatcher);
-		mcWindows.addEvent(realIframe.document, "mouseup", mcWindows.eventDispatcher);
-	} else {
-		mcWindows.addEvent(realIframe, "mousemove", mcWindows.eventDispatcher);
-		mcWindows.addEvent(realIframe, "mouseup", mcWindows.eventDispatcher);
-		mcWindows.addEvent(realIframe, "focus", mcWindows.eventDispatcher);
-	}
-
-	for (var i=0; i<window.frames.length; i++) {
-		if (!window.frames[i]._hasMouseHandlers) {
-			if (mcWindows.isMSIE) {
-				mcWindows.addEvent(window.frames[i].document, "mousemove", mcWindows.eventDispatcher);
-				mcWindows.addEvent(window.frames[i].document, "mouseup", mcWindows.eventDispatcher);
-			} else {
-				mcWindows.addEvent(window.frames[i], "mousemove", mcWindows.eventDispatcher);
-				mcWindows.addEvent(window.frames[i], "mouseup", mcWindows.eventDispatcher);
-			}
-
-			window.frames[i]._hasMouseHandlers = true;
-		}
-	}
-
-	if (mcWindows.isMSIE) {
-		mcWindows.addEvent(win.frame.document, "mousemove", mcWindows.eventDispatcher);
-		mcWindows.addEvent(win.frame.document, "mouseup", mcWindows.eventDispatcher);
-	} else {
-		mcWindows.addEvent(win.frame, "mousemove", mcWindows.eventDispatcher);
-		mcWindows.addEvent(win.frame, "mouseup", mcWindows.eventDispatcher);
-		mcWindows.addEvent(win.frame, "focus", mcWindows.eventDispatcher);
-	}
-
-	this.selectedWindow = win;
-};
-
-MCWindows.prototype.createFloatingIFrame = function(id_prefix, left, top, width, height, html) {
-	var iframe = document.createElement("iframe");
-	var div = document.createElement("div");
-
-	width = parseInt(width);
-	height = parseInt(height)+1;
-
-	// Create wrapper div
-	div.setAttribute("id", id_prefix + "_div");
-	div.setAttribute("width", width);
-	div.setAttribute("height", (height));
-	div.style.position = "absolute";
-	div.style.left = left + "px";
-	div.style.top = top + "px";
-	div.style.width = width + "px";
-	div.style.height = (height) + "px";
-	div.style.backgroundColor = "white";
-	div.style.display = "none";
-
-	if (this.isGecko) {
-		iframeWidth = width + 2;
-		iframeHeight = height + 2;
-	} else {
-		iframeWidth = width;
-		iframeHeight = height + 1;
-	}
-
-	// Create iframe
-	iframe.setAttribute("id", id_prefix + "_iframe");
-	iframe.setAttribute("name", id_prefix + "_iframe");
-	iframe.setAttribute("border", "0");
-	iframe.setAttribute("frameBorder", "0");
-	iframe.setAttribute("marginWidth", "0");
-	iframe.setAttribute("marginHeight", "0");
-	iframe.setAttribute("leftMargin", "0");
-	iframe.setAttribute("topMargin", "0");
-	iframe.setAttribute("width", iframeWidth);
-	iframe.setAttribute("height", iframeHeight);
-//	iframe.setAttribute("src", "../jscripts/tiny_mce/blank.htm");
-	// iframe.setAttribute("allowtransparency", "false");
-	iframe.setAttribute("scrolling", "no");
-	iframe.style.width = iframeWidth + "px";
-	iframe.style.height = iframeHeight + "px";
-	iframe.style.backgroundColor = "white";
-	div.appendChild(iframe);
-
-	document.body.appendChild(div);
-
-	// Fixed MSIE 5.0 issue
-	div.innerHTML = div.innerHTML;
-
-	if (this.isSafari) {
-		// Give Safari some time to setup
-		window.setTimeout(function() {
-			doc = window.frames[id_prefix + '_iframe'].document;
-			doc.open();
-			doc.write(html);
-			doc.close();
-		}, 10);
-	} else {
-		doc = window.frames[id_prefix + '_iframe'].window.document
-		doc.open();
-		doc.write(html);
-		doc.close();
-	}
-
-	div.style.display = "block";
-
-	return div;
-};
-
-// Window instance
-function MCWindow() {
-};
-
-MCWindow.prototype.focus = function() {
-	this.winElement.style.zIndex = mcWindows.zindex++;
-	mcWindows.selectedWindow = this;
-};
-
-MCWindow.prototype.minimize = function() {
-};
-
-MCWindow.prototype.maximize = function() {
-	
-};
-
-MCWindow.prototype.startResize = function() {
-	mcWindows.action = "resize";
-};
-
-MCWindow.prototype.startMove = function(e) {
-	mcWindows.action = "move";
-};
-
-MCWindow.prototype.close = function() {
-	document.body.removeChild(this.winElement);
-	mcWindows.windows[this.name] = null;
-};
-
-MCWindow.prototype.onMouseMove = function(e) {
-	var scrollX = 0;//this.doc.body.scrollLeft;
-	var scrollY = 0;//this.doc.body.scrollTop;
-
-	// Calculate real X, Y
-	var dx = e.screenX - mcWindows.mouseDownScreenX;
-	var dy = e.screenY - mcWindows.mouseDownScreenY;
-
-	switch (mcWindows.action) {
-		case "resize":
-			width = mcWindows.mouseDownWidth + (e.screenX - mcWindows.mouseDownScreenX);
-			height = mcWindows.mouseDownHeight + (e.screenY - mcWindows.mouseDownScreenY);
-
-			width = width < 100 ? 100 : width;
-			height = height < 100 ? 100 : height;
-
-			this.wrapperIFrameElement.style.width = width+2;
-			this.wrapperIFrameElement.style.height = height+2;
-			this.wrapperIFrameElement.width = width+2;
-			this.wrapperIFrameElement.height = height+2;
-			this.winElement.style.width = width;
-			this.winElement.style.height = height;
-
-			height = height-12-19;
-
-			this.containerElement.style.width = width;
-
-			this.iframeElement.style.width = width;
-			this.iframeElement.style.height = height;
-			this.bodyElement.style.width = width;
-			this.bodyElement.style.height = height;
-			this.headElement.style.width = width;
-			//this.statusElement.style.width = width;
-
-			mcWindows.cancelEvent(e);
-			break;
-
-		case "move":
-			this.left = mcWindows.mouseDownLayerX + (e.screenX - mcWindows.mouseDownScreenX);
-			this.top = mcWindows.mouseDownLayerY + (e.screenY - mcWindows.mouseDownScreenY);
-			this.winElement.style.left = this.left + "px";
-			this.winElement.style.top = this.top + "px";
-
-			mcWindows.cancelEvent(e);
-			break;
-	}
-};
-
-MCWindow.prototype.onMouseUp = function(e) {
-	mcWindows.action = "none";
-};
-
-MCWindow.prototype.onFocus = function(e) {
-	// Gecko only handler
-	var winRef = e.currentTarget;
-
-	for (var n in mcWindows.windows) {
-		var win = mcWindows.windows[n];
-		if (typeof(win) == 'function')
-			continue;
-
-		if (winRef.name == win.id) {
-			win.focus();
-			return;
-		}
-	}
-};
-
-MCWindow.prototype.onMouseDown = function(e) {
-	var elm = mcWindows.isMSIE ? this.wrapperFrame.event.srcElement : e.target;
-
-	var scrollX = 0;//this.doc.body.scrollLeft;
-	var scrollY = 0;//this.doc.body.scrollTop;
-
-	mcWindows.mouseDownScreenX = e.screenX;
-	mcWindows.mouseDownScreenY = e.screenY;
-	mcWindows.mouseDownLayerX = this.left;
-	mcWindows.mouseDownLayerY = this.top;
-	mcWindows.mouseDownWidth = parseInt(this.winElement.style.width);
-	mcWindows.mouseDownHeight = parseInt(this.winElement.style.height);
-
-	if (elm == this.resizeElement.firstChild)
-		this.startResize(e);
-	else
-		this.startMove(e);
-
-	mcWindows.cancelEvent(e);
-};
-
-// Global instance
-var mcWindows = new MCWindows();
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,3 @@
+GIF89a      wvnn\\ܣ<<66CCJJ888CCdd--QQ33yyWWiivvkj<<llbb$$uuEE׎ڴMLpp++$$eeKKRRÌͳ==AAdd::))::JJjjWWPP((;;ħɣп%%%ƪ00ccIIϺ̱֘~ȟ^]עUU,,ڌssyy||٭QPNNđƘBB__??mm  㺺߀bb    !     ,          o2u20v7$r1U{))F 1+55=; p!}%Y!8d>x`~~	M\j_}]hE(M2x&sBW('~7
+?Wf.cKRs&(#>88܅Dpj"@:)Fn$0&saxS-*B"-Ȅ	}l9hǬ[ 8q	! 0HhACzfCˀ.a˻xtfbŃ|򗶱xXB
+B(CӨH倠6vA;!,rMܰ
!üЛPf@(ν@h $ӧg@ ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/button.gif 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/button.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/button.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/button.gif	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1 @@
+GIF89aP    ccc                        !     ,    P   PC8;dihjLm,tJxpHDH1ɜ-P@ZجvvoްxL΂贚z^6|>~ vz"w7ħ/!  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif	2008-01-31 12:10:46.000000000 -0600
@@ -0,0 +1,5 @@
+GIF89at 0   궹RTT;=h		                                    !  ,    t 0  Čdi$l;nr-&@|'#oH2/l(R+1q/X'c4XhIc2=Dn9x;}uqwC~Cj X9lt|=vm#~oİȿĲӸֶoЩƳnھ7!Tp}8H,bLq#) 4jĀ!Rɒ.Nd˗0cʔr͛.k	S'O,`ˡ
+%!Ds
+`jTDVj+flh&1aZ"dMdnڶpAo^v߮;!q
+Ŭۺ}}7	
+ y᳝Cp9<:jL~ݺ봯Y9wۨ#N{ٝwq{6..ekn;4ZϠ:ϻ'yy?>z`.iM-ZraO?Mn8SƤ$h(8b,H.h"28
 9V#:$TX$Q$D)$8%HY%;HZ&ae%f|]*afhn9&nkQgMfD)'j9ƝY)=Il'( 餒)@bVJ hv:**ʥnꞰ
+jꤿfګZ*mjhjv,JeZ>;,z,j-fr[-vnnoK-cwzp.;Xc4Nbq'N ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,4 @@
+GIF89a      *Txg(Z[3ʜ[ūu=ѻnKc+؈,Meх+9CRڃL5\D~zȼ3~	%zn)E"<jT,-E΂-wIܕ@T8»aʡ_Ȯ}I:TµІ2aû{_}a݊#?׳^]ݏ1ƘPőU{79P|y 7!     ,         
Q Q
_J]#i#]J_Kai~aK
#LG#
HY̯HœɽOO 
+V
+? SSRi~ 8* mAmR85|,eп$F hp	#A}?`
+b=Pis$ 
`AQmph):ANQ͈T@P-NU >E2`^X5rgowxd>WqC:(SMu"C@k ,U&aIB8]1!xh
$q$mZ\e8>aGXXKT$AO>Ǆew#X@Fys=@&ƂܽrÉ}Wx-P\"FčI ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,5 @@
+GIF89a'  I    =:8			}݂~ދ釚uù볧η̴%+ҭٴ                                                                                                                                                                  !  I ,    '   II)  ) #&&I++&&(ůG'(I'G4%گC$%4$CҎԬ# >6>6T@`>(P
+
+(B:
 !dn0!F_ rhةf$@xj2]/p8X 
+P)0u#@T
+;j@C+Rx. .5` {
pav720ҡr 5hV`k%ج 6H-`~ ͂6 1$(b]2+ "AH7]q
>]{?4޼u҉Z @ &-`=߀qH 2tA@\qd2 ""XJAٸH  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/drag.gif 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/drag.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/drag.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/drag.gif	2008-01-31 12:10:46.000000000 -0600
@@ -0,0 +1,2 @@
+GIF89a    fff   !  ,       
+
'k  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,3 @@
+GIF89a- P      $%'êu}~鳧ùȿǵ=:8                                                   !  . ,    - P  pH,$el:ШtJVSجvzxL.hznhN% !$" HNXȰÇ#J\@ŋ3jܨǏ CI2ɓ(S\ɲ%0cʜI8sɳ
+JѣH(]ʴӧPJJիXjׯ`Ê۠ٳhӪ]˶۷o!ȝKݻx˗LÈ'vǐ#KL˘3kyϠCMӨQ3Xͺװc@۸s޽Nȓ+_μУK>݄سkν;ËOӫ_Ͼ_˟Ͽ (h&6
+Vhfyv!x.($h(,0(. ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,3 @@
+GIF89a
+                !     ,    
+   !( AK( 8vu)~*F	 ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/window.css 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/window.css
--- 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/window.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/window.css	2008-03-25 22:22:53.000000000 -0500
@@ -0,0 +1,125 @@
+/* Clearlooks 2 */
+/* Reset */
+.clearlooks2, .clearlooks2 div, .clearlooks2 span, .clearlooks2 a {vertical-align:baseline; text-align:left; position:absolute; border:0; padding:0; margin:0; background:transparent; font-family:Arial,Verdana; font-size:11px; color:#000; text-decoration:none; font-weight:normal; width:auto; height:auto; overflow:hidden; display:block;}
+
+/* General */
+.clearlooks2 div, .clearlooks2 span, .clearlooks2 a {position:absolute; border:0; padding:0; margin:0; background:transparent; font-family:Arial,Verdana; font-size:11px; color:#000; text-decoration:none; font-weight:normal; width:auto; height:auto; overflow:hidden; display:block;}
+.clearlooks2 {position:absolute;}
+.clearlooks2 .mceWrapper {position:static}
+.mceEventBlocker {position:absolute; left:0; top:0; background:url(img/horizontal.gif) no-repeat 0 -75px; width:100%; height:100%;}
+.clearlooks2 .mcePlaceHolder {border:1px solid #000; background:#888; top:0; left:0; opacity:0.5; filter:alpha(opacity=50);}
+
+/* Top */
+.clearlooks2 .mceTop, 
+.clearlooks2 .mceTop div {
+	top:0; 
+	width:100%; 
+	height:23px
+}
+.clearlooks2 .mceTop .mceLeft {
+	width:55%; 
+	background-image: none;
+	border-style: solid none none solid;
+	border-width: 1px;
+}
+.clearlooks2 .mceTop .mceCenter {
+}
+.clearlooks2 .mceTop .mceRight {
+	right:0; 
+	width:55%; 
+	height:23px; 
+	background-image: none;
+	border-style: solid solid none none;
+	border-width: 1px;
+}
+.clearlooks2 .mceTop span {
+	width:100%;
+	font: 12px/20px bold "Lucida Grande","Lucida Sans Unicode",Tahoma,Verdana,sans-serif;
+	text-align:center; 
+	vertical-align:middle; 
+	line-height:23px; 
+	font-weight:bold;
+}
+.clearlooks2 .mceFocus .mceTop .mceLeft {
+	background-image: none;
+	border-style: solid none none solid;
+	border-width: 1px;
+}
+.clearlooks2 .mceFocus .mceTop .mceCenter {
+}
+.clearlooks2 .mceFocus .mceTop .mceRight {
+	background-image: none;
+	border-style: solid solid none none;
+	border-width: 1px;
+}
+.clearlooks2 .mceFocus .mceTop span {
+color:#FFF
+}
+
+/* Middle */
+.clearlooks2 .mceMiddle, .clearlooks2 .mceMiddle div {top:0;}
+.clearlooks2 .mceMiddle {width:100%; height:100%; clip:rect(23px auto auto auto);}
+.clearlooks2 .mceMiddle .mceLeft {left:0; width:5px; height:100%; background:#E4F2FD;border-left:1px solid #c6d9e9;}
+.clearlooks2 .mceMiddle span {top:23px; left:5px; width:100%; height:100%; background:#FFF;}
+.clearlooks2 .mceMiddle .mceRight {right:0; width:5px; height:100%; background:#E4F2FD;border-right:1px solid #c6d9e9;}
+
+/* Bottom */
+.clearlooks2 .mceBottom, .clearlooks2 .mceBottom div {height:6px;}
+.clearlooks2 .mceBottom {left:0; bottom:0; width:100%;background:#E4F2FD;border-bottom:1px solid #c6d9e9;}
+.clearlooks2 .mceBottom div {top:0;}
+.clearlooks2 .mceBottom .mceLeft {left:0; width:5px; background:#E4F2FD  ;border-left:1px solid #c6d9e9;}
+.clearlooks2 .mceBottom .mceCenter {left:5px; width:100%;}
+.clearlooks2 .mceBottom .mceRight {right:0; width:6px; background:#E4F2FD url(img/drag.gif) no-repeat;border-right:1px solid #c6d9e9;}
+.clearlooks2 .mceBottom span {display:none;}
+.clearlooks2 .mceStatusbar .mceBottom, .clearlooks2 .mceStatusbar .mceBottom div {height:23px;}
+.clearlooks2 .mceStatusbar .mceBottom .mceLeft {background:url(img/corners.gif) -29px 0;}
+.clearlooks2 .mceStatusbar .mceBottom .mceCenter {background:url(img/horizontal.gif) 0 -52px;}
+.clearlooks2 .mceStatusbar .mceBottom .mceRight {background:url(img/corners.gif) -24px 0;}
+.clearlooks2 .mceStatusbar .mceBottom span {display:block; left:7px; font-family:Arial, Verdana; font-size:11px; line-height:23px;}
+
+/* Actions */
+.clearlooks2 a {width:29px; height:16px; top:3px;}
+.clearlooks2 .mceClose {right:6px; background:url(img/buttons.gif) -87px 0;}
+.clearlooks2 .mceMin {display:none; right:68px; background:url(img/buttons.gif) 0 0;}
+.clearlooks2 .mceMed {display:none; right:37px; background:url(img/buttons.gif) -29px 0;}
+.clearlooks2 .mceMax {display:none; right:37px; background:url(img/buttons.gif) -58px 0;}
+.clearlooks2 .mceMove {display:none;width:100%;cursor:move;background:url(img/corners.gif) no-repeat -100px -100px;}
+.clearlooks2 .mceMovable .mceMove {display:block;}
+.clearlooks2 .mceFocus .mceClose {right:6px; background:url(img/buttons.gif) -87px -16px;}
+.clearlooks2 .mceFocus .mceMin {right:68px; background:url(img/buttons.gif) 0 -16px;}
+.clearlooks2 .mceFocus .mceMed {right:37px; background:url(img/buttons.gif) -29px -16px;}
+.clearlooks2 .mceFocus .mceMax {right:37px; background:url(img/buttons.gif) -58px -16px;}
+.clearlooks2 .mceFocus .mceClose:hover {right:6px; background:url(img/buttons.gif) -87px -32px;}
+.clearlooks2 .mceFocus .mceClose:hover {right:6px; background:url(img/buttons.gif) -87px -32px;}
+.clearlooks2 .mceFocus .mceMin:hover {right:68px; background:url(img/buttons.gif) 0 -32px;}
+.clearlooks2 .mceFocus .mceMed:hover {right:37px; background:url(img/buttons.gif) -29px -32px;}
+.clearlooks2 .mceFocus .mceMax:hover {right:37px; background:url(img/buttons.gif) -58px -32px;}
+
+/* Resize */
+.clearlooks2 .mceResize {top:auto; left:auto; display:none; width:5px; height:5px; background:url(img/horizontal.gif) no-repeat 0 -75px;}
+.clearlooks2 .mceResizable .mceResize {display:block;}
+.clearlooks2 .mceResizable .mceMin, .clearlooks2 .mceMax {display:none;}
+.clearlooks2 .mceMinimizable .mceMin {display:block;}
+.clearlooks2 .mceMaximizable .mceMax {display:block;}
+.clearlooks2 .mceMaximized .mceMed {display:block;}
+.clearlooks2 .mceMaximized .mceMax {display:none;}
+.clearlooks2 a.mceResizeN {top:0; left:0; width:100%; cursor:n-resize;}
+.clearlooks2 a.mceResizeNW {top:0; left:0; cursor:nw-resize;}
+.clearlooks2 a.mceResizeNE {top:0; right:0; cursor:ne-resize}
+.clearlooks2 a.mceResizeW {top:0; left:0; height:100%; cursor:w-resize;}
+.clearlooks2 a.mceResizeE {top:0; right:0; height:100%; cursor:e-resize;}
+.clearlooks2 a.mceResizeS {bottom:0; left:0; width:100%; cursor:s-resize}
+.clearlooks2 a.mceResizeSW {bottom:0; left:0; cursor:sw-resize;}
+.clearlooks2 a.mceResizeSE {bottom:0; right:0; cursor:se-resize;}
+
+/* Alert/Confirm */
+.clearlooks2 .mceButton {font-weight:bold; bottom:10px; width:80px; height:30px; background:url(img/button.gif); line-height:30px; vertical-align:middle; text-align:center; outline:0;}
+.clearlooks2 .mceMiddle .mceIcon {left:15px; top:35px; width:32px; height:32px;}
+.clearlooks2 .mceAlert .mceMiddle span, .clearlooks2 .mceConfirm .mceMiddle span {background:transparent;left:60px; top:35px; width:320px; height:50px; font-weight:bold; overflow:auto; white-space:normal;}
+.clearlooks2 a:hover {font-weight:bold;}
+.clearlooks2 .mceAlert .mceMiddle, .clearlooks2 .mceConfirm .mceMiddle {background:#E4F2FD;}
+.clearlooks2 .mceAlert .mceOk {left:50%; top:auto; margin-left: -40px;}
+.clearlooks2 .mceAlert .mceIcon {background:url(img/alert.gif);}
+.clearlooks2 .mceConfirm .mceOk {left:50%; top:auto; margin-left: -90px;}
+.clearlooks2 .mceConfirm .mceCancel {left:50%; top:auto;}
+.clearlooks2 .mceConfirm .mceIcon {background:url(img/confirm.gif);}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/template.htm 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/template.htm
--- 2.2.2.src/wp-includes/js/tinymce/plugins/inlinepopups/template.htm	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/inlinepopups/template.htm	2008-02-26 23:36:42.000000000 -0600
@@ -0,0 +1,387 @@
+<!-- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -->
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Template for dialogs</title>
+<link rel="stylesheet" type="text/css" href="skins/clearlooks2/window.css" />
+</head>
+<body>
+
+<div class="mceEditor">
+	<div class="clearlooks2" style="width:400px; height:100px; left:10px;">
+		<div class="mceWrapper">
+			<div class="mceTop">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Blured</span>
+			</div>
+
+			<div class="mceMiddle">
+				<div class="mceLeft"></div>
+				<span>Content</span>
+				<div class="mceRight"></div>
+			</div>
+
+			<div class="mceBottom">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Statusbar text.</span>
+			</div>
+
+			<a class="mceMove" href="#"></a>
+			<a class="mceMin" href="#"></a>
+			<a class="mceMax" href="#"></a>
+			<a class="mceMed" href="#"></a>
+			<a class="mceClose" href="#"></a>
+			<a class="mceResize mceResizeN" href="#"></a>
+			<a class="mceResize mceResizeS" href="#"></a>
+			<a class="mceResize mceResizeW" href="#"></a>
+			<a class="mceResize mceResizeE" href="#"></a>
+			<a class="mceResize mceResizeNW" href="#"></a>
+			<a class="mceResize mceResizeNE" href="#"></a>
+			<a class="mceResize mceResizeSW" href="#"></a>
+			<a class="mceResize mceResizeSE" href="#"></a>
+		</div>
+	</div>
+
+	<div class="clearlooks2" style="width:400px; height:100px; left:420px;">
+		<div class="mceWrapper mceMovable mceFocus">
+			<div class="mceTop">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Focused</span>
+			</div>
+
+			<div class="mceMiddle">
+				<div class="mceLeft"></div>
+				<span>Content</span>
+				<div class="mceRight"></div>
+			</div>
+
+			<div class="mceBottom">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Statusbar text.</span>
+			</div>
+
+			<a class="mceMove" href="#"></a>
+			<a class="mceMin" href="#"></a>
+			<a class="mceMax" href="#"></a>
+			<a class="mceMed" href="#"></a>
+			<a class="mceClose" href="#"></a>
+			<a class="mceResize mceResizeN" href="#"></a>
+			<a class="mceResize mceResizeS" href="#"></a>
+			<a class="mceResize mceResizeW" href="#"></a>
+			<a class="mceResize mceResizeE" href="#"></a>
+			<a class="mceResize mceResizeNW" href="#"></a>
+			<a class="mceResize mceResizeNE" href="#"></a>
+			<a class="mceResize mceResizeSW" href="#"></a>
+			<a class="mceResize mceResizeSE" href="#"></a>
+		</div>
+	</div>
+
+	<div class="clearlooks2" style="width:400px; height:100px; left:10px; top:120px;">
+		<div class="mceWrapper mceMovable mceFocus mceStatusbar">
+			<div class="mceTop">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Statusbar</span>
+			</div>
+
+			<div class="mceMiddle">
+				<div class="mceLeft"></div>
+				<span>Content</span>
+				<div class="mceRight"></div>
+			</div>
+
+			<div class="mceBottom">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Statusbar text.</span>
+			</div>
+
+			<a class="mceMove" href="#"></a>
+			<a class="mceMin" href="#"></a>
+			<a class="mceMax" href="#"></a>
+			<a class="mceMed" href="#"></a>
+			<a class="mceClose" href="#"></a>
+			<a class="mceResize mceResizeN" href="#"></a>
+			<a class="mceResize mceResizeS" href="#"></a>
+			<a class="mceResize mceResizeW" href="#"></a>
+			<a class="mceResize mceResizeE" href="#"></a>
+			<a class="mceResize mceResizeNW" href="#"></a>
+			<a class="mceResize mceResizeNE" href="#"></a>
+			<a class="mceResize mceResizeSW" href="#"></a>
+			<a class="mceResize mceResizeSE" href="#"></a>
+		</div>
+	</div>
+
+	<div class="clearlooks2" style="width:400px; height:100px; left:420px; top:120px;">
+		<div class="mceWrapper mceMovable mceFocus mceStatusbar mceResizable">
+			<div class="mceTop">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Statusbar, Resizable</span>
+			</div>
+
+			<div class="mceMiddle">
+				<div class="mceLeft"></div>
+				<span>Content</span>
+				<div class="mceRight"></div>
+			</div>
+
+			<div class="mceBottom">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Statusbar text.</span>
+			</div>
+
+			<a class="mceMove" href="#"></a>
+			<a class="mceMin" href="#"></a>
+			<a class="mceMax" href="#"></a>
+			<a class="mceMed" href="#"></a>
+			<a class="mceClose" href="#"></a>
+			<a class="mceResize mceResizeN" href="#"></a>
+			<a class="mceResize mceResizeS" href="#"></a>
+			<a class="mceResize mceResizeW" href="#"></a>
+			<a class="mceResize mceResizeE" href="#"></a>
+			<a class="mceResize mceResizeNW" href="#"></a>
+			<a class="mceResize mceResizeNE" href="#"></a>
+			<a class="mceResize mceResizeSW" href="#"></a>
+			<a class="mceResize mceResizeSE" href="#"></a>
+		</div>
+	</div>
+
+	<div class="clearlooks2" style="width:400px; height:100px; left:10px; top:230px;">
+		<div class="mceWrapper mceMovable mceFocus mceResizable mceMaximizable">
+			<div class="mceTop">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Resizable, Maximizable</span>
+			</div>
+
+			<div class="mceMiddle">
+				<div class="mceLeft"></div>
+				<span>Content</span>
+				<div class="mceRight"></div>
+			</div>
+
+			<div class="mceBottom">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Statusbar text.</span>
+			</div>
+
+			<a class="mceMove" href="#"></a>
+			<a class="mceMin" href="#"></a>
+			<a class="mceMax" href="#"></a>
+			<a class="mceMed" href="#"></a>
+			<a class="mceClose" href="#"></a>
+			<a class="mceResize mceResizeN" href="#"></a>
+			<a class="mceResize mceResizeS" href="#"></a>
+			<a class="mceResize mceResizeW" href="#"></a>
+			<a class="mceResize mceResizeE" href="#"></a>
+			<a class="mceResize mceResizeNW" href="#"></a>
+			<a class="mceResize mceResizeNE" href="#"></a>
+			<a class="mceResize mceResizeSW" href="#"></a>
+			<a class="mceResize mceResizeSE" href="#"></a>
+		</div>
+	</div>
+
+	<div class="clearlooks2" style="width:400px; height:100px; left:420px; top:230px;">
+		<div class="mceWrapper mceMovable mceStatusbar mceResizable mceMaximizable">
+			<div class="mceTop">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Blurred, Maximizable, Statusbar, Resizable</span>
+			</div>
+
+			<div class="mceMiddle">
+				<div class="mceLeft"></div>
+				<span>Content</span>
+				<div class="mceRight"></div>
+			</div>
+
+			<div class="mceBottom">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Statusbar text.</span>
+			</div>
+
+			<a class="mceMove" href="#"></a>
+			<a class="mceMin" href="#"></a>
+			<a class="mceMax" href="#"></a>
+			<a class="mceMed" href="#"></a>
+			<a class="mceClose" href="#"></a>
+			<a class="mceResize mceResizeN" href="#"></a>
+			<a class="mceResize mceResizeS" href="#"></a>
+			<a class="mceResize mceResizeW" href="#"></a>
+			<a class="mceResize mceResizeE" href="#"></a>
+			<a class="mceResize mceResizeNW" href="#"></a>
+			<a class="mceResize mceResizeNE" href="#"></a>
+			<a class="mceResize mceResizeSW" href="#"></a>
+			<a class="mceResize mceResizeSE" href="#"></a>
+		</div>
+	</div>
+
+	<div class="clearlooks2" style="width:400px; height:100px; left:10px; top:340px;">
+		<div class="mceWrapper mceMovable mceFocus mceResizable mceMaximized mceMinimizable mceMaximizable">
+			<div class="mceTop">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Maximized, Maximizable, Minimizable</span>
+			</div>
+
+			<div class="mceMiddle">
+				<div class="mceLeft"></div>
+				<span>Content</span>
+				<div class="mceRight"></div>
+			</div>
+
+			<div class="mceBottom">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Statusbar text.</span>
+			</div>
+
+			<a class="mceMove" href="#"></a>
+			<a class="mceMin" href="#"></a>
+			<a class="mceMax" href="#"></a>
+			<a class="mceMed" href="#"></a>
+			<a class="mceClose" href="#"></a>
+			<a class="mceResize mceResizeN" href="#"></a>
+			<a class="mceResize mceResizeS" href="#"></a>
+			<a class="mceResize mceResizeW" href="#"></a>
+			<a class="mceResize mceResizeE" href="#"></a>
+			<a class="mceResize mceResizeNW" href="#"></a>
+			<a class="mceResize mceResizeNE" href="#"></a>
+			<a class="mceResize mceResizeSW" href="#"></a>
+			<a class="mceResize mceResizeSE" href="#"></a>
+		</div>
+	</div>
+
+	<div class="clearlooks2" style="width:400px; height:100px; left:420px; top:340px;">
+		<div class="mceWrapper mceMovable mceStatusbar mceResizable mceMaximized mceMinimizable mceMaximizable">
+			<div class="mceTop">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Blured</span>
+			</div>
+
+			<div class="mceMiddle">
+				<div class="mceLeft"></div>
+				<span>Content</span>
+				<div class="mceRight"></div>
+			</div>
+
+			<div class="mceBottom">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Statusbar text.</span>
+			</div>
+
+			<a class="mceMove" href="#"></a>
+			<a class="mceMin" href="#"></a>
+			<a class="mceMax" href="#"></a>
+			<a class="mceMed" href="#"></a>
+			<a class="mceClose" href="#"></a>
+			<a class="mceResize mceResizeN" href="#"></a>
+			<a class="mceResize mceResizeS" href="#"></a>
+			<a class="mceResize mceResizeW" href="#"></a>
+			<a class="mceResize mceResizeE" href="#"></a>
+			<a class="mceResize mceResizeNW" href="#"></a>
+			<a class="mceResize mceResizeNE" href="#"></a>
+			<a class="mceResize mceResizeSW" href="#"></a>
+			<a class="mceResize mceResizeSE" href="#"></a>
+		</div>
+	</div>
+
+	<div class="clearlooks2" style="width:400px; height:130px; left:10px; top:450px;">
+		<div class="mceWrapper mceMovable mceFocus mceModal mceAlert">
+			<div class="mceTop">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Alert</span>
+			</div>
+
+			<div class="mceMiddle">
+				<div class="mceLeft"></div>
+				<span>
+					This is a very long error message. This is a very long error message.
+					This is a very long error message. This is a very long error message.
+					This is a very long error message. This is a very long error message.
+					This is a very long error message. This is a very long error message.
+					This is a very long error message. This is a very long error message.
+					This is a very long error message. This is a very long error message.
+				</span>
+				<div class="mceRight"></div>
+				<div class="mceIcon"></div>
+			</div>
+
+			<div class="mceBottom">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+			</div>
+
+			<a class="mceMove" href="#"></a>
+			<a class="mceButton mceOk" href="#">Ok</a>
+			<a class="mceClose" href="#"></a>
+		</div>
+	</div>
+
+	<div class="clearlooks2" style="width:400px; height:130px; left:420px; top:450px;">
+		<div class="mceWrapper mceMovable mceFocus mceModal mceConfirm">
+			<div class="mceTop">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Confirm</span>
+			</div>
+
+			<div class="mceMiddle">
+				<div class="mceLeft"></div>
+				<span>
+					This is a very long error message. This is a very long error message.
+					This is a very long error message. This is a very long error message.
+					This is a very long error message. This is a very long error message.
+					This is a very long error message. This is a very long error message.
+					This is a very long error message. This is a very long error message.
+					This is a very long error message. This is a very long error message.
+					</span>
+				<div class="mceRight"></div>
+				<div class="mceIcon"></div>
+			</div>
+
+			<div class="mceBottom">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+			</div>
+
+			<a class="mceMove" href="#"></a>
+			<a class="mceButton mceOk" href="#">Ok</a>
+			<a class="mceButton mceCancel" href="#">Cancel</a>
+			<a class="mceClose" href="#"></a>
+		</div>
+	</div>
+</div>
+
+</body>
+</html>
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/media/css/content.css 2.5.src/wp-includes/js/tinymce/plugins/media/css/content.css
--- 2.2.2.src/wp-includes/js/tinymce/plugins/media/css/content.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/media/css/content.css	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,6 @@
+.mceItemFlash, .mceItemShockWave, .mceItemQuickTime, .mceItemWindowsMedia, .mceItemRealMedia {border:1px dotted #cc0000; background-position:center; background-repeat:no-repeat; background-color:#ffffcc;}
+.mceItemShockWave {background-image: url(../img/shockwave.gif);}
+.mceItemFlash {background-image:url(../img/flash.gif);}
+.mceItemQuickTime {background-image:url(../img/quicktime.gif);}
+.mceItemWindowsMedia {background-image:url(../img/windowsmedia.gif);}
+.mceItemRealMedia {background-image:url(../img/realmedia.gif);}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/media/css/media.css 2.5.src/wp-includes/js/tinymce/plugins/media/css/media.css
--- 2.2.2.src/wp-includes/js/tinymce/plugins/media/css/media.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/media/css/media.css	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,68 @@
+#id, #name, #hspace, #vspace, #class_name, #align {
+	width: 100px;
+}
+
+#hspace, #vspace {
+	width: 50px;
+}
+
+#flash_quality, #flash_align, #flash_scale, #flash_salign, #flash_wmode {
+	width: 100px;
+}
+
+#flash_base, #flash_flashvars {
+	width: 240px;
+}
+
+#width, #height {
+	width: 40px;
+}
+
+#src, #media_type {
+	width: 250px;
+}
+
+#class {
+	width: 120px;
+}
+
+#prev {
+	margin: 0;
+	border: 1px solid black;
+	width: 99%;
+	height: 230px;
+	overflow: auto;
+}
+
+.panel_wrapper div.current {
+	height: 390px;
+	overflow: auto;
+}
+
+#flash_options, #shockwave_options, #qt_options, #wmp_options, #rmp_options {
+	display: none;
+}
+
+.mceAddSelectValue {
+	background-color: #DDDDDD;
+}
+
+#qt_starttime, #qt_endtime, #qt_fov, #qt_href, #qt_moveid, #qt_moviename, #qt_node, #qt_pan, #qt_qtsrc, #qt_qtsrcchokespeed, #qt_target, #qt_tilt, #qt_urlsubstituten, #qt_volume {
+	width: 70px;
+}
+
+#wmp_balance, #wmp_baseurl, #wmp_captioningid, #wmp_currentmarker, #wmp_currentposition, #wmp_defaultframe, #wmp_playcount, #wmp_rate, #wmp_uimode, #wmp_volume {
+	width: 70px;
+}
+
+#rmp_console, #rmp_numloop, #rmp_controls, #rmp_scriptcallbacks {
+	width: 70px;
+}
+
+#shockwave_swvolume, #shockwave_swframe, #shockwave_swurl, #shockwave_swstretchvalign, #shockwave_swstretchhalign, #shockwave_swstretchstyle {
+	width: 90px;
+}
+
+#qt_qtsrc {
+	width: 200px;
+}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/media/editor_plugin.js 2.5.src/wp-includes/js/tinymce/plugins/media/editor_plugin.js
--- 2.2.2.src/wp-includes/js/tinymce/plugins/media/editor_plugin.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/media/editor_plugin.js	2008-03-21 17:13:03.000000000 -0500
@@ -0,0 +1 @@
+(function(){var each=tinymce.each;tinymce.create('tinymce.plugins.MediaPlugin',{init:function(ed,url){var t=this;t.editor=ed;t.url=url;function isMediaElm(n){return/^(mceItemFlash|mceItemShockWave|mceItemWindowsMedia|mceItemQuickTime|mceItemRealMedia)$/.test(n.className);};ed.addCommand('mceMedia',function(){ed.windowManager.open({file:url+'/media.htm',width:430+parseInt(ed.getLang('media.delta_width',0)),height:470+parseInt(ed.getLang('media.delta_height',0)),inline:1},{plugin_url:url});});ed.addButton('media',{title:'media.desc',cmd:'mceMedia'});ed.onNodeChange.add(function(ed,cm,n){cm.setActive('media',n.nodeName=='IMG'&&isMediaElm(n));});ed.onInit.add(function(){var lo={mceItemFlash:'flash',mceItemShockWave:'shockwave',mceItemWindowsMedia:'windowsmedia',mceItemQuickTime:'quicktime',mceItemRealMedia:'realmedia'};if(ed.settings.content_css!==false)ed.dom.loadCSS(url+"/css/content.css");if(ed.theme.onResolveName){ed.theme.onResolveName.add(function(th,o){if(o.name=='img'){each(lo,function(v,k){if(ed.dom.hasClass(o.node,k)){o.name=v;o.title=ed.dom.getAttrib(o.node,'title');return false;}});}});}if(ed&&ed.plugins.contextmenu){ed.plugins.contextmenu.onContextMenu.add(function(th,m,e){if(e.nodeName=='IMG'&&/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(e.className)){m.add({title:'media.edit',icon:'media',cmd:'mceMedia'});}});}});ed.onBeforeSetContent.add(function(ed,o){var h=o.content;h=h.replace(/<script[^>]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi,function(a,b,c){var o=t._parse(c);return'<img class="mceItem'+b+'" title="'+ed.dom.encode(c)+'" src="'+url+'/img/trans.gif" width="'+o.width+'" height="'+o.height+'" />'});h=h.replace(/<object([^>]*)>/gi,'<span class="mceItemObject" $1>');h=h.replace(/<embed([^>]*)>/gi,'<span class="mceItemEmbed" $1>');h=h.replace(/<\/(object|embed)([^>]*)>/gi,'</span>');h=h.replace(/<param([^>]*)>/gi,function(a,b){return'<span '+b.replace(/value=/gi,'_value=')+' class="mceItemParam"></span>'});h=h.replace(/\/ class=\"mceItemParam\"><\/span>/gi,'class="mceItemParam"></span>');o.content=h;});ed.onSetContent.add(function(){t._spansToImgs(ed.getBody());});ed.onPreProcess.add(function(ed,o){var dom=ed.dom;if(o.set){t._spansToImgs(o.node);each(dom.select('IMG',o.node),function(n){var p;if(isMediaElm(n)){p=t._parse(n.title);dom.setAttrib(n,'width',dom.getAttrib(n,'width',p.width||100));dom.setAttrib(n,'height',dom.getAttrib(n,'height',p.height||100));}});}if(o.get){each(dom.select('IMG',o.node),function(n){var ci,cb,mt;if(ed.getParam('media_use_script')){if(isMediaElm(n))n.className=n.className.replace(/mceItem/g,'mceTemp');return;}switch(n.className){case'mceItemFlash':ci='d27cdb6e-ae6d-11cf-96b8-444553540000';cb='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';mt='application/x-shockwave-flash';break;case'mceItemShockWave':ci='166b1bca-3f9c-11cf-8075-444553540000';cb='http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0';mt='application/x-director';break;case'mceItemWindowsMedia':ci=ed.getParam('media_wmp6_compatible')?'05589fa1-c356-11ce-bf01-00aa0055595a':'6bf52a52-394a-11d3-b153-00c04f79faa6';cb='http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';mt='application/x-mplayer2';break;case'mceItemQuickTime':ci='02bf25d5-8c17-4b23-bc80-d3488abddc6b';cb='http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0';mt='video/quicktime';break;case'mceItemRealMedia':ci='cfcdaa03-8be4-11cf-b84b-0020afbbccfa';cb='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';mt='audio/x-pn-realaudio-plugin';break;}if(ci){dom.replace(t._buildObj({classid:ci,codebase:cb,type:mt},n),n);}});}});ed.onPostProcess.add(function(ed,o){o.content=o.content.replace(/_value=/g,'value=');});if(ed.getParam('media_use_script')){function getAttr(s,n){n=new RegExp(n+'=\"([^\"]+)\"','g').exec(s);return n?ed.dom.decode(n[1]):'';};ed.onPostProcess.add(function(ed,o){o.content=o.content.replace(/<img[^>]+>/g,function(im){var cl=getAttr(im,'class');if(/^(mceTempFlash|mceTempShockWave|mceTempWindowsMedia|mceTempQuickTime|mceTempRealMedia)$/.test(cl)){at=t._parse(getAttr(im,'title'));at.width=getAttr(im,'width');at.height=getAttr(im,'height');im='<script type="text/javascript">write'+cl.substring(7)+'({'+t._serialize(at)+'});</script>';}return im;});});}},getInfo:function(){return{longname:'Media',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/media',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_buildObj:function(o,n){var ob,ed=this.editor,dom=ed.dom,p=this._parse(n.title);p.width=o.width=dom.getAttrib(n,'width')||100;p.height=o.height=dom.getAttrib(n,'height')||100;ob=dom.create('span',{mce_name:'object',classid:"clsid:"+o.classid,codebase:o.codebase,width:o.width,height:o.height});if(p.src){p.src=ed.convertURL(p.src,'src',n);if(o.type=='application/x-mplayer2'){p.url=p.src;delete p.src;}}each(p,function(v,k){if(!/^(width|height|codebase|classid)$/.test(k))dom.add(ob,'span',{mce_name:'param',name:k,'_value':v});});dom.add(ob,'span',tinymce.extend({mce_name:'embed',type:o.type},p));return ob;},_spansToImgs:function(p){var t=this,dom=t.editor.dom,im,ci;each(dom.select('span',p),function(n){if(dom.getAttrib(n,'class')=='mceItemObject'){ci=dom.getAttrib(n,"classid").toLowerCase().replace(/\s+/g,'');switch(ci){case'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000':dom.replace(t._createImg('mceItemFlash',n),n);break;case'clsid:166b1bca-3f9c-11cf-8075-444553540000':dom.replace(t._createImg('mceItemShockWave',n),n);break;case'clsid:6bf52a52-394a-11d3-b153-00c04f79faa6':case'clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95':case'clsid:05589fa1-c356-11ce-bf01-00aa0055595a':dom.replace(t._createImg('mceItemWindowsMedia',n),n);break;case'clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b':dom.replace(t._createImg('mceItemQuickTime',n),n);break;case'clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa':dom.replace(t._createImg('mceItemRealMedia',n),n);break;default:dom.replace(t._createImg('mceItemFlash',n),n);}return;}if(dom.getAttrib(n,'class')=='mceItemEmbed'){switch(dom.getAttrib(n,'type')){case'application/x-shockwave-flash':dom.replace(t._createImg('mceItemFlash',n),n);break;case'application/x-director':dom.replace(t._createImg('mceItemShockWave',n),n);break;case'application/x-mplayer2':dom.replace(t._createImg('mceItemWindowsMedia',n),n);break;case'video/quicktime':dom.replace(t._createImg('mceItemQuickTime',n),n);break;case'audio/x-pn-realaudio-plugin':dom.replace(t._createImg('mceItemRealMedia',n),n);break;default:dom.replace(t._createImg('mceItemFlash',n),n);}}});},_createImg:function(cl,n){var im,dom=this.editor.dom,pa={},ti='';im=dom.create('img',{src:this.url+'/img/trans.gif',width:dom.getAttrib(n,'width')||100,height:dom.getAttrib(n,'height')||100,'class':cl});each(['id','name','width','height','bgcolor','align','flashvars','src','wmode'],function(na){var v=dom.getAttrib(n,na);if(v)pa[na]=v;});each(dom.select('span',n),function(n){if(dom.hasClass(n,'mceItemParam'))pa[dom.getAttrib(n,'name')]=dom.getAttrib(n,'_value');});if(pa.movie){pa.src=pa.movie;delete pa.movie;}delete pa.width;delete pa.height;im.title=this._serialize(pa);return im;},_parse:function(s){return tinymce.util.JSON.parse('{'+s+'}');},_serialize:function(o){return tinymce.util.JSON.serialize(o).replace(/[{}]/g,'');}});tinymce.PluginManager.add('media',tinymce.plugins.MediaPlugin);})();
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/media/img/flash.gif 2.5.src/wp-includes/js/tinymce/plugins/media/img/flash.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/media/img/flash.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/media/img/flash.gif	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,4 @@
+GIF89a  	 (JnVjz\䂏8Zj}   !   ,       I8?Bh4NQ0ZaEǼԄ  0B@H$
+p0әpHÌ r\  ڙ^5Us
Nam4CQva*-
s
+U
+ 
%a
9.MO8)H ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/media/img/flv_player.swf 2.5.src/wp-includes/js/tinymce/plugins/media/img/flv_player.swf
--- 2.2.2.src/wp-includes/js/tinymce/plugins/media/img/flv_player.swf	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/media/img/flv_player.swf	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,46 @@
+CWSa  x|	\S$pr/EO΀  ѐEUEzZj[jjjkov?xowfvvfvf`KsBj)@=%hjjJe
6(
+UH|F5PT!
(5y$DxLB[
+4SH
+e>aJ PBIB.&䫴>$)sIC=؇ޓ!g}o^ӣzT
G)!;tQTPPƏ-Z>C=>A×迨֡幻GJ?쑱"Ӫھ{SVes¶ŋe^cKqy?	5~E^LhQD5޿ˬ<+O߅i8jοMN6,?D~#5d([T;nJ	=DAqfy 9	^)jrp@/oɰ&6ٸT+Tɠj؎A:;0)Yp<\<0B
k*ۥO2FD G0cۥB_HXޕA!A$B,D`(it
+Z[J~ЬَW+
EH.,225S*H+*QZTi	(_֠RBoư(EYԐZf0贤h07JQPBcե<
dXQkU(L"J02JP΀M WҖ 22>>U0BS~4H]{>Coұ~PeH`P
+
R0#,ẠP~O(ӱ¥X4'ҫ*%' <ScJezA
E*BqȠ0 9Rtq(**.*3y"u\!GjJ(+jCNDcK{)4<E8T֨r&PE,]R3>vI)zbҨ |:6K>K'iU*"
+ oPFQjЁ:S(eĚ_4egVm }3L+Yc@Q1`|e%^b{:
+nn|r06m>tZ*("DHa0(hO
+
+Tz@*y#[aI {+
+4VQ(׫Kq Du?aZ YP4mO~*,Jl 76F1FG✔Jbcj$HA@TUU?L@#NX
D
tUZFU(JB@EA=;Fuѱ[TNTKgPdfFir̅JT1(oo(Y+,UU"uŝQ~YAW	R
خ5~ZZTb-.a0 )0L@-QjthEѮ54!Ƞ*uQoH8Q&2V_*(?@o=Д)@cVAgT
+-F2iG)P%3<c3嬫nDcȁQƔ(nPεW8 HHtz0 (U:l &}WZDŊq*8Ȉ	)0ZU>j3*$ӫ2ʊ
+.2ء,+"QPyN:uh
αZ QiqqªVBgV\:g~c6^0He<_b-n>QBj`^?!8sjRBjvؖ*..	AxFzP22p5
+
nټ3o,V/6~J hD%v~ +
+B H)a+rZZ xXXM!pe I 9'#	@C12;d^
+#$e.H"#	Iyqv&e/\)@=	I"D|HlLZ$7|IԑCDI٦L<4Tˎe'q!5\
сmvV_t/sB7,21")!ǽ	2Me-h]+""<E.
!x7D#dsy<d~ZO%=6oq+|lږM_u5 dXMD4P'd쟤UiL :0PONrR_  |m@(-$@(b0Xki!. )U Q0ܧ¾(Ncz! *56P.	WrmLm$]j
].j;"=,G,!SY{B	x_JI-ZbMjᐝ~ZZT,eИU9_u\c@s5(Wÿm
+9H&*.se,@,/}7	D䐎oXhvoϗ:v]'עHl$Z1A
+v{\ҁSKF*c۾5!KC,Yg<M_ _A |M5NrN$"jlXD("B	vEt`lYDE[[Dm
+
+-F;r2(*F@ -"1<dQ40_0/ð٨'a&`#dY6kTvX*LW*e0UDhFW~"~"xu1w&BvD$ w&]Qr ͇"1R\'N:;/|bg=X,V?5KbhcbGy%6ndN#(v&JٙU\ԪVЗe$ߗN^}wH҃qRitɎS(BfPwI<AZ)#0!HhM3&I$M*WZ%#-# ~hŲe24^SGBMVNYJ镍38OH&%}3MMzC ;7Ӟ2qBL8VPuH MO)K?$K_.$ <unrTup#?Qd|SS D]Nb$b؁b
+$Ϭrpx^kPZF947O'3Rn8Ǭ ѝс7jQ!Sv:`wan-Vx	VY<-y($n"cƅJJ!B3I耝)q,Ԩ5-fRGdK6uѼ:5O[UT53rb}3(Fu6yK-ػ kV]&(`3厲hl#m l.H򺩵e*u<*0?Ώ+iJYg"r>`7tycMǶ@m< W}9!FPMc46-dZa_<aZ7Yѳ#T0'<[ӏB,ZX';2I5e0DU:1 k|97L%jc!gociأ6l|`1wcۃp4ޒ5 SN8F9߃ <sC;tQk,ZࣥPa
+D mΊ\V%X4Qu0Μ$R+Px#4YfV6r1D,K$WM3-%l%R7!T|+Mmٙqm,*CB|B~CnFNpu!"!oeq@ad
,S",ق 79'->j'n3 ds((LIw%㥙ԟ0@;A
I9|SiEpY4W0QBr["7a%HH1B4+ΈY:2dytw;@E<S\Z0&$9z\X9ɷd\_RI3&*y%#BjjEF\NBu+"=>x:1پ}@q6c4
+8Tm}2"<<$rod/Y_">l+
snAQ>>DdDwVD?"_N/|hKqH c)7aV$>#}?5y8NfDXD`Vj&T#nad!aoWP.,,K: d;dnv.H]XL=eSmk/+5LԌxC;+/֝0
D_[8qZ81=5a4VihwDHz"OA)XBbm
9a'>x[yZ+umH&Ҩ/)Lދ:бZM?1<;.CrOYt2ӓ>G#2\e!DjN`5[V'(XefZ4eSWji\kS
+p
+ti$D
_;8 m(q|Nvc&x#\LV mZHݖ3,
+<?2
)/Bq
+M8-s"ZSE{wGʪ!	R OL oځ}y'$Z|1E kG_ Hvʩ_E[(H}.7.qEir>(WS^.9ܡ2fOQ!I`R-h&nRZ;4Wk3Auo7czW0	'Li<ZV\nDK
+	!:
+?xT%;rY%>$B$MeNצɠ=tF$6f5kTBҥGmMmDdB Q[۬FīY!fRj6M&`#\	隓	Cvt*|EDPM'ɗ=Po)ePҜ/ΉM$j%dGEl@G` i\
xl}k6ペJFe	9<Iث,`1[lߌE74J-@LmeNė94BCU%Jyȼ6Yk8cDUCk\`첀U|q+ʴlv`u⯎@h$̓V=r7չۦ2^7w_[!6En"aE.'Di5-ӕ{&n&ErLI<1Qe%
t%?y:
dWǗ>@ǥ3i
;7e#0femw\7g>FlX<b:73[ KCD"#NPGr K_w#Y3<j@h&7S+mvhh\D1ƿٙ/%K[HLF|I
Y`fw0$ 85ag>&o| UH_!aQ)/+{:5[6<PpviLtS5'Ĵ\  [\;xI.?%
G tӞd?ڇ=瑰V`|T̅⁹WR\ؓBVԒԒYj`qVc
+x2:vK3BB
+zCLKՖx.Hrdg2i4tZda8Ma}9gd̉OdIγ{3f_h^0t`Sqq\"Xk&.dq/[ee?~n!tV|HS?`t$|U/'Z6WXp5c߰`ʂ>zζ^DaLCb$s'L[8^`o*pqi\!!jvߡE35^R=59ྋ"^
+n"İ$1S*좽!hɛVUev}}=rwր?IoF	(n<p'JjѬ΅>rU<qIfOZfA?TB2FR74z:&/Wlp)}U
lό7>_:
˳jNV	\t|ɪK:מ+wꮮbu0Og9rJ$}%W5-p܅T8mf4 tDW17_id3Ƣ¦5]\]uQ>kWYwhvRؑK]B {{F5c$SX}pn9E%\\r{nN9
6ɢu$c\.a?y5]l<$35Ҩaӂ8=8qgmD#dO*1	wY9~5@ #eHAQכkF8} [cQYKHɒ&<?U`30]GO_Hcg*жmNޜlqC#;dDdlG8θvu{\%L;6ŻKՊ!ߤYU9ߺΥJ3&':hns]Z<xc9\>Mg@cZB>kwPq B)mAScN"a;K`+dO|eT~,`3ݾ
+
+
ge	?iC6@nPs^UT,$nN]+B{mn@	R-MÍJlBL@L0Y4i*.<Wh2& l˹@+#. 's=	Aghq}nCbnϨzJȺ١5od	@b8nna&]9LwЖ  B$G1\L%@,)5:pe?
+gFN/	yú6dn	d`XEĪ	"+"׃r )-`b
w@JB{plhRC /vA+Ĕ~z
+UZZ?QUDnNINw(lLDy@'oĔ0CqN
+<0[	͟Q?4|^bTMƏx
BP$%ŠXuEPwfq)Ʉ/cKdN`*8vl~[5g]kgfۆmJpCBKECJ0s&6Efw	(=xُncGD_ݞ%;t d.R~ߋdMm6eN2ϒG˪S/qDnOl#fL tQhV֢as:wI^ {[yGݽ3s#GGV)2  ` 0DzkGl ?wo)?(FhB@۠'-2д
+GKy4!4z
+ FbƗo	 çVfa`\?G\l0;<p☍j$9YK"|ٽiǂ^Cw>ܮrww#A0lN.q0LNkw=VŮNPs1d!,4rb>z1C1L#wPweXJD$;8
+	0;wH%*.m[x",[6խ6%㾌.ʹf>9''N{9lO}gYw]O6'V[3׺ʼ^
]_YkFFM5#{O*.NPt}-r6c{_~<4Y\RTD_MCkq	[[̅9g~<xB<-,bEnKK4T7q~?uSP<ZtnjQM~v9>vz~"犤;o"@ޠ+]op"꽶ፄQ{
+v2ySڝin>]mSz|?	>~own5=須VPHW礤)W(<^޶^,
^)?_=eOWZy5˥߿zUoZvw{%MGw҃KoG;
g¦W=+䚝~[ώkl^9u|Q[QcRVgSV?,C[Ӻ!nG9>i?tZ25W<kfX=|>߻ρ·.KSK+ccOUXPW6sꮑ&]y;OK{XlwxɃwGflc6qBỮsyCcؑ+?y.ԨsC.!k/dйYg
+]ffjp׏7?&D"ܽq|+iN٭lnދUuOg(c6=pf_π}kԭx%]/W3		I=-r^BѰ=;< uI5R~vLWɹNwxV_k=2|ِ;w<~7.U)Vʛ+&NN[7hkNdCo
<y@ũc<x.w\Sٮ\i[gvn:sc租uQE1d/[}}ۯ"_j&fަ49'0}^H3C,d A4xA^
m
nQ){WN(l[FN&:zƐo>9ÉCZwҸ_ȟ\l7|0j×Nd!oGݴ}y;ܚ:s{#NOoV$>&gːSxqpț{y留'ľ_1v)uG`g݉{ϡU].ȍ1qF꥞%k\n޻W~I#9~~SuMaњXg8V^Լ}cc[Ԙ0'wGFnx¸={L~÷.3{7HPgE§ILWݿ+yyٛroonK?.pOq+;n1ו%ΏJ%Ÿt96緝㤮>YY`ەR]^Qk_^w*tUmO
q{ޥ?nzXz9s5p5c*8"p8b-XFGesAVŚ}s-]ZwֿtKtǠeuukJg-|KϽ	{oJLslcw:(,oh=Od'O'ްU믟ͨ>#n;uvb0<ysbGnr֣=c>˫٩Q_1~1[fV#!T5~Y~]xڔ'φ|t蓛n虻}fVNh$^_hg}ͱ7&]<)Go-Yjʸ#~#cWh?>gT;?z>om/ԍܔrxm燷%hy[k|MgVnT%2ڧႺ=WM יV_?8Wr^|/jt*kv׆fhԜGʏv4vFh$_b$tt&3xk= 
rX3!iAkQ4NՁiA+|k%"! 1o/-W֋1\z2+VŁʙr8$- Ä`Wxr/;e[@ GOS־~=ۓ{4z9,]lPrYl7y}n
a+Uf:LW2dAHΤHOwP.ш"ey׶V:|Vݩaƭ욲dk[W]F5`\t5`GtwqL1DbtC{xvi\E14xdLtafˠxBL]˴B+"#*˼h5H}<ǲ#I=շ %7<BTGb:
+"Oeī9!D! C/~!3U/Nmlص.BWR-7bTtg_
+I)%~~#go ޥIã# lIMˉA}}}0m&;kPW}߄r*HWd(RhQlAtzUq$22T0zfPTL\L4ĥgLqqkУ3B=,'/7ɩwvZ2Qrrьݧg8"F=;c·~ZWTp+V_[m*UL߫+j|_ūj??,r=s]fs_ppBԵיӶt{uiƃΝ/Դ,{kv,ߏy|[ɮ#6$#@
uOc˫e}TYnV7i2]ϭqmC{t8o&⯁]/<+ȽὖZBd. <~GA]ˣwJV)+c@~SҞ_|vG/xst"tw3R={}|×}~ve^~uގ?&>gvN1|ϻGnyB<4)~[\|gӓTWW7/'է}}}c*ޞ57Bn%N{pvo}ĉr̷:ooZ{r\I8l}㌇n]sĂG?,G	}dMЍ\W[/ F\1Ž$%pC2V?3|K"#$7ؒD{;(~SQ{[1(^UA@5u@G|P̠FSh^H@^_mtf_Y\gz)0"
$.r/qDЧv-DzD{H.Bw2p>ڵkESSq\ze%e9g
+xnBCL:ݹA],FϹk# DkVB8mb#<S	-^
+! uI3t׸D$ElP܀Et3=]g/;SvJ.H0x.fnՖ#
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/media/img/quicktime.gif 2.5.src/wp-includes/js/tinymce/plugins/media/img/quicktime.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/media/img/quicktime.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/media/img/quicktime.gif	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,3 @@
+GIF89a   7M6nX
brt|)t!   ,       'Ga1_g<[m\ E`,
2  2!@ 4C Y(>iLD8ntYuD#uxz"#7S	,V
+".
+;*? 5;"
 <_
 		,\"	! ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/media/img/realmedia.gif 2.5.src/wp-includes/js/tinymce/plugins/media/img/realmedia.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/media/img/realmedia.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/media/img/realmedia.gif	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,5 @@
+GIF89a%   RPM @kű@=;.+)c5xHVusq}$pX
 Jfff   !   ,    %   '<Cp,DA{N
lC;h&P8c#e
+
h\gPx"0X:J8 	*14H_$f pf 
;1 u
nC "  p
ɑhT#Vt΍"j
+Ӄ{"ɏ[k&Pɰ
*0-@`!
+9`Ⱥ )V@ 4p! F֍`
+$xCA@7PHQ#=5KP4* ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/media/img/shockwave.gif 2.5.src/wp-includes/js/tinymce/plugins/media/img/shockwave.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/media/img/shockwave.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/media/img/shockwave.gif	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,2 @@
+GIF89a       2 -Ŝ՟lf wh|Ŝӽ;Ģ̵Y f  $$33..77ll~~꟟                                                            !  + ,       *H#!H:FI]
+i2ՠH:Ωkd:DE`:&i^E$#(G)o	#& %F)#x$*#Go#&"H**#)#{**&*+)E!*!O*))CH)TN*A ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/media/img/trans.gif 2.5.src/wp-includes/js/tinymce/plugins/media/img/trans.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/media/img/trans.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/media/img/trans.gif	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1 @@
+GIF89a          !   ,       D ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/media/img/windowsmedia.gif 2.5.src/wp-includes/js/tinymce/plugins/media/img/windowsmedia.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/media/img/windowsmedia.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/media/img/windowsmedia.gif	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,2 @@
+GIF89a  ? uS-ѩaY0@G愅p+fҎG,LWKqxwwV&^qKNCiiimKx+tnV^K~3fp!BWuWr(a;vTHo9!  ? ,        "
+%lhhD4],G:jͤ\fఄT s5 !*$/	  ;-!&1/<'9;=7+;:78(3.2	"+%?>))'=.,?

.,	B	2%3cB(	~ ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/media/js/embed.js 2.5.src/wp-includes/js/tinymce/plugins/media/js/embed.js
--- 2.2.2.src/wp-includes/js/tinymce/plugins/media/js/embed.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/media/js/embed.js	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,73 @@
+/**
+ * This script contains embed functions for common plugins. This scripts are complety free to use for any purpose.
+ */
+
+function writeFlash(p) {
+	writeEmbed(
+		'D27CDB6E-AE6D-11cf-96B8-444553540000',
+		'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',
+		'application/x-shockwave-flash',
+		p
+	);
+}
+
+function writeShockWave(p) {
+	writeEmbed(
+	'166B1BCA-3F9C-11CF-8075-444553540000',
+	'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0',
+	'application/x-director',
+		p
+	);
+}
+
+function writeQuickTime(p) {
+	writeEmbed(
+		'02BF25D5-8C17-4B23-BC80-D3488ABDDC6B',
+		'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0',
+		'video/quicktime',
+		p
+	);
+}
+
+function writeRealMedia(p) {
+	writeEmbed(
+		'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA',
+		'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',
+		'audio/x-pn-realaudio-plugin',
+		p
+	);
+}
+
+function writeWindowsMedia(p) {
+	p.url = p.src;
+	writeEmbed(
+		'6BF52A52-394A-11D3-B153-00C04F79FAA6',
+		'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701',
+		'application/x-mplayer2',
+		p
+	);
+}
+
+function writeEmbed(cls, cb, mt, p) {
+	var h = '', n;
+
+	h += '<object classid="clsid:' + cls + '" codebase="' + cb + '"';
+	h += typeof(p.id) != "undefined" ? 'id="' + p.id + '"' : '';
+	h += typeof(p.name) != "undefined" ? 'name="' + p.name + '"' : '';
+	h += typeof(p.width) != "undefined" ? 'width="' + p.width + '"' : '';
+	h += typeof(p.height) != "undefined" ? 'height="' + p.height + '"' : '';
+	h += typeof(p.align) != "undefined" ? 'align="' + p.align + '"' : '';
+	h += '>';
+
+	for (n in p)
+		h += '<param name="' + n + '" value="' + p[n] + '">';
+
+	h += '<embed type="' + mt + '"';
+
+	for (n in p)
+		h += n + '="' + p[n] + '" ';
+
+	h += '></embed></object>';
+
+	document.write(h);
+}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/media/js/media.js 2.5.src/wp-includes/js/tinymce/plugins/media/js/media.js
--- 2.2.2.src/wp-includes/js/tinymce/plugins/media/js/media.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/media/js/media.js	2008-03-12 17:47:11.000000000 -0500
@@ -0,0 +1,621 @@
+tinyMCEPopup.requireLangPack();
+
+var oldWidth, oldHeight, ed, url;
+
+if (url = tinyMCEPopup.getParam("media_external_list_url"))
+	document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>');
+
+function init() {
+	var pl = "", f, val;
+	var type = "flash", fe, i;
+
+	ed = tinyMCEPopup.editor;
+
+	tinyMCEPopup.resizeToInnerSize();
+	f = document.forms[0]
+
+	fe = ed.selection.getNode();
+	if (/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(ed.dom.getAttrib(fe, 'class'))) {
+		pl = fe.title;
+
+		switch (ed.dom.getAttrib(fe, 'class')) {
+			case 'mceItemFlash':
+				type = 'flash';
+				break;
+
+			case 'mceItemFlashVideo':
+				type = 'flv';
+				break;
+
+			case 'mceItemShockWave':
+				type = 'shockwave';
+				break;
+
+			case 'mceItemWindowsMedia':
+				type = 'wmp';
+				break;
+
+			case 'mceItemQuickTime':
+				type = 'qt';
+				break;
+
+			case 'mceItemRealMedia':
+				type = 'rmp';
+				break;
+		}
+
+		document.forms[0].insert.value = ed.getLang('update', 'Insert', true); 
+	}
+
+	document.getElementById('filebrowsercontainer').innerHTML = getBrowserHTML('filebrowser','src','media','media');
+	document.getElementById('qtsrcfilebrowsercontainer').innerHTML = getBrowserHTML('qtsrcfilebrowser','qt_qtsrc','media','media');
+	document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');
+
+	var html = getMediaListHTML('medialist','src','media','media');
+	if (html == "")
+		document.getElementById("linklistrow").style.display = 'none';
+	else
+		document.getElementById("linklistcontainer").innerHTML = html;
+
+	// Resize some elements
+	if (isVisible('filebrowser'))
+		document.getElementById('src').style.width = '230px';
+
+	// Setup form
+	if (pl != "") {
+		pl = tinyMCEPopup.editor.plugins.media._parse(pl);
+
+		switch (type) {
+			case "flash":
+				setBool(pl, 'flash', 'play');
+				setBool(pl, 'flash', 'loop');
+				setBool(pl, 'flash', 'menu');
+				setBool(pl, 'flash', 'swliveconnect');
+				setStr(pl, 'flash', 'quality');
+				setStr(pl, 'flash', 'scale');
+				setStr(pl, 'flash', 'salign');
+				setStr(pl, 'flash', 'wmode');
+				setStr(pl, 'flash', 'base');
+				setStr(pl, 'flash', 'flashvars');
+			break;
+
+			case "qt":
+				setBool(pl, 'qt', 'loop');
+				setBool(pl, 'qt', 'autoplay');
+				setBool(pl, 'qt', 'cache');
+				setBool(pl, 'qt', 'controller');
+				setBool(pl, 'qt', 'correction');
+				setBool(pl, 'qt', 'enablejavascript');
+				setBool(pl, 'qt', 'kioskmode');
+				setBool(pl, 'qt', 'autohref');
+				setBool(pl, 'qt', 'playeveryframe');
+				setBool(pl, 'qt', 'tarsetcache');
+				setStr(pl, 'qt', 'scale');
+				setStr(pl, 'qt', 'starttime');
+				setStr(pl, 'qt', 'endtime');
+				setStr(pl, 'qt', 'tarset');
+				setStr(pl, 'qt', 'qtsrcchokespeed');
+				setStr(pl, 'qt', 'volume');
+				setStr(pl, 'qt', 'qtsrc');
+			break;
+
+			case "shockwave":
+				setBool(pl, 'shockwave', 'sound');
+				setBool(pl, 'shockwave', 'progress');
+				setBool(pl, 'shockwave', 'autostart');
+				setBool(pl, 'shockwave', 'swliveconnect');
+				setStr(pl, 'shockwave', 'swvolume');
+				setStr(pl, 'shockwave', 'swstretchstyle');
+				setStr(pl, 'shockwave', 'swstretchhalign');
+				setStr(pl, 'shockwave', 'swstretchvalign');
+			break;
+
+			case "wmp":
+				setBool(pl, 'wmp', 'autostart');
+				setBool(pl, 'wmp', 'enabled');
+				setBool(pl, 'wmp', 'enablecontextmenu');
+				setBool(pl, 'wmp', 'fullscreen');
+				setBool(pl, 'wmp', 'invokeurls');
+				setBool(pl, 'wmp', 'mute');
+				setBool(pl, 'wmp', 'stretchtofit');
+				setBool(pl, 'wmp', 'windowlessvideo');
+				setStr(pl, 'wmp', 'balance');
+				setStr(pl, 'wmp', 'baseurl');
+				setStr(pl, 'wmp', 'captioningid');
+				setStr(pl, 'wmp', 'currentmarker');
+				setStr(pl, 'wmp', 'currentposition');
+				setStr(pl, 'wmp', 'defaultframe');
+				setStr(pl, 'wmp', 'playcount');
+				setStr(pl, 'wmp', 'rate');
+				setStr(pl, 'wmp', 'uimode');
+				setStr(pl, 'wmp', 'volume');
+			break;
+
+			case "rmp":
+				setBool(pl, 'rmp', 'autostart');
+				setBool(pl, 'rmp', 'loop');
+				setBool(pl, 'rmp', 'autogotourl');
+				setBool(pl, 'rmp', 'center');
+				setBool(pl, 'rmp', 'imagestatus');
+				setBool(pl, 'rmp', 'maintainaspect');
+				setBool(pl, 'rmp', 'nojava');
+				setBool(pl, 'rmp', 'prefetch');
+				setBool(pl, 'rmp', 'shuffle');
+				setStr(pl, 'rmp', 'console');
+				setStr(pl, 'rmp', 'controls');
+				setStr(pl, 'rmp', 'numloop');
+				setStr(pl, 'rmp', 'scriptcallbacks');
+			break;
+		}
+
+		setStr(pl, null, 'src');
+		setStr(pl, null, 'id');
+		setStr(pl, null, 'name');
+		setStr(pl, null, 'vspace');
+		setStr(pl, null, 'hspace');
+		setStr(pl, null, 'bgcolor');
+		setStr(pl, null, 'align');
+		setStr(pl, null, 'width');
+		setStr(pl, null, 'height');
+
+		if ((val = ed.dom.getAttrib(fe, "width")) != "")
+			pl.width = f.width.value = val;
+
+		if ((val = ed.dom.getAttrib(fe, "height")) != "")
+			pl.height = f.height.value = val;
+
+		oldWidth = pl.width ? parseInt(pl.width) : 0;
+		oldHeight = pl.height ? parseInt(pl.height) : 0;
+	} else
+		oldWidth = oldHeight = 0;
+
+	selectByValue(f, 'media_type', type);
+	changedType(type);
+	updateColor('bgcolor_pick', 'bgcolor');
+
+	TinyMCE_EditableSelects.init();
+	generatePreview();
+}
+
+function insertMedia() {
+	var fe, f = document.forms[0], h;
+
+	tinyMCEPopup.restoreSelection();
+
+	if (!AutoValidator.validate(f)) {
+		alert(ed.getLang('invalid_data'));
+		return false;
+	}
+
+	f.width.value = f.width.value == "" ? 100 : f.width.value;
+	f.height.value = f.height.value == "" ? 100 : f.height.value;
+
+	fe = ed.selection.getNode();
+	if (fe != null && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(ed.dom.getAttrib(fe, 'class'))) {
+		switch (f.media_type.options[f.media_type.selectedIndex].value) {
+			case "flash":
+				fe.className = "mceItemFlash";
+				break;
+
+			case "flv":
+				fe.className = "mceItemFlashVideo";
+				break;
+
+			case "shockwave":
+				fe.className = "mceItemShockWave";
+				break;
+
+			case "qt":
+				fe.className = "mceItemQuickTime";
+				break;
+
+			case "wmp":
+				fe.className = "mceItemWindowsMedia";
+				break;
+
+			case "rmp":
+				fe.className = "mceItemRealMedia";
+				break;
+		}
+
+		if (fe.width != f.width.value || fe.height != f.height.height)
+			ed.execCommand('mceRepaint');
+
+		fe.title = serializeParameters();
+		fe.width = f.width.value;
+		fe.height = f.height.value;
+		fe.style.width = f.width.value + (f.width.value.indexOf('%') == -1 ? 'px' : '');
+		fe.style.height = f.height.value + (f.height.value.indexOf('%') == -1 ? 'px' : '');
+		fe.align = f.align.options[f.align.selectedIndex].value;
+	} else {
+		h = '<img src="' + tinyMCEPopup.getWindowArg("plugin_url") + '/img/trans.gif"' ;
+
+		switch (f.media_type.options[f.media_type.selectedIndex].value) {
+			case "flash":
+				h += ' class="mceItemFlash"';
+				break;
+
+			case "flv":
+				h += ' class="mceItemFlashVideo"';
+				break;
+
+			case "shockwave":
+				h += ' class="mceItemShockWave"';
+				break;
+
+			case "qt":
+				h += ' class="mceItemQuickTime"';
+				break;
+
+			case "wmp":
+				h += ' class="mceItemWindowsMedia"';
+				break;
+
+			case "rmp":
+				h += ' class="mceItemRealMedia"';
+				break;
+		}
+
+		h += ' title="' + serializeParameters() + '"';
+		h += ' width="' + f.width.value + '"';
+		h += ' height="' + f.height.value + '"';
+		h += ' align="' + f.align.options[f.align.selectedIndex].value + '"';
+
+		h += ' />';
+
+		ed.execCommand('mceInsertContent', false, h);
+	}
+
+	tinyMCEPopup.close();
+}
+
+function updatePreview() {
+	var f = document.forms[0], type;
+
+	f.width.value = f.width.value || '320';
+	f.height.value = f.height.value || '240';
+
+	type = getType(f.src.value);
+	selectByValue(f, 'media_type', type);
+	changedType(type);
+	generatePreview();
+}
+
+function getMediaListHTML() {
+	if (typeof(tinyMCEMediaList) != "undefined" && tinyMCEMediaList.length > 0) {
+		var html = "";
+
+		html += '<select id="linklist" name="linklist" style="width: 250px" onchange="this.form.src.value=this.options[this.selectedIndex].value;updatePreview();">';
+		html += '<option value="">---</option>';
+
+		for (var i=0; i<tinyMCEMediaList.length; i++)
+			html += '<option value="' + tinyMCEMediaList[i][1] + '">' + tinyMCEMediaList[i][0] + '</option>';
+
+		html += '</select>';
+
+		return html;
+	}
+
+	return "";
+}
+
+function getType(v) {
+	var fo, i, c, el, x, f = document.forms[0];
+
+	fo = ed.getParam("media_types", "flash=swf;flv=flv;shockwave=dcr;qt=mov,qt,mpg,mp3,mp4,mpeg;shockwave=dcr;wmp=avi,wmv,wm,asf,asx,wmx,wvx;rmp=rm,ra,ram").split(';');
+
+	// YouTube
+	if (v.match(/watch\?v=(.+)(.*)/)) {
+		f.width.value = '425';
+		f.height.value = '350';
+		f.src.value = 'http://www.youtube.com/v/' + v.match(/v=(.*)(.*)/)[0].split('=')[1];
+		return 'flash';
+	}
+
+	// Google video
+	if (v.indexOf('http://video.google.com/videoplay?docid=') == 0) {
+		f.width.value = '425';
+		f.height.value = '326';
+		f.src.value = 'http://video.google.com/googleplayer.swf?docId=' + v.substring('http://video.google.com/videoplay?docid='.length) + '&hl=en';
+		return 'flash';
+	}
+
+	for (i=0; i<fo.length; i++) {
+		c = fo[i].split('=');
+
+		el = c[1].split(',');
+		for (x=0; x<el.length; x++)
+		if (v.indexOf('.' + el[x]) != -1)
+			return c[0];
+	}
+
+	return null;
+}
+
+function switchType(v) {
+	var t = getType(v), d = document, f = d.forms[0];
+
+	if (!t)
+		return;
+
+	selectByValue(d.forms[0], 'media_type', t);
+	changedType(t);
+
+	// Update qtsrc also
+	if (t == 'qt' && f.src.value.toLowerCase().indexOf('rtsp://') != -1) {
+		alert(ed.getLang("media_qt_stream_warn"));
+
+		if (f.qt_qtsrc.value == '')
+			f.qt_qtsrc.value = f.src.value;
+	}
+}
+
+function changedType(t) {
+	var d = document;
+
+	d.getElementById('flash_options').style.display = 'none';
+	d.getElementById('flv_options').style.display = 'none';
+	d.getElementById('qt_options').style.display = 'none';
+	d.getElementById('shockwave_options').style.display = 'none';
+	d.getElementById('wmp_options').style.display = 'none';
+	d.getElementById('rmp_options').style.display = 'none';
+	d.getElementById(t + '_options').style.display = 'block';
+}
+
+function serializeParameters() {
+	var d = document, f = d.forms[0], s = '';
+
+	switch (f.media_type.options[f.media_type.selectedIndex].value) {
+		case "flash":
+			s += getBool('flash', 'play', true);
+			s += getBool('flash', 'loop', true);
+			s += getBool('flash', 'menu', true);
+			s += getBool('flash', 'swliveconnect', false);
+			s += getStr('flash', 'quality');
+			s += getStr('flash', 'scale');
+			s += getStr('flash', 'salign');
+			s += getStr('flash', 'wmode');
+			s += getStr('flash', 'base');
+			s += getStr('flash', 'flashvars');
+		break;
+
+		case "qt":
+			s += getBool('qt', 'loop', false);
+			s += getBool('qt', 'autoplay', true);
+			s += getBool('qt', 'cache', false);
+			s += getBool('qt', 'controller', true);
+			s += getBool('qt', 'correction', false, 'none', 'full');
+			s += getBool('qt', 'enablejavascript', false);
+			s += getBool('qt', 'kioskmode', false);
+			s += getBool('qt', 'autohref', false);
+			s += getBool('qt', 'playeveryframe', false);
+			s += getBool('qt', 'targetcache', false);
+			s += getStr('qt', 'scale');
+			s += getStr('qt', 'starttime');
+			s += getStr('qt', 'endtime');
+			s += getStr('qt', 'target');
+			s += getStr('qt', 'qtsrcchokespeed');
+			s += getStr('qt', 'volume');
+			s += getStr('qt', 'qtsrc');
+		break;
+
+		case "shockwave":
+			s += getBool('shockwave', 'sound');
+			s += getBool('shockwave', 'progress');
+			s += getBool('shockwave', 'autostart');
+			s += getBool('shockwave', 'swliveconnect');
+			s += getStr('shockwave', 'swvolume');
+			s += getStr('shockwave', 'swstretchstyle');
+			s += getStr('shockwave', 'swstretchhalign');
+			s += getStr('shockwave', 'swstretchvalign');
+		break;
+
+		case "wmp":
+			s += getBool('wmp', 'autostart', true);
+			s += getBool('wmp', 'enabled', false);
+			s += getBool('wmp', 'enablecontextmenu', true);
+			s += getBool('wmp', 'fullscreen', false);
+			s += getBool('wmp', 'invokeurls', true);
+			s += getBool('wmp', 'mute', false);
+			s += getBool('wmp', 'stretchtofit', false);
+			s += getBool('wmp', 'windowlessvideo', false);
+			s += getStr('wmp', 'balance');
+			s += getStr('wmp', 'baseurl');
+			s += getStr('wmp', 'captioningid');
+			s += getStr('wmp', 'currentmarker');
+			s += getStr('wmp', 'currentposition');
+			s += getStr('wmp', 'defaultframe');
+			s += getStr('wmp', 'playcount');
+			s += getStr('wmp', 'rate');
+			s += getStr('wmp', 'uimode');
+			s += getStr('wmp', 'volume');
+		break;
+
+		case "rmp":
+			s += getBool('rmp', 'autostart', false);
+			s += getBool('rmp', 'loop', false);
+			s += getBool('rmp', 'autogotourl', true);
+			s += getBool('rmp', 'center', false);
+			s += getBool('rmp', 'imagestatus', true);
+			s += getBool('rmp', 'maintainaspect', false);
+			s += getBool('rmp', 'nojava', false);
+			s += getBool('rmp', 'prefetch', false);
+			s += getBool('rmp', 'shuffle', false);
+			s += getStr('rmp', 'console');
+			s += getStr('rmp', 'controls');
+			s += getStr('rmp', 'numloop');
+			s += getStr('rmp', 'scriptcallbacks');
+		break;
+	}
+
+	s += getStr(null, 'id');
+	s += getStr(null, 'name');
+	s += getStr(null, 'src');
+	s += getStr(null, 'align');
+	s += getStr(null, 'bgcolor');
+	s += getInt(null, 'vspace');
+	s += getInt(null, 'hspace');
+	s += getStr(null, 'width');
+	s += getStr(null, 'height');
+
+	s = s.length > 0 ? s.substring(0, s.length - 1) : s;
+
+	return s;
+}
+
+function setBool(pl, p, n) {
+	if (typeof(pl[n]) == "undefined")
+		return;
+
+	document.forms[0].elements[p + "_" + n].checked = pl[n];
+}
+
+function setStr(pl, p, n) {
+	var f = document.forms[0], e = f.elements[(p != null ? p + "_" : '') + n];
+
+	if (typeof(pl[n]) == "undefined")
+		return;
+
+	if (e.type == "text")
+		e.value = pl[n];
+	else
+		selectByValue(f, (p != null ? p + "_" : '') + n, pl[n]);
+}
+
+function getBool(p, n, d, tv, fv) {
+	var v = document.forms[0].elements[p + "_" + n].checked;
+
+	tv = typeof(tv) == 'undefined' ? 'true' : "'" + jsEncode(tv) + "'";
+	fv = typeof(fv) == 'undefined' ? 'false' : "'" + jsEncode(fv) + "'";
+
+	return (v == d) ? '' : n + (v ? ':' + tv + ',' : ':' + fv + ',');
+}
+
+function getStr(p, n, d) {
+	var e = document.forms[0].elements[(p != null ? p + "_" : "") + n];
+	var v = e.type == "text" ? e.value : e.options[e.selectedIndex].value;
+
+	if (n == 'src')
+		v = tinyMCEPopup.editor.convertURL(v, 'src', null);
+
+	return ((n == d || v == '') ? '' : n + ":'" + jsEncode(v) + "',");
+}
+
+function getInt(p, n, d) {
+	var e = document.forms[0].elements[(p != null ? p + "_" : "") + n];
+	var v = e.type == "text" ? e.value : e.options[e.selectedIndex].value;
+
+	return ((n == d || v == '') ? '' : n + ":" + v.replace(/[^0-9]+/g, '') + ",");
+}
+
+function jsEncode(s) {
+	s = s.replace(new RegExp('\\\\', 'g'), '\\\\');
+	s = s.replace(new RegExp('"', 'g'), '\\"');
+	s = s.replace(new RegExp("'", 'g'), "\\'");
+
+	return s;
+}
+
+function generatePreview(c) {
+	var f = document.forms[0], p = document.getElementById('prev'), h = '', cls, pl, n, type, codebase, wp, hp, nw, nh;
+
+	p.innerHTML = '<!-- x --->';
+
+	nw = parseInt(f.width.value);
+	nh = parseInt(f.height.value);
+
+	if (f.width.value != "" && f.height.value != "") {
+		if (f.constrain.checked) {
+			if (c == 'width' && oldWidth != 0) {
+				wp = nw / oldWidth;
+				nh = Math.round(wp * nh);
+				f.height.value = nh;
+			} else if (c == 'height' && oldHeight != 0) {
+				hp = nh / oldHeight;
+				nw = Math.round(hp * nw);
+				f.width.value = nw;
+			}
+		}
+	}
+
+	if (f.width.value != "")
+		oldWidth = nw;
+
+	if (f.height.value != "")
+		oldHeight = nh;
+
+	// After constrain
+	pl = serializeParameters();
+
+	switch (f.media_type.options[f.media_type.selectedIndex].value) {
+		case "flash":
+			cls = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';
+			codebase = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';
+			type = 'application/x-shockwave-flash';
+			break;
+
+		case "shockwave":
+			cls = 'clsid:166B1BCA-3F9C-11CF-8075-444553540000';
+			codebase = 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0';
+			type = 'application/x-director';
+			break;
+
+		case "qt":
+			cls = 'clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B';
+			codebase = 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0';
+			type = 'video/quicktime';
+			break;
+
+		case "wmp":
+			cls = ed.getParam('media_wmp6_compatible') ? 'clsid:05589FA1-C356-11CE-BF01-00AA0055595A' : 'clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6';
+			codebase = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';
+			type = 'application/x-mplayer2';
+			break;
+
+		case "rmp":
+			cls = 'clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA';
+			codebase = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';
+			type = 'audio/x-pn-realaudio-plugin';
+			break;
+	}
+
+	if (pl == '') {
+		p.innerHTML = '';
+		return;
+	}
+
+	pl = tinyMCEPopup.editor.plugins.media._parse(pl);
+
+	if (!pl.src) {
+		p.innerHTML = '';
+		return;
+	}
+
+	pl.src = tinyMCEPopup.editor.documentBaseURI.toAbsolute(pl.src);
+	pl.width = !pl.width ? 100 : pl.width;
+	pl.height = !pl.height ? 100 : pl.height;
+	pl.id = !pl.id ? 'obj' : pl.id;
+	pl.name = !pl.name ? 'eobj' : pl.name;
+	pl.align = !pl.align ? '' : pl.align;
+
+	h += '<object classid="clsid:' + cls + '" codebase="' + codebase + '" width="' + pl.width + '" height="' + pl.height + '" id="' + pl.id + '" name="' + pl.name + '" align="' + pl.align + '">';
+
+	for (n in pl) {
+		h += '<param name="' + n + '" value="' + pl[n] + '">';
+
+		// Add extra url parameter if it's an absolute URL
+		if (n == 'src' && pl[n].indexOf('://') != -1)
+			h += '<param name="url" value="' + pl[n] + '" />';
+	}
+
+	h += '<embed type="' + type + '" ';
+
+	for (n in pl)
+		h += n + '="' + pl[n] + '" ';
+
+	h += '></embed></object>';
+
+	p.innerHTML = "<!-- x --->" + h;
+}
+
+tinyMCEPopup.onInit.add(init);
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/media/media.htm 2.5.src/wp-includes/js/tinymce/plugins/media/media.htm
--- 2.2.2.src/wp-includes/js/tinymce/plugins/media/media.htm	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/media/media.htm	2008-03-21 17:13:03.000000000 -0500
@@ -0,0 +1,824 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#media_dlg.title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="js/media.js"></script>
+	<script type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script type="text/javascript" src="../../utils/validate.js"></script>
+	<script type="text/javascript" src="../../utils/form_utils.js"></script>
+	<script type="text/javascript" src="../../utils/editable_selects.js"></script>
+	<link href="css/media.css" rel="stylesheet" type="text/css" />
+	<base target="_self" />
+</head>
+<body style="display: none">
+    <form onsubmit="insertMedia();return false;" action="#">
+		<div class="tabs">
+			<ul>
+				<li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');generatePreview();" onmousedown="return false;">{#media_dlg.general}</a></span></li>
+				<li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#media_dlg.advanced}</a></span></li>
+			</ul>
+		</div>
+
+		<div class="panel_wrapper">
+			<div id="general_panel" class="panel current">
+				<fieldset>
+					<legend>{#media_dlg.general}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+							<tr>
+								<td><label for="media_type">{#media_dlg.type}</label></td>
+								<td>
+									<select id="media_type" name="media_type" onchange="changedType(this.value);generatePreview();">
+										<option value="flash">Flash</option>
+										<!-- <option value="flv">Flash video (FLV)</option> -->
+										<option value="qt">Quicktime</option>
+										<option value="shockwave">Shockwave</option>
+										<option value="wmp">Windows Media</option>
+										<option value="rmp">Real Media</option>
+									</select>
+								</td>
+							</tr>
+							<tr>
+							<td><label for="src">{#media_dlg.file}</label></td>
+							  <td>
+									<table border="0" cellspacing="0" cellpadding="0">
+									  <tr>
+										<td><input id="src" name="src" type="text" value="" class="mceFocus" onchange="switchType(this.value);generatePreview();" /></td>
+										<td id="filebrowsercontainer">&nbsp;</td>
+									  </tr>
+									</table>
+								</td>
+							</tr>
+							<tr id="linklistrow">
+								<td><label for="linklist">{#media_dlg.list}</label></td>
+								<td id="linklistcontainer">&nbsp;</td>
+							</tr>
+							<tr>
+								<td><label for="width">{#media_dlg.size}</label></td>
+								<td>
+									<table border="0" cellpadding="0" cellspacing="0">
+										<tr>
+											<td><input type="text" id="width" name="width" value="" class="size" onchange="generatePreview('width');" /> x <input type="text" id="height" name="height" value="" class="size"  onchange="generatePreview('height');" /></td>
+											<td>&nbsp;&nbsp;<input id="constrain" type="checkbox" name="constrain" class="checkbox" /></td>
+											<td><label id="constrainlabel" for="constrain">{#media_dlg.constrain_proportions}</label></td>
+										</tr>
+									</table>
+								</td>
+							</tr>
+					</table>
+				</fieldset>
+
+				<fieldset>
+					<legend>{#media_dlg.preview}</legend>
+					<div id="prev"></div>
+				</fieldset>
+			</div>
+
+			<div id="advanced_panel" class="panel">
+				<fieldset>
+					<legend>{#media_dlg.advanced}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0" width="100%">
+						<tr>
+							<td><label for="id">{#media_dlg.id}</label></td>
+							<td><input type="text" id="id" name="id" onchange="generatePreview();" /></td>
+							<td><label for="name">{#media_dlg.name}</label></td>
+							<td><input type="text" id="name" name="name" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td><label for="align">{#media_dlg.align}</label></td>
+							<td>
+								<select id="align" name="align" onchange="generatePreview();">
+									<option value="">{#not_set}</option> 
+									<option value="top">{#media_dlg.align_top}</option>
+									<option value="right">{#media_dlg.align_right}</option>
+									<option value="bottom">{#media_dlg.align_bottom}</option>
+									<option value="left">{#media_dlg.align_left}</option>
+								</select>
+							</td>
+
+							<td><label for="bgcolor">{#media_dlg.bgcolor}</label></td>
+							<td>
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');generatePreview();" /></td>
+										<td id="bgcolor_pickcontainer">&nbsp;</td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td><label for="vspace">{#media_dlg.vspace}</label></td>
+							<td><input type="text" id="vspace" name="vspace" class="number" onchange="generatePreview();" /></td>
+							<td><label for="hspace">{#media_dlg.hspace}</label></td>
+							<td><input type="text" id="hspace" name="hspace" class="number" onchange="generatePreview();" /></td>
+						</tr>
+					</table>
+				</fieldset>
+
+				<fieldset id="flash_options">
+					<legend>{#media_dlg.flash_options}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr>
+							<td><label for="flash_quality">{#media_dlg.quality}</label></td>
+							<td>
+								<select id="flash_quality" name="flash_quality" onchange="generatePreview();">
+									<option value="">{#not_set}</option> 
+									<option value="high">high</option>
+									<option value="low">low</option>
+									<option value="autolow">autolow</option>
+									<option value="autohigh">autohigh</option>
+									<option value="best">best</option>
+								</select>
+							</td>
+
+							<td><label for="flash_scale">{#media_dlg.scale}</label></td>
+							<td>
+								<select id="flash_scale" name="flash_scale" onchange="generatePreview();">
+									<option value="">{#not_set}</option> 
+									<option value="showall">showall</option>
+									<option value="noborder">noborder</option>
+									<option value="exactfit">exactfit</option>
+									<option value="noscale">noscale</option>
+								</select>
+							</td>
+						</tr>
+
+						<tr>
+							<td><label for="flash_wmode">{#media_dlg.wmode}</label></td>
+							<td>
+								<select id="flash_wmode" name="flash_wmode" onchange="generatePreview();">
+									<option value="">{#not_set}</option> 
+									<option value="window">window</option>
+									<option value="opaque">opaque</option>
+									<option value="transparent">transparent</option>
+								</select>
+							</td>
+
+							<td><label for="flash_salign">{#media_dlg.salign}</label></td>
+							<td>
+								<select id="flash_salign" name="flash_salign" onchange="generatePreview();">
+									<option value="">{#not_set}</option> 
+									<option value="l">{#media_dlg.align_left}</option>
+									<option value="t">{#media_dlg.align_top}</option>
+									<option value="r">{#media_dlg.align_right}</option>
+									<option value="b">{#media_dlg.align_bottom}</option>
+									<option value="tl">{#media_dlg.align_top_left}</option>
+									<option value="tr">{#media_dlg.align_top_right}</option>
+									<option value="bl">{#media_dlg.align_bottom_left}</option>
+									<option value="br">{#media_dlg.align_bottom_right}</option>
+								</select>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="flash_play" name="flash_play" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="flash_play">{#media_dlg.play}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="flash_loop" name="flash_loop" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="flash_loop">{#media_dlg.loop}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="flash_menu" name="flash_menu" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="flash_menu">{#media_dlg.menu}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="flash_swliveconnect" name="flash_swliveconnect" onchange="generatePreview();" /></td>
+										<td><label for="flash_swliveconnect">{#media_dlg.liveconnect}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+					</table>
+
+					<table>
+						<tr>
+							<td><label for="flash_base">{#media_dlg.base}</label></td>
+							<td><input type="text" id="flash_base" name="flash_base" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td><label for="flash_flashvars">{#media_dlg.flashvars}</label></td>
+							<td><input type="text" id="flash_flashvars" name="flash_flashvars" onchange="generatePreview();" /></td>
+						</tr>
+					</table>
+				</fieldset>
+
+				<fieldset id="flv_options">
+					<legend>{#media_dlg.flv_options}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr>
+							<td><label for="flv_scalemode">{#media_dlg.flv_scalemode}</label></td>
+							<td>
+								<select id="flv_scalemode" name="flv_scalemode" onchange="generatePreview();">
+									<option value="">{#not_set}</option> 
+									<option value="none">none</option>
+									<option value="double">double</option>
+									<option value="full">full</option>
+								</select>
+							</td>
+
+							<td><label for="flv_buffer">{#media_dlg.flv_buffer}</label></td>
+							<td><input type="text" id="flv_buffer" name="flv_buffer" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td><label for="flv_startimage">{#media_dlg.flv_startimage}</label></td>
+							<td><input type="text" id="flv_startimage" name="flv_startimage" onchange="generatePreview();" /></td>
+
+							<td><label for="flv_starttime">{#media_dlg.flv_starttime}</label></td>
+							<td><input type="text" id="flv_starttime" name="flv_starttime" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td><label for="flv_defaultvolume">{#media_dlg.flv_defaultvolume}</label></td>
+							<td><input type="text" id="flv_defaultvolume" name="flv_defaultvolume" onchange="generatePreview();" /></td>
+
+							<td><label for="flv_starttime">{#media_dlg.flv_starttime}</label></td>
+							<td><input type="text" id="flv_starttime" name="flv_starttime" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="flv_hiddengui" name="flv_hiddengui" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="flv_hiddengui">{#media_dlg.flv_hiddengui}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="flv_autostart" name="flv_autostart" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="flv_autostart">{#media_dlg.flv_autostart}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="flv_loop" name="flv_loop" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="flv_loop">{#media_dlg.flv_loop}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="flv_showscalemodes" name="flv_showscalemodes" onchange="generatePreview();" /></td>
+										<td><label for="flv_showscalemodes">{#media_dlg.flv_showscalemodes}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="flv_smoothvideo" name="flash_flv_flv_smoothvideosmoothvideo" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="flv_smoothvideo">{#media_dlg.flv_smoothvideo}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="flv_jscallback" name="flv_jscallback" onchange="generatePreview();" /></td>
+										<td><label for="flv_jscallback">{#media_dlg.flv_jscallback}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+					</table>
+				</fieldset>
+
+				<fieldset id="qt_options">
+					<legend>{#media_dlg.qt_options}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="qt_loop" name="qt_loop" onchange="generatePreview();" /></td>
+										<td><label for="qt_loop">{#media_dlg.loop}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="qt_autoplay" name="qt_autoplay" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="qt_autoplay">{#media_dlg.play}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="qt_cache" name="qt_cache" onchange="generatePreview();" /></td>
+										<td><label for="qt_cache">{#media_dlg.cache}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="qt_controller" name="qt_controller" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="qt_controller">{#media_dlg.controller}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="qt_correction" name="qt_correction" onchange="generatePreview();" /></td>
+										<td><label for="qt_correction">{#media_dlg.correction}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="qt_enablejavascript" name="qt_enablejavascript" onchange="generatePreview();" /></td>
+										<td><label for="qt_enablejavascript">{#media_dlg.enablejavascript}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="qt_kioskmode" name="qt_kioskmode" onchange="generatePreview();" /></td>
+										<td><label for="qt_kioskmode">{#media_dlg.kioskmode}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="qt_autohref" name="qt_autohref" onchange="generatePreview();" /></td>
+										<td><label for="qt_autohref">{#media_dlg.autohref}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="qt_playeveryframe" name="qt_playeveryframe" onchange="generatePreview();" /></td>
+										<td><label for="qt_playeveryframe">{#media_dlg.playeveryframe}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="qt_targetcache" name="qt_targetcache" onchange="generatePreview();" /></td>
+										<td><label for="qt_targetcache">{#media_dlg.targetcache}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td><label for="qt_scale">{#media_dlg.scale}</label></td>
+							<td><select id="qt_scale" name="qt_scale" class="mceEditableSelect" onchange="generatePreview();">
+									<option value="">{#not_set}</option> 
+									<option value="tofit">tofit</option>
+									<option value="aspect">aspect</option>
+								</select>
+							</td>
+
+							<td colspan="2">&nbsp;</td>
+						</tr>
+
+						<tr>
+							<td><label for="qt_starttime">{#media_dlg.starttime}</label></td>
+							<td><input type="text" id="qt_starttime" name="qt_starttime" onchange="generatePreview();" /></td>
+
+							<td><label for="qt_endtime">{#media_dlg.endtime}</label></td>
+							<td><input type="text" id="qt_endtime" name="qt_endtime" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td><label for="qt_target">{#media_dlg.target}</label></td>
+							<td><input type="text" id="qt_target" name="qt_target" onchange="generatePreview();" /></td>
+
+							<td><label for="qt_href">{#media_dlg.href}</label></td>
+							<td><input type="text" id="qt_href" name="qt_href" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td><label for="qt_qtsrcchokespeed">{#media_dlg.qtsrcchokespeed}</label></td>
+							<td><input type="text" id="qt_qtsrcchokespeed" name="qt_qtsrcchokespeed" onchange="generatePreview();" /></td>
+
+							<td><label for="qt_volume">{#media_dlg.volume}</label></td>
+							<td><input type="text" id="qt_volume" name="qt_volume" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td><label for="qt_qtsrc">{#media_dlg.qtsrc}</label></td>
+							<td colspan="4">
+							<table border="0" cellspacing="0" cellpadding="0">
+								  <tr>
+									<td><input type="text" id="qt_qtsrc" name="qt_qtsrc" onchange="generatePreview();" /></td>
+									<td id="qtsrcfilebrowsercontainer">&nbsp;</td>
+								  </tr>
+							</table>
+							</td>
+						</tr>
+					</table>
+				</fieldset>
+
+				<fieldset id="wmp_options">
+					<legend>{#media_dlg.wmp_options}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="wmp_autostart" name="wmp_autostart" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="wmp_autostart">{#media_dlg.autostart}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="wmp_enabled" name="wmp_enabled" onchange="generatePreview();" /></td>
+										<td><label for="wmp_enabled">{#media_dlg.enabled}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="wmp_enablecontextmenu" name="wmp_enablecontextmenu" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="wmp_enablecontextmenu">{#media_dlg.menu}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="wmp_fullscreen" name="wmp_fullscreen" onchange="generatePreview();" /></td>
+										<td><label for="wmp_fullscreen">{#media_dlg.fullscreen}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="wmp_invokeurls" name="wmp_invokeurls" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="wmp_invokeurls">{#media_dlg.invokeurls}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="wmp_mute" name="wmp_mute" onchange="generatePreview();" /></td>
+										<td><label for="wmp_mute">{#media_dlg.mute}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="wmp_stretchtofit" name="wmp_stretchtofit" onchange="generatePreview();" /></td>
+										<td><label for="wmp_stretchtofit">{#media_dlg.stretchtofit}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="wmp_windowlessvideo" name="wmp_windowlessvideo" onchange="generatePreview();" /></td>
+										<td><label for="wmp_windowlessvideo">{#media_dlg.windowlessvideo}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td><label for="wmp_balance">{#media_dlg.balance}</label></td>
+							<td><input type="text" id="wmp_balance" name="wmp_balance" onchange="generatePreview();" /></td>
+
+							<td><label for="wmp_baseurl">{#media_dlg.baseurl}</label></td>
+							<td><input type="text" id="wmp_baseurl" name="wmp_baseurl" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td><label for="wmp_captioningid">{#media_dlg.captioningid}</label></td>
+							<td><input type="text" id="wmp_captioningid" name="wmp_captioningid" onchange="generatePreview();" /></td>
+
+							<td><label for="wmp_currentmarker">{#media_dlg.currentmarker}</label></td>
+							<td><input type="text" id="wmp_currentmarker" name="wmp_currentmarker" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td><label for="wmp_currentposition">{#media_dlg.currentposition}</label></td>
+							<td><input type="text" id="wmp_currentposition" name="wmp_currentposition" onchange="generatePreview();" /></td>
+
+							<td><label for="wmp_defaultframe">{#media_dlg.defaultframe}</label></td>
+							<td><input type="text" id="wmp_defaultframe" name="wmp_defaultframe" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td><label for="wmp_playcount">{#media_dlg.playcount}</label></td>
+							<td><input type="text" id="wmp_playcount" name="wmp_playcount" onchange="generatePreview();" /></td>
+
+							<td><label for="wmp_rate">{#media_dlg.rate}</label></td>
+							<td><input type="text" id="wmp_rate" name="wmp_rate" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td><label for="wmp_uimode">{#media_dlg.uimode}</label></td>
+							<td><input type="text" id="wmp_uimode" name="wmp_uimode" onchange="generatePreview();" /></td>
+
+							<td><label for="wmp_volume">{#media_dlg.volume}</label></td>
+							<td><input type="text" id="wmp_volume" name="wmp_volume" onchange="generatePreview();" /></td>
+						</tr>
+
+					</table>
+				</fieldset>
+
+				<fieldset id="rmp_options">
+					<legend>{#media_dlg.rmp_options}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="rmp_autostart" name="rmp_autostart" onchange="generatePreview();" /></td>
+										<td><label for="rmp_autostart">{#media_dlg.autostart}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="rmp_loop" name="rmp_loop" onchange="generatePreview();" /></td>
+										<td><label for="rmp_loop">{#media_dlg.loop}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="rmp_autogotourl" name="rmp_autogotourl" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="rmp_autogotourl">{#media_dlg.autogotourl}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="rmp_center" name="rmp_center" onchange="generatePreview();" /></td>
+										<td><label for="rmp_center">{#media_dlg.center}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="rmp_imagestatus" name="rmp_imagestatus" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="rmp_imagestatus">{#media_dlg.imagestatus}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="rmp_maintainaspect" name="rmp_maintainaspect" onchange="generatePreview();" /></td>
+										<td><label for="rmp_maintainaspect">{#media_dlg.maintainaspect}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="rmp_nojava" name="rmp_nojava" onchange="generatePreview();" /></td>
+										<td><label for="rmp_nojava">{#media_dlg.nojava}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="rmp_prefetch" name="rmp_prefetch" onchange="generatePreview();" /></td>
+										<td><label for="rmp_prefetch">{#media_dlg.prefetch}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="rmp_shuffle" name="rmp_shuffle" onchange="generatePreview();" /></td>
+										<td><label for="rmp_shuffle">{#media_dlg.shuffle}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								&nbsp;
+							</td>
+						</tr>
+
+						<tr>
+							<td><label for="rmp_console">{#media_dlg.console}</label></td>
+							<td><input type="text" id="rmp_console" name="rmp_console" onchange="generatePreview();" /></td>
+
+							<td><label for="rmp_controls">{#media_dlg.controls}</label></td>
+							<td><input type="text" id="rmp_controls" name="rmp_controls" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td><label for="rmp_numloop">{#media_dlg.numloop}</label></td>
+							<td><input type="text" id="rmp_numloop" name="rmp_numloop" onchange="generatePreview();" /></td>
+
+							<td><label for="rmp_scriptcallbacks">{#media_dlg.scriptcallbacks}</label></td>
+							<td><input type="text" id="rmp_scriptcallbacks" name="rmp_scriptcallbacks" onchange="generatePreview();" /></td>
+						</tr>
+					</table>
+				</fieldset>
+
+				<fieldset id="shockwave_options">
+					<legend>{#media_dlg.shockwave_options}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr>
+							<td><label for="shockwave_swstretchstyle">{#media_dlg.swstretchstyle}</label></td>
+							<td>
+								<select id="shockwave_swstretchstyle" name="shockwave_swstretchstyle" onchange="generatePreview();">
+									<option value="none">{#not_set}</option>
+									<option value="meet">Meet</option>
+									<option value="fill">Fill</option>
+									<option value="stage">Stage</option>
+								</select>
+							</td>
+
+							<td><label for="shockwave_swvolume">{#media_dlg.volume}</label></td>
+							<td><input type="text" id="shockwave_swvolume" name="shockwave_swvolume" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td><label for="shockwave_swstretchhalign">{#media_dlg.swstretchhalign}</label></td>
+							<td>
+								<select id="shockwave_swstretchhalign" name="shockwave_swstretchhalign" onchange="generatePreview();">
+									<option value="none">{#not_set}</option>
+									<option value="left">{#media_dlg.align_left}</option>
+									<option value="center">{#media_dlg.align_center}</option>
+									<option value="right">{#media_dlg.align_right}</option>
+								</select>
+							</td>
+
+							<td><label for="shockwave_swstretchvalign">{#media_dlg.swstretchvalign}</label></td>
+							<td>
+								<select id="shockwave_swstretchvalign" name="shockwave_swstretchvalign" onchange="generatePreview();">
+									<option value="none">{#not_set}</option>
+									<option value="meet">Meet</option>
+									<option value="fill">Fill</option>
+									<option value="stage">Stage</option>
+								</select>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="shockwave_autostart" name="shockwave_autostart" onchange="generatePreview();" checked="checked" /></td>
+										<td><label for="shockwave_autostart">{#media_dlg.autostart}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="shockwave_sound" name="shockwave_sound" onchange="generatePreview();" checked="checked" /></td>
+										<td><label for="shockwave_sound">{#media_dlg.sound}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="shockwave_swliveconnect" name="shockwave_swliveconnect" onchange="generatePreview();" /></td>
+										<td><label for="shockwave_swliveconnect">{#media_dlg.liveconnect}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="shockwave_progress" name="shockwave_progress" onchange="generatePreview();" checked="checked" /></td>
+										<td><label for="shockwave_progress">{#media_dlg.progress}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+					</table>
+				</fieldset>
+			</div>
+		</div>
+
+		<div class="mceActionPanel">
+			<div style="float: left">
+				<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
+			</div>
+
+			<div style="float: right">
+				<input type="submit" id="insert" name="insert" value="{#insert}" />
+			</div>
+		</div>
+	</form>
+</body>
+</html>
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/paste/blank.htm 2.5.src/wp-includes/js/tinymce/plugins/paste/blank.htm
--- 2.2.2.src/wp-includes/js/tinymce/plugins/paste/blank.htm	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/paste/blank.htm	2008-01-17 09:44:05.000000000 -0600
@@ -1,19 +1,22 @@
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-	<title>blank_page</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-	<script language="javascript">
-		function init() {
-			document.body.contentEditable = true;
-			document.designMode = 'on';
-			parent.initIframe(document);
-			window.focus();
-		}
-	</script>
-	<link href="css/blank.css" rel="stylesheet" type="text/css" />
-	<base target="_self" />
-</head>
-<body onload="init();">
-
-</body>
-</html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>blank_page</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<link href="css/blank.css" rel="stylesheet" type="text/css" />
+<base target="_self" />
+<script type="text/javascript">
+function init() {
+	if (parent.tinymce.isIE)
+		document.body.contentEditable = true;
+	else
+		document.designMode = 'on';
+
+	parent.initIframe(document);
+	window.focus();
+}
+</script>
+</head>
+<body onload="init();">
+
+</body>
+</html>
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/paste/css/blank.css 2.5.src/wp-includes/js/tinymce/plugins/paste/css/blank.css
--- 2.2.2.src/wp-includes/js/tinymce/plugins/paste/css/blank.css	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/paste/css/blank.css	2008-01-17 09:44:05.000000000 -0600
@@ -1,13 +1,14 @@
-body {
-	background-color: #FFFFFF;
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 10px;
-	scrollbar-3dlight-color: #F0F0EE;
-	scrollbar-arrow-color: #676662;
-	scrollbar-base-color: #F0F0EE;
-	scrollbar-darkshadow-color: #DDDDDD;
-	scrollbar-face-color: #E0E0DD;
-	scrollbar-highlight-color: #F0F0EE;
-	scrollbar-shadow-color: #F0F0EE;
-	scrollbar-track-color: #F5F5F5;
-}
+html, body {height:98%}
+body {
+background-color: #FFFFFF;
+font-family: Verdana, Arial, Helvetica, sans-serif;
+font-size: 10px;
+scrollbar-3dlight-color: #F0F0EE;
+scrollbar-arrow-color: #676662;
+scrollbar-base-color: #F0F0EE;
+scrollbar-darkshadow-color: #DDDDDD;
+scrollbar-face-color: #E0E0DD;
+scrollbar-highlight-color: #F0F0EE;
+scrollbar-shadow-color: #F0F0EE;
+scrollbar-track-color: #F5F5F5;
+}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/paste/css/pasteword.css 2.5.src/wp-includes/js/tinymce/plugins/paste/css/pasteword.css
--- 2.2.2.src/wp-includes/js/tinymce/plugins/paste/css/pasteword.css	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/paste/css/pasteword.css	2008-01-17 09:44:05.000000000 -0600
@@ -1,3 +1,3 @@
-.sourceIframe {
-	border: 1px solid #808080;
-}
+.sourceIframe {
+	border: 1px solid #808080;
+}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/paste/editor_plugin.js 2.5.src/wp-includes/js/tinymce/plugins/paste/editor_plugin.js
--- 2.2.2.src/wp-includes/js/tinymce/plugins/paste/editor_plugin.js	2007-04-12 12:04:03.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/plugins/paste/editor_plugin.js	2008-03-21 17:13:03.000000000 -0500
@@ -1,395 +1 @@
-/**
- * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $
- *
- * @author Moxiecode
- * @copyright Copyright  2004-2007, Moxiecode Systems AB, All rights reserved.
- */
-
-/* Import plugin specific language pack */ 
-tinyMCE.importPluginLanguagePack('paste');
-
-var TinyMCE_PastePlugin = {
-	getInfo : function() {
-		return {
-			longname : 'Paste text/word',
-			author : 'Moxiecode Systems AB',
-			authorurl : 'http://tinymce.moxiecode.com',
-			infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste',
-			version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
-		};
-	},
-
-	initInstance : function(inst) {
-		if (tinyMCE.isMSIE && tinyMCE.getParam("paste_auto_cleanup_on_paste", false))
-			tinyMCE.addEvent(inst.getBody(), "paste", TinyMCE_PastePlugin._handlePasteEvent);
-	},
-
-	handleEvent : function(e) {
-		// Force paste dialog if non IE browser
-		if (!tinyMCE.isRealIE && tinyMCE.getParam("paste_auto_cleanup_on_paste", false) && e.ctrlKey && e.keyCode == 86 && e.type == "keydown") {
-			window.setTimeout('tinyMCE.selectedInstance.execCommand("mcePasteText",true)', 1);
-			return tinyMCE.cancelEvent(e);
-		}
-
-		return true;
-	},
-
-	getControlHTML : function(cn) { 
-		switch (cn) { 
-			case "pastetext":
-				return tinyMCE.getButtonHTML(cn, 'lang_paste_text_desc', '{$pluginurl}/images/pastetext.gif', 'mcePasteText', true);
-
-			case "pasteword":
-				return tinyMCE.getButtonHTML(cn, 'lang_paste_word_desc', '{$pluginurl}/images/pasteword.gif', 'mcePasteWord', true);
-
-			case "selectall":
-				return tinyMCE.getButtonHTML(cn, 'lang_selectall_desc', '{$pluginurl}/images/selectall.gif', 'mceSelectAll', true);
-		} 
-
-		return ''; 
-	},
-
-	execCommand : function(editor_id, element, command, user_interface, value) { 
-		switch (command) { 
-			case "mcePasteText": 
-				if (user_interface) {
-					if ((tinyMCE.isMSIE && !tinyMCE.isOpera) && !tinyMCE.getParam('paste_use_dialog', false))
-						TinyMCE_PastePlugin._insertText(clipboardData.getData("Text"), true); 
-					else { 
-						var template = new Array(); 
-						template['file']	= '../../plugins/paste/pastetext.htm'; // Relative to theme 
-						template['width']  = 450; 
-						template['height'] = 400; 
-						var plain_text = ""; 
-						tinyMCE.openWindow(template, {editor_id : editor_id, plain_text: plain_text, resizable : "yes", scrollbars : "no", inline : "yes", mceDo : 'insert'}); 
-					}
-				} else
-					TinyMCE_PastePlugin._insertText(value['html'], value['linebreaks']);
-
-				return true;
-
-			case "mcePasteWord": 
-				if (user_interface) {
-					if ((tinyMCE.isMSIE && !tinyMCE.isOpera) && !tinyMCE.getParam('paste_use_dialog', false)) {
-						TinyMCE_PastePlugin._insertWordContent(TinyMCE_PastePlugin._clipboardHTML());
-					} else { 
-						var template = new Array(); 
-						template['file']	= '../../plugins/paste/pasteword.htm'; // Relative to theme 
-						template['width']  = 450; 
-						template['height'] = 400; 
-						var plain_text = ""; 
-						tinyMCE.openWindow(template, {editor_id : editor_id, plain_text: plain_text, resizable : "yes", scrollbars : "no", inline : "yes", mceDo : 'insert'});
-					}
-				} else
-					TinyMCE_PastePlugin._insertWordContent(value);
-
-				return true;
-
-			case "mceSelectAll":
-				tinyMCE.execInstanceCommand(editor_id, 'selectall'); 
-				return true; 
-
-		} 
-
-		// Pass to next handler in chain 
-		return false; 
-	},
-
-	// Private plugin internal methods
-
-	_handlePasteEvent : function(e) {
-		switch (e.type) {
-			case "paste":
-				var html = TinyMCE_PastePlugin._clipboardHTML();
-				var r, inst = tinyMCE.selectedInstance;
-
-				// Removes italic, strong etc, the if was needed due to bug #1437114
-				if (inst && (r = inst.getRng()) && r.text.length > 0)
-					tinyMCE.execCommand('delete');
-
-				if (html && html.length > 0)
-					tinyMCE.execCommand('mcePasteWord', false, html);
-
-				tinyMCE.cancelEvent(e);
-				return false;
-		}
-
-		return true;
-	},
-
-	_insertText : function(content, bLinebreaks) { 
-		if (content && content.length > 0) {
-			if (bLinebreaks) { 
-				// Special paragraph treatment 
-				if (tinyMCE.getParam("paste_create_paragraphs", true)) {
-					var rl = tinyMCE.getParam("paste_replace_list", '\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');
-					for (var i=0; i<rl.length; i+=2)
-						content = content.replace(new RegExp(rl[i], 'gi'), rl[i+1]);
-
-					content = tinyMCE.regexpReplace(content, "\r\n\r\n", "</p><p>", "gi"); 
-					content = tinyMCE.regexpReplace(content, "\r\r", "</p><p>", "gi"); 
-					content = tinyMCE.regexpReplace(content, "\n\n", "</p><p>", "gi"); 
-
-					// Has paragraphs 
-					if ((pos = content.indexOf('</p><p>')) != -1) { 
-						tinyMCE.execCommand("Delete"); 
-
-						var node = tinyMCE.selectedInstance.getFocusElement(); 
-
-						// Get list of elements to break 
-						var breakElms = new Array(); 
-
-						do { 
-							if (node.nodeType == 1) { 
-								// Don't break tables and break at body 
-								if (node.nodeName == "TD" || node.nodeName == "BODY") 
-									break; 
-		
-								breakElms[breakElms.length] = node; 
-							} 
-						} while(node = node.parentNode); 
-
-						var before = "", after = "</p>"; 
-						before += content.substring(0, pos); 
-
-						for (var i=0; i<breakElms.length; i++) { 
-							before += "</" + breakElms[i].nodeName + ">"; 
-							after += "<" + breakElms[(breakElms.length-1)-i].nodeName + ">"; 
-						} 
-
-						before += "<p>"; 
-						content = before + content.substring(pos+7) + after; 
-					} 
-				} 
-
-				if (tinyMCE.getParam("paste_create_linebreaks", true)) {
-					content = tinyMCE.regexpReplace(content, "\r\n", "<br />", "gi"); 
-					content = tinyMCE.regexpReplace(content, "\r", "<br />", "gi"); 
-					content = tinyMCE.regexpReplace(content, "\n", "<br />", "gi"); 
-				}
-			} 
-		
-			tinyMCE.execCommand("mceInsertRawHTML", false, content); 
-		}
-	},
-
-	_insertWordContent : function(content) { 
-		if (content && content.length > 0) {
-			// Cleanup Word content
-			var bull = String.fromCharCode(8226);
-			var middot = String.fromCharCode(183);
-			var cb;
-
-			if ((cb = tinyMCE.getParam("paste_insert_word_content_callback", "")) != "")
-				content = eval(cb + "('before', content)");
-
-			var rl = tinyMCE.getParam("paste_replace_list", '\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');
-			for (var i=0; i<rl.length; i+=2)
-				content = content.replace(new RegExp(rl[i], 'gi'), rl[i+1]);
-
-			if (tinyMCE.getParam("paste_convert_headers_to_strong", false)) {
-				content = content.replace(new RegExp('<p class=MsoHeading.*?>(.*?)<\/p>', 'gi'), '<p><b>$1</b></p>');
-			}
-
-			content = content.replace(new RegExp('tab-stops: list [0-9]+.0pt">', 'gi'), '">' + "--list--");
-			content = content.replace(new RegExp(bull + "(.*?)<BR>", "gi"), "<p>" + middot + "$1</p>");
-			content = content.replace(new RegExp('<SPAN style="mso-list: Ignore">', 'gi'), "<span>" + bull); // Covert to bull list
-			content = content.replace(/<o:p><\/o:p>/gi, "");
-			content = content.replace(new RegExp('<br style="page-break-before: always;.*>', 'gi'), '-- page break --'); // Replace pagebreaks
-			content = content.replace(new RegExp('<(!--)([^>]*)(--)>', 'g'), "");  // Word comments
-
-			if (tinyMCE.getParam("paste_remove_spans", true))
-				content = content.replace(/<\/?span[^>]*>/gi, "");
-
-			if (tinyMCE.getParam("paste_remove_styles", true))
-				content = content.replace(new RegExp('<(\\w[^>]*) style="([^"]*)"([^>]*)', 'gi'), "<$1$3");
-
-			content = content.replace(/<\/?font[^>]*>/gi, "");
-
-			// Strips class attributes.
-			switch (tinyMCE.getParam("paste_strip_class_attributes", "all")) {
-				case "all":
-					content = content.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3");
-					break;
-
-				case "mso":
-					content = content.replace(new RegExp('<(\\w[^>]*) class="?mso([^ |>]*)([^>]*)', 'gi'), "<$1$3");
-					break;
-			}
-
-			content = content.replace(new RegExp('href="?' + TinyMCE_PastePlugin._reEscape("" + document.location) + '', 'gi'), 'href="' + tinyMCE.settings['document_base_url']);
-			content = content.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3");
-			content = content.replace(/<\\?\?xml[^>]*>/gi, "");
-			content = content.replace(/<\/?\w+:[^>]*>/gi, "");
-			content = content.replace(/-- page break --\s*<p>&nbsp;<\/p>/gi, ""); // Remove pagebreaks
-			content = content.replace(/-- page break --/gi, ""); // Remove pagebreaks
-
-	//		content = content.replace(/\/?&nbsp;*/gi, ""); &nbsp;
-	//		content = content.replace(/<p>&nbsp;<\/p>/gi, '');
-
-			if (!tinyMCE.settings['force_p_newlines']) {
-				content = content.replace('', '' ,'gi');
-				content = content.replace('</p>', '<br /><br />' ,'gi');
-			}
-
-			if (!tinyMCE.isMSIE && !tinyMCE.settings['force_p_newlines']) {
-				content = content.replace(/<\/?p[^>]*>/gi, "");
-			}
-
-			content = content.replace(/<\/?div[^>]*>/gi, "");
-
-			// Convert all middlot lists to UL lists
-			if (tinyMCE.getParam("paste_convert_middot_lists", true)) {
-				var div = document.createElement("div");
-				div.innerHTML = content;
-
-				// Convert all middot paragraphs to li elements
-				var className = tinyMCE.getParam("paste_unindented_list_class", "unIndentedList");
-
-				while (TinyMCE_PastePlugin._convertMiddots(div, "--list--")) ; // bull
-				while (TinyMCE_PastePlugin._convertMiddots(div, middot, className)) ; // Middot
-				while (TinyMCE_PastePlugin._convertMiddots(div, bull)) ; // bull
-
-				content = div.innerHTML;
-			}
-
-			// Replace all headers with strong and fix some other issues
-			if (tinyMCE.getParam("paste_convert_headers_to_strong", false)) {
-				content = content.replace(/<h[1-6]>&nbsp;<\/h[1-6]>/gi, '<p>&nbsp;&nbsp;</p>');
-				content = content.replace(/<h[1-6]>/gi, '<p><b>');
-				content = content.replace(/<\/h[1-6]>/gi, '</b></p>');
-				content = content.replace(/<b>&nbsp;<\/b>/gi, '<b>&nbsp;&nbsp;</b>');
-				content = content.replace(/^(&nbsp;)*/gi, '');
-			}
-
-			content = content.replace(/--list--/gi, ""); // Remove --list--
-
-			if ((cb = tinyMCE.getParam("paste_insert_word_content_callback", "")) != "")
-				content = eval(cb + "('after', content)");
-
-			// Insert cleaned content
-			tinyMCE.execCommand("mceInsertContent", false, content);
-
-			if (tinyMCE.getParam('paste_force_cleanup_wordpaste', true))
-				window.setTimeout('tinyMCE.execCommand("mceCleanup");', 1); // Do normal cleanup detached from this thread
-		}
-	},
-
-	_reEscape : function(s) {
-		var l = "?.\\*[](){}+^$:";
-		var o = "";
-
-		for (var i=0; i<s.length; i++) {
-			var c = s.charAt(i);
-
-			if (l.indexOf(c) != -1)
-				o += '\\' + c;
-			else
-				o += c;
-		}
-
-		return o;
-	},
-
-	_convertMiddots : function(div, search, class_name) {
-		var mdot = String.fromCharCode(183);
-		var bull = String.fromCharCode(8226);
-
-		var nodes = div.getElementsByTagName("p");
-		var prevul;
-		for (var i=0; i<nodes.length; i++) {
-			var p = nodes[i];
-
-			// Is middot
-			if (p.innerHTML.indexOf(search) == 0) {
-				var ul = document.createElement("ul");
-
-				if (class_name)
-					ul.className = class_name;
-
-				// Add the first one
-				var li = document.createElement("li");
-				li.innerHTML = p.innerHTML.replace(new RegExp('' + mdot + '|' + bull + '|--list--|&nbsp;', "gi"), '');
-				ul.appendChild(li);
-
-				// Add the rest
-				var np = p.nextSibling;
-				while (np) {
-			        // If the node is whitespace, then
-			        // ignore it and continue on.
-			        if (np.nodeType == 3 && new RegExp('^\\s$', 'm').test(np.nodeValue)) {
-			                np = np.nextSibling;
-			                continue;
-			        }
-
-					if (search == mdot) {
-					        if (np.nodeType == 1 && new RegExp('^o(\\s+|&nbsp;)').test(np.innerHTML)) {
-					                // Second level of nesting
-					                if (!prevul) {
-					                        prevul = ul;
-					                        ul = document.createElement("ul");
-					                        prevul.appendChild(ul);
-					                }
-					                np.innerHTML = np.innerHTML.replace(/^o/, '');
-					        } else {
-					                // Pop the stack if we're going back up to the first level
-					                if (prevul) {
-					                        ul = prevul;
-					                        prevul = null;
-					                }
-					                // Not element or middot paragraph
-					                if (np.nodeType != 1 || np.innerHTML.indexOf(search) != 0)
-					                        break;
-					        }
-					} else {
-					        // Not element or middot paragraph
-					        if (np.nodeType != 1 || np.innerHTML.indexOf(search) != 0)
-					                break;
-				        }
-
-					var cp = np.nextSibling;
-					var li = document.createElement("li");
-					li.innerHTML = np.innerHTML.replace(new RegExp('' + mdot + '|' + bull + '|--list--|&nbsp;', "gi"), '');
-					np.parentNode.removeChild(np);
-					ul.appendChild(li);
-					np = cp;
-				}
-
-				p.parentNode.replaceChild(ul, p);
-
-				return true;
-			}
-		}
-
-		return false;
-	},
-
-	_clipboardHTML : function() {
-		var div = document.getElementById('_TinyMCE_clipboardHTML');
-
-		if (!div) {
-			var div = document.createElement('DIV');
-			div.id = '_TinyMCE_clipboardHTML';
-
-			with (div.style) {
-				visibility = 'hidden';
-				overflow = 'hidden';
-				position = 'absolute';
-				width = 1;
-				height = 1;
-			}
-
-			document.body.appendChild(div);
-		}
-
-		div.innerHTML = '';
-		var rng = document.body.createTextRange();
-		rng.moveToElementText(div);
-		rng.execCommand('Paste');
-		var html = div.innerHTML;
-		div.innerHTML = '';
-		return html;
-	}
-};
-
-tinyMCE.addPlugin("paste", TinyMCE_PastePlugin);
+(function(){var Event=tinymce.dom.Event;tinymce.create('tinymce.plugins.PastePlugin',{init:function(ed,url){var t=this;t.editor=ed;ed.addCommand('mcePasteText',function(ui,v){if(ui){if((ed.getParam('paste_use_dialog',true))||(!tinymce.isIE)){ed.windowManager.open({file:url+'/pastetext.htm',width:450,height:400,inline:1},{plugin_url:url});}else t._insertText(clipboardData.getData("Text"),true);}else t._insertText(v.html,v.linebreaks);});ed.addCommand('mcePasteWord',function(ui,v){if(ui){if((ed.getParam('paste_use_dialog',true))||(!tinymce.isIE)){ed.windowManager.open({file:url+'/pasteword.htm',width:450,height:400,inline:1},{plugin_url:url});}else t._insertText(t._clipboardHTML());}else t._insertWordContent(v);});ed.addCommand('mceSelectAll',function(){ed.execCommand('selectall');});ed.addButton('pastetext',{title:'paste.paste_text_desc',cmd:'mcePasteText',ui:true});ed.addButton('pasteword',{title:'paste.paste_word_desc',cmd:'mcePasteWord',ui:true});ed.addButton('selectall',{title:'paste.selectall_desc',cmd:'mceSelectAll'});if(ed.getParam("paste_auto_cleanup_on_paste",false)){ed.onPaste.add(function(ed,e){return t._handlePasteEvent(e)});}if(!tinymce.isIE&&ed.getParam("paste_auto_cleanup_on_paste",false)){ed.onKeyDown.add(function(ed,e){if(e.ctrlKey&&e.keyCode==86){window.setTimeout(function(){ed.execCommand("mcePasteText",true);},1);Event.cancel(e);}});}},getInfo:function(){return{longname:'Paste text/word',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_handlePasteEvent:function(e){var html=this._clipboardHTML(),ed=this.editor,sel=ed.selection,r;if(ed&&(r=sel.getRng())&&r.text.length>0)ed.execCommand('delete');if(html&&html.length>0)ed.execCommand('mcePasteWord',false,html);return Event.cancel(e);},_insertText:function(content,bLinebreaks){if(content&&content.length>0){if(bLinebreaks){if(this.editor.getParam("paste_create_paragraphs",true)){var rl=this.editor.getParam("paste_replace_list",'\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');for(var i=0;i<rl.length;i+=2)content=content.replace(new RegExp(rl[i],'gi'),rl[i+1]);content=content.replace(/\r\n\r\n/g,'</p><p>');content=content.replace(/\r\r/g,'</p><p>');content=content.replace(/\n\n/g,'</p><p>');if((pos=content.indexOf('</p><p>'))!=-1){this.editor.execCommand("Delete");var node=this.editor.selection.getNode();var breakElms=[];do{if(node.nodeType==1){if(node.nodeName=="TD"||node.nodeName=="BODY")break;breakElms[breakElms.length]=node;}}while(node=node.parentNode);var before="",after="</p>";before+=content.substring(0,pos);for(var i=0;i<breakElms.length;i++){before+="</"+breakElms[i].nodeName+">";after+="<"+breakElms[(breakElms.length-1)-i].nodeName+">";}before+="<p>";content=before+content.substring(pos+7)+after;}}if(this.editor.getParam("paste_create_linebreaks",true)){content=content.replace(/\r\n/g,'<br />');content=content.replace(/\r/g,'<br />');content=content.replace(/\n/g,'<br />');}}this.editor.execCommand("mceInsertRawHTML",false,content);}},_insertWordContent:function(content){var t=this,ed=t.editor;if(content&&content.length>0){var bull=String.fromCharCode(8226);var middot=String.fromCharCode(183);if(ed.getParam('paste_insert_word_content_callback'))content=ed.execCallback('paste_insert_word_content_callback','before',content);var rl=ed.getParam("paste_replace_list",'\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');for(var i=0;i<rl.length;i+=2)content=content.replace(new RegExp(rl[i],'gi'),rl[i+1]);if(this.editor.getParam("paste_convert_headers_to_strong",false)){content=content.replace(new RegExp('<p class=MsoHeading.*?>(.*?)<\/p>','gi'),'<p><b>$1</b></p>');}content=content.replace(new RegExp('tab-stops: list [0-9]+.0pt">','gi'),'">'+"--list--");content=content.replace(new RegExp(bull+"(.*?)<BR>","gi"),"<p>"+middot+"$1</p>");content=content.replace(new RegExp('<SPAN style="mso-list: Ignore">','gi'),"<span>"+bull);content=content.replace(/<o:p><\/o:p>/gi,"");content=content.replace(new RegExp('<br style="page-break-before: always;.*>','gi'),'-- page break --');content=content.replace(new RegExp('<(!--)([^>]*)(--)>','g'),"");if(this.editor.getParam("paste_remove_spans",true))content=content.replace(/<\/?span[^>]*>/gi,"");if(this.editor.getParam("paste_remove_styles",true))content=content.replace(new RegExp('<(\\w[^>]*) style="([^"]*)"([^>]*)','gi'),"<$1$3");content=content.replace(/<\/?font[^>]*>/gi,"");switch(this.editor.getParam("paste_strip_class_attributes","all")){case"all":content=content.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi,"<$1$3");break;case"mso":content=content.replace(new RegExp('<(\\w[^>]*) class="?mso([^ |>]*)([^>]*)','gi'),"<$1$3");break;}content=content.replace(new RegExp('href="?'+this._reEscape(""+document.location)+'','gi'),'href="'+this.editor.documentBaseURI.getURI());content=content.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi,"<$1$3");content=content.replace(/<\\?\?xml[^>]*>/gi,"");content=content.replace(/<\/?\w+:[^>]*>/gi,"");content=content.replace(/-- page break --\s*<p>&nbsp;<\/p>/gi,"");content=content.replace(/-- page break --/gi,"");if(!this.editor.getParam('force_p_newlines')){content=content.replace('','','gi');content=content.replace('</p>','<br /><br />','gi');}if(!tinymce.isIE&&!this.editor.getParam('force_p_newlines')){content=content.replace(/<\/?p[^>]*>/gi,"");}content=content.replace(/<\/?div[^>]*>/gi,"");if(this.editor.getParam("paste_convert_middot_lists",true)){var div=ed.dom.create("div",null,content);var className=this.editor.getParam("paste_unindented_list_class","unIndentedList");while(this._convertMiddots(div,"--list--"));while(this._convertMiddots(div,middot,className));while(this._convertMiddots(div,bull));content=div.innerHTML;}if(this.editor.getParam("paste_convert_headers_to_strong",false)){content=content.replace(/<h[1-6]>&nbsp;<\/h[1-6]>/gi,'<p>&nbsp;&nbsp;</p>');content=content.replace(/<h[1-6]>/gi,'<p><b>');content=content.replace(/<\/h[1-6]>/gi,'</b></p>');content=content.replace(/<b>&nbsp;<\/b>/gi,'<b>&nbsp;&nbsp;</b>');content=content.replace(/^(&nbsp;)*/gi,'');}content=content.replace(/--list--/gi,"");if(ed.getParam('paste_insert_word_content_callback'))content=ed.execCallback('paste_insert_word_content_callback','after',content);this.editor.execCommand("mceInsertContent",false,content);if(this.editor.getParam('paste_force_cleanup_wordpaste',true)){var ed=this.editor;window.setTimeout(function(){ed.execCommand("mceCleanup");},1);}}},_reEscape:function(s){var l="?.\\*[](){}+^$:";var o="";for(var i=0;i<s.length;i++){var c=s.charAt(i);if(l.indexOf(c)!=-1)o+='\\'+c;else o+=c;}return o;},_convertMiddots:function(div,search,class_name){var ed=this.editor,mdot=String.fromCharCode(183),bull=String.fromCharCode(8226);var nodes,prevul,i,p,ul,li,np,cp,li;nodes=div.getElementsByTagName("p");for(i=0;i<nodes.length;i++){p=nodes[i];if(p.innerHTML.indexOf(search)==0){ul=ed.dom.create("ul");if(class_name)ul.className=class_name;li=ed.dom.create("li");li.innerHTML=p.innerHTML.replace(new RegExp(''+mdot+'|'+bull+'|--list--|&nbsp;',"gi"),'');ul.appendChild(li);np=p.nextSibling;while(np){if(np.nodeType==3&&new RegExp('^\\s$','m').test(np.nodeValue)){np=np.nextSibling;continue;}if(search==mdot){if(np.nodeType==1&&new RegExp('^o(\\s+|&nbsp;)').test(np.innerHTML)){if(!prevul){prevul=ul;ul=ed.dom.create("ul");prevul.appendChild(ul);}np.innerHTML=np.innerHTML.replace(/^o/,'');}else{if(prevul){ul=prevul;prevul=null;}if(np.nodeType!=1||np.innerHTML.indexOf(search)!=0)break;}}else{if(np.nodeType!=1||np.innerHTML.indexOf(search)!=0)break;}cp=np.nextSibling;li=ed.dom.create("li");li.innerHTML=np.innerHTML.replace(new RegExp(''+mdot+'|'+bull+'|--list--|&nbsp;',"gi"),'');np.parentNode.removeChild(np);ul.appendChild(li);np=cp;}p.parentNode.replaceChild(ul,p);return true;}}return false;},_clipboardHTML:function(){var div=document.getElementById('_TinyMCE_clipboardHTML');if(!div){var div=document.createElement('DIV');div.id='_TinyMCE_clipboardHTML';with(div.style){visibility='hidden';overflow='hidden';position='absolute';width=1;height=1;}document.body.appendChild(div);}div.innerHTML='';var rng=document.body.createTextRange();rng.moveToElementText(div);rng.execCommand('Paste');var html=div.innerHTML;div.innerHTML='';return html;}});tinymce.PluginManager.add('paste',tinymce.plugins.PastePlugin);})();
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/paste/images/pastetext.gif 2.5.src/wp-includes/js/tinymce/plugins/paste/images/pastetext.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/paste/images/pastetext.gif	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/paste/images/pastetext.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,6 +0,0 @@
-GIF89a   r.6FRffz{ԆG3'V֒Yi뤒kfVFS܂ygS斡f   !   ,       'diheEl:MsdVWG
-dNNG9Th$;1
-	XlJ 1 `T$i  
- {nN $
-
-#E
- w%(1$! ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/paste/images/pasteword.gif 2.5.src/wp-includes/js/tinymce/plugins/paste/images/pasteword.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/paste/images/pasteword.gif	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/paste/images/pasteword.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89a   	6}b2	?ʾޤXrMV{Ί{]9]J:*ғm^Jtۧb,n
-Jk:f"p   !   ,       'dihAp͕('x(g;5X"'CP(24)؄6A,
I,$&4C2NBX{$x",ru{"}	
mF  #
  $h %ji)1$! ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/paste/images/selectall.gif 2.5.src/wp-includes/js/tinymce/plugins/paste/images/selectall.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/paste/images/selectall.gif	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/paste/images/selectall.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89a   <;<FrqoqvVTV^ۻ   !   ,       zI80G~9,G5%;Tmy8⍃(
-#p0@K b%C-CU%a(NZDpE0nd5
44lc1vwyOlb ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/paste/js/pastetext.js 2.5.src/wp-includes/js/tinymce/plugins/paste/js/pastetext.js
--- 2.2.2.src/wp-includes/js/tinymce/plugins/paste/js/pastetext.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/paste/js/pastetext.js	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,42 @@
+tinyMCEPopup.requireLangPack();
+
+function saveContent() {
+	if (document.forms[0].htmlSource.value == '') {
+		tinyMCEPopup.close();
+		return false;
+	}
+
+	tinyMCEPopup.execCommand('mcePasteText', false, {
+		html : document.forms[0].htmlSource.value,
+		linebreaks : document.forms[0].linebreaks.checked
+	});
+
+	tinyMCEPopup.close();
+}
+
+function onLoadInit() {
+	tinyMCEPopup.resizeToInnerSize();
+
+	// Remove Gecko spellchecking
+	if (tinymce.isGecko)
+		document.body.spellcheck = tinyMCEPopup.getParam("gecko_spellcheck");
+
+	resizeInputs();
+}
+
+var wHeight=0, wWidth=0, owHeight=0, owWidth=0;
+
+function resizeInputs() {
+	if (!tinymce.isIE) {
+		wHeight = self.innerHeight-80;
+		wWidth = self.innerWidth-17;
+	} else {
+		wHeight = document.body.clientHeight-80;
+		wWidth = document.body.clientWidth-17;
+	}
+
+	document.forms[0].htmlSource.style.height = Math.abs(wHeight) + 'px';
+	document.forms[0].htmlSource.style.width  = Math.abs(wWidth) + 'px';
+}
+
+tinyMCEPopup.onInit.add(onLoadInit);
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/paste/js/pasteword.js 2.5.src/wp-includes/js/tinymce/plugins/paste/js/pasteword.js
--- 2.2.2.src/wp-includes/js/tinymce/plugins/paste/js/pasteword.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/paste/js/pasteword.js	2008-02-26 23:36:42.000000000 -0600
@@ -0,0 +1,56 @@
+tinyMCEPopup.requireLangPack();
+
+function saveContent() {
+	var html = document.getElementById("frmData").contentWindow.document.body.innerHTML;
+
+	if (html == ''){
+		tinyMCEPopup.close();
+		return false;
+	}
+
+	tinyMCEPopup.execCommand('mcePasteWord', false, html);
+	tinyMCEPopup.close();
+}
+
+function onLoadInit() {
+	tinyMCEPopup.resizeToInnerSize();
+
+	// Fix for endless reloading in FF
+	window.setTimeout(createIFrame, 10);
+}
+
+function createIFrame() {
+	document.getElementById('iframecontainer').innerHTML = '<iframe id="frmData" name="frmData" class="sourceIframe" src="blank.htm" height="280" width="400" frameborder="0" style="background-color:#FFFFFF; width:100%;" dir="ltr" wrap="soft"></iframe>';
+}
+
+var wHeight=0, wWidth=0, owHeight=0, owWidth=0;
+
+function initIframe(doc) {
+	var dir = tinyMCEPopup.editor.settings.directionality;
+
+	doc.body.dir = dir;
+
+	// Remove Gecko spellchecking
+	if (tinymce.isGecko)
+		doc.body.spellcheck = tinyMCEPopup.getParam("gecko_spellcheck");
+
+	resizeInputs();
+}
+
+function resizeInputs() {
+	if (!tinymce.isIE) {
+		wHeight = self.innerHeight - 80;
+		wWidth = self.innerWidth - 18;
+	} else {
+		wHeight = document.body.clientHeight - 80;
+		wWidth = document.body.clientWidth - 18;
+	}
+
+	var elm = document.getElementById('frmData');
+	if (elm) {
+		elm.style.height = Math.abs(wHeight) + 'px';
+		elm.style.width  = Math.abs(wWidth) + 'px';
+	}
+}
+
+tinyMCEPopup.onInit.add(onLoadInit);
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/paste/jscripts/pastetext.js 2.5.src/wp-includes/js/tinymce/plugins/paste/jscripts/pastetext.js
--- 2.2.2.src/wp-includes/js/tinymce/plugins/paste/jscripts/pastetext.js	2007-01-16 11:52:13.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/paste/jscripts/pastetext.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,38 +0,0 @@
-function saveContent() {
-	if (document.forms[0].htmlSource.value == '') {
-		tinyMCEPopup.close();
-		return false;
-	}
-
-	tinyMCEPopup.execCommand('mcePasteText', false, {
-		html : document.forms[0].htmlSource.value,
-		linebreaks : document.forms[0].linebreaks.checked
-	});
-
-	tinyMCEPopup.close();
-}
-
-function onLoadInit() {
-	tinyMCEPopup.resizeToInnerSize();
-
-	// Remove Gecko spellchecking
-	if (tinyMCE.isGecko)
-		document.body.spellcheck = tinyMCE.getParam("gecko_spellcheck");
-
-	resizeInputs();
-}
-
-var wHeight=0, wWidth=0, owHeight=0, owWidth=0;
-
-function resizeInputs() {
-	if (!tinyMCE.isMSIE) {
-		wHeight = self.innerHeight-80;
-		wWidth = self.innerWidth-17;
-	} else {
-		wHeight = document.body.clientHeight-80;
-		wWidth = document.body.clientWidth-17;
-	}
-
-	document.forms[0].htmlSource.style.height = Math.abs(wHeight) + 'px';
-	document.forms[0].htmlSource.style.width  = Math.abs(wWidth) + 'px';
-}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/paste/jscripts/pasteword.js 2.5.src/wp-includes/js/tinymce/plugins/paste/jscripts/pasteword.js
--- 2.2.2.src/wp-includes/js/tinymce/plugins/paste/jscripts/pasteword.js	2007-01-16 11:52:13.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/paste/jscripts/pasteword.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,52 +0,0 @@
-function saveContent() {
-	var html = document.getElementById("frmData").contentWindow.document.body.innerHTML;
-
-	if (html == ''){
-		tinyMCEPopup.close();
-		return false;
-	}
-
-	tinyMCEPopup.execCommand('mcePasteWord', false, html);
-	tinyMCEPopup.close();
-}
-
-function onLoadInit() {
-	tinyMCEPopup.resizeToInnerSize();
-
-	// Fix for endless reloading in FF
-	window.setTimeout('createIFrame();', 10);
-}
-
-function createIFrame() {
-	document.getElementById('iframecontainer').innerHTML = '<iframe id="frmData" name="frmData" class="sourceIframe" src="blank.htm" height="280" width="400" frameborder="0" style="background-color:#FFFFFF; width:100%;" dir="ltr" wrap="soft"></iframe>';
-}
-
-var wHeight=0, wWidth=0, owHeight=0, owWidth=0;
-
-function initIframe(doc) {
-	var dir = tinyMCE.selectedInstance.settings['directionality'];
-
-	doc.body.dir = dir;
-
-	// Remove Gecko spellchecking
-	if (tinyMCE.isGecko)
-		doc.body.spellcheck = tinyMCE.getParam("gecko_spellcheck");
-
-	resizeInputs();
-}
-
-function resizeInputs() {
-	if (!tinyMCE.isMSIE) {
-		wHeight = self.innerHeight - 80;
-		wWidth = self.innerWidth - 18;
-	} else {
-		wHeight = document.body.clientHeight - 80;
-		wWidth = document.body.clientWidth - 18;
-	}
-
-	var elm = document.getElementById('frmData');
-	if (elm) {
-		elm.style.height = Math.abs(wHeight) + 'px';
-		elm.style.width  = Math.abs(wWidth) + 'px';
-	}
-}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/paste/langs/en.js 2.5.src/wp-includes/js/tinymce/plugins/paste/langs/en.js
--- 2.2.2.src/wp-includes/js/tinymce/plugins/paste/langs/en.js	2007-01-16 11:52:13.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/paste/langs/en.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,10 +0,0 @@
-// UK lang variables
-
-tinyMCE.addToLang('',{
-paste_text_desc : 'Paste as Plain Text',
-paste_text_title : 'Use CTRL+V on your keyboard to paste the text into the window.',
-paste_text_linebreaks : 'Keep linebreaks',
-paste_word_desc : 'Paste from Word',
-paste_word_title : 'Use CTRL+V on your keyboard to paste the text into the window.',
-selectall_desc : 'Select All'
-});
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/paste/pastetext.htm 2.5.src/wp-includes/js/tinymce/plugins/paste/pastetext.htm
--- 2.2.2.src/wp-includes/js/tinymce/plugins/paste/pastetext.htm	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/paste/pastetext.htm	2008-03-12 17:47:11.000000000 -0500
@@ -1,34 +1,34 @@
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-	<title>{$lang_paste_text_desc}</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
-	<script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
-	<script language="javascript" type="text/javascript" src="jscripts/pastetext.js"></script>
-	<base target="_self" />
-</head>
-<body onload="tinyMCEPopup.executeOnLoad('onLoadInit();');" onresize="resizeInputs();" style="display: none">
-<form name="source" onsubmit="saveContent();">
-	<div style="float: left" class="title">{$lang_paste_text_desc}</div>
-
-	<div style="float: right">
-		<input type="checkbox" name="linebreaks" id="linebreaks" class="wordWrapCode" checked="checked" /><label for="linebreaks">{$lang_paste_text_linebreaks}</label>
-	</div>
-
-	<br style="clear: both" />
-
-	<div>{$lang_paste_text_title}</div>
-
-	<textarea name="htmlSource" id="htmlSource" rows="15" cols="100" style="width: 100%; height: 100%; font-family: 'Courier New',Courier,mono; font-size: 12px;" dir="ltr" wrap="soft"></textarea>
-
-	<div class="mceActionPanel">
-		<div style="float: left">
-			<input type="button" name="insert" value="{$lang_insert}" onclick="saveContent();" id="insert" />
-		</div>
-
-		<div style="float: right">
-			<input type="button" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" id="cancel" />
-		</div>
-	</div>
-</form>
-</body> 
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#paste.paste_text_desc}</title>
+	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="js/pastetext.js"></script>
+	<base target="_self" />
+</head>
+<body onresize="resizeInputs();" style="display:none; overflow:hidden;">
+<form name="source" onsubmit="saveContent();return false;" action="#">
+	<div style="float: left" class="title">{#paste.paste_text_desc}</div>
+
+	<div style="float: right">
+		<input type="checkbox" name="linebreaks" id="linebreaks" class="wordWrapCode" checked="checked" /><label for="linebreaks">{#paste_dlg.text_linebreaks}</label>
+	</div>
+
+	<br style="clear: both" />
+
+	<div>{#paste_dlg.text_title}</div>
+
+	<textarea name="htmlSource" id="htmlSource" rows="15" cols="100" style="width: 100%; height: 100%; font-family: 'Courier New',Courier,mono; font-size: 12px;" dir="ltr" wrap="soft" class="mceFocus"></textarea>
+
+	<div class="mceActionPanel">
+		<div style="float: left">
+			<input type="button" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" id="cancel" />
+		</div>
+
+		<div style="float: right">
+			<input type="submit" name="insert" value="{#insert}" id="insert" />
+		</div>
+	</div>
+</form>
+</body> 
 </html>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/paste/pasteword.htm 2.5.src/wp-includes/js/tinymce/plugins/paste/pasteword.htm
--- 2.2.2.src/wp-includes/js/tinymce/plugins/paste/pasteword.htm	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/paste/pasteword.htm	2008-03-12 17:47:11.000000000 -0500
@@ -1,29 +1,29 @@
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
-	<title>{$lang_paste_word_desc}</title>
-	<script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
-	<script language="javascript" type="text/javascript" src="jscripts/pasteword.js"></script>
-	<link href="css/pasteword.css" rel="stylesheet" type="text/css" />
-	<base target="_self" />
-</head>
-<body onload="tinyMCEPopup.executeOnLoad('onLoadInit();');" onresize="resizeInputs();" style="display: none">
-	<form name="source" onsubmit="saveContent();" action="#">
-		<div class="title">{$lang_paste_word_desc}</div>
-
-		<div>{$lang_paste_word_title}</div>
-
-		<div id="iframecontainer"></div>
-
-		<div class="mceActionPanel">
-			<div style="float: left">
-				<input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="saveContent();" />
-			</div>
-
-			<div style="float: right">
-				<input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />
-			</div>
-		</div>
-	</form>
-</body>
-</html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+	<title>{#paste.paste_word_desc}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="js/pasteword.js"></script>
+	<link href="css/pasteword.css" rel="stylesheet" type="text/css" />
+	<base target="_self" />
+</head>
+<body onresize="resizeInputs();" style="display:none; overflow:hidden;">
+	<form name="source" onsubmit="saveContent();" action="#">
+		<div class="title">{#paste.paste_word_desc}</div>
+
+		<div>{#paste_dlg.word_title}</div>
+
+		<div id="iframecontainer"></div>
+
+		<div class="mceActionPanel">
+			<div style="float: left">
+				<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
+			</div>
+
+			<div style="float: right">
+				<input type="button" id="insert" name="insert" value="{#insert}" onclick="saveContent();" />
+			</div>
+		</div>
+	</form>
+</body>
+</html>
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/safari/blank.htm 2.5.src/wp-includes/js/tinymce/plugins/safari/blank.htm
--- 2.2.2.src/wp-includes/js/tinymce/plugins/safari/blank.htm	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/safari/blank.htm	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1 @@
+<!-- WebKit -->
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/safari/editor_plugin.js 2.5.src/wp-includes/js/tinymce/plugins/safari/editor_plugin.js
--- 2.2.2.src/wp-includes/js/tinymce/plugins/safari/editor_plugin.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/safari/editor_plugin.js	2008-03-25 22:22:53.000000000 -0500
@@ -0,0 +1 @@
+(function(){var Event=tinymce.dom.Event,grep=tinymce.grep,each=tinymce.each,inArray=tinymce.inArray,isOldWebKit=tinymce.isOldWebKit;tinymce.create('tinymce.plugins.Safari',{init:function(ed){var t=this,dom;if(!tinymce.isWebKit)return;t.editor=ed;t.webKitFontSizes=['x-small','small','medium','large','x-large','xx-large','-webkit-xxx-large'];t.namedFontSizes=['xx-small','x-small','small','medium','large','x-large','xx-large'];ed.onPaste.add(function(ed,e){function removeStyles(e){e=e.target;if(e.nodeType==1){e.style.cssText='';each(ed.dom.select('*',e),function(e){e.style.cssText='';});}};Event.add(ed.getDoc(),'DOMNodeInserted',removeStyles);window.setTimeout(function(){Event.remove(ed.getDoc(),'DOMNodeInserted',removeStyles);},0);});ed.onKeyUp.add(function(ed,e){var h,b;if(e.keyCode==46||e.keyCode==8){b=ed.getBody();h=b.innerHTML;if(b.childNodes.length==1&&!/<(img|hr)/.test(h)&&tinymce.trim(h.replace(/<[^>]+>/g,'')).length==0)ed.setContent('',{format:'raw'});}});ed.addCommand('FormatBlock',function(u,v){var dom=ed.dom,e=dom.getParent(ed.selection.getNode(),dom.isBlock);if(e)dom.replace(dom.create(v),e,1);else ed.getDoc().execCommand("FormatBlock",false,v);});ed.addCommand('mceInsertContent',function(u,v){ed.getDoc().execCommand("InsertText",false,'mce_marker');ed.getBody().innerHTML=ed.getBody().innerHTML.replace(/mce_marker/g,v+'<span id="_mce_tmp">XX</span>');ed.selection.select(ed.dom.get('_mce_tmp'));ed.getDoc().execCommand("Delete",false,' ');});ed.onKeyPress.add(function(ed,e){if(e.keyCode==13&&(e.shiftKey||ed.settings.force_br_newlines&&ed.selection.getNode().nodeName!='LI')){t._insertBR(ed);Event.cancel(e);}});ed.addQueryValueHandler('FontSize',function(u,v){var e,v;if((e=ed.dom.getParent(ed.selection.getStart(),'span'))&&(v=e.style.fontSize))return tinymce.inArray(t.namedFontSizes,v)+1;if((e=ed.dom.getParent(ed.selection.getEnd(),'span'))&&(v=e.style.fontSize))return tinymce.inArray(t.namedFontSizes,v)+1;return ed.getDoc().queryCommandValue('FontSize');});ed.addQueryValueHandler('FontName',function(u,v){var e,v;if((e=ed.dom.getParent(ed.selection.getStart(),'span'))&&(v=e.style.fontFamily))return v.replace(/, /g,',');if((e=ed.dom.getParent(ed.selection.getEnd(),'span'))&&(v=e.style.fontFamily))return v.replace(/, /g,',');return ed.getDoc().queryCommandValue('FontName');});ed.onClick.add(function(ed,e){e=e.target;if(e.nodeName=='IMG'){t.selElm=e;ed.selection.select(e);}else t.selElm=null;});ed.onInit.add(function(){t._fixWebKitSpans();if(isOldWebKit)t._patchSafari2x(ed);});ed.onSetContent.add(function(){dom=ed.dom;each(['strong','b','em','u','strike','sub','sup','a'],function(v){each(grep(dom.select(v)).reverse(),function(n){var nn=n.nodeName.toLowerCase(),st;if(nn=='a'){if(n.name)dom.replace(dom.create('img',{mce_name:'a',name:n.name,'class':'mceItemAnchor'}),n);return;}switch(nn){case'b':case'strong':if(nn=='b')nn='strong';st='font-weight: bold;';break;case'em':st='font-style: italic;';break;case'u':st='text-decoration: underline;';break;case'sub':st='vertical-align: sub;';break;case'sup':st='vertical-align: super;';break;case'strike':st='text-decoration: line-through;';break;}dom.replace(dom.create('span',{mce_name:nn,style:st,'class':'Apple-style-span'}),n,1);});});});ed.onPreProcess.add(function(ed,o){dom=ed.dom;each(grep(o.node.getElementsByTagName('span')).reverse(),function(n){var v,bg;if(o.get){if(dom.hasClass(n,'Apple-style-span')){bg=n.style.backgroundColor;switch(dom.getAttrib(n,'mce_name')){case'font':if(!ed.settings.convert_fonts_to_spans)dom.setAttrib(n,'style','');break;case'strong':case'em':case'sub':case'sup':dom.setAttrib(n,'style','');break;case'strike':case'u':if(!ed.settings.inline_styles)dom.setAttrib(n,'style','');else dom.setAttrib(n,'mce_name','');break;default:if(!ed.settings.inline_styles)dom.setAttrib(n,'style','');}if(bg)n.style.backgroundColor=bg;}}if(dom.hasClass(n,'mceItemRemoved'))dom.remove(n,1);});});ed.onPostProcess.add(function(ed,o){o.content=o.content.replace(/<br \/><\/(h[1-6]|div|p|address|pre)>/g,'</$1>');o.content=o.content.replace(/ id=\"undefined\"/g,'');});},getInfo:function(){return{longname:'Safari compatibility',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/safari',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_fixWebKitSpans:function(){var t=this,ed=t.editor;if(!isOldWebKit){Event.add(ed.getDoc(),'DOMNodeInserted',function(e){e=e.target;if(e&&e.nodeType==1)t._fixAppleSpan(e);});}else{ed.onExecCommand.add(function(){each(ed.dom.select('span'),function(n){t._fixAppleSpan(n);});ed.nodeChanged();});}},_fixAppleSpan:function(e){var ed=this.editor,dom=ed.dom,fz=this.webKitFontSizes,fzn=this.namedFontSizes,s=ed.settings,st,p;if(dom.getAttrib(e,'mce_fixed'))return;if(e.nodeName=='SPAN'&&e.className=='Apple-style-span'){st=e.style;if(!s.convert_fonts_to_spans){if(st.fontSize){dom.setAttrib(e,'mce_name','font');dom.setAttrib(e,'size',inArray(fz,st.fontSize)+1);}if(st.fontFamily){dom.setAttrib(e,'mce_name','font');dom.setAttrib(e,'face',st.fontFamily);}if(st.color){dom.setAttrib(e,'mce_name','font');dom.setAttrib(e,'color',dom.toHex(st.color));}if(st.backgroundColor){dom.setAttrib(e,'mce_name','font');dom.setStyle(e,'background-color',st.backgroundColor);}}else{if(st.fontSize)dom.setStyle(e,'fontSize',fzn[inArray(fz,st.fontSize)]);}if(st.fontWeight=='bold')dom.setAttrib(e,'mce_name','strong');if(st.fontStyle=='italic')dom.setAttrib(e,'mce_name','em');if(st.textDecoration=='underline')dom.setAttrib(e,'mce_name','u');if(st.textDecoration=='line-through')dom.setAttrib(e,'mce_name','strike');if(st.verticalAlign=='super')dom.setAttrib(e,'mce_name','sup');if(st.verticalAlign=='sub')dom.setAttrib(e,'mce_name','sub');dom.setAttrib(e,'mce_fixed','1');}},_patchSafari2x:function(ed){var t=this,setContent,getNode,dom=ed.dom,lr;if(ed.windowManager.onBeforeOpen){ed.windowManager.onBeforeOpen.add(function(){r=ed.selection.getRng();});}ed.selection.select=function(n){this.getSel().setBaseAndExtent(n,0,n,1);};getNode=ed.selection.getNode;ed.selection.getNode=function(){return t.selElm||getNode.call(this);};ed.selection.getRng=function(){var t=this,s=t.getSel(),d=ed.getDoc(),r,rb,ra,di;if(s.anchorNode){r=d.createRange();try{rb=d.createRange();rb.setStart(s.anchorNode,s.anchorOffset);rb.collapse(1);ra=d.createRange();ra.setStart(s.focusNode,s.focusOffset);ra.collapse(1);di=rb.compareBoundaryPoints(rb.START_TO_END,ra)<0;r.setStart(di?s.anchorNode:s.focusNode,di?s.anchorOffset:s.focusOffset);r.setEnd(di?s.focusNode:s.anchorNode,di?s.focusOffset:s.anchorOffset);lr=r;}catch(ex){}}return r||lr;};setContent=ed.selection.setContent;ed.selection.setContent=function(h,s){var r=this.getRng(),b;try{setContent.call(this,h,s);}catch(ex){b=dom.create('body');b.innerHTML=h;each(b.childNodes,function(n){r.insertNode(n.cloneNode(true));});}};},_insertBR:function(ed){var dom=ed.dom,s=ed.selection,r=s.getRng(),br;r.insertNode(br=dom.create('br'));r.setStartAfter(br);r.setEndAfter(br);s.setRng(r);if(s.getSel().focusNode==br.previousSibling){s.select(dom.insertAfter(dom.doc.createTextNode('\u00a0'),br));s.collapse(1);}ed.getWin().scrollTo(0,dom.getPos(s.getRng().startContainer).y);}});tinymce.PluginManager.add('safari',tinymce.plugins.Safari);})();
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/classes/GoogleSpell.php 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/classes/GoogleSpell.php
--- 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/classes/GoogleSpell.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/classes/GoogleSpell.php	2008-03-03 18:07:29.000000000 -0600
@@ -0,0 +1,158 @@
+<?php
+/**
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $
+ *
+ * @author Moxiecode
+ * @copyright Copyright  2004-2007, Moxiecode Systems AB, All rights reserved.
+ */
+
+class GoogleSpell extends SpellChecker {
+	/**
+	 * Spellchecks an array of words.
+	 *
+	 * @param {String} $lang Language code like sv or en.
+	 * @param {Array} $words Array of words to spellcheck.
+	 * @return {Array} Array of misspelled words.
+	 */
+	function &checkWords($lang, $words) {
+		$wordstr = implode(' ', $words);
+		$matches = $this->_getMatches($lang, $wordstr);
+		$words = array();
+
+		for ($i=0; $i<count($matches); $i++)
+			$words[] = $this->_unhtmlentities(mb_substr($wordstr, $matches[$i][1], $matches[$i][2], "UTF-8"));
+
+		return $words;
+	}
+
+	/**
+	 * Returns suggestions of for a specific word.
+	 *
+	 * @param {String} $lang Language code like sv or en.
+	 * @param {String} $word Specific word to get suggestions for.
+	 * @return {Array} Array of suggestions for the specified word.
+	 */
+	function &getSuggestions($lang, $word) {
+		$sug = array();
+		$osug = array();
+		$matches = $this->_getMatches($lang, $word);
+
+		if (count($matches) > 0)
+			$sug = explode("\t", utf8_encode($this->_unhtmlentities($matches[0][4])));
+
+		// Remove empty
+		foreach ($sug as $item) {
+			if ($item)
+				$osug[] = $item;
+		}
+
+		return $osug;
+	}
+
+	function &_getMatches($lang, $str) {
+		$server = "www.google.com";
+		$port = 443;
+		$path = "/tbproxy/spell?lang=" . $lang . "&hl=en";
+		$host = "www.google.com";
+		$url = "https://" . $server;
+
+		// Setup XML request
+		$xml = '<?xml version="1.0" encoding="utf-8" ?><spellrequest textalreadyclipped="0" ignoredups="0" ignoredigits="1" ignoreallcaps="1"><text>' . $str . '</text></spellrequest>';
+
+		$header  = "POST ".$path." HTTP/1.0 \r\n";
+		$header .= "MIME-Version: 1.0 \r\n";
+		$header .= "Content-type: application/PTI26 \r\n";
+		$header .= "Content-length: ".strlen($xml)." \r\n";
+		$header .= "Content-transfer-encoding: text \r\n";
+		$header .= "Request-number: 1 \r\n";
+		$header .= "Document-type: Request \r\n";
+		$header .= "Interface-Version: Test 1.4 \r\n";
+		$header .= "Connection: close \r\n\r\n";
+		$header .= $xml;
+
+		// Use curl if it exists
+		if (function_exists('curl_init')) {
+			// Use curl
+			$ch = curl_init();
+			curl_setopt($ch, CURLOPT_URL,$url);
+			curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+			curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $header);
+			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
+			$xml = curl_exec($ch);
+			curl_close($ch);
+		} else {
+			// Use raw sockets
+			$fp = fsockopen("ssl://" . $server, $port, $errno, $errstr, 30);
+			if ($fp) {
+				// Send request
+				fwrite($fp, $header);
+
+				// Read response
+				$xml = "";
+				while (!feof($fp))
+					$xml .= fgets($fp, 128);
+
+				fclose($fp);
+			} else
+				echo "Could not open SSL connection to google.";
+		}
+
+		// Grab and parse content
+		$matches = array();
+		preg_match_all('/<c o="([^"]*)" l="([^"]*)" s="([^"]*)">([^<]*)<\/c>/', $xml, $matches, PREG_SET_ORDER);
+
+		return $matches;
+	}
+
+	function _unhtmlentities($string) {
+		$string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $string);
+		$string = preg_replace('~&#([0-9]+);~e', 'chr(\\1)', $string);
+
+		$trans_tbl = get_html_translation_table(HTML_ENTITIES);
+		$trans_tbl = array_flip($trans_tbl);
+
+		return strtr($string, $trans_tbl);
+	}
+}
+
+// Patch in multibyte support
+if (!function_exists('mb_substr')) {
+	function mb_substr($str, $start, $len = '', $encoding="UTF-8"){
+		$limit = strlen($str);
+
+		for ($s = 0; $start > 0;--$start) {// found the real start
+			if ($s >= $limit)
+				break;
+
+			if ($str[$s] <= "\x7F")
+				++$s;
+			else {
+				++$s; // skip length
+
+				while ($str[$s] >= "\x80" && $str[$s] <= "\xBF")
+					++$s;
+			}
+		}
+
+		if ($len == '')
+			return substr($str, $s);
+		else
+			for ($e = $s; $len > 0; --$len) {//found the real end
+				if ($e >= $limit)
+					break;
+
+				if ($str[$e] <= "\x7F")
+					++$e;
+				else {
+					++$e;//skip length
+
+					while ($str[$e] >= "\x80" && $str[$e] <= "\xBF" && $e < $limit)
+						++$e;
+				}
+			}
+
+		return substr($str, $s, $e - $s);
+	}
+}
+
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/classes/HttpClient.class.php 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/classes/HttpClient.class.php
--- 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/classes/HttpClient.class.php	2007-01-16 11:52:13.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/classes/HttpClient.class.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,339 +0,0 @@
-<?php
-
-/* Version 0.9, 6th April 2003 - Simon Willison ( http://simon.incutio.com/ )
-   Manual: http://scripts.incutio.com/httpclient/
-*/
-
-class HttpClient {
-    // Request vars
-    var $host;
-    var $port;
-    var $path;
-    var $method;
-    var $postdata = '';
-    var $cookies = array();
-    var $referer;
-    var $accept = 'text/xml,application/xml,application/xhtml+xml,text/html,text/plain,image/png,image/jpeg,image/gif,*/*';
-    var $accept_encoding = 'gzip';
-    var $accept_language = 'en-us';
-    var $user_agent = 'Incutio HttpClient v0.9';
-    // Options
-    var $timeout = 20;
-    var $use_gzip = true;
-    var $persist_cookies = true;  // If true, received cookies are placed in the $this->cookies array ready for the next request
-                                  // Note: This currently ignores the cookie path (and time) completely. Time is not important, 
-                                  //       but path could possibly lead to security problems.
-    var $persist_referers = true; // For each request, sends path of last request as referer
-    var $debug = false;
-    var $handle_redirects = true; // Auaomtically redirect if Location or URI header is found
-    var $max_redirects = 5;
-    var $headers_only = false;    // If true, stops receiving once headers have been read.
-    // Basic authorization variables
-    var $username;
-    var $password;
-    // Response vars
-    var $status;
-    var $headers = array();
-    var $content = '';
-    var $errormsg;
-    // Tracker variables
-    var $redirect_count = 0;
-    var $cookie_host = '';
-    function HttpClient($host, $port=80) {
-        $this->host = $host;
-        $this->port = $port;
-    }
-    function get($path, $data = false) {
-        $this->path = $path;
-        $this->method = 'GET';
-        if ($data) {
-            $this->path .= '?'.$this->buildQueryString($data);
-        }
-        return $this->doRequest();
-    }
-    function post($path, $data) {
-        $this->path = $path;
-        $this->method = 'POST';
-        $this->postdata = $this->buildQueryString($data);
-    	return $this->doRequest();
-    }
-    function buildQueryString($data) {
-        $querystring = '';
-        if (is_array($data)) {
-            // Change data in to postable data
-    		foreach ($data as $key => $val) {
-    			if (is_array($val)) {
-    				foreach ($val as $val2) {
-    					$querystring .= urlencode($key).'='.urlencode($val2).'&';
-    				}
-    			} else {
-    				$querystring .= urlencode($key).'='.urlencode($val).'&';
-    			}
-    		}
-    		$querystring = substr($querystring, 0, -1); // Eliminate unnecessary &
-    	} else {
-    	    $querystring = $data;
-    	}
-    	return $querystring;
-    }
-    function doRequest() {
-        // Performs the actual HTTP request, returning true or false depending on outcome
-		if (!$fp = @fsockopen($this->host, $this->port, $errno, $errstr, $this->timeout)) {
-		    // Set error message
-            switch($errno) {
-				case -3:
-					$this->errormsg = 'Socket creation failed (-3)';
-				case -4:
-					$this->errormsg = 'DNS lookup failure (-4)';
-				case -5:
-					$this->errormsg = 'Connection refused or timed out (-5)';
-				default:
-					$this->errormsg = 'Connection failed ('.$errno.')';
-			    $this->errormsg .= ' '.$errstr;
-			    $this->debug($this->errormsg);
-			}
-			return false;
-        }
-        socket_set_timeout($fp, $this->timeout);
-        $request = $this->buildRequest();
-        $this->debug('Request', $request);
-        fwrite($fp, $request);
-    	// Reset all the variables that should not persist between requests
-    	$this->headers = array();
-    	$this->content = '';
-    	$this->errormsg = '';
-    	// Set a couple of flags
-    	$inHeaders = true;
-    	$atStart = true;
-    	// Now start reading back the response
-    	while (!feof($fp)) {
-    	    $line = fgets($fp, 4096);
-    	    if ($atStart) {
-    	        // Deal with first line of returned data
-    	        $atStart = false;
-    	        if (!preg_match('/HTTP\/(\\d\\.\\d)\\s*(\\d+)\\s*(.*)/', $line, $m)) {
-    	            $this->errormsg = "Status code line invalid: ".htmlentities($line);
-    	            $this->debug($this->errormsg);
-    	            return false;
-    	        }
-    	        $http_version = $m[1]; // not used
-    	        $this->status = $m[2];
-    	        $status_string = $m[3]; // not used
-    	        $this->debug(trim($line));
-    	        continue;
-    	    }
-    	    if ($inHeaders) {
-    	        if (trim($line) == '') {
-    	            $inHeaders = false;
-    	            $this->debug('Received Headers', $this->headers);
-    	            if ($this->headers_only) {
-    	                break; // Skip the rest of the input
-    	            }
-    	            continue;
-    	        }
-    	        if (!preg_match('/([^:]+):\\s*(.*)/', $line, $m)) {
-    	            // Skip to the next header
-    	            continue;
-    	        }
-    	        $key = strtolower(trim($m[1]));
-    	        $val = trim($m[2]);
-    	        // Deal with the possibility of multiple headers of same name
-    	        if (isset($this->headers[$key])) {
-    	            if (is_array($this->headers[$key])) {
-    	                $this->headers[$key][] = $val;
-    	            } else {
-    	                $this->headers[$key] = array($this->headers[$key], $val);
-    	            }
-    	        } else {
-    	            $this->headers[$key] = $val;
-    	        }
-    	        continue;
-    	    }
-    	    // We're not in the headers, so append the line to the contents
-    	    $this->content .= $line;
-        }
-        fclose($fp);
-        // If data is compressed, uncompress it
-        if (isset($this->headers['content-encoding']) && $this->headers['content-encoding'] == 'gzip') {
-            $this->debug('Content is gzip encoded, unzipping it');
-            $this->content = substr($this->content, 10); // See http://www.php.net/manual/en/function.gzencode.php
-            $this->content = gzinflate($this->content);
-        }
-        // If $persist_cookies, deal with any cookies
-        if ($this->persist_cookies && isset($this->headers['set-cookie']) && $this->host == $this->cookie_host) {
-            $cookies = $this->headers['set-cookie'];
-            if (!is_array($cookies)) {
-                $cookies = array($cookies);
-            }
-            foreach ($cookies as $cookie) {
-                if (preg_match('/([^=]+)=([^;]+);/', $cookie, $m)) {
-                    $this->cookies[$m[1]] = $m[2];
-                }
-            }
-            // Record domain of cookies for security reasons
-            $this->cookie_host = $this->host;
-        }
-        // If $persist_referers, set the referer ready for the next request
-        if ($this->persist_referers) {
-            $this->debug('Persisting referer: '.$this->getRequestURL());
-            $this->referer = $this->getRequestURL();
-        }
-        // Finally, if handle_redirects and a redirect is sent, do that
-        if ($this->handle_redirects) {
-            if (++$this->redirect_count >= $this->max_redirects) {
-                $this->errormsg = 'Number of redirects exceeded maximum ('.$this->max_redirects.')';
-                $this->debug($this->errormsg);
-                $this->redirect_count = 0;
-                return false;
-            }
-            $location = isset($this->headers['location']) ? $this->headers['location'] : '';
-            $uri = isset($this->headers['uri']) ? $this->headers['uri'] : '';
-            if ($location || $uri) {
-                $url = parse_url($location.$uri);
-                // This will FAIL if redirect is to a different site
-                return $this->get($url['path']);
-            }
-        }
-        return true;
-    }
-    function buildRequest() {
-        $headers = array();
-        $headers[] = "{$this->method} {$this->path} HTTP/1.0"; // Using 1.1 leads to all manner of problems, such as "chunked" encoding
-        $headers[] = "Host: {$this->host}";
-        $headers[] = "User-Agent: {$this->user_agent}";
-        $headers[] = "Accept: {$this->accept}";
-        if ($this->use_gzip) {
-            $headers[] = "Accept-encoding: {$this->accept_encoding}";
-        }
-        $headers[] = "Accept-language: {$this->accept_language}";
-        if ($this->referer) {
-            $headers[] = "Referer: {$this->referer}";
-        }
-    	// Cookies
-    	if ($this->cookies) {
-    	    $cookie = 'Cookie: ';
-    	    foreach ($this->cookies as $key => $value) {
-    	        $cookie .= "$key=$value; ";
-    	    }
-    	    $headers[] = $cookie;
-    	}
-    	// Basic authentication
-    	if ($this->username && $this->password) {
-    	    $headers[] = 'Authorization: BASIC '.base64_encode($this->username.':'.$this->password);
-    	}
-    	// If this is a POST, set the content type and length
-    	if ($this->postdata) {
-    	    $headers[] = 'Content-Type: application/x-www-form-urlencoded';
-    	    $headers[] = 'Content-Length: '.strlen($this->postdata);
-    	}
-    	$request = implode("\r\n", $headers)."\r\n\r\n".$this->postdata;
-    	return $request;
-    }
-    function getStatus() {
-        return $this->status;
-    }
-    function getContent() {
-        return $this->content;
-    }
-    function getHeaders() {
-        return $this->headers;
-    }
-    function getHeader($header) {
-        $header = strtolower($header);
-        if (isset($this->headers[$header])) {
-            return $this->headers[$header];
-        } else {
-            return false;
-        }
-    }
-    function getError() {
-        return $this->errormsg;
-    }
-    function getCookies() {
-        return $this->cookies;
-    }
-    function getRequestURL() {
-        $url = 'http://'.$this->host;
-        if ($this->port != 80) {
-            $url .= ':'.$this->port;
-        }            
-        $url .= $this->path;
-        return $url;
-    }
-    // Setter methods
-    function setUserAgent($string) {
-        $this->user_agent = $string;
-    }
-    function setAuthorization($username, $password) {
-        $this->username = $username;
-        $this->password = $password;
-    }
-    function setCookies($array) {
-        $this->cookies = $array;
-    }
-    // Option setting methods
-    function useGzip($boolean) {
-        $this->use_gzip = $boolean;
-    }
-    function setPersistCookies($boolean) {
-        $this->persist_cookies = $boolean;
-    }
-    function setPersistReferers($boolean) {
-        $this->persist_referers = $boolean;
-    }
-    function setHandleRedirects($boolean) {
-        $this->handle_redirects = $boolean;
-    }
-    function setMaxRedirects($num) {
-        $this->max_redirects = $num;
-    }
-    function setHeadersOnly($boolean) {
-        $this->headers_only = $boolean;
-    }
-    function setDebug($boolean) {
-        $this->debug = $boolean;
-    }
-    // "Quick" static methods
-    function quickGet($url) {
-        $bits = parse_url($url);
-        $host = $bits['host'];
-        $port = isset($bits['port']) ? $bits['port'] : 80;
-        $path = isset($bits['path']) ? $bits['path'] : '/';
-        if (isset($bits['query'])) {
-            $path .= '?'.$bits['query'];
-        }
-        $client = new HttpClient($host, $port);
-        if (!$client->get($path)) {
-            return false;
-        } else {
-            return $client->getContent();
-        }
-    }
-    function quickPost($url, $data) {
-        $bits = parse_url($url);
-        $host = $bits['host'];
-        $port = isset($bits['port']) ? $bits['port'] : 80;
-        $path = isset($bits['path']) ? $bits['path'] : '/';
-        $client = new HttpClient($host, $port);
-        if (!$client->post($path, $data)) {
-            return false;
-        } else {
-            return $client->getContent();
-        }
-    }
-    function debug($msg, $object = false) {
-        if ($this->debug) {
-            print '<div style="border: 1px solid red; padding: 0.5em; margin: 0.5em;"><strong>HttpClient Debug:</strong> '.$msg;
-            if ($object) {
-                ob_start();
-        	    print_r($object);
-        	    $content = htmlentities(ob_get_contents());
-        	    ob_end_clean();
-        	    print '<pre>'.$content.'</pre>';
-        	}
-        	print '</div>';
-        }
-    }   
-}
-
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/classes/PSpell.php 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/classes/PSpell.php
--- 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/classes/PSpell.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/classes/PSpell.php	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,81 @@
+<?php
+/**
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $
+ *
+ * @author Moxiecode
+ * @copyright Copyright  2004-2007, Moxiecode Systems AB, All rights reserved.
+ */
+
+class PSpell extends SpellChecker {
+	/**
+	 * Spellchecks an array of words.
+	 *
+	 * @param {String} $lang Language code like sv or en.
+	 * @param {Array} $words Array of words to spellcheck.
+	 * @return {Array} Array of misspelled words.
+	 */
+	function &checkWords($lang, $words) {
+		$plink = $this->_getPLink($lang);
+
+		$outWords = array();
+		foreach ($words as $word) {
+			if (!pspell_check($plink, trim($word)))
+				$outWords[] = utf8_encode($word);
+		}
+
+		return $outWords;
+	}
+
+	/**
+	 * Returns suggestions of for a specific word.
+	 *
+	 * @param {String} $lang Language code like sv or en.
+	 * @param {String} $word Specific word to get suggestions for.
+	 * @return {Array} Array of suggestions for the specified word.
+	 */
+	function &getSuggestions($lang, $word) {
+		$words = pspell_suggest($this->_getPLink($lang), $word);
+
+		for ($i=0; $i<count($words); $i++)
+			$words[$i] = utf8_encode($words[$i]);
+
+		return $words;
+	}
+
+	/**
+	 * Opens a link for pspell.
+	 */
+	function &_getPLink($lang) {
+		// Check for native PSpell support
+		if (!function_exists("pspell_new"))
+			$this->throwError("PSpell support not found in PHP installation.");
+
+		// Setup PSpell link
+		$plink = pspell_new(
+			$lang,
+			$this->_config['PSpell.spelling'],
+			$this->_config['PSpell.jargon'],
+			$this->_config['PSpell.encoding'],
+			$this->_config['PSpell.mode']
+		);
+
+		// Setup PSpell link
+/*		if (!$plink) {
+			$pspellConfig = pspell_config_create(
+				$lang,
+				$this->_config['PSpell.spelling'],
+				$this->_config['PSpell.jargon'],
+				$this->_config['PSpell.encoding']
+			);
+
+			$plink = pspell_new_config($pspell_config);
+		}*/
+
+		if (!$plink)
+			$this->throwError("No PSpell link found opened.");
+
+		return $plink;
+	}
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/classes/PSpellShell.php 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/classes/PSpellShell.php
--- 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/classes/PSpellShell.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/classes/PSpellShell.php	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,112 @@
+<?php
+/**
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $
+ *
+ * @author Moxiecode
+ * @copyright Copyright  2004-2007, Moxiecode Systems AB, All rights reserved.
+ */
+
+class PSpellShell extends SpellChecker {
+	/**
+	 * Spellchecks an array of words.
+	 *
+	 * @param {String} $lang Language code like sv or en.
+	 * @param {Array} $words Array of words to spellcheck.
+	 * @return {Array} Array of misspelled words.
+	 */
+	function &checkWords($lang, $words) {
+		$cmd = $this->_getCMD($lang);
+
+		if ($fh = fopen($this->_tmpfile, "w")) {
+			fwrite($fh, "!\n");
+
+			foreach($words as $key => $value)
+				fwrite($fh, "^" . $value . "\n");
+
+			fclose($fh);
+		} else
+			$this->throwError("PSpell support was not found.");
+
+		$data = shell_exec($cmd);
+		@unlink($this->_tmpfile);
+
+		$returnData = array();
+		$dataArr = preg_split("/[\r\n]/", $data, -1, PREG_SPLIT_NO_EMPTY);
+
+		foreach ($dataArr as $dstr) {
+			$matches = array();
+
+			// Skip this line.
+			if (strpos($dstr, "@") === 0)
+				continue;
+
+			preg_match("/\& ([^ ]+) .*/i", $dstr, $matches);
+
+			if (!empty($matches[1]))
+				$returnData[] = utf8_encode(trim($matches[1]));
+		}
+
+		return $returnData;
+	}
+
+	/**
+	 * Returns suggestions of for a specific word.
+	 *
+	 * @param {String} $lang Language code like sv or en.
+	 * @param {String} $word Specific word to get suggestions for.
+	 * @return {Array} Array of suggestions for the specified word.
+	 */
+	function &getSuggestions($lang, $word) {
+		$cmd = $this->_getCMD($lang);
+
+        if (function_exists("mb_convert_encoding"))
+            $word = mb_convert_encoding($word, "ISO-8859-1", mb_detect_encoding($word, "UTF-8"));
+        else
+            $word = utf8_encode($word);
+
+		if ($fh = fopen($this->_tmpfile, "w")) {
+			fwrite($fh, "!\n");
+			fwrite($fh, "^$word\n");
+			fclose($fh);
+		} else
+			$this->throwError("Error opening tmp file.");
+
+		$data = shell_exec($cmd);
+		@unlink($this->_tmpfile);
+
+		$returnData = array();
+		$dataArr = preg_split("/\n/", $data, -1, PREG_SPLIT_NO_EMPTY);
+
+		foreach($dataArr as $dstr) {
+			$matches = array();
+
+			// Skip this line.
+			if (strpos($dstr, "@") === 0)
+				continue;
+
+			preg_match("/\&[^:]+:(.*)/i", $dstr, $matches);
+
+			if (!empty($matches[1])) {
+				$words = array_slice(explode(',', $matches[1]), 0, 10);
+
+				for ($i=0; $i<count($words); $i++)
+					$words[$i] = trim($words[$i]);
+
+				return $words;
+			}
+		}
+
+		return array();
+	}
+
+	function _getCMD($lang) {
+		$this->_tmpfile = tempnam($this->_config['PSpellShell.tmp'], "tinyspell");
+
+		if(preg_match("#win#i", php_uname()))
+			return $this->_config['PSpellShell.aspell'] . " -a --lang=". $lang . " --encoding=utf-8 -H < " . $this->_tmpfile . " 2>&1";
+
+		return "cat ". $this->_tmpfile ." | " . $this->_config['PSpellShell.aspell'] . " -a --encoding=utf-8 -H --lang=". $lang;
+	}
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/classes/SpellChecker.php 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/classes/SpellChecker.php
--- 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/classes/SpellChecker.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/classes/SpellChecker.php	2008-02-05 00:47:27.000000000 -0600
@@ -0,0 +1,61 @@
+<?php
+/**
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $
+ *
+ * @author Moxiecode
+ * @copyright Copyright  2004-2007, Moxiecode Systems AB, All rights reserved.
+ */
+
+class SpellChecker {
+	/**
+	 * Constructor.
+	 *
+	 * @param $config Configuration name/value array.
+	 */
+	function SpellChecker(&$config) {
+		$this->_config = $config;
+	}
+
+	/**
+	 * Simple loopback function everything that gets in will be send back.
+	 *
+	 * @param $args.. Arguments.
+	 * @return {Array} Array of all input arguments.
+	 */
+	function &loopback(/* args.. */) {
+		return func_get_args();
+	}
+
+	/**
+	 * Spellchecks an array of words.
+	 *
+	 * @param {String} $lang Language code like sv or en.
+	 * @param {Array} $words Array of words to spellcheck.
+	 * @return {Array} Array of misspelled words.
+	 */
+	function &checkWords($lang, $words) {
+		return $words;
+	}
+
+	/**
+	 * Returns suggestions of for a specific word.
+	 *
+	 * @param {String} $lang Language code like sv or en.
+	 * @param {String} $word Specific word to get suggestions for.
+	 * @return {Array} Array of suggestions for the specified word.
+	 */
+	function &getSuggestions($lang, $word) {
+		return array();
+	}
+
+	/**
+	 * Throws an error message back to the user. This will stop all execution.
+	 *
+	 * @param {String} $str Message to send back to user.
+	 */
+	function throwError($str) {
+		die('{"result":null,"id":null,"error":{"errstr":"' . addslashes($str) . '","errfile":"","errline":null,"errcontext":"","level":"FATAL"}}');
+	}
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/classes/TinyGoogleSpell.class.php 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/classes/TinyGoogleSpell.class.php
--- 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/classes/TinyGoogleSpell.class.php	2007-04-08 19:09:42.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/classes/TinyGoogleSpell.class.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,126 +0,0 @@
-<?php
-/* *
- * Tiny Spelling Interface for TinyMCE Spell Checking.
- *
- * Copyright  2006 Moxiecode Systems AB
- */
-
-class TinyGoogleSpell {
-	var $lang;
-
-	function TinyGoogleSpell(&$config, $lang, $mode, $spelling, $jargon, $encoding) {
-		$this->lang = $lang;
-	}
-
-	// Returns array with bad words or false if failed.
-	function checkWords($word_array) {
-		$words = array();
-		$wordstr = implode(' ', $word_array);
-
-		$matches = $this->_getMatches($wordstr);
-
-		for ($i=0; $i<count($matches); $i++)
-			$words[] = $this->unhtmlentities(mb_substr($wordstr, $matches[$i][1], $matches[$i][2], "UTF-8"));
-
-		return $words;
-	}
-
-	function unhtmlentities($string) {
-		$string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $string);
-		$string = preg_replace('~&#([0-9]+);~e', 'chr(\\1)', $string);
-
-		$trans_tbl = get_html_translation_table(HTML_ENTITIES);
-		$trans_tbl = array_flip($trans_tbl);
-
-		return strtr($string, $trans_tbl);
-	}
-
-	// Returns array with suggestions or false if failed.
-	function getSuggestion($word) {
-		$sug = array();
-
-		$matches = $this->_getMatches($word);
-
-		if (count($matches) > 0)
-			$sug = explode("\t", utf8_encode($this->unhtmlentities($matches[0][4])));
-
-		return $sug;
-	}
-
-	function _xmlChars($string) {
-	   $trans = get_html_translation_table(HTML_ENTITIES, ENT_QUOTES);
-	
-	   foreach ($trans as $k => $v)
-			$trans[$k] = "&#".ord($k).";";
-
-	   return strtr($string, $trans);
-	}
-
-	function _getMatches($word_list) {
-        $server = "www.google.com";
-        $port = 443;
-        $path = "/tbproxy/spell?lang=" . $this->lang . "&hl=en";
-        $host = "www.google.com";
-        $url = "https://" . $server;
-
-		// Setup XML request
-		$xml = '<?xml version="1.0" encoding="utf-8" ?><spellrequest textalreadyclipped="0" ignoredups="0" ignoredigits="1" ignoreallcaps="1"><text>' . $word_list . '</text></spellrequest>';
-
-        $header  = "POST ".$path." HTTP/1.0 \r\n";
-        $header .= "MIME-Version: 1.0 \r\n";
-        $header .= "Content-type: application/PTI26 \r\n";
-        $header .= "Content-length: ".strlen($xml)." \r\n";
-        $header .= "Content-transfer-encoding: text \r\n";
-        $header .= "Request-number: 1 \r\n";
-        $header .= "Document-type: Request \r\n";
-        $header .= "Interface-Version: Test 1.4 \r\n";
-        $header .= "Connection: close \r\n\r\n";
-        $header .= $xml;
-		//$this->_debugData($xml);
-
-		// Use curl if it exists
-		if (function_exists('curl_init')) {
-			// Use curl
-			$ch = curl_init();
-			curl_setopt($ch, CURLOPT_URL,$url);
-			curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
-			curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $header);
-			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
-			$xml = curl_exec($ch);
-			curl_close($ch);
-		} else {
-			// Use raw sockets
-			$fp = fsockopen("ssl://" . $server, $port, $errno, $errstr, 30);
-			if ($fp) {
-				// Send request
-				fwrite($fp, $header);
-
-				// Read response
-				$xml = "";
-				while (!feof($fp))
-					$xml .= fgets($fp, 128);
-
-				fclose($fp);
-			} else 
-				echo "Could not open SSL connection to google.";
-		}
-
-		//$this->_debugData($xml);
-
-		// Grab and parse content
-		preg_match_all('/<c o="([^"]*)" l="([^"]*)" s="([^"]*)">([^<]*)<\/c>/', $xml, $matches, PREG_SET_ORDER);
-
-		return $matches;
-	}
-
-	function _debugData($data) {
-		$fh = @fopen("debug.log", 'a+');
-		@fwrite($fh, $data);
-		@fclose($fh);
-	}
-}
-
-// Setup classname, should be the same as the name of the spellchecker class
-$spellCheckerConfig['class'] = "TinyGoogleSpell";
-
-?>
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/classes/TinyPspell.class.php 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/classes/TinyPspell.class.php
--- 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/classes/TinyPspell.class.php	2007-01-16 11:52:13.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/classes/TinyPspell.class.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,64 +0,0 @@
-<?php
-/* * 
- * Tiny Spelling Interface for TinyMCE Spell Checking.
- *
- * Copyright  2006 Moxiecode Systems AB
- *
- */
-
-class TinyPSpell {
-	var $lang;
-	var $mode;
-	var $string;
-	var $plink;
-	var $errorMsg;
-
-	var $jargon;
-	var $spelling;
-	var $encoding;
-
-	function TinyPSpell(&$config, $lang, $mode, $spelling, $jargon, $encoding) {
-		$this->lang = $lang;
-		$this->mode = $mode;
-		$this->plink = false;
-		$this->errorMsg = array();
-
-		if (!function_exists("pspell_new")) {
-			$this->errorMsg[] = "PSpell not found.";
-			return;
-		}
-
-		$this->plink = pspell_new($this->lang, $this->spelling, $this->jargon, $this->encoding, $this->mode);
-	}
-
-	// Returns array with bad words or false if failed.
-	function checkWords($wordArray) {
-		if (!$this->plink) {
-			$this->errorMsg[] = "No PSpell link found for checkWords.";
-			return array();
-		}
-
-		$wordError = array();
-		foreach($wordArray as $word) {
-			if(!pspell_check($this->plink, trim($word)))
-				$wordError[] = $word;
-		}
-
-		return $wordError;
-	}
-
-	// Returns array with suggestions or false if failed.
-	function getSuggestion($word) {
-		if (!$this->plink) {
-			$this->errorMsg[] = "No PSpell link found for getSuggestion.";
-			return array();
-		}
-
-		return pspell_suggest($this->plink, $word);
-	}
-}
-
-// Setup classname, should be the same as the name of the spellchecker class
-$spellCheckerConfig['class'] = "TinyPspell";
-
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/classes/TinyPspellShell.class.php 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/classes/TinyPspellShell.class.php
--- 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/classes/TinyPspellShell.class.php	2007-03-06 22:26:26.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/classes/TinyPspellShell.class.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,121 +0,0 @@
-<?php
-/* * 
- * Tiny Spelling Interface for TinyMCE Spell Checking.
- *
- * Copyright  2006 Moxiecode Systems AB
- *
- */
-
-
-class TinyPspellShell {
-	var $lang;
-	var $mode;
-	var $string;
-	var $error;
-	var $errorMsg;
-
-	var $cmd;
-	var $tmpfile;
-
-	var $jargon;
-	var $spelling;
-	var $encoding;
-
-	function TinyPspellShell(&$config, $lang, $mode, $spelling, $jargon, $encoding) {
-		$this->lang = $lang;
-		$this->mode = $mode;
-		$this->error = false;
-		$this->errorMsg = array();
-
-		$this->tmpfile = tempnam($config['tinypspellshell.tmp'], "tinyspell");
-
-		if(preg_match("#win#i",php_uname()))
-            $this->cmd = $config['tinypspellshell.aspell'] . " -a --lang=". $this->lang." --encoding=utf-8 -H < $this->tmpfile 2>&1";
-        else
-            $this->cmd = "cat ". $this->tmpfile ." | " . $config['tinypspellshell.aspell'] . " -a --encoding=utf-8 -H --lang=". $this->lang;
-	}
-
-	// Returns array with bad words or false if failed.
-	function checkWords($wordArray) {
-		if ($fh = fopen($this->tmpfile, "w")) {
-			fwrite($fh, "!\n");
-			foreach($wordArray as $key => $value)
-				fwrite($fh, "^" . $value . "\n");
-			fclose($fh);
-		} else {
-			$this->errorMsg[] = "PSpell not found.";
-			return array();
-		}
-
-		$data = shell_exec($this->cmd);
-        @unlink($this->tmpfile);
-		
-		$returnData = array();
-		$dataArr = preg_split("/\n/", $data, -1, PREG_SPLIT_NO_EMPTY);
-
-		foreach($dataArr as $dstr) {
-			$matches = array();
-
-			// Skip this line.
-			if (strpos($dstr, "@") === 0)
-				continue;
-
-			preg_match("/\& (.*) .* .*: .*/i", $dstr, $matches);
-
-			if (!empty($matches[1]))
-				$returnData[] = $matches[1];
-		}
-
-		return $returnData;
-	}
-
-	// Returns array with suggestions or false if failed.
-	function getSuggestion($word) {
-        if (function_exists("mb_convert_encoding"))
-            $word = mb_convert_encoding($word, "ISO-8859-1", mb_detect_encoding($word, "UTF-8"));
-        else
-            $word = utf8_encode($word);
-
-		if ($fh = fopen($this->tmpfile, "w")) {
-			fwrite($fh, "!\n");
-			fwrite($fh, "^$word\n");
-			fclose($fh);
-		} else
-			die("Error opening tmp file.");
-
-		$data = shell_exec($this->cmd);
-
-        @unlink($this->tmpfile);
-
-		$returnData = array();
-		$dataArr = preg_split("/\n/", $data, -1, PREG_SPLIT_NO_EMPTY);
-
-		foreach($dataArr as $dstr) {
-			$matches = array();
-
-			// Skip this line.
-			if (strpos($dstr, "@") === 0)
-				continue;
-
-			preg_match("/\& .* .* .*: (.*)/i", $dstr, $matches);
-
-			if (!empty($matches[1])) {
-				// For some reason, the exec version seems to add commas?
-				$returnData[] = str_replace(",", "", $matches[1]);
-			}
-		}
-		return $returnData;
-	}
-
-	function _debugData($data) {
-		$fh = @fopen("debug.log", 'a+');
-		@fwrite($fh, $data);
-		@fclose($fh);
-	}
-
-}
-
-// Setup classname, should be the same as the name of the spellchecker class
-$spellCheckerConfig['class'] = "TinyPspellShell";
-
-?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/classes/utils/JSON.php 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/classes/utils/JSON.php
--- 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/classes/utils/JSON.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/classes/utils/JSON.php	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,595 @@
+<?php
+/**
+ * $Id: JSON.php 40 2007-06-18 11:43:15Z spocke $
+ *
+ * @package MCManager.utils
+ * @author Moxiecode
+ * @copyright Copyright  2007, Moxiecode Systems AB, All rights reserved.
+ */
+
+define('JSON_BOOL', 1);
+define('JSON_INT', 2);
+define('JSON_STR', 3);
+define('JSON_FLOAT', 4);
+define('JSON_NULL', 5);
+define('JSON_START_OBJ', 6);
+define('JSON_END_OBJ', 7);
+define('JSON_START_ARRAY', 8);
+define('JSON_END_ARRAY', 9);
+define('JSON_KEY', 10);
+define('JSON_SKIP', 11);
+
+define('JSON_IN_ARRAY', 30);
+define('JSON_IN_OBJECT', 40);
+define('JSON_IN_BETWEEN', 50);
+
+class Moxiecode_JSONReader {
+	var $_data, $_len, $_pos;
+	var $_value, $_token;
+	var $_location, $_lastLocations;
+	var $_needProp;
+
+	function Moxiecode_JSONReader($data) {
+		$this->_data = $data;
+		$this->_len = strlen($data);
+		$this->_pos = -1;
+		$this->_location = JSON_IN_BETWEEN;
+		$this->_lastLocations = array();
+		$this->_needProp = false;
+	}
+
+	function getToken() {
+		return $this->_token;
+	}
+
+	function getLocation() {
+		return $this->_location;
+	}
+
+	function getTokenName() {
+		switch ($this->_token) {
+			case JSON_BOOL:
+				return 'JSON_BOOL';
+
+			case JSON_INT:
+				return 'JSON_INT';
+
+			case JSON_STR:
+				return 'JSON_STR';
+
+			case JSON_FLOAT:
+				return 'JSON_FLOAT';
+
+			case JSON_NULL:
+				return 'JSON_NULL';
+
+			case JSON_START_OBJ:
+				return 'JSON_START_OBJ';
+
+			case JSON_END_OBJ:
+				return 'JSON_END_OBJ';
+
+			case JSON_START_ARRAY:
+				return 'JSON_START_ARRAY';
+
+			case JSON_END_ARRAY:
+				return 'JSON_END_ARRAY';
+
+			case JSON_KEY:
+				return 'JSON_KEY';
+		}
+
+		return 'UNKNOWN';
+	}
+
+	function getValue() {
+		return $this->_value;
+	}
+
+	function readToken() {
+		$chr = $this->read();
+
+		if ($chr != null) {
+			switch ($chr) {
+				case '[':
+					$this->_lastLocation[] = $this->_location;
+					$this->_location = JSON_IN_ARRAY;
+					$this->_token = JSON_START_ARRAY;
+					$this->_value = null;
+					$this->readAway();
+					return true;
+
+				case ']':
+					$this->_location = array_pop($this->_lastLocation);
+					$this->_token = JSON_END_ARRAY;
+					$this->_value = null;
+					$this->readAway();
+
+					if ($this->_location == JSON_IN_OBJECT)
+						$this->_needProp = true;
+
+					return true;
+
+				case '{':
+					$this->_lastLocation[] = $this->_location;
+					$this->_location = JSON_IN_OBJECT;
+					$this->_needProp = true;
+					$this->_token = JSON_START_OBJ;
+					$this->_value = null;
+					$this->readAway();
+					return true;
+
+				case '}':
+					$this->_location = array_pop($this->_lastLocation);
+					$this->_token = JSON_END_OBJ;
+					$this->_value = null;
+					$this->readAway();
+
+					if ($this->_location == JSON_IN_OBJECT)
+						$this->_needProp = true;
+
+					return true;
+
+				// String
+				case '"':
+				case '\'':
+					return $this->_readString($chr);
+
+				// Null
+				case 'n':
+					return $this->_readNull();
+
+				// Bool
+				case 't':
+				case 'f':
+					return $this->_readBool($chr);
+
+				default:
+					// Is number
+					if (is_numeric($chr) || $chr == '-' || $chr == '.')
+						return $this->_readNumber($chr);
+
+					return true;
+			}
+		}
+
+		return false;
+	}
+
+	function _readBool($chr) {
+		$this->_token = JSON_BOOL;
+		$this->_value = $chr == 't';
+
+		if ($chr == 't')
+			$this->skip(3); // rue
+		else
+			$this->skip(4); // alse
+
+		$this->readAway();
+
+		if ($this->_location == JSON_IN_OBJECT && !$this->_needProp)
+			$this->_needProp = true;
+
+		return true;
+	}
+
+	function _readNull() {
+		$this->_token = JSON_NULL;
+		$this->_value = null;
+
+		$this->skip(3); // ull
+		$this->readAway();
+
+		if ($this->_location == JSON_IN_OBJECT && !$this->_needProp)
+			$this->_needProp = true;
+
+		return true;
+	}
+
+	function _readString($quote) {
+		$output = "";
+		$this->_token = JSON_STR;
+		$endString = false;
+
+		while (($chr = $this->peek()) != -1) {
+			switch ($chr) {
+				case '\\':
+					// Read away slash
+					$this->read();
+
+					// Read escape code
+					$chr = $this->read();
+					switch ($chr) {
+							case 't':
+								$output .= "\t";
+								break;
+
+							case 'b':
+								$output .= "\b";
+								break;
+
+							case 'f':
+								$output .= "\f";
+								break;
+
+							case 'r':
+								$output .= "\r";
+								break;
+
+							case 'n':
+								$output .= "\n";
+								break;
+
+							case 'u':
+								$output .= $this->_int2utf8(hexdec($this->read(4)));
+								break;
+
+							default:
+								$output .= $chr;
+								break;
+					}
+
+					break;
+
+					case '\'':
+					case '"':
+						if ($chr == $quote)
+							$endString = true;
+
+						$chr = $this->read();
+						if ($chr != -1 && $chr != $quote)
+							$output .= $chr;
+
+						break;
+
+					default:
+						$output .= $this->read();
+			}
+
+			// String terminated
+			if ($endString)
+				break;
+		}
+
+		$this->readAway();
+		$this->_value = $output;
+
+		// Needed a property
+		if ($this->_needProp) {
+			$this->_token = JSON_KEY;
+			$this->_needProp = false;
+			return true;
+		}
+
+		if ($this->_location == JSON_IN_OBJECT && !$this->_needProp)
+			$this->_needProp = true;
+
+		return true;
+	}
+
+	function _int2utf8($int) {
+		$int = intval($int);
+
+		switch ($int) {
+			case 0:
+				return chr(0);
+
+			case ($int & 0x7F):
+				return chr($int);
+
+			case ($int & 0x7FF):
+				return chr(0xC0 | (($int >> 6) & 0x1F)) . chr(0x80 | ($int & 0x3F));
+
+			case ($int & 0xFFFF):
+				return chr(0xE0 | (($int >> 12) & 0x0F)) . chr(0x80 | (($int >> 6) & 0x3F)) . chr (0x80 | ($int & 0x3F));
+
+			case ($int & 0x1FFFFF):
+				return chr(0xF0 | ($int >> 18)) . chr(0x80 | (($int >> 12) & 0x3F)) . chr(0x80 | (($int >> 6) & 0x3F)) . chr(0x80 | ($int & 0x3F));
+		}
+	}
+
+	function _readNumber($start) {
+		$value = "";
+		$isFloat = false;
+
+		$this->_token = JSON_INT;
+		$value .= $start;
+
+		while (($chr = $this->peek()) != -1) {
+			if (is_numeric($chr) || $chr == '-' || $chr == '.') {
+				if ($chr == '.')
+					$isFloat = true;
+
+				$value .= $this->read();
+			} else
+				break;
+		}
+
+		$this->readAway();
+
+		if ($isFloat) {
+			$this->_token = JSON_FLOAT;
+			$this->_value = floatval($value);
+		} else
+			$this->_value = intval($value);
+
+		if ($this->_location == JSON_IN_OBJECT && !$this->_needProp)
+			$this->_needProp = true;
+
+		return true;
+	}
+
+	function readAway() {
+		while (($chr = $this->peek()) != null) {
+			if ($chr != ':' && $chr != ',' && $chr != ' ')
+				return;
+
+			$this->read();
+		}
+	}
+
+	function read($len = 1) {
+		if ($this->_pos < $this->_len) {
+			if ($len > 1) {
+				$str = substr($this->_data, $this->_pos + 1, $len);
+				$this->_pos += $len;
+
+				return $str;
+			} else
+				return $this->_data[++$this->_pos];
+		}
+
+		return null;
+	}
+
+	function skip($len) {
+		$this->_pos += $len;
+	}
+
+	function peek() {
+		if ($this->_pos < $this->_len)
+			return $this->_data[$this->_pos + 1];
+
+		return null;
+	}
+}
+
+/**
+ * This class handles JSON stuff.
+ *
+ * @package MCManager.utils
+ */
+class Moxiecode_JSON {
+	function Moxiecode_JSON() {
+	}
+
+	function decode($input) {
+		$reader = new Moxiecode_JSONReader($input);
+
+		return $this->readValue($reader);
+	}
+
+	function readValue(&$reader) {
+		$this->data = array();
+		$this->parents = array();
+		$this->cur =& $this->data;
+		$key = null;
+		$loc = JSON_IN_ARRAY;
+
+		while ($reader->readToken()) {
+			switch ($reader->getToken()) {
+				case JSON_STR:
+				case JSON_INT:
+				case JSON_BOOL:
+				case JSON_FLOAT:
+				case JSON_NULL:
+					switch ($reader->getLocation()) {
+						case JSON_IN_OBJECT:
+							$this->cur[$key] = $reader->getValue();
+							break;
+
+						case JSON_IN_ARRAY:
+							$this->cur[] = $reader->getValue();
+							break;
+
+						default:
+							return $reader->getValue();
+					}
+					break;
+
+				case JSON_KEY:
+					$key = $reader->getValue();
+					break;
+
+				case JSON_START_OBJ:
+				case JSON_START_ARRAY:
+					if ($loc == JSON_IN_OBJECT)
+						$this->addArray($key);
+					else
+						$this->addArray(null);
+
+					$cur =& $obj;
+
+					$loc = $reader->getLocation();
+					break;
+
+				case JSON_END_OBJ:
+				case JSON_END_ARRAY:
+					$loc = $reader->getLocation();
+
+					if (count($this->parents) > 0) {
+						$this->cur =& $this->parents[count($this->parents) - 1];
+						array_pop($this->parents);
+					}
+					break;
+			}
+		}
+
+		return $this->data[0];
+	}
+
+	// This method was needed since PHP is crapy and doesn't have pointers/references
+	function addArray($key) {
+		$this->parents[] =& $this->cur;
+		$ar = array();
+
+		if ($key)
+			$this->cur[$key] =& $ar;
+		else
+			$this->cur[] =& $ar;
+
+		$this->cur =& $ar;
+	}
+
+	function getDelim($index, &$reader) {
+		switch ($reader->getLocation()) {
+			case JSON_IN_ARRAY:
+			case JSON_IN_OBJECT:
+				if ($index > 0)
+					return ",";
+				break;
+		}
+
+		return "";
+	}
+
+	function encode($input) {
+		switch (gettype($input)) {
+			case 'boolean':
+				return $input ? 'true' : 'false';
+
+			case 'integer':
+				return (int) $input;
+
+			case 'float':
+			case 'double':
+				return (float) $input;
+
+			case 'NULL':
+				return 'null';
+
+			case 'string':
+				return $this->encodeString($input);
+
+			case 'array':
+				return $this->_encodeArray($input);
+
+			case 'object':
+				return $this->_encodeArray(get_object_vars($input));
+		}
+
+		return '';
+	}
+
+	function encodeString($input) {
+		// Needs to be escaped
+		if (preg_match('/[^a-zA-Z0-9]/', $input)) {
+			$output = '';
+
+			for ($i=0; $i<strlen($input); $i++) {
+				switch ($input[$i]) {
+					case "\b":
+						$output .= "\\b";
+						break;
+
+					case "\t":
+						$output .= "\\t";
+						break;
+
+					case "\f":
+						$output .= "\\f";
+						break;
+
+					case "\r":
+						$output .= "\\r";
+						break;
+
+					case "\n":
+						$output .= "\\n";
+						break;
+
+					case '\\':
+						$output .= "\\\\";
+						break;
+
+					case '\'':
+						$output .= "\\'";
+						break;
+
+					case '"':
+						$output .= '\"';
+						break;
+
+					default:
+						$byte = ord($input[$i]);
+
+						if (($byte & 0xE0) == 0xC0) {
+							$char = pack('C*', $byte, ord($input[$i + 1]));
+							$i += 1;
+							$output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char)));
+						} if (($byte & 0xF0) == 0xE0) {
+							$char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2]));
+							$i += 2;
+							$output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char)));
+						} if (($byte & 0xF8) == 0xF0) {
+							$char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2], ord($input[$i + 3])));
+							$i += 3;
+							$output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char)));
+						} if (($byte & 0xFC) == 0xF8) {
+							$char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2], ord($input[$i + 3]), ord($input[$i + 4])));
+							$i += 4;
+							$output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char)));
+						} if (($byte & 0xFE) == 0xFC) {
+							$char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2], ord($input[$i + 3]), ord($input[$i + 4]), ord($input[$i + 5])));
+							$i += 5;
+							$output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char)));
+						} else if ($byte < 128)
+							$output .= $input[$i];
+				}
+			}
+
+			return '"' . $output . '"';
+		}
+
+		return '"' . $input . '"';
+	}
+
+	function _utf82utf16($utf8) {
+		if (function_exists('mb_convert_encoding'))
+			return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
+
+		switch (strlen($utf8)) {
+			case 1:
+				return $utf8;
+
+			case 2:
+				return chr(0x07 & (ord($utf8[0]) >> 2)) . chr((0xC0 & (ord($utf8[0]) << 6)) | (0x3F & ord($utf8[1])));
+
+			case 3:
+				return chr((0xF0 & (ord($utf8[0]) << 4)) | (0x0F & (ord($utf8[1]) >> 2))) . chr((0xC0 & (ord($utf8[1]) << 6)) | (0x7F & ord($utf8[2])));
+		}
+
+		return '';
+	}
+
+	function _encodeArray($input) {
+		$output = '';
+		$isIndexed = true;
+
+		$keys = array_keys($input);
+		for ($i=0; $i<count($keys); $i++) {
+			if (!is_int($keys[$i])) {
+				$output .= $this->encodeString($keys[$i]) . ':' . $this->encode($input[$keys[$i]]);
+				$isIndexed = false;
+			} else
+				$output .= $this->encode($input[$keys[$i]]);
+
+			if ($i != count($keys) - 1)
+				$output .= ',';
+		}
+
+		return $isIndexed ? '[' . $output . ']' : '{' . $output . '}';
+	}
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/classes/utils/Logger.php 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/classes/utils/Logger.php
--- 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/classes/utils/Logger.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/classes/utils/Logger.php	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,268 @@
+<?php
+/**
+ * $Id: Logger.class.php 10 2007-05-27 10:55:12Z spocke $
+ *
+ * @package MCFileManager.filesystems
+ * @author Moxiecode
+ * @copyright Copyright  2005, Moxiecode Systems AB, All rights reserved.
+ */
+
+// File type contstants
+define('MC_LOGGER_DEBUG', 0);
+define('MC_LOGGER_INFO', 10);
+define('MC_LOGGER_WARN', 20);
+define('MC_LOGGER_ERROR', 30);
+define('MC_LOGGER_FATAL', 40);
+
+/**
+ * Logging utility class. This class handles basic logging with levels, log rotation and custom log formats. It's
+ * designed to be compact but still powerful and flexible.
+ */
+class Moxiecode_Logger {
+	// Private fields
+	var $_path;
+	var $_filename;
+	var $_maxSize;
+	var $_maxFiles;
+	var $_maxSizeBytes;
+	var $_level;
+	var $_format;
+
+	/**
+	 * Constructs a new logger instance.
+	 */
+	function Moxiecode_Logger() {
+		$this->_path = "";
+		$this->_filename = "{level}.log";
+		$this->setMaxSize("100k");
+		$this->_maxFiles = 10;
+		$this->_level = MC_LOGGER_DEBUG;
+		$this->_format = "[{time}] [{level}] {message}";
+	}
+
+	/**
+	 * Sets the current log level, use the MC_LOGGER constants.
+	 *
+	 * @param int $level Log level instance for example MC_LOGGER_DEBUG.
+	 */
+	function setLevel($level) {
+		if (is_string($level)) {
+			switch (strtolower($level)) {
+				case "debug":
+					$level = MC_LOGGER_DEBUG;
+					break;
+
+				case "info":
+					$level = MC_LOGGER_INFO;
+					break;
+
+				case "warn":
+				case "warning":
+					$level = MC_LOGGER_WARN;
+					break;
+
+				case "error":
+					$level = MC_LOGGER_ERROR;
+					break;
+
+				case "fatal":
+					$level = MC_LOGGER_FATAL;
+					break;
+
+				default:
+					$level = MC_LOGGER_FATAL;
+			}
+		}
+
+		$this->_level = $level;
+	}
+
+	/**
+	 * Returns the current log level for example MC_LOGGER_DEBUG.
+	 *
+	 * @return int Current log level for example MC_LOGGER_DEBUG.
+	 */
+	function getLevel() {
+		return $this->_level;
+	}
+
+	function setPath($path) {
+		$this->_path = $path;
+	}
+
+	function getPath() {
+		return $this->_path;
+	}
+
+	function setFileName($file_name) {
+		$this->_filename = $file_name;
+	}
+
+	function getFileName() {
+		return $this->_filename;
+	}
+
+	function setFormat($format) {
+		$this->_format = $format;
+	}
+
+	function getFormat() {
+		return $this->_format;
+	}
+
+	function setMaxSize($size) {
+		// Fix log max size
+		$logMaxSizeBytes = intval(preg_replace("/[^0-9]/", "", $size));
+
+		// Is KB
+		if (strpos((strtolower($size)), "k") > 0)
+			$logMaxSizeBytes *= 1024;
+
+		// Is MB
+		if (strpos((strtolower($size)), "m") > 0)
+			$logMaxSizeBytes *= (1024 * 1024);
+
+		$this->_maxSizeBytes = $logMaxSizeBytes;
+		$this->_maxSize = $size;
+	}
+
+	function getMaxSize() {
+		return $this->_maxSize;
+	}
+
+	function setMaxFiles($max_files) {
+		$this->_maxFiles = $max_files;
+	}
+
+	function getMaxFiles() {
+		return $this->_maxFiles;
+	}
+
+	function debug($msg) {
+		$args = func_get_args();
+		$this->_logMsg(MC_LOGGER_DEBUG, implode(', ', $args));
+	}
+
+	function info($msg) {
+		$args = func_get_args();
+		$this->_logMsg(MC_LOGGER_INFO, implode(', ', $args));
+	}
+
+	function warn($msg) {
+		$args = func_get_args();
+		$this->_logMsg(MC_LOGGER_WARN, implode(', ', $args));
+	}
+
+	function error($msg) {
+		$args = func_get_args();
+		$this->_logMsg(MC_LOGGER_ERROR, implode(', ', $args));
+	}
+
+	function fatal($msg) {
+		$args = func_get_args();
+		$this->_logMsg(MC_LOGGER_FATAL, implode(', ', $args));
+	}
+
+	function isDebugEnabled() {
+		return $this->_level >= MC_LOGGER_DEBUG;
+	}
+
+	function isInfoEnabled() {
+		return $this->_level >= MC_LOGGER_INFO;
+	}
+
+	function isWarnEnabled() {
+		return $this->_level >= MC_LOGGER_WARN;
+	}
+
+	function isErrorEnabled() {
+		return $this->_level >= MC_LOGGER_ERROR;
+	}
+
+	function isFatalEnabled() {
+		return $this->_level >= MC_LOGGER_FATAL;
+	}
+
+	function _logMsg($level, $message) {
+		$roll = false;
+
+		if ($level < $this->_level)
+			return;
+
+		$logFile = $this->toOSPath($this->_path . "/" . $this->_filename);
+
+		switch ($level) {
+			case MC_LOGGER_DEBUG:
+				$levelName = "DEBUG";
+				break;
+
+			case MC_LOGGER_INFO:
+				$levelName = "INFO";
+				break;
+
+			case MC_LOGGER_WARN:
+				$levelName = "WARN";
+				break;
+
+			case MC_LOGGER_ERROR:
+				$levelName = "ERROR";
+				break;
+
+			case MC_LOGGER_FATAL:
+				$levelName = "FATAL";
+				break;
+		}
+
+		$logFile = str_replace('{level}', strtolower($levelName), $logFile);
+
+		$text = $this->_format;
+		$text = str_replace('{time}', date("Y-m-d H:i:s"), $text);
+		$text = str_replace('{level}', strtolower($levelName), $text);
+		$text = str_replace('{message}', $message, $text);
+		$message = $text . "\r\n";
+
+		// Check filesize
+		if (file_exists($logFile)) {
+			$size = @filesize($logFile);
+
+			if ($size + strlen($message) > $this->_maxSizeBytes)
+				$roll = true;
+		}
+
+		// Roll if the size is right
+		if ($roll) {
+			for ($i=$this->_maxFiles-1; $i>=1; $i--) {
+				$rfile = $this->toOSPath($logFile . "." . $i);
+				$nfile = $this->toOSPath($logFile . "." . ($i+1));
+
+				if (@file_exists($rfile))
+					@rename($rfile, $nfile);
+			}
+
+			@rename($logFile, $this->toOSPath($logFile . ".1"));
+
+			// Delete last logfile
+			$delfile = $this->toOSPath($logFile . "." . ($this->_maxFiles + 1));
+			if (@file_exists($delfile))
+				@unlink($delfile);
+		}
+
+		// Append log line
+		if (($fp = @fopen($logFile, "a")) != null) {
+			@fputs($fp, $message);
+			@fflush($fp);
+			@fclose($fp);
+		}
+	}
+
+	/**
+	 * Converts a Unix path to OS specific path.
+	 *
+	 * @param String $path Unix path to convert.
+	 */
+	function toOSPath($path) {
+		return str_replace("/", DIRECTORY_SEPARATOR, $path);
+	}
+}
+
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/config.php 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/config.php
--- 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/config.php	2007-03-06 22:26:26.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/config.php	2008-01-17 09:44:05.000000000 -0600
@@ -1,24 +1,21 @@
 <?php
-	$spellCheckerConfig = array();
-
-	// Spellchecker class use
-	// require_once("classes/TinyPspellShell.class.php"); // Command line pspell
-	require_once("classes/TinyGoogleSpell.class.php"); // Google web service
-	// require_once("classes/TinyPspell.class.php"); // Internal PHP version
-
 	// General settings
-	$spellCheckerConfig['enabled'] = true;
+	$config['general.engine'] = 'GoogleSpell';
+	//$config['general.engine'] = 'PSpell';
+	//$config['general.engine'] = 'PSpellShell';
 
-	// Default settings
-	$spellCheckerConfig['default.language'] = 'en';
-	$spellCheckerConfig['default.mode'] = PSPELL_FAST;
+	// PSpell settings
+	$config['PSpell.mode'] = PSPELL_FAST;
+	$config['PSpell.spelling'] = "";
+	$config['PSpell.jargon'] = "";
+	$config['PSpell.encoding'] = "";
 
-	// Normaly not required to configure
-	$spellCheckerConfig['default.spelling'] = "";
-	$spellCheckerConfig['default.jargon'] = "";
-	$spellCheckerConfig['default.encoding'] = "";
+	// PSpellShell settings
+	$config['PSpellShell.mode'] = PSPELL_FAST;
+	$config['PSpellShell.aspell'] = '/usr/bin/aspell';
+	$config['PSpellShell.tmp'] = '/tmp';
 
-	// Pspell shell specific settings
-	$spellCheckerConfig['tinypspellshell.aspell'] = '/usr/bin/aspell';
-	$spellCheckerConfig['tinypspellshell.tmp'] = '/tmp';
+	// Windows PSpellShell settings
+	//$config['PSpellShell.aspell'] = '"c:\Program Files\Aspell\bin\aspell.exe"';
+	//$config['PSpellShell.tmp'] = 'c:/temp';
 ?>
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/css/content.css 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/css/content.css
--- 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/css/content.css	2007-03-06 22:26:26.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/css/content.css	2008-01-17 09:44:05.000000000 -0600
@@ -1,4 +1 @@
-.mceItemHiddenSpellWord {
-	background: url('../images/wline.gif') repeat-x bottom left;
-	cursor: default;
-}
+.mceItemHiddenSpellWord {background:url(../img/wline.gif) repeat-x bottom left; cursor:default;}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/css/spellchecker.css 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/css/spellchecker.css
--- 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/css/spellchecker.css	2007-03-06 22:26:26.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/css/spellchecker.css	1969-12-31 18:00:00.000000000 -0600
@@ -1,35 +0,0 @@
-.mceMsgBox {
-	border: 1px solid gray;
-	padding: 8px;
-}
-
-.mceMsgBox span {
-	vertical-align: top;
-	color: #555555;
-}
-
-/* Misc */
-
-.mceBlockBox {
-	display: none;
-	position: absolute;
-	left: 0;
-	top: 0;
-	z-index: 100;
-	filter:progid:DXImageTransform.Microsoft.Alpha(style=0, opacity=60);
-	-moz-opacity:0.6;
-	opacity: 0.6;
-	background-color: white;
-}
-
-.mceMsgBox {
-	display: none;
-	z-index: 101;
-	position: absolute;
-	left: 0;
-	top: 0;
-	font-family: Arial, Verdana, Tahoma, Helvetica;
-	font-weight: bold;
-	font-size: 11px;
-	background-color: #FFF;
-}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/editor_plugin.js 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/editor_plugin.js
--- 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/editor_plugin.js	2007-03-06 22:26:26.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/editor_plugin.js	2008-03-18 01:59:53.000000000 -0500
@@ -1 +1,338 @@
-tinyMCE.importPluginLanguagePack('spellchecker','en,fr,sv,nn,nb');var TinyMCE_SpellCheckerPlugin={_contextMenu:new TinyMCE_Menu(),_menu:new TinyMCE_Menu(),_counter:0,_ajaxPage:'/tinyspell.php',getInfo:function(){return{longname:'Spellchecker PHP',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_spellchecker.html',version:"1.0.3"};},handleEvent:function(e){var elm=tinyMCE.isMSIE?e.srcElement:e.target;var inst=tinyMCE.selectedInstance,args='';var self=TinyMCE_SpellCheckerPlugin;var cm=self._contextMenu;var p,p2,x,y,sx,sy,h,elm;if((e.type=="click"||e.type=="contextmenu")&&elm){do{if(tinyMCE.getAttrib(elm,'class')=="mceItemHiddenSpellWord"){inst.spellCheckerElm=elm;args+='id='+inst.editorId+"|"+(++self._counter);args+='&cmd=suggest&check='+encodeURIComponent(elm.innerHTML);args+='&lang='+escape(inst.spellCheckerLang);elm=inst.spellCheckerElm;p=tinyMCE.getAbsPosition(inst.iframeElement);p2=tinyMCE.getAbsPosition(elm);h=parseInt(elm.offsetHeight);sx=inst.getBody().scrollLeft;sy=inst.getBody().scrollTop;x=p.absLeft+p2.absLeft-sx;y=p.absTop+p2.absTop-sy+h;cm.clear();cm.addTitle(tinyMCE.getLang('lang_spellchecker_wait','',true));cm.show();cm.moveTo(x,y);inst.selection.selectNode(elm,false,false);self._sendAjax(self.baseURL+self._ajaxPage,self._ajaxResponse,'post',args);tinyMCE.cancelEvent(e);return false;}}while((elm=elm.parentNode));}return true;},initInstance:function(inst){var self=TinyMCE_SpellCheckerPlugin,m=self._menu,cm=self._contextMenu,e;tinyMCE.importCSS(inst.getDoc(),tinyMCE.baseURL+"/plugins/spellchecker/css/content.css");if(!tinyMCE.hasMenu('spellcheckercontextmenu')){tinyMCE.importCSS(document,tinyMCE.baseURL+"/plugins/spellchecker/css/spellchecker.css");cm.init({drop_menu:false});tinyMCE.addMenu('spellcheckercontextmenu',cm);}if(!tinyMCE.hasMenu('spellcheckermenu')){m.init({});tinyMCE.addMenu('spellcheckermenu',m);}inst.spellCheckerLang='en';self._buildSettingsMenu(inst,null);e=self._getBlockBoxLayer(inst).create('div','mceBlockBox',document.getElementById(inst.editorId+'_parent'));self._getMsgBoxLayer(inst).create('div','mceMsgBox',document.getElementById(inst.editorId+'_parent'));},_getMsgBoxLayer:function(inst){if(!inst.spellCheckerMsgBoxL)inst.spellCheckerMsgBoxL=new TinyMCE_Layer(inst.editorId+'_spellcheckerMsgBox',false);return inst.spellCheckerMsgBoxL;},_getBlockBoxLayer:function(inst){if(!inst.spellCheckerBoxL)inst.spellCheckerBoxL=new TinyMCE_Layer(inst.editorId+'_spellcheckerBlockBox',false);return inst.spellCheckerBoxL;},_buildSettingsMenu:function(inst,lang){var i,ar=tinyMCE.getParam('spellchecker_languages','+English=en').split(','),p;var self=TinyMCE_SpellCheckerPlugin,m=self._menu,c;m.clear();m.addTitle(tinyMCE.getLang('lang_spellchecker_langs','',true));for(i=0;i<ar.length;i++){if(ar[i]!=''){p=ar[i].split('=');c='mceMenuCheckItem';if(p[0].charAt(0)=='+'){p[0]=p[0].substring(1);if(lang==null){c='mceMenuSelectedItem';inst.spellCheckerLang=p[1];}}if(lang==p[1])c='mceMenuSelectedItem';m.add({text:p[0],js:"tinyMCE.execInstanceCommand('"+inst.editorId+"','mceSpellCheckerSetLang',false,'"+p[1]+"');",class_name:c});}}},setupContent:function(editor_id,body,doc){TinyMCE_SpellCheckerPlugin._removeWords(doc,null,true);},getControlHTML:function(cn){switch(cn){case"spellchecker":return TinyMCE_SpellCheckerPlugin._getMenuButtonHTML(cn,'lang_spellchecker_desc','{$pluginurl}/images/spellchecker.gif','lang_spellchecker_desc','mceSpellCheckerMenu','mceSpellCheck');}return"";},_getMenuButtonHTML:function(id,lang,img,mlang,mid,cmd,ui,val){var h='',m,x;cmd='tinyMCE.hideMenus();tinyMCE.execInstanceCommand(\'{$editor_id}\',\''+cmd+'\'';if(typeof(ui)!="undefined"&&ui!=null)cmd+=','+ui;if(typeof(val)!="undefined"&&val!=null)cmd+=",'"+val+"'";cmd+=');';if(tinyMCE.getParam('button_tile_map')&&(!tinyMCE.isMSIE||tinyMCE.isOpera)&&(m=tinyMCE.buttonMap[id])!=null&&(tinyMCE.getParam("language")=="en"||img.indexOf('$lang')==-1)){x=0-(m*20)==0?'0':0-(m*20);h+='<a id="{$editor_id}_'+id+'" href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" class="mceTiledButton mceButtonNormal" target="_self">';h+='<img src="{$themeurl}/images/spacer.gif" style="background-position: '+x+'px 0" title="{$'+lang+'}" />';h+='<img src="{$themeurl}/images/button_menu.gif" title="{$'+lang+'}" class="mceMenuButton" onclick="'+mcmd+'return false;" />';h+='</a>';}else{if(tinyMCE.isMSIE&&!tinyMCE.isOpera)h+='<span id="{$editor_id}_'+id+'" class="mceMenuButton" onmouseover="tinyMCE.plugins.spellchecker._menuButtonEvent(\'over\',this);" onmouseout="tinyMCE.plugins.spellchecker._menuButtonEvent(\'out\',this);">';else h+='<span id="{$editor_id}_'+id+'" class="mceMenuButton">';h+='<a href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" class="mceMenuButtonNormal" target="_self">';h+='<img src="'+img+'" title="{$'+lang+'}" /></a>';h+='<a href="#" onclick="tinyMCE.plugins.spellchecker._toggleMenu(\'{$editor_id}\',\''+mid+'\');return false;" onmousedown="return false;"><img src="{$themeurl}/images/button_menu.gif" title="{$'+lang+'}" class="mceMenuButton" />';h+='</a></span>';}return h;},_menuButtonEvent:function(e,o){var t=this;window.setTimeout(function(){t._menuButtonEvent2(e,o);},1);},_menuButtonEvent2:function(e,o){if(o.className=='mceMenuButtonFocus')return;if(e=='over')o.className=o.className+' mceMenuHover';else o.className=o.className.replace(/\s.*$/,'');},_toggleMenu:function(editor_id,id){var self=TinyMCE_SpellCheckerPlugin;var e=document.getElementById(editor_id+'_spellchecker');var inst=tinyMCE.getInstanceById(editor_id);if(self._menu.isVisible()){tinyMCE.hideMenus();return;}tinyMCE.lastMenuBtnClass=e.className.replace(/\s.*$/,'');tinyMCE.switchClass(editor_id+'_spellchecker','mceMenuButtonFocus');self._menu.moveRelativeTo(e,'bl');self._menu.moveBy(tinyMCE.isMSIE&&!tinyMCE.isOpera?0:1,-1);if(tinyMCE.isOpera)self._menu.moveBy(0,-2);self._onMenuEvent(inst,self._menu,'show');self._menu.show();tinyMCE.lastSelectedMenuBtn=editor_id+'_spellchecker';},_onMenuEvent:function(inst,m,n){TinyMCE_SpellCheckerPlugin._buildSettingsMenu(inst,inst.spellCheckerLang);},execCommand:function(editor_id,element,command,user_interface,value){var inst=tinyMCE.getInstanceById(editor_id),self=TinyMCE_SpellCheckerPlugin,args='',co,bb,mb,nl,i,e,mbs;switch(command){case"mceSpellCheck":if(!inst.spellcheckerOn){inst.spellCheckerBookmark=inst.selection.getBookmark();if(tinyMCE.isRealIE)tinyMCE.setInnerHTML(inst.getBody(),inst.getBody().innerHTML);args+='id='+inst.editorId+"|"+(++self._counter);args+='&cmd=spell&check='+encodeURIComponent(self._getWordList(inst.getBody())).replace(/\'/g,'%27');args+='&lang='+escape(inst.spellCheckerLang);co=document.getElementById(inst.editorId+'_parent').firstChild;bb=self._getBlockBoxLayer(inst);bb.moveRelativeTo(co,'tl');bb.resizeTo(co.offsetWidth,co.offsetHeight);bb.show();mb=self._getMsgBoxLayer(inst);e=mb.getElement();if(e.childNodes[0])e.removeChild(e.childNodes[0]);mbs=document.createElement("span");mbs.innerHTML='<span>'+tinyMCE.getLang('lang_spellchecker_swait','',true)+'</span>';e.appendChild(mbs);mb.show();mb.moveRelativeTo(co,'cc');if(tinyMCE.isMSIE&&!tinyMCE.isOpera){nl=co.getElementsByTagName('select');for(i=0;i<nl.length;i++)nl[i].disabled=true;}inst.spellcheckerOn=true;tinyMCE.switchClass(editor_id+'_spellchecker','mceMenuButtonSelected');self._sendAjax(self.baseURL+self._ajaxPage,self._ajaxResponse,'post',args);}else{self._removeWords(inst.getDoc());inst.spellcheckerOn=false;tinyMCE.switchClass(editor_id+'_spellchecker','mceMenuButton');}return true;case"mceSpellCheckReplace":if(inst.spellCheckerElm)tinyMCE.setOuterHTML(inst.spellCheckerElm,value);self._checkDone(inst);self._contextMenu.hide();self._menu.hide();return true;case"mceSpellCheckIgnore":if(inst.spellCheckerElm)self._removeWord(inst.spellCheckerElm);self._checkDone(inst);self._contextMenu.hide();self._menu.hide();return true;case"mceSpellCheckIgnoreAll":if(inst.spellCheckerElm)self._removeWords(inst.getDoc(),inst.spellCheckerElm.innerHTML);self._checkDone(inst);self._contextMenu.hide();self._menu.hide();return true;case"mceSpellCheckerSetLang":tinyMCE.hideMenus();inst.spellCheckerLang=value;self._removeWords(inst.getDoc());inst.spellcheckerOn=false;tinyMCE.switchClass(editor_id+'_spellchecker','mceMenuButton');return true;}return false;},cleanup:function(type,content,inst){switch(type){case"get_from_editor_dom":TinyMCE_SpellCheckerPlugin._removeWords(content,null,true);inst.spellcheckerOn=false;break;}return content;},_displayUI:function(inst){var self=TinyMCE_SpellCheckerPlugin;var bb=self._getBlockBoxLayer(inst);var mb=self._getMsgBoxLayer(inst);var nl,i;var co=document.getElementById(inst.editorId+'_parent').firstChild;if(tinyMCE.isMSIE&&!tinyMCE.isOpera){nl=co.getElementsByTagName('select');for(i=0;i<nl.length;i++)nl[i].disabled=false;}bb.hide();mb.hide();},_ajaxResponse:function(xml){var el=xml?xml.documentElement:null;var inst=tinyMCE.selectedInstance,self=TinyMCE_SpellCheckerPlugin;var cmd=el?el.getAttribute("cmd"):null,err,id=el?el.getAttribute("id"):null;if(id)inst=tinyMCE.getInstanceById(id.substring(0,id.indexOf('|')));self._displayUI(inst);if(cmd=="suggest"&&id!=inst.editorId+"|"+self._counter)return;if(!el){inst.spellcheckerOn=false;tinyMCE.switchClass(inst.editorId+'_spellchecker','mceMenuButton');alert("Could not execute AJAX call, server didn't return valid a XML.");return;}err=el.getAttribute("error");if(err=="true"){inst.spellcheckerOn=false;tinyMCE.switchClass(inst.editorId+'_spellchecker','mceMenuButton');alert(el.getAttribute("msg"));return;}switch(cmd){case"spell":if(xml.documentElement.firstChild){self._markWords(inst.getDoc(),inst.getBody(),decodeURIComponent(el.firstChild.nodeValue).split('+'));inst.selection.moveToBookmark(inst.spellCheckerBookmark);if(tinyMCE.getParam('spellchecker_report_misspellings',false))alert(tinyMCE.getLang('lang_spellchecker_mpell_found','',true,{words:self._countWords(inst)}));}else alert(tinyMCE.getLang('lang_spellchecker_no_mpell','',true));self._checkDone(inst);inst.useCSS=false;break;case"suggest":self._buildMenu(el.firstChild?decodeURIComponent(el.firstChild.nodeValue).split('+'):null,10);self._contextMenu.show();break;}},_getWordSeparators:function(){var i,re='',ch=tinyMCE.getParam('spellchecker_word_separator_chars','\\s!"#$%&()*+,-./:;<=>?@[\]^_{|}\u201d\u201c');for(i=0;i<ch.length;i++)re+='\\'+ch.charAt(i);return re;},_getWordList:function(n){var i,x,s,nv='',nl=tinyMCE.getNodeTree(n,new Array(),3),wl=new Array();var re=TinyMCE_SpellCheckerPlugin._getWordSeparators();for(i=0;i<nl.length;i++){if(!new RegExp('/SCRIPT|STYLE/').test(nl[i].parentNode.nodeName))nv+=nl[i].nodeValue+" ";}nv=nv.replace(new RegExp('([0-9]|['+re+'])','g'),' ');nv=tinyMCE.trim(nv.replace(/(\s+)/g,' '));nl=nv.split(/\s+/);for(i=0;i<nl.length;i++){s=false;for(x=0;x<wl.length;x++){if(wl[x]==nl[i]){s=true;break;}}if(!s&&nl[i].length>0)wl[wl.length]=nl[i];}return wl.join(' ');},_removeWords:function(doc,word,cleanup){var i,c,nl=doc.getElementsByTagName("span");var self=TinyMCE_SpellCheckerPlugin;var inst=tinyMCE.selectedInstance,b=inst?inst.selection.getBookmark():null;word=typeof(word)=='undefined'?null:word;for(i=nl.length-1;i>=0;i--){c=tinyMCE.getAttrib(nl[i],'class');if((c=='mceItemHiddenSpellWord'||c=='mceItemHidden')&&(word==null||nl[i].innerHTML==word))self._removeWord(nl[i]);}if(b&&!cleanup)inst.selection.moveToBookmark(b);},_checkDone:function(inst){var self=TinyMCE_SpellCheckerPlugin;var w=self._countWords(inst);if(w==0){self._removeWords(inst.getDoc());inst.spellcheckerOn=false;tinyMCE.switchClass(inst.editorId+'_spellchecker','mceMenuButton');}},_countWords:function(inst){var i,w=0,nl=inst.getDoc().getElementsByTagName("span"),c;var self=TinyMCE_SpellCheckerPlugin;for(i=nl.length-1;i>=0;i--){c=tinyMCE.getAttrib(nl[i],'class');if(c=='mceItemHiddenSpellWord')w++;}return w;},_removeWord:function(e){if(e!=null)tinyMCE.setOuterHTML(e,e.innerHTML);},_markWords:function(doc,n,wl){var i,nv,nn,nl=tinyMCE.getNodeTree(n,new Array(),3);var r1,r2,r3,r4,r5,w='';var re=TinyMCE_SpellCheckerPlugin._getWordSeparators();for(i=0;i<wl.length;i++){if(wl[i].length>0)w+=wl[i]+((i==wl.length-1)?'':'|');}for(i=0;i<nl.length;i++){nv=nl[i].nodeValue;r1=new RegExp('(['+re+'])('+w+')(['+re+'])','g');r2=new RegExp('^('+w+')','g');r3=new RegExp('('+w+')(['+re+']?)$','g');r4=new RegExp('^('+w+')(['+re+']?)$','g');r5=new RegExp('('+w+')(['+re+'])','g');if(r1.test(nv)||r2.test(nv)||r3.test(nv)||r4.test(nv)){nv=tinyMCE.xmlEncode(nv);nv=nv.replace(r5,'<span class="mceItemHiddenSpellWord">$1</span>$2');nv=nv.replace(r3,'<span class="mceItemHiddenSpellWord">$1</span>$2');nn=doc.createElement('span');nn.className="mceItemHidden";nn.innerHTML=nv;nl[i].parentNode.replaceChild(nn,nl[i]);}}},_buildMenu:function(sg,max){var i,self=TinyMCE_SpellCheckerPlugin,cm=self._contextMenu;cm.clear();if(sg!=null){cm.addTitle(tinyMCE.getLang('lang_spellchecker_sug','',true));for(i=0;i<sg.length&&i<max;i++)cm.addItem(sg[i],'tinyMCE.execCommand("mceSpellCheckReplace",false,"'+sg[i]+'");');cm.addSeparator();}else cm.addTitle(tinyMCE.getLang('lang_spellchecker_no_sug','',true));cm.addItem(tinyMCE.getLang('lang_spellchecker_ignore_word','',true),'tinyMCE.execCommand(\'mceSpellCheckIgnore\');');cm.addItem(tinyMCE.getLang('lang_spellchecker_ignore_words','',true),'tinyMCE.execCommand(\'mceSpellCheckIgnoreAll\');');cm.update();},_getAjaxHTTP:function(){try{return new ActiveXObject('Msxml2.XMLHTTP')}catch(e){try{return new ActiveXObject('Microsoft.XMLHTTP')}catch(e){return new XMLHttpRequest();}}},_sendAjax:function(u,f,m,a){var x=TinyMCE_SpellCheckerPlugin._getAjaxHTTP();x.open(m,u,true);x.onreadystatechange=function(){if(x.readyState==4)f(x.responseXML);};if(m=='post')x.setRequestHeader('Content-type','application/x-www-form-urlencoded');x.send(a);}};tinyMCE.addPlugin('spellchecker',TinyMCE_SpellCheckerPlugin);
\ No newline at end of file
+/**
+ * $Id: editor_plugin_src.js 425 2007-11-21 15:17:39Z spocke $
+ *
+ * @author Moxiecode
+ * @copyright Copyright  2004-2008, Moxiecode Systems AB, All rights reserved.
+ */
+
+(function() {
+	var JSONRequest = tinymce.util.JSONRequest, each = tinymce.each, DOM = tinymce.DOM;
+
+	tinymce.create('tinymce.plugins.SpellcheckerPlugin', {
+		getInfo : function() {
+			return {
+				longname : 'Spellchecker',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		},
+
+		init : function(ed, url) {
+			var t = this, cm;
+
+			t.url = url;
+			t.editor = ed;
+
+			// Register commands
+			ed.addCommand('mceSpellCheck', function() {
+				if (!t.active) {
+					ed.setProgressState(1);
+					t._sendRPC('checkWords', [t.selectedLang, t._getWords()], function(r) {
+						if (r.length > 0) {
+							t.active = 1;
+							t._markWords(r);
+							ed.setProgressState(0);
+							ed.nodeChanged();
+						} else {
+							ed.setProgressState(0);
+							ed.windowManager.alert('spellchecker.no_mpell');
+						}
+					});
+				} else
+					t._done();
+			});
+
+			ed.onInit.add(function() {
+				if (ed.settings.content_css !== false)
+					ed.dom.loadCSS(url + '/css/content.css');
+			});
+
+			ed.onClick.add(t._showMenu, t);
+			ed.onContextMenu.add(t._showMenu, t);
+			ed.onBeforeGetContent.add(function() {
+				if (t.active)
+					t._removeWords();
+			});
+
+			ed.onNodeChange.add(function(ed, cm) {
+				cm.setActive('spellchecker', t.active);
+			});
+
+			ed.onSetContent.add(function() {
+				t._done();
+			});
+
+			ed.onBeforeGetContent.add(function() {
+				t._done();
+			});
+
+			ed.onBeforeExecCommand.add(function(ed, cmd) {
+				if (cmd == 'mceFullScreen')
+					t._done();
+			});
+
+			// Find selected language
+			t.languages = {};
+			each(ed.getParam('spellchecker_languages', '+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv', 'hash'), function(v, k) {
+				if (k.indexOf('+') === 0) {
+					k = k.substring(1);
+					t.selectedLang = v;
+				}
+
+				t.languages[k] = v;
+			});
+		},
+
+		createControl : function(n, cm) {
+			var t = this, c, ed = t.editor;
+
+			if (n == 'spellchecker') {
+				c = cm.createSplitButton(n, {title : 'spellchecker.desc', cmd : 'mceSpellCheck', scope : t});
+
+				c.onRenderMenu.add(function(c, m) {
+					m.add({title : 'spellchecker.langs', 'class' : 'mceMenuItemTitle'}).setDisabled(1);
+					each(t.languages, function(v, k) {
+						var o = {icon : 1}, mi;
+
+						o.onclick = function() {
+							mi.setSelected(1);
+							t.selectedItem.setSelected(0);
+							t.selectedItem = mi;
+							t.selectedLang = v;
+						};
+
+						o.title = k;
+						mi = m.add(o);
+						mi.setSelected(v == t.selectedLang);
+
+						if (v == t.selectedLang)
+							t.selectedItem = mi;
+					})
+				});
+
+				return c;
+			}
+		},
+
+		// Internal functions
+
+		_walk : function(n, f) {
+			var d = this.editor.getDoc(), w;
+
+			if (d.createTreeWalker) {
+				w = d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false);
+
+				while ((n = w.nextNode()) != null)
+					f.call(this, n);
+			} else
+				tinymce.walk(n, f, 'childNodes');
+		},
+
+		_getSeparators : function() {
+			var re = '', i, str = this.editor.getParam('spellchecker_word_separator_chars', '\\s!"#$%&()*+,-./:;<=>?@[\]^_{|}\u201d\u201c');
+
+			// Build word separator regexp
+			for (i=0; i<str.length; i++)
+				re += '\\' + str.charAt(i);
+
+			return re;
+		},
+
+		_getWords : function() {
+			var ed = this.editor, wl = [], tx = '', lo = {};
+
+			// Get area text
+			this._walk(ed.getBody(), function(n) {
+				if (n.nodeType == 3)
+					tx += n.nodeValue + ' ';
+			});
+
+			// Split words by separator
+			tx = tx.replace(new RegExp('([0-9]|[' + this._getSeparators() + '])', 'g'), ' ');
+			tx = tinymce.trim(tx.replace(/(\s+)/g, ' '));
+
+			// Build word array and remove duplicates
+			each(tx.split(' '), function(v) {
+				if (!lo[v]) {
+					wl.push(v);
+					lo[v] = 1;
+				}
+			});
+
+			return wl;
+		},
+
+		_removeWords : function(w) {
+			var ed = this.editor, dom = ed.dom, se = ed.selection, b = se.getBookmark();
+
+			each(dom.select('span').reverse(), function(n) {
+				if (n && (dom.hasClass(n, 'mceItemHiddenSpellWord') || dom.hasClass(n, 'mceItemHidden'))) {
+					if (!w || dom.decode(n.innerHTML) == w)
+						dom.remove(n, 1);
+				}
+			});
+
+			se.moveToBookmark(b);
+		},
+
+		_markWords : function(wl) {
+			var r1, r2, r3, r4, r5, w = '', ed = this.editor, re = this._getSeparators(), dom = ed.dom, nl = [];
+			var se = ed.selection, b = se.getBookmark();
+
+			each(wl, function(v) {
+				w += (w ? '|' : '') + v;
+			});
+
+			r1 = new RegExp('([' + re + '])(' + w + ')([' + re + '])', 'g');
+			r2 = new RegExp('^(' + w + ')', 'g');
+			r3 = new RegExp('(' + w + ')([' + re + ']?)$', 'g');
+			r4 = new RegExp('^(' + w + ')([' + re + ']?)$', 'g');
+			r5 = new RegExp('(' + w + ')([' + re + '])', 'g');
+
+			// Collect all text nodes
+			this._walk(this.editor.getBody(), function(n) {
+				if (n.nodeType == 3) {
+					nl.push(n);
+				}
+			});
+
+			// Wrap incorrect words in spans
+			each(nl, function(n) {
+				var v;
+
+				if (n.nodeType == 3) {
+					v = n.nodeValue;
+
+					if (r1.test(v) || r2.test(v) || r3.test(v) || r4.test(v)) {
+						v = dom.encode(v);
+						v = v.replace(r5, '<span class="mceItemHiddenSpellWord">$1</span>$2');
+						v = v.replace(r3, '<span class="mceItemHiddenSpellWord">$1</span>$2');
+
+						dom.replace(dom.create('span', {'class' : 'mceItemHidden'}, v), n);
+					}
+				}
+			});
+
+			se.moveToBookmark(b);
+		},
+
+		_showMenu : function(ed, e) {
+			var t = this, ed = t.editor, m = t._menu, p1, dom = ed.dom, vp = dom.getViewPort(ed.getWin());
+
+			if (!m) {
+				p1 = DOM.getPos(ed.getContentAreaContainer());
+				//p2 = DOM.getPos(ed.getContainer());
+
+				m = ed.controlManager.createDropMenu('spellcheckermenu', {
+					offset_x : p1.x,
+					offset_y : p1.y,
+					'class' : 'mceNoIcons'
+				});
+
+				t._menu = m;
+			}
+
+			if (dom.hasClass(e.target, 'mceItemHiddenSpellWord')) {
+				m.removeAll();
+				m.add({title : 'spellchecker.wait', 'class' : 'mceMenuItemTitle'}).setDisabled(1);
+
+				t._sendRPC('getSuggestions', [t.selectedLang, dom.decode(e.target.innerHTML)], function(r) {
+					m.removeAll();
+
+					if (r.length > 0) {
+						m.add({title : 'spellchecker.sug', 'class' : 'mceMenuItemTitle'}).setDisabled(1);
+						each(r, function(v) {
+							m.add({title : v, onclick : function() {
+								dom.replace(ed.getDoc().createTextNode(v), e.target);
+								t._checkDone();
+							}});
+						});
+
+						m.addSeparator();
+					} else
+						m.add({title : 'spellchecker.no_sug', 'class' : 'mceMenuItemTitle'}).setDisabled(1);
+
+					m.add({
+						title : 'spellchecker.ignore_word',
+						onclick : function() {
+							dom.remove(e.target, 1);
+							t._checkDone();
+						}
+					});
+
+					m.add({
+						title : 'spellchecker.ignore_words',
+						onclick : function() {
+							t._removeWords(dom.decode(e.target.innerHTML));
+							t._checkDone();
+						}
+					});
+
+					m.update();
+				});
+
+				ed.selection.select(e.target);
+				p1 = dom.getPos(e.target);
+				m.showMenu(p1.x, p1.y + e.target.offsetHeight - vp.y);
+
+				return tinymce.dom.Event.cancel(e);
+			} else
+				m.hideMenu();
+		},
+
+		_checkDone : function() {
+			var t = this, ed = t.editor, dom = ed.dom, o;
+
+			each(dom.select('span'), function(n) {
+				if (n && dom.hasClass(n, 'mceItemHiddenSpellWord')) {
+					o = true;
+					return false;
+				}
+			});
+
+			if (!o)
+				t._done();
+		},
+
+		_done : function() {
+			var t = this, la = t.active;
+
+			if (t.active) {
+				t.active = 0;
+				t._removeWords();
+
+				if (t._menu)
+					t._menu.hideMenu();
+
+				if (la)
+					t.editor.nodeChanged();
+			}
+		},
+
+		_sendRPC : function(m, p, cb) {
+			var t = this, url = t.editor.getParam("spellchecker_rpc_url", this.url+"/rpc.php");
+
+			if (url == '{backend}') {
+				t.editor.setProgressState(0);
+				alert('Please specify: spellchecker_rpc_url');
+				return;
+			}
+
+			JSONRequest.sendRPC({
+				url : url,
+				method : m,
+				params : p,
+				success : cb,
+				error : function(e, x) {
+					t.editor.setProgressState(0);
+					t.editor.windowManager.alert(e.errstr || ('Error response: ' + x.responseText));
+				}
+			});
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('spellchecker', tinymce.plugins.SpellcheckerPlugin);
+})();
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/images/spellchecker.gif 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/images/spellchecker.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/images/spellchecker.gif	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/images/spellchecker.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-GIF89a       VNWHCMUPZb]g!"&fiu./38:Az|qu0HoݐůկѭCFN|ғOR[adm0P@`Pp`p]vxރjszՙŭݣɭZ^h0X7]@hPxHj`a}ߐѯհӺQpUdoqu@ACxy{@hQvp7ePVЖxmt| (0PX`
-CKNNVWppp000                                                                                             !  ` ,       `LEI!UKTJT[`\`6
-Y`XZ] @		
-
`W
`"HS-^Z	
	_M;4P:F2؃GRF׈CV<;݇3>,D`+OQA))*B.)$~('p%t丑H܀aQЋ	=:IP  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/images/wline.gif 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/images/wline.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/images/wline.gif	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/images/wline.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a   **!   ,       Df ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/img/wline.gif 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/img/wline.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/img/wline.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/img/wline.gif	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1 @@
+GIF89a   **!   ,       Df ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/includes/general.php 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/includes/general.php
--- 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/includes/general.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/includes/general.php	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,98 @@
+<?php
+/**
+ * general.php
+ *
+ * @package MCManager.includes
+ * @author Moxiecode
+ * @copyright Copyright  2007, Moxiecode Systems AB, All rights reserved.
+ */
+
+@error_reporting(E_ALL ^ E_NOTICE);
+$config = array();
+
+require_once(dirname(__FILE__) . "/../classes/utils/Logger.php");
+require_once(dirname(__FILE__) . "/../classes/utils/JSON.php");
+require_once(dirname(__FILE__) . "/../config.php");
+require_once(dirname(__FILE__) . "/../classes/SpellChecker.php");
+
+if (isset($config['general.engine']))
+	require_once(dirname(__FILE__) . "/../classes/" . $config["general.engine"] . ".php");
+
+/**
+ * Returns an request value by name without magic quoting.
+ *
+ * @param String $name Name of parameter to get.
+ * @param String $default_value Default value to return if value not found.
+ * @return String request value by name without magic quoting or default value.
+ */
+function getRequestParam($name, $default_value = false, $sanitize = false) {
+	if (!isset($_REQUEST[$name]))
+		return $default_value;
+
+	if (is_array($_REQUEST[$name])) {
+		$newarray = array();
+
+		foreach ($_REQUEST[$name] as $name => $value)
+			$newarray[formatParam($name, $sanitize)] = formatParam($value, $sanitize);
+
+		return $newarray;
+	}
+
+	return formatParam($_REQUEST[$name], $sanitize);
+}
+
+function &getLogger() {
+	global $mcLogger, $man;
+
+	if (isset($man))
+		$mcLogger = $man->getLogger();
+
+	if (!$mcLogger) {
+		$mcLogger = new Moxiecode_Logger();
+
+		// Set logger options
+		$mcLogger->setPath(dirname(__FILE__) . "/../logs");
+		$mcLogger->setMaxSize("100kb");
+		$mcLogger->setMaxFiles("10");
+		$mcLogger->setFormat("{time} - {message}");
+	}
+
+	return $mcLogger;
+}
+
+function debug($msg) {
+	$args = func_get_args();
+
+	$log = getLogger();
+	$log->debug(implode(', ', $args));
+}
+
+function info($msg) {
+	$args = func_get_args();
+
+	$log = getLogger();
+	$log->info(implode(', ', $args));
+}
+
+function error($msg) {
+	$args = func_get_args();
+
+	$log = getLogger();
+	$log->error(implode(', ', $args));
+}
+
+function warn($msg) {
+	$args = func_get_args();
+
+	$log = getLogger();
+	$log->warn(implode(', ', $args));
+}
+
+function fatal($msg) {
+	$args = func_get_args();
+
+	$log = getLogger();
+	$log->fatal(implode(', ', $args));
+}
+
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/langs/en.js 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/langs/en.js
--- 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/langs/en.js	2007-03-06 22:26:26.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/langs/en.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,15 +0,0 @@
-// UK lang variables
-
-tinyMCE.addToLang('spellchecker',{
-	desc : 'Toggle spellchecker',
-	menu : 'Spellchecker settings',
-	ignore_word : 'Ignore word',
-	ignore_words : 'Ignore all',
-	langs : 'Languages',
-	wait : 'Please wait...',
-	swait : 'Spellchecking, please wait...',
-	sug : 'Suggestions',
-	no_sug : 'No suggestions',
-	no_mpell : 'No misspellings found.',
-	mpell_found : 'Found {$words} misspellings.'
-});
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/rpc.php 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/rpc.php
--- 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/rpc.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/rpc.php	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,75 @@
+<?php
+/**
+ * $Id: rpc.php 354 2007-11-05 20:48:49Z spocke $
+ *
+ * @author Moxiecode
+ * @copyright Copyright  2004-2007, Moxiecode Systems AB, All rights reserved.
+ */
+
+require_once("./includes/general.php");
+
+// Set RPC response headers
+header('Content-Type: text/plain');
+header('Content-Encoding: UTF-8');
+header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
+header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
+header("Cache-Control: no-store, no-cache, must-revalidate");
+header("Cache-Control: post-check=0, pre-check=0", false);
+header("Pragma: no-cache");
+
+$raw = "";
+
+// Try param
+if (isset($_POST["json_data"]))
+	$raw = getRequestParam("json_data");
+
+// Try globals array
+if (!$raw && isset($_GLOBALS) && isset($_GLOBALS["HTTP_RAW_POST_DATA"]))
+	$raw = $_GLOBALS["HTTP_RAW_POST_DATA"];
+
+// Try globals variable
+if (!$raw && isset($HTTP_RAW_POST_DATA))
+	$raw = $HTTP_RAW_POST_DATA;
+
+// Try stream
+if (!$raw) {
+	if (!function_exists('file_get_contents')) {
+		$fp = fopen("php://input", "r");
+		if ($fp) {
+			$raw = "";
+
+			while (!feof($fp))
+				$raw = fread($fp, 1024);
+
+			fclose($fp);
+		}
+	} else
+		$raw = "" . file_get_contents("php://input");
+}
+
+// No input data
+if (!$raw)
+	die('{"result":null,"id":null,"error":{"errstr":"Could not get raw post data.","errfile":"","errline":null,"errcontext":"","level":"FATAL"}}');
+
+// Get JSON data
+$json = new Moxiecode_JSON();
+$input = $json->decode($raw);
+
+// Execute RPC
+if (isset($config['general.engine'])) {
+	$spellchecker = new $config['general.engine']($config);
+	$result = call_user_func_array(array($spellchecker, $input['method']), $input['params']);
+} else
+	die('{"result":null,"id":null,"error":{"errstr":"You must choose an spellchecker engine in the config.php file.","errfile":"","errline":null,"errcontext":"","level":"FATAL"}}');
+
+// Request and response id should always be the same
+$output = array(
+	"id" => $input->id,
+	"result" => $result,
+	"error" => null
+);
+
+// Return JSON encoded string
+echo $json->encode($output);
+
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/tinyspell.php 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/tinyspell.php
--- 2.2.2.src/wp-includes/js/tinymce/plugins/spellchecker/tinyspell.php	2007-03-06 22:26:26.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/spellchecker/tinyspell.php	1969-12-31 18:00:00.000000000 -0600
@@ -1,142 +0,0 @@
-<?php
-/**
- * $RCSfile: tinyspell.php,v $
- * $Revision: 1.1 $
- * $Date: 2006/03/14 17:33:47 $
- *
- * @author Moxiecode
- * @copyright Copyright  2004-2006, Moxiecode Systems AB, All rights reserved.
- */
-
-	// Ignore the Notice errors for now.
-	error_reporting(E_ALL ^ E_NOTICE);
-
-	require_once("config.php");
-
-	$id = sanitize($_POST['id'], "loose");
-
-	if (!$spellCheckerConfig['enabled']) {
-		header('Content-type: text/xml; charset=utf-8');
-		echo '<?xml version="1.0" encoding="utf-8" ?><res id="' . $id . '" error="true" msg="You must enable the spellchecker by modifying the config.php file." />';
-		die;
-	}
-
-	// Basic config
-	$defaultLanguage = $spellCheckerConfig['default.language'];
-	$defaultMode = $spellCheckerConfig['default.mode'];
-
-	// Normaly not required to configure
-	$defaultSpelling = $spellCheckerConfig['default.spelling'];
-	$defaultJargon = $spellCheckerConfig['default.jargon'];
-	$defaultEncoding = $spellCheckerConfig['default.encoding'];
-	$outputType = "xml"; // Do not change
-
-	// Get input parameters.
-
-	$check = urldecode($_REQUEST['check']);
-	$cmd = sanitize($_REQUEST['cmd']);
-	$lang = sanitize($_REQUEST['lang'], "strict");
-	$mode = sanitize($_REQUEST['mode'], "strict");
-	$spelling = sanitize($_REQUEST['spelling'], "strict");
-	$jargon = sanitize($_REQUEST['jargon'], "strict");
-	$encoding = sanitize($_REQUEST['encoding'], "strict");
-	$sg = sanitize($_REQUEST['sg'], "bool");
-	$words = array();
-
-	$validRequest = true;
-
-	if (empty($check))
-		$validRequest = false;
-
-	if (empty($lang))
-		$lang = $defaultLanguage;
-
-	if (empty($mode))
-		$mode = $defaultMode;
-
-	if (empty($spelling))
-		$spelling = $defaultSpelling;
-
-	if (empty($jargon))
-		$jargon = $defaultJargon;
-
-	if (empty($encoding))
-		$encoding = $defaultEncoding;
-
-	function sanitize($str, $type="strict") {
-		switch ($type) {
-			case "strict":
-				$str = preg_replace("/[^a-zA-Z0-9_\-]/i", "", $str);
-			break;
-			case "loose":
-				$str = preg_replace("/</i", "&gt;", $str);
-				$str = preg_replace("/>/i", "&lt;", $str);
-			break;
-			case "bool":
-				if ($str == "true" || $str == true)
-					$str = true;
-				else
-					$str = false;
-			break;
-		}
-
-		return $str;
-	}
-
-	$result = array();
-	$tinyspell = new $spellCheckerConfig['class']($spellCheckerConfig, $lang, $mode, $spelling, $jargon, $encoding);
-
-	if (count($tinyspell->errorMsg) == 0) {
-		switch($cmd) {
-			case "spell":
-				// Space for non-exec version and \n for the exec version.
-				$words = preg_split("/ |\n/", $check, -1, PREG_SPLIT_NO_EMPTY);
-				$result = $tinyspell->checkWords($words);
-			break;
-	
-			case "suggest":
-				$result = $tinyspell->getSuggestion($check);
-			break;
-
-			default:
-				// Just use this for now.
-				$tinyspell->errorMsg[] = "No command.";
-				$outputType = $outputType . "error";
-			break;
-		}
-	} else
-		$outputType = $outputType . "error";
-
-	if (!$result)
-		$result = array();
-
-	// Output data
-	switch($outputType) {
-		case "xml":
-			header('Content-type: text/xml; charset=utf-8');
-			$body  = '<?xml version="1.0" encoding="utf-8" ?>';
-			$body .= "\n";
-			
-			if (count($result) == 0)
-				$body .= '<res id="' . $id . '" cmd="'. $cmd .'" />';
-			else
-				$body .= '<res id="' . $id . '" cmd="'. $cmd .'">'. urlencode(implode(" ", $result)) .'</res>';
-
-			echo $body;
-		break;
-		case "xmlerror";
-			header('Content-type: text/xml; charset=utf-8');
-			$body  = '<?xml version="1.0" encoding="utf-8" ?>';
-			$body .= "\n";
-			$body .= '<res id="' . $id . '" cmd="'. $cmd .'" error="true" msg="'. implode(" ", $tinyspell->errorMsg) .'" />';
-			echo $body;
-		break;
-		case "html":
-			var_dump($result);
-		break;
-		case "htmlerror":
-			echo "Error";
-		break;
-	}
-
-?>
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/css/content.css 2.5.src/wp-includes/js/tinymce/plugins/wordpress/css/content.css
--- 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/css/content.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/wordpress/css/content.css	2008-01-31 12:10:46.000000000 -0600
@@ -0,0 +1,15 @@
+
+.mceWPnextpage, .mceWPmore {
+	border: 0px;
+	border-top: 1px dotted #cccccc;
+	display: block;
+	width: 100%;
+	height: 12px;
+	margin-top: 15px;
+}
+.mceWPmore {
+	background: #ffffff url(../img/more_bug.gif) no-repeat right top;
+}
+.mceWPnextpage {
+    background: #ffffff url(../img/page_bug.gif) no-repeat right top;
+}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js 2.5.src/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js
--- 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js	2007-04-12 12:04:03.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js	2008-03-23 11:37:06.000000000 -0500
@@ -1,592 +1,215 @@
-/* Import plugin specific language pack */
-tinyMCE.importPluginLanguagePack('wordpress', 'en');
-
-var TinyMCE_wordpressPlugin = {
-	getInfo : function() {
-		return {
-			longname : 'WordPress Plugin',
-			author : 'WordPress',
-			authorurl : 'http://wordpress.org',
-			infourl : 'http://wordpress.org',
-			version : '1'
-		};
-	},
-
-	getControlHTML : function(control_name) {
-		switch (control_name) {
-			case "wp_more":
-				return tinyMCE.getButtonHTML(control_name, 'lang_wordpress_more_button', '{$pluginurl}/images/more.gif', 'wpMore');
-			case "wp_page":
-				return tinyMCE.getButtonHTML(control_name, 'lang_wordpress_page_button', '{$pluginurl}/images/page.gif', 'wpPage');
-			case "wp_help":
-				var buttons = tinyMCE.getButtonHTML(control_name, 'lang_help_button_title', '{$pluginurl}/images/help.gif', 'wpHelp');
-				var hiddenControls = '<div class="zerosize">'
-				+ '<input type="button" accesskey="n" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSpellCheck\',false);" />'
-				+ '<input type="button" accesskey="k" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Strikethrough\',false);" />'
-				+ '<input type="button" accesskey="l" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'InsertUnorderedList\',false);" />'
-				+ '<input type="button" accesskey="o" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'InsertOrderedList\',false);" />'
-				+ '<input type="button" accesskey="w" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Outdent\',false);" />'
-				+ '<input type="button" accesskey="q" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Indent\',false);" />'
-				+ '<input type="button" accesskey="f" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'JustifyLeft\',false);" />'
-				+ '<input type="button" accesskey="c" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'JustifyCenter\',false);" />'
-				+ '<input type="button" accesskey="r" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'JustifyRight\',false);" />'
-				+ '<input type="button" accesskey="j" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'JustifyFull\',false);" />'
-				+ '<input type="button" accesskey="a" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceLink\',true);" />'
-				+ '<input type="button" accesskey="s" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'unlink\',false);" />'
-				+ '<input type="button" accesskey="m" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceImage\',true);" />'
-				+ '<input type="button" accesskey="t" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'wpMore\');" />'
-				+ '<input type="button" accesskey="g" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'wpPage\');" />'
-				+ '<input type="button" accesskey="u" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Undo\',false);" />'
-				+ '<input type="button" accesskey="y" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Redo\',false);" />'
-				+ '<input type="button" accesskey="h" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'wpHelp\',false);" />'
-				+ '<input type="button" accesskey="b" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Bold\',false);" />'
-				+ '<input type="button" accesskey="v" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'wpAdv\',false);" />'
-				+ '</div>';
-				return buttons+hiddenControls;
-			case "wp_adv":
-				return tinyMCE.getButtonHTML(control_name, 'lang_wordpress_adv_button', '{$pluginurl}/images/toolbars.gif', 'wpAdv');
-			case "wp_adv_start":
-				return '<div id="wpadvbar" style="display:none;"><br />';
-			case "wp_adv_end":
-				return '</div>';
-		}
-		return '';
-	},
-
-	execCommand : function(editor_id, element, command, user_interface, value) {
-		var inst = tinyMCE.getInstanceById(editor_id);
-		var focusElm = inst.getFocusElement();
-		var doc = inst.getDoc();
-
-		function getAttrib(elm, name) {
-			return elm.getAttribute(name) ? elm.getAttribute(name) : "";
-		}
-
-		// Handle commands
-		switch (command) {
-			case "wpMore":
-				var flag = "";
-				var template = new Array();
-				var altMore = tinyMCE.getLang('lang_wordpress_more_alt');
-
-				// Is selection a image
-				if (focusElm != null && focusElm.nodeName.toLowerCase() == "img") {
-					flag = getAttrib(focusElm, 'class');
-
-					if (flag != 'mce_plugin_wordpress_more') // Not a wordpress
-						return true;
-
-					action = "update";
-				}
-
-				html = ''
-					+ '<img src="' + (tinyMCE.getParam("theme_href") + "/images/spacer.gif") + '" '
-					+ ' width="100%" height="10px" '
-					+ 'alt="'+altMore+'" title="'+altMore+'" class="mce_plugin_wordpress_more" name="mce_plugin_wordpress_more" />';
-				tinyMCE.execInstanceCommand(editor_id, 'mceInsertContent', false, html);
-				tinyMCE.selectedInstance.repaint();
-				return true;
-
-			case "wpPage":
-				var flag = "";
-				var template = new Array();
-				var altPage = tinyMCE.getLang('lang_wordpress_more_alt');
-
-				// Is selection a image
-				if (focusElm != null && focusElm.nodeName.toLowerCase() == "img") {
-					flag = getAttrib(focusElm, 'name');
-
-					if (flag != 'mce_plugin_wordpress_page') // Not a wordpress
-						return true;
-
-					action = "update";
-				}
-
-				html = ''
-					+ '<img src="' + (tinyMCE.getParam("theme_href") + "/images/spacer.gif") + '" '
-					+ ' width="100%" height="10px" '
-					+ 'alt="'+altPage+'" title="'+altPage+'" class="mce_plugin_wordpress_page" name="mce_plugin_wordpress_page" />';
-				tinyMCE.execCommand("mceInsertContent",true,html);
-				tinyMCE.selectedInstance.repaint();
-				return true;
-
-			case "wpHelp":
-				var template = new Array();
-
-				template['file']   = tinyMCE.baseURL + '/wp-mce-help.php';
-				template['width']  = 480;
-				template['height'] = 380;
-
-				args = {
-					resizable : 'yes',
-					scrollbars : 'yes'
-				};
-
-				tinyMCE.openWindow(template, args);
-				return true;
-			case "wpAdv":
-				var adv = document.getElementById('wpadvbar');
-				if ( adv.style.display == 'none' ) {
-					adv.style.display = 'block';
-					tinyMCE.switchClass(editor_id + '_wp_adv', 'mceButtonSelected');
+/**
+ * WordPress plugin.
+ */
+
+(function() {
+	var DOM = tinymce.DOM;
+
+	// Load plugin specific language pack
+	tinymce.PluginManager.requireLangPack('wordpress');
+
+	tinymce.create('tinymce.plugins.WordPress', {
+		init : function(ed, url) {
+			var t = this, tbId = ed.getParam('wordpress_adv_toolbar', 'toolbar2');
+            var moreHTML = '<img src="' + url + '/img/trans.gif" class="mceWPmore mceItemNoResize" title="'+ed.getLang('wordpress.wp_more_alt')+'" />';
+            var nextpageHTML = '<img src="' + url + '/img/trans.gif" class="mceWPnextpage mceItemNoResize" title="'+ed.getLang('wordpress.wp_page_alt')+'" />';
+
+			if ( tinymce.util.Cookie.get('kitchenSink') == '1' )
+				ed.settings.wordpress_adv_hidden = 0;
+
+			// Hides the specified toolbar and resizes the iframe
+			ed.onPostRender.add(function() {
+				if ( ed.getParam('wordpress_adv_hidden', 1) ) {
+					DOM.hide(ed.controlManager.get(tbId).id);
+					t._resizeIframe(ed, tbId, 28);
+				}
+			});
+			
+			// Register commands
+			ed.addCommand('WP_More', function() {
+				ed.execCommand('mceInsertContent', 0, moreHTML);
+			});
+			
+			ed.addCommand('WP_Page', function() {
+				ed.execCommand('mceInsertContent', 0, nextpageHTML);
+			});
+			
+			ed.addCommand('WP_Help', function() {
+					ed.windowManager.open({
+						url : tinymce.baseURL + '/wp-mce-help.php',
+						width : 450,
+						height : 420,
+						inline : 1
+					});
+				});
+			
+			ed.addCommand('WP_Adv', function() {
+				var id = ed.controlManager.get(tbId).id, cm = ed.controlManager, cook = tinymce.util.Cookie, date;
+
+				date = new Date();
+        		date.setTime(date.getTime()+(10*365*24*60*60*1000));
+				
+				if (DOM.isHidden(id)) {
+					cm.setActive('wp_adv', 1);
+					DOM.show(id);
+					t._resizeIframe(ed, tbId, -28);
+					ed.settings.wordpress_adv_hidden = 0;
+					cook.set('kitchenSink', '1', date);
 				} else {
-					adv.style.display = 'none';
-					tinyMCE.switchClass(editor_id + '_wp_adv', 'mceButtonNormal');
-				}
-				return true;
-		}
-
-		// Pass to next handler in chain
-		return false;
-	},
-
-	cleanup : function(type, content) {
-		switch (type) {
-
-			case "insert_to_editor":
-				var startPos = 0;
-				var altMore = tinyMCE.getLang('lang_wordpress_more_alt');
-				var altPage = tinyMCE.getLang('lang_wordpress_page_alt');
-
-				// Parse all <!--more--> tags and replace them with images
-				while ((startPos = content.indexOf('<!--more', startPos)) != -1) {
-					var endPos = content.indexOf('-->', startPos) + 3;
-					// Insert image
-					var moreText = content.substring(startPos + 8, endPos - 3);
-					var contentAfter = content.substring(endPos);
-					content = content.substring(0, startPos);
-					content += '<img src="' + (tinyMCE.getParam("theme_href") + "/images/spacer.gif") + '" ';
-					content += ' width="100%" height="10px" moretext="'+moreText+'" ';
-					content += 'alt="'+altMore+'" title="'+altMore+'" class="mce_plugin_wordpress_more" name="mce_plugin_wordpress_more" />';
-					content += contentAfter;
-
-					startPos++;
-				}
-				var startPos = 0;
-
-				// Parse all <!--page--> tags and replace them with images
-				while ((startPos = content.indexOf('<!--nextpage-->', startPos)) != -1) {
-					// Insert image
-					var contentAfter = content.substring(startPos + 15);
-					content = content.substring(0, startPos);
-					content += '<img src="' + (tinyMCE.getParam("theme_href") + "/images/spacer.gif") + '" ';
-					content += ' width="100%" height="10px" ';
-					content += 'alt="'+altPage+'" title="'+altPage+'" class="mce_plugin_wordpress_page" name="mce_plugin_wordpress_page" />';
-					content += contentAfter;
-
-					startPos++;
-				}
-
-				// Look for \n in <pre>, replace with <br>
-				var startPos = -1;
-				while ((startPos = content.indexOf('<pre', startPos+1)) != -1) {
-					var endPos = content.indexOf('</pre>', startPos+1);
-					var innerPos = content.indexOf('>', startPos+1);
-					var chunkBefore = content.substring(0, innerPos);
-					var chunkAfter = content.substring(endPos);
-					
-					var innards = content.substring(innerPos, endPos);
-					innards = innards.replace(/\n/g, '<br />');
-					content = chunkBefore + innards + chunkAfter;
-				}
-
-				break;
-
-			case "get_from_editor":
-				// Parse all img tags and replace them with <!--more-->
-				var startPos = -1;
-				while ((startPos = content.indexOf('<img', startPos+1)) != -1) {
-					var endPos = content.indexOf('/>', startPos);
-					var attribs = this._parseAttributes(content.substring(startPos + 4, endPos));
-
-					if (attribs['class'] == "mce_plugin_wordpress_more" || attribs['name'] == "mce_plugin_wordpress_more") {
-						endPos += 2;
-
-						var moreText = attribs['moretext'] ? attribs['moretext'] : '';
-						var embedHTML = '<!--more'+moreText+'-->';
-
-						// Insert embed/object chunk
-						chunkBefore = content.substring(0, startPos);
-						chunkAfter = content.substring(endPos);
-						content = chunkBefore + embedHTML + chunkAfter;
-					}
-					if (attribs['class'] == "mce_plugin_wordpress_page" || attribs['name'] == "mce_plugin_wordpress_page") {
-						endPos += 2;
-
-						var embedHTML = '<!--nextpage-->';
-
-						// Insert embed/object chunk
-						chunkBefore = content.substring(0, startPos);
-						chunkAfter = content.substring(endPos);
-						content = chunkBefore + embedHTML + chunkAfter;
+					cm.setActive('wp_adv', 0);
+					DOM.hide(id);
+					t._resizeIframe(ed, tbId, 28);
+					ed.settings.wordpress_adv_hidden = 1;
+					cook.set('kitchenSink', '0', date);
+				}
+			});
+
+			// Register buttons
+			ed.addButton('wp_more', {
+				title : 'wordpress.wp_more_desc',
+				image : url + '/img/more.gif',
+				cmd : 'WP_More'
+			});
+
+			ed.addButton('wp_page', {
+				title : 'wordpress.wp_page_desc',
+				image : url + '/img/page.gif',
+				cmd : 'WP_Page'
+			});
+
+			ed.addButton('wp_help', {
+				title : 'wordpress.wp_help_desc',
+				image : url + '/img/help.gif',
+				cmd : 'WP_Help' 
+			});
+
+			ed.addButton('wp_adv', {
+				title : 'wordpress.wp_adv_desc',
+				image : url + '/img/toolbars.gif',
+				cmd : 'WP_Adv'
+			});
+
+			// Add class "alignleft" or "alignright" when selecting align for images.
+			ed.onBeforeExecCommand.add(function( editor, cmd ) {
+				var node, dir, xdir;
+	
+				if ( ( cmd.indexOf('Justify') != -1 ) && ( node = editor.selection.getNode() ) ) {
+					if ( node.nodeName !== 'IMG' ) return;
+					dir = cmd.substring(7).toLowerCase();
+					if ( 'JustifyCenter' == cmd || editor.queryCommandState( cmd ) ) {
+						editor.dom.removeClass( node, "alignleft" );
+						editor.dom.removeClass( node, "alignright" );
+					} else {
+						xdir = ( dir == 'left' ) ? 'right' : 'left';
+						editor.dom.removeClass( node, "align"+xdir );
+						editor.dom.addClass( node, "align"+dir );
 					}
 				}
-
-				// Remove normal line breaks
-				content = content.replace(/\n|\r/g, ' ');
-
-				// Look for <br> in <pre>, replace with \n
-				var startPos = -1;
-				while ((startPos = content.indexOf('<pre', startPos+1)) != -1) {
-					var endPos = content.indexOf('</pre>', startPos+1);
-					var innerPos = content.indexOf('>', startPos+1);
-					var chunkBefore = content.substring(0, innerPos);
-					var chunkAfter = content.substring(endPos);
-					
-					var innards = content.substring(innerPos, endPos);
-					innards = innards.replace(new RegExp('<br\\s?/?>', 'g'), '\n');
-					innards = innards.replace(new RegExp('\\s$', ''), '');
-					content = chunkBefore + innards + chunkAfter;
-				}
-
-				// Remove anonymous, empty paragraphs.
-				content = content.replace(new RegExp('<p>(\\s|&nbsp;)*</p>', 'mg'), '');
-
-				// Handle table badness.
-				content = content.replace(new RegExp('<(table( [^>]*)?)>.*?<((tr|thead)( [^>]*)?)>', 'mg'), '<$1><$3>');
-				content = content.replace(new RegExp('<(tr|thead|tfoot)>.*?<((td|th)( [^>]*)?)>', 'mg'), '<$1><$2>');
-				content = content.replace(new RegExp('</(td|th)>.*?<(td( [^>]*)?|th( [^>]*)?|/tr|/thead|/tfoot)>', 'mg'), '</$1><$2>');
-				content = content.replace(new RegExp('</tr>.*?<(tr|/table)>', 'mg'), '</tr><$1>');
-				content = content.replace(new RegExp('<(/?(table|tbody|tr|th|td)[^>]*)>(\\s*|(<br ?/?>)*)*', 'g'), '<$1>');
-
-				// Pretty it up for the source editor.
-				var blocklist = 'blockquote|ul|ol|li|table|thead|tr|th|td|div|h\\d|pre|p';
-				content = content.replace(new RegExp('\\s*</('+blocklist+')>\\s*', 'mg'), '</$1>\n');
-				content = content.replace(new RegExp('\\s*<(('+blocklist+')[^>]*)>', 'mg'), '\n<$1>');
-				content = content.replace(new RegExp('<((li|/?tr|/?thead|/?tfoot)( [^>]*)?)>', 'g'), '\t<$1>');
-				content = content.replace(new RegExp('<((td|th)( [^>]*)?)>', 'g'), '\t\t<$1>');
-				content = content.replace(new RegExp('\\s*<br ?/?>\\s*', 'mg'), '<br />\n');
-				content = content.replace(new RegExp('^\\s*', ''), '');
-				content = content.replace(new RegExp('\\s*$', ''), '');
-
-				break;
-		}
-
-		// Pass through to next handler in chain
-		return content;
-	},
-
-	handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {
-
-		tinyMCE.switchClass(editor_id + '_wp_more', 'mceButtonNormal');
-		tinyMCE.switchClass(editor_id + '_wp_page', 'mceButtonNormal');
-
-		if (node == null)
-			return;
-
-		do {
-			if (node.nodeName.toLowerCase() == "img" && tinyMCE.getAttrib(node, 'class').indexOf('mce_plugin_wordpress_more') == 0)
-				tinyMCE.switchClass(editor_id + '_wp_more', 'mceButtonSelected');
-			if (node.nodeName.toLowerCase() == "img" && tinyMCE.getAttrib(node, 'class').indexOf('mce_plugin_wordpress_page') == 0)
-				tinyMCE.switchClass(editor_id + '_wp_page', 'mceButtonSelected');
-		} while ((node = node.parentNode));
-
-		return true;
-	},
-
-	saveCallback : function(el, content, body) {
-		// We have a TON of cleanup to do.
-
-		// Mark </p> if it has any attributes.
-		content = content.replace(new RegExp('(<p[^>]+>.*?)</p>', 'mg'), '$1</p#>');
-
-		// Decode the ampersands of time.
-		// content = content.replace(new RegExp('&amp;', 'g'), '&');
-
-		// Get it ready for wpautop.
-		content = content.replace(new RegExp('\\s*<p>', 'mgi'), '');
-		content = content.replace(new RegExp('\\s*</p>\\s*', 'mgi'), '\n\n');
-		content = content.replace(new RegExp('\\n\\s*\\n', 'mgi'), '\n\n');
-		content = content.replace(new RegExp('\\s*<br ?/?>\\s*', 'gi'), '\n');
-
-		// Fix some block element newline issues
-		var blocklist = 'blockquote|ul|ol|li|table|thead|tr|th|td|div|h\\d|pre';
-		content = content.replace(new RegExp('\\s*<(('+blocklist+') ?[^>]*)\\s*>', 'mg'), '\n<$1>');
-		content = content.replace(new RegExp('\\s*</('+blocklist+')>\\s*', 'mg'), '</$1>\n');
-		content = content.replace(new RegExp('<li>', 'g'), '\t<li>');
-
-		// Unmark special paragraph closing tags
-		content = content.replace(new RegExp('</p#>', 'g'), '</p>\n');
-		content = content.replace(new RegExp('\\s*(<p[^>]+>.*</p>)', 'mg'), '\n$1');
-
-		// Trim trailing whitespace
-		content = content.replace(new RegExp('\\s*$', ''), '');
-
-		// Hope.
-		return content;
-
-	},
-
-	_parseAttributes : function(attribute_string) {
-		var attributeName = "";
-		var attributeValue = "";
-		var withInName;
-		var withInValue;
-		var attributes = new Array();
-		var whiteSpaceRegExp = new RegExp('^[ \n\r\t]+', 'g');
-		var titleText = tinyMCE.getLang('lang_wordpress_more');
-		var titleTextPage = tinyMCE.getLang('lang_wordpress_page');
-
-		if (attribute_string == null || attribute_string.length < 2)
-			return null;
-
-		withInName = withInValue = false;
-
-		for (var i=0; i<attribute_string.length; i++) {
-			var chr = attribute_string.charAt(i);
-
-			if ((chr == '"' || chr == "'") && !withInValue)
-				withInValue = true;
-			else if ((chr == '"' || chr == "'") && withInValue) {
-				withInValue = false;
-
-				var pos = attributeName.lastIndexOf(' ');
-				if (pos != -1)
-					attributeName = attributeName.substring(pos+1);
-
-				attributes[attributeName.toLowerCase()] = attributeValue.substring(1);
-
-				attributeName = "";
-				attributeValue = "";
-			} else if (!whiteSpaceRegExp.test(chr) && !withInName && !withInValue)
-				withInName = true;
-
-			if (chr == '=' && withInName)
-				withInName = false;
-
-			if (withInName)
-				attributeName += chr;
-
-			if (withInValue)
-				attributeValue += chr;
-		}
-
-		return attributes;
-	}
-};
-
-tinyMCE.addPlugin("wordpress", TinyMCE_wordpressPlugin);
-
-/* This little hack protects our More and Page placeholders from the removeformat command */
-tinyMCE.orgExecCommand = tinyMCE.execCommand;
-tinyMCE.execCommand = function (command, user_interface, value) {
-	re = this.orgExecCommand(command, user_interface, value);
-
-	if ( command == 'removeformat' ) {
-		var inst = tinyMCE.getInstanceById('mce_editor_0');
-		doc = inst.getDoc();
-		var imgs = doc.getElementsByTagName('img');
-		for (i=0;img=imgs[i];i++)
-			img.className = img.name;
-	}
-	return re;
-};
-wpInstTriggerSave = function (skip_cleanup, skip_callback) {
-	var e, nl = new Array(), i, s;
-
-	this.switchSettings();
-	s = tinyMCE.settings;
-
-	// Force hidden tabs visible while serializing
-	if (tinyMCE.isMSIE && !tinyMCE.isOpera) {
-		e = this.iframeElement;
-
-		do {
-			if (e.style && e.style.display == 'none') {
-				e.style.display = 'block';
-				nl[nl.length] = {elm : e, type : 'style'};
+			});
+			
+			// Add listeners to handle more break
+			t._handleMoreBreak(ed, url);
+			
+			// Add custom shortcuts
+			ed.addShortcut('alt+shift+c', ed.getLang('justifycenter_desc'), 'JustifyCenter');
+			ed.addShortcut('alt+shift+r', ed.getLang('justifyright_desc'), 'JustifyRight');
+			ed.addShortcut('alt+shift+l', ed.getLang('justifyleft_desc'), 'JustifyLeft');
+			ed.addShortcut('alt+shift+j', ed.getLang('justifyfull_desc'), 'JustifyFull');
+			ed.addShortcut('alt+shift+q', ed.getLang('blockquote_desc'), 'mceBlockQuote');
+			ed.addShortcut('alt+shift+u', ed.getLang('bullist_desc'), 'InsertUnorderedList');
+			ed.addShortcut('alt+shift+o', ed.getLang('numlist_desc'), 'InsertOrderedList');
+			ed.addShortcut('alt+shift+d', ed.getLang('striketrough_desc'), 'Strikethrough');
+			ed.addShortcut('alt+shift+n', ed.getLang('spellchecker.desc'), 'mceSpellCheck');
+			ed.addShortcut('alt+shift+a', ed.getLang('link_desc'), 'mceLink');
+			ed.addShortcut('alt+shift+s', ed.getLang('unlink_desc'), 'unlink');
+			ed.addShortcut('alt+shift+m', ed.getLang('image_desc'), 'mceImage');
+			ed.addShortcut('alt+shift+g', ed.getLang('fullscreen.desc'), 'mceFullScreen');
+			ed.addShortcut('alt+shift+z', ed.getLang('wp_adv_desc'), 'WP_Adv');
+			ed.addShortcut('alt+shift+h', ed.getLang('help_desc'), 'WP_Help');
+			ed.addShortcut('alt+shift+t', ed.getLang('wp_more_desc'), 'WP_More');
+			ed.addShortcut('alt+shift+p', ed.getLang('wp_page_desc'), 'WP_Page');
+
+			if ( tinymce.isWebKit ) {
+				ed.addShortcut('alt+shift+b', ed.getLang('bold_desc'), 'Bold');
+				ed.addShortcut('alt+shift+i', ed.getLang('italic_desc'), 'Italic');
 			}
+		},
 
-			if (e.style && s.hidden_tab_class.length > 0 && e.className.indexOf(s.hidden_tab_class) != -1) {
-				e.className = s.display_tab_class;
-				nl[nl.length] = {elm : e, type : 'class'};
-			}
-		} while ((e = e.parentNode) != null)
-	}
-
-	tinyMCE.settings['preformatted'] = false;
-
-	// Default to false
-	if (typeof(skip_cleanup) == "undefined")
-		skip_cleanup = false;
-
-	// Default to false
-	if (typeof(skip_callback) == "undefined")
-		skip_callback = false;
-
-//	tinyMCE._setHTML(this.getDoc(), this.getBody().innerHTML);
-
-	// Remove visual aids when cleanup is disabled
-	if (this.settings['cleanup'] == false) {
-		tinyMCE.handleVisualAid(this.getBody(), true, false, this);
-		tinyMCE._setEventsEnabled(this.getBody(), true);
-	}
-
-	tinyMCE._customCleanup(this, "submit_content_dom", this.contentWindow.document.body);
-	tinyMCE.selectedInstance.getWin().oldfocus=tinyMCE.selectedInstance.getWin().focus;
-	tinyMCE.selectedInstance.getWin().focus=function() {};
-	var htm = tinyMCE._cleanupHTML(this, this.getDoc(), this.settings, this.getBody(), tinyMCE.visualAid, true, true);
-	tinyMCE.selectedInstance.getWin().focus=tinyMCE.selectedInstance.getWin().oldfocus;
-	htm = tinyMCE._customCleanup(this, "submit_content", htm);
-
-	if (!skip_callback && tinyMCE.settings['save_callback'] != "")
-		var content = eval(tinyMCE.settings['save_callback'] + "(this.formTargetElementId,htm,this.getBody());");
-
-	// Use callback content if available
-	if ((typeof(content) != "undefined") && content != null)
-		htm = content;
-
-	// Replace some weird entities (Bug: #1056343)
-	htm = tinyMCE.regexpReplace(htm, "&#40;", "(", "gi");
-	htm = tinyMCE.regexpReplace(htm, "&#41;", ")", "gi");
-	htm = tinyMCE.regexpReplace(htm, "&#59;", ";", "gi");
-	htm = tinyMCE.regexpReplace(htm, "&#34;", "&quot;", "gi");
-	htm = tinyMCE.regexpReplace(htm, "&#94;", "^", "gi");
-
-	if (this.formElement)
-		this.formElement.value = htm;
-
-	if (tinyMCE.isSafari && this.formElement)
-		this.formElement.innerText = htm;
-
-	// Hide them again (tabs in MSIE)
-	for (i=0; i<nl.length; i++) {
-		if (nl[i].type == 'style')
-			nl[i].elm.style.display = 'none';
-		else
-			nl[i].elm.className = s.hidden_tab_class;
-	}
-}
-tinyMCE.wpTriggerSave = function () {
-	var inst, n;
-	for (n in tinyMCE.instances) {
-		inst = tinyMCE.instances[n];
-		if (!tinyMCE.isInstance(inst))
-			continue;
-		inst.wpTriggerSave = wpInstTriggerSave;
-		inst.wpTriggerSave(false, false);
-	}
-}
-
-function switchEditors(id) {
-	var inst = tinyMCE.getInstanceById(id);
-	var qt = document.getElementById('quicktags');
-	var H = document.getElementById('edButtonHTML');
-	var P = document.getElementById('edButtonPreview');
-	var ta = document.getElementById(id);
-	var pdr = ta.parentNode;
-
-	if ( inst ) {
-		edToggle(H, P);
-
-		if ( tinyMCE.isMSIE && !tinyMCE.isOpera ) {
-			// IE rejects the later overflow assignment so we skip this step.
-			// Alternate code might be nice. Until then, IE reflows.
-		} else {
-			// Lock the fieldset's height to prevent reflow/flicker
-			pdr.style.height = pdr.clientHeight + 'px';
-			pdr.style.overflow = 'hidden';
-		}
-
-		// Save the coords of the bottom right corner of the rich editor
-		var table = document.getElementById(inst.editorId + '_parent').getElementsByTagName('table')[0];
-		var y1 = table.offsetTop + table.offsetHeight;
-
-		if ( TinyMCE_AdvancedTheme._getCookie("TinyMCE_" + inst.editorId + "_height") == null ) {
-			var expires = new Date();
-			expires.setTime(expires.getTime() + 3600000 * 24 * 30);
-			var offset = tinyMCE.isMSIE ? 1 : 2;
-			TinyMCE_AdvancedTheme._setCookie("TinyMCE_" + inst.editorId + "_height", "" + (table.offsetHeight - offset), expires);
-		}
-
-		// Unload the rich editor
-		inst.triggerSave(false, false);
-		htm = inst.formElement.value;
-		tinyMCE.removeMCEControl(id);
-		document.getElementById(id).value = htm;
-		--tinyMCE.idCounter;
-
-		// Reveal Quicktags and textarea
-		qt.style.display = 'block';
-		ta.style.display = 'inline';
-
-		// Set the textarea height to match the rich editor
-		y2 = ta.offsetTop + ta.offsetHeight;
-		ta.style.height = (ta.clientHeight + y1 - y2) + 'px';
-
-		// Tweak the widths
-		ta.parentNode.style.paddingRight = '12px';
-
-		if ( tinyMCE.isMSIE && !tinyMCE.isOpera ) {
-		} else {
-			// Unlock the fieldset's height
-			pdr.style.height = 'auto';
-			pdr.style.overflow = 'display';
-		}
-	} else {
-		edToggle(P, H);
-		edCloseAllTags(); // :-(
-
-		if ( tinyMCE.isMSIE && !tinyMCE.isOpera ) {
-		} else {
-			// Lock the fieldset's height
-			pdr.style.height = pdr.clientHeight + 'px';
-			pdr.style.overflow = 'hidden';
-		}
-
-		// Hide Quicktags and textarea
-		qt.style.display = 'none';
-		ta.style.display = 'none';
-
-		// Tweak the widths
-		ta.parentNode.style.paddingRight = '0px';
-
-		// Load the rich editor with formatted html
-		if ( tinyMCE.isMSIE ) {
-			ta.value = wpautop(ta.value);
-			tinyMCE.addMCEControl(ta, id);
-		} else {
-			htm = wpautop(ta.value);
-			tinyMCE.addMCEControl(ta, id);
-			tinyMCE.getInstanceById(id).execCommand('mceSetContent', null, htm);
-		}
-
-		if ( tinyMCE.isMSIE && !tinyMCE.isOpera ) {
-		} else {
-			// Unlock the fieldset's height
-			pdr.style.height = 'auto';
-			pdr.style.overflow = 'display';
-		}
-	}
-}
-
-function edToggle(A, B) {
-	A.className = 'edButtonFore';
-	B.className = 'edButtonBack';
-
-	B.onclick = A.onclick;
-	A.onclick = null;
-}
-
-function wpautop(pee) {
-	pee = pee + "\n\n";
-	pee = pee.replace(new RegExp('<br />\\s*<br />', 'gi'), "\n\n");
-	pee = pee.replace(new RegExp('(<(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6])[^>]*>)', 'gi'), "\n$1"); 
-	pee = pee.replace(new RegExp('(</(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6])>)', 'gi'), "$1\n\n");
-	pee = pee.replace(new RegExp("\\r\\n|\\r", 'g'), "\n");
-	pee = pee.replace(new RegExp("\\n\\s*\\n+", 'g'), "\n\n");
-	pee = pee.replace(new RegExp('([\\s\\S]+?)\\n\\n', 'mg'), "<p>$1</p>\n");
-	pee = pee.replace(new RegExp('<p>\\s*?</p>', 'gi'), '');
-	pee = pee.replace(new RegExp('<p>\\s*(</?(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|hr|pre|select|form|blockquote|address|math|p|h[1-6])[^>]*>)\\s*</p>', 'gi'), "$1");
-	pee = pee.replace(new RegExp("<p>(<li.+?)</p>", 'gi'), "$1");
-	pee = pee.replace(new RegExp('<p><blockquote([^>]*)>', 'gi'), "<blockquote$1><p>");
-	pee = pee.replace(new RegExp('</blockquote></p>', 'gi'), '</p></blockquote>');
-	pee = pee.replace(new RegExp('<p>\\s*(</?(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|hr|pre|select|form|blockquote|address|math|p|h[1-6])[^>]*>)', 'gi'), "$1");
-	pee = pee.replace(new RegExp('(</?(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6])[^>]*>)\\s*</p>', 'gi'), "$1"); 
-	pee = pee.replace(new RegExp('\\s*\\n', 'gi'), "<br />\n");
-	pee = pee.replace(new RegExp('(</?(?:table|thead|tfoot|caption|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6])[^>]*>)\\s*<br />', 'gi'), "$1");
-	pee = pee.replace(new RegExp('<br />(\\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)>)', 'gi'), '$1');
-	pee = pee.replace(new RegExp('^((?:&nbsp;)*)\\s', 'mg'), '$1&nbsp;');
-	//pee = pee.replace(new RegExp('(<pre.*?>)(.*?)</pre>!ise', " stripslashes('$1') .  stripslashes(clean_pre('$2'))  . '</pre>' "); // Hmm...
-	return pee;
-}
+		getInfo : function() {
+			return {
+				longname : 'WordPress Plugin',
+				author : 'WordPress', // add Moxiecode?
+				authorurl : 'http://wordpress.org',
+				infourl : 'http://wordpress.org',
+				version : '3.0'
+			};
+		},
+
+		// Internal functions
+
+		// Resizes the iframe by a relative height value
+		_resizeIframe : function(ed, tb_id, dy) {
+			var ifr = ed.getContentAreaContainer().firstChild;
+
+			DOM.setStyle(ifr, 'height', ifr.clientHeight + dy); // Resize iframe
+			ed.theme.deltaHeight += dy; // For resize cookie
+		},
+
+		_handleMoreBreak : function(ed, url) {
+			var moreHTML = '<img src="' + url + '/img/trans.gif" alt="$1" class="mceWPmore mceItemNoResize" title="'+ed.getLang('wordpress.wp_more_alt')+'" />';
+            var nextpageHTML = '<img src="' + url + '/img/trans.gif" class="mceWPnextpage mceItemNoResize" title="'+ed.getLang('wordpress.wp_page_alt')+'" />';
+
+			// Load plugin specific CSS into editor
+			ed.onInit.add(function() {
+				ed.dom.loadCSS(url + '/css/content.css');
+			});
+
+			// Display morebreak instead if img in element path
+			ed.onPostRender.add(function() {
+				if (ed.theme.onResolveName) {
+					ed.theme.onResolveName.add(function(th, o) {
+						if (o.node.nodeName == 'IMG') {
+                            if ( ed.dom.hasClass(o.node, 'mceWPmore') )
+                                o.name = 'wpmore';
+                            if ( ed.dom.hasClass(o.node, 'mceWPnextpage') )
+                                o.name = 'wppage';
+                        }
+							
+					});
+				}
+			});
+
+			// Replace morebreak with images
+			ed.onBeforeSetContent.add(function(ed, o) {
+				o.content = o.content.replace(/<!--more(.*?)-->/g, moreHTML);
+				o.content = o.content.replace(/<!--nextpage-->/g, nextpageHTML);
+			});
+
+			// Replace images with morebreak
+			ed.onPostProcess.add(function(ed, o) {
+				if (o.get)
+					o.content = o.content.replace(/<img[^>]+>/g, function(im) {
+						if (im.indexOf('class="mceWPmore') !== -1) {
+                            var m;
+                            var moretext = (m = im.match(/alt="(.*?)"/)) ? m[1] : '';
+
+                            im = '<!--more'+moretext+'-->';
+                        }
+                        if (im.indexOf('class="mceWPnextpage') !== -1)
+							im = '<!--nextpage-->';
+						
+                        return im;
+					});
+			});
+
+			// Set active buttons if user selected pagebreak or more break
+			ed.onNodeChange.add(function(ed, cm, n) {
+				cm.setActive('wp_page', n.nodeName === 'IMG' && ed.dom.hasClass(n, 'mceWPnextpage'));
+				cm.setActive('wp_more', n.nodeName === 'IMG' && ed.dom.hasClass(n, 'mceWPmore'));
+			});
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('wordpress', tinymce.plugins.WordPress);
+})();
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/images/help.gif 2.5.src/wp-includes/js/tinymce/plugins/wordpress/images/help.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/images/help.gif	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/wordpress/images/help.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89a   O^u"Zr9ZBzrýP5nSVMp_ܑ̰"X"g   !   ,       'dihHY_fUNTFfD"TX$b1pLJ%px$GaIt%qH d8&bmz^ ~%u
- & &  
'}(Q*
44! ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/images/more.gif 2.5.src/wp-includes/js/tinymce/plugins/wordpress/images/more.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/images/more.gif	2005-08-29 20:25:19.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/plugins/wordpress/images/more.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a    fff!  ,       ={塸Wmp2cW7Enċ 4m9~rMV!9"C@TFS  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/images/more_bug.gif 2.5.src/wp-includes/js/tinymce/plugins/wordpress/images/more_bug.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/images/more_bug.gif	2005-08-29 20:25:19.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/plugins/wordpress/images/more_bug.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF89a 
-      !  ,     
-  cڋB"U@`n։$z]	؂ALz~V*nʪ5>8d''
Z.ns}R  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/images/page.gif 2.5.src/wp-includes/js/tinymce/plugins/wordpress/images/page.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/images/page.gif	2005-08-29 20:25:19.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/plugins/wordpress/images/page.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a    fff!  ,       =`L*R=xiʶǂ0smptYH%	d"R@R$FQL  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/images/page_bug.gif 2.5.src/wp-includes/js/tinymce/plugins/wordpress/images/page_bug.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/images/page_bug.gif	2005-08-29 20:25:19.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/plugins/wordpress/images/page_bug.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-GIF89a 
-      !  ,     
-  -ڋHY['rLfk<
-5̭Jndiêx1EL܎={,ª'0l=ŧbvHȨri @Yiy)	*P  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/images/toolbars.gif 2.5.src/wp-includes/js/tinymce/plugins/wordpress/images/toolbars.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/images/toolbars.gif	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/wordpress/images/toolbars.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89a   6|iIUXjxm,.79zBER79Dfj~JM[̙c:vzaޢrLr*nS%@BOPqyR[@I~ck   !   ,       'dih٬lbtm3M@XIq90" N`$Gq0 Gvr
-C Rx
z`HJVXzo]q>C::61+eli%! ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/img/help.gif 2.5.src/wp-includes/js/tinymce/plugins/wordpress/img/help.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/img/help.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/wordpress/img/help.gif	2008-01-31 12:10:46.000000000 -0600
@@ -0,0 +1,2 @@
+GIF89a   O^u"Zr9ZBzrýP5nSVMp_ܑ̰"X"g   !   ,       'dihHY_fUNTFfD"TX$b1pLJ%px$GaIt%qH d8&bmz^ ~%u
+ & &  
'}(Q*
44! ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/img/more.gif 2.5.src/wp-includes/js/tinymce/plugins/wordpress/img/more.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/img/more.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/wordpress/img/more.gif	2008-01-31 12:10:46.000000000 -0600
@@ -0,0 +1 @@
+GIF89a    fff!  ,       ={塸Wmp2cW7Enċ 4m9~rMV!9"C@TFS  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/img/more_bug.gif 2.5.src/wp-includes/js/tinymce/plugins/wordpress/img/more_bug.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/img/more_bug.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/wordpress/img/more_bug.gif	2008-01-31 12:10:46.000000000 -0600
@@ -0,0 +1,3 @@
+GIF89a 
+      !  ,     
+  cڋB"U@`n։$z]	؂ALz~V*nʪ5>8d''
Z.ns}R  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/img/page.gif 2.5.src/wp-includes/js/tinymce/plugins/wordpress/img/page.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/img/page.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/wordpress/img/page.gif	2008-01-31 12:10:46.000000000 -0600
@@ -0,0 +1 @@
+GIF89a    fff!  ,       =`L*R=xiʶǂ0smptYH%	d"R@R$FQL  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/img/page_bug.gif 2.5.src/wp-includes/js/tinymce/plugins/wordpress/img/page_bug.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/img/page_bug.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/wordpress/img/page_bug.gif	2008-01-31 12:10:46.000000000 -0600
@@ -0,0 +1,4 @@
+GIF89a 
+      !  ,     
+  -ڋHY['rLfk<
+5̭Jndiêx1EL܎={,ª'0l=ŧbvHȨri @Yiy)	*P  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/img/toolbars.gif 2.5.src/wp-includes/js/tinymce/plugins/wordpress/img/toolbars.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/img/toolbars.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/wordpress/img/toolbars.gif	2008-01-31 12:10:46.000000000 -0600
@@ -0,0 +1,2 @@
+GIF89a   6|iIUXjxm,.79zBER79Dfj~JM[̙c:vzaޢrLr*nS%@BOPqyR[@I~ck   !   ,       'dih٬lbtm3M@XIq90" N`$Gq0 Gvr
+C Rx
z`HJVXzo]q>C::61+eli%! ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif 2.5.src/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif	2008-01-31 12:10:46.000000000 -0600
@@ -0,0 +1 @@
+GIF89a          !   ,       D ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/langs/en.js 2.5.src/wp-includes/js/tinymce/plugins/wordpress/langs/en.js
--- 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/langs/en.js	2007-02-25 08:04:49.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/wordpress/langs/en.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,33 +0,0 @@
-// EN lang variables
-
-if (navigator.userAgent.indexOf('Mac OS') != -1) {
-// Mac OS browsers use Ctrl to hit accesskeys
-	var metaKey = 'Ctrl';
-}
-else {
-	var metaKey = 'Alt';
-}
-
-tinyMCE.addToLang('',{
-wordpress_more_button : 'Split post with More tag (' + metaKey + '+t)',
-wordpress_page_button : 'Split post with Page tag',
-wordpress_adv_button : 'Show/Hide Advanced Toolbar (' + metaKey + '+b)',
-wordpress_more_alt : 'More...',
-wordpress_page_alt : '...page...',
-help_button_title : 'Help (' + metaKey + '+h)',
-bold_desc : 'Bold (Ctrl+B)',
-italic_desc : 'Italic (Ctrl+I)',
-underline_desc : 'Underline (Ctrl+U)',
-link_desc : 'Insert/edit link (' + metaKey + '+a)',
-unlink_desc : 'Unlink (' + metaKey + '+s)',
-image_desc : 'Insert/edit image (' + metaKey + '+m)',
-striketrough_desc : 'Strikethrough (' + metaKey + '+k)',
-justifyleft_desc : 'Align left (' + metaKey + '+f)',
-justifycenter_desc : 'Align center (' + metaKey + '+c)',
-justifyright_desc : 'Align right (' + metaKey + '+r)',
-justifyfull_desc : 'Align full (' + metaKey + '+j)',
-bullist_desc : 'Unordered list (' + metaKey + '+l)',
-numlist_desc : 'Ordered list (' + metaKey + '+o)',
-outdent_desc : 'Outdent (' + metaKey + '+w)',
-indent_desc : 'Indent list/blockquote (' + metaKey + '+q)'
-});
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/wordpress.css 2.5.src/wp-includes/js/tinymce/plugins/wordpress/wordpress.css
--- 2.2.2.src/wp-includes/js/tinymce/plugins/wordpress/wordpress.css	2007-03-05 13:27:40.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/wordpress/wordpress.css	1969-12-31 18:00:00.000000000 -0600
@@ -1,81 +0,0 @@
-.mce_plugin_wordpress_more {
-	border: 0px;
-	border-top: 1px dotted #cccccc;
-	display:block;
-	background-color: #ffffff;
-	margin-top:15px;
-	background-image: url(images/more_bug.gif);
-	background-repeat: no-repeat;
-	background-position: right top;
-}
-
-.mce_plugin_wordpress_page {
-	border: 0px;
-	border-top: 1px dotted #cccccc;
-	display:block;
-	background-color: #ffffff;
-	margin-top:15px;
-	background-image: url(images/page_bug.gif);
-	background-repeat: no-repeat;
-	background-position: right top;
-}
-
-/* This file contains the CSS data for the editable area(iframe) of TinyMCE */
-/* You can extend this CSS by adding your own CSS file with the the content_css option */
-
-body {
-	background: #fff;
-	font: 1em/1.3em Georgia, "Times New Roman", Times, serif;
-	padding: .5em;
-}
-
-td {
-	font-size: 10px;
-}
-
-pre {
-	font-family: "Courier New", fixed;
-	font-size: 11px;
-	line-height: 13px;
-}
-
-.mceVisualAid {
-	border: 1px dashed #BBBBBB !important;
-}
-
-.mceItemAnchor {
-	width: 12px;
-	line-height: 6px;
-	overflow: hidden;
-	padding-left: 12px;
-	background-position: bottom;
-	background-repeat: no-repeat;
-}
-
-/* Important is needed in Gecko browsers inorder to style links */
-/*
-a {
-	color: green !important;
-}
-*/
-
-/* Style selection range colors in Gecko browsers */
-/*
-::-moz-selection {
-	background-color: red;
-	color: green;
-}
-*/
-
-/* MSIE specific */
-
-* html body {
-	scrollbar-3dlight-color: #F0F0EE;
-	scrollbar-arrow-color: #676662;
-	scrollbar-base-color: #F0F0EE;
-	scrollbar-darkshadow-color: #DDDDDD;
-	scrollbar-face-color: #E0E0DD;
-	scrollbar-highlight-color: #F0F0EE;
-	scrollbar-shadow-color: #F0F0EE;
-	scrollbar-track-color: #F5F5F5;
-}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/wphelp/editor_plugin.js 2.5.src/wp-includes/js/tinymce/plugins/wphelp/editor_plugin.js
--- 2.2.2.src/wp-includes/js/tinymce/plugins/wphelp/editor_plugin.js	2007-01-16 11:52:13.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/wphelp/editor_plugin.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,57 +0,0 @@
-/* Import plugin specific language pack */
-tinyMCE.importPluginLanguagePack('wphelp', '');
-
-function TinyMCE_wphelp_getControlHTML(control_name) {
-	switch (control_name) {
-		case "wphelp":
-			var titleHelp = tinyMCE.getLang('lang_help_button_title');
-			var buttons = '<a href="javascript:tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceWordPressHelp\')" target="_self" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceWordPressHelp\');return false;"><img id="{$editor_id}_help" src="{$pluginurl}/images/help.gif" title="'+titleHelp+'" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';
-			var hiddenControls = '<div class="zerosize">'
-			+ '<input type="button" accesskey="b" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Bold\',false);" />'
-			+ '<input type="button" accesskey="i" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Italic\',false);" />'
-			+ '<input type="button" accesskey="d" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Strikethrough\',false);" />'
-			+ '<input type="button" accesskey="l" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'InsertUnorderedList\',false);" />'
-			+ '<input type="button" accesskey="o" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'InsertOrderedList\',false);" />'
-			+ '<input type="button" accesskey="w" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Outdent\',false);" />'
-			+ '<input type="button" accesskey="q" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Indent\',false);" />'
-			+ '<input type="button" accesskey="f" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'JustifyLeft\',false);" />'
-			+ '<input type="button" accesskey="c" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'JustifyCenter\',false);" />'
-			+ '<input type="button" accesskey="r" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'JustifyRight\',false);" />'
-			+ '<input type="button" accesskey="a" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceLink\',true);" />'
-			+ '<input type="button" accesskey="s" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'unlink\',false);" />'
-			+ '<input type="button" accesskey="m" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceImage\',true);" />'
-			+ '<input type="button" accesskey="t" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcewordpressmore\');" />'
-			+ '<input type="button" accesskey="u" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Undo\',false);" />'
-			+ '<input type="button" accesskey="y" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Redo\',false);" />'
-			+ '<input type="button" accesskey="e" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceCodeEditor\',false);" />'
-			+ '<input type="button" accesskey="h" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceWordPressHelp\',false);" />'
-			+ '</div>';
-			return buttons+hiddenControls;
-    }
-
-    return "";
-}
-
-function TinyMCE_wphelp_execCommand(editor_id, element, command, user_interface, value) {
-
-	// Handle commands
-	switch (command) {
-		case "mceWordPressHelp":
-			var template = new Array();
-
-			template['file']   = tinyMCE.baseURL + '/wp-mce-help.php';
-			template['width']  = 480;
-			template['height'] = 380;
-
-			args = {
-				resizable : 'yes',
-				scrollbars : 'yes'
-			};
-
-			tinyMCE.openWindow(template, args);
-			return true;
-	}
-
-	// Pass to next handler in chain
-	return false;
-}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/wphelp/images/help.gif 2.5.src/wp-includes/js/tinymce/plugins/wphelp/images/help.gif
--- 2.2.2.src/wp-includes/js/tinymce/plugins/wphelp/images/help.gif	2005-11-19 13:39:09.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/wphelp/images/help.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89a   O^u"Zr9ZBzrýP5nSVMp_ܑ̰"X"g   !   ,       'dihHY_fUNTFfD"TX$b1pLJ%px$GaIt%qH d8&bmz^ ~%u
- & &  
'}(Q*
44! ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/plugins/wphelp/langs/en.js 2.5.src/wp-includes/js/tinymce/plugins/wphelp/langs/en.js
--- 2.2.2.src/wp-includes/js/tinymce/plugins/wphelp/langs/en.js	2007-01-16 11:52:13.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/plugins/wphelp/langs/en.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,5 +0,0 @@
-// EN lang variables
-
-tinyMCE.addToLang('',{
-help_button_title : 'Help (Alt+h)'
-});
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/about.htm 2.5.src/wp-includes/js/tinymce/themes/advanced/about.htm
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/about.htm	2007-01-24 19:20:47.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/about.htm	2008-03-21 17:13:03.000000000 -0500
@@ -1,35 +1,39 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-	<title>{$lang_about_title}</title>
-	<script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
-	<script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>
-	<script language="javascript" type="text/javascript" src="jscripts/about.js"></script>
-	<base target="_self" />
+	<title>{#advanced_dlg.about_title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script type="text/javascript" src="js/about.js"></script>
 </head>
-<body id="about" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">
+<body id="about" style="display: none">
 		<div class="tabs">
 			<ul>
-				<li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_about}</a></span></li>
-				<li id="help_tab"><span><a href="javascript:mcTabs.displayTab('help_tab','help_panel');" onmousedown="return false;">{$lang_help}</a></span></li>
-				<li id="plugins_tab"><span><a href="javascript:mcTabs.displayTab('plugins_tab','plugins_panel');" onmousedown="return false;">{$lang_plugins}</a></span></li>
+				<li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advanced_dlg.about_general}</a></span></li>
+				<li id="help_tab" style="display:none"><span><a href="javascript:mcTabs.displayTab('help_tab','help_panel');" onmousedown="return false;">{#advanced_dlg.about_help}</a></span></li>
+				<li id="plugins_tab"><span><a href="javascript:mcTabs.displayTab('plugins_tab','plugins_panel');" onmousedown="return false;">{#advanced_dlg.about_plugins}</a></span></li>
 			</ul>
 		</div>
 
 		<div class="panel_wrapper">
 			<div id="general_panel" class="panel current">
-				<h3>{$lang_about_title}</h3>
-				<p>Version: {$tinymce_version} ({$tinymce_releasedate})</p>
+				<h3>{#advanced_dlg.about_title}</h3>
+				<p>Version: <span id="version"></span> (<span id="date"></span>)</p>
 				<p>TinyMCE is a platform independent web based Javascript HTML WYSIWYG editor control released as Open Source under <a href="../../license.txt" target="_blank">LGPL</a>
 				by Moxiecode Systems AB. It has the ability to convert HTML TEXTAREA fields or other HTML elements to editor instances.</p>
-				<p>Copyright &copy; 2003-2007, <a href="http://www.moxiecode.com" target="_blank">Moxiecode Systems AB</a>, All rights reserved.</p>
+				<p>Copyright &copy; 2003-2008, <a href="http://www.moxiecode.com" target="_blank">Moxiecode Systems AB</a>, All rights reserved.</p>
 				<p>For more information about this software visit the <a href="http://tinymce.moxiecode.com" target="_blank">TinyMCE website</a>.</p>
 
-				<div id="buttoncontainer"></div>
+				<div id="buttoncontainer">
+					<a href="http://www.moxiecode.com" target="_blank"><img src="http://tinymce.moxiecode.com/images/gotmoxie.png" alt="Got Moxie?" border="0" /></a>
+					<a href="http://sourceforge.net/projects/tinymce/" target="_blank"><img src="http://sourceforge.net/sflogo.php?group_id=103281" alt="Hosted By Sourceforge" border="0" /></a>
+					<a href="http://www.freshmeat.net/projects/tinymce" target="_blank"><img src="http://tinymce.moxiecode.com/images/fm.gif" alt="Also on freshmeat" border="0" /></a>
+				</div>
 			</div>
 
 			<div id="plugins_panel" class="panel">
 				<div id="pluginscontainer">
-					<h3>{$lang_loaded_plugins}</h3>
+					<h3>{#advanced_dlg.about_loaded}</h3>
 
 					<div id="plugintablecontainer">
 					</div>
@@ -45,7 +49,7 @@
 
 		<div class="mceActionPanel">
 			<div style="float: right">
-				<input type="button" id="cancel" name="cancel" value="{$lang_close}" onclick="tinyMCEPopup.close();" />
+				<input type="button" id="cancel" name="cancel" value="{#close}" onclick="tinyMCEPopup.close();" />
 			</div>
 		</div>
 </body>
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/anchor.htm 2.5.src/wp-includes/js/tinymce/themes/advanced/anchor.htm
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/anchor.htm	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/anchor.htm	2008-03-12 17:47:11.000000000 -0500
@@ -1,33 +1,32 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-	<title>{$lang_insert_anchor_title}</title>
-	<script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
-	<script language="javascript" type="text/javascript" src="jscripts/anchor.js"></script>
+	<title>{#advanced_dlg.anchor_title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="js/anchor.js"></script>
 	<base target="_self" />
 </head>
-<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">
-<form onsubmit="insertAnchor();return false;" action="#">
-
+<body style="display: none">
+<form onsubmit="AnchorDialog.update();return false;" action="#">
 	<table border="0" cellpadding="4" cellspacing="0">
 		<tr>
-			<td colspan="2" class="title">{$lang_insert_anchor_title}</td>
+			<td colspan="2" class="title">{#advanced_dlg.anchor_title}</td>
 		</tr>
 		<tr>
-			<td nowrap="nowrap">{$lang_insert_anchor_name}:</td>
-			<td><input name="anchorName" type="text" id="anchorName" value="" style="width: 200px" /></td>
+			<td nowrap="nowrap">{#advanced_dlg.anchor_name}:</td>
+			<td><input name="anchorName" type="text" class="mceFocus" id="anchorName" value="" style="width: 200px" /></td>
 		</tr>
 	</table>
 
 	<div class="mceActionPanel">
 		<div style="float: left">
-			<input type="button" id="insert" name="insert" value="{$lang_update}" onclick="insertAnchor();" />
+			<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
 		</div>
 
 		<div style="float: right">
-			<input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />
+			<input type="submit" id="insert" name="insert" value="{#update}" />
 		</div>
 	</div>
-
 </form>
 </body>
 </html>
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/charmap.htm 2.5.src/wp-includes/js/tinymce/themes/advanced/charmap.htm
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/charmap.htm	2006-11-20 18:55:06.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/charmap.htm	2008-02-21 15:40:25.000000000 -0600
@@ -1,27 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-	<title>{$lang_theme_charmap_title}</title>
+	<title>{#advanced_dlg.charmap_title}</title>
 	<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
-	<script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
-	<script language="javascript" type="text/javascript" src="jscripts/charmap.js"></script>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="js/charmap.js"></script>
 	<base target="_self" />
 </head>
-<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">
+<body id="charmap" style="display:none">
 <table align="center" border="0" cellspacing="0" cellpadding="2">
     <tr>
-        <td colspan="2" class="title">{$lang_theme_charmap_title}</td>
+        <td colspan="2" class="title">{#advanced_dlg.charmap_title}</td>
     </tr>
     <tr>
-        <td rowspan="2" align="left" valign="top">
-            <script language="javascript" type="text/javascript">renderCharMapHTML();</script>
+        <td id="charmapView" rowspan="2" align="left" valign="top">
+			<!-- Chars will be rendered here -->
         </td>
         <td width="100" align="center" valign="top">
-            <table border="0" cellpadding="0" cellspacing="0" width="100" style="height: 100px">
+            <table border="0" cellpadding="0" cellspacing="0" width="100" style="height:100px">
                 <tr>
-                    <td class="charmapOver" style="font-size: 40px; height:80px;" id="codeV">&nbsp;</td>
+                    <td id="codeV">&nbsp;</td>
                 </tr>
                 <tr>
-                    <td style="font-size: 10px; font-family: Arial, Helvetica, sans-serif; text-align:center;" id="codeN">&nbsp;</td>
+                    <td id="codeN">&nbsp;</td>
                 </tr>
             </table>
         </td>
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/color_picker.htm 2.5.src/wp-includes/js/tinymce/themes/advanced/color_picker.htm
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/color_picker.htm	2007-05-18 19:10:57.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/color_picker.htm	2008-03-12 17:47:11.000000000 -0500
@@ -1,27 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-	<title>{$lang_theme_colorpicker_title}</title>
-	<script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
-	<script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>
-	<script language="javascript" type="text/javascript" src="jscripts/color_picker.js"></script>
-	<link href="css/colorpicker.css" rel="stylesheet" type="text/css" />
+	<title>{#advanced_dlg.colorpicker_title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script type="text/javascript" src="js/color_picker.js"></script>
 	<base target="_self" />
 </head>
-<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">
+<body id="colorpicker" style="display: none">
+<form onsubmit="insertAction();return false" action="#">
 	<div class="tabs">
 		<ul>
-			<li id="picker_tab" class="current"><span><a href="javascript:mcTabs.displayTab('picker_tab','picker_panel');" onmousedown="return false;">{$lang_color_picker_tab}</a></span></li>
-			<li id="rgb_tab"><span><a href="#" onclick="generateWebColors();mcTabs.displayTab('rgb_tab','rgb_panel');" onmousedown="return false;">{$lang_web_colors_tab}</a></span></li>
-			<li id="named_tab"><span><a  href="#" onclick="generateNamedColors();javascript:mcTabs.displayTab('named_tab','named_panel');" onmousedown="return false;">{$lang_named_colors_tab}</a></span></li>
+			<li id="picker_tab" class="current"><span><a href="javascript:mcTabs.displayTab('picker_tab','picker_panel');" onmousedown="return false;">{#advanced_dlg.colorpicker_picker_tab}</a></span></li>
+			<li id="rgb_tab"><span><a href="javascript:;" onclick="generateWebColors();mcTabs.displayTab('rgb_tab','rgb_panel');" onmousedown="return false;">{#advanced_dlg.colorpicker_palette_tab}</a></span></li>
+			<li id="named_tab"><span><a  href="javascript:;" onclick="generateNamedColors();javascript:mcTabs.displayTab('named_tab','named_panel');" onmousedown="return false;">{#advanced_dlg.colorpicker_named_tab}</a></span></li>
 		</ul>
 	</div>
 
 	<div class="panel_wrapper">
 		<div id="picker_panel" class="panel current">
 			<fieldset>
-				<legend>{$lang_color_picker}</legend>
+				<legend>{#advanced_dlg.colorpicker_picker_title}</legend>
 				<div id="picker">
-					<img id="colorpicker" src="images/colors.jpg" onclick="computeColor(event)" onmousedown="isMouseDown = true;return false;" onmouseup="isMouseDown = false;" onmousemove="if (isMouseDown && isMouseOver) computeColor(event); return false;" onmouseover="isMouseOver=true;" onmouseout="isMouseOver=false;" />
+					<img id="colors" src="img/colorpicker.jpg" onclick="computeColor(event)" onmousedown="isMouseDown = true;return false;" onmouseup="isMouseDown = false;" onmousemove="if (isMouseDown && isMouseOver) computeColor(event); return false;" onmouseover="isMouseOver=true;" onmouseout="isMouseOver=false;" />
 
 					<div id="light">
 						<!-- Will be filled with divs -->
@@ -34,7 +35,7 @@
 
 		<div id="rgb_panel" class="panel">
 			<fieldset>
-				<legend>{$lang_web_colors}</legend>
+				<legend>{#advanced_dlg.colorpicker_palette_title}</legend>
 				<div id="webcolors">
 					<!-- Gets filled with web safe colors-->
 				</div>
@@ -45,7 +46,7 @@
 
 		<div id="named_panel" class="panel">
 			<fieldset>
-				<legend>{$lang_named_colors}</legend>
+				<legend>{#advanced_dlg.colorpicker_named_title}</legend>
 				<div id="namedcolors">
 					<!-- Gets filled with named colors-->
 				</div>
@@ -53,7 +54,7 @@
 				<br style="clear: both" />
 
 				<div id="colornamecontainer">
-					{$lang_color_name} <span id="colorname"></span>
+					{#advanced_dlg.colorpicker_name} <span id="colorname"></span>
 				</div>
 			</fieldset>
 		</div>
@@ -61,14 +62,15 @@
 
 	<div class="mceActionPanel">
 		<div style="float: left">
-			<input type="button" id="insert" name="insert" value="{$lang_theme_colorpicker_apply}" onclick="insertAction();" />
+			<input type="submit" id="insert" name="insert" value="{#apply}" />
 		</div>
 
 		<div id="preview"></div>
 
 		<div id="previewblock">
-			<label for="color">{$lang_color}</label> <input id="color" type="text" size="8" maxlength="8" class="text" />
+			<label for="color">{#advanced_dlg.colorpicker_color}</label> <input id="color" type="text" size="8" maxlength="8" class="text mceFocus" />
 		</div>
 	</div>
+</form>
 </body>
 </html>
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/css/colorpicker.css 2.5.src/wp-includes/js/tinymce/themes/advanced/css/colorpicker.css
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/css/colorpicker.css	2007-05-18 19:10:57.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/css/colorpicker.css	1969-12-31 18:00:00.000000000 -0600
@@ -1,53 +0,0 @@
-/* Colorpicker dialog specific CSS */
-
-#preview {
-	float: right;
-	width: 50px;
-	height: 14px;
-	line-height: 1px;
-	border: 1px solid black;
-	margin-left: 5px;
-}
-
-#colorpicker {
-	float: left;
-	cursor: crosshair;
-}
-
-#light {
-	border: 1px solid gray;
-	margin-left: 5px;
-	float: left;
-	width: 15px;
-	cursor: crosshair;
-}
-
-#light div {
-	overflow: hidden;
-}
-
-#previewblock {
-	float: right;
-	padding-left: 10px;
-	height: 20px;
-}
-
-.panel_wrapper div.current {
-	height: 175px;
-}
-
-#namedcolors {
-	width: 150px;
-}
-
-#namedcolors a {
-	display: block;
-	float: left;
-	width: 10px; height: 10px;
-	margin: 1px 1px 0 0;
-	overflow: hidden;
-}
-
-#colornamecontainer {
-	margin-top: 5px;
-}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/css/editor_content.css 2.5.src/wp-includes/js/tinymce/themes/advanced/css/editor_content.css
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/css/editor_content.css	2006-11-20 18:55:06.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/css/editor_content.css	1969-12-31 18:00:00.000000000 -0600
@@ -1,58 +0,0 @@
-/* This file contains the CSS data for the editable area(iframe) of TinyMCE */
-/* You can extend this CSS by adding your own CSS file with the the content_css option */
-
-body, td, pre {
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 10px;
-}
-
-body {
-	background-color: #FFFFFF;
-}
-
-.mceVisualAid {
-	border: 1px dashed #BBBBBB !important;
-}
-
-div.mceVisualAid {
-	background-image:url('../images/spacer.gif');
-	visibility: visible !important;
-}
-
-.mceItemAnchor {
-	width: 12px;
-	line-height: 6px;
-	overflow: hidden;
-	padding-left: 12px;
-	background-image: url('../images/anchor_symbol.gif');
-	background-position: bottom;
-	background-repeat: no-repeat;
-}
-
-/* Important is needed in Gecko browsers inorder to style links */
-/*
-a {
-	color: green !important;
-}
-*/
-
-/* Style selection range colors in Gecko browsers */
-/*
-::-moz-selection {
-	background-color: red;
-	color: green;
-}
-*/
-
-/* MSIE specific */
-
-* html body {
-	scrollbar-3dlight-color: #F0F0EE;
-	scrollbar-arrow-color: #676662;
-	scrollbar-base-color: #F0F0EE;
-	scrollbar-darkshadow-color: #DDDDDD;
-	scrollbar-face-color: #E0E0DD;
-	scrollbar-highlight-color: #F0F0EE;
-	scrollbar-shadow-color: #F0F0EE;
-	scrollbar-track-color: #F5F5F5;
-}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/css/editor_popup.css 2.5.src/wp-includes/js/tinymce/themes/advanced/css/editor_popup.css
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/css/editor_popup.css	2006-11-20 18:55:06.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/css/editor_popup.css	1969-12-31 18:00:00.000000000 -0600
@@ -1,358 +0,0 @@
-/* This file contains the CSS data for all popups in TinyMCE */
-
-body {
-	background-color: #F0F0EE;
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 11px;
-	scrollbar-3dlight-color: #F0F0EE;
-	scrollbar-arrow-color: #676662;
-	scrollbar-base-color: #F0F0EE;
-	scrollbar-darkshadow-color: #DDDDDD;
-	scrollbar-face-color: #E0E0DD;
-	scrollbar-highlight-color: #F0F0EE;
-	scrollbar-shadow-color: #F0F0EE;
-	scrollbar-track-color: #F5F5F5;
-	margin: 8px;
-}
-
-td {
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 11px;
-}
-
-input {
-	background: #FFFFFF;
-	border: 1px solid #cccccc;
-}
-
-td, input, select, textarea {
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 10px;
-}
-
-input, select, textarea {
-	border: 1px solid #808080;
-}
-
-.input_noborder {
-	border: 0;
-}
-
-#insert, .updateButton {
-   font-weight: bold;
-   width: 90px;
-   height: 21px;
-   border: 0;
-   background-image: url('../images/insert_button_bg.gif');
-   cursor: pointer;
-}
-
-#cancel {
-   font-weight: bold;
-   width: 90px;
-   height: 21px;
-   border: 0;
-   background-image: url('../images/cancel_button_bg.gif');
-   cursor: pointer;
-}
-
-/* Mozilla only style */
-html>body #insert, html>body #cancel {
-	padding-bottom: 2px;
-}
-
-.title {
-	font-size: 12px;
-	font-weight: bold;
-	color: #2B6FB6;
-}
-
-table.charmap {
-	border-style: solid;
-	border-width: 1px;
-	border-color: #AAAAAA;
-}
-
-td.charmap, td.charmapOver {
-	color: #000000;
-	border-color: #AAAAAA;
-	border-style: solid;
-	border-width: 1px;
-	text-align: center;
-	font-size: 12px;
-}
-
-td.charmapOver {
-	background-color: #CCCCCC;
-	cursor: default;
-}
-
-a.charmap {
-	color: #000000;
-	text-decoration: none
-}
-
-.wordWrapCode {
-	vertical-align: middle;
-	border: 1px none #000000;
-	background-color: transparent;
-}
-
-input.radio {
-	border: 1px none #000000;
-	background-color: transparent;
-	vertical-align: middle;
-}
-
-input.checkbox {
-	border: 1px none #000000;
-	background-color: transparent;
-	vertical-align: middle;
-}
-
-.mceButtonNormal, .mceButtonOver, .mceButtonDown, .mceSeparator, .mceButtonDisabled, .mceButtonSelected {
-	margin-left: 1px;
-}
-
-.mceButtonNormal {
-	border-top: 1px solid;
-	border-left: 1px solid;
-	border-bottom: 1px solid;
-	border-right: 1px solid;
-	border-color: #F0F0EE;
-	cursor: default;
-}
-
-.mceButtonOver {
-	border: 1px solid #0A246A;
-	cursor: default;
-	background-color: #B6BDD2;
-}
-
-.mceButtonDown {
-	cursor: default;
-	border: 1px solid #0A246A;
-	background-color: #8592B5;
-}
-
-.mceButtonDisabled {
-	filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);
-	-moz-opacity:0.3;
-	opacity: 0.3;
-	border-top: 1px solid;
-	border-left: 1px solid;
-	border-bottom: 1px solid;
-	border-right: 1px solid;
-	border-color: #F0F0EE;
-	cursor: default;
-}
-
-.mceActionPanel {
-	margin-top: 5px;
-}
-
-/* Tabs classes */
-
-.tabs {
-	float: left;
-	width: 100%;
-	line-height: normal;
-	background-image: url("../images/xp/tabs_bg.gif");
-}
-
-.tabs ul {
-	margin: 0;
-	padding: 0 0 0;
-	list-style: none;
-}
-
-.tabs li {
-	float: left;
-	background: url("../images/xp/tab_bg.gif") no-repeat left top;
-	margin: 0;
-	margin-left: 0;
-	margin-right: 2px;
-	padding: 0 0 0 10px;
-	line-height: 18px;
-}
-
-.tabs li.current {
-	background: url("../images/xp/tab_sel_bg.gif") no-repeat left top;
-	margin-right: 2px;
-}
-
-.tabs span {
-	float: left;
-	display: block;
-	background: url("../images/xp/tab_end.gif") no-repeat right top;
-	padding: 0px 10px 0 0;
-}
-
-.tabs .current span {
-	background: url("../images/xp/tab_sel_end.gif") no-repeat right top;
-}
-
-.tabs a {
-	text-decoration: none;
-	font-family: Verdana, Arial;
-	font-size: 10px;
-}
-
-.tabs a:link, .tabs a:visited, .tabs a:hover {
-	color: black;
-}
-
-.tabs a:hover {
-}
-
-.tabs .current {
-}
-
-.tabs .current a, .tabs .current a:link, .tabs .current a:visited {
-}
-
-.panel_wrapper div.panel {
-	display: none;
-}
-
-.panel_wrapper div.current {
-	display: block;
-	width: 100%;
-	height: 300px;
-	overflow: visible; /* Should be auto but that breaks Safari */
-}
-
-.panel_wrapper {
-	border: 1px solid #919B9C;
-	border-top: 0px;
-	padding: 10px;
-	padding-top: 5px;
-	clear: both;
-	background-color: white;
-}
-
-fieldset {
-	border: 1px solid #919B9C;
-	font-family: Verdana, Arial;
-	font-size: 10px;
-	padding: 0;
-	margin: 0;
-	padding: 4px;
-}
-
-legend {
-	color: #2B6FB6;
-	font-weight: bold;
-}
-
-.properties {
-	width: 100%;
-}
-
-.properties .column1 {
-}
-
-.properties .column2 {
-	text-align: left;
-}
-
-a:link, a:visited {
-	color: black;
-}
-
-a:hover {
-	color: #2B6FB6;
-}
-
-#plugintable thead {
-	font-weight: bold;
-	background-color: #DDDDDD;
-}
-
-#plugintable, #about #plugintable td {
-	border: 1px solid #919B9C;
-}
-
-#plugintable {
-	width: 99%;
-	margin-top: 10px;
-}
-
-#pluginscontainer {
-	height: 290px;
-	overflow: auto;
-}
-
-/* MSIE Specific styles */
-
-* html .panel_wrapper {
-	width: 100%;
-}
-
-.column {
-	float: left;
-}
-
-h1, h2, h3, h4 {
-	color: #2B6FB6;
-	margin: 0;
-	padding: 0;
-	padding-top: 5px;
-}
-
-h3 {
-	font-size: 14px;
-}
-
-#link .panel_wrapper, #link div.current {
-	height: 125px;
-}
-
-#image .panel_wrapper, #image div.current {
-	height: 190px;
-}
-
-label.msg { display: none; }
-label.invalid { color: #EE0000; display: inline; }
-input.invalid { border: 1px solid #EE0000; }
-
-/* Disables the advanced tab in the table plugin. */
-/*
-#table #advanced_tab {
-	display: none;
-}
-*/
-
-/* Disables the border input field and label in the table plugin. */
-/*
-#table #border, #table #borderlabel {
-	display: none;
-}
-*/
-
-/* Below this line is WordPress customizations */
-#insert, #cancel, .submitbutton {
-	font: 11px Verdana, Arial, Helvetica, sans-serif;
-	height: auto;
-	width: auto;
-	background-color: transparent;
-	background-image: url(../../../../../../wp-admin/images/fade-butt.png);
-	background-repeat: repeat;
-	border: 3px double;
-	border-right-color: rgb(153, 153, 153);
-	border-bottom-color: rgb(153, 153, 153);
-	border-left-color: rgb(204, 204, 204);
-	border-top-color: rgb(204, 204, 204);
-	color: rgb(51, 51, 51);
-	padding: 0.1em 0.5em;
-}
-
-#insert:active, #cancel:active, .submitbutton:active {
-	background: #f4f4f4;
-	border-left-color: #999;
-	border-top-color: #999;
-}
-
-#styleSelectRow {
-	display: none;
-}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/css/editor_ui.css 2.5.src/wp-includes/js/tinymce/themes/advanced/css/editor_ui.css
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/css/editor_ui.css	2007-04-12 12:04:03.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/css/editor_ui.css	1969-12-31 18:00:00.000000000 -0600
@@ -1,97 +0,0 @@
-/* This file contains the CSS data for the editor UI of TinyMCE instances */
-
-.mceToolbarTop a, .mceToolbarTop a:visited, .mceToolbarTop a:hover, .mceToolbarBottom a, .mceToolbarBottom a:visited, .mceToolbarBottom a:hover {border: 0; margin: 0; padding: 0; background: transparent;}
-.mceSeparatorLine {border: 0; padding: 0; margin-left: 4px; margin-right: 2px;}
-.mceSelectList {font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; font-size: 7pt !important; font-weight: normal; margin-top: 3px; padding: 0; display: inline; vertical-align: top; background-color: #F0F0EE;}
-.mceLabel, .mceLabelDisabled {font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; font-size: 9pt;}
-.mceLabel {color: #000000;}
-.mceLabelDisabled {cursor: text; color: #999999;}
-.mceEditor {background: #F0F0EE; border: 1px solid #cccccc; padding: 0; margin: 0;}
-.mceEditorArea { font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; background: #FFFFFF; padding: 0; margin: 0; }
-.mceToolbarTop, .mceToolbarBottom {background: #F0F0EE; line-height: 1px; font-size: 1px;}
-.mceToolbarTop {border-bottom: 1px solid #cccccc; padding-bottom: 1px;}
-.mceToolbarBottom {border-top: 1px solid #cccccc;}
-.mceToolbarContainer {display: block; position: relative; left: 0; top: 0; width: 100%;}
-.mceStatusbarTop, .mceStatusbarBottom, .mceStatusbar {height: 20px;}
-.mceStatusbarTop .mceStatusbarPathText, .mceStatusbarBottom .mceStatusbarPathText, .mceStatusbar .mceStatusbarPathText {font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; font-size: 9pt; padding: 2px; line-height: 16px; overflow: visible;}
-.mceStatusbarTop {border-bottom: 1px solid #cccccc;}
-.mceStatusbarBottom {border-top: 1px solid #cccccc;}
-.mceStatusbar {border-bottom: 1px solid #cccccc;}
-.mcePathItem, .mcePathItem:link, .mcePathItem:visited, .mcePathItem:hover {text-decoration: none; font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; font-size: 9pt; color: #000000;}
-.mcePathItem:hover {text-decoration: underline;}
-.mceStatusbarPathText {float: left;}
-.mceStatusbarResize {float: right; background-image: url('../images/statusbar_resize.gif'); background-repeat: no-repeat; width: 11px; height: 20px; cursor: se-resize;}
-.mceResizeBox {width: 10px; height: 10px; display: none; border: 1px dotted gray; margin: 0; padding: 0;}
-.mceEditorIframe {border: 0;}
-
-/* Button CSS rules */
-
-a.mceButtonDisabled img, a.mceButtonNormal img, a.mceButtonSelected img {width: 20px; height: 20px; cursor: default; margin-top: 1px; margin-left: 1px;}
-a.mceButtonDisabled img {border: 0 !important;}
-a.mceButtonNormal img, a.mceButtonSelected img {border: 1px solid #F0F0EE !important;}
-a.mceButtonSelected img {border: 1px solid #6779AA !important; background-color: #D4D5D8;}
-a.mceButtonNormal img:hover, a.mceButtonSelected img:hover {border: 1px solid #0A246A !important; cursor: default; background-color: #B6BDD2;}
-a.mceButtonDisabled img {-moz-opacity:0.3; opacity: 0.3; border: 1px solid #F0F0EE !important; cursor: default;}
-a.mceTiledButton img {background-image: url('../images/buttons.gif'); background-repeat: no-repeat;}
-
-/* Menu button CSS rules */
-
-span.mceMenuButton img, span.mceMenuButtonSelected img {border: 1px solid #F0F0EE; margin-left: 1px;}
-span.mceMenuButtonSelected img {border: 1px solid #6779AA; background-color: #B6BDD2;}
-span.mceMenuButtonSelected img.mceMenuButton {border: 1px solid #F0F0EE; background-color: transparent;}
-span.mceMenuButton img.mceMenuButton, span.mceMenuButtonSelected img.mceMenuButton {border-left: 0; margin-left: 0;}
-span.mceMenuButton:hover img, span.mceMenuButtonSelected:hover img {border: 1px solid #0A246A; background-color: #B6BDD2;}
-span.mceMenuButton:hover img.mceMenuButton, span.mceMenuButtonSelected:hover img.mceMenuButton {border-left: 0;}
-span.mceMenuButtonFocus img {border: 1px solid gray; border-right: 0; margin-left: 1px; background-color: #F5F4F2;}
-span.mceMenuButtonFocus img.mceMenuButton {border: 1px solid gray; border-left: 1px solid #F5F4F2; margin-left: 0;}
-span.mceMenuHover img {border: 1px solid #0A246A; background-color: #B6BDD2;}
-span.mceMenuButtonSelected.mceMenuHover img.mceMenuButton {border: 1px solid #0A246A; background-color: #B6BDD2; border-left: 0;}
-
-/* Menu */
-
-.mceMenu {position: absolute; left: 0; top: 0; display: none; z-index: 1000; background-color: white; border: 1px solid gray; font-weight: normal;}
-.mceMenu a, .mceMenuTitle, .mceMenuDisabled {display: block; width: 100%; text-decoration: none; background-color: white; font-family: Tahoma, Verdana, Arial, Helvetica; font-size: 11px; line-height: 20px; color: black;}
-.mceMenu a:hover {background-color: #B6BDD2; color: black; text-decoration: none !important;}
-.mceMenu span {padding-left: 10px; padding-right: 10px; display: block; line-height: 20px;}
-.mceMenuSeparator {border-bottom: 1px solid gray; background-color: gray; height: 1px;}
-.mceMenuTitle span {padding-left: 5px;}
-.mceMenuTitle {background-color: #DDDDDD; font-weight: bold;}
-.mceMenuDisabled {color: gray;}
-span.mceMenuSelectedItem {background-image: url('../images/menu_check.gif'); background-repeat: no-repeat; background-position: 5px 8px; padding-left: 20px;}
-span.mceMenuCheckItem {padding-left: 20px;}
-span.mceMenuLine {display: block; position: absolute; left: 0; top: -1px; background-color: #F5F4F2; width: 30px; height: 1px; overflow: hidden; padding-left: 0; padding-right: 0;}
-.mceColors table, .mceColors td {margin: 0; padding: 2px;}
-a.mceMoreColors {width: auto; padding: 0; margin: 0 3px 3px 3px; text-align: center; border: 1px solid white; text-decoration: none !important;}
-.mceColorPreview {position: absolute; overflow:hidden; left: 0; top: 0; margin-left: 3px; margin-top: 15px; width: 16px; height: 4px; background-color: red;}
-a.mceMoreColors:hover {border: 1px solid #0A246A;}
-.mceColors td a {width: 9px; height: 9px; overflow: hidden; border: 1px solid #808080;}
-
-/* MSIE 6 specific rules */
-
-* html a.mceButtonNormal img, * html a.mceButtonSelected img, * html a.mceButtonDisabled img {border: 0 !important; margin-top: 2px; margin-bottom: 1px;}
-* html a.mceButtonDisabled img {filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); border: 0 !important;}
-* html a.mceButtonDisabled {border: 1px solid #F0F0EE !important;}
-* html a.mceButtonNormal, * html a.mceButtonSelected {border: 1px solid #F0F0EE !important; cursor: default;}
-* html a.mceButtonSelected {border: 1px solid #6779AA !important; background-color: #D4D5D8;}
-* html a.mceButtonNormal:hover, * html a.mceButtonSelected:hover {border: 1px solid #0A246A !important; background-color: #B6BDD2; cursor: default;}
-* html .mceSelectList {margin-top: 2px;}
-* html span.mceMenuButton, * html span.mceMenuButtonFocus {position: relative; left: 0; top: 0;}
-* html span.mceMenuButton img, * html span.mceMenuButtonSelected img, * html span.mceMenuButtonFocus img {position: relative; top: 1px;}
-* html a.mceMoreColors {width: auto;}
-* html .mceColors td a {width: 10px; height: 10px;}
-* html .mceColorPreview {margin-left: 2px; margin-top: 14px;}
-
-/* MSIE 7 specific rules */
-
-*:first-child+html a.mceButtonNormal img, *:first-child+html a.mceButtonSelected img, *:first-child+html a.mceButtonDisabled img {border: 0 !important; margin-top: 2px; margin-bottom: 1px;}
-*:first-child+html a.mceButtonDisabled img {filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); border: 0 !important;}
-*:first-child+html a.mceButtonDisabled {border: 1px solid #F0F0EE !important;}
-*:first-child+html a.mceButtonNormal, *:first-child+html a.mceButtonSelected {border: 1px solid #F0F0EE !important; cursor: default;}
-*:first-child+html a.mceButtonSelected {border: 1px solid #6779AA !important; background-color: #D4D5D8;}
-*:first-child+html a.mceButtonNormal:hover, *:first-child+html a.mceButtonSelected:hover {border: 1px solid #0A246A !important; background-color: #B6BDD2; cursor: default;}
-*:first-child+html .mceSelectList {margin-top: 2px;}
-*:first-child+html span.mceMenuButton, *:first-child+html span.mceMenuButtonFocus {position: relative; left: 0; top: 0;}
-*:first-child+html span.mceMenuButton img, *:first-child+html span.mceMenuButtonSelected img, *:first-child+html span.mceMenuButtonFocus img {position: relative; top: 1px;}
-*:first-child+html a.mceMoreColors {width: 137px;}
-*:first-child+html .mceColors td a {width: 10px; height: 10px;}
-*:first-child+html .mceColorPreview {margin: 0; padding-left: 4px; margin-top: 14px; width: 14px;}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/editor_template.js 2.5.src/wp-includes/js/tinymce/themes/advanced/editor_template.js
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/editor_template.js	2007-04-12 12:04:03.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/editor_template.js	2008-03-27 22:49:35.000000000 -0500
@@ -1,1579 +1 @@
-/**
- * $Id: editor_template_src.js 218 2007-02-13 11:08:01Z spocke $
- *
- * @author Moxiecode
- * @copyright Copyright  2004-2007, Moxiecode Systems AB, All rights reserved.
- */
-
-/* Import theme specific language pack */
-tinyMCE.importThemeLanguagePack('advanced');
-
-var TinyMCE_AdvancedTheme = {
-	// Private theme fields
-	_defColors : "000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,008000,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF",
-	_autoImportCSSClasses : true,
-	_resizer : {},
-	_buttons : [
-		// Control id, button img, button title, command, user_interface, value
-		['bold', '{$lang_bold_img}', 'lang_bold_desc', 'Bold'],
-		['italic', '{$lang_italic_img}', 'lang_italic_desc', 'Italic'],
-		['underline', '{$lang_underline_img}', 'lang_underline_desc', 'Underline'],
-		['strikethrough', 'strikethrough.gif', 'lang_striketrough_desc', 'Strikethrough'],
-		['justifyleft', 'justifyleft.gif', 'lang_justifyleft_desc', 'JustifyLeft'],
-		['justifycenter', 'justifycenter.gif', 'lang_justifycenter_desc', 'JustifyCenter'],
-		['justifyright', 'justifyright.gif', 'lang_justifyright_desc', 'JustifyRight'],
-		['justifyfull', 'justifyfull.gif', 'lang_justifyfull_desc', 'JustifyFull'],
-		['bullist', 'bullist.gif', 'lang_bullist_desc', 'InsertUnorderedList'],
-		['numlist', 'numlist.gif', 'lang_numlist_desc', 'InsertOrderedList'],
-		['outdent', 'outdent.gif', 'lang_outdent_desc', 'Outdent'],
-		['indent', 'indent.gif', 'lang_indent_desc', 'Indent'],
-		['cut', 'cut.gif', 'lang_cut_desc', 'Cut'],
-		['copy', 'copy.gif', 'lang_copy_desc', 'Copy'],
-		['paste', 'paste.gif', 'lang_paste_desc', 'Paste'],
-		['undo', 'undo.gif', 'lang_undo_desc', 'Undo'],
-		['redo', 'redo.gif', 'lang_redo_desc', 'Redo'],
-		['link', 'link.gif', 'lang_link_desc', 'mceLink', true],
-		['unlink', 'unlink.gif', 'lang_unlink_desc', 'unlink'],
-		['image', 'image.gif', 'lang_image_desc', 'mceImage', true],
-		['cleanup', 'cleanup.gif', 'lang_cleanup_desc', 'mceCleanup'],
-		['help', 'help.gif', 'lang_help_desc', 'mceHelp'],
-		['code', 'code.gif', 'lang_theme_code_desc', 'mceCodeEditor'],
-		['hr', 'hr.gif', 'lang_theme_hr_desc', 'inserthorizontalrule'],
-		['removeformat', 'removeformat.gif', 'lang_theme_removeformat_desc', 'removeformat'],
-		['sub', 'sub.gif', 'lang_theme_sub_desc', 'subscript'],
-		['sup', 'sup.gif', 'lang_theme_sup_desc', 'superscript'],
-		['forecolor', 'forecolor.gif', 'lang_theme_forecolor_desc', 'forecolor', true],
-		['forecolorpicker', 'forecolor.gif', 'lang_theme_forecolor_desc', 'forecolorpicker', true],
-		['backcolor', 'backcolor.gif', 'lang_theme_backcolor_desc', 'HiliteColor', true],
-		['backcolorpicker', 'backcolor.gif', 'lang_theme_backcolor_desc', 'backcolorpicker', true],
-		['charmap', 'charmap.gif', 'lang_theme_charmap_desc', 'mceCharMap'],
-		['visualaid', 'visualaid.gif', 'lang_theme_visualaid_desc', 'mceToggleVisualAid'],
-		['anchor', 'anchor.gif', 'lang_theme_anchor_desc', 'mceInsertAnchor'],
-		['newdocument', 'newdocument.gif', 'lang_newdocument_desc', 'mceNewDocument']
-	],
-
-	_buttonMap : 'anchor,backcolor,bold,bullist,charmap,cleanup,code,copy,cut,forecolor,help,hr,image,indent,italic,justifycenter,justifyfull,justifyleft,justifyright,link,newdocument,numlist,outdent,paste,redo,removeformat,strikethrough,sub,sup,underline,undo,unlink,visualaid,advhr,ltr,rtl,emotions,flash,fullpage,fullscreen,iespell,insertdate,inserttime,pastetext,pasteword,selectall,preview,print,save,replace,search,table,cell_props,delete_col,delete_row,col_after,col_before,row_after,row_before,merge_cells,row_props,split_cells,delete_table',
-
-	/**
-	 * Returns HTML code for the specificed control.
-	 */
-	getControlHTML : function(button_name) {
-		var i, x, but;
-
-		// Lookup button in button list
-		for (i=0; i<TinyMCE_AdvancedTheme._buttons.length; i++) {
-			but = TinyMCE_AdvancedTheme._buttons[i];
-
-			if (but[0] == button_name && (button_name == "forecolor" || button_name == "backcolor"))
-				return tinyMCE.getMenuButtonHTML(but[0], but[2], '{$themeurl}/images/' + but[1], but[3] + "Menu", but[3], (but.length > 4 ? but[4] : false), (but.length > 5 ? but[5] : null));
-
-			if (but[0] == button_name)
-				return tinyMCE.getButtonHTML(but[0], but[2], '{$themeurl}/images/' + but[1], but[3], (but.length > 4 ? but[4] : false), (but.length > 5 ? but[5] : null));
-		}
-
-		// Custom controlls other than buttons
-		switch (button_name) {
-			case "formatselect":
-				var html = '<select id="{$editor_id}_formatSelect" name="{$editor_id}_formatSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FormatBlock\',false,this.options[this.selectedIndex].value);" class="mceSelectList">';
-				var formats = tinyMCE.getParam("theme_advanced_blockformats", "p,address,pre,h1,h2,h3,h4,h5,h6", true).split(',');
-				var lookup = [
-					['p', '{$lang_theme_paragraph}'],
-					['address', '{$lang_theme_address}'],
-					['pre', '{$lang_theme_pre}'],
-					['h1', '{$lang_theme_h1}'],
-					['h2', '{$lang_theme_h2}'],
-					['h3', '{$lang_theme_h3}'],
-					['h4', '{$lang_theme_h4}'],
-					['h5', '{$lang_theme_h5}'],
-					['h6', '{$lang_theme_h6}'],
-					['div', '{$lang_theme_div}'],
-					['blockquote', '{$lang_theme_blockquote}'],
-					['code', '{$lang_theme_code}'],
-					['dt', '{$lang_theme_dt}'],
-					['dd', '{$lang_theme_dd}'],
-					['samp', '{$lang_theme_samp}']
-				];
-
-				html += '<option value="">{$lang_theme_block}</option>';
-
-				// Build format select
-				for (var i=0; i<formats.length; i++) {
-					for (var x=0; x<lookup.length; x++) {
-						if (formats[i] == lookup[x][0])
-							html += '<option value="&lt;' + lookup[x][0] + '&gt;">' + lookup[x][1] + '</option>';
-					}
-				}
-
-				html += '</select>';
-
-				return html;
-
-			case "styleselect":
-				return '<select id="{$editor_id}_styleSelect" onmousedown="tinyMCE.themes.advanced._setupCSSClasses(\'{$editor_id}\');" name="{$editor_id}_styleSelect" onfocus="tinyMCE.addSelectAccessibility(event,this,window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSetCSSClass\',false,this.options[this.selectedIndex].value);" class="mceSelectList">{$style_select_options}</select>';
-
-			case "fontselect":
-				var fontHTML = '<select id="{$editor_id}_fontNameSelect" name="{$editor_id}_fontNameSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FontName\',false,this.options[this.selectedIndex].value);" class="mceSelectList"><option value="">{$lang_theme_fontdefault}</option>';
-				var iFonts = 'Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;WingDings=wingdings';
-				var nFonts = 'Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sand;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats';
-				var fonts = tinyMCE.getParam("theme_advanced_fonts", nFonts).split(';');
-				for (i=0; i<fonts.length; i++) {
-					if (fonts[i] != '') {
-						var parts = fonts[i].split('=');
-						fontHTML += '<option value="' + parts[1] + '">' + parts[0] + '</option>';
-					}
-				}
-
-				fontHTML += '</select>';
-				return fontHTML;
-
-			case "fontsizeselect":
-				return '<select id="{$editor_id}_fontSizeSelect" name="{$editor_id}_fontSizeSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FontSize\',false,this.options[this.selectedIndex].value);" class="mceSelectList">'+
-						'<option value="0">{$lang_theme_font_size}</option>'+
-						'<option value="1">1 (8 pt)</option>'+
-						'<option value="2">2 (10 pt)</option>'+
-						'<option value="3">3 (12 pt)</option>'+
-						'<option value="4">4 (14 pt)</option>'+
-						'<option value="5">5 (18 pt)</option>'+
-						'<option value="6">6 (24 pt)</option>'+
-						'<option value="7">7 (36 pt)</option>'+
-						'</select>';
-
-			case "|":
-			case "separator":
-				return '<img src="{$themeurl}/images/separator.gif" width="2" height="20" class="mceSeparatorLine" />';
-
-			case "spacer":
-				return '<img src="{$themeurl}/images/separator.gif" width="2" height="15" border="0" class="mceSeparatorLine" style="vertical-align: middle" />';
-
-			case "rowseparator":
-				return '<br />';
-		}
-
-		return "";
-	},
-
-	/**
-	 * Theme specific execcommand handling.
-	 */
-	execCommand : function(editor_id, element, command, user_interface, value) {
-		switch (command) {
-			case 'mceHelp':
-				tinyMCE.openWindow({
-					file : 'about.htm',
-					width : 480,
-					height : 380
-				}, {
-					tinymce_version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion,
-					tinymce_releasedate : tinyMCE.releaseDate,
-					inline : "yes"
-				});
-			return true;
-
-			case "mceLink":
-				var inst = tinyMCE.getInstanceById(editor_id);
-				var doc = inst.getDoc();
-				var selectedText = "";
-
-				if (tinyMCE.isMSIE) {
-					var rng = doc.selection.createRange();
-					selectedText = rng.text;
-				} else
-					selectedText = inst.getSel().toString();
-
-				if (!tinyMCE.linkElement) {
-					if ((tinyMCE.selectedElement.nodeName.toLowerCase() != "img") && (selectedText.length <= 0))
-						return true;
-				}
-
-				var href = "", target = "", title = "", onclick = "", action = "insert", style_class = "";
-
-				if (tinyMCE.selectedElement.nodeName.toLowerCase() == "a")
-					tinyMCE.linkElement = tinyMCE.selectedElement;
-
-				// Is anchor not a link
-				if (tinyMCE.linkElement != null && tinyMCE.getAttrib(tinyMCE.linkElement, 'href') == "")
-					tinyMCE.linkElement = null;
-
-				if (tinyMCE.linkElement) {
-					href = tinyMCE.getAttrib(tinyMCE.linkElement, 'href');
-					target = tinyMCE.getAttrib(tinyMCE.linkElement, 'target');
-					title = tinyMCE.getAttrib(tinyMCE.linkElement, 'title');
-					onclick = tinyMCE.getAttrib(tinyMCE.linkElement, 'onclick');
-					style_class = tinyMCE.getAttrib(tinyMCE.linkElement, 'class');
-
-					// Try old onclick to if copy/pasted content
-					if (onclick == "")
-						onclick = tinyMCE.getAttrib(tinyMCE.linkElement, 'onclick');
-
-					onclick = tinyMCE.cleanupEventStr(onclick);
-
-					href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement, true);");
-
-					// Use mce_href if defined
-					mceRealHref = tinyMCE.getAttrib(tinyMCE.linkElement, 'mce_href');
-					if (mceRealHref != "") {
-						href = mceRealHref;
-
-						if (tinyMCE.getParam('convert_urls'))
-							href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement, true);");
-					}
-
-					action = "update";
-				}
-
-				var template = new Array();
-
-				template['file'] = 'link.htm';
-				template['width'] = 310;
-				template['height'] = 200;
-
-				// Language specific width and height addons
-				template['width'] += tinyMCE.getLang('lang_insert_link_delta_width', 0);
-				template['height'] += tinyMCE.getLang('lang_insert_link_delta_height', 0);
-
-				if (inst.settings['insertlink_callback']) {
-					var returnVal = eval(inst.settings['insertlink_callback'] + "(href, target, title, onclick, action, style_class);");
-					if (returnVal && returnVal['href'])
-						TinyMCE_AdvancedTheme._insertLink(returnVal['href'], returnVal['target'], returnVal['title'], returnVal['onclick'], returnVal['style_class']);
-				} else {
-					tinyMCE.openWindow(template, {href : href, target : target, title : title, onclick : onclick, action : action, className : style_class, inline : "yes"});
-				}
-
-				return true;
-
-			case "mceImage":
-				var src = "", alt = "", border = "", hspace = "", vspace = "", width = "", height = "", align = "";
-				var title = "", onmouseover = "", onmouseout = "", action = "insert";
-				var img = tinyMCE.imgElement;
-				var inst = tinyMCE.getInstanceById(editor_id);
-
-				if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img") {
-					img = tinyMCE.selectedElement;
-					tinyMCE.imgElement = img;
-				}
-
-				if (img) {
-					// Is it a internal MCE visual aid image, then skip this one.
-					if (tinyMCE.getAttrib(img, 'name').indexOf('mce_') == 0)
-						return true;
-
-					src = tinyMCE.getAttrib(img, 'src');
-					alt = tinyMCE.getAttrib(img, 'alt');
-
-					// Try polling out the title
-					if (alt == "")
-						alt = tinyMCE.getAttrib(img, 'title');
-
-					// Fix width/height attributes if the styles is specified
-					if (tinyMCE.isGecko) {
-						var w = img.style.width;
-						if (w != null && w != "")
-							img.setAttribute("width", w);
-
-						var h = img.style.height;
-						if (h != null && h != "")
-							img.setAttribute("height", h);
-					}
-
-					border = tinyMCE.getAttrib(img, 'border');
-					hspace = tinyMCE.getAttrib(img, 'hspace');
-					vspace = tinyMCE.getAttrib(img, 'vspace');
-					width = tinyMCE.getAttrib(img, 'width');
-					height = tinyMCE.getAttrib(img, 'height');
-					align = tinyMCE.getAttrib(img, 'align');
-					onmouseover = tinyMCE.getAttrib(img, 'onmouseover');
-					onmouseout = tinyMCE.getAttrib(img, 'onmouseout');
-					title = tinyMCE.getAttrib(img, 'title');
-
-					// Is realy specified?
-					if (tinyMCE.isMSIE) {
-						width = img.attributes['width'].specified ? width : "";
-						height = img.attributes['height'].specified ? height : "";
-					}
-
-					//onmouseover = tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseover));
-					//onmouseout = tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseout));
-
-					src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, img, true);");
-
-					// Use mce_src if defined
-					mceRealSrc = tinyMCE.getAttrib(img, 'mce_src');
-					if (mceRealSrc != "") {
-						src = mceRealSrc;
-
-						if (tinyMCE.getParam('convert_urls'))
-							src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, img, true);");
-					}
-
-					//if (onmouseover != "")
-					//	onmouseover = eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseover, img, true);");
-
-					//if (onmouseout != "")
-					//	onmouseout = eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseout, img, true);");
-
-					action = "update";
-				}
-
-				var template = new Array();
-
-				template['file'] = 'image.htm?src={$src}';
-				template['width'] = 355;
-				template['height'] = 265 + (tinyMCE.isMSIE ? 25 : 0);
-
-				// Language specific width and height addons
-				template['width'] += tinyMCE.getLang('lang_insert_image_delta_width', 0);
-				template['height'] += tinyMCE.getLang('lang_insert_image_delta_height', 0);
-
-				if (inst.settings['insertimage_callback']) {
-					var returnVal = eval(inst.settings['insertimage_callback'] + "(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout, action);");
-					if (returnVal && returnVal['src'])
-						TinyMCE_AdvancedTheme._insertImage(returnVal['src'], returnVal['alt'], returnVal['border'], returnVal['hspace'], returnVal['vspace'], returnVal['width'], returnVal['height'], returnVal['align'], returnVal['title'], returnVal['onmouseover'], returnVal['onmouseout']);
-				} else
-					tinyMCE.openWindow(template, {src : src, alt : alt, border : border, hspace : hspace, vspace : vspace, width : width, height : height, align : align, title : title, onmouseover : onmouseover, onmouseout : onmouseout, action : action, inline : "yes"});
-
-				return true;
-
-			case "forecolor":
-				var fcp = new TinyMCE_Layer(editor_id + '_fcPreview', false), p, img, elm;
-
-				TinyMCE_AdvancedTheme._hideMenus(editor_id);
-
-				if (!fcp.exists()) {
-					fcp.create('div', 'mceColorPreview', document.getElementById(editor_id + '_toolbar'));
-					elm = fcp.getElement();
-					elm._editor_id = editor_id;
-					elm._command = "forecolor";
-					elm._switchId = editor_id + "_forecolor";
-					tinyMCE.addEvent(elm, 'click', TinyMCE_AdvancedTheme._handleMenuEvent);
-					tinyMCE.addEvent(elm, 'mouseover', TinyMCE_AdvancedTheme._handleMenuEvent);
-					tinyMCE.addEvent(elm, 'mouseout', TinyMCE_AdvancedTheme._handleMenuEvent);
-				}
-
-				img = tinyMCE.selectNodes(document.getElementById(editor_id + "_forecolor"), function(n) {return n.nodeName == "IMG";})[0];
-				p = tinyMCE.getAbsPosition(img, document.getElementById(editor_id + '_toolbar'));
-
-				fcp.moveTo(p.absLeft, p.absTop);
-				fcp.getElement().style.backgroundColor = value != null ? value : tinyMCE.getInstanceById(editor_id).foreColor;
-				fcp.show();
-
-				return false;
-
-			case "forecolorpicker":
-				this._pickColor(editor_id, 'forecolor');
-				return true;
-
-			case "forecolorMenu":
-				TinyMCE_AdvancedTheme._hideMenus(editor_id);
-
-				// Create color layer
-				var ml = new TinyMCE_Layer(editor_id + '_fcMenu');
-
-				if (!ml.exists())
-					ml.create('div', 'mceMenu', document.body, TinyMCE_AdvancedTheme._getColorHTML(editor_id, 'theme_advanced_text_colors', 'forecolor'));
-
-				tinyMCE.switchClass(editor_id + '_forecolor', 'mceMenuButtonFocus');
-				ml.moveRelativeTo(document.getElementById(editor_id + "_forecolor"), 'bl');
-
-				ml.moveBy(tinyMCE.isMSIE && !tinyMCE.isOpera ? -1 : 1, -1);
-
-				if (tinyMCE.isOpera)
-					ml.moveBy(0, -2);
-
-				ml.show();
-			return true;
-
-			case "HiliteColor":
-				var bcp = new TinyMCE_Layer(editor_id + '_bcPreview', false), p, img;
-
-				TinyMCE_AdvancedTheme._hideMenus(editor_id);
-
-				if (!bcp.exists()) {
-					bcp.create('div', 'mceColorPreview', document.getElementById(editor_id + '_toolbar'));
-					elm = bcp.getElement();
-					elm._editor_id = editor_id;
-					elm._command = "HiliteColor";
-					elm._switchId = editor_id + "_backcolor";
-					tinyMCE.addEvent(elm, 'click', TinyMCE_AdvancedTheme._handleMenuEvent);
-					tinyMCE.addEvent(elm, 'mouseover', TinyMCE_AdvancedTheme._handleMenuEvent);
-					tinyMCE.addEvent(elm, 'mouseout', TinyMCE_AdvancedTheme._handleMenuEvent);
-				}
-
-				img = tinyMCE.selectNodes(document.getElementById(editor_id + "_backcolor"), function(n) {return n.nodeName == "IMG";})[0];
-				p = tinyMCE.getAbsPosition(img, document.getElementById(editor_id + '_toolbar'));
-
-				bcp.moveTo(p.absLeft, p.absTop);
-				bcp.getElement().style.backgroundColor = value != null ? value : tinyMCE.getInstanceById(editor_id).backColor;
-				bcp.show();
-
-				return false;
-
-			case "HiliteColorMenu":
-				TinyMCE_AdvancedTheme._hideMenus(editor_id);
-
-				// Create color layer
-				var ml = new TinyMCE_Layer(editor_id + '_bcMenu');
-
-				if (!ml.exists())
-					ml.create('div', 'mceMenu', document.body, TinyMCE_AdvancedTheme._getColorHTML(editor_id, 'theme_advanced_background_colors', 'HiliteColor'));
-
-				tinyMCE.switchClass(editor_id + '_backcolor', 'mceMenuButtonFocus');
-				ml.moveRelativeTo(document.getElementById(editor_id + "_backcolor"), 'bl');
-
-				ml.moveBy(tinyMCE.isMSIE && !tinyMCE.isOpera ? -1 : 1, -1);
-
-				if (tinyMCE.isOpera)
-					ml.moveBy(0, -2);
-
-				ml.show();
-			return true;
-	
-			case "backcolorpicker":
-				this._pickColor(editor_id, 'HiliteColor');
-				return true;
-
-			case "mceColorPicker":
-				if (user_interface) {
-					var template = [];
-	
-					if (!value['callback'] && !value['color'])
-						value['color'] = value['document'].getElementById(value['element_id']).value;
-
-					template['file'] = 'color_picker.htm';
-					template['width'] = 380;
-					template['height'] = 250;
-					template['close_previous'] = "no";
-
-					template['width'] += tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_width', 0);
-					template['height'] += tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_height', 0);
-
-					if (typeof(value['store_selection']) == "undefined")
-						value['store_selection'] = true;
-
-					tinyMCE.lastColorPickerValue = value;
-					tinyMCE.openWindow(template, {editor_id : editor_id, mce_store_selection : value['store_selection'], inline : "yes", command : "mceColorPicker", input_color : value['color']});
-				} else {
-					var savedVal = tinyMCE.lastColorPickerValue, elm;
-
-					if (savedVal['callback']) {
-						savedVal['callback'](value);
-						return true;
-					}
-
-					elm = savedVal['document'].getElementById(savedVal['element_id']);
-					elm.value = value;
-
-					if (elm.onchange != null && elm.onchange != '')
-						eval('elm.onchange();');
-				}
-			return true;
-
-			case "mceCodeEditor":
-				var template = new Array();
-
-				template['file'] = 'source_editor.htm';
-				template['width'] = parseInt(tinyMCE.getParam("theme_advanced_source_editor_width", 720));
-				template['height'] = parseInt(tinyMCE.getParam("theme_advanced_source_editor_height", 580));
-
-				tinyMCE.openWindow(template, {editor_id : editor_id, resizable : "yes", scrollbars : "no", inline : "yes"});
-				return true;
-
-			case "mceCharMap":
-				var template = new Array();
-
-				template['file'] = 'charmap.htm';
-				template['width'] = 550 + (tinyMCE.isOpera ? 40 : 0);
-				template['height'] = 250;
-
-				template['width'] += tinyMCE.getLang('lang_theme_advanced_charmap_delta_width', 0);
-				template['height'] += tinyMCE.getLang('lang_theme_advanced_charmap_delta_height', 0);
-
-				tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"});
-				return true;
-
-			case "mceInsertAnchor":
-				var template = new Array();
-
-				template['file'] = 'anchor.htm';
-				template['width'] = 320;
-				template['height'] = 90 + (tinyMCE.isNS7 ? 30 : 0);
-
-				template['width'] += tinyMCE.getLang('lang_theme_advanced_anchor_delta_width', 0);
-				template['height'] += tinyMCE.getLang('lang_theme_advanced_anchor_delta_height', 0);
-
-				tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"});
-				return true;
-
-			case "mceNewDocument":
-				if (confirm(tinyMCE.getLang('lang_newdocument')))
-					tinyMCE.execInstanceCommand(editor_id, 'mceSetContent', false, ' ');
-
-				return true;
-		}
-
-		return false;
-	},
-
-	/**
-	 * Editor instance template function.
-	 */
-	getEditorTemplate : function(settings, editorId) {
-		function removeFromArray(in_array, remove_array) {
-			var outArray = new Array(), skip;
-			
-			for (var i=0; i<in_array.length; i++) {
-				skip = false;
-
-				for (var j=0; j<remove_array.length; j++) {
-					if (in_array[i] == remove_array[j]) {
-						skip = true;
-					}
-				}
-
-				if (!skip) {
-					outArray[outArray.length] = in_array[i];
-				}
-			}
-
-			return outArray;
-		}
-
-		function addToArray(in_array, add_array) {
-			for (var i=0; i<add_array.length; i++) {
-				in_array[in_array.length] = add_array[i];
-			}
-
-			return in_array;
-		}
-
-		var template = new Array();
-		var deltaHeight = 0;
-		var resizing = tinyMCE.getParam("theme_advanced_resizing", false);
-		var path = tinyMCE.getParam("theme_advanced_path", true);
-		var statusbarHTML = '<div id="{$editor_id}_path" class="mceStatusbarPathText" style="display: ' + (path ? "block" : "none") + '">&#160;</div><div id="{$editor_id}_resize" class="mceStatusbarResize" style="display: ' + (resizing ? "block" : "none") + '" onmousedown="tinyMCE.themes.advanced._setResizing(event,\'{$editor_id}\',true);"></div><br style="clear: both" />';
-		var layoutManager = tinyMCE.getParam("theme_advanced_layout_manager", "SimpleLayout");
-
-		// Setup style select options -- MOVED UP FOR EXTERNAL TOOLBAR COMPATABILITY!
-		var styleSelectHTML = '<option value="">{$lang_theme_style_select}</option>';
-		if (settings['theme_advanced_styles']) {
-			var stylesAr = settings['theme_advanced_styles'].split(';');
-			
-			for (var i=0; i<stylesAr.length; i++) {
-				var key, value;
-
-				key = stylesAr[i].split('=')[0];
-				value = stylesAr[i].split('=')[1];
-
-				styleSelectHTML += '<option value="' + value + '">' + key + '</option>';
-			}
-
-			TinyMCE_AdvancedTheme._autoImportCSSClasses = false;
-		}
-
-		switch(layoutManager) {
-			case "SimpleLayout" : //the default TinyMCE Layout (for backwards compatibility)...
-				var toolbarHTML = "";
-				var toolbarLocation = tinyMCE.getParam("theme_advanced_toolbar_location", "bottom");
-				var toolbarAlign = tinyMCE.getParam("theme_advanced_toolbar_align", "center");
-				var pathLocation = tinyMCE.getParam("theme_advanced_path_location", "none"); // Compatiblity
-				var statusbarLocation = tinyMCE.getParam("theme_advanced_statusbar_location", pathLocation);
-				var defVals = {
-					theme_advanced_buttons1 : "bold,italic,underline,strikethrough,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,styleselect,formatselect",
-					theme_advanced_buttons2 : "bullist,numlist,separator,outdent,indent,separator,undo,redo,separator,link,unlink,anchor,image,cleanup,help,code",
-					theme_advanced_buttons3 : "hr,removeformat,visualaid,separator,sub,sup,separator,charmap"
-				};
-
-				// Add accessibility control
-				toolbarHTML += '<a href="#" accesskey="q" title="' + tinyMCE.getLang("lang_toolbar_focus") + '"';
-
-				if (!tinyMCE.getParam("accessibility_focus"))
-					toolbarHTML += ' onfocus="tinyMCE.getInstanceById(\'' + editorId + '\').getWin().focus();"';
-
-				toolbarHTML += '></a>';
-
-				// Render rows
-				for (var i=1; i<100; i++) {
-					var def = defVals["theme_advanced_buttons" + i];
-
-					var buttons = tinyMCE.getParam("theme_advanced_buttons" + i, def == null ? '' : def, true, ',');
-					if (buttons.length == 0)
-						break;
-
-					buttons = removeFromArray(buttons, tinyMCE.getParam("theme_advanced_disable", "", true, ','));
-					buttons = addToArray(buttons, tinyMCE.getParam("theme_advanced_buttons" + i + "_add", "", true, ','));
-					buttons = addToArray(tinyMCE.getParam("theme_advanced_buttons" + i + "_add_before", "", true, ','), buttons);
-
-					for (var b=0; b<buttons.length; b++)
-						toolbarHTML += tinyMCE.getControlHTML(buttons[b]);
-
-					if (buttons.length > 0) {
-						toolbarHTML += "<br />";
-						deltaHeight -= 23;
-					}
-				}
-
-				// Add accessibility control
-				toolbarHTML += '<a href="#" accesskey="z" onfocus="tinyMCE.getInstanceById(\'' + editorId + '\').getWin().focus();"></a>';
-
-				// Setup template html
-				template['html'] = '<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}" style="width:{$width_style};height:{$height_style}"><tbody>';
-
-				if (toolbarLocation == "top")
-					template['html'] += '<tr><td dir="ltr" class="mceToolbarTop" align="' + toolbarAlign + '" height="1" nowrap="nowrap"><span id="' + editorId + '_toolbar" class="mceToolbarContainer">' + toolbarHTML + '</span></td></tr>';
-
-				if (statusbarLocation == "top") {
-					template['html'] += '<tr><td class="mceStatusbarTop" height="1">' + statusbarHTML + '</td></tr>';
-					deltaHeight -= 23;
-				}
-
-				template['html'] += '<tr><td align="center"><span id="{$editor_id}"></span></td></tr>';
-
-				if (toolbarLocation == "bottom")
-					template['html'] += '<tr><td dir="ltr" class="mceToolbarBottom" align="' + toolbarAlign + '" height="1"><span id="' + editorId + '_toolbar" class="mceToolbarContainer">' + toolbarHTML + '</span></td></tr>';
-
-				// External toolbar changes
-				if (toolbarLocation == "external") {
-					var bod = document.body;
-					var elm = document.createElement ("div");
-
-					toolbarHTML = tinyMCE.replaceVar(toolbarHTML, 'style_select_options', styleSelectHTML);
-					toolbarHTML = tinyMCE.applyTemplate(toolbarHTML, {editor_id : editorId});
-
-					elm.className = "mceToolbarExternal";
-					elm.id = editorId+"_toolbar";
-					elm.innerHTML = '<table width="100%" border="0" align="center"><tr><td align="center">'+toolbarHTML+'</td></tr></table>';
-					bod.appendChild (elm);
-					// bod.style.marginTop = elm.offsetHeight + "px";
-
-					deltaHeight = 0;
-					tinyMCE.getInstanceById(editorId).toolbarElement = elm;
-
-					//template['html'] = '<div id="mceExternalToolbar" align="center" class="mceToolbarExternal"><table width="100%" border="0" align="center"><tr><td align="center">'+toolbarHTML+'</td></tr></table></div>' + template["html"];
-				} else {
-					tinyMCE.getInstanceById(editorId).toolbarElement = null;
-				}
-
-				if (statusbarLocation == "bottom") {
-					template['html'] += '<tr><td class="mceStatusbarBottom" height="1">' + statusbarHTML + '</td></tr>';
-					deltaHeight -= 23;
-				}
-
-				template['html'] += '</tbody></table>';
-				//"SimpleLayout"
-			break;
-
-			case "RowLayout" : //Container Layout - containers defined in "theme_advanced_containers" are rendered from top to bottom.
-				template['html'] = '<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}" style="width:{$width}px;height:{$height}px"><tbody>';
-
-				var containers = tinyMCE.getParam("theme_advanced_containers", "", true, ",");
-				var defaultContainerCSS = tinyMCE.getParam("theme_advanced_containers_default_class", "container");
-				var defaultContainerAlign = tinyMCE.getParam("theme_advanced_containers_default_align", "center");
-
-				//Render Containers:
-				for (var i = 0; i < containers.length; i++)
-				{
-					if (containers[i] == "mceEditor") //Exceptions for mceEditor and ...
-						template['html'] += '<tr><td align="center" class="mceEditor_border"><span id="{$editor_id}"></span></td></tr>';
-					else if (containers[i] == "mceElementpath" || containers[i] == "mceStatusbar") // ... mceElementpath:
-					{
-						var pathClass = "mceStatusbar";
-
-						if (i == containers.length-1)
-						{
-							pathClass = "mceStatusbarBottom";
-						}
-						else if (i == 0)
-						{
-							pathClass = "mceStatusbar";
-						}
-						else
-						{
-							deltaHeight-=2;
-						}
-
-						template['html'] += '<tr><td class="' + pathClass + '" height="1">' + statusbarHTML + '</td></tr>';
-						deltaHeight -= 22;
-					} else { // Render normal Container
-						var curContainer = tinyMCE.getParam("theme_advanced_container_"+containers[i], "", true, ',');
-						var curContainerHTML = "";
-						var curAlign = tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_align", defaultContainerAlign);
-						var curCSS = tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_class", defaultContainerCSS);
-
-						curContainer = removeFromArray(curContainer, tinyMCE.getParam("theme_advanced_disable", "", true, ','));
-
-						for (var j=0; j<curContainer.length; j++)
-							curContainerHTML += tinyMCE.getControlHTML(curContainer[j]);
-
-						if (curContainer.length > 0) {
-							curContainerHTML += "<br />";
-							deltaHeight -= 23;
-						}
-
-						template['html'] += '<tr><td class="' + curCSS + '" align="' + curAlign + '" height="1">' + curContainerHTML + '</td></tr>';
-					}
-				}
-
-				template['html'] += '</tbody></table>';
-				//RowLayout
-			break;
-
-			case "CustomLayout" : //User defined layout callback...
-				var customLayout = tinyMCE.getParam("theme_advanced_custom_layout","");
-
-				if (customLayout != "" && eval("typeof(" + customLayout + ")") != "undefined") {
-					template = eval(customLayout + "(template);");
-				}
-			break;
-		}
-
-		if (resizing)
-			template['html'] += '<span id="{$editor_id}_resize_box" class="mceResizeBox"></span>';
-
-		template['html'] = tinyMCE.replaceVar(template['html'], 'style_select_options', styleSelectHTML);
-
-		// Set to default values
-		if (!template['delta_width'])
-			template['delta_width'] = 0;
-
-		if (!template['delta_height'])
-			template['delta_height'] = deltaHeight;
-
-		return template;
-	},
-
-	initInstance : function(inst) {
-		if (tinyMCE.getParam("theme_advanced_resizing", false)) {
-			if (tinyMCE.getParam("theme_advanced_resizing_use_cookie", true)) {
-				var w = TinyMCE_AdvancedTheme._getCookie("TinyMCE_" + inst.editorId + "_width");
-				var h = TinyMCE_AdvancedTheme._getCookie("TinyMCE_" + inst.editorId + "_height");
-
-				TinyMCE_AdvancedTheme._resizeTo(inst, w, h, tinyMCE.getParam("theme_advanced_resize_horizontal", true));
-			}
-		}
-
-		inst.addShortcut('ctrl', 'k', 'lang_link_desc', 'mceLink');
-	},
-
-	removeInstance : function(inst) {
-		new TinyMCE_Layer(inst.editorId + '_fcMenu').remove();
-		new TinyMCE_Layer(inst.editorId + '_bcMenu').remove();
-	},
-
-	hideInstance : function(inst) {
-		TinyMCE_AdvancedTheme._hideMenus(inst.editorId);
-	},
-
-	_handleMenuEvent : function(e) {
-		var te = tinyMCE.isMSIE ? window.event.srcElement : e.target;
-		tinyMCE._menuButtonEvent(e.type == "mouseover" ? "over" : "out", document.getElementById(te._switchId));
-
-		if (e.type == "click")
-			tinyMCE.execInstanceCommand(te._editor_id, te._command);
-	},
-
-	_hideMenus : function(id) {
-		var fcml = new TinyMCE_Layer(id + '_fcMenu'), bcml = new TinyMCE_Layer(id + '_bcMenu');
-
-		if (fcml.exists() && fcml.isVisible()) {
-			tinyMCE.switchClass(id + '_forecolor', 'mceMenuButton');
-			fcml.hide();
-		}
-
-		if (bcml.exists() && bcml.isVisible()) {
-			tinyMCE.switchClass(id + '_backcolor', 'mceMenuButton');
-			bcml.hide();
-		}
-	},
-
-	/**
-	 * Node change handler.
-	 */
-	handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection, setup_content) {
-		var alignNode, breakOut, classNode;
-
-		function selectByValue(select_elm, value, first_index) {
-			first_index = typeof(first_index) == "undefined" ? false : true;
-
-			if (select_elm) {
-				for (var i=0; i<select_elm.options.length; i++) {
-					var ov = "" + select_elm.options[i].value;
-
-					if (first_index && ov.toLowerCase().indexOf(value.toLowerCase()) == 0) {
-						select_elm.selectedIndex = i;
-						return true;
-					}
-
-					if (ov == value) {
-						select_elm.selectedIndex = i;
-						return true;
-					}
-				}
-			}
-
-			return false;
-		};
-
-		// No node provided
-		if (node == null)
-			return;
-
-		// Update path
-		var pathElm = document.getElementById(editor_id + "_path");
-		var inst = tinyMCE.getInstanceById(editor_id);
-		var doc = inst.getDoc();
-		TinyMCE_AdvancedTheme._hideMenus(editor_id);
-
-		if (pathElm) {
-			// Get node path
-			var parentNode = node;
-			var path = new Array();
-			
-			while (parentNode != null) {
-				if (parentNode.nodeName.toUpperCase() == "BODY") {
-					break;
-				}
-
-				// Only append element nodes to path
-				if (parentNode.nodeType == 1 && tinyMCE.getAttrib(parentNode, "class").indexOf('mceItemHidden') == -1) {
-					path[path.length] = parentNode;
-				}
-
-				parentNode = parentNode.parentNode;
-			}
-
-			// Setup HTML
-			var html = "";
-			for (var i=path.length-1; i>=0; i--) {
-				var nodeName = path[i].nodeName.toLowerCase();
-				var nodeData = "";
-
-				if (nodeName.indexOf("html:") == 0)
-					nodeName = nodeName.substring(5);
-
-				if (nodeName == "b") {
-					nodeName = "strong";
-				}
-
-				if (nodeName == "i") {
-					nodeName = "em";
-				}
-
-				if (nodeName == "span") {
-					var cn = tinyMCE.getAttrib(path[i], "class");
-					if (cn != "" && cn.indexOf('mceItem') == -1)
-						nodeData += "class: " + cn + " ";
-
-					var st = tinyMCE.getAttrib(path[i], "style");
-					if (st != "") {
-						st = tinyMCE.serializeStyle(tinyMCE.parseStyle(st));
-						nodeData += "style: " + tinyMCE.xmlEncode(st) + " ";
-					}
-				}
-
-				if (nodeName == "font") {
-					if (tinyMCE.getParam("convert_fonts_to_spans"))
-						nodeName = "span";
-
-					var face = tinyMCE.getAttrib(path[i], "face");
-					if (face != "")
-						nodeData += "font: " + tinyMCE.xmlEncode(face) + " ";
-
-					var size = tinyMCE.getAttrib(path[i], "size");
-					if (size != "")
-						nodeData += "size: " + tinyMCE.xmlEncode(size) + " ";
-
-					var color = tinyMCE.getAttrib(path[i], "color");
-					if (color != "")
-						nodeData += "color: " + tinyMCE.xmlEncode(color) + " ";
-				}
-
-				if (tinyMCE.getAttrib(path[i], 'id') != "") {
-					nodeData += "id: " + path[i].getAttribute('id') + " ";
-				}
-
-				var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i], "class"), false);
-				if (className != "" && className.indexOf('mceItem') == -1)
-					nodeData += "class: " + className + " ";
-
-				if (tinyMCE.getAttrib(path[i], 'src') != "") {
-					var src = tinyMCE.getAttrib(path[i], "mce_src");
-
-					if (src == "")
-						 src = tinyMCE.getAttrib(path[i], "src");
-
-					nodeData += "src: " + tinyMCE.xmlEncode(src) + " ";
-				}
-
-				if (path[i].nodeName == 'A' && tinyMCE.getAttrib(path[i], 'href') != "") {
-					var href = tinyMCE.getAttrib(path[i], "mce_href");
-
-					if (href == "")
-						 href = tinyMCE.getAttrib(path[i], "href");
-
-					nodeData += "href: " + tinyMCE.xmlEncode(href) + " ";
-				}
-
-				className = tinyMCE.getAttrib(path[i], "class");
-				if ((nodeName == "img" || nodeName == "span") && className.indexOf('mceItem') != -1) {
-					nodeName = className.replace(/mceItem([a-z]+)/gi, '$1').toLowerCase();
-					nodeData = path[i].getAttribute('title');
-				}
-
-				if (nodeName == "a" && (anchor = tinyMCE.getAttrib(path[i], "name")) != "") {
-					nodeName = "a";
-					nodeName += "#" + tinyMCE.xmlEncode(anchor);
-					nodeData = "";
-				}
-
-				if (tinyMCE.getAttrib(path[i], 'name').indexOf("mce_") != 0) {
-					var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i], "class"), false);
-					if (className != "" && className.indexOf('mceItem') == -1) {
-						nodeName += "." + className;
-					}
-				}
-
-				var cmd = 'tinyMCE.execInstanceCommand(\'' + editor_id + '\',\'mceSelectNodeDepth\',false,\'' + i + '\');';
-				html += '<a title="' + nodeData + '" href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" target="_self" class="mcePathItem">' + nodeName + '</a>';
-
-				if (i > 0) {
-					html += " &raquo; ";
-				}
-			}
-
-			pathElm.innerHTML = '<a href="#" accesskey="x"></a>' + tinyMCE.getLang('lang_theme_path') + ": " + html + '&#160;';
-		}
-
-		// Reset old states
-		tinyMCE.switchClass(editor_id + '_justifyleft', 'mceButtonNormal');
-		tinyMCE.switchClass(editor_id + '_justifyright', 'mceButtonNormal');
-		tinyMCE.switchClass(editor_id + '_justifycenter', 'mceButtonNormal');
-		tinyMCE.switchClass(editor_id + '_justifyfull', 'mceButtonNormal');
-		tinyMCE.switchClass(editor_id + '_bold', 'mceButtonNormal');
-		tinyMCE.switchClass(editor_id + '_italic', 'mceButtonNormal');
-		tinyMCE.switchClass(editor_id + '_underline', 'mceButtonNormal');
-		tinyMCE.switchClass(editor_id + '_strikethrough', 'mceButtonNormal');
-		tinyMCE.switchClass(editor_id + '_bullist', 'mceButtonNormal');
-		tinyMCE.switchClass(editor_id + '_numlist', 'mceButtonNormal');
-		tinyMCE.switchClass(editor_id + '_sub', 'mceButtonNormal');
-		tinyMCE.switchClass(editor_id + '_sup', 'mceButtonNormal');
-		tinyMCE.switchClass(editor_id + '_anchor', 'mceButtonNormal');
-		tinyMCE.switchClass(editor_id + '_link', 'mceButtonDisabled');
-		tinyMCE.switchClass(editor_id + '_unlink', 'mceButtonDisabled');
-		tinyMCE.switchClass(editor_id + '_outdent', 'mceButtonDisabled');
-		tinyMCE.switchClass(editor_id + '_image', 'mceButtonNormal');
-		tinyMCE.switchClass(editor_id + '_hr', 'mceButtonNormal');
-
-		if (node.nodeName == "A" && tinyMCE.getAttrib(node, "class").indexOf('mceItemAnchor') != -1)
-			tinyMCE.switchClass(editor_id + '_anchor', 'mceButtonSelected');
-
-		// Get link
-		var anchorLink = tinyMCE.getParentElement(node, "a", "href");
-
-		if (anchorLink || any_selection) {
-			tinyMCE.switchClass(editor_id + '_link', anchorLink ? 'mceButtonSelected' : 'mceButtonNormal');
-			tinyMCE.switchClass(editor_id + '_unlink', anchorLink ? 'mceButtonSelected' : 'mceButtonNormal');
-		}
-
-		// Handle visual aid
-		tinyMCE.switchClass(editor_id + '_visualaid', visual_aid ? 'mceButtonSelected' : 'mceButtonNormal');
-
-		if (undo_levels != -1) {
-			tinyMCE.switchClass(editor_id + '_undo', 'mceButtonDisabled');
-			tinyMCE.switchClass(editor_id + '_redo', 'mceButtonDisabled');
-		}
-
-		// Within li, blockquote
-		if (tinyMCE.getParentElement(node, "li,blockquote"))
-			tinyMCE.switchClass(editor_id + '_outdent', 'mceButtonNormal');
-
-		// Has redo levels
-		if (undo_index != -1 && (undo_index < undo_levels-1 && undo_levels > 0))
-			tinyMCE.switchClass(editor_id + '_redo', 'mceButtonNormal');
-
-		// Has undo levels
-		if (undo_index != -1 && (undo_index > 0 && undo_levels > 0))
-			tinyMCE.switchClass(editor_id + '_undo', 'mceButtonNormal');
-
-		// Select class in select box
-		var selectElm = document.getElementById(editor_id + "_styleSelect");
-		
-		if (selectElm) {
-			TinyMCE_AdvancedTheme._setupCSSClasses(editor_id);
-
-			classNode = node;
-			breakOut = false;
-			var index = 0;
-
-			do {
-				if (classNode && classNode.className) {
-					for (var i=0; i<selectElm.options.length; i++) {
-						if (selectElm.options[i].value == classNode.className) {
-							index = i;
-							breakOut = true;
-							break;
-						}
-					}
-				}
-			} while (!breakOut && classNode != null && (classNode = classNode.parentNode) != null);
-
-			selectElm.selectedIndex = index;
-		}
-
-		// Select formatblock
-		var selectElm = document.getElementById(editor_id + "_formatSelect");
-		if (selectElm) {
-			var elm = tinyMCE.getParentElement(node, "p,div,h1,h2,h3,h4,h5,h6,pre,address");
-
-			if (elm)
-				selectByValue(selectElm, "<" + elm.nodeName.toLowerCase() + ">");
-			else
-				selectByValue(selectElm, "");
-		}
-
-		// Select fontselect
-		var selectElm = document.getElementById(editor_id + "_fontNameSelect");
-		if (selectElm) {
-			if (!tinyMCE.isSafari && !(tinyMCE.isMSIE && !tinyMCE.isOpera)) {
-				var face = inst.queryCommandValue('FontName');
-
-				face = face == null || face == "" ? "" : face;
-
-				selectByValue(selectElm, face, face != "");
-			} else {
-				var elm = tinyMCE.getParentElement(node, "font", "face");
-
-				if (elm) {
-					var family = tinyMCE.getAttrib(elm, "face");
-
-					if (family == '')
-						family = '' + elm.style.fontFamily;
-
-					if (!selectByValue(selectElm, family, family != ""))
-						selectByValue(selectElm, "");
-				} else
-					selectByValue(selectElm, "");
-			}
-		}
-
-		// Select fontsize
-		var selectElm = document.getElementById(editor_id + "_fontSizeSelect");
-		if (selectElm) {
-			if (!tinyMCE.isSafari && !tinyMCE.isOpera) {
-				var size = inst.queryCommandValue('FontSize');
-				selectByValue(selectElm, size == null || size == "" ? "0" : size);
-			} else {
-				var elm = tinyMCE.getParentElement(node, "font", "size");
-				if (elm) {
-					var size = tinyMCE.getAttrib(elm, "size");
-
-					if (size == '') {
-						var sizes = new Array('', '8px', '10px', '12px', '14px', '18px', '24px', '36px');
-
-						size = '' + elm.style.fontSize;
-
-						for (var i=0; i<sizes.length; i++) {
-							if (('' + sizes[i]) == size) {
-								size = i;
-								break;
-							}
-						}
-					}
-
-					if (!selectByValue(selectElm, size))
-						selectByValue(selectElm, "");
-				} else
-					selectByValue(selectElm, "0");
-			}
-		}
-
-		// Handle align attributes
-		alignNode = node;
-		breakOut = false;
-		do {
-			if (!alignNode.getAttribute || !alignNode.getAttribute('align'))
-				continue;
-
-			switch (alignNode.getAttribute('align').toLowerCase()) {
-				case "left":
-					tinyMCE.switchClass(editor_id + '_justifyleft', 'mceButtonSelected');
-					breakOut = true;
-				break;
-
-				case "right":
-					tinyMCE.switchClass(editor_id + '_justifyright', 'mceButtonSelected');
-					breakOut = true;
-				break;
-
-				case "middle":
-				case "center":
-					tinyMCE.switchClass(editor_id + '_justifycenter', 'mceButtonSelected');
-					breakOut = true;
-				break;
-
-				case "justify":
-					tinyMCE.switchClass(editor_id + '_justifyfull', 'mceButtonSelected');
-					breakOut = true;
-				break;
-			}
-		} while (!breakOut && (alignNode = alignNode.parentNode) != null);
-
-		// Div justification
-		var div = tinyMCE.getParentElement(node, "div");
-		if (div && div.style.textAlign == "center")
-			tinyMCE.switchClass(editor_id + '_justifycenter', 'mceButtonSelected');
-
-		// Do special text
-		if (!setup_content) {
-			// , "JustifyLeft", "_justifyleft", "JustifyCenter", "justifycenter", "JustifyRight", "justifyright", "JustifyFull", "justifyfull", "InsertUnorderedList", "bullist", "InsertOrderedList", "numlist", "InsertUnorderedList", "bullist", "Outdent", "outdent", "Indent", "indent", "subscript", "sub"
-			var ar = new Array("Bold", "_bold", "Italic", "_italic", "Strikethrough", "_strikethrough", "superscript", "_sup", "subscript", "_sub");
-			for (var i=0; i<ar.length; i+=2) {
-				if (inst.queryCommandState(ar[i]))
-					tinyMCE.switchClass(editor_id + ar[i+1], 'mceButtonSelected');
-			}
-
-			if (inst.queryCommandState("Underline") && (node.parentNode == null || node.parentNode.nodeName != "A"))
-				tinyMCE.switchClass(editor_id + '_underline', 'mceButtonSelected');
-		}
-
-		// Handle elements
-		do {
-			switch (node.nodeName) {
-				case "UL":
-					tinyMCE.switchClass(editor_id + '_bullist', 'mceButtonSelected');
-				break;
-
-				case "OL":
-					tinyMCE.switchClass(editor_id + '_numlist', 'mceButtonSelected');
-				break;
-
-				case "HR":
-					 tinyMCE.switchClass(editor_id + '_hr', 'mceButtonSelected');
-				break;
-
-				case "IMG":
-				if (tinyMCE.getAttrib(node, 'name').indexOf('mce_') != 0 && tinyMCE.getAttrib(node, 'class').indexOf('mceItem') == -1) {
-					tinyMCE.switchClass(editor_id + '_image', 'mceButtonSelected');
-				}
-				break;
-			}
-		} while ((node = node.parentNode) != null);
-	},
-
-	// Private theme internal functions
-
-	// This function auto imports CSS classes into the class selection droplist
-	_setupCSSClasses : function(editor_id) {
-		var i, selectElm;
-
-		if (!TinyMCE_AdvancedTheme._autoImportCSSClasses)
-			return;
-
-		selectElm = document.getElementById(editor_id + '_styleSelect');
-
-		if (selectElm && selectElm.getAttribute('cssImported') != 'true') {
-			var csses = tinyMCE.getCSSClasses(editor_id);
-			if (csses && selectElm)	{
-				for (i=0; i<csses.length; i++)
-					selectElm.options[selectElm.options.length] = new Option(csses[i], csses[i]);
-			}
-
-			// Only do this once
-			if (csses != null && csses.length > 0)
-				selectElm.setAttribute('cssImported', 'true');
-		}
-	},
-
-	_setCookie : function(name, value, expires, path, domain, secure) {
-		var curCookie = name + "=" + escape(value) +
-			((expires) ? "; expires=" + expires.toGMTString() : "") +
-			((path) ? "; path=" + escape(path) : "") +
-			((domain) ? "; domain=" + domain : "") +
-			((secure) ? "; secure" : "");
-
-		document.cookie = curCookie;
-	},
-
-	_getCookie : function(name) {
-		var dc = document.cookie;
-		var prefix = name + "=";
-		var begin = dc.indexOf("; " + prefix);
-
-		if (begin == -1) {
-			begin = dc.indexOf(prefix);
-
-			if (begin != 0)
-				return null;
-		} else
-			begin += 2;
-
-		var end = document.cookie.indexOf(";", begin);
-
-		if (end == -1)
-			end = dc.length;
-
-		return unescape(dc.substring(begin + prefix.length, end));
-	},
-
-	_resizeTo : function(inst, w, h, set_w) {
-		var editorContainer = document.getElementById(inst.editorId + '_parent');
-		var tableElm = editorContainer.firstChild;
-		var iframe = inst.iframeElement;
-
-		if (w == null || w == "null") {
-			set_w = false;
-			w = 0;
-		}
-
-		if (h == null || h == "null")
-			return;
-
-		w = parseInt(w);
-		h = parseInt(h);
-
-		if (tinyMCE.isGecko) {
-			w += 2;
-			h += 2;
-		}
-
-		var dx = w - tableElm.clientWidth;
-		var dy = h - tableElm.clientHeight;
-
-		w = w < 1 ? 30 : w;
-		h = h < 1 ? 30 : h;
-
-		if (set_w)
-			tableElm.style.width = w + "px";
-
-		if ( !tinyMCE.isMSIE || tinyMCE.isMSIE7 || tinyMCE.isOpera ) // WordPress: do this later to avoid creeping toolbar bug in MSIE6
-		tableElm.style.height = h + "px";
-
-		iw = iframe.clientWidth + dx;
-		ih = iframe.clientHeight + dy;
-
-		iw = iw < 1 ? 30 : iw;
-		ih = ih < 1 ? 30 : ih;
-
-/* WordPress found that this led to a shrinking editor with every resize. (Gray background creeps in 1px at a time.)
-		if (tinyMCE.isGecko) {
-			iw -= 2;
-			ih -= 2;
-		}
-*/
-
-		if (set_w)
-			iframe.style.width = iw + "px";
-
-		iframe.style.height = ih + "px";
-
-		// Is it to small, make it bigger again
-		if (set_w) {
-			var tableBodyElm = tableElm.firstChild;
-			var minIframeWidth = tableBodyElm.scrollWidth;
-			if (inst.iframeElement.clientWidth < minIframeWidth) {
-				dx = minIframeWidth - inst.iframeElement.clientWidth;
-
-				inst.iframeElement.style.width = (iw + dx) + "px";
-			}
-		}
-
-		tableElm.style.height = h + "px"; // WordPress: see above
-
-		// Remove pesky table controls
-		inst.useCSS = false;
-	},
-
-	/**
-	 * Handles resizing events.
-	 */
-	_resizeEventHandler : function(e) {
-		var resizer = TinyMCE_AdvancedTheme._resizer;
-
-		// Do nothing
-		if (!resizer.resizing)
-			return;
-
-		e = typeof(e) == "undefined" ? window.event : e;
-
-		var dx = e.screenX - resizer.downX;
-		var dy = e.screenY - resizer.downY;
-		var resizeBox = resizer.resizeBox;
-		var editorId = resizer.editorId;
-
-		switch (e.type) {
-			case "mousemove":
-				var w, h;
-
-				w = resizer.width + dx;
-				h = resizer.height + dy;
-
-				w = w < 1 ? 1 : w;
-				h = h < 1 ? 1 : h;
-
-				if (resizer.horizontal)
-					resizeBox.style.width = w + "px";
-
-				resizeBox.style.height = h + "px";
-				break;
-
-			case "mouseup":
-				TinyMCE_AdvancedTheme._setResizing(e, editorId, false);
-				TinyMCE_AdvancedTheme._resizeTo(tinyMCE.getInstanceById(editorId), resizer.width + dx, resizer.height + dy, resizer.horizontal);
-
-				// Expire in a month
-				if (tinyMCE.getParam("theme_advanced_resizing_use_cookie", true)) {
-					var expires = new Date();
-					expires.setTime(expires.getTime() + 3600000 * 24 * 30);
-
-					// Set the cookies
-					TinyMCE_AdvancedTheme._setCookie("TinyMCE_" + editorId + "_width", "" + (resizer.horizontal ? resizer.width + dx : ""), expires);
-					TinyMCE_AdvancedTheme._setCookie("TinyMCE_" + editorId + "_height", "" + (resizer.height + dy), expires);
-				}
-				break;
-		}
-	},
-
-	/**
-	 * Starts/stops the editor resizing.
-	 */
-	_setResizing : function(e, editor_id, state) {
-		e = typeof(e) == "undefined" ? window.event : e;
-
-		var resizer = TinyMCE_AdvancedTheme._resizer;
-		var editorContainer = document.getElementById(editor_id + '_parent');
-		var editorArea = document.getElementById(editor_id + '_parent').firstChild;
-		var resizeBox = document.getElementById(editor_id + '_resize_box');
-		var inst = tinyMCE.getInstanceById(editor_id);
-
-		if (state) {
-			// Place box over editor area
-			var width = editorArea.clientWidth;
-			var height = editorArea.clientHeight;
-
-			resizeBox.style.width = width + "px";
-			resizeBox.style.height = height + "px";
-
-			resizer.iframeWidth = inst.iframeElement.clientWidth;
-			resizer.iframeHeight = inst.iframeElement.clientHeight;
-
-			// Hide editor and show resize box
-			editorArea.style.display = "none";
-			resizeBox.style.display = "block";
-
-			// Add event handlers, only once
-			if (!resizer.eventHandlers) {
-				if (tinyMCE.isMSIE)
-					tinyMCE.addEvent(document, "mousemove", TinyMCE_AdvancedTheme._resizeEventHandler);
-				else
-					tinyMCE.addEvent(window, "mousemove", TinyMCE_AdvancedTheme._resizeEventHandler);
-
-				tinyMCE.addEvent(document, "mouseup", TinyMCE_AdvancedTheme._resizeEventHandler);
-
-				resizer.eventHandlers = true;
-			}
-
-			resizer.resizing = true;
-			resizer.downX = e.screenX;
-			resizer.downY = e.screenY;
-			resizer.width = parseInt(resizeBox.style.width);
-			resizer.height = parseInt(resizeBox.style.height);
-			resizer.editorId = editor_id;
-			resizer.resizeBox = resizeBox;
-			resizer.horizontal = tinyMCE.getParam("theme_advanced_resize_horizontal", true);
-		} else {
-			resizer.resizing = false;
-			resizeBox.style.display = "none";
-			editorArea.style.display = tinyMCE.isMSIE && !tinyMCE.isOpera ? "block" : "table";
-			tinyMCE.execCommand('mceResetDesignMode');
-		}
-	},
-
-	_getColorHTML : function(id, n, cm) {
-		var i, h, cl;
-
-		h = '<span class="mceMenuLine"></span>';
-		cl = tinyMCE.getParam(n, TinyMCE_AdvancedTheme._defColors).split(',');
-
-		h += '<table class="mceColors"><tr>';
-		for (i=0; i<cl.length; i++) {
-			c = 'tinyMCE.execInstanceCommand(\'' + id + '\', \'' + cm + '\', false, \'#' + cl[i] + '\');';
-			h += '<td><a href="javascript:' + c + '" style="background-color: #' + cl[i] + '" onclick="' + c + ';return false;"></a></td>';
-
-			if ((i+1) % 8 == 0)
-				h += '</tr><tr>';
-		}
-
-		h += '</tr></table>';
-
-		if (tinyMCE.getParam("theme_advanced_more_colors", true))
-			h += '<a href="#" onclick="TinyMCE_AdvancedTheme._pickColor(\'' + id + '\',\'' + cm + '\');" class="mceMoreColors">' + tinyMCE.getLang('lang_more_colors') + '</a>';
-
-		return h;
-	},
-
-	_pickColor : function(id, cm) {
-		var inputColor, inst = tinyMCE.selectedInstance;
-
-		if (cm == 'forecolor' && inst)
-			inputColor = inst.foreColor;
-
-		if ((cm == 'backcolor' || cm == 'HiliteColor') && inst)
-			inputColor = inst.backColor;
-
-		tinyMCE.execCommand('mceColorPicker', true, {color : inputColor, callback : function(c) {
-			tinyMCE.execInstanceCommand(id, cm, false, c);
-		}});
-	},
-
-	_insertImage : function(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout) {
-		tinyMCE.execCommand('mceBeginUndoLevel');
-
-		if (src == "")
-			return;
-
-		if (!tinyMCE.imgElement && tinyMCE.isSafari) {
-			var html = "";
-
-			html += '<img src="' + src + '" alt="' + alt + '"';
-			html += ' border="' + border + '" hspace="' + hspace + '"';
-			html += ' vspace="' + vspace + '" width="' + width + '"';
-			html += ' height="' + height + '" align="' + align + '" title="' + title + '" onmouseover="' + onmouseover + '" onmouseout="' + onmouseout + '" />';
-
-			tinyMCE.execCommand("mceInsertContent", false, html);
-		} else {
-			if (!tinyMCE.imgElement && tinyMCE.selectedInstance) {
-				if (tinyMCE.isSafari)
-					tinyMCE.execCommand("mceInsertContent", false, '<img src="' + tinyMCE.uniqueURL + '" />');
-				else
-					tinyMCE.selectedInstance.contentDocument.execCommand("insertimage", false, tinyMCE.uniqueURL);
-
-				tinyMCE.imgElement = tinyMCE.getElementByAttributeValue(tinyMCE.selectedInstance.contentDocument.body, "img", "src", tinyMCE.uniqueURL);
-			}
-		}
-
-		if (tinyMCE.imgElement) {
-			var needsRepaint = false;
-			var msrc = src;
-
-			src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, tinyMCE.imgElement);");
-
-			if (tinyMCE.getParam('convert_urls'))
-				msrc = src;
-
-			if (onmouseover && onmouseover != "")
-				onmouseover = "this.src='" + eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseover, tinyMCE.imgElement);") + "';";
-
-			if (onmouseout && onmouseout != "")
-				onmouseout = "this.src='" + eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseout, tinyMCE.imgElement);") + "';";
-
-			// Use alt as title if it's undefined
-			if (typeof(title) == "undefined")
-				title = alt;
-
-			if (width != tinyMCE.imgElement.getAttribute("width") || height != tinyMCE.imgElement.getAttribute("height") || align != tinyMCE.imgElement.getAttribute("align"))
-				needsRepaint = true;
-
-			tinyMCE.setAttrib(tinyMCE.imgElement, 'src', src);
-			tinyMCE.setAttrib(tinyMCE.imgElement, 'mce_src', msrc);
-			tinyMCE.setAttrib(tinyMCE.imgElement, 'alt', alt);
-			tinyMCE.setAttrib(tinyMCE.imgElement, 'title', title);
-			tinyMCE.setAttrib(tinyMCE.imgElement, 'align', align);
-			tinyMCE.setAttrib(tinyMCE.imgElement, 'border', border, true);
-			tinyMCE.setAttrib(tinyMCE.imgElement, 'hspace', hspace, true);
-			tinyMCE.setAttrib(tinyMCE.imgElement, 'vspace', vspace, true);
-			tinyMCE.setAttrib(tinyMCE.imgElement, 'width', width, true);
-			tinyMCE.setAttrib(tinyMCE.imgElement, 'height', height, true);
-			tinyMCE.setAttrib(tinyMCE.imgElement, 'onmouseover', onmouseover);
-			tinyMCE.setAttrib(tinyMCE.imgElement, 'onmouseout', onmouseout);
-
-			// Fix for bug #989846 - Image resize bug
-			if (width && width != "")
-				tinyMCE.imgElement.style.pixelWidth = width;
-
-			if (height && height != "")
-				tinyMCE.imgElement.style.pixelHeight = height;
-
-			if (needsRepaint)
-				tinyMCE.selectedInstance.repaint();
-		}
-
-		tinyMCE.execCommand('mceEndUndoLevel');
-	},
-
-	_insertLink : function(href, target, title, onclick, style_class) {
-		tinyMCE.execCommand('mceBeginUndoLevel');
-
-		if (tinyMCE.selectedInstance && tinyMCE.selectedElement && tinyMCE.selectedElement.nodeName.toLowerCase() == "img") {
-			var doc = tinyMCE.selectedInstance.getDoc();
-			var linkElement = tinyMCE.getParentElement(tinyMCE.selectedElement, "a");
-			var newLink = false;
-
-			if (!linkElement) {
-				linkElement = doc.createElement("a");
-				newLink = true;
-			}
-
-			var mhref = href;
-			var thref = eval(tinyMCE.settings['urlconverter_callback'] + "(href, linkElement);");
-			mhref = tinyMCE.getParam('convert_urls') ? href : mhref;
-
-			tinyMCE.setAttrib(linkElement, 'href', thref);
-			tinyMCE.setAttrib(linkElement, 'mce_href', mhref);
-			tinyMCE.setAttrib(linkElement, 'target', target);
-			tinyMCE.setAttrib(linkElement, 'title', title);
-			tinyMCE.setAttrib(linkElement, 'onclick', onclick);
-			tinyMCE.setAttrib(linkElement, 'class', style_class);
-
-			if (newLink) {
-				linkElement.appendChild(tinyMCE.selectedElement.cloneNode(true));
-				tinyMCE.selectedElement.parentNode.replaceChild(linkElement, tinyMCE.selectedElement);
-			}
-
-			return;
-		}
-
-		if (!tinyMCE.linkElement && tinyMCE.selectedInstance) {
-			if (tinyMCE.isSafari) {
-				tinyMCE.execCommand("mceInsertContent", false, '<a href="' + tinyMCE.uniqueURL + '">' + tinyMCE.selectedInstance.selection.getSelectedHTML() + '</a>');
-			} else
-				tinyMCE.selectedInstance.contentDocument.execCommand("createlink", false, tinyMCE.uniqueURL);
-
-			tinyMCE.linkElement = tinyMCE.getElementByAttributeValue(tinyMCE.selectedInstance.contentDocument.body, "a", "href", tinyMCE.uniqueURL);
-
-			var elementArray = tinyMCE.getElementsByAttributeValue(tinyMCE.selectedInstance.contentDocument.body, "a", "href", tinyMCE.uniqueURL);
-
-			for (var i=0; i<elementArray.length; i++) {
-				var mhref = href;
-				var thref = eval(tinyMCE.settings['urlconverter_callback'] + "(href, elementArray[i]);");
-				mhref = tinyMCE.getParam('convert_urls') ? href : mhref;
-
-				tinyMCE.setAttrib(elementArray[i], 'href', thref);
-				tinyMCE.setAttrib(elementArray[i], 'mce_href', mhref);
-				tinyMCE.setAttrib(elementArray[i], 'target', target);
-				tinyMCE.setAttrib(elementArray[i], 'title', title);
-				tinyMCE.setAttrib(elementArray[i], 'onclick', onclick);
-				tinyMCE.setAttrib(elementArray[i], 'class', style_class);
-			}
-
-			tinyMCE.linkElement = elementArray[0];
-		}
-
-		if (tinyMCE.linkElement) {
-			var mhref = href;
-			href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement);");
-			mhref = tinyMCE.getParam('convert_urls') ? href : mhref;
-
-			tinyMCE.setAttrib(tinyMCE.linkElement, 'href', href);
-			tinyMCE.setAttrib(tinyMCE.linkElement, 'mce_href', mhref);
-			tinyMCE.setAttrib(tinyMCE.linkElement, 'target', target);
-			tinyMCE.setAttrib(tinyMCE.linkElement, 'title', title);
-			tinyMCE.setAttrib(tinyMCE.linkElement, 'onclick', onclick);
-			tinyMCE.setAttrib(tinyMCE.linkElement, 'class', style_class);
-		}
-
-		tinyMCE.execCommand('mceEndUndoLevel');
-	}
-};
-
-tinyMCE.addTheme("advanced", TinyMCE_AdvancedTheme);
-
-// Add default buttons maps for advanced theme and all internal plugins
-tinyMCE.addButtonMap(TinyMCE_AdvancedTheme._buttonMap);
+(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,extend=tinymce.extend,each=tinymce.each,Cookie=tinymce.util.Cookie,lastExtID,explode=tinymce.explode;tinymce.ThemeManager.requireLangPack('advanced');tinymce.create('tinymce.themes.AdvancedTheme',{controls:{bold:['bold_desc','Bold'],italic:['italic_desc','Italic'],underline:['underline_desc','Underline'],strikethrough:['striketrough_desc','Strikethrough'],justifyleft:['justifyleft_desc','JustifyLeft'],justifycenter:['justifycenter_desc','JustifyCenter'],justifyright:['justifyright_desc','JustifyRight'],justifyfull:['justifyfull_desc','JustifyFull'],bullist:['bullist_desc','InsertUnorderedList'],numlist:['numlist_desc','InsertOrderedList'],outdent:['outdent_desc','Outdent'],indent:['indent_desc','Indent'],cut:['cut_desc','Cut'],copy:['copy_desc','Copy'],paste:['paste_desc','Paste'],undo:['undo_desc','Undo'],redo:['redo_desc','Redo'],link:['link_desc','mceLink'],unlink:['unlink_desc','unlink'],image:['image_desc','mceImage'],cleanup:['cleanup_desc','mceCleanup'],help:['help_desc','mceHelp'],code:['code_desc','mceCodeEditor'],hr:['hr_desc','InsertHorizontalRule'],removeformat:['removeformat_desc','RemoveFormat'],sub:['sub_desc','subscript'],sup:['sup_desc','superscript'],forecolor:['forecolor_desc','ForeColor'],forecolorpicker:['forecolor_desc','mceForeColor'],backcolor:['backcolor_desc','HiliteColor'],backcolorpicker:['backcolor_desc','mceBackColor'],charmap:['charmap_desc','mceCharMap'],visualaid:['visualaid_desc','mceToggleVisualAid'],anchor:['anchor_desc','mceInsertAnchor'],newdocument:['newdocument_desc','mceNewDocument'],blockquote:['blockquote_desc','mceBlockQuote']},stateControls:['bold','italic','underline','strikethrough','bullist','numlist','justifyleft','justifycenter','justifyright','justifyfull','sub','sup','blockquote'],init:function(ed,url){var t=this,s,v;t.editor=ed;t.url=url;t.onResolveName=new tinymce.util.Dispatcher(this);t.settings=s=extend({theme_advanced_path:true,theme_advanced_toolbar_location:'bottom',theme_advanced_buttons1:"bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect",theme_advanced_buttons2:"bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code",theme_advanced_buttons3:"hr,removeformat,visualaid,|,sub,sup,|,charmap",theme_advanced_blockformats:"p,address,pre,h1,h2,h3,h4,h5,h6",theme_advanced_toolbar_align:"center",theme_advanced_fonts:"Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats",theme_advanced_font_sizes:"1,2,3,4,5,6,7",theme_advanced_more_colors:1,theme_advanced_row_height:23,theme_advanced_resize_horizontal:1,theme_advanced_resizing_use_cookie:1},ed.settings);if((v=s.theme_advanced_path_location)&&v!='none')s.theme_advanced_statusbar_location=s.theme_advanced_path_location;if(s.theme_advanced_statusbar_location=='none')s.theme_advanced_statusbar_location=0;ed.onInit.add(function(){ed.onNodeChange.add(t._nodeChanged,t);if(ed.settings.content_css!==false)ed.dom.loadCSS(ed.baseURI.toAbsolute("themes/advanced/skins/"+ed.settings.skin+"/content.css"));});ed.onSetProgressState.add(function(ed,b,ti){var co,id=ed.id,tb;if(b){t.progressTimer=setTimeout(function(){co=ed.getContainer();co=co.insertBefore(DOM.create('DIV',{style:'position:relative'}),co.firstChild);tb=DOM.get(ed.id+'_tbl');DOM.add(co,'div',{id:id+'_blocker','class':'mceBlocker',style:{width:tb.clientWidth+2,height:tb.clientHeight+2}});DOM.add(co,'div',{id:id+'_progress','class':'mceProgress',style:{left:tb.clientWidth/ 2, top : tb.clientHeight /2}});},ti||0);}else{DOM.remove(id+'_blocker');DOM.remove(id+'_progress');clearTimeout(t.progressTimer);}});DOM.loadCSS(ed.baseURI.toAbsolute(s.editor_css||"themes/advanced/skins/"+ed.settings.skin+"/ui.css"));if(s.skin_variant)DOM.loadCSS(ed.baseURI.toAbsolute(s.editor_css||"themes/advanced/skins/"+ed.settings.skin+"/ui_"+s.skin_variant+".css"));},createControl:function(n,cf){var cd,c;if(c=cf.createControl(n))return c;switch(n){case"styleselect":return this._createStyleSelect();case"formatselect":return this._createBlockFormats();case"fontselect":return this._createFontSelect();case"fontsizeselect":return this._createFontSizeSelect();case"forecolor":return this._createForeColorMenu();case"backcolor":return this._createBackColorMenu();}if((cd=this.controls[n]))return cf.createButton(n,{title:"advanced."+cd[0],cmd:cd[1],ui:cd[2],value:cd[3]});},execCommand:function(cmd,ui,val){var f=this['_'+cmd];if(f){f.call(this,ui,val);return true;}return false;},_importClasses:function(){var ed=this.editor,c=ed.controlManager.get('styleselect');if(c.getLength()==0){each(ed.dom.getClasses(),function(o){c.add(o['class'],o['class']);});}},_createStyleSelect:function(n){var t=this,ed=t.editor,cf=ed.controlManager,c=cf.createListBox('styleselect',{title:'advanced.style_select',onselect:function(v){if(c.selectedValue===v){ed.execCommand('mceSetStyleInfo',0,{command:'removeformat'});c.select();return false;}else ed.execCommand('mceSetCSSClass',0,v);}});if(c){each(ed.getParam('theme_advanced_styles','','hash'),function(v,k){if(v)c.add(t.editor.translate(k),v);});c.onPostRender.add(function(ed,n){Event.add(n,'focus',t._importClasses,t);Event.add(n,'mousedown',t._importClasses,t);});}return c;},_createFontSelect:function(){var c,t=this,ed=t.editor;c=ed.controlManager.createListBox('fontselect',{title:'advanced.fontdefault',cmd:'FontName'});if(c){each(ed.getParam('theme_advanced_fonts',t.settings.theme_advanced_fonts,'hash'),function(v,k){c.add(ed.translate(k),v,{style:v.indexOf('dings')==-1?'font-family:'+v:''});});}return c;},_createFontSizeSelect:function(){var c,t=this,lo=["1 (8 pt)","2 (10 pt)","3 (12 pt)","4 (14 pt)","5 (18 pt)","6 (24 pt)","7 (36 pt)"],fz=[8,10,12,14,18,24,36];c=t.editor.controlManager.createListBox('fontsizeselect',{title:'advanced.font_size',cmd:'FontSize'});if(c){each(explode(t.settings.theme_advanced_font_sizes),function(v){c.add(lo[parseInt(v)-1],v,{'style':'font-size:'+fz[v-1]+'pt','class':'mceFontSize'+v});});}return c;},_createBlockFormats:function(){var c,fmts={p:'advanced.paragraph',address:'advanced.address',pre:'advanced.pre',h1:'advanced.h1',h2:'advanced.h2',h3:'advanced.h3',h4:'advanced.h4',h5:'advanced.h5',h6:'advanced.h6',div:'advanced.div',blockquote:'advanced.blockquote',code:'advanced.code',dt:'advanced.dt',dd:'advanced.dd',samp:'advanced.samp'},t=this;c=t.editor.controlManager.createListBox('formatselect',{title:'advanced.block',cmd:'FormatBlock'});if(c){each(explode(t.settings.theme_advanced_blockformats),function(v){c.add(t.editor.translate(fmts[v]),v,{'class':'mce_formatPreview mce_'+v});});}return c;},_createForeColorMenu:function(){var c,t=this,s=t.settings,o={},v;if(s.theme_advanced_more_colors){o.more_colors_func=function(){t._mceColorPicker(0,{color:c.value,func:function(co){c.setColor(co);}});};}if(v=s.theme_advanced_text_colors)o.colors=v;o.title='advanced.forecolor_desc';o.cmd='ForeColor';o.scope=this;c=t.editor.controlManager.createColorSplitButton('forecolor',o);return c;},_createBackColorMenu:function(){var c,t=this,s=t.settings,o={},v;if(s.theme_advanced_more_colors){o.more_colors_func=function(){t._mceColorPicker(0,{color:c.value,func:function(co){c.setColor(co);}});};}if(v=s.theme_advanced_background_colors)o.colors=v;o.title='advanced.backcolor_desc';o.cmd='HiliteColor';o.scope=this;c=t.editor.controlManager.createColorSplitButton('backcolor',o);return c;},renderUI:function(o){var n,ic,tb,t=this,ed=t.editor,s=t.settings,sc,p,nl;n=p=DOM.create('span',{id:ed.id+'_parent','class':'mceEditor '+ed.settings.skin+'Skin'+(s.skin_variant?' '+ed.settings.skin+'Skin'+t._ufirst(s.skin_variant):'')});if(!DOM.boxModel)n=DOM.add(n,'div',{'class':'mceOldBoxModel'});n=sc=DOM.add(n,'table',{id:ed.id+'_tbl','class':'mceLayout',cellSpacing:0,cellPadding:0});n=tb=DOM.add(n,'tbody');switch((s.theme_advanced_layout_manager||'').toLowerCase()){case"rowlayout":ic=t._rowLayout(s,tb,o);break;case"customlayout":ic=ed.execCallback("theme_advanced_custom_layout",s,tb,o,p);break;default:ic=t._simpleLayout(s,tb,o,p);}n=o.targetNode;nl=DOM.stdMode?sc.getElementsByTagName('tr'):sc.rows;DOM.addClass(nl[0],'mceFirst');DOM.addClass(nl[nl.length-1],'mceLast');each(DOM.select('tr',tb),function(n){DOM.addClass(n.firstChild,'mceFirst');DOM.addClass(n.childNodes[n.childNodes.length-1],'mceLast');});if(DOM.get(s.theme_advanced_toolbar_container))DOM.get(s.theme_advanced_toolbar_container).appendChild(p);else DOM.insertAfter(p,n);Event.add(ed.id+'_path_row','click',function(e){e=e.target;if(e.nodeName=='A'){t._sel(e.className.replace(/^.*mcePath_([0-9]+).*$/,'$1'));return Event.cancel(e);}});if(!ed.getParam('accessibility_focus')||ed.getParam('tab_focus'))Event.add(DOM.add(p,'a',{href:'#'},'<!-- IE -->'),'focus',function(){tinyMCE.get(ed.id).focus();});if(s.theme_advanced_toolbar_location=='external')o.deltaHeight=0;t.deltaHeight=o.deltaHeight;o.targetNode=null;return{iframeContainer:ic,editorContainer:ed.id+'_parent',sizeContainer:sc,deltaHeight:o.deltaHeight};},getInfo:function(){return{longname:'Advanced theme',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',version:tinymce.majorVersion+"."+tinymce.minorVersion}},resizeBy:function(dw,dh){var e=DOM.get(this.editor.id+'_tbl');this.resizeTo(e.clientWidth+dw,e.clientHeight+dh);},resizeTo:function(w,h){var ed=this.editor,s=ed.settings,e=DOM.get(ed.id+'_tbl'),ifr=DOM.get(ed.id+'_ifr'),dh;w=Math.max(s.theme_advanced_resizing_min_width||100,w);h=Math.max(s.theme_advanced_resizing_min_height||100,h);w=Math.min(s.theme_advanced_resizing_max_width||0xFFFF,w);h=Math.min(s.theme_advanced_resizing_max_height||0xFFFF,h);dh=e.clientHeight-ifr.clientHeight;DOM.setStyle(ifr,'height',h-dh);DOM.setStyles(e,{width:w,height:h});},_simpleLayout:function(s,tb,o,p){var t=this,ed=t.editor,lo=s.theme_advanced_toolbar_location,sl=s.theme_advanced_statusbar_location,n,ic,etb,c;if(lo=='top')t._addToolbars(tb,o);if(lo=='external'){n=c=DOM.create('div',{style:'position:relative'});n=DOM.add(n,'div',{id:ed.id+'_external','class':'mceExternalToolbar'});DOM.add(n,'a',{id:ed.id+'_external_close',href:'javascript:;','class':'mceExternalClose'});n=DOM.add(n,'table',{id:ed.id+'_tblext',cellSpacing:0,cellPadding:0});etb=DOM.add(n,'tbody');if(p.firstChild.className=='mceOldBoxModel')p.firstChild.appendChild(c);else p.insertBefore(c,p.firstChild);t._addToolbars(etb,o);ed.onMouseUp.add(function(){var e=DOM.get(ed.id+'_external');DOM.show(e);DOM.hide(lastExtID);var f=Event.add(ed.id+'_external_close','click',function(){DOM.hide(ed.id+'_external');Event.remove(ed.id+'_external_close','click',f);});DOM.show(e);DOM.setStyle(e,'top',0-DOM.getRect(ed.id+'_tblext').h-1);DOM.hide(e);DOM.show(e);e.style.filter='';lastExtID=ed.id+'_external';e=null;});}if(sl=='top')t._addStatusBar(tb,o);if(!s.theme_advanced_toolbar_container){n=DOM.add(tb,'tr');n=ic=DOM.add(n,'td',{'class':'mceIframeContainer'});}if(lo=='bottom')t._addToolbars(tb,o);if(sl=='bottom')t._addStatusBar(tb,o);return ic;},_rowLayout:function(s,tb,o){var t=this,ed=t.editor,dc,da,cf=ed.controlManager,n,ic,to,a;dc=s.theme_advanced_containers_default_class||'';da=s.theme_advanced_containers_default_align||'center';each(explode(s.theme_advanced_containers||''),function(c,i){var v=s['theme_advanced_container_'+c]||'';switch(c.toLowerCase()){case'mceeditor':n=DOM.add(tb,'tr');n=ic=DOM.add(n,'td',{'class':'mceIframeContainer'});break;case'mceelementpath':t._addStatusBar(tb,o);break;default:a=s['theme_advanced_container_'+c+'_align'].toLowerCase();a='mce'+t._ufirst(a);n=DOM.add(DOM.add(tb,'tr'),'td',{'class':'mceToolbar '+(s['theme_advanced_container_'+c+'_class']||dc)+' '+a||da});to=cf.createToolbar("toolbar"+i);t._addControls(v,to);DOM.setHTML(n,to.renderHTML());o.deltaHeight-=s.theme_advanced_row_height;}});return ic;},_addControls:function(v,tb){var t=this,s=t.settings,di,cf=t.editor.controlManager;if(s.theme_advanced_disable&&!t._disabled){di={};each(explode(s.theme_advanced_disable),function(v){di[v]=1;});t._disabled=di;}else di=t._disabled;each(explode(v),function(n){var c;if(di&&di[n])return;if(n=='tablecontrols'){each(["table","|","row_props","cell_props","|","row_before","row_after","delete_row","|","col_before","col_after","delete_col","|","split_cells","merge_cells"],function(n){n=t.createControl(n,cf);if(n)tb.add(n);});return;}c=t.createControl(n,cf);if(c)tb.add(c);});},_addToolbars:function(c,o){var t=this,i,tb,ed=t.editor,s=t.settings,v,cf=ed.controlManager,di,n,h=[],a;a=s.theme_advanced_toolbar_align.toLowerCase();a='mce'+t._ufirst(a);n=DOM.add(DOM.add(c,'tr'),'td',{'class':'mceToolbar '+a});if(!ed.getParam('accessibility_focus')||ed.getParam('tab_focus'))h.push(DOM.createHTML('a',{href:'#',onfocus:'tinyMCE.get(\''+ed.id+'\').focus();'},'<!-- IE -->'));h.push(DOM.createHTML('a',{href:'#',accesskey:'q',title:ed.getLang("advanced.toolbar_focus")},'<!-- IE -->'));for(i=1;(v=s['theme_advanced_buttons'+i]);i++){tb=cf.createToolbar("toolbar"+i,{'class':'mceToolbarRow'+i});if(s['theme_advanced_buttons'+i+'_add'])v+=','+s['theme_advanced_buttons'+i+'_add'];if(s['theme_advanced_buttons'+i+'_add_before'])v=s['theme_advanced_buttons'+i+'_add_before']+','+v;t._addControls(v,tb);h.push(tb.renderHTML());o.deltaHeight-=s.theme_advanced_row_height;}h.push(DOM.createHTML('a',{href:'#',accesskey:'z',title:ed.getLang("advanced.toolbar_focus"),onfocus:'tinyMCE.getInstanceById(\''+ed.id+'\').focus();'},'<!-- IE -->'));DOM.setHTML(n,h.join(''));},_addStatusBar:function(tb,o){var n,t=this,ed=t.editor,s=t.settings,r,mf,me,td;n=DOM.add(tb,'tr');n=td=DOM.add(n,'td',{'class':'mceStatusbar'});n=DOM.add(n,'div',{id:ed.id+'_path_row'},s.theme_advanced_path?ed.translate('advanced.path')+': ':'&nbsp;');DOM.add(n,'a',{href:'#',accesskey:'x'});if(s.theme_advanced_resizing&&!tinymce.isOldWebKit){DOM.add(td,'a',{id:ed.id+'_resize',href:'javascript:;',onclick:"return false;",'class':'mceResize'});if(s.theme_advanced_resizing_use_cookie){ed.onPostRender.add(function(){var o=Cookie.getHash("TinyMCE_"+ed.id+"_size"),c=DOM.get(ed.id+'_tbl');if(!o)return;if(s.theme_advanced_resize_horizontal)c.style.width=Math.max(10,o.cw)+'px';c.style.height=Math.max(10,o.ch)+'px';DOM.get(ed.id+'_ifr').style.height=Math.max(10,parseInt(o.ch)+t.deltaHeight)+'px';});}ed.onPostRender.add(function(){Event.add(ed.id+'_resize','mousedown',function(e){var c,p,w,h,n,pa;c=DOM.get(ed.id+'_tbl');w=c.clientWidth;h=c.clientHeight;miw=s.theme_advanced_resizing_min_width||100;mih=s.theme_advanced_resizing_min_height||100;maw=s.theme_advanced_resizing_max_width||0xFFFF;mah=s.theme_advanced_resizing_max_height||0xFFFF;p=DOM.add(DOM.get(ed.id+'_parent'),'div',{'class':'mcePlaceHolder'});DOM.setStyles(p,{width:w,height:h});DOM.hide(c);DOM.show(p);r={x:e.screenX,y:e.screenY,w:w,h:h,dx:null,dy:null};mf=Event.add(document,'mousemove',function(e){var w,h;r.dx=e.screenX-r.x;r.dy=e.screenY-r.y;w=Math.max(miw,r.w+r.dx);h=Math.max(mih,r.h+r.dy);w=Math.min(maw,w);h=Math.min(mah,h);if(s.theme_advanced_resize_horizontal)p.style.width=w+'px';p.style.height=h+'px';return Event.cancel(e);});me=Event.add(document,'mouseup',function(e){var ifr;Event.remove(document,'mousemove',mf);Event.remove(document,'mouseup',me);c.style.display='';DOM.remove(p);if(r.dx===null)return;ifr=DOM.get(ed.id+'_ifr');if(s.theme_advanced_resize_horizontal)c.style.width=Math.max(10,r.w+r.dx)+'px';c.style.height=Math.max(10,r.h+r.dy)+'px';ifr.style.height=Math.max(10,ifr.clientHeight+r.dy)+'px';if(s.theme_advanced_resizing_use_cookie){Cookie.setHash("TinyMCE_"+ed.id+"_size",{cw:r.w+r.dx,ch:r.h+r.dy});}});return Event.cancel(e);});});}o.deltaHeight-=21;n=tb=null;},_nodeChanged:function(ed,cm,n,co){var t=this,p,de=0,v,c,s=t.settings;tinymce.each(t.stateControls,function(c){cm.setActive(c,ed.queryCommandState(t.controls[c][1]));});cm.setActive('visualaid',ed.hasVisual);cm.setDisabled('undo',!ed.undoManager.hasUndo()&&!ed.typing);cm.setDisabled('redo',!ed.undoManager.hasRedo());cm.setDisabled('outdent',!ed.queryCommandState('Outdent'));p=DOM.getParent(n,'A');if(c=cm.get('link')){if(!p||!p.name){c.setDisabled(!p&&co);c.setActive(!!p);}}if(c=cm.get('unlink')){c.setDisabled(!p&&co);c.setActive(!!p&&!p.name);}if(c=cm.get('anchor')){c.setActive(!!p&&p.name);if(tinymce.isWebKit){p=DOM.getParent(n,'IMG');c.setActive(!!p&&DOM.getAttrib(p,'mce_name')=='a');}}p=DOM.getParent(n,'IMG');if(c=cm.get('image'))c.setActive(!!p&&n.className.indexOf('mceItem')==-1);if(c=cm.get('styleselect')){if(n.className){t._importClasses();c.select(n.className);}else c.select();}if(c=cm.get('formatselect')){p=DOM.getParent(n,DOM.isBlock);if(p)c.select(p.nodeName.toLowerCase());}if(c=cm.get('fontselect'))c.select(ed.queryCommandValue('FontName'));if(c=cm.get('fontsizeselect'))c.select(ed.queryCommandValue('FontSize'));if(s.theme_advanced_path&&s.theme_advanced_statusbar_location){p=DOM.get(ed.id+'_path')||DOM.add(ed.id+'_path_row','span',{id:ed.id+'_path'});DOM.setHTML(p,'');ed.dom.getParent(n,function(n){var na=n.nodeName.toLowerCase(),u,pi,ti='';if(n.nodeType!=1||(DOM.hasClass(n,'mceItemHidden')||DOM.hasClass(n,'mceItemRemoved')))return;if(v=DOM.getAttrib(n,'mce_name'))na=v;if(tinymce.isIE&&n.scopeName!=='HTML')na=n.scopeName+':'+na;na=na.replace(/mce\:/g,'');switch(na){case'b':na='strong';break;case'i':na='em';break;case'img':if(v=DOM.getAttrib(n,'src'))ti+='src: '+v+' ';break;case'a':if(v=DOM.getAttrib(n,'name')){ti+='name: '+v+' ';na+='#'+v;}if(v=DOM.getAttrib(n,'href'))ti+='href: '+v+' ';break;case'font':if(s.convert_fonts_to_spans)na='span';if(v=DOM.getAttrib(n,'face'))ti+='font: '+v+' ';if(v=DOM.getAttrib(n,'size'))ti+='size: '+v+' ';if(v=DOM.getAttrib(n,'color'))ti+='color: '+v+' ';break;case'span':if(v=DOM.getAttrib(n,'style'))ti+='style: '+v+' ';break;}if(v=DOM.getAttrib(n,'id'))ti+='id: '+v+' ';if(v=n.className){v=v.replace(/(webkit-[\w\-]+|Apple-[\w\-]+|mceItem\w+|mceVisualAid)/g,'');if(v&&v.indexOf('mceItem')==-1){ti+='class: '+v+' ';if(DOM.isBlock(n)||na=='img'||na=='span')na+='.'+v;}}na=na.replace(/(html:)/g,'');na={name:na,node:n,title:ti};t.onResolveName.dispatch(t,na);ti=na.title;na=na.name;pi=DOM.create('a',{'href':"javascript:;",onmousedown:"return false;",title:ti,'class':'mcePath_'+(de++)},na);if(p.hasChildNodes()){p.insertBefore(document.createTextNode(' \u00bb '),p.firstChild);p.insertBefore(pi,p.firstChild);}else p.appendChild(pi);},ed.getBody());}},_sel:function(v){this.editor.execCommand('mceSelectNodeDepth',false,v);},_mceInsertAnchor:function(ui,v){var ed=this.editor;ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/anchor.htm',width:320+parseInt(ed.getLang('advanced.anchor_delta_width',0)),height:90+parseInt(ed.getLang('advanced.anchor_delta_height',0)),inline:true},{theme_url:this.url});},_mceCharMap:function(){var ed=this.editor;ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/charmap.htm',width:550+parseInt(ed.getLang('advanced.charmap_delta_width',0)),height:250+parseInt(ed.getLang('advanced.charmap_delta_height',0)),inline:true},{theme_url:this.url});},_mceHelp:function(){var ed=this.editor;ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/about.htm',width:480,height:380,inline:true},{theme_url:this.url});},_mceColorPicker:function(u,v){var ed=this.editor;v=v||{};ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/color_picker.htm',width:375+parseInt(ed.getLang('advanced.colorpicker_delta_width',0)),height:250+parseInt(ed.getLang('advanced.colorpicker_delta_height',0)),close_previous:false,inline:true},{input_color:v.color,func:v.func,theme_url:this.url});},_mceCodeEditor:function(ui,val){var ed=this.editor;ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/source_editor.htm',width:parseInt(ed.getParam("theme_advanced_source_editor_width",720)),height:parseInt(ed.getParam("theme_advanced_source_editor_height",580)),inline:true,resizable:true,maximizable:true},{theme_url:this.url});},_mceImage:function(ui,val){var ed=this.editor;if(ed.dom.getAttrib(ed.selection.getNode(),'class').indexOf('mceItem')!=-1)return;ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/image.htm',width:355+parseInt(ed.getLang('advanced.image_delta_width',0)),height:275+parseInt(ed.getLang('advanced.image_delta_height',0)),inline:true},{theme_url:this.url});},_mceLink:function(ui,val){var ed=this.editor;ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/link.htm',width:310+parseInt(ed.getLang('advanced.link_delta_width',0)),height:200+parseInt(ed.getLang('advanced.link_delta_height',0)),inline:true},{theme_url:this.url});},_mceNewDocument:function(){var ed=this.editor;ed.windowManager.confirm('advanced.newdocument',function(s){if(s)ed.execCommand('mceSetContent',false,'');});},_mceForeColor:function(){var t=this;this._mceColorPicker(0,{func:function(co){t.editor.execCommand('ForeColor',false,co);}});},_mceBackColor:function(){var t=this;this._mceColorPicker(0,{func:function(co){t.editor.execCommand('HiliteColor',false,co);}});},_ufirst:function(s){return s.substring(0,1).toUpperCase()+s.substring(1);}});tinymce.ThemeManager.add('advanced',tinymce.themes.AdvancedTheme);}());
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/image.htm 2.5.src/wp-includes/js/tinymce/themes/advanced/image.htm
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/image.htm	2006-04-17 18:27:18.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/image.htm	2008-03-12 17:47:11.000000000 -0500
@@ -1,17 +1,18 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-	<title>{$lang_insert_image_title}</title>
-	<script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
-	<script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>
-	<script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>
-	<script language="javascript" type="text/javascript" src="jscripts/image.js"></script>
+	<title>{#advanced_dlg.image_title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script type="text/javascript" src="../../utils/form_utils.js"></script>
+	<script type="text/javascript" src="js/image.js"></script>
 	<base target="_self" />
 </head>
-<body id="image" onload="tinyMCEPopup.executeOnLoad('init();');document.body.style.display='';document.getElementById('src').focus();" style="display: none">
-<form onsubmit="insertImage();return false;" action="#">
+<body id="image" style="display: none">
+<form onsubmit="ImageDialog.update();return false;" action="#">
 	<div class="tabs">
 		<ul>
-			<li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_insert_image_title}</a></span></li>
+			<li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advanced_dlg.image_title}</a></span></li>
 		</ul>
 	</div>
 
@@ -19,68 +20,57 @@
 		<div id="general_panel" class="panel current">
      <table border="0" cellpadding="4" cellspacing="0">
           <tr>
-            <td nowrap="nowrap"><label for="src">{$lang_insert_image_src}</label></td>
+            <td nowrap="nowrap"><label for="src">{#advanced_dlg.image_src}</label></td>
             <td><table border="0" cellspacing="0" cellpadding="0">
                 <tr>
-                  <td><input id="src" name="src" type="text" value="" style="width: 200px" onchange="getImageData();"></td>
+                  <td><input id="src" name="src" type="text" class="mceFocus" value="" style="width: 200px" onchange="ImageDialog.getImageData();" /></td>
                   <td id="srcbrowsercontainer">&nbsp;</td>
                 </tr>
               </table></td>
           </tr>
-		  <!-- Image list -->
-		  <script language="javascript">
-			if (typeof(tinyMCEImageList) != "undefined" && tinyMCEImageList.length > 0) {
-				var html = "";
-
-				html += '<tr><td><label for="image_list">{$lang_image_list}</label></td>';
-				html += '<td><select id="image_list" name="image_list" style="width: 200px" onchange="this.form.src.value=this.options[this.selectedIndex].value;resetImageData();getImageData();">';
-				html += '<option value="">---</option>';
-
-				for (var i=0; i<tinyMCEImageList.length; i++)
-					html += '<option value="' + tinyMCEImageList[i][1] + '">' + tinyMCEImageList[i][0] + '</option>';
-
-				html += '</select></td></tr>';
-
-				document.write(html);
-			}
-		  </script>
-		  <!-- /Image list -->
-          <tr>
-            <td nowrap="nowrap"><label for="alt">{$lang_insert_image_alt}</label></td>
-            <td><input id="alt" name="alt" type="text" value="" style="width: 200px"></td>
-          </tr>
-          <tr>
-            <td nowrap="nowrap"><label for="align">{$lang_insert_image_align}</label></td>
-            <td><select id="align" name="align">
-                <option value="">{$lang_insert_image_align_default}</option>
-                <option value="baseline">{$lang_insert_image_align_baseline}</option>
-                <option value="top">{$lang_insert_image_align_top}</option>
-                <option value="middle">{$lang_insert_image_align_middle}</option>
-                <option value="bottom">{$lang_insert_image_align_bottom}</option>
-                <option value="texttop">{$lang_insert_image_align_texttop}</option>
-                <option value="absmiddle">{$lang_insert_image_align_absmiddle}</option>
-                <option value="absbottom">{$lang_insert_image_align_absbottom}</option>
-                <option value="left">{$lang_insert_image_align_left}</option>
-                <option value="right">{$lang_insert_image_align_right}</option>
+		  <tr>
+			<td><label for="image_list">{#advanced_dlg.image_list}</label></td>
+			<td><select id="image_list" name="image_list" onchange="document.getElementById('src').value=this.options[this.selectedIndex].value;document.getElementById('alt').value=this.options[this.selectedIndex].text;"></select></td>
+		  </tr>
+          <tr>
+            <td nowrap="nowrap"><label for="alt">{#advanced_dlg.image_alt}</label></td>
+            <td><input id="alt" name="alt" type="text" value="" style="width: 200px" /></td>
+          </tr>
+          <tr>
+            <td nowrap="nowrap"><label for="align">{#advanced_dlg.image_align}</label></td>
+            <td><select id="align" name="align" onchange="ImageDialog.updateStyle();">
+                <option value="">{#not_set}</option>
+                <option value="baseline">{#advanced_dlg.image_align_baseline}</option>
+                <option value="top">{#advanced_dlg.image_align_top}</option>
+                <option value="middle">{#advanced_dlg.image_align_middle}</option>
+                <option value="bottom">{#advanced_dlg.image_align_bottom}</option>
+                <option value="text-top">{#advanced_dlg.image_align_texttop}</option>
+                <option value="text-bottom">{#advanced_dlg.image_align_textbottom}</option>
+                <option value="left">{#advanced_dlg.image_align_left}</option>
+                <option value="right">{#advanced_dlg.image_align_right}</option>
               </select></td>
           </tr>
           <tr>
-            <td nowrap="nowrap"><label for="width">{$lang_insert_image_dimensions}</label></td>
-            <td><input id="width" name="width" type="text" value="" size="4" maxlength="4">
+            <td nowrap="nowrap"><label for="width">{#advanced_dlg.image_dimensions}</label></td>
+            <td><input id="width" name="width" type="text" value="" size="3" maxlength="5" />
               x
-              <input id="height" name="height" type="text" value="" size="4" maxlength="4"></td>
+              <input id="height" name="height" type="text" value="" size="3" maxlength="5" /></td>
           </tr>
           <tr>
-            <td nowrap="nowrap"><label for="border">{$lang_insert_image_border}</label></td>
-            <td><input id="border" name="border" type="text" value="" size="4" maxlength="4"></td>
+            <td nowrap="nowrap"><label for="border">{#advanced_dlg.image_border}</label></td>
+            <td><input id="border" name="border" type="text" value="" size="3" maxlength="3" onchange="ImageDialog.updateStyle();" /></td>
           </tr>
           <tr>
-            <td nowrap="nowrap"><label for="vspace">{$lang_insert_image_vspace}</label></td>
-            <td><input id="vspace" name="vspace" type="text" value="" size="4" maxlength="4"></td>
+            <td nowrap="nowrap"><label for="vspace">{#advanced_dlg.image_vspace}</label></td>
+            <td><input id="vspace" name="vspace" type="text" value="" size="3" maxlength="3" onchange="ImageDialog.updateStyle();" /></td>
           </tr>
           <tr>
-            <td nowrap="nowrap"><label for="hspace">{$lang_insert_image_hspace}</label></td>
-            <td><input id="hspace" name="hspace" type="text" value="" size="4" maxlength="4"></td>
+            <td nowrap="nowrap"><label for="hspace">{#advanced_dlg.image_hspace}</label></td>
+            <td><input id="hspace" name="hspace" type="text" value="" size="3" maxlength="3" onchange="ImageDialog.updateStyle();" /></td>
+          </tr>
+		  <tr>
+            <td nowrap="nowrap"><label for="class_name">{#class_name}</label></td>
+            <td><input type="text" id="class_name" name="class_name" style="width: 140px" value="" /></td>
           </tr>
         </table>
 		</div>
@@ -88,11 +78,11 @@
 
 	<div class="mceActionPanel">
 		<div style="float: left">
-			<input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />
+			<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
 		</div>
 
 		<div style="float: right">
-			<input type="submit" id="insert" name="insert" value="{$lang_insert}" onclick="insertImage();" />
+			<input type="submit" id="insert" name="insert" value="{#insert}" />
 		</div>
 	</div>
 </form>
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/anchor.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/anchor.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/anchor.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/anchor.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89a   )=i]j8Qbw7LtN`wTn   !   ,       XI8=q0NQ(JTLJ5;FsH,:
-	0PE2P4FB2Ab
H  NڭZ~ ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/anchor_symbol.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/anchor_symbol.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/anchor_symbol.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/anchor_symbol.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a       !   ,      @w&ڃq|a4b ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/backcolor.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/backcolor.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/backcolor.gif	2006-11-20 18:55:06.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/backcolor.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF89a       è΀s퀘@TpPh0H`ȰP؀sP00p  pȠPM5px[Й                                                                                             !    ,       @pH,H#e0)IГdBa@|T*7
-HJFCB~
-$1Dyl}E_ES
JL	QQQEDûCA ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/bold.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/bold.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/bold.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/bold.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a      !   ,       #XM~{~qV(ـfyJL ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/bold_de_se.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/bold_de_se.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/bold_de_se.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/bold_de_se.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a      !   ,        tFz1sUٕ(L ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/bold_es.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/bold_es.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/bold_es.gif	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/bold_es.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89a      !
-  ,       'řn8amhCj%Gk7 ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/bold_fr.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/bold_fr.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/bold_fr.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/bold_fr.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a      !   ,       %37o].^&Filiz ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/bold_ru.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/bold_ru.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/bold_ru.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/bold_ru.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89a    MMM   !   ,       $4T
-UadA[]3n)I ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/bold_tw.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/bold_tw.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/bold_tw.gif	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/bold_tw.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a   """UUUwwwDDD333fff      !   ,       |I8;"4nw5D(B\4ȁ6K4,(1&  en
J " V-AAX  Y̐B/,a(ӖƀtA0	>P	#6)ry  [" ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/browse.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/browse.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/browse.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/browse.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89a   .Dr		   !   ,       B
-;㭹 HV bJ~hfvXރg6*bVMŔHih ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/bullist.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/bullist.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/bullist.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/bullist.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a   ":R"2rbz   !   ,       1x0I2A`>C hhJ]Yy(j`A1(pȤ$ ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/button_menu.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/button_menu.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/button_menu.gif	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/button_menu.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a	      !   ,    	   SV޼ ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/buttons.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/buttons.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/buttons.gif	2006-11-20 18:55:06.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/buttons.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,27 +0,0 @@
-GIF89a      9cXB]pzƿ7Lf3JcR^jwڭA<<,d(ڑlӣðwxGuZ>  (#

-
-

 ˝ޛ                                                                                                                                                                     !  H ,      Hɴ&-&ʾԏHߍ,++,xj= A@B>lDREx4Ϛ!dn.vd%#ē6\@ϟ>X_?j+A
Ģ)n3:PKtaB<MwY
V[Mgo66T5߿4$MC+P	
x
,en
8,y~]XR޶ 5 cQ	&RѢ
-o|/SԌ@F^5s?HD#xPuM0 ՙAD _Ϟ׿>}8	'
-3)%KC~דa"VEŬ
-X1!]=0Xef!!~<^pl<AvC"bOq娉
-0Y	"rwpw[^ ?eh _tJ"V@xN692h0:X!%g Bp#h	R!#uѩ[ZtH +	Zk
`"<m&` < ))!"MiI`E9l$#`O?ںAzH? dِ:qy# ¾Z(}W&fn 
Ű ,xB	'`&@h"Ùՠ!)ݚHK1"5&&>~+7U:̠s[\8H]cj9Ȏ%d-] AH،r)<!PR	EL Ƈ]	.	(ll\ݥ<"ׂ(*"lcEI D+m(,
-/5ȑ@5U*ܜ4F: ~x7f.IzHl( ǀD,rpVHΤ@3IpR!"kPR` 5@	x;#b.#Ƶ!0wsCE#y	gEAePBG`">2	59
-[Yߒd0t."$y%dc_|IKl~Dq,DaNEsl{ntDp$H#	ޥ,51LV;
-z@+<v!
i[GjO8kP@pO(\U,4u3v.t)إ3K^B]MBcD;]KUMI!AO`ϵ`0`3dvͩfȝ"*d9,Z WTEH"(BVAj0%.!(IpS<&( b@WX.ZՐ_))5Apa( WxR
-)DC8$$Nq`_HB3:oȷ	,>P^@UPo`Hzh
3dc%E1$(H  )BYyLbF԰x%*k*j
i62qSXu*l$Y8XAQEkЊNG$HNZB`a#uGHbdd'eNb+6*4
- Tc9j;"5QK} 5!0`sG]q	 =ʚ
-[nkǼoq#56+m(d"ԥABGmi)	GU&+$5NR-4#<EFcf.cC4|0 `<BiljC|#L]3a 5wRPff ,w'vphb_A94 njH5yrA
- ^"|>@7JIz2Q3s!'$ӧg!;6Fjkz	`!0}g]c&i-ڝoPNg
E~VV>PZBx'CH6H9-o/c8p/|QaUԔpĐ|їccj
c
uS	xw"#0ڤMZ@Pyf_B;x OO3b.fq0f}6uD>-F@O<W6juY!
c	
~2}R{sSec`0A1X>S1qPP}m"d@bSVAŕU?j^F]LIc.0`5bkB',`_#(Ͼ< %+Aj$0<wŚS90s2RL @`ĳ*b֒'c&VA1e3]ǁ==MйlQicHj'JYMk9>1A4q4rqprH`V)(%[Hu " &R3W @9`!JW-aq}"S0e:mdb{r(-w`C/Ti7WMA,q#&HR5(#J7BE	t;S7T#(N[`'`xh 	Ax /hHfwOfbiF?&xdwJ,p / $eT !b1w@t{AfyWR G։0z"y'}Epi}&!4hvwvU[g`Z8rgu!B)1bfCx{a{UWg|>;ŨPOVjV#}m(
-lR5y(BE&uaH(1q.""ma2 8J "w|'`P$ıSD;$"[$-VrRi+p .Z5搅%~Qq;؃I ""R834XK^T.-.Q!4
! x"HDS6GIgQ4I90^r&gקt;r;Ԩ(4uX8Tiab!v16vG0 Ј!Yb%CD>7w% JSfuYeΉxkƘ8B%H..3a@_ogt.VC//錍h^՘0}U-q}Uwtڈi߶XT,[t4VȜTVRVYև!Q%_5nY2cl %a\%u4;Q+ E+ #H<-;_x8pٓ+G@(io}\l:uwp*H
 `BS	; d,W(禃Sf&XreJ35)qYLs) h457Lk$s-fU<2O#6^c) Xdԙ(3i:i'	$uÑ0c0v9v.^AiҕF	rFJ$`,|&amw4d@Dv`qEMƣ$
-uD
-!zxƯFH6IzErT	@9V{'uL:Q$ơSd2v#RU"%!բ.z~lpi>
-P(Z(2(G1.3nYZ3QR9(1Wj-ӑ(21IV!sA> "BCu. Jn* i4TMC%$#P;Qh2zf&7J'_c4_fu }agaX^X
&'aE Nz,Ea<fq(uf@J60"0-ת'Va1íY	BL)*c 
-7>R8fn4PM6/$/ @E	TpX	¿iliX^Y䲤'D ʪ
-@X-[p9@J3wT1nsZ)D<`{&L\ I91{o0  F H|qPħB Yx q[i4Y$PBT;5%fz) @~ˢ$)Q7&})&`<&3tR3lov|Pɮ*cXt8e:8lԲ"f3  P"6Z<zpTE@*ɠf+@üP1l(.T[¼Ϳ|`Kiz%Q̒"9zSd;h#.
-*i+PlPI9
-
-tE-!TaZ[l 3ZZqGEe3,*poRlA|'g.i;T`Xr7,2,#iU͕#q_\oS`GUaBWp/Yu<Ye;"]g r:`90Rϊɐ<gړ;ؠH8#*;s\+9Tt
, M7ѻ3v Ś ;Լ%7Rۜ	z*頂Pp.̤ Rq}=Z?c;$AlA-mA0`,Fw}V0UiԆkF0	
Tm-R2%5&YW&ۍa. :E
-:2$ۺpE6N/JE¬i5.:MUEmń0(u83ca]u$;N% tP)׽QM֭Ff-}֐y_k^֋r}##y}:DR_\9}LlX>.ʕX.ѯl[ƛٚ΋
-]
-
:`C*ܧv.y mnF:w(-mypY4}{D3/̗
-MA+`3ڃ%f+n3#m^/D:5:7QfVyGRy/B(NhX ߊ;خ{`e<`ɍ>ڑaw@^8Z M~	>__	 "?$_&(*,O  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/cancel_button_bg.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/cancel_button_bg.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/cancel_button_bg.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/cancel_button_bg.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,10 +0,0 @@
-GIF89aZ    ¹~   !     ,    Z   'dihlp,tmx~VpH,EQ i:ШtJZѥz`j "p;4njuS.Onǣhif"pqli
-
-
-p
-ιܹ"*T׎=x!n?~9 as
-p=I2dɓ(Qcʔ
-رfM6mɳǎ.}
-
-tM3DH!"$H4SNDӥ{)fm4+[pM   )_
-|@8`#F_Ɖlx/_"Nh`?ܹh|~ hTn
agբc<ys߾6}`6mԶ'``УKaرW ۡWћW<yߣ??o](h"5F(Vh!^vXa ("  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/center.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/center.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/center.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/center.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a      !   ,       ֈ9t8ə
 ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/charmap.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/charmap.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/charmap.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/charmap.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a   &J"{js\.Obb7A=s`z$bFRRrЖʼ䞿6M8~;bǢFRFXvnz   !   ,       r'dihTqOBw$IPlPJ!sr\&apz4&)DhN  r<Q RF%,#
 `#
 &
#-(! ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/cleanup.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/cleanup.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/cleanup.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/cleanup.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF89a   F<&zB|rgc[Ϭ¸geB:ªBԴnn~FNRȖݢbҺbܒtbLNg2ܱ   !   ,       }'dih(;2ʆ8총p)!(
-c4 Ċ,"H*GTlχHp<-p
-mDuUdv ' ,22#'! ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/close.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/close.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/close.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/close.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89a    @@@Ȁ            ,       3")ǣ8Z	vIP
-~Sr5[Y"`H,ȤrL  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/code.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/code.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/code.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/code.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a   !B!RBs^            !   ,       3H0I'Bg`[.@-r8֮ ipȤriL  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/color.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/color.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/color.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/color.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a       Ț@@@      !   ,       B8LCI넂;QdY~h#Ҥ:һ"dP1\l&  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/colors.jpg 2.5.src/wp-includes/js/tinymce/themes/advanced/images/colors.jpg
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/colors.jpg	2007-05-18 19:10:57.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/colors.jpg	1969-12-31 18:00:00.000000000 -0600
@@ -1,19 +0,0 @@
- JFIF       >CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), default quality
- C 		
-
 $.' ",#(7),01444'9=82<.342 C			

2!!22222222222222222222222222222222222222222222222222  ,"            	
-    } !1AQa"q2#BR$3br	
-%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz        	
-   w !1AQaq"2B	#3Rbr
-$4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz   ? 孇JضY6k[D{nկlzVEjַ=+ȯHٶ=+^ٺV-ZҼ<,C4پAUejZFX@qEyZjĆHk>sҚ)R!@TJ~jrc4u<IRe5"MH
-%u5"MJ
-c(Q=j<U־({UzǹZ&z${Xx#d\p:M^&%-]^^5N3OwZ\VXRBD*b+s>"Bv#cqUTL*f
-qLXTL*v
-Qf@£"aL#BLn:Vj̀t8;WZ'^fjշ=+*ߵizWZ'^FZұ=+R^]h-vhEVB(5r Y
O!!!@q1+ާ)1~:<*MD
<MH
B
H
{c'`xWZ9^ᩙq޲;֤.~ёЉp:UZ󎵗8^֠j֠kьâh֭F*֭F+#j1\XT⢌T=ЉF¥4YԦB£aSQ^$LFELE0MTPjτt{W
XUiPv(J̇hzWV'ZFi@+*ҴanՁVfoUy[s"sUL xC!Vs]0b"BǚPi(5B:T(4j j@kã'Pj@ji׷2p&9Vz׳E53Y)tґQ8Y8YҙQFL֡j֡ECנ#Zj-e91VPT(*
-o"xMڢASc-f#5)+3Lab
HRL"ZSE2#hCTz˫25	&*D*фք-ҳ!5~&
-<ʬ[8*j0<nj@淌""sUj"HZp]y^fJ
<p53p&1Lk֤ԣ5PuU	Ч#ѥ>aֳ(3ԥ2ejQ"bEE-XAYgE *$:
-ZT☂9hzԧ*B)WY
-dDSH^EcE2")H⼚R
-TUȫ<ڳ.EWb5J*:</DjMYњWH}F\-.ԥv٪5`yQJơc[V$g(4yPԐx54kӤp$
D
<H
W⠐ץM!NZ-]]wRFQT~ATNgIүZȵuzZ5VQYgEAST+LHIژXNZ90a)^uVlFE0iU-Ln*B)6Ե2x[F*uTf:՘r'Ic5j6Hjm\QqQRf1ұ֪D5DƞƢcZ"0zҊޜN7Ӂ8麗p$
F
8K&j
IC]ajVIVު]pNITUZA]PN%U-1V;iUR*Ԫg}1TT)*UNCT⚢+HE4iQ)M""Ey
-S#"LWJd*T(*t	̝*:NYȴ#UD5:5a(eSYƢcJMFMhrMƣcN&&P8Z\Љ<Piӳ]PDr
G\dI;5RSBYWqVT+3:1Vu:`UP"@*@*θHrv) Ⲕa*B)W4٢)TR\)Ln*LRb&%QS-FZ	Lje5
-ԋY8DjejVdnZ@CHM4	 &MIP9	6֑晚\D.i5EI.ikxP#jVڵR6HXT,*
-jmVei֜CBND Ss:# @r7Rb+f)1O&+	3VC<P(s)8Ap!mԅ=ԛ!&nL3hRi	&i74fDA٥74f!r.ih~ifÐCL4HjP#"EJE42HJmZDaiSsDN1K! .)qSZRbLT6W8Rb1PÜf)1Oq*k,4f)XAE v %QaX(,AES asIEI(Rb((E]1F(R((p)bQEvPg
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/copy.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/copy.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/copy.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/copy.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-GIF89a   2JbӚ2]brⲿҲbzᕵ"KJv¢r"BrڂRҢr҂   !   ,       'dih,(I	r܇kϮwKp0N_́Ah~S
-*dGE\ָ
-%"'

|e 8
-})('p-%! ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/custom_1.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/custom_1.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/custom_1.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/custom_1.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a           !   ,       Z̚ylHyz[  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/cut.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/cut.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/cut.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/cut.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89a   C_m\y"M{ŕY/cjM   !   ,       hI8U 0!S0O4OC0r2!0	FAP  `G±:AH< ,
 G!\ ;No
-`pGL ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/forecolor.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/forecolor.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/forecolor.gif	2006-11-20 18:55:06.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/forecolor.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a       @XɜŮͬPcʯ2JD]pcyåљ":j0PDcPpj}HfUq"@q5ZF]u                                                                                          !  ! ,       spH,$Q"ȸ\,S"cpBBSq9PSd7![1]4A98!
tIDI
C	GC	D  `YA ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/full.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/full.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/full.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/full.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a      !   ,       =:U6當 ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/help.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/help.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/help.gif	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/help.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89a   O^u"Zr9ZBzrýP5nSVMp_ܑ̰"X"g   !   ,       'dihHY_fUNTFfD"TX$b1pLJ%px$GaIt%qH d8&bmz^ ~%u
- & &  
'}(Q*
44! ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/hr.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/hr.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/hr.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/hr.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a      !   ,       ޼H` ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/image.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/image.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/image.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/image.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF89a    f %c   8*333                !  
- ,       oPIͻ@ yR`;j#.Tg;
-a8CA'n`݀ a;+;Wl~{ GGs{ ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/indent.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/indent.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/indent.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/indent.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a   ;ZQ^z   !   ,       5x0ʹ h05(湈C 	K'ײ3qc:'	 ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/insert_button_bg.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/insert_button_bg.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/insert_button_bg.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/insert_button_bg.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF89aZ       ~!     ,    Z     dihlkp,tmx~z@)Ȥrl:JZL)@,zG,=߲yeQnb>hqh__"hө[`@wC}c
-6hԘqǏA9F$SNh	
0cj L2s'M9	y@ d&D
T'8躀U4@ 
U3H; mةq5[vWMp$$+C+~Ɋ3ά2aǝ=;aŀ8
V`rر1nAe޾ݻkyî͜u
-Dzo߳YcX:SCO| ӫ_O	~w__z(<g*| 'fvxa|'$h()0(-h8 ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/italic.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/italic.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/italic.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/italic.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a      {{{!   ,        D9j*p dY ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/italic_de_se.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/italic_de_se.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/italic_de_se.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/italic_de_se.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a      !   ,       "PXCDMy؍&ma	Lt ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/italic_es.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/italic_es.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/italic_es.gif	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/italic_es.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a      !   ,      !PXCDMy؍&ma	L ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/italic_ru.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/italic_ru.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/italic_ru.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/italic_ru.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a    MMM   !   ,       %4ZaY~EYY͇ig:S ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/italic_tw.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/italic_tw.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/italic_tw.gif	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/italic_tw.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89a   oooOOO___///￿ߏ???                                                !   ,        $dih:.*z<C)g<x,rcx,	Ń`z)#$.jPx8h Jpl4	&`
U
-zz&a
Ly
>$ #
&	m#b%	04-F2--! ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/justifycenter.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/justifycenter.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/justifycenter.gif	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/justifycenter.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a      !   ,       ֈ9t8ə
 ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/justifyfull.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/justifyfull.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/justifyfull.gif	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/justifyfull.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a      !   ,       =:U6當 ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/justifyleft.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/justifyleft.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/justifyleft.gif	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/justifyleft.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a      !   ,       <t8y ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/justifyright.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/justifyright.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/justifyright.gif	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/justifyright.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a      !   ,       ֈt8
ə ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/left.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/left.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/left.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/left.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a      !   ,       <t8y ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/link.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/link.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/link.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/link.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF89a   /LtBSony͓Sc}߲◧   !   ,       \I8ͻ8#<"$E,U+B
BOA0T + 1Ǣ1
-qN[聁/
-~ ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/menu_check.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/menu_check.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/menu_check.gif	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/menu_check.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89a      !   ,       
-gVD  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/newdocument.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/newdocument.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/newdocument.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/newdocument.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a   2Jb⢵Ⲿ   !   ,       WI8zWla
0fyʺf @v/# k82MAr5ǖ5L'hFo> ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/numlist.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/numlist.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/numlist.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/numlist.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a   <YJnR|   !   ,       4x0I[1SBA`a!h;ɢt̺_f9jkV ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/opacity.png 2.5.src/wp-includes/js/tinymce/themes/advanced/images/opacity.png
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/opacity.png	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/opacity.png	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-PNG
-
-   
IHDR         
   gAMA  7   tEXtSoftware Adobe ImageReadyqe<   %IDATxbf*&*QG
5pQ  f    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/outdent.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/outdent.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/outdent.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/outdent.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a   ?]^W疲   !   ,       3x0ʹ hƗ!(^@i c G)٬	^	ZHRr9I  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/paste.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/paste.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/paste.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/paste.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,5 +0,0 @@
-GIF89a   B3#"bz\BO]zҒWhRj*ƒjhXB띢ғʂ6whT򶪍򲗍ڣ
-yJB:   !   ,       'dih沭@a9bYE(,'^qtG@4l<NsCH󩠸
@=Tڜb@"w
%
-
-{i#f
n $
-gg n* 0$! ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/redo.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/redo.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/redo.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/redo.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF89a   -Os=rח^vU9eMi7ZW}   !   ,       VI8ZIq4J
-S0M
	`01[M:
-|\HF[=ilITxv ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/removeformat.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/removeformat.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/removeformat.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/removeformat.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a   ^p2Jbrr䄚   !   ,       UI87;G0ݷAxǹKhY bd/
w5w$.-`fP(V0@38C ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/right.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/right.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/right.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/right.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a      !   ,       ֈt8
ə ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/separator.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/separator.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/separator.gif	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/separator.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF89a      !   ,       
-b
- ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/spacer.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/spacer.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/spacer.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/spacer.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a          !   ,       D ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/statusbar_resize.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/statusbar_resize.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/statusbar_resize.gif	2005-08-27 13:48:56.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/statusbar_resize.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89a      !   ,        
-- f:eA!%riyKj ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/strikethrough.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/strikethrough.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/strikethrough.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/strikethrough.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a      !   ,       *	KmJvm☵.xqS(  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/sub.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/sub.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/sub.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/sub.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a  	 2RHEHRviig252Bb""RⲯRVR   !   ,       AI8ͻq4R,\A8MC BW8}|.ǜP=f(H IBzLU"PzL ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/sup.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/sup.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/sup.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/sup.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89a   2R>@>R~BbXWW222rrr""Rr   !   ,       @I8<Q2J- 	I8Ȁ	EA'
-&C Tfo Qiz ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/table.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/table.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/table.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/table.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a   rrr⒐ʿ3JcⲝT:2hڎr°ҮҷsbR^j²zҢ   !   ,       'dihE%A<D+_Ehz< z>!qnL9pX!w"]a1mru%ldr
&l%$l
&b	#6%! ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/table_delete_col.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/table_delete_col.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/table_delete_col.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/table_delete_col.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89a   7o2Jb\o}u^暶BZr   !   ,       PI8k[`!2R.j
-._,a@2"q$̎
47D*} +Х˒sF?& ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/table_delete_row.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/table_delete_row.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/table_delete_row.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/table_delete_row.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-GIF89a   j~4LdUWjr   !   ,       XI8pNi&
-y&Ƹ	k8)bQ(
-P0$`:0
(a$)x<Ș`	;YmCw;~ ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/table_insert_col_after.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/table_insert_col_after.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/table_insert_col_after.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/table_insert_col_after.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89a   R2Jb]ozr~򂑟   !   ,       RI8_BZ_H1bl[p+(nbI0(HB:rn"͌ÃQ
-q~  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/table_insert_col_before.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/table_insert_col_before.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/table_insert_col_before.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/table_insert_col_before.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a   R2Jb]ozr~򂑟   !   ,       RIؒbx`WN'OqTBS@n^pHPKB1l+gAÑoE  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/table_insert_row_after.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/table_insert_row_after.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/table_insert_row_after.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/table_insert_row_after.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89a   R2Jb]ozr~򂑟   !   ,       PIضKɕ#*
-Rr D0JCmO%9Z^1xbAxم!p>1yFX8. ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/table_insert_row_before.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/table_insert_row_before.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/table_insert_row_before.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/table_insert_row_before.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a   R2Jb]ozr~򂑟   !   ,       LI8mKaAlT,L)!+]s1?J#AB8*qyx@1L|&Bln[" ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/underline.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/underline.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/underline.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/underline.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a      {{{   !   ,       )@ѐ[M	bz-ʅP  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/underline_es.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/underline_es.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/underline_es.gif	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/underline_es.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a      !   ,       & T8OtG}EH"QS  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/underline_fr.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/underline_fr.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/underline_fr.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/underline_fr.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a      !   ,       & T8OtG}EH"QS  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/underline_ru.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/underline_ru.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/underline_ru.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/underline_ru.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a    MMM   !   ,       $j=i|drk? ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/underline_tw.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/underline_tw.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/underline_tw.gif	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/underline_tw.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a   UUUwww̙333fff"""&&&LLLoooDDD???                                 !   ,       r`%dihJ>TQjMT*TFHp<	" F*+%e9P(&m2<wri)i#^i}(=	#	
(! ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/undo.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/undo.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/undo.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/undo.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a   :]?uܹߧ^~_~r?gQb蔳R   !   ,       \I8:=Gc6`H%"$^h8X@P.aLbGB@0DX"x E=YRp8o!]f ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/unlink.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/unlink.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/unlink.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/unlink.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a   6Kmh}CaSd}Rr   !   ,       kI,뒳qݷ$i{90C8̂A,*< y,KFa A  *Dek D1N?,.y'#$y#( ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/visualaid.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/visualaid.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/visualaid.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/visualaid.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,5 +0,0 @@
-GIF89a   2Jb\wr¬҂   !   ,       {I8i!.K`a j*
-S0'3pTeh`hH
-&ᙈR*.8`ZH:tq9%i 
-fg{*P
-qR|\ny  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/xp/tab_bg.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/xp/tab_bg.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/xp/tab_bg.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/xp/tab_bg.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-GIF89a   啕쑧   !     ,      `C]ihlp,tmx|DC,Ȥrl:ШtJZجvV
xL.zn|N~O  
-H*\ȰÇ#JHa	
-6hȱǏ CIɓ(S\ɲ˗0cʜF8sɳϟ@
-JѣH*]ʴӧP&իXjʵׯ`ÊKٳhӪ]˶۷g;(ݻx˷߿LÈ+^̸c^L˘3k̹ϠCMӨS^͚t ȞM۸sͻNȓ+_>dУKNسkνËOӇ ˟OϿ (huPA36F(Vhfv ($(,0c ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/xp/tab_end.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/xp/tab_end.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/xp/tab_end.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/xp/tab_end.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a    Щ呧                     !     ,       &@, GH4a̅=\O䕃 !b%i  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/xp/tab_sel_bg.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/xp/tab_sel_bg.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/xp/tab_sel_bg.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/xp/tab_sel_bg.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-GIF89a,(   Ǝ8.ݡS18<,<         !     ,    ,(  Є8ͻ`(dihAq p,tmx|pH,	rl:ШtJZجvz^ cL.hbn|N~vbiji~dzoǀgqecݶH"\ȰÂ
-JH3j#Ǐ YC(ɓQ\^˗0c!)ͅ4o/'ϟ@JhJHRN*NVĪ+K^Ú+GfZD ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/xp/tab_sel_end.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/xp/tab_sel_end.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/xp/tab_sel_end.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/xp/tab_sel_end.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a    98Ǝ1ݡS<<               !     ,       @(v^_)d ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/xp/tabs_bg.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/images/xp/tabs_bg.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/images/xp/tabs_bg.gif	2005-09-26 01:52:30.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/images/xp/tabs_bg.gif	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GIF89a   !   ,       ˭  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/img/colorpicker.jpg 2.5.src/wp-includes/js/tinymce/themes/advanced/img/colorpicker.jpg
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/img/colorpicker.jpg	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/img/colorpicker.jpg	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,19 @@
+ JFIF       >CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), default quality
+ C 		
+
 $.' ",#(7),01444'9=82<.342 C			

2!!22222222222222222222222222222222222222222222222222  ,"            	
+    } !1AQa"q2#BR$3br	
+%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz        	
+   w !1AQaq"2B	#3Rbr
+$4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz   ? 孇JضY6k[D{nկlzVEjַ=+ȯHٶ=+^ٺV-ZҼ<,C4پAUejZFX@qEyZjĆHk>sҚ)R!@TJ~jrc4u<IRe5"MH
+%u5"MJ
+c(Q=j<U־({UzǹZ&z${Xx#d\p:M^&%-]^^5N3OwZ\VXRBD*b+s>"Bv#cqUTL*f
+qLXTL*v
+Qf@£"aL#BLn:Vj̀t8;WZ'^fjշ=+*ߵizWZ'^FZұ=+R^]h-vhEVB(5r Y
O!!!@q1+ާ)1~:<*MD
<MH
B
H
{c'`xWZ9^ᩙq޲;֤.~ёЉp:UZ󎵗8^֠j֠kьâh֭F*֭F+#j1\XT⢌T=ЉF¥4YԦB£aSQ^$LFELE0MTPjτt{W
XUiPv(J̇hzWV'ZFi@+*ҴanՁVfoUy[s"sUL xC!Vs]0b"BǚPi(5B:T(4j j@kã'Pj@ji׷2p&9Vz׳E53Y)tґQ8Y8YҙQFL֡j֡ECנ#Zj-e91VPT(*
+o"xMڢASc-f#5)+3Lab
HRL"ZSE2#hCTz˫25	&*D*фք-ҳ!5~&
+<ʬ[8*j0<nj@淌""sUj"HZp]y^fJ
<p53p&1Lk֤ԣ5PuU	Ч#ѥ>aֳ(3ԥ2ejQ"bEE-XAYgE *$:
+ZT☂9hzԧ*B)WY
+dDSH^EcE2")H⼚R
+TUȫ<ڳ.EWb5J*:</DjMYњWH}F\-.ԥv٪5`yQJơc[V$g(4yPԐx54kӤp$
D
<H
W⠐ץM!NZ-]]wRFQT~ATNgIүZȵuzZ5VQYgEAST+LHIژXNZ90a)^uVlFE0iU-Ln*B)6Ե2x[F*uTf:՘r'Ic5j6Hjm\QqQRf1ұ֪D5DƞƢcZ"0zҊޜN7Ӂ8麗p$
F
8K&j
IC]ajVIVު]pNITUZA]PN%U-1V;iUR*Ԫg}1TT)*UNCT⚢+HE4iQ)M""Ey
+S#"LWJd*T(*t	̝*:NYȴ#UD5:5a(eSYƢcJMFMhrMƣcN&&P8Z\Љ<Piӳ]PDr
G\dI;5RSBYWqVT+3:1Vu:`UP"@*@*θHrv) Ⲕa*B)W4٢)TR\)Ln*LRb&%QS-FZ	Lje5
+ԋY8DjejVdnZ@CHM4	 &MIP9	6֑晚\D.i5EI.ikxP#jVڵR6HXT,*
+jmVei֜CBND Ss:# @r7Rb+f)1O&+	3VC<P(s)8Ap!mԅ=ԛ!&nL3hRi	&i74fDA٥74f!r.ih~ifÐCL4HjP#"EJE42HJmZDaiSsDN1K! .)qSZRbLT6W8Rb1PÜf)1Oq*k,4f)XAE v %QaX(,AES asIEI(Rb((E]1F(R((p)bQEvPg
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/img/fm.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/img/fm.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/img/fm.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/img/fm.gif	2008-01-31 12:10:46.000000000 -0600
@@ -0,0 +1,9 @@
+GIF89aX       mps:BJ*/3s]bg)))ΓqrsSVYQ_m󃄅exCP\ژ37<cinz|<GQZk{Q^lbsIVbԌ}Zclluy};?CLXdPPP}HHHᆊᤥkkkyz{}BLWdq~mǪLPS333Yeqӵ］tZksDGJTcrx}?ELsJS\ަbfj:::lszyDDD\\\t|sfffcs_m{h{;EPAJPRZbPU[jmqdjpGKO)18y                                                                                                                                                                                                                                                                                                                                                                        !  ,    X    H*\p#JHŋ3Rl#P CIɓ(SGb*( 	ǚ @iFN7ugQ@ 3S$ҟXC"M5gϫJTըSU(s*ϮFw}+Sq+ُ+@! ʵ K[vذo`C
+C%{w)i<4kXƊ<a|HEoc~;@ $<yI +t27V<yr ,hb1}qp+D4i5( C,&` ]vմB чx7!ЃA50A\H=C aP  D1u# ;4bɵ/d%Ldgo8 Zuf6EJ(d1
U|]e_m$OT``h@}i @\7A& #d@F!L F" ]wDE1@$ C9x]yn
+ |y+ $0<PPY@i [/Au0Pq Gcp@ld+ڋNa@<	%x1 DzІB$DD RcQ&1N<^q`A| *c:k
+<@4AgԠ@vȐF`AA2`IKs @*"K
+-aG<&$Xa 0\w(ܵj3`!tQtG
+vX@F- -`|+Dх(>DpoZK 0`'V?~xnbH
+`Dd{<N뱓S⧒&ԁ&B	@xzcI&H
+Z`@3    
P
I
+
+Ta@  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/img/gotmoxie.png 2.5.src/wp-includes/js/tinymce/themes/advanced/img/gotmoxie.png
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/img/gotmoxie.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/img/gotmoxie.png	2008-01-31 12:10:46.000000000 -0600
@@ -0,0 +1,8 @@
+PNG
+
+   
IHDR   X       :O   gAMA  OX2   tEXtSoftware Adobe ImageReadyqe<   ZPLTEMn+Srʣֺ댡ƁLTS  IDATxڴs Qcxͷh4m&,{?$y^j1<x`e6|l-01N#6}F> p6 zo`2Ulq[~+qSZ+߉F}eV9LZiJݶ#% uG
+*+׭+jb:1nn$޹>ݎ
5)1)u!oYUP76orzM6hyR./V01{7s먫Tp[u?Ul&nj88N|W1{y#]5Ѿ_p(hpzeerIDd|]8TLU
+G-c#醒O+b5~nAmE_'y#ϛe؍Olu%wiI+O[Ԥm?:ЉlT:`tNB-麏T.@-bun73Va-}vHy!pUHRW7D`:#
+ՕJj&?p:y
+i=W˹%M2Im%Gc|=LߏB6fAVH|8M%2YN?~.o!^m6/ŨSm4IrS맰rá603~rsVlU6/A--^`
+Q+ώ/.bgqa %` J?i~e    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/img/icons.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/img/icons.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/img/icons.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/img/icons.gif	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,62 @@
+GIF89a<   9c§   n%4O8*opqyn4Kcpz1QﮏХX̣XݹpQQRԚ=8)؊Ssb/i䴕T|ՍxY.-Y]fr[vOmAwl𑣹tlaUOPhĸ5f-M97ϰQϨ˴g急ٺO5`pˑ6MGYur虙Rkƴq*KKzBRc򅊝򨩶suRyMFH|lOf>봱0ChBgd}ΓR{kW@Ks@`A8?g..<<?1bUbbSaԯԓsK  Ѝلě ƘOq!@x_oBf gd >QkܱS"X^Sp%c WnNX	9Lp𨸸Jvc"Zڎr̦PUg2Rr6[[Z?ː()'Р`!   ,    <   	H*\ȰÇ#JHŋ3jȱǏ CIɓ(}ԨeC0cʜ)ʛ8sɳϟ@
+JѣH;x`iӗJJUͤXjpQ.I((ٳhܥKۋ*6ݻx~vu^~
LÈzM3]u؉\*-z(g0.ti ?
ĺHlጐ򉧏%|*s|z > dF萑ą6J{kL8dD.\ {=VѷGhqK.rp	Vham.
6f@H A	 C$aD	TleBj<~GV}I
 9I	5>jT 	#dIq1CD, a f`fjV" p	gDP5Yt 'B!(!ߠUFޑ G]] GFtX
+%`d;^ڑ38HD(qm4 fH뭺jPkFt &aH .@A#
 	1o	enB,l0A@ i3%PG?P
+L0ލ NN5\s^S].jB"D$#rwBPChD W2{ѳq&D@FfE}E~!&sq.$zԉDG TDjB= #61J*k__$%H-CvI|FXK&bBV/K3I:'@0BGG\8K7+D5tLP/r<S}Rι	6l6@0'
+C0~/o/'Z}~/5ɇcB6@!A@P{Z@F	6rqP A 4*`ЈU
+AX;RFZ!A \9Ґjy8okh8n)$qjW.>}iܕH6.*T'5C)F(@ 7	I-n@@"'
D$(Qq$`p^_!^Vt/r=MӘב&4A|R!PG'"LPUޔ+V|\ߠ| Yr?1:c I7M?CN.S
2e@}D BRL0 A38H!*y.`PC2$v1)y悞-sfvx Ģ״EAD 0/X }ַx2Fw %:O tq&.M LSzp@6(n ?h8Qr+~T2[i$E<Je+ @p;9nÖJ^>g?-((Dla0B
+q2
2S dI
+bM"fE7
+1#F&$
40 5
+W[6EXv\2UI'ZcփTK8!=[5H0ZiF0ъr	0nKQ%i.Ep7PB.p̲Zfsl!x@J0! , \#8*N:&[@}G
ڙM6A҅2b	 ,gq喅<A" Hs`9W2j]Aq:XxDBV&f,D|?&'fĺ풡e3EEɵa3Zط6 4aNho,d@>CnKNg4A; dDqB[6fjD\7!T0]\H1TkZú ` 	R =1$=mBqB4 6\!EMC"tU	Ә(H"$-1q!XWMT4%5v)JiKfz[/{ɴ."]P"1Vm#FOLr?ιdOsdr31d1#r B.ApfXlL)HMxlWe8NzSa^rsVV_
+[jS5̎]@ºw_2aE@8C ͺ(ebY͠sA"GdfC" 9 SH$4H b7JSֈX ]SĦVԉ7JJ(]=QIO"$g!լ5rEY]#8$q@ 
+AT^3Y?gE{K#tA5.g9OS"FPtZ@t$FrP V r"d^".ufPh@Pj 6yJ 1zL  y!kqwNc'waTt9 3x$ (b|FāGEPzpWPsAG@
7'8h wW7qaaL !6${gX6|T0s37drUuV>{	W}AqG+}'Aq+s(gc7|#vG@Bt  tQ 3]g>
uǘ>Y',Udt^cŅlUR(j!hP ).rn$jv@Q<\-Cl1&yEHG͐
f  $p S`2b&iXexquA1!`cacsov8W#wMp-%6p͕SUOX#lc(l1#	=7W=wWhwsK \ P4x AP kE8sTiH`1C.W]vQ8R{YGųG
( XY8S@	4ёU!i8{qTUӅry&.@qNh>4y&H& fW3U ^<bZ銷Y jeCOĩJ'799X	h9Y8)AdO֒F"@
+ IsGn(41aܥu3]cr7Aaoo.` v衜NWFq.!a8AO0m , [`b
+[q@v4b#!h٠~ :
ApLƢ3:!f$! Xrj88xH*کZZsڪ+
+
+10ꪶz>@ګ:ZzȚʺڬZ?ֺ?0ڪ&ЭO۪X(i*}:z;0Ce 8pf+''+	x@{@0
+P밣 A{@ ѱA#+: 's2p P	A"4! 
[pH{
+A/дNK	aRk0
PX[H1Z	
|
 p	?Q(ip*zࠏ~;n] )`
+Z ۸P
+n1zjCog@p@'pS0{	d @@
+d@{ 
+3ۻۻJ0ċ { 1"0"Pe=	!k{k0~۱~0`;Pp(+;ܫ[׻-0L	ACP"'@ݛ( pP@,:,V@	rA2pǠ	6	 !U>>|
JP_
+	Z| |PPlt[ 
+jk {PPPǾ1ȳp}cȈ|l6 pi@y	;(<(ɿA,ep	˹!hPQ@SAm0  ; mA=c@L  Jlë+d|@|
140-0 1P P]P &p%=<-" 8Pbz. Q`D>? $.;7A	r@	`1<` R-:\<?
@ DL\J	D> f's   t+0
+	Agkkl 3`>P Mp{؈lN! E3w{\~|ل|ȉ\iu !'#b}]pK1Ո ms!uXQrBP;(,
+@
]ݯ(rgm@.1
+5ppвkv}+SaPV BɄ- SJMK+_-O˼d1`` y`=&b@m2m
+al<<>>@.8~ѿ	4	+}P800r!  *=2.%p}~
+3&|hl	>
l}OP
W;o[`,Y2\2 9l`=
+PFMHOLh
  k5 
+Z
+!}} ؍`ضm дtly|u. iڽ@@<ɟ|?M
+0!
/[p[\U?]A	`z򸌰݆gQ@~`-}8 ?j+b(0
+p|kGߪ;0@`๽k`@+SJP@ *+nJ2>O~psA>;OO+EN`   1 
+;@ #@
 P`k"vv-N>QpE


	HmJM-0 ` / ƀ
+Bp꩞d-# ΍o@E-dx?ܻ=Xc*PZAX		@>3$GtvWmA#$K2QKx`?t1RW}:a]RElq徥˰ܸǌo1!APxAJ:{S)ѳgC8QE~hD
+d(FQ(Ɂ מ<|8csQځpٺ.޸n=J"? kl{3+N2%GoR#iqvpAnl1Q`
B@ 0 !)QBQ x"`"qG\hXc$T
+AJ(a
r*|_P#3,4J+$KN.|KOw|0v v\II	$ 6ƊShJJ叔=z8腁,"',HgÍd\
++(
gozAPVYIhé1RaEm@ER48<y0H<I]Ӣ[xP#l!$ZA~efZT'J"Q,C$#LX#zK6v=]{'8e1tJ{uLl^1)"X/{g8$C
+ش.IMZNrn覫ĴG5&kw\Ɔtahq4@	 BÀ4tQFij
+Po(A	c?@NYS0i@g(EM$BoC"1ͷнima``EU&MZpR97覛<ψ@?%AD7#`*~?1\0j	#$!<PjsXDѨGEjRF l-50 QRv0Z #ȪT
Ep\ v,aU&[%7rC`ydZ2ֵmݤ
+Rȥ? QXB[xH !Hy
+(1RR0	
+FND IC'R2	X-`e+Uh@e1v5vyMe
l@48k~!L
WTe7#D"
v3HHASE!Y$wޤ^ȤG$2o{t B<1	O
d.hHoz$"aqi 
+<ÀG6;epn!op#Rwn
+]U0;aĝ:j nlBܣ@5u
[CU pQPX'firCWlP<aq
nX0*հR@'b#ǁfty,iBXZv]gtV6!do@q|P` BGAJR+HM	  " qaJ('A`"CX*jRmdp."G̱b$=~ByAޤ9G#ϡgB	0-	\)#0C&Z`%qY\dBy(Ҥx)qVnCCd]JS"ӥWYibС2ɲ5q5~
RBf9l:ώ!vʒssK,pjpON$f=?1/3 !&X t!fH*ʙJ[STi&j&"ϣN;"i0B BHRRxt!Rr'<5%V`Uo3Xe!
+CɈ@~
+B
+8ޜ{Ղ 5p	H@QG 	W h]xʐòwp ~"1mx[[wo,҄r[!uhy0^(h%?nّ*Bыp(Lɡ<at5X(x  +X8ذ$TJS@@4k	Z{xB6d1@OG`,J1aǹ9Z2xhcL
+GBp
%d5%(E̫0#֓䓦HX"	FKD:FB|  a$'EC ,k{,SYZK>idǙbx`-Eyf)1gCA! bAsCC`Yh,~P۴Eb! 1i(W(XXKAA_ @ÅYK	P`Ӿ.;	6i3jxmhn66?`)h ;>	+Uhxz*|7
K
`؂`K`6>ZFP! 
K>9JD*Q\Ğgz7PkPEk4KMěPRś;k:溧ShSZ`X
:/h + fdk;;Dp1'^&bWQh*˅ ӆ 12<+(0+0s`5z#
HId Z@i<. =%1yPXc0OK9#1"8	E$cH$+AB_B3Wb1^ ʟ0k JH;|  c#6?R 2?@HK'`Jgg@@\'DX@=843d4	4N4
LMN[%}0  DM(PL} ;} \ص#pxͧHyCyikcsx&pȈ9
+h8}P5 (6\Uy,h̷4AuAaۂ-IhRaPx؁pDHB @h  O-Гs37xgp%emZQP*PM.ѧHB0"ѧm@ xRWXpDrxRG,-;ThShx^KKh>mpB| 4@\7 0`9Hm
p
lͫ!.PɱP\;1dpI'8
+H2  |MK|?ȉ%>N,cuL
+k=& m
<m]n<pi
K'lT^'WhV	H30  DLE|Ȕ
5J&Ѵ'50Hr0ͱ2dL	J JD  \x}Y\ٓS{m;mZD
+N1	v@ G>* kO^i;C |C+˃.P aHPF>h
+ p 	%:,N [=9bES0rOP-P@%u\ȕ\ʥ
\E?I@ G9rS  pR Tnܚf	]3UvtpGPH7p;e<X~$@z@]+Hf auT[HkMTͫi j ( (0uIT5DhUH(XUFGh mOhY(N:Չ

ZG'`VWZck0֓Z &a&	aH4i)hxKW|W~]%F@H@gX@'@y
+$Z3Vx}0$M;aaA[8J	 x;c\@ax`3^dvɄ6BiL88h
+~:hԼ9+S+*ĢH-+Vp ߺ [/8\u%Cbc-9 
+fgvc^aelFmN !{
+L؆؁pDw۵+h.e]hFP^SYޔp"KG=GuQh 7@F
؂Bg|N-H߱@̓K `ߐ<Dɒ\0W~X=(H8N1_ud=dmH&t]J#h.{DVd2k0(/~!b"#2s
 lR'pKljF^8@kb  .֑ϸ0N?F;0ATH8~
J[_0du }2J	,b5ܤn
+x8612hRhph| v
>0[>eʭvњ-kʺ|
+A.*.XȥpNoFo~ofݔp?olonS"pmjF6b#G]pGE⛠Hs!@I.YPTΌS(Z^\mtprqZ2px n"Nkfk?߮K)*r+grЂy^r[^n2*/@_5_s6Ws`O,Gs9&L 
+ȄN2n9/tC?tH.cD0pH_TUՕhNtOt~8?$wm!T7X#0P^)t[u\u]?t]u`vavb/vc?vdOve_vfovgvhvivjvkvlvmvnvovpwqwr/ws?wtOwu_wvowwwxw*^02yw}w~wwgd0xOx_xoxo|xxxxG _x9xy/y?yvz{Oyyyy2yyyyyzz/zwYH_zwozzzzzmyz/{?^G{{G | y{{W'{|/jx7|o|Jxo{ȯ|˿|O||}}/}?}O}՟  ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/img/sflogo.png 2.5.src/wp-includes/js/tinymce/themes/advanced/img/sflogo.png
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/img/sflogo.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/img/sflogo.png	2008-01-31 12:10:46.000000000 -0600
@@ -0,0 +1,3 @@
+PNG
+
+   
IHDR   X      T   tEXtSoftware Adobe ImageReadyqe<   ZPLTE_jrt~jt{ٔв쪜I*̹¸鞍mVR  IDATHn0Dq)'3of!dC ArSp	g]{%rR.jjd_gW7T{]Eud0MqX.\v+ۘ^npA9C3ATYY1J%  i&bS# Y}R
%zZd)Q@ڊ\ÀkZʿgB}:t_jOH^.<~{LSlFVkj`/?8(8?	'S	z    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/js/about.js 2.5.src/wp-includes/js/tinymce/themes/advanced/js/about.js
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/js/about.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/js/about.js	2008-02-25 13:03:35.000000000 -0600
@@ -0,0 +1,72 @@
+tinyMCEPopup.requireLangPack();
+
+function init() {
+	var ed, tcont;
+
+	tinyMCEPopup.resizeToInnerSize();
+	ed = tinyMCEPopup.editor;
+
+	// Give FF some time
+	window.setTimeout('insertHelpIFrame();', 10);
+
+	tcont = document.getElementById('plugintablecontainer');
+	document.getElementById('plugins_tab').style.display = 'none';
+
+	var html = "";
+	html += '<table id="plugintable">';
+	html += '<thead>';
+	html += '<tr>';
+	html += '<td>' + ed.getLang('advanced_dlg.about_plugin') + '</td>';
+	html += '<td>' + ed.getLang('advanced_dlg.about_author') + '</td>';
+	html += '<td>' + ed.getLang('advanced_dlg.about_version') + '</td>';
+	html += '</tr>';
+	html += '</thead>';
+	html += '<tbody>';
+
+	tinymce.each(ed.plugins, function(p, n) {
+		var info;
+
+		if (!p.getInfo)
+			return;
+
+		html += '<tr>';
+
+		info = p.getInfo();
+
+		if (info.infourl != null && info.infourl != '')
+			html += '<td width="50%" title="' + n + '"><a href="' + info.infourl + '" target="_blank">' + info.longname + '</a></td>';
+		else
+			html += '<td width="50%" title="' + n + '">' + info.longname + '</td>';
+
+		if (info.authorurl != null && info.authorurl != '')
+			html += '<td width="35%"><a href="' + info.authorurl + '" target="_blank">' + info.author + '</a></td>';
+		else
+			html += '<td width="35%">' + info.author + '</td>';
+
+		html += '<td width="15%">' + info.version + '</td>';
+		html += '</tr>';
+
+		document.getElementById('plugins_tab').style.display = '';
+
+	});
+
+	html += '</tbody>';
+	html += '</table>';
+
+	tcont.innerHTML = html;
+
+	tinyMCEPopup.dom.get('version').innerHTML = tinymce.majorVersion + "." + tinymce.minorVersion;
+	tinyMCEPopup.dom.get('date').innerHTML = tinymce.releaseDate;
+}
+
+function insertHelpIFrame() {
+	var html;
+
+	if (tinyMCEPopup.getParam('docs_url')) {
+		html = '<iframe width="100%" height="300" src="' + tinyMCEPopup.editor.baseURI.toAbsolute(tinyMCEPopup.getParam('docs_url')) + '"></iframe>';
+		document.getElementById('iframecontainer').innerHTML = html;
+		document.getElementById('help_tab').style.display = 'block';
+	}
+}
+
+tinyMCEPopup.onInit.add(init);
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/js/anchor.js 2.5.src/wp-includes/js/tinymce/themes/advanced/js/anchor.js
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/js/anchor.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/js/anchor.js	2008-03-25 22:22:53.000000000 -0500
@@ -0,0 +1,37 @@
+tinyMCEPopup.requireLangPack();
+
+var AnchorDialog = {
+	init : function(ed) {
+		var action, elm, f = document.forms[0];
+
+		this.editor = ed;
+		elm = ed.dom.getParent(ed.selection.getNode(), 'A,IMG');
+		v = ed.dom.getAttrib(elm, 'name');
+
+		if (v) {
+			this.action = 'update';
+			f.anchorName.value = v;
+		}
+
+		f.insert.value = ed.getLang(elm ? 'update' : 'insert');
+	},
+
+	update : function() {
+		var ed = this.editor;
+		
+		tinyMCEPopup.restoreSelection();
+
+		if (this.action != 'update')
+			ed.selection.collapse(1);
+
+		// Webkit acts weird if empty inline element is inserted so we need to use a image instead
+		if (tinymce.isWebKit)
+			ed.execCommand('mceInsertContent', 0, ed.dom.createHTML('img', {mce_name : 'a', name : document.forms[0].anchorName.value, 'class' : 'mceItemAnchor'}));
+		else
+			ed.execCommand('mceInsertContent', 0, ed.dom.createHTML('a', {name : document.forms[0].anchorName.value, 'class' : 'mceItemAnchor'}, ''));
+
+		tinyMCEPopup.close();
+	}
+};
+
+tinyMCEPopup.onInit.add(AnchorDialog.init, AnchorDialog);
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/js/charmap.js 2.5.src/wp-includes/js/tinymce/themes/advanced/js/charmap.js
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/js/charmap.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/js/charmap.js	2008-02-21 15:40:25.000000000 -0600
@@ -0,0 +1,325 @@
+tinyMCEPopup.requireLangPack();
+
+var charmap = [
+	['&nbsp;',    '&#160;',  true, 'no-break space'],
+	['&amp;',     '&#38;',   true, 'ampersand'],
+	['&quot;',    '&#34;',   true, 'quotation mark'],
+// finance
+	['&cent;',    '&#162;',  true, 'cent sign'],
+	['&euro;',    '&#8364;', true, 'euro sign'],
+	['&pound;',   '&#163;',  true, 'pound sign'],
+	['&yen;',     '&#165;',  true, 'yen sign'],
+// signs
+	['&copy;',    '&#169;',  true, 'copyright sign'],
+	['&reg;',     '&#174;',  true, 'registered sign'],
+	['&trade;',   '&#8482;', true, 'trade mark sign'],
+	['&permil;',  '&#8240;', true, 'per mille sign'],
+	['&micro;',   '&#181;',  true, 'micro sign'],
+	['&middot;',  '&#183;',  true, 'middle dot'],
+	['&bull;',    '&#8226;', true, 'bullet'],
+	['&hellip;',  '&#8230;', true, 'three dot leader'],
+	['&prime;',   '&#8242;', true, 'minutes / feet'],
+	['&Prime;',   '&#8243;', true, 'seconds / inches'],
+	['&sect;',    '&#167;',  true, 'section sign'],
+	['&para;',    '&#182;',  true, 'paragraph sign'],
+	['&szlig;',   '&#223;',  true, 'sharp s / ess-zed'],
+// quotations
+	['&lsaquo;',  '&#8249;', true, 'single left-pointing angle quotation mark'],
+	['&rsaquo;',  '&#8250;', true, 'single right-pointing angle quotation mark'],
+	['&laquo;',   '&#171;',  true, 'left pointing guillemet'],
+	['&raquo;',   '&#187;',  true, 'right pointing guillemet'],
+	['&lsquo;',   '&#8216;', true, 'left single quotation mark'],
+	['&rsquo;',   '&#8217;', true, 'right single quotation mark'],
+	['&ldquo;',   '&#8220;', true, 'left double quotation mark'],
+	['&rdquo;',   '&#8221;', true, 'right double quotation mark'],
+	['&sbquo;',   '&#8218;', true, 'single low-9 quotation mark'],
+	['&bdquo;',   '&#8222;', true, 'double low-9 quotation mark'],
+	['&lt;',      '&#60;',   true, 'less-than sign'],
+	['&gt;',      '&#62;',   true, 'greater-than sign'],
+	['&le;',      '&#8804;', true, 'less-than or equal to'],
+	['&ge;',      '&#8805;', true, 'greater-than or equal to'],
+	['&ndash;',   '&#8211;', true, 'en dash'],
+	['&mdash;',   '&#8212;', true, 'em dash'],
+	['&macr;',    '&#175;',  true, 'macron'],
+	['&oline;',   '&#8254;', true, 'overline'],
+	['&curren;',  '&#164;',  true, 'currency sign'],
+	['&brvbar;',  '&#166;',  true, 'broken bar'],
+	['&uml;',     '&#168;',  true, 'diaeresis'],
+	['&iexcl;',   '&#161;',  true, 'inverted exclamation mark'],
+	['&iquest;',  '&#191;',  true, 'turned question mark'],
+	['&circ;',    '&#710;',  true, 'circumflex accent'],
+	['&tilde;',   '&#732;',  true, 'small tilde'],
+	['&deg;',     '&#176;',  true, 'degree sign'],
+	['&minus;',   '&#8722;', true, 'minus sign'],
+	['&plusmn;',  '&#177;',  true, 'plus-minus sign'],
+	['&divide;',  '&#247;',  true, 'division sign'],
+	['&frasl;',   '&#8260;', true, 'fraction slash'],
+	['&times;',   '&#215;',  true, 'multiplication sign'],
+	['&sup1;',    '&#185;',  true, 'superscript one'],
+	['&sup2;',    '&#178;',  true, 'superscript two'],
+	['&sup3;',    '&#179;',  true, 'superscript three'],
+	['&frac14;',  '&#188;',  true, 'fraction one quarter'],
+	['&frac12;',  '&#189;',  true, 'fraction one half'],
+	['&frac34;',  '&#190;',  true, 'fraction three quarters'],
+// math / logical
+	['&fnof;',    '&#402;',  true, 'function / florin'],
+	['&int;',     '&#8747;', true, 'integral'],
+	['&sum;',     '&#8721;', true, 'n-ary sumation'],
+	['&infin;',   '&#8734;', true, 'infinity'],
+	['&radic;',   '&#8730;', true, 'square root'],
+	['&sim;',     '&#8764;', false,'similar to'],
+	['&cong;',    '&#8773;', false,'approximately equal to'],
+	['&asymp;',   '&#8776;', true, 'almost equal to'],
+	['&ne;',      '&#8800;', true, 'not equal to'],
+	['&equiv;',   '&#8801;', true, 'identical to'],
+	['&isin;',    '&#8712;', false,'element of'],
+	['&notin;',   '&#8713;', false,'not an element of'],
+	['&ni;',      '&#8715;', false,'contains as member'],
+	['&prod;',    '&#8719;', true, 'n-ary product'],
+	['&and;',     '&#8743;', false,'logical and'],
+	['&or;',      '&#8744;', false,'logical or'],
+	['&not;',     '&#172;',  true, 'not sign'],
+	['&cap;',     '&#8745;', true, 'intersection'],
+	['&cup;',     '&#8746;', false,'union'],
+	['&part;',    '&#8706;', true, 'partial differential'],
+	['&forall;',  '&#8704;', false,'for all'],
+	['&exist;',   '&#8707;', false,'there exists'],
+	['&empty;',   '&#8709;', false,'diameter'],
+	['&nabla;',   '&#8711;', false,'backward difference'],
+	['&lowast;',  '&#8727;', false,'asterisk operator'],
+	['&prop;',    '&#8733;', false,'proportional to'],
+	['&ang;',     '&#8736;', false,'angle'],
+// undefined
+	['&acute;',   '&#180;',  true, 'acute accent'],
+	['&cedil;',   '&#184;',  true, 'cedilla'],
+	['&ordf;',    '&#170;',  true, 'feminine ordinal indicator'],
+	['&ordm;',    '&#186;',  true, 'masculine ordinal indicator'],
+	['&dagger;',  '&#8224;', true, 'dagger'],
+	['&Dagger;',  '&#8225;', true, 'double dagger'],
+// alphabetical special chars
+	['&Agrave;',  '&#192;',  true, 'A - grave'],
+	['&Aacute;',  '&#193;',  true, 'A - acute'],
+	['&Acirc;',   '&#194;',  true, 'A - circumflex'],
+	['&Atilde;',  '&#195;',  true, 'A - tilde'],
+	['&Auml;',    '&#196;',  true, 'A - diaeresis'],
+	['&Aring;',   '&#197;',  true, 'A - ring above'],
+	['&AElig;',   '&#198;',  true, 'ligature AE'],
+	['&Ccedil;',  '&#199;',  true, 'C - cedilla'],
+	['&Egrave;',  '&#200;',  true, 'E - grave'],
+	['&Eacute;',  '&#201;',  true, 'E - acute'],
+	['&Ecirc;',   '&#202;',  true, 'E - circumflex'],
+	['&Euml;',    '&#203;',  true, 'E - diaeresis'],
+	['&Igrave;',  '&#204;',  true, 'I - grave'],
+	['&Iacute;',  '&#205;',  true, 'I - acute'],
+	['&Icirc;',   '&#206;',  true, 'I - circumflex'],
+	['&Iuml;',    '&#207;',  true, 'I - diaeresis'],
+	['&ETH;',     '&#208;',  true, 'ETH'],
+	['&Ntilde;',  '&#209;',  true, 'N - tilde'],
+	['&Ograve;',  '&#210;',  true, 'O - grave'],
+	['&Oacute;',  '&#211;',  true, 'O - acute'],
+	['&Ocirc;',   '&#212;',  true, 'O - circumflex'],
+	['&Otilde;',  '&#213;',  true, 'O - tilde'],
+	['&Ouml;',    '&#214;',  true, 'O - diaeresis'],
+	['&Oslash;',  '&#216;',  true, 'O - slash'],
+	['&OElig;',   '&#338;',  true, 'ligature OE'],
+	['&Scaron;',  '&#352;',  true, 'S - caron'],
+	['&Ugrave;',  '&#217;',  true, 'U - grave'],
+	['&Uacute;',  '&#218;',  true, 'U - acute'],
+	['&Ucirc;',   '&#219;',  true, 'U - circumflex'],
+	['&Uuml;',    '&#220;',  true, 'U - diaeresis'],
+	['&Yacute;',  '&#221;',  true, 'Y - acute'],
+	['&Yuml;',    '&#376;',  true, 'Y - diaeresis'],
+	['&THORN;',   '&#222;',  true, 'THORN'],
+	['&agrave;',  '&#224;',  true, 'a - grave'],
+	['&aacute;',  '&#225;',  true, 'a - acute'],
+	['&acirc;',   '&#226;',  true, 'a - circumflex'],
+	['&atilde;',  '&#227;',  true, 'a - tilde'],
+	['&auml;',    '&#228;',  true, 'a - diaeresis'],
+	['&aring;',   '&#229;',  true, 'a - ring above'],
+	['&aelig;',   '&#230;',  true, 'ligature ae'],
+	['&ccedil;',  '&#231;',  true, 'c - cedilla'],
+	['&egrave;',  '&#232;',  true, 'e - grave'],
+	['&eacute;',  '&#233;',  true, 'e - acute'],
+	['&ecirc;',   '&#234;',  true, 'e - circumflex'],
+	['&euml;',    '&#235;',  true, 'e - diaeresis'],
+	['&igrave;',  '&#236;',  true, 'i - grave'],
+	['&iacute;',  '&#237;',  true, 'i - acute'],
+	['&icirc;',   '&#238;',  true, 'i - circumflex'],
+	['&iuml;',    '&#239;',  true, 'i - diaeresis'],
+	['&eth;',     '&#240;',  true, 'eth'],
+	['&ntilde;',  '&#241;',  true, 'n - tilde'],
+	['&ograve;',  '&#242;',  true, 'o - grave'],
+	['&oacute;',  '&#243;',  true, 'o - acute'],
+	['&ocirc;',   '&#244;',  true, 'o - circumflex'],
+	['&otilde;',  '&#245;',  true, 'o - tilde'],
+	['&ouml;',    '&#246;',  true, 'o - diaeresis'],
+	['&oslash;',  '&#248;',  true, 'o slash'],
+	['&oelig;',   '&#339;',  true, 'ligature oe'],
+	['&scaron;',  '&#353;',  true, 's - caron'],
+	['&ugrave;',  '&#249;',  true, 'u - grave'],
+	['&uacute;',  '&#250;',  true, 'u - acute'],
+	['&ucirc;',   '&#251;',  true, 'u - circumflex'],
+	['&uuml;',    '&#252;',  true, 'u - diaeresis'],
+	['&yacute;',  '&#253;',  true, 'y - acute'],
+	['&thorn;',   '&#254;',  true, 'thorn'],
+	['&yuml;',    '&#255;',  true, 'y - diaeresis'],
+    ['&Alpha;',   '&#913;',  true, 'Alpha'],
+	['&Beta;',    '&#914;',  true, 'Beta'],
+	['&Gamma;',   '&#915;',  true, 'Gamma'],
+	['&Delta;',   '&#916;',  true, 'Delta'],
+	['&Epsilon;', '&#917;',  true, 'Epsilon'],
+	['&Zeta;',    '&#918;',  true, 'Zeta'],
+	['&Eta;',     '&#919;',  true, 'Eta'],
+	['&Theta;',   '&#920;',  true, 'Theta'],
+	['&Iota;',    '&#921;',  true, 'Iota'],
+	['&Kappa;',   '&#922;',  true, 'Kappa'],
+	['&Lambda;',  '&#923;',  true, 'Lambda'],
+	['&Mu;',      '&#924;',  true, 'Mu'],
+	['&Nu;',      '&#925;',  true, 'Nu'],
+	['&Xi;',      '&#926;',  true, 'Xi'],
+	['&Omicron;', '&#927;',  true, 'Omicron'],
+	['&Pi;',      '&#928;',  true, 'Pi'],
+	['&Rho;',     '&#929;',  true, 'Rho'],
+	['&Sigma;',   '&#931;',  true, 'Sigma'],
+	['&Tau;',     '&#932;',  true, 'Tau'],
+	['&Upsilon;', '&#933;',  true, 'Upsilon'],
+	['&Phi;',     '&#934;',  true, 'Phi'],
+	['&Chi;',     '&#935;',  true, 'Chi'],
+	['&Psi;',     '&#936;',  true, 'Psi'],
+	['&Omega;',   '&#937;',  true, 'Omega'],
+	['&alpha;',   '&#945;',  true, 'alpha'],
+	['&beta;',    '&#946;',  true, 'beta'],
+	['&gamma;',   '&#947;',  true, 'gamma'],
+	['&delta;',   '&#948;',  true, 'delta'],
+	['&epsilon;', '&#949;',  true, 'epsilon'],
+	['&zeta;',    '&#950;',  true, 'zeta'],
+	['&eta;',     '&#951;',  true, 'eta'],
+	['&theta;',   '&#952;',  true, 'theta'],
+	['&iota;',    '&#953;',  true, 'iota'],
+	['&kappa;',   '&#954;',  true, 'kappa'],
+	['&lambda;',  '&#955;',  true, 'lambda'],
+	['&mu;',      '&#956;',  true, 'mu'],
+	['&nu;',      '&#957;',  true, 'nu'],
+	['&xi;',      '&#958;',  true, 'xi'],
+	['&omicron;', '&#959;',  true, 'omicron'],
+	['&pi;',      '&#960;',  true, 'pi'],
+	['&rho;',     '&#961;',  true, 'rho'],
+	['&sigmaf;',  '&#962;',  true, 'final sigma'],
+	['&sigma;',   '&#963;',  true, 'sigma'],
+	['&tau;',     '&#964;',  true, 'tau'],
+	['&upsilon;', '&#965;',  true, 'upsilon'],
+	['&phi;',     '&#966;',  true, 'phi'],
+	['&chi;',     '&#967;',  true, 'chi'],
+	['&psi;',     '&#968;',  true, 'psi'],
+	['&omega;',   '&#969;',  true, 'omega'],
+// symbols
+	['&alefsym;', '&#8501;', false,'alef symbol'],
+	['&piv;',     '&#982;',  false,'pi symbol'],
+	['&real;',    '&#8476;', false,'real part symbol'],
+	['&thetasym;','&#977;',  false,'theta symbol'],
+	['&upsih;',   '&#978;',  false,'upsilon - hook symbol'],
+	['&weierp;',  '&#8472;', false,'Weierstrass p'],
+	['&image;',   '&#8465;', false,'imaginary part'],
+// arrows
+	['&larr;',    '&#8592;', true, 'leftwards arrow'],
+	['&uarr;',    '&#8593;', true, 'upwards arrow'],
+	['&rarr;',    '&#8594;', true, 'rightwards arrow'],
+	['&darr;',    '&#8595;', true, 'downwards arrow'],
+	['&harr;',    '&#8596;', true, 'left right arrow'],
+	['&crarr;',   '&#8629;', false,'carriage return'],
+	['&lArr;',    '&#8656;', false,'leftwards double arrow'],
+	['&uArr;',    '&#8657;', false,'upwards double arrow'],
+	['&rArr;',    '&#8658;', false,'rightwards double arrow'],
+	['&dArr;',    '&#8659;', false,'downwards double arrow'],
+	['&hArr;',    '&#8660;', false,'left right double arrow'],
+	['&there4;',  '&#8756;', false,'therefore'],
+	['&sub;',     '&#8834;', false,'subset of'],
+	['&sup;',     '&#8835;', false,'superset of'],
+	['&nsub;',    '&#8836;', false,'not a subset of'],
+	['&sube;',    '&#8838;', false,'subset of or equal to'],
+	['&supe;',    '&#8839;', false,'superset of or equal to'],
+	['&oplus;',   '&#8853;', false,'circled plus'],
+	['&otimes;',  '&#8855;', false,'circled times'],
+	['&perp;',    '&#8869;', false,'perpendicular'],
+	['&sdot;',    '&#8901;', false,'dot operator'],
+	['&lceil;',   '&#8968;', false,'left ceiling'],
+	['&rceil;',   '&#8969;', false,'right ceiling'],
+	['&lfloor;',  '&#8970;', false,'left floor'],
+	['&rfloor;',  '&#8971;', false,'right floor'],
+	['&lang;',    '&#9001;', false,'left-pointing angle bracket'],
+	['&rang;',    '&#9002;', false,'right-pointing angle bracket'],
+	['&loz;',     '&#9674;', true,'lozenge'],
+	['&spades;',  '&#9824;', false,'black spade suit'],
+	['&clubs;',   '&#9827;', true, 'black club suit'],
+	['&hearts;',  '&#9829;', true, 'black heart suit'],
+	['&diams;',   '&#9830;', true, 'black diamond suit'],
+	['&ensp;',    '&#8194;', false,'en space'],
+	['&emsp;',    '&#8195;', false,'em space'],
+	['&thinsp;',  '&#8201;', false,'thin space'],
+	['&zwnj;',    '&#8204;', false,'zero width non-joiner'],
+	['&zwj;',     '&#8205;', false,'zero width joiner'],
+	['&lrm;',     '&#8206;', false,'left-to-right mark'],
+	['&rlm;',     '&#8207;', false,'right-to-left mark'],
+	['&shy;',     '&#173;',  false,'soft hyphen']
+];
+
+tinyMCEPopup.onInit.add(function() {
+	tinyMCEPopup.dom.setHTML('charmapView', renderCharMapHTML());
+});
+
+function renderCharMapHTML() {
+	var charsPerRow = 20, tdWidth=20, tdHeight=20, i;
+	var html = '<table border="0" cellspacing="1" cellpadding="0" width="' + (tdWidth*charsPerRow) + '"><tr height="' + tdHeight + '">';
+	var cols=-1;
+
+	for (i=0; i<charmap.length; i++) {
+		if (charmap[i][2]==true) {
+			cols++;
+			html += ''
+				+ '<td class="charmap">'
+				+ '<a onmouseover="previewChar(\'' + charmap[i][1].substring(1,charmap[i][1].length) + '\',\'' + charmap[i][0].substring(1,charmap[i][0].length) + '\',\'' + charmap[i][3] + '\');" onfocus="previewChar(\'' + charmap[i][1].substring(1,charmap[i][1].length) + '\',\'' + charmap[i][0].substring(1,charmap[i][0].length) + '\',\'' + charmap[i][3] + '\');" href="javascript:void(0)" onclick="insertChar(\'' + charmap[i][1].substring(2,charmap[i][1].length-1) + '\');" onclick="return false;" onmousedown="return false;" title="' + charmap[i][3] + '">'
+				+ charmap[i][1]
+				+ '</a></td>';
+			if ((cols+1) % charsPerRow == 0)
+				html += '</tr><tr height="' + tdHeight + '">';
+		}
+	 }
+
+	if (cols % charsPerRow > 0) {
+		var padd = charsPerRow - (cols % charsPerRow);
+		for (var i=0; i<padd-1; i++)
+			html += '<td width="' + tdWidth + '" height="' + tdHeight + '" class="charmap">&nbsp;</td>';
+	}
+
+	html += '</tr></table>';
+
+	return html;
+}
+
+function insertChar(chr) {
+	tinyMCEPopup.execCommand('mceInsertContent', false, '&#' + chr + ';');
+
+	// Refocus in window
+	if (tinyMCEPopup.isWindow)
+		window.focus();
+
+	tinyMCEPopup.editor.focus();
+	tinyMCEPopup.close();
+}
+
+function previewChar(codeA, codeB, codeN) {
+	var elmA = document.getElementById('codeA');
+	var elmB = document.getElementById('codeB');
+	var elmV = document.getElementById('codeV');
+	var elmN = document.getElementById('codeN');
+
+	if (codeA=='#160;') {
+		elmV.innerHTML = '__';
+	} else {
+		elmV.innerHTML = '&' + codeA;
+	}
+
+	elmB.innerHTML = '&amp;' + codeA;
+	elmA.innerHTML = '&amp;' + codeB;
+	elmN.innerHTML = codeN;
+}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/js/color_picker.js 2.5.src/wp-includes/js/tinymce/themes/advanced/js/color_picker.js
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/js/color_picker.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/js/color_picker.js	2008-03-18 01:59:53.000000000 -0500
@@ -0,0 +1,245 @@
+tinyMCEPopup.requireLangPack();
+
+var detail = 50, strhex = "0123456789abcdef", i, isMouseDown = false, isMouseOver = false;
+
+var colors = [
+	"#000000","#000033","#000066","#000099","#0000cc","#0000ff","#330000","#330033",
+	"#330066","#330099","#3300cc","#3300ff","#660000","#660033","#660066","#660099",
+	"#6600cc","#6600ff","#990000","#990033","#990066","#990099","#9900cc","#9900ff",
+	"#cc0000","#cc0033","#cc0066","#cc0099","#cc00cc","#cc00ff","#ff0000","#ff0033",
+	"#ff0066","#ff0099","#ff00cc","#ff00ff","#003300","#003333","#003366","#003399",
+	"#0033cc","#0033ff","#333300","#333333","#333366","#333399","#3333cc","#3333ff",
+	"#663300","#663333","#663366","#663399","#6633cc","#6633ff","#993300","#993333",
+	"#993366","#993399","#9933cc","#9933ff","#cc3300","#cc3333","#cc3366","#cc3399",
+	"#cc33cc","#cc33ff","#ff3300","#ff3333","#ff3366","#ff3399","#ff33cc","#ff33ff",
+	"#006600","#006633","#006666","#006699","#0066cc","#0066ff","#336600","#336633",
+	"#336666","#336699","#3366cc","#3366ff","#666600","#666633","#666666","#666699",
+	"#6666cc","#6666ff","#996600","#996633","#996666","#996699","#9966cc","#9966ff",
+	"#cc6600","#cc6633","#cc6666","#cc6699","#cc66cc","#cc66ff","#ff6600","#ff6633",
+	"#ff6666","#ff6699","#ff66cc","#ff66ff","#009900","#009933","#009966","#009999",
+	"#0099cc","#0099ff","#339900","#339933","#339966","#339999","#3399cc","#3399ff",
+	"#669900","#669933","#669966","#669999","#6699cc","#6699ff","#999900","#999933",
+	"#999966","#999999","#9999cc","#9999ff","#cc9900","#cc9933","#cc9966","#cc9999",
+	"#cc99cc","#cc99ff","#ff9900","#ff9933","#ff9966","#ff9999","#ff99cc","#ff99ff",
+	"#00cc00","#00cc33","#00cc66","#00cc99","#00cccc","#00ccff","#33cc00","#33cc33",
+	"#33cc66","#33cc99","#33cccc","#33ccff","#66cc00","#66cc33","#66cc66","#66cc99",
+	"#66cccc","#66ccff","#99cc00","#99cc33","#99cc66","#99cc99","#99cccc","#99ccff",
+	"#cccc00","#cccc33","#cccc66","#cccc99","#cccccc","#ccccff","#ffcc00","#ffcc33",
+	"#ffcc66","#ffcc99","#ffcccc","#ffccff","#00ff00","#00ff33","#00ff66","#00ff99",
+	"#00ffcc","#00ffff","#33ff00","#33ff33","#33ff66","#33ff99","#33ffcc","#33ffff",
+	"#66ff00","#66ff33","#66ff66","#66ff99","#66ffcc","#66ffff","#99ff00","#99ff33",
+	"#99ff66","#99ff99","#99ffcc","#99ffff","#ccff00","#ccff33","#ccff66","#ccff99",
+	"#ccffcc","#ccffff","#ffff00","#ffff33","#ffff66","#ffff99","#ffffcc","#ffffff"
+];
+
+var named = {
+	'#F0F8FF':'AliceBlue','#FAEBD7':'AntiqueWhite','#00FFFF':'Aqua','#7FFFD4':'Aquamarine','#F0FFFF':'Azure','#F5F5DC':'Beige',
+	'#FFE4C4':'Bisque','#000000':'Black','#FFEBCD':'BlanchedAlmond','#0000FF':'Blue','#8A2BE2':'BlueViolet','#A52A2A':'Brown',
+	'#DEB887':'BurlyWood','#5F9EA0':'CadetBlue','#7FFF00':'Chartreuse','#D2691E':'Chocolate','#FF7F50':'Coral','#6495ED':'CornflowerBlue',
+	'#FFF8DC':'Cornsilk','#DC143C':'Crimson','#00FFFF':'Cyan','#00008B':'DarkBlue','#008B8B':'DarkCyan','#B8860B':'DarkGoldenRod',
+	'#A9A9A9':'DarkGray','#A9A9A9':'DarkGrey','#006400':'DarkGreen','#BDB76B':'DarkKhaki','#8B008B':'DarkMagenta','#556B2F':'DarkOliveGreen',
+	'#FF8C00':'Darkorange','#9932CC':'DarkOrchid','#8B0000':'DarkRed','#E9967A':'DarkSalmon','#8FBC8F':'DarkSeaGreen','#483D8B':'DarkSlateBlue',
+	'#2F4F4F':'DarkSlateGray','#2F4F4F':'DarkSlateGrey','#00CED1':'DarkTurquoise','#9400D3':'DarkViolet','#FF1493':'DeepPink','#00BFFF':'DeepSkyBlue',
+	'#696969':'DimGray','#696969':'DimGrey','#1E90FF':'DodgerBlue','#B22222':'FireBrick','#FFFAF0':'FloralWhite','#228B22':'ForestGreen',
+	'#FF00FF':'Fuchsia','#DCDCDC':'Gainsboro','#F8F8FF':'GhostWhite','#FFD700':'Gold','#DAA520':'GoldenRod','#808080':'Gray','#808080':'Grey',
+	'#008000':'Green','#ADFF2F':'GreenYellow','#F0FFF0':'HoneyDew','#FF69B4':'HotPink','#CD5C5C':'IndianRed','#4B0082':'Indigo','#FFFFF0':'Ivory',
+	'#F0E68C':'Khaki','#E6E6FA':'Lavender','#FFF0F5':'LavenderBlush','#7CFC00':'LawnGreen','#FFFACD':'LemonChiffon','#ADD8E6':'LightBlue',
+	'#F08080':'LightCoral','#E0FFFF':'LightCyan','#FAFAD2':'LightGoldenRodYellow','#D3D3D3':'LightGray','#D3D3D3':'LightGrey','#90EE90':'LightGreen',
+	'#FFB6C1':'LightPink','#FFA07A':'LightSalmon','#20B2AA':'LightSeaGreen','#87CEFA':'LightSkyBlue','#778899':'LightSlateGray','#778899':'LightSlateGrey',
+	'#B0C4DE':'LightSteelBlue','#FFFFE0':'LightYellow','#00FF00':'Lime','#32CD32':'LimeGreen','#FAF0E6':'Linen','#FF00FF':'Magenta','#800000':'Maroon',
+	'#66CDAA':'MediumAquaMarine','#0000CD':'MediumBlue','#BA55D3':'MediumOrchid','#9370D8':'MediumPurple','#3CB371':'MediumSeaGreen','#7B68EE':'MediumSlateBlue',
+	'#00FA9A':'MediumSpringGreen','#48D1CC':'MediumTurquoise','#C71585':'MediumVioletRed','#191970':'MidnightBlue','#F5FFFA':'MintCream','#FFE4E1':'MistyRose','#FFE4B5':'Moccasin',
+	'#FFDEAD':'NavajoWhite','#000080':'Navy','#FDF5E6':'OldLace','#808000':'Olive','#6B8E23':'OliveDrab','#FFA500':'Orange','#FF4500':'OrangeRed','#DA70D6':'Orchid',
+	'#EEE8AA':'PaleGoldenRod','#98FB98':'PaleGreen','#AFEEEE':'PaleTurquoise','#D87093':'PaleVioletRed','#FFEFD5':'PapayaWhip','#FFDAB9':'PeachPuff',
+	'#CD853F':'Peru','#FFC0CB':'Pink','#DDA0DD':'Plum','#B0E0E6':'PowderBlue','#800080':'Purple','#FF0000':'Red','#BC8F8F':'RosyBrown','#4169E1':'RoyalBlue',
+	'#8B4513':'SaddleBrown','#FA8072':'Salmon','#F4A460':'SandyBrown','#2E8B57':'SeaGreen','#FFF5EE':'SeaShell','#A0522D':'Sienna','#C0C0C0':'Silver',
+	'#87CEEB':'SkyBlue','#6A5ACD':'SlateBlue','#708090':'SlateGray','#708090':'SlateGrey','#FFFAFA':'Snow','#00FF7F':'SpringGreen',
+	'#4682B4':'SteelBlue','#D2B48C':'Tan','#008080':'Teal','#D8BFD8':'Thistle','#FF6347':'Tomato','#40E0D0':'Turquoise','#EE82EE':'Violet',
+	'#F5DEB3':'Wheat','#FFFFFF':'White','#F5F5F5':'WhiteSmoke','#FFFF00':'Yellow','#9ACD32':'YellowGreen'
+};
+
+function init() {
+	var inputColor = convertRGBToHex(tinyMCEPopup.getWindowArg('input_color'));
+
+	tinyMCEPopup.resizeToInnerSize();
+
+	generatePicker();
+
+	if (inputColor) {
+		changeFinalColor(inputColor);
+
+		col = convertHexToRGB(inputColor);
+
+		if (col)
+			updateLight(col.r, col.g, col.b);
+	}
+}
+
+function insertAction() {
+	var color = document.getElementById("color").value, f = tinyMCEPopup.getWindowArg('func');
+
+	tinyMCEPopup.restoreSelection();
+
+	if (f)
+		f(color);
+
+	tinyMCEPopup.close();
+}
+
+function showColor(color, name) {
+	if (name)
+		document.getElementById("colorname").innerHTML = name;
+
+	document.getElementById("preview").style.backgroundColor = color;
+	document.getElementById("color").value = color.toLowerCase();
+}
+
+function convertRGBToHex(col) {
+	var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi");
+
+	if (!col)
+		return col;
+
+	var rgb = col.replace(re, "$1,$2,$3").split(',');
+	if (rgb.length == 3) {
+		r = parseInt(rgb[0]).toString(16);
+		g = parseInt(rgb[1]).toString(16);
+		b = parseInt(rgb[2]).toString(16);
+
+		r = r.length == 1 ? '0' + r : r;
+		g = g.length == 1 ? '0' + g : g;
+		b = b.length == 1 ? '0' + b : b;
+
+		return "#" + r + g + b;
+	}
+
+	return col;
+}
+
+function convertHexToRGB(col) {
+	if (col.indexOf('#') != -1) {
+		col = col.replace(new RegExp('[^0-9A-F]', 'gi'), '');
+
+		r = parseInt(col.substring(0, 2), 16);
+		g = parseInt(col.substring(2, 4), 16);
+		b = parseInt(col.substring(4, 6), 16);
+
+		return {r : r, g : g, b : b};
+	}
+
+	return null;
+}
+
+function generatePicker() {
+	var el = document.getElementById('light'), h = '', i;
+
+	for (i = 0; i < detail; i++){
+		h += '<div id="gs'+i+'" style="background-color:#000000; width:15px; height:3px; border-style:none; border-width:0px;"'
+		+ ' onclick="changeFinalColor(this.style.backgroundColor)"'
+		+ ' onmousedown="isMouseDown = true; return false;"'
+		+ ' onmouseup="isMouseDown = false;"'
+		+ ' onmousemove="if (isMouseDown && isMouseOver) changeFinalColor(this.style.backgroundColor); return false;"'
+		+ ' onmouseover="isMouseOver = true;"'
+		+ ' onmouseout="isMouseOver = false;"'
+		+ '></div>';
+	}
+
+	el.innerHTML = h;
+}
+
+function generateWebColors() {
+	var el = document.getElementById('webcolors'), h = '', i;
+
+	if (el.className == 'generated')
+		return;
+
+	h += '<table border="0" cellspacing="1" cellpadding="0">'
+		+ '<tr>';
+
+	for (i=0; i<colors.length; i++) {
+		h += '<td bgcolor="' + colors[i] + '" width="10" height="10">'
+			+ '<a href="javascript:insertAction();" onfocus="showColor(\'' + colors[i] +  '\');" onmouseover="showColor(\'' + colors[i] +  '\');" style="display:block;width:10px;height:10px;overflow:hidden;">'
+			+ '</a></td>';
+		if ((i+1) % 18 == 0)
+			h += '</tr><tr>';
+	}
+
+	h += '</table>';
+
+	el.innerHTML = h;
+	el.className = 'generated';
+}
+
+function generateNamedColors() {
+	var el = document.getElementById('namedcolors'), h = '', n, v, i = 0;
+
+	if (el.className == 'generated')
+		return;
+
+	for (n in named) {
+		v = named[n];
+		h += '<a href="javascript:insertAction();" onmouseover="showColor(\'' + n +  '\',\'' + v + '\');" style="background-color: ' + n + '"><!-- IE --></a>'
+	}
+
+	el.innerHTML = h;
+	el.className = 'generated';
+}
+
+function dechex(n) {
+	return strhex.charAt(Math.floor(n / 16)) + strhex.charAt(n % 16);
+}
+
+function computeColor(e) {
+	var x, y, partWidth, partDetail, imHeight, r, g, b, coef, i, finalCoef, finalR, finalG, finalB;
+
+	x = e.offsetX ? e.offsetX : (e.target ? e.clientX - e.target.x : 0);
+	y = e.offsetY ? e.offsetY : (e.target ? e.clientY - e.target.y : 0);
+
+	partWidth = document.getElementById('colors').width / 6;
+	partDetail = detail / 2;
+	imHeight = document.getElementById('colors').height;
+
+	r = (x >= 0)*(x < partWidth)*255 + (x >= partWidth)*(x < 2*partWidth)*(2*255 - x * 255 / partWidth) + (x >= 4*partWidth)*(x < 5*partWidth)*(-4*255 + x * 255 / partWidth) + (x >= 5*partWidth)*(x < 6*partWidth)*255;
+	g = (x >= 0)*(x < partWidth)*(x * 255 / partWidth) + (x >= partWidth)*(x < 3*partWidth)*255	+ (x >= 3*partWidth)*(x < 4*partWidth)*(4*255 - x * 255 / partWidth);
+	b = (x >= 2*partWidth)*(x < 3*partWidth)*(-2*255 + x * 255 / partWidth) + (x >= 3*partWidth)*(x < 5*partWidth)*255 + (x >= 5*partWidth)*(x < 6*partWidth)*(6*255 - x * 255 / partWidth);
+
+	coef = (imHeight - y) / imHeight;
+	r = 128 + (r - 128) * coef;
+	g = 128 + (g - 128) * coef;
+	b = 128 + (b - 128) * coef;
+
+	changeFinalColor('#' + dechex(r) + dechex(g) + dechex(b));
+	updateLight(r, g, b);
+}
+
+function updateLight(r, g, b) {
+	var i, partDetail = detail / 2, finalCoef, finalR, finalG, finalB, color;
+
+	for (i=0; i<detail; i++) {
+		if ((i>=0) && (i<partDetail)) {
+			finalCoef = i / partDetail;
+			finalR = dechex(255 - (255 - r) * finalCoef);
+			finalG = dechex(255 - (255 - g) * finalCoef);
+			finalB = dechex(255 - (255 - b) * finalCoef);
+		} else {
+			finalCoef = 2 - i / partDetail;
+			finalR = dechex(r * finalCoef);
+			finalG = dechex(g * finalCoef);
+			finalB = dechex(b * finalCoef);
+		}
+
+		color = finalR + finalG + finalB;
+
+		document.getElementById('gs' + i).style.backgroundColor = '#'+color;
+	}
+}
+
+function changeFinalColor(color) {
+	if (color.indexOf('#') == -1)
+		color = convertRGBToHex(color);
+
+	document.getElementById('preview').style.backgroundColor = color;
+	document.getElementById('color').value = color;
+}
+
+tinyMCEPopup.onInit.add(init);
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/js/image.js 2.5.src/wp-includes/js/tinymce/themes/advanced/js/image.js
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/js/image.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/js/image.js	2008-03-12 17:47:11.000000000 -0500
@@ -0,0 +1,254 @@
+var ImageDialog = {
+	preInit : function() {
+		var url;
+
+		tinyMCEPopup.requireLangPack();
+
+		if (url = tinyMCEPopup.getParam("external_image_list_url"))
+			document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>');
+	},
+
+	init : function() {
+		var f = document.forms[0], ed = tinyMCEPopup.editor;
+
+		// Setup browse button
+		document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image');
+		if (isVisible('srcbrowser'))
+			document.getElementById('src').style.width = '180px';
+
+		e = ed.selection.getNode();
+
+		this.fillFileList('image_list', 'tinyMCEImageList');
+
+		if (e.nodeName == 'IMG') {
+			f.src.value = ed.dom.getAttrib(e, 'src');
+			f.alt.value = ed.dom.getAttrib(e, 'alt');
+			f.border.value = this.getAttrib(e, 'border');
+			f.vspace.value = this.getAttrib(e, 'vspace');
+			f.hspace.value = this.getAttrib(e, 'hspace');
+			f.width.value = ed.dom.getAttrib(e, 'width');
+			f.height.value = ed.dom.getAttrib(e, 'height');
+			f.insert.value = ed.getLang('update');
+			f.class_name.value = ed.dom.getAttrib(e, 'class');
+			this.styleVal = ed.dom.getAttrib(e, 'style');
+			selectByValue(f, 'image_list', f.src.value);
+			selectByValue(f, 'align', this.getAttrib(e, 'align'));
+			this.updateStyle();
+		}
+	},
+
+	fillFileList : function(id, l) {
+		var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl;
+
+		l = window[l];
+
+		if (l && l.length > 0) {
+			lst.options[lst.options.length] = new Option('', '');
+
+			tinymce.each(l, function(o) {
+				lst.options[lst.options.length] = new Option(o[0], o[1]);
+			});
+		} else
+			dom.remove(dom.getParent(id, 'tr'));
+	},
+
+	update : function() {
+		var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, args = {}, el;
+
+		tinyMCEPopup.restoreSelection();
+
+		if (f.src.value === '') {
+			if (ed.selection.getNode().nodeName == 'IMG') {
+				ed.dom.remove(ed.selection.getNode());
+				ed.execCommand('mceRepaint');
+			}
+
+			tinyMCEPopup.close();
+			return;
+		}
+
+		if (!ed.settings.inline_styles) {
+			args = tinymce.extend(args, {
+				vspace : nl.vspace.value,
+				hspace : nl.hspace.value,
+				border : nl.border.value,
+				align : getSelectValue(f, 'align')
+			});
+		} else
+			args.style = this.styleVal;
+		
+		tinymce.extend(args, {
+			src : f.src.value,
+			alt : f.alt.value,
+			width : f.width.value,
+			height : f.height.value,
+			'class' : f.class_name.value
+		});
+
+		el = ed.selection.getNode();
+
+		if (el && el.nodeName == 'IMG') {
+			ed.dom.setAttribs(el, args);
+		} else {
+			ed.execCommand('mceInsertContent', false, '<img id="__mce_tmp" src="javascript:;" />', {skip_undo : 1});
+			ed.dom.setAttribs('__mce_tmp', args);
+			ed.dom.setAttrib('__mce_tmp', 'id', '');
+			ed.undoManager.add();
+		}
+
+		tinyMCEPopup.close();
+	},
+
+	updateStyle : function() {
+		var dom = tinyMCEPopup.dom, st, v, cls, oldcls, rep, f = document.forms[0];
+
+		if (tinyMCEPopup.editor.settings.inline_styles) {
+			st = tinyMCEPopup.dom.parseStyle(this.styleVal);
+
+			// Handle align
+			v = getSelectValue(f, 'align');
+			cls = f.class_name.value || '';
+			cls = cls ? cls.replace(/alignright\s*|alignleft\s*/g, '') : '';
+			cls = cls ? cls.replace(/^\s*(.+?)\s*$/, '$1') : '';
+			if (v) {
+				if (v == 'left' || v == 'right') {
+					st['float'] = v;
+					delete st['vertical-align'];
+					oldcls = cls ? ' '+cls : '';
+					f.class_name.value = 'align' + v + oldcls;
+				} else {
+					st['vertical-align'] = v;
+					delete st['float'];
+					f.class_name.value = cls;
+				}
+			} else {
+				delete st['float'];
+				delete st['vertical-align'];
+				f.class_name.value = cls;
+			}
+
+			// Handle border
+			v = f.border.value;
+			if (v || v == '0') {
+				if (v == '0')
+					st['border'] = '0';
+				else
+					st['border'] = v + 'px solid black';
+			} else
+				delete st['border'];
+
+			// Handle hspace
+			v = f.hspace.value;
+			if (v) {
+				delete st['margin'];
+				st['margin-left'] = v + 'px';
+				st['margin-right'] = v + 'px';
+			} else {
+				delete st['margin-left'];
+				delete st['margin-right'];
+			}
+
+			// Handle vspace
+			v = f.vspace.value;
+			if (v) {
+				delete st['margin'];
+				st['margin-top'] = v + 'px';
+				st['margin-bottom'] = v + 'px';
+			} else {
+				delete st['margin-top'];
+				delete st['margin-bottom'];
+			}
+
+			// Merge
+			st = tinyMCEPopup.dom.parseStyle(dom.serializeStyle(st));
+			this.styleVal = dom.serializeStyle(st);
+		}
+	},
+
+	getAttrib : function(e, at) {
+		var ed = tinyMCEPopup.editor, dom = ed.dom, v, v2;
+
+		if (ed.settings.inline_styles) {
+			switch (at) {
+				case 'align':
+					if (v = dom.getStyle(e, 'float'))
+						return v;
+
+					if (v = dom.getStyle(e, 'vertical-align'))
+						return v;
+
+					break;
+
+				case 'hspace':
+					v = dom.getStyle(e, 'margin-left')
+					v2 = dom.getStyle(e, 'margin-right');
+					if (v && v == v2)
+						return parseInt(v.replace(/[^0-9]/g, ''));
+
+					break;
+
+				case 'vspace':
+					v = dom.getStyle(e, 'margin-top')
+					v2 = dom.getStyle(e, 'margin-bottom');
+					if (v && v == v2)
+						return parseInt(v.replace(/[^0-9]/g, ''));
+
+					break;
+
+				case 'border':
+					v = 0;
+
+					tinymce.each(['top', 'right', 'bottom', 'left'], function(sv) {
+						sv = dom.getStyle(e, 'border-' + sv + '-width');
+
+						// False or not the same as prev
+						if (!sv || (sv != v && v !== 0)) {
+							v = 0;
+							return false;
+						}
+
+						if (sv)
+							v = sv;
+					});
+
+					if (v)
+						return parseInt(v.replace(/[^0-9]/g, ''));
+
+					break;
+			}
+		}
+
+		if (v = dom.getAttrib(e, at))
+			return v;
+
+		return '';
+	},
+
+	resetImageData : function() {
+		var f = document.forms[0];
+
+		f.width.value = f.height.value = "";	
+	},
+
+	updateImageData : function() {
+		var f = document.forms[0], t = ImageDialog;
+
+		if (f.width.value == "")
+			f.width.value = t.preloadImg.width;
+
+		if (f.height.value == "")
+			f.height.value = t.preloadImg.height;
+	},
+
+	getImageData : function() {
+		var f = document.forms[0];
+
+		this.preloadImg = new Image();
+		this.preloadImg.onload = this.updateImageData;
+		this.preloadImg.onerror = this.resetImageData;
+		this.preloadImg.src = tinyMCEPopup.editor.documentBaseURI.toAbsolute(f.src.value);
+	}
+};
+
+ImageDialog.preInit();
+tinyMCEPopup.onInit.add(ImageDialog.init, ImageDialog);
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/js/link.js 2.5.src/wp-includes/js/tinymce/themes/advanced/js/link.js
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/js/link.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/js/link.js	2008-03-18 01:59:53.000000000 -0500
@@ -0,0 +1,126 @@
+tinyMCEPopup.requireLangPack();
+
+var LinkDialog = {
+	preInit : function() {
+		var url;
+
+		if (url = tinyMCEPopup.getParam("external_link_list_url"))
+			document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>');
+	},
+
+	init : function() {
+		var f = document.forms[0], ed = tinyMCEPopup.editor;
+
+		// Setup browse button
+		document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser', 'href', 'file', 'theme_advanced_link');
+		if (isVisible('hrefbrowser'))
+			document.getElementById('href').style.width = '180px';
+
+		this.fillClassList('class_list');
+		this.fillFileList('link_list', 'tinyMCELinkList');
+		this.fillTargetList('target_list');
+
+		if (e = ed.dom.getParent(ed.selection.getNode(), 'A')) {
+			f.href.value = ed.dom.getAttrib(e, 'href');
+			f.linktitle.value = ed.dom.getAttrib(e, 'title');
+			f.insert.value = ed.getLang('update');
+			selectByValue(f, 'link_list', f.href.value);
+			selectByValue(f, 'target_list', ed.dom.getAttrib(e, 'target'));
+			selectByValue(f, 'class_list', ed.dom.getAttrib(e, 'class'));
+		}
+	},
+
+	update : function() {
+		var f = document.forms[0], ed = tinyMCEPopup.editor, e, b;
+
+		tinyMCEPopup.restoreSelection();
+
+		// Remove element if there is no href
+		if (!f.href.value) {
+			e = ed.dom.getParent(ed.selection.getNode(), 'A');
+			if (e) {
+				tinyMCEPopup.execCommand("mceBeginUndoLevel");
+				b = ed.selection.getBookmark();
+				ed.dom.remove(e, 1);
+				ed.selection.moveToBookmark(b);
+				tinyMCEPopup.execCommand("mceEndUndoLevel");
+				tinyMCEPopup.close();
+				return;
+			}
+		}
+
+		ed.execCommand('mceInsertLink', false, {
+			href : f.href.value,
+			title : f.linktitle.value,
+			target : f.target_list ? f.target_list.options[f.target_list.selectedIndex].value : null,
+			'class' : f.class_list ? f.class_list.options[f.class_list.selectedIndex].value : null
+		});
+
+		tinyMCEPopup.close();
+	},
+
+	checkPrefix : function(n) {
+		if (n.value && Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCEPopup.getLang('advanced_dlg.link_is_email')))
+			n.value = 'mailto:' + n.value;
+
+		if (/^\s*www./i.test(n.value) && confirm(tinyMCEPopup.getLang('advanced_dlg.link_is_external')))
+			n.value = 'http://' + n.value;
+	},
+
+	fillFileList : function(id, l) {
+		var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl;
+
+		l = window[l];
+
+		if (l && l.length > 0) {
+			lst.options[lst.options.length] = new Option('', '');
+
+			tinymce.each(l, function(o) {
+				lst.options[lst.options.length] = new Option(o[0], o[1]);
+			});
+		} else
+			dom.remove(dom.getParent(id, 'tr'));
+	},
+
+	fillClassList : function(id) {
+		var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl;
+
+		if (v = tinyMCEPopup.getParam('theme_advanced_styles')) {
+			cl = [];
+
+			tinymce.each(v.split(';'), function(v) {
+				var p = v.split('=');
+
+				cl.push({'title' : p[0], 'class' : p[1]});
+			});
+		} else
+			cl = tinyMCEPopup.editor.dom.getClasses();
+
+		if (cl.length > 0) {
+			lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), '');
+
+			tinymce.each(cl, function(o) {
+				lst.options[lst.options.length] = new Option(o.title || o['class'], o['class']);
+			});
+		} else
+			dom.remove(dom.getParent(id, 'tr'));
+	},
+
+	fillTargetList : function(id) {
+		var dom = tinyMCEPopup.dom, lst = dom.get(id), v;
+
+		lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), '');
+		lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_same'), '_self');
+		lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_blank'), '_blank');
+
+		if (v = tinyMCEPopup.getParam('theme_advanced_link_targets')) {
+			tinymce.each(v.split(','), function(v) {
+				v = v.split('=');
+				lst.options[lst.options.length] = new Option(v[0], v[1]);
+			});
+		}
+	}
+};
+
+LinkDialog.preInit();
+tinyMCEPopup.onInit.add(LinkDialog.init, LinkDialog);
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/js/source_editor.js 2.5.src/wp-includes/js/tinymce/themes/advanced/js/source_editor.js
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/js/source_editor.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/js/source_editor.js	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,62 @@
+tinyMCEPopup.requireLangPack();
+tinyMCEPopup.onInit.add(onLoadInit);
+
+function saveContent() {
+	tinyMCEPopup.editor.setContent(document.getElementById('htmlSource').value);
+	tinyMCEPopup.close();
+}
+
+function onLoadInit() {
+	tinyMCEPopup.resizeToInnerSize();
+
+	// Remove Gecko spellchecking
+	if (tinymce.isGecko)
+		document.body.spellcheck = tinyMCEPopup.editor.getParam("gecko_spellcheck");
+
+	document.getElementById('htmlSource').value = tinyMCEPopup.editor.getContent();
+
+	if (tinyMCEPopup.editor.getParam("theme_advanced_source_editor_wrap", true)) {
+		setWrap('soft');
+		document.getElementById('wraped').checked = true;
+	}
+
+	resizeInputs();
+}
+
+function setWrap(val) {
+	var v, n, s = document.getElementById('htmlSource');
+
+	s.wrap = val;
+
+	if (!tinymce.isIE) {
+		v = s.value;
+		n = s.cloneNode(false);
+		n.setAttribute("wrap", val);
+		s.parentNode.replaceChild(n, s);
+		n.value = v;
+	}
+}
+
+function toggleWordWrap(elm) {
+	if (elm.checked)
+		setWrap('soft');
+	else
+		setWrap('off');
+}
+
+var wHeight=0, wWidth=0, owHeight=0, owWidth=0;
+
+function resizeInputs() {
+	var el = document.getElementById('htmlSource');
+
+	if (!tinymce.isIE) {
+		 wHeight = self.innerHeight - 65;
+		 wWidth = self.innerWidth - 16;
+	} else {
+		 wHeight = document.body.clientHeight - 70;
+		 wWidth = document.body.clientWidth - 16;
+	}
+
+	el.style.height = Math.abs(wHeight) + 'px';
+	el.style.width  = Math.abs(wWidth) + 'px';
+}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/jscripts/about.js 2.5.src/wp-includes/js/tinymce/themes/advanced/jscripts/about.js
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/jscripts/about.js	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/jscripts/about.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,75 +0,0 @@
-function init() {
-	var inst;
-
-	tinyMCEPopup.resizeToInnerSize();
-	inst = tinyMCE.selectedInstance;
-
-	// Give FF some time
-	window.setTimeout('insertHelpIFrame();', 10);
-
-	var tcont = document.getElementById('plugintablecontainer');
-	var plugins = tinyMCE.getParam('plugins', '', true, ',');
-	if (plugins.length == 0)
-		document.getElementById('plugins_tab').style.display = 'none';
-
-	var html = "";
-	html += '<table id="plugintable">';
-	html += '<thead>';
-	html += '<tr>';
-	html += '<td>' + tinyMCE.getLang('lang_plugin') + '</td>';
-	html += '<td>' + tinyMCE.getLang('lang_author') + '</td>';
-	html += '<td>' + tinyMCE.getLang('lang_version') + '</td>';
-	html += '</tr>';
-	html += '</thead>';
-	html += '<tbody>';
-
-	for (var i=0; i<inst.plugins.length; i++) {
-		var info = getPluginInfo(inst.plugins[i]);
-
-		html += '<tr>';
-
-		if (info.infourl != null && info.infourl != '')
-			html += '<td width="50%" title="' + plugins[i] + '"><a href="' + info.infourl + '" target="mceplugin">' + info.longname + '</a></td>';
-		else
-			html += '<td width="50%" title="' + plugins[i] + '">' + info.longname + '</td>';
-
-		if (info.authorurl != null && info.authorurl != '')
-			html += '<td width="35%"><a href="' + info.authorurl + '" target="mceplugin">' + info.author + '</a></td>';
-		else
-			html += '<td width="35%">' + info.author + '</td>';
-
-		html += '<td width="15%">' + info.version + '</td>';
-		html += '</tr>';
-	}
-
-	html += '</tbody>';
-	html += '</table>';
-
-	tcont.innerHTML = html;
-}
-
-function getPluginInfo(name) {
-	if (tinyMCE.plugins[name].getInfo)
-		return tinyMCE.plugins[name].getInfo();
-
-	return {
-		longname : name,
-		authorurl : '',
-		infourl : '',
-		author : '--',
-		version : '--'
-	};
-}
-
-function insertHelpIFrame() {
-	var html = '<iframe width="100%" height="300" src="' + tinyMCE.themeURL + "/docs/" + tinyMCE.settings['docs_language'] + "/index.htm" + '"></iframe>';
-
-	document.getElementById('iframecontainer').innerHTML = html;
-
-	html = '';
-	html += '<a href="http://www.moxiecode.com" target="_blank"><img src="http://tinymce.moxiecode.com/images/gotmoxie.png" alt="Got Moxie?" border="0" /></a> ';
-	html += '<a href="http://sourceforge.net/projects/tinymce/" target="_blank"><img src="http://sourceforge.net/sflogo.php?group_id=103281" alt="Hosted By Sourceforge" border="0" /></a> ';
-	html += '<a href="http://www.freshmeat.net/projects/tinymce" target="_blank"><img src="http://tinymce.moxiecode.com/images/fm.gif" alt="Also on freshmeat" border="0" /></a> ';
-
-	document.getElementById('buttoncontainer').innerHTML = html;
-}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/jscripts/anchor.js 2.5.src/wp-includes/js/tinymce/themes/advanced/jscripts/anchor.js
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/jscripts/anchor.js	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/jscripts/anchor.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,74 +0,0 @@
-var action, element;
-
-function init() {
-	tinyMCEPopup.resizeToInnerSize();
-
-	var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));
-	var anchor = tinyMCE.getParentElement(inst.getFocusElement(), "a", "name");
-	var img = inst.getFocusElement();
-	action = 'insert';
-
-	if (anchor != null) {
-		element = anchor;
-		action = "update";
-	}
-
-	if (tinyMCE.getAttrib(img, "class") == "mceItemAnchor") {
-		element = img;
-		action = "update";
-	}
-
-	if (action == "update")
-		document.forms[0].anchorName.value = element.nodeName == "IMG" ? element.getAttribute("title") : element.getAttribute("name");
-
-	document.forms[0].insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true);
-}
-
-function insertAnchor() {
-	var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));
-	var name = document.forms[0].anchorName.value, e;
-
-	tinyMCEPopup.execCommand("mceBeginUndoLevel");
-
-	if (action == "update") {
-		if (element.nodeName == "IMG")
-			element.setAttribute("title", name);
-		else
-			element.setAttribute("name", name);
-	} else {
-		var rng = inst.getRng();
-
-		if (rng.collapse)
-			rng.collapse(false);
-
-		name = name.replace(/&/g, '&amp;');
-		name = name.replace(/\"/g, '&quot;');
-		name = name.replace(/</g, '&lt;');
-		name = name.replace(/>/g, '&gt;');
-
-		// Fix for bug #1447335
-		if (tinyMCE.isGecko)
-			html = '<a id="mceNewAnchor" name="' + name + '"></a>';
-		else
-			html = '<a name="' + name + '"></a>';
-
-		tinyMCEPopup.execCommand("mceInsertContent", false, html);
-
-		// Fix for bug #1447335 force cursor after the anchor element
-		if (tinyMCE.isGecko) {
-			e = inst.getDoc().getElementById('mceNewAnchor');
-
-			if (e) {
-				inst.selection.selectNode(e, true, false, false);
-				e.removeAttribute('id');
-			}
-		}
-
-		tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);
-	}
-
-	tinyMCEPopup.execCommand("mceEndUndoLevel");
-
-	tinyMCE.triggerNodeChange();
-	tinyMCEPopup.close();
-}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/jscripts/charmap.js 2.5.src/wp-includes/js/tinymce/themes/advanced/jscripts/charmap.js
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/jscripts/charmap.js	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/jscripts/charmap.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,326 +0,0 @@
-function init() {
-	tinyMCEPopup.resizeToInnerSize();
-}
-
-var charmap = new Array();
-
-// for mor details please see w3c.org
-// now here is the complete list ;)
-
-charmap = [
-	['&nbsp;',    '&#160;',  true, 'no-break space'],
-	['&amp;',     '&#38;',   true, 'ampersand'],
-	['&quot;',    '&#34;',   true, 'quotation mark'],
-// finance
-	['&cent;',    '&#162;',  true, 'cent sign'],
-	['&euro;',    '&#8364;', true, 'euro sign'],
-	['&pound;',   '&#163;',  true, 'pound sign'],
-	['&yen;',     '&#165;',  true, 'yen sign'],
-// signs
-	['&copy;',    '&#169;',  true, 'copyright sign'],
-	['&reg;',     '&#174;',  true, 'registered sign'],
-	['&trade;',   '&#8482;', true, 'trade mark sign'],
-	['&permil;',  '&#8240;', true, 'per mille sign'],
-	['&micro;',   '&#181;',  true, 'micro sign'],
-	['&middot;',  '&#183;',  true, 'middle dot'],
-	['&bull;',    '&#8226;', true, 'bullet'],
-	['&hellip;',  '&#8230;', true, 'three dot leader'],
-	['&prime;',   '&#8242;', true, 'minutes / feet'],
-	['&Prime;',   '&#8243;', true, 'seconds / inches'],
-	['&sect;',    '&#167;',  true, 'section sign'],
-	['&para;',    '&#182;',  true, 'paragraph sign'],
-	['&szlig;',   '&#223;',  true, 'sharp s / ess-zed'],
-// quotations
-	['&lsaquo;',  '&#8249;', true, 'single left-pointing angle quotation mark'],
-	['&rsaquo;',  '&#8250;', true, 'single right-pointing angle quotation mark'],
-	['&laquo;',   '&#171;',  true, 'left pointing guillemet'],
-	['&raquo;',   '&#187;',  true, 'right pointing guillemet'],
-	['&lsquo;',   '&#8216;', true, 'left single quotation mark'],
-	['&rsquo;',   '&#8217;', true, 'right single quotation mark'],
-	['&ldquo;',   '&#8220;', true, 'left double quotation mark'],
-	['&rdquo;',   '&#8221;', true, 'right double quotation mark'],
-	['&sbquo;',   '&#8218;', true, 'single low-9 quotation mark'],
-	['&bdquo;',   '&#8222;', true, 'double low-9 quotation mark'],
-	['&lt;',      '&#60;',   true, 'less-than sign'],
-	['&gt;',      '&#62;',   true, 'greater-than sign'],
-	['&le;',      '&#8804;', true, 'less-than or equal to'],
-	['&ge;',      '&#8805;', true, 'greater-than or equal to'],
-	['&ndash;',   '&#8211;', true, 'en dash'],
-	['&mdash;',   '&#8212;', true, 'em dash'],
-	['&macr;',    '&#175;',  true, 'macron'],
-	['&oline;',   '&#8254;', true, 'overline'],
-	['&curren;',  '&#164;',  true, 'currency sign'],
-	['&brvbar;',  '&#166;',  true, 'broken bar'],
-	['&uml;',     '&#168;',  true, 'diaeresis'],
-	['&iexcl;',   '&#161;',  true, 'inverted exclamation mark'],
-	['&iquest;',  '&#191;',  true, 'turned question mark'],
-	['&circ;',    '&#710;',  true, 'circumflex accent'],
-	['&tilde;',   '&#732;',  true, 'small tilde'],
-	['&deg;',     '&#176;',  true, 'degree sign'],
-	['&minus;',   '&#8722;', true, 'minus sign'],
-	['&plusmn;',  '&#177;',  true, 'plus-minus sign'],
-	['&divide;',  '&#247;',  true, 'division sign'],
-	['&frasl;',   '&#8260;', true, 'fraction slash'],
-	['&times;',   '&#215;',  true, 'multiplication sign'],
-	['&sup1;',    '&#185;',  true, 'superscript one'],
-	['&sup2;',    '&#178;',  true, 'superscript two'],
-	['&sup3;',    '&#179;',  true, 'superscript three'],
-	['&frac14;',  '&#188;',  true, 'fraction one quarter'],
-	['&frac12;',  '&#189;',  true, 'fraction one half'],
-	['&frac34;',  '&#190;',  true, 'fraction three quarters'],
-// math / logical
-	['&fnof;',    '&#402;',  true, 'function / florin'],
-	['&int;',     '&#8747;', true, 'integral'],
-	['&sum;',     '&#8721;', true, 'n-ary sumation'],
-	['&infin;',   '&#8734;', true, 'infinity'],
-	['&radic;',   '&#8730;', true, 'square root'],
-	['&sim;',     '&#8764;', false,'similar to'],
-	['&cong;',    '&#8773;', false,'approximately equal to'],
-	['&asymp;',   '&#8776;', true, 'almost equal to'],
-	['&ne;',      '&#8800;', true, 'not equal to'],
-	['&equiv;',   '&#8801;', true, 'identical to'],
-	['&isin;',    '&#8712;', false,'element of'],
-	['&notin;',   '&#8713;', false,'not an element of'],
-	['&ni;',      '&#8715;', false,'contains as member'],
-	['&prod;',    '&#8719;', true, 'n-ary product'],
-	['&and;',     '&#8743;', false,'logical and'],
-	['&or;',      '&#8744;', false,'logical or'],
-	['&not;',     '&#172;',  true, 'not sign'],
-	['&cap;',     '&#8745;', true, 'intersection'],
-	['&cup;',     '&#8746;', false,'union'],
-	['&part;',    '&#8706;', true, 'partial differential'],
-	['&forall;',  '&#8704;', false,'for all'],
-	['&exist;',   '&#8707;', false,'there exists'],
-	['&empty;',   '&#8709;', false,'diameter'],
-	['&nabla;',   '&#8711;', false,'backward difference'],
-	['&lowast;',  '&#8727;', false,'asterisk operator'],
-	['&prop;',    '&#8733;', false,'proportional to'],
-	['&ang;',     '&#8736;', false,'angle'],
-// undefined
-	['&acute;',   '&#180;',  true, 'acute accent'],
-	['&cedil;',   '&#184;',  true, 'cedilla'],
-	['&ordf;',    '&#170;',  true, 'feminine ordinal indicator'],
-	['&ordm;',    '&#186;',  true, 'masculine ordinal indicator'],
-	['&dagger;',  '&#8224;', true, 'dagger'],
-	['&Dagger;',  '&#8225;', true, 'double dagger'],
-// alphabetical special chars
-	['&Agrave;',  '&#192;',  true, 'A - grave'],
-	['&Aacute;',  '&#193;',  true, 'A - acute'],
-	['&Acirc;',   '&#194;',  true, 'A - circumflex'],
-	['&Atilde;',  '&#195;',  true, 'A - tilde'],
-	['&Auml;',    '&#196;',  true, 'A - diaeresis'],
-	['&Aring;',   '&#197;',  true, 'A - ring above'],
-	['&AElig;',   '&#198;',  true, 'ligature AE'],
-	['&Ccedil;',  '&#199;',  true, 'C - cedilla'],
-	['&Egrave;',  '&#200;',  true, 'E - grave'],
-	['&Eacute;',  '&#201;',  true, 'E - acute'],
-	['&Ecirc;',   '&#202;',  true, 'E - circumflex'],
-	['&Euml;',    '&#203;',  true, 'E - diaeresis'],
-	['&Igrave;',  '&#204;',  true, 'I - grave'],
-	['&Iacute;',  '&#205;',  true, 'I - acute'],
-	['&Icirc;',   '&#206;',  true, 'I - circumflex'],
-	['&Iuml;',    '&#207;',  true, 'I - diaeresis'],
-	['&ETH;',     '&#208;',  true, 'ETH'],
-	['&Ntilde;',  '&#209;',  true, 'N - tilde'],
-	['&Ograve;',  '&#210;',  true, 'O - grave'],
-	['&Oacute;',  '&#211;',  true, 'O - acute'],
-	['&Ocirc;',   '&#212;',  true, 'O - circumflex'],
-	['&Otilde;',  '&#213;',  true, 'O - tilde'],
-	['&Ouml;',    '&#214;',  true, 'O - diaeresis'],
-	['&Oslash;',  '&#216;',  true, 'O - slash'],
-	['&OElig;',   '&#338;',  true, 'ligature OE'],
-	['&Scaron;',  '&#352;',  true, 'S - caron'],
-	['&Ugrave;',  '&#217;',  true, 'U - grave'],
-	['&Uacute;',  '&#218;',  true, 'U - acute'],
-	['&Ucirc;',   '&#219;',  true, 'U - circumflex'],
-	['&Uuml;',    '&#220;',  true, 'U - diaeresis'],
-	['&Yacute;',  '&#221;',  true, 'Y - acute'],
-	['&Yuml;',    '&#376;',  true, 'Y - diaeresis'],
-	['&THORN;',   '&#222;',  true, 'THORN'],
-	['&agrave;',  '&#224;',  true, 'a - grave'],
-	['&aacute;',  '&#225;',  true, 'a - acute'],
-	['&acirc;',   '&#226;',  true, 'a - circumflex'],
-	['&atilde;',  '&#227;',  true, 'a - tilde'],
-	['&auml;',    '&#228;',  true, 'a - diaeresis'],
-	['&aring;',   '&#229;',  true, 'a - ring above'],
-	['&aelig;',   '&#230;',  true, 'ligature ae'],
-	['&ccedil;',  '&#231;',  true, 'c - cedilla'],
-	['&egrave;',  '&#232;',  true, 'e - grave'],
-	['&eacute;',  '&#233;',  true, 'e - acute'],
-	['&ecirc;',   '&#234;',  true, 'e - circumflex'],
-	['&euml;',    '&#235;',  true, 'e - diaeresis'],
-	['&igrave;',  '&#236;',  true, 'i - grave'],
-	['&iacute;',  '&#237;',  true, 'i - acute'],
-	['&icirc;',   '&#238;',  true, 'i - circumflex'],
-	['&iuml;',    '&#239;',  true, 'i - diaeresis'],
-	['&eth;',     '&#240;',  true, 'eth'],
-	['&ntilde;',  '&#241;',  true, 'n - tilde'],
-	['&ograve;',  '&#242;',  true, 'o - grave'],
-	['&oacute;',  '&#243;',  true, 'o - acute'],
-	['&ocirc;',   '&#244;',  true, 'o - circumflex'],
-	['&otilde;',  '&#245;',  true, 'o - tilde'],
-	['&ouml;',    '&#246;',  true, 'o - diaeresis'],
-	['&oslash;',  '&#248;',  true, 'o slash'],
-	['&oelig;',   '&#339;',  true, 'ligature oe'],
-	['&scaron;',  '&#353;',  true, 's - caron'],
-	['&ugrave;',  '&#249;',  true, 'u - grave'],
-	['&uacute;',  '&#250;',  true, 'u - acute'],
-	['&ucirc;',   '&#251;',  true, 'u - circumflex'],
-	['&uuml;',    '&#252;',  true, 'u - diaeresis'],
-	['&yacute;',  '&#253;',  true, 'y - acute'],
-	['&thorn;',   '&#254;',  true, 'thorn'],
-	['&yuml;',    '&#255;',  true, 'y - diaeresis'],
-    ['&Alpha;',   '&#913;',  true, 'Alpha'],
-	['&Beta;',    '&#914;',  true, 'Beta'],
-	['&Gamma;',   '&#915;',  true, 'Gamma'],
-	['&Delta;',   '&#916;',  true, 'Delta'],
-	['&Epsilon;', '&#917;',  true, 'Epsilon'],
-	['&Zeta;',    '&#918;',  true, 'Zeta'],
-	['&Eta;',     '&#919;',  true, 'Eta'],
-	['&Theta;',   '&#920;',  true, 'Theta'],
-	['&Iota;',    '&#921;',  true, 'Iota'],
-	['&Kappa;',   '&#922;',  true, 'Kappa'],
-	['&Lambda;',  '&#923;',  true, 'Lambda'],
-	['&Mu;',      '&#924;',  true, 'Mu'],
-	['&Nu;',      '&#925;',  true, 'Nu'],
-	['&Xi;',      '&#926;',  true, 'Xi'],
-	['&Omicron;', '&#927;',  true, 'Omicron'],
-	['&Pi;',      '&#928;',  true, 'Pi'],
-	['&Rho;',     '&#929;',  true, 'Rho'],
-	['&Sigma;',   '&#931;',  true, 'Sigma'],
-	['&Tau;',     '&#932;',  true, 'Tau'],
-	['&Upsilon;', '&#933;',  true, 'Upsilon'],
-	['&Phi;',     '&#934;',  true, 'Phi'],
-	['&Chi;',     '&#935;',  true, 'Chi'],
-	['&Psi;',     '&#936;',  true, 'Psi'],
-	['&Omega;',   '&#937;',  true, 'Omega'],
-	['&alpha;',   '&#945;',  true, 'alpha'],
-	['&beta;',    '&#946;',  true, 'beta'],
-	['&gamma;',   '&#947;',  true, 'gamma'],
-	['&delta;',   '&#948;',  true, 'delta'],
-	['&epsilon;', '&#949;',  true, 'epsilon'],
-	['&zeta;',    '&#950;',  true, 'zeta'],
-	['&eta;',     '&#951;',  true, 'eta'],
-	['&theta;',   '&#952;',  true, 'theta'],
-	['&iota;',    '&#953;',  true, 'iota'],
-	['&kappa;',   '&#954;',  true, 'kappa'],
-	['&lambda;',  '&#955;',  true, 'lambda'],
-	['&mu;',      '&#956;',  true, 'mu'],
-	['&nu;',      '&#957;',  true, 'nu'],
-	['&xi;',      '&#958;',  true, 'xi'],
-	['&omicron;', '&#959;',  true, 'omicron'],
-	['&pi;',      '&#960;',  true, 'pi'],
-	['&rho;',     '&#961;',  true, 'rho'],
-	['&sigmaf;',  '&#962;',  true, 'final sigma'],
-	['&sigma;',   '&#963;',  true, 'sigma'],
-	['&tau;',     '&#964;',  true, 'tau'],
-	['&upsilon;', '&#965;',  true, 'upsilon'],
-	['&phi;',     '&#966;',  true, 'phi'],
-	['&chi;',     '&#967;',  true, 'chi'],
-	['&psi;',     '&#968;',  true, 'psi'],
-	['&omega;',   '&#969;',  true, 'omega'],
-// symbols
-	['&alefsym;', '&#8501;', false,'alef symbol'],
-	['&piv;',     '&#982;',  false,'pi symbol'],
-	['&real;',    '&#8476;', false,'real part symbol'],
-	['&thetasym;','&#977;',  false,'theta symbol'],
-	['&upsih;',   '&#978;',  false,'upsilon - hook symbol'],
-	['&weierp;',  '&#8472;', false,'Weierstrass p'],
-	['&image;',   '&#8465;', false,'imaginary part'],
-// arrows
-	['&larr;',    '&#8592;', true, 'leftwards arrow'],
-	['&uarr;',    '&#8593;', true, 'upwards arrow'],
-	['&rarr;',    '&#8594;', true, 'rightwards arrow'],
-	['&darr;',    '&#8595;', true, 'downwards arrow'],
-	['&harr;',    '&#8596;', true, 'left right arrow'],
-	['&crarr;',   '&#8629;', false,'carriage return'],
-	['&lArr;',    '&#8656;', false,'leftwards double arrow'],
-	['&uArr;',    '&#8657;', false,'upwards double arrow'],
-	['&rArr;',    '&#8658;', false,'rightwards double arrow'],
-	['&dArr;',    '&#8659;', false,'downwards double arrow'],
-	['&hArr;',    '&#8660;', false,'left right double arrow'],
-	['&there4;',  '&#8756;', false,'therefore'],
-	['&sub;',     '&#8834;', false,'subset of'],
-	['&sup;',     '&#8835;', false,'superset of'],
-	['&nsub;',    '&#8836;', false,'not a subset of'],
-	['&sube;',    '&#8838;', false,'subset of or equal to'],
-	['&supe;',    '&#8839;', false,'superset of or equal to'],
-	['&oplus;',   '&#8853;', false,'circled plus'],
-	['&otimes;',  '&#8855;', false,'circled times'],
-	['&perp;',    '&#8869;', false,'perpendicular'],
-	['&sdot;',    '&#8901;', false,'dot operator'],
-	['&lceil;',   '&#8968;', false,'left ceiling'],
-	['&rceil;',   '&#8969;', false,'right ceiling'],
-	['&lfloor;',  '&#8970;', false,'left floor'],
-	['&rfloor;',  '&#8971;', false,'right floor'],
-	['&lang;',    '&#9001;', false,'left-pointing angle bracket'],
-	['&rang;',    '&#9002;', false,'right-pointing angle bracket'],
-	['&loz;',     '&#9674;', true,'lozenge'],
-	['&spades;',  '&#9824;', false,'black spade suit'],
-	['&clubs;',   '&#9827;', true, 'black club suit'],
-	['&hearts;',  '&#9829;', true, 'black heart suit'],
-	['&diams;',   '&#9830;', true, 'black diamond suit'],
-	['&ensp;',    '&#8194;', false,'en space'],
-	['&emsp;',    '&#8195;', false,'em space'],
-	['&thinsp;',  '&#8201;', false,'thin space'],
-	['&zwnj;',    '&#8204;', false,'zero width non-joiner'],
-	['&zwj;',     '&#8205;', false,'zero width joiner'],
-	['&lrm;',     '&#8206;', false,'left-to-right mark'],
-	['&rlm;',     '&#8207;', false,'right-to-left mark'],
-	['&shy;',     '&#173;',  false,'soft hyphen']
-];
-
-function renderCharMapHTML() {
-	var charsPerRow = 20, tdWidth=20, tdHeight=20;
-	var html = '<table border="0" cellspacing="1" cellpadding="0" width="' + (tdWidth*charsPerRow) + '"><tr height="' + tdHeight + '">';
-	var cols=-1;
-	for (var i=0; i<charmap.length; i++) {
-		if (charmap[i][2]==true) {
-			cols++;
-			html += ''
-				+ '<td width="' + tdWidth + '" height="' + tdHeight + '" class="charmap"'
-				+ ' onmouseover="this.className=\'charmapOver\';'
-				+ 'previewChar(\'' + charmap[i][1].substring(1,charmap[i][1].length) + '\',\'' + charmap[i][0].substring(1,charmap[i][0].length) + '\',\'' + charmap[i][3] + '\');"'
-				+ ' onmouseout="this.className=\'charmap\';"'
-				+ ' nowrap="nowrap" onclick="insertChar(\'' + charmap[i][1].substring(2,charmap[i][1].length-1) + '\');"><a style="text-decoration: none;" onfocus="previewChar(\'' + charmap[i][1].substring(1,charmap[i][1].length) + '\',\'' + charmap[i][0].substring(1,charmap[i][0].length) + '\',\'' + charmap[i][3] + '\');" href="javascript:insertChar(\'' + charmap[i][1].substring(2,charmap[i][1].length-1) + '\');" onclick="return false;" onmousedown="return false;" title="' + charmap[i][3] + '">'
-				+ charmap[i][1]
-				+ '</a></td>';
-			if ((cols+1) % charsPerRow == 0)
-				html += '</tr><tr height="' + tdHeight + '">';
-		}
-	 }
-	if (cols % charsPerRow > 0) {
-		var padd = charsPerRow - (cols % charsPerRow);
-		for (var i=0; i<padd-1; i++)
-			html += '<td width="' + tdWidth + '" height="' + tdHeight + '" class="charmap">&nbsp;</td>';
-	}
-	html += '</tr></table>';
-	document.write(html);
-}
-
-function insertChar(chr) {
-	tinyMCEPopup.execCommand('mceInsertContent', false, '&#' + chr + ';');
-
-	// Refocus in window
-	if (tinyMCEPopup.isWindow)
-		window.focus();
-
-	tinyMCEPopup.close();
-}
-
-function previewChar(codeA, codeB, codeN) {
-	var elmA = document.getElementById('codeA');
-	var elmB = document.getElementById('codeB');
-	var elmV = document.getElementById('codeV');
-	var elmN = document.getElementById('codeN');
-
-	if (codeA=='#160;') {
-		elmV.innerHTML = '__';
-	} else {
-		elmV.innerHTML = '&' + codeA;
-	}
-
-	elmB.innerHTML = '&amp;' + codeA;
-	elmA.innerHTML = '&amp;' + codeB;
-	elmN.innerHTML = codeN;
-}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/jscripts/color_picker.js 2.5.src/wp-includes/js/tinymce/themes/advanced/jscripts/color_picker.js
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/jscripts/color_picker.js	2007-04-12 12:04:03.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/jscripts/color_picker.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,249 +0,0 @@
-var detail = 50, strhex = "0123456789abcdef", i, isMouseDown = false, isMouseOver = false;
-
-var colors = new Array(
-	"#000000","#000033","#000066","#000099","#0000cc","#0000ff","#330000","#330033",
-	"#330066","#330099","#3300cc","#3300ff","#660000","#660033","#660066","#660099",
-	"#6600cc","#6600ff","#990000","#990033","#990066","#990099","#9900cc","#9900ff",
-	"#cc0000","#cc0033","#cc0066","#cc0099","#cc00cc","#cc00ff","#ff0000","#ff0033",
-	"#ff0066","#ff0099","#ff00cc","#ff00ff","#003300","#003333","#003366","#003399",
-	"#0033cc","#0033ff","#333300","#333333","#333366","#333399","#3333cc","#3333ff",
-	"#663300","#663333","#663366","#663399","#6633cc","#6633ff","#993300","#993333",
-	"#993366","#993399","#9933cc","#9933ff","#cc3300","#cc3333","#cc3366","#cc3399",
-	"#cc33cc","#cc33ff","#ff3300","#ff3333","#ff3366","#ff3399","#ff33cc","#ff33ff",
-	"#006600","#006633","#006666","#006699","#0066cc","#0066ff","#336600","#336633",
-	"#336666","#336699","#3366cc","#3366ff","#666600","#666633","#666666","#666699",
-	"#6666cc","#6666ff","#996600","#996633","#996666","#996699","#9966cc","#9966ff",
-	"#cc6600","#cc6633","#cc6666","#cc6699","#cc66cc","#cc66ff","#ff6600","#ff6633",
-	"#ff6666","#ff6699","#ff66cc","#ff66ff","#009900","#009933","#009966","#009999",
-	"#0099cc","#0099ff","#339900","#339933","#339966","#339999","#3399cc","#3399ff",
-	"#669900","#669933","#669966","#669999","#6699cc","#6699ff","#999900","#999933",
-	"#999966","#999999","#9999cc","#9999ff","#cc9900","#cc9933","#cc9966","#cc9999",
-	"#cc99cc","#cc99ff","#ff9900","#ff9933","#ff9966","#ff9999","#ff99cc","#ff99ff",
-	"#00cc00","#00cc33","#00cc66","#00cc99","#00cccc","#00ccff","#33cc00","#33cc33",
-	"#33cc66","#33cc99","#33cccc","#33ccff","#66cc00","#66cc33","#66cc66","#66cc99",
-	"#66cccc","#66ccff","#99cc00","#99cc33","#99cc66","#99cc99","#99cccc","#99ccff",
-	"#cccc00","#cccc33","#cccc66","#cccc99","#cccccc","#ccccff","#ffcc00","#ffcc33",
-	"#ffcc66","#ffcc99","#ffcccc","#ffccff","#00ff00","#00ff33","#00ff66","#00ff99",
-	"#00ffcc","#00ffff","#33ff00","#33ff33","#33ff66","#33ff99","#33ffcc","#33ffff",
-	"#66ff00","#66ff33","#66ff66","#66ff99","#66ffcc","#66ffff","#99ff00","#99ff33",
-	"#99ff66","#99ff99","#99ffcc","#99ffff","#ccff00","#ccff33","#ccff66","#ccff99",
-	"#ccffcc","#ccffff","#ffff00","#ffff33","#ffff66","#ffff99","#ffffcc","#ffffff"
-);
-
-var named = {
-	'#F0F8FF':'AliceBlue','#FAEBD7':'AntiqueWhite','#00FFFF':'Aqua','#7FFFD4':'Aquamarine','#F0FFFF':'Azure','#F5F5DC':'Beige',
-	'#FFE4C4':'Bisque','#000000':'Black','#FFEBCD':'BlanchedAlmond','#0000FF':'Blue','#8A2BE2':'BlueViolet','#A52A2A':'Brown',
-	'#DEB887':'BurlyWood','#5F9EA0':'CadetBlue','#7FFF00':'Chartreuse','#D2691E':'Chocolate','#FF7F50':'Coral','#6495ED':'CornflowerBlue',
-	'#FFF8DC':'Cornsilk','#DC143C':'Crimson','#00FFFF':'Cyan','#00008B':'DarkBlue','#008B8B':'DarkCyan','#B8860B':'DarkGoldenRod',
-	'#A9A9A9':'DarkGray','#A9A9A9':'DarkGrey','#006400':'DarkGreen','#BDB76B':'DarkKhaki','#8B008B':'DarkMagenta','#556B2F':'DarkOliveGreen',
-	'#FF8C00':'Darkorange','#9932CC':'DarkOrchid','#8B0000':'DarkRed','#E9967A':'DarkSalmon','#8FBC8F':'DarkSeaGreen','#483D8B':'DarkSlateBlue',
-	'#2F4F4F':'DarkSlateGray','#2F4F4F':'DarkSlateGrey','#00CED1':'DarkTurquoise','#9400D3':'DarkViolet','#FF1493':'DeepPink','#00BFFF':'DeepSkyBlue',
-	'#696969':'DimGray','#696969':'DimGrey','#1E90FF':'DodgerBlue','#B22222':'FireBrick','#FFFAF0':'FloralWhite','#228B22':'ForestGreen',
-	'#FF00FF':'Fuchsia','#DCDCDC':'Gainsboro','#F8F8FF':'GhostWhite','#FFD700':'Gold','#DAA520':'GoldenRod','#808080':'Gray','#808080':'Grey',
-	'#008000':'Green','#ADFF2F':'GreenYellow','#F0FFF0':'HoneyDew','#FF69B4':'HotPink','#CD5C5C':'IndianRed','#4B0082':'Indigo','#FFFFF0':'Ivory',
-	'#F0E68C':'Khaki','#E6E6FA':'Lavender','#FFF0F5':'LavenderBlush','#7CFC00':'LawnGreen','#FFFACD':'LemonChiffon','#ADD8E6':'LightBlue',
-	'#F08080':'LightCoral','#E0FFFF':'LightCyan','#FAFAD2':'LightGoldenRodYellow','#D3D3D3':'LightGray','#D3D3D3':'LightGrey','#90EE90':'LightGreen',
-	'#FFB6C1':'LightPink','#FFA07A':'LightSalmon','#20B2AA':'LightSeaGreen','#87CEFA':'LightSkyBlue','#778899':'LightSlateGray','#778899':'LightSlateGrey',
-	'#B0C4DE':'LightSteelBlue','#FFFFE0':'LightYellow','#00FF00':'Lime','#32CD32':'LimeGreen','#FAF0E6':'Linen','#FF00FF':'Magenta','#800000':'Maroon',
-	'#66CDAA':'MediumAquaMarine','#0000CD':'MediumBlue','#BA55D3':'MediumOrchid','#9370D8':'MediumPurple','#3CB371':'MediumSeaGreen','#7B68EE':'MediumSlateBlue',
-	'#00FA9A':'MediumSpringGreen','#48D1CC':'MediumTurquoise','#C71585':'MediumVioletRed','#191970':'MidnightBlue','#F5FFFA':'MintCream','#FFE4E1':'MistyRose','#FFE4B5':'Moccasin',
-	'#FFDEAD':'NavajoWhite','#000080':'Navy','#FDF5E6':'OldLace','#808000':'Olive','#6B8E23':'OliveDrab','#FFA500':'Orange','#FF4500':'OrangeRed','#DA70D6':'Orchid',
-	'#EEE8AA':'PaleGoldenRod','#98FB98':'PaleGreen','#AFEEEE':'PaleTurquoise','#D87093':'PaleVioletRed','#FFEFD5':'PapayaWhip','#FFDAB9':'PeachPuff',
-	'#CD853F':'Peru','#FFC0CB':'Pink','#DDA0DD':'Plum','#B0E0E6':'PowderBlue','#800080':'Purple','#FF0000':'Red','#BC8F8F':'RosyBrown','#4169E1':'RoyalBlue',
-	'#8B4513':'SaddleBrown','#FA8072':'Salmon','#F4A460':'SandyBrown','#2E8B57':'SeaGreen','#FFF5EE':'SeaShell','#A0522D':'Sienna','#C0C0C0':'Silver',
-	'#87CEEB':'SkyBlue','#6A5ACD':'SlateBlue','#708090':'SlateGray','#708090':'SlateGrey','#FFFAFA':'Snow','#00FF7F':'SpringGreen',
-	'#4682B4':'SteelBlue','#D2B48C':'Tan','#008080':'Teal','#D8BFD8':'Thistle','#FF6347':'Tomato','#40E0D0':'Turquoise','#EE82EE':'Violet',
-	'#F5DEB3':'Wheat','#FFFFFF':'White','#F5F5F5':'WhiteSmoke','#FFFF00':'Yellow','#9ACD32':'YellowGreen'
-};
-
-function init() {
-	var inputColor = convertRGBToHex(tinyMCE.getWindowArg('input_color'));
-
-	if (tinyMCE.isMSIE)
-		tinyMCEPopup.resizeToInnerSize();
-
-	generatePicker();
-
-	if (inputColor) {
-		changeFinalColor(inputColor);
-
-		col = convertHexToRGB(inputColor);
-
-		if (col)
-			updateLight(col.r, col.g, col.b);
-	}
-}
-
-function insertAction() {
-	var color = document.getElementById("color").value;
-
-	tinyMCEPopup.execCommand(tinyMCE.getWindowArg('command'), false, color);
-	tinyMCEPopup.close();
-}
-
-function showColor(color, name) {
-	if (name)
-		document.getElementById("colorname").innerHTML = name;
-
-	document.getElementById("preview").style.backgroundColor = color;
-	document.getElementById("color").value = color;
-}
-
-function convertRGBToHex(col) {
-	var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi");
-
-	if (!col)
-		return col;
-
-	var rgb = col.replace(re, "$1,$2,$3").split(',');
-	if (rgb.length == 3) {
-		r = parseInt(rgb[0]).toString(16);
-		g = parseInt(rgb[1]).toString(16);
-		b = parseInt(rgb[2]).toString(16);
-
-		r = r.length == 1 ? '0' + r : r;
-		g = g.length == 1 ? '0' + g : g;
-		b = b.length == 1 ? '0' + b : b;
-
-		return "#" + r + g + b;
-	}
-
-	return col;
-}
-
-function convertHexToRGB(col) {
-	if (col.indexOf('#') != -1) {
-		col = col.replace(new RegExp('[^0-9A-F]', 'gi'), '');
-
-		r = parseInt(col.substring(0, 2), 16);
-		g = parseInt(col.substring(2, 4), 16);
-		b = parseInt(col.substring(4, 6), 16);
-
-		return {r : r, g : g, b : b};
-	}
-
-	return null;
-}
-
-function generatePicker() {
-	var el = document.getElementById('light'), h = '', i;
-
-	for (i = 0; i < detail; i++){
-		h += '<div id="gs'+i+'" style="background-color:#000000; width:15px; height:3px; border-style:none; border-width:0px;"'
-		+ ' onclick="changeFinalColor(this.style.backgroundColor)"'
-		+ ' onmousedown="isMouseDown = true; return false;"'
-		+ ' onmouseup="isMouseDown = false;"'
-		+ ' onmousemove="if (isMouseDown && isMouseOver) changeFinalColor(this.style.backgroundColor); return false;"'
-		+ ' onmouseover="isMouseOver = true;"'
-		+ ' onmouseout="isMouseOver = false;"'
-		+ '></div>';
-	}
-
-	el.innerHTML = h;
-}
-
-function generateWebColors() {
-	var el = document.getElementById('webcolors'), h = '', i;
-
-	if (el.className == 'generated')
-		return;
-
-	h += '<table border="0" cellspacing="1" cellpadding="0">'
-		+ '<tr>';
-
-	for (i=0; i<colors.length; i++) {
-		h += '<td bgcolor="' + colors[i] + '">'
-			+ '<a href="javascript:selectColor();" onfocus="showColor(\'' + colors[i] +  '\');" onmouseover="showColor(\'' + colors[i] +  '\');">'
-			+ '<img border="0" src="images/spacer.gif" width="10" height="10" title="' + colors[i] +  '" alt="' + colors[i] +  '" /></a></td>';
-		if ((i+1) % 18 == 0)
-			h += '</tr><tr>';
-	}
-
-	h += '</table>';
-
-	el.innerHTML = h;
-	el.className = 'generated';
-}
-
-function generateNamedColors() {
-	var el = document.getElementById('namedcolors'), h = '', n, v, i = 0;
-
-	if (el.className == 'generated')
-		return;
-
-	for (n in named) {
-		v = named[n];
-		h += '<a href="javascript:selectColor();" onmouseover="showColor(\'' + n +  '\',\'' + v + '\');" style="background-color: ' + n + '"><!-- IE --></a>'
-	}
-
-	el.innerHTML = h;
-	el.className = 'generated';
-}
-
-function selectColor() {
-	var color = document.getElementById("color").value;
-
-	if(window.opener)
-		window.opener.tinyMCE.execInstanceCommand(tinyMCE.getWindowArg('editor_id'),tinyMCE.getWindowArg('command'),false,color);
-
-	window.close();
-}
-
-function dechex(n) {
-	return strhex.charAt(Math.floor(n / 16)) + strhex.charAt(n % 16);
-}
-
-function computeColor(e) {
-	var x, y, partWidth, partDetail, imHeight, r, g, b, coef, i, finalCoef, finalR, finalG, finalB;
-
-	x = e.offsetX ? e.offsetX : (e.target ? e.clientX - e.target.x : 0);
-	y = e.offsetY ? e.offsetY : (e.target ? e.clientY - e.target.y : 0);
-
-	partWidth = document.getElementById('colorpicker').width / 6;
-	partDetail = detail / 2;
-	imHeight = document.getElementById('colorpicker').height;
-
-	r = (x >= 0)*(x < partWidth)*255 + (x >= partWidth)*(x < 2*partWidth)*(2*255 - x * 255 / partWidth) + (x >= 4*partWidth)*(x < 5*partWidth)*(-4*255 + x * 255 / partWidth) + (x >= 5*partWidth)*(x < 6*partWidth)*255;
-	g = (x >= 0)*(x < partWidth)*(x * 255 / partWidth) + (x >= partWidth)*(x < 3*partWidth)*255	+ (x >= 3*partWidth)*(x < 4*partWidth)*(4*255 - x * 255 / partWidth);
-	b = (x >= 2*partWidth)*(x < 3*partWidth)*(-2*255 + x * 255 / partWidth) + (x >= 3*partWidth)*(x < 5*partWidth)*255 + (x >= 5*partWidth)*(x < 6*partWidth)*(6*255 - x * 255 / partWidth);
-
-	coef = (imHeight - y) / imHeight;
-	r = 128 + (r - 128) * coef;
-	g = 128 + (g - 128) * coef;
-	b = 128 + (b - 128) * coef;
-
-	changeFinalColor('#' + dechex(r) + dechex(g) + dechex(b));
-	updateLight(r, g, b);
-}
-
-function updateLight(r, g, b) {
-	var i, partDetail = detail / 2, finalCoef, finalR, finalG, finalB, color;
-
-	for (i=0; i<detail; i++) {
-		if ((i>=0) && (i<partDetail)) {
-			finalCoef = i / partDetail;
-			finalR = dechex(255 - (255 - r) * finalCoef);
-			finalG = dechex(255 - (255 - g) * finalCoef);
-			finalB = dechex(255 - (255 - b) * finalCoef);
-		} else {
-			finalCoef = 2 - i / partDetail;
-			finalR = dechex(r * finalCoef);
-			finalG = dechex(g * finalCoef);
-			finalB = dechex(b * finalCoef);
-		}
-
-		color = finalR + finalG + finalB;
-
-		document.getElementById('gs' + i).style.backgroundColor = '#'+color;
-	}
-}
-
-function changeFinalColor(color) {
-	if (color.indexOf('#') == -1)
-		color = convertRGBToHex(color);
-
-	document.getElementById('preview').style.backgroundColor = color;
-	document.getElementById('color').value = color;
-}
-
-window.focus();
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/jscripts/image.js 2.5.src/wp-includes/js/tinymce/themes/advanced/jscripts/image.js
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/jscripts/image.js	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/jscripts/image.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,81 +0,0 @@
-var url = tinyMCE.getParam("external_image_list_url");
-if (url != null) {
-	// Fix relative
-	if (url.charAt(0) != '/' && url.indexOf('://') == -1)
-		url = tinyMCE.documentBasePath + "/" + url;
-
-	document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');
-}
-
-function insertImage() {
-	var src = document.forms[0].src.value;
-	var alt = document.forms[0].alt.value;
-	var border = document.forms[0].border.value;
-	var vspace = document.forms[0].vspace.value;
-	var hspace = document.forms[0].hspace.value;
-	var width = document.forms[0].width.value;
-	var height = document.forms[0].height.value;
-	var align = document.forms[0].align.options[document.forms[0].align.selectedIndex].value;
-
-	tinyMCEPopup.restoreSelection();
-	tinyMCE.themes['advanced']._insertImage(src, alt, border, hspace, vspace, width, height, align);
-	tinyMCEPopup.close();
-}
-
-function init() {
-	tinyMCEPopup.resizeToInnerSize();
-
-	document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image');
-
-	var formObj = document.forms[0];
-
-	for (var i=0; i<document.forms[0].align.options.length; i++) {
-		if (document.forms[0].align.options[i].value == tinyMCE.getWindowArg('align'))
-			document.forms[0].align.options.selectedIndex = i;
-	}
-
-	formObj.src.value = tinyMCE.getWindowArg('src');
-	formObj.alt.value = tinyMCE.getWindowArg('alt');
-	formObj.border.value = tinyMCE.getWindowArg('border');
-	formObj.vspace.value = tinyMCE.getWindowArg('vspace');
-	formObj.hspace.value = tinyMCE.getWindowArg('hspace');
-	formObj.width.value = tinyMCE.getWindowArg('width');
-	formObj.height.value = tinyMCE.getWindowArg('height');
-	formObj.insert.value = tinyMCE.getLang('lang_' + tinyMCE.getWindowArg('action'), 'Insert', true); 
-
-	// Handle file browser
-	if (isVisible('srcbrowser'))
-		document.getElementById('src').style.width = '180px';
-
-	// Auto select image in list
-	if (typeof(tinyMCEImageList) != "undefined" && tinyMCEImageList.length > 0) {
-		for (var i=0; i<formObj.image_list.length; i++) {
-			if (formObj.image_list.options[i].value == tinyMCE.getWindowArg('src'))
-				formObj.image_list.options[i].selected = true;
-		}
-	}
-}
-
-var preloadImg = new Image();
-
-function resetImageData() {
-	var formObj = document.forms[0];
-	formObj.width.value = formObj.height.value = "";	
-}
-
-function updateImageData() {
-	var formObj = document.forms[0];
-
-	if (formObj.width.value == "")
-		formObj.width.value = preloadImg.width;
-
-	if (formObj.height.value == "")
-		formObj.height.value = preloadImg.height;
-}
-
-function getImageData() {
-	preloadImg = new Image();
-	tinyMCE.addEvent(preloadImg, "load", updateImageData);
-	tinyMCE.addEvent(preloadImg, "error", function () {var formObj = document.forms[0];formObj.width.value = formObj.height.value = "";});
-	preloadImg.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], document.forms[0].src.value);
-}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/jscripts/link.js 2.5.src/wp-includes/js/tinymce/themes/advanced/jscripts/link.js
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/jscripts/link.js	2007-04-12 12:04:03.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/jscripts/link.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,72 +0,0 @@
-var url = tinyMCE.getParam("external_link_list_url");
-if (url != null) {
-	// Fix relative
-	if (url.charAt(0) != '/' && url.indexOf('://') == -1)
-		url = tinyMCE.documentBasePath + "/" + url;
-
-	document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');
-}
-
-function init() {
-	tinyMCEPopup.resizeToInnerSize();
-
-	document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','theme_advanced_link');
-
-	// Handle file browser
-	if (isVisible('hrefbrowser'))
-		document.getElementById('href').style.width = '180px';
-
-	var formObj = document.forms[0];
-
-	for (var i=0; i<document.forms[0].target.options.length; i++) {
-		var option = document.forms[0].target.options[i];
-
-		if (option.value == tinyMCE.getWindowArg('target'))
-			option.selected = true;
-	}
-
-	document.forms[0].href.value = tinyMCE.getWindowArg('href') || 'http://';
-	document.forms[0].href.select();
-	document.forms[0].href.focus();
-	document.forms[0].linktitle.value = tinyMCE.getWindowArg('title');
-	document.forms[0].insert.value = tinyMCE.getLang('lang_' + tinyMCE.getWindowArg('action'), 'Insert', true); 
-
-	addClassesToList('styleSelect', 'theme_advanced_link_styles');
-	selectByValue(formObj, 'styleSelect', tinyMCE.getWindowArg('className'), true);
-
-	// Hide css select row if no CSS classes
-	if (formObj.styleSelect && formObj.styleSelect.options.length <= 1) {
-		var sr = document.getElementById('styleSelectRow');
-		sr.style.display = 'none';
-		sr.parentNode.removeChild(sr);
-	}
-
-	// Auto select link in list
-	if (typeof(tinyMCELinkList) != "undefined" && tinyMCELinkList.length > 0) {
-		var formObj = document.forms[0];
-
-		for (var i=0; i<formObj.link_list.length; i++) {
-			if (formObj.link_list.options[i].value == tinyMCE.getWindowArg('href'))
-				formObj.link_list.options[i].selected = true;
-		}
-	}
-}
-
-function insertLink() {
-	var href = document.forms[0].href.value;
-	var target = document.forms[0].target.options[document.forms[0].target.selectedIndex].value;
-	var title = document.forms[0].linktitle.value;
-	var style_class = document.forms[0].styleSelect ? document.forms[0].styleSelect.value : "";
-	var dummy;
-	
-	// WordPress: Make anchors absolute;
-	if (href.charAt(0) == '#')
-		href = tinyMCE.settings['document_base_url'] + href;
-
-	if (target == '_self')
-		target = '';
-
-	tinyMCEPopup.restoreSelection();
-	tinyMCE.themes['advanced']._insertLink(href, target, title, dummy, style_class);
-	tinyMCEPopup.close();
-}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/jscripts/source_editor.js 2.5.src/wp-includes/js/tinymce/themes/advanced/jscripts/source_editor.js
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/jscripts/source_editor.js	2007-01-24 19:20:47.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/jscripts/source_editor.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,59 +0,0 @@
-function saveContent() {
-	tinyMCE.setContent(document.getElementById('htmlSource').value);
-	tinyMCE.closeWindow(window);
-}
-
-function onLoadInit() {
-	tinyMCEPopup.resizeToInnerSize();
-
-	// Remove Gecko spellchecking
-	if (tinyMCE.isGecko)
-		document.body.spellcheck = tinyMCE.getParam("gecko_spellcheck");
-
-	document.getElementById('htmlSource').value = tinyMCE.getContent(tinyMCE.getWindowArg('editor_id'));
-
-	resizeInputs();
-
-	if (tinyMCE.getParam("theme_advanced_source_editor_wrap", true)) {
-		setWrap('soft');
-		document.getElementById('wraped').checked = true;
-	}
-}
-
-function setWrap(val) {
-	var s = document.getElementById('htmlSource');
-
-	s.wrap = val;
-
-	if (tinyMCE.isGecko || tinyMCE.isOpera) {
-		var v = s.value;
-		var n = s.cloneNode(false);
-		n.setAttribute("wrap", val);
-		s.parentNode.replaceChild(n, s);
-		n.value = v;
-	}
-}
-
-function toggleWordWrap(elm) {
-	if (elm.checked)
-		setWrap('soft');
-	else
-		setWrap('off');
-}
-
-var wHeight=0, wWidth=0, owHeight=0, owWidth=0;
-
-function resizeInputs() {
-	var el = document.getElementById('htmlSource');
-
-	if (!tinyMCE.isMSIE) {
-		 wHeight = self.innerHeight - 60;
-		 wWidth = self.innerWidth - 16;
-	} else {
-		 wHeight = document.body.clientHeight - 60;
-		 wWidth = document.body.clientWidth - 16;
-	}
-
-	el.style.height = Math.abs(wHeight) + 'px';
-	el.style.width  = Math.abs(wWidth) + 'px';
-}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/langs/en.js 2.5.src/wp-includes/js/tinymce/themes/advanced/langs/en.js
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/langs/en.js	2007-04-12 12:04:03.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/langs/en.js	1969-12-31 18:00:00.000000000 -0600
@@ -1,91 +0,0 @@
-// UK lang variables
-
-tinyMCE.addToLang('',{
-theme_style_select : '-- Styles --',
-theme_code_desc : 'Edit HTML Source',
-theme_code_title : 'HTML Source Editor',
-theme_code_wordwrap : 'Word wrap',
-theme_sub_desc : 'Subscript',
-theme_sup_desc : 'Superscript',
-theme_hr_desc : 'Insert horizontal ruler',
-theme_removeformat_desc : 'Remove formatting',
-theme_custom1_desc : 'Your custom description here',
-insert_image_border : 'Border',
-insert_image_dimensions : 'Dimensions',
-insert_image_vspace : 'Vertical space',
-insert_image_hspace : 'Horizontal space',
-insert_image_align : 'Alignment',
-insert_image_align_default : '-- Not set --',
-insert_image_align_baseline : 'Baseline',
-insert_image_align_top : 'Top',
-insert_image_align_middle : 'Middle',
-insert_image_align_bottom : 'Bottom',
-insert_image_align_texttop : 'TextTop',
-insert_image_align_absmiddle : 'Absolute Middle',
-insert_image_align_absbottom : 'Absolute Bottom',
-insert_image_align_left : 'Left',
-insert_image_align_right : 'Right',
-theme_font_size : '-- Font size --',
-theme_fontdefault : '-- Font family --',
-theme_block : '-- Format --',
-theme_paragraph : 'Paragraph',
-theme_div : 'Div',
-theme_address : 'Address',
-theme_pre : 'Preformatted',
-theme_h1 : 'Heading 1',
-theme_h2 : 'Heading 2',
-theme_h3 : 'Heading 3',
-theme_h4 : 'Heading 4',
-theme_h5 : 'Heading 5',
-theme_h6 : 'Heading 6',
-theme_blockquote : 'Blockquote',
-theme_code : 'Code',
-theme_samp : 'Code sample',
-theme_dt : 'Definition term ',
-theme_dd : 'Definition description',
-theme_colorpicker_title : 'Select a color',
-theme_colorpicker_apply : 'Apply',
-theme_forecolor_desc : 'Select text color',
-theme_backcolor_desc : 'Select background color',
-theme_charmap_title : 'Select custom character',
-theme_charmap_desc : 'Insert custom character',
-theme_visualaid_desc : 'Toggle guidelines/invisible elements',
-insert_anchor_title : 'Insert/edit anchor',
-insert_anchor_name : 'Anchor name',
-theme_anchor_desc : 'Insert/edit anchor',
-theme_insert_link_titlefield : 'Title',
-theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',
-theme_path : 'Path',
-cut_desc : 'Cut',
-copy_desc : 'Copy',
-paste_desc : 'Paste',
-link_list : 'Link list',
-image_list : 'Image list',
-browse : 'Browse',
-image_props_desc : 'Image properties',
-newdocument_desc : 'New document',
-class_name : 'Class',
-newdocument : 'Are you sure you want clear all contents?',
-about_title : 'About TinyMCE',
-about : 'About',
-license : 'License',
-plugins : 'Plugins',
-plugin : 'Plugin',
-author : 'Author',
-version : 'Version',
-loaded_plugins : 'Loaded plugins',
-help : 'Help',
-not_set : '-- Not set --',
-close : 'Close',
-toolbar_focus : 'Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X',
-invalid_data : 'Error: Invalid values entered, these are marked in red.',
-more_colors : 'More colors',
-color_picker_tab : 'Picker',
-color_picker : 'Color picker',
-web_colors_tab : 'Web safe',
-web_colors : 'Web safe colors',
-named_colors_tab : 'Named',
-named_colors : 'Named colors',
-color : 'Color:',
-color_name : 'Name:'
-});
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/link.htm 2.5.src/wp-includes/js/tinymce/themes/advanced/link.htm
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/link.htm	2006-03-30 01:50:33.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/link.htm	2008-03-24 11:18:30.000000000 -0500
@@ -1,17 +1,19 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-	<title>{$lang_insert_link_title}</title>
-	<script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
-	<script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>
-	<script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>
-	<script language="javascript" type="text/javascript" src="jscripts/link.js"></script>
+	<title>{#advanced_dlg.link_title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script type="text/javascript" src="../../utils/form_utils.js"></script>
+	<script type="text/javascript" src="../../utils/validate.js"></script>
+	<script type="text/javascript" src="js/link.js"></script>
 	<base target="_self" />
 </head>
-<body id="link" onload="tinyMCEPopup.executeOnLoad('init();');document.body.style.display='';document.getElementById('href').focus();" style="display: none">
-<form onsubmit="insertLink();return false;" action="#">
+<body id="link" style="display: none">
+<form onsubmit="LinkDialog.update();return false;" action="#">
 	<div class="tabs">
 		<ul>
-			<li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_insert_link_title}</a></span></li>
+			<li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advanced_dlg.link_title}</a></span></li>
 		</ul>
 	</div>
 
@@ -20,79 +22,41 @@
 
 		<table border="0" cellpadding="4" cellspacing="0">
           <tr>
-            <td nowrap="nowrap"><label for="href">{$lang_insert_link_url}</label></td>
+            <td nowrap="nowrap"><label for="href">{#advanced_dlg.link_url}</label></td>
             <td><table border="0" cellspacing="0" cellpadding="0"> 
 				  <tr> 
-					<td><input id="href" name="href" type="text" value="" style="width: 200px" /></td> 
+					<td><input id="href" name="href" type="text" class="mceFocus" value="http://" style="width: 200px" /></td> 
 					<td id="hrefbrowsercontainer">&nbsp;</td>
 				  </tr> 
 				</table></td>
           </tr>
-		  <!-- Link list -->
-		  <script language="javascript">
-			if (typeof(tinyMCELinkList) != "undefined" && tinyMCELinkList.length > 0) {
-				var html = "";
-
-				html += '<tr><td><label for="link_list">{$lang_link_list}</label></td>';
-				html += '<td><select id="link_list" name="link_list" style="width: 200px" onchange="this.form.href.value=this.options[this.selectedIndex].value;">';
-				html += '<option value="">---</option>';
-
-				for (var i=0; i<tinyMCELinkList.length; i++)
-					html += '<option value="' + tinyMCELinkList[i][1] + '">' + tinyMCELinkList[i][0] + '</option>';
-
-				html += '</select></td></tr>';
-
-				document.write(html);
-			}
-		  </script>
-		  <!-- /Link list -->
-          <tr>
-            <td nowrap="nowrap"><label for="target">{$lang_insert_link_target}</label></td>
-            <td><select id="target" name="target" style="width: 200px">
-                <option value="_self">{$lang_insert_link_target_same}</option>
-                <option value="_blank">{$lang_insert_link_target_blank}</option>
-				<script language="javascript">
-					var html = "";
-					var targets = tinyMCE.getParam('theme_advanced_link_targets', '').split(';');
-
-					for (var i=0; i<targets.length; i++) {
-						var key, value;
-
-						if (targets[i] == "")
-							continue;
-
-						key = targets[i].split('=')[0];
-						value = targets[i].split('=')[1];
-
-						html += '<option value="' + value + '">' + key + '</option>';
-					}
-
-					document.write(html);
-				</script>
-            </select></td>
-          </tr>
+		  <tr>
+			<td><label for="link_list">{#advanced_dlg.link_list}</label></td>
+			<td><select id="link_list" name="link_list" onchange="document.getElementById('href').value=this.options[this.selectedIndex].value;"></select></td>
+		  </tr>
+		<tr>
+			<td><label id="targetlistlabel" for="targetlist">{#advanced_dlg.link_target}</label></td>
+			<td><select id="target_list" name="target_list"></select></td>
+		</tr>
           <tr>
-            <td nowrap="nowrap"><label for="linktitle">{$lang_theme_insert_link_titlefield}</label></td>
-            <td><input id="linktitle" name="linktitle" type="text" value="" style="width: 200px"></td>
-          </tr>
-          <tr id="styleSelectRow">
-            <td><label for="styleSelect">{$lang_class_name}</label></td>
-            <td>
-			 <select id="styleSelect" name="styleSelect">
-                <option value="" selected>{$lang_theme_style_select}</option>
-             </select></td>
+            <td nowrap="nowrap"><label for="linktitle">{#advanced_dlg.link_titlefield}</label></td>
+            <td><input id="linktitle" name="linktitle" type="text" value="" style="width: 200px" /></td>
           </tr>
+			<tr>
+				<td><label for="class_list">{#class_name}</label></td>
+				<td><select id="class_list" name="class_list"></select></td>
+			</tr>
         </table>
 		</div>
 	</div>
 
 	<div class="mceActionPanel">
 		<div style="float: left">
-			<input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />
+			<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
 		</div>
 
 		<div style="float: right">
-			<input type="submit" id="insert" name="insert" value="{$lang_insert}" onclick="insertLink();" />
+			<input type="submit" id="insert" name="insert" value="{#insert}" />
 		</div>
 	</div>
 </form>
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/default/content.css 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/default/content.css
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/default/content.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/default/content.css	2008-03-12 17:47:11.000000000 -0500
@@ -0,0 +1,25 @@
+body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;}
+body {background:#FFF;}
+body.mceForceColors {background:#FFF; color:#000;}
+h1 {font-size: 2em}
+h2 {font-size: 1.5em}
+h3 {font-size: 1.17em}
+h4 {font-size: 1em}
+h5 {font-size: .83em}
+h6 {font-size: .75em}
+.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;}
+a.mceItemAnchor {width:12px; line-height:6px; overflow:hidden; padding-left:12px; background:url(img/items.gif) no-repeat bottom left;}
+img.mceItemAnchor {width:12px; height:12px; background:url(img/items.gif) no-repeat;}
+img {border:0;}
+
+/* IE */
+* html body {
+scrollbar-3dlight-color:#F0F0EE;
+scrollbar-arrow-color:#676662;
+scrollbar-base-color:#F0F0EE;
+scrollbar-darkshadow-color:#DDD;
+scrollbar-face-color:#E0E0DD;
+scrollbar-highlight-color:#F0F0EE;
+scrollbar-shadow-color:#F0F0EE;
+scrollbar-track-color:#F5F5F5;
+}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/default/dialog.css 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/default/dialog.css
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/default/dialog.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/default/dialog.css	2008-02-21 15:40:25.000000000 -0600
@@ -0,0 +1,114 @@
+/* Generic */
+body {
+font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px;
+scrollbar-3dlight-color:#F0F0EE;
+scrollbar-arrow-color:#676662;
+scrollbar-base-color:#F0F0EE;
+scrollbar-darkshadow-color:#DDDDDD;
+scrollbar-face-color:#E0E0DD;
+scrollbar-highlight-color:#F0F0EE;
+scrollbar-shadow-color:#F0F0EE;
+scrollbar-track-color:#F5F5F5;
+background:#F0F0EE;
+padding:0;
+margin:8px 8px 0 8px;
+}
+
+html {background:#F0F0EE;}
+td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}
+textarea {resize:none;outline:none;}
+a:link, a:visited {color:black;}
+a:hover {color:#2B6FB6;}
+
+/* Forms */
+fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;}
+legend {color:#2B6FB6; font-weight:bold;}
+label.msg {display:none;}
+label.invalid {color:#EE0000; display:inline;}
+input.invalid {border:1px solid #EE0000;}
+input {background:#FFF; border:1px solid #CCC;}
+input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}
+input, select, textarea {border:1px solid #808080;}
+input.radio {border:1px none #000000; background:transparent; vertical-align:middle;}
+input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;}
+.input_noborder {border:0;}
+
+/* Buttons */
+#insert, #cancel, input.button, .updateButton {
+border:0; margin:0; padding:0;
+font-weight:bold;
+width:94px; height:26px;
+background:url(img/buttons.png) 0 -26px;
+cursor:pointer;
+padding-bottom:2px;
+}
+
+#insert {background:url(img/buttons.png) 0 -52px;}
+#cancel {background:url(img/buttons.png) 0 0;}
+
+/* Browse */
+a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;}
+.mceOldBoxModel a.browse span {width:22px; height:20px;}
+a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;}
+a.browse span.disabled {border:1px solid white; -moz-opacity:0.3; opacity:0.3; filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);}
+a.browse:hover span.disabled {border:1px solid white; background-color:transparent;}
+a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;}
+.mceOldBoxModel a.pickcolor span {width:21px; height:17px;}
+a.pickcolor:hover span {background-color:#B2BBD0;}
+a.pickcolor:hover span.disabled {}
+
+/* Charmap */
+table.charmap {border:1px solid #AAA; text-align:center}
+td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;}
+#charmap a {display:block; color:#000; text-decoration:none; border:0}
+#charmap a:hover {background:#CCC;color:#2B6FB6}
+#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center}
+#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center}
+
+/* Source */
+.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;}
+.mceActionPanel {margin-top:5px;}
+
+/* Tabs classes */
+.tabs {width:100%; height:18px; line-height:normal; background:url(img/tabs.gif) repeat-x 0 -72px;}
+.tabs ul {margin:0; padding:0; list-style:none;}
+.tabs li {float:left; background:url(img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;}
+.tabs li.current {background:url(img/tabs.gif) no-repeat 0 -18px; margin-right:2px;}
+.tabs span {float:left; display:block; background:url(img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;}
+.tabs .current span {background:url(img/tabs.gif) no-repeat right -54px;}
+.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;}
+.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;}
+
+/* Panels */
+.panel_wrapper div.panel {display:none;}
+.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;}
+.panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;}
+
+/* Columns */
+.column {float:left;}
+.properties {width:100%;}
+.properties .column1 {}
+.properties .column2 {text-align:left;}
+
+/* Titles */
+h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;}
+h3 {font-size:14px;}
+.title {font-size:12px; font-weight:bold; color:#2B6FB6;}
+
+/* Dialog specific */
+#link .panel_wrapper, #link div.current {height:125px;}
+#image .panel_wrapper, #image div.current {height:200px;}
+#plugintable thead {font-weight:bold; background:#DDD;}
+#plugintable, #about #plugintable td {border:1px solid #919B9C;}
+#plugintable {width:96%; margin-top:10px;}
+#pluginscontainer {height:290px; overflow:auto;}
+#colorpicker #preview {float:right; width:50px; height:14px;line-height:1px; border:1px solid black; margin-left:5px;}
+#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;}
+#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;}
+#colorpicker #light div {overflow:hidden;}
+#colorpicker #previewblock {float:right; padding-left:10px; height:20px;}
+#colorpicker .panel_wrapper div.current {height:175px;}
+#colorpicker #namedcolors {width:150px;}
+#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;}
+#colorpicker #colornamecontainer {margin-top:5px;}
+#colorpicker #picker_panel fieldset {margin:auto;width:325px;}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/default/img/buttons.png 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/default/img/buttons.png
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/default/img/buttons.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/default/img/buttons.png	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,12 @@
+PNG
+
+   
IHDR   ^   N   Q   gAMA  7   tEXtSoftware Adobe ImageReadyqe<  OPLTE!𴳲[[[^žu\
+apī'xxxlllHHH»***kkkܻĽǿ޾444JJJ׷ĻٹyyyzzzKKK߿]]]ȿvvvü^0}#999UUUBBB111KYYYᑢ9```nnnDY>>>rrrMMMӿtttgggċ%%%bq慅쑐1M  
+IDATxڴ_WG2ɄPTf"
Y I$	%W.UZRWE@^m]["ؾ眙ɤ৿o>999sTQQZ khA`_޾i#;GV+_C3D\#s;D܂Wzrᔋ;@F'񆄂 4JHӍ2M8?R-ׇ}wfS_UX\Jk	sC<"rWdX\eͺrjԅ$`6=}Ezz,YLR-=E_(TxG\{Ywuz\ GVXhqtzуzwb"5}Hu/ww*.NstvZU!@:$*=J뫫`Z߁씽ۭUjHWIIҞ,Mx¢U
+Abi
+{^
	{d^L8jҦ>Kwy QР+uj9ǃd
}{4a<
au:Odgs\a< {r7 豪I	DG+p<7^"%к&
+ʸbWW ރu<
0ڌUёJ*ѧK:DF!O_ʞ8%Jo\ ?l3fޜݘi𡚚T:LHM&55h?|;*Dvd9TdqҹS?N~cNC8;ٻ[#cݝ; ~t6Rn^ o0I9~[Z^ťşN;c?wu!|]]D=[!	(E쓋'/oPcWFe%Jʡ'Rn%T34AbK~ijH$dJʚ>;qmEjqġtY9*)ihqi0l~8o_\aٟ	e'QD&~f5/}e>6rYWǈjyforZor	+|z`؛*8>Y&g{:P\&2LOO92<<<B%50ʌZGG+UT2diqM~kgZ(
DSFF&gu_1&miiCD05HcJ{\pS[Ȍ4L0OOO9Оanq\KP,a%%AtN6:`8*x
^ ΜfjPz882$ӌ-j$ǲu
+^R6T{{6;Bթf>RE\%"׺/zgA协S)AQ`^ѣGB8:C/_jDLG13T8|Vټ fZ Yv|9ԩSDH4
+ЬSD(~PF
+

=EDCCQD%!-
?密՜[f# DnĔHJ
>̀1L0>ɌlvF[$86x/	)_)	b@<VEQL<4>5 aٔDk2OM=3E0}6t60/ߝ_"bջi[j,/_Jζ2:qx0>H׎	»aנ0<h^صkא`2^e pWypy".j:SZMOPiW?
+BV?q)ֺ3,,Thx0[w߹{[J[ov~>R(0	:?ޤ	(Shj4o0O
*44_=q"?asUi8K-H VVl_02D:,KKM8DDpnA8
v12
N2SrrFb9s=Pfi*M*IUR);a&jɵ8g4jF#[I !ia4Ti1&)'PS˦4XȉJ<]TicZABlRPbY#w=^Fĥ0Yd[/#Ui"0F~4J4y$UmARJr"Gb<'\@=68'	@RfKdcFfLUiñESwNU8&`o ~L*-0nҴXUEd#Vv- vWiߢJsmD
+#J{<@oENe؅U1 dx~q8B%R	m7[5KjbJ9?n+Sb_] i'k6ժmEǼTlݍdhR[^UƀWi[6(D2[F_ l0[    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/default/img/items.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/default/img/items.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/default/img/items.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/default/img/items.gif	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1 @@
+GIF89a       !   ,      @w&ڃq|a4b ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/default/img/menu_arrow.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/default/img/menu_arrow.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/default/img/menu_arrow.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/default/img/menu_arrow.gif	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1 @@
+GIF89a      !   ,       zq(׉* ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/default/img/menu_check.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/default/img/menu_check.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/default/img/menu_check.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/default/img/menu_check.gif	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1 @@
+GIF89a      !   ,       ;i#~ʶ{ ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/default/img/progress.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/default/img/progress.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/default/img/progress.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/default/img/progress.gif	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,9 @@
+GIF89a      򺺺444ėTTT   !NETSCAPE2.0   !   ,         I)KͧJJ5URK(&05+/mbp
z1;$1C I*	HCh`Ao"3qT5\8aBdwxG=YgwHbvA=0V\\;;H0t%HsrY<H.ŉbZbOEg:GY].=AOQs \bh.9=sgce*ֆf 7D  !   ,       rI
+5bRHhW*lkL&-)1-vm )Mt\RdAH̑ oƇ Gz{ !   ,      rIg@5
rYMQ!(((8ÜJKbr3h K!63u`&DAzfLZ*	^`nFOssyJ}TN.aqXshCXJ !   ,      i	Y4CvAMA"JjA'0T*bJII ZFPMM sbgqV$v!5	
+?}	 	 !   ,      ep80 #^qX
	[(\-S@ P0" LzxLՍϊ*Z_HDeU
+ywZt	n !   ,      A2WE&j׊B&w~6b8p`4r|FM>,bLv|?4BvʛPu9+&	2x&		k&	U]	vo
+opraT& !   ,     {	'e7\l-)S7@&4+`yTSL\:=Jk:;eĈ8cA8Oj@b/+:{	tyt#|-
+	mN	qK !   ,     lI+8b̠y h*Zp=3`C`B "p X	9bPB`Z=
+8>u,St"ΦOT\um|;
+8~* !   ,     xIA]GeAPb)"!s BIМV	5q((X2=,In#&AVq5t
+sny\)_g|r5 !   ,      gD+8[{`&y_hI)(L"+gN8l5"LA .%@%O@8NgL+Ƀpus/jȩjVjc7I !   ,     \0t p	hQm6Tqmx( 6'sa@`]-lz0 _gir!` !   ,      s	ءXP\|)pWʄQ稊G.}!*1 p v;Tݩ2X)|f%9`}0PFd~ezGw) ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/default/img/tabs.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/default/img/tabs.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/default/img/tabs.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/default/img/tabs.gif	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,6 @@
+GIF89a,Z      2Jb͑󡳻둛                     !  8 ,    ,Z  @da(Ȥrl:ШtJZج)xL.zn|N~""6#7$% !! 
+H*\ȰÇ#JHQ0hȱǏ CIɓ(S\ɲ˗-
h@͛8sɳ@
+JѣH5@SӧPJJիXjʵׯ`Êր	Ҫ]˶۷pʝKݻx˷_RLÈ+^̸ǐ#KL˘-ذϠCMӨS^ͺװc˞
+sͻNȓ+_μr-HNسkνËO
X˟OϿ h&J D(Vhfv ($hb,0(4h8<> DiH&6 PF)TJiǕXf\v%NV)V~ihkIU)tign©'w矀bzj衈&裐F&)饘f*Ʃ駠N)ꩨFJjQꫀꓰjz뮼z++lj&6,>+Vk
+öv+k覫&ko	 l'|p
,G,@gwLw,$|*l,
+/412۬<B9,DE''PGrOKmBXwu*docBl-/=x |7~nx*}K?8x[=y+}yyy褷<z験|zozKz'<K{|{{{ķ;|'7G/Wogw/o7 ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/default/ui.css 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/default/ui.css
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/default/ui.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/default/ui.css	2008-03-18 01:59:53.000000000 -0500
@@ -0,0 +1,210 @@
+/* Reset */
+.defaultSkin table, .defaultSkin tbody, .defaultSkin a, .defaultSkin img, .defaultSkin tr, .defaultSkin div, .defaultSkin td, .defaultSkin iframe, .defaultSkin span, .defaultSkin *, .defaultSkin .mceText {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline; width:auto; border-collapse:separate; text-align:left}
+.defaultSkin a:hover, .defaultSkin a:link, .defaultSkin a:visited, .defaultSkin a:active {text-decoration:none; font-weight:normal; cursor:default; color:#000}
+.defaultSkin table td {vertical-align:middle}
+
+/* Containers */
+.defaultSkin table {background:#F0F0EE}
+.defaultSkin iframe {display:block; background:#FFF}
+.defaultSkin .mceToolbar {height:26px}
+.defaultSkin .mceLeft {text-align:left}
+.defaultSkin .mceRight {text-align:right}
+
+/* External */
+.defaultSkin .mceExternalToolbar {position:absolute; border:1px solid #CCC; border-bottom:0; display:none;}
+.defaultSkin .mceExternalToolbar td.mceToolbar {padding-right:13px;}
+.defaultSkin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px; background:url(../../img/icons.gif) -820px 0}
+
+/* Layout */
+.defaultSkin table.mceLayout {border:0; border-left:1px solid #CCC; border-right:1px solid #CCC}
+.defaultSkin table.mceLayout tr.mceFirst td {border-top:1px solid #CCC}
+.defaultSkin table.mceLayout tr.mceLast td {border-bottom:1px solid #CCC}
+.defaultSkin table.mceToolbar, .defaultSkin tr.mceFirst .mceToolbar tr td, .defaultSkin tr.mceLast .mceToolbar tr td {border:0; margin:0; padding:0;}
+.defaultSkin td.mceToolbar {padding-top:1px; vertical-align:top}
+.defaultSkin .mceIframeContainer {border-top:1px solid #CCC; border-bottom:1px solid #CCC}
+.defaultSkin .mceStatusbar {font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; display:block; height:20px}
+.defaultSkin .mceStatusbar div {float:left; margin:2px}
+.defaultSkin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize}
+.defaultSkin .mceStatusbar a:hover {text-decoration:underline}
+.defaultSkin table.mceToolbar {margin-left:3px}
+.defaultSkin span.mceIcon, .defaultSkin img.mceIcon {display:block; width:20px; height:20px}
+.defaultSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px}
+.defaultSkin td.mceCenter {text-align:center;}
+.defaultSkin td.mceCenter table {margin:0 auto; text-align:left;}
+.defaultSkin td.mceRight table {margin:0 0 0 auto;}
+
+/* Button */
+.defaultSkin .mceButton {display:block; border:1px solid #F0F0EE; width:20px; height:20px; margin-right:1px;}
+.defaultSkin a.mceButtonEnabled:hover {border:1px solid #0A246A; background-color:#B2BBD0}
+.defaultSkin a.mceButtonActive, .defaultSkin a.mceButtonSelected {border:1px solid #0A246A; background-color:#C2CBE0}
+.defaultSkin .mceButtonDisabled .mceIcon {opacity:0.3; filter:alpha(opacity=30)}
+
+/* Separator */
+.defaultSkin .mceSeparator {display:block; background:url(../../img/icons.gif) -180px 0; width:2px; height:20px; margin:2px 2px 0 4px}
+
+/* ListBox */
+.defaultSkin .mceListBox, .defaultSkin .mceListBox a {display:block}
+.defaultSkin .mceListBox .mceText {padding-left:4px; width:70px; text-align:left; border:1px solid #CCC; border-right:0; background:#FFF; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; height:20px; line-height:20px; overflow:hidden}
+.defaultSkin .mceListBox .mceOpen {width:9px; height:20px; background:url(../../img/icons.gif) -741px 0; margin-right:2px; border:1px solid #CCC;}
+.defaultSkin table.mceListBoxEnabled:hover .mceText, .defaultSkin .mceListBoxHover .mceText, .defaultSkin .mceListBoxSelected .mceText {border:1px solid #A2ABC0; border-right:0; background:#FFF}
+.defaultSkin table.mceListBoxEnabled:hover .mceOpen, .defaultSkin .mceListBoxHover .mceOpen, .defaultSkin .mceListBoxSelected .mceOpen {background-color:#FFF; border:1px solid #A2ABC0}
+.defaultSkin .mceListBoxDisabled a.mceText {color:gray; background-color:transparent;}
+.defaultSkin .mceListBoxMenu {overflow:auto; overflow-x:hidden}
+.defaultSkin .mceOldBoxModel .mceListBox .mceText {height:22px}
+.defaultSkin .mceOldBoxModel .mceListBox .mceOpen {width:11px; height:22px;}
+.defaultSkin select.mceNativeListBox {font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:7pt; background:#F0F0EE; border:1px solid gray; margin-right:2px;}
+
+/* SplitButton */
+.defaultSkin .mceSplitButton {width:32px; height:20px}
+.defaultSkin .mceSplitButton a, .defaultSkin .mceSplitButton span {height:20px; display:block}
+.defaultSkin .mceSplitButton a.mceAction {width:20px; border:1px solid #F0F0EE; border-right:0;}
+.defaultSkin .mceSplitButton span.mceAction {width:20px; background:url(../../img/icons.gif) 20px 20px;}
+.defaultSkin .mceSplitButton a.mceOpen {width:9px; border:1px solid #F0F0EE;}
+.defaultSkin .mceSplitButton span.mceOpen {width:9px; background:url(../../img/icons.gif) -741px 0;}
+.defaultSkin table.mceSplitButtonEnabled:hover a.mceAction, .defaultSkin .mceSplitButtonHover a.mceAction, .defaultSkin .mceSplitButtonSelected a.mceAction {border:1px solid #0A246A; border-right:0; background-color:#B2BBD0}
+.defaultSkin table.mceSplitButtonEnabled:hover a.mceOpen, .defaultSkin .mceSplitButtonHover a.mceOpen, .defaultSkin .mceSplitButtonSelected a.mceOpen {border:1px solid #0A246A;}
+.defaultSkin table.mceSplitButtonEnabled:hover span.mceOpen, .defaultSkin .mceSplitButtonHover span.mceOpen, .defaultSkin .mceSplitButtonSelected span.mceOpen {background-color:#B2BBD0}
+.defaultSkin .mceSplitButtonDisabled .mceAction, .defaultSkin .mceSplitButtonDisabled span.mceOpen {opacity:0.3; filter:alpha(opacity=30)}
+.defaultSkin .mceSplitButtonActive a.mceAction {border:1px solid #0A246A; background-color:#C2CBE0}
+.defaultSkin .mceSplitButtonActive a.mceOpen {border-left:0;}
+
+/* ColorSplitButton */
+.defaultSkin div.mceColorSplitMenu table {background:#FFF; border:1px solid gray}
+.defaultSkin .mceColorSplitMenu td {padding:2px}
+.defaultSkin .mceColorSplitMenu a {display:block; width:9px; height:9px; overflow:hidden; border:1px solid #808080}
+.defaultSkin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px}
+.defaultSkin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF}
+.defaultSkin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid #0A246A; background-color:#B6BDD2}
+.defaultSkin a.mceMoreColors:hover {border:1px solid #0A246A}
+.defaultSkin .mceColorPreview {margin-left:2px; width:16px; height:4px; overflow:hidden; background:#9a9b9a}
+.defaultSkin .mce_forecolor span.mceAction, .defaultSkin .mce_backcolor span.mceAction {overflow:hidden; height:16px}
+
+/* Menu */
+.defaultSkin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid #D4D0C8}
+.defaultSkin .mceNoIcons span.mceIcon {width:0;}
+.defaultSkin .mceNoIcons a .mceText {padding-left:10px}
+.defaultSkin .mceMenu table {background:#FFF}
+.defaultSkin .mceMenu a, .defaultSkin .mceMenu span, .defaultSkin .mceMenu {display:block}
+.defaultSkin .mceMenu td {height:20px}
+.defaultSkin .mceMenu a {position:relative;padding:3px 0 4px 0}
+.defaultSkin .mceMenu .mceText {position:relative; display:block; font-family:Tahoma,Verdana,Arial,Helvetica; color:#000; cursor:default; margin:0; padding:0 25px 0 25px; display:block}
+.defaultSkin .mceMenu span.mceText, .defaultSkin .mceMenu .mcePreview {font-size:11px}
+.defaultSkin .mceMenu pre.mceText {font-family:Monospace}
+.defaultSkin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:22px;}
+.defaultSkin .mceMenu .mceMenuItemEnabled a:hover, .defaultSkin .mceMenu .mceMenuItemActive {background-color:#dbecf3}
+.defaultSkin td.mceMenuItemSeparator {background:#DDD; height:1px}
+.defaultSkin .mceMenuItemTitle a {border:0; background:#EEE; border-bottom:1px solid #DDD}
+.defaultSkin .mceMenuItemTitle span.mceText {color:#000; font-weight:bold; padding-left:4px}
+.defaultSkin .mceMenuItemDisabled .mceText {color:#888}
+.defaultSkin .mceMenuItemSelected .mceIcon {background:url(img/menu_check.gif)}
+.defaultSkin .mceNoIcons .mceMenuItemSelected a {background:url(img/menu_arrow.gif) no-repeat -6px center}
+.defaultSkin .mceMenu span.mceMenuLine {display:none}
+.defaultSkin .mceMenuItemSub a {background:url(img/menu_arrow.gif) no-repeat top right;}
+
+/* Progress,Resize */
+.defaultSkin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; filter:alpha(opacity=50); background:#FFF}
+.defaultSkin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px}
+.defaultSkin .mcePlaceHolder {border:1px dotted gray}
+
+/* Formats */
+.defaultSkin .mce_formatPreview a {font-size:10px}
+.defaultSkin .mce_p span.mceText {}
+.defaultSkin .mce_address span.mceText {font-style:italic}
+.defaultSkin .mce_pre span.mceText {font-family:monospace}
+.defaultSkin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em}
+.defaultSkin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em}
+.defaultSkin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em}
+.defaultSkin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em}
+.defaultSkin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em}
+.defaultSkin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em}
+
+/* Theme */
+.defaultSkin span.mce_bold {background-position:0 0}
+.defaultSkin span.mce_italic {background-position:-60px 0}
+.defaultSkin span.mce_underline {background-position:-140px 0}
+.defaultSkin span.mce_strikethrough {background-position:-120px 0}
+.defaultSkin span.mce_undo {background-position:-160px 0}
+.defaultSkin span.mce_redo {background-position:-100px 0}
+.defaultSkin span.mce_cleanup {background-position:-40px 0}
+.defaultSkin span.mce_bullist {background-position:-20px 0}
+.defaultSkin span.mce_numlist {background-position:-80px 0}
+.defaultSkin span.mce_justifyleft {background-position:-460px 0}
+.defaultSkin span.mce_justifyright {background-position:-480px 0}
+.defaultSkin span.mce_justifycenter {background-position:-420px 0}
+.defaultSkin span.mce_justifyfull {background-position:-440px 0}
+.defaultSkin span.mce_anchor {background-position:-200px 0}
+.defaultSkin span.mce_indent {background-position:-400px 0}
+.defaultSkin span.mce_outdent {background-position:-540px 0}
+.defaultSkin span.mce_link {background-position:-500px 0}
+.defaultSkin span.mce_unlink {background-position:-640px 0}
+.defaultSkin span.mce_sub {background-position:-600px 0}
+.defaultSkin span.mce_sup {background-position:-620px 0}
+.defaultSkin span.mce_removeformat {background-position:-580px 0}
+.defaultSkin span.mce_newdocument {background-position:-520px 0}
+.defaultSkin span.mce_image {background-position:-380px 0}
+.defaultSkin span.mce_help {background-position:-340px 0}
+.defaultSkin span.mce_code {background-position:-260px 0}
+.defaultSkin span.mce_hr {background-position:-360px 0}
+.defaultSkin span.mce_visualaid {background-position:-660px 0}
+.defaultSkin span.mce_charmap {background-position:-240px 0}
+.defaultSkin span.mce_paste {background-position:-560px 0}
+.defaultSkin span.mce_copy {background-position:-700px 0}
+.defaultSkin span.mce_cut {background-position:-680px 0}
+.defaultSkin span.mce_blockquote {background-position:-220px 0}
+.defaultSkin .mce_forecolor span.mceAction {background-position:-720px 0}
+.defaultSkin .mce_backcolor span.mceAction {background-position:-760px 0}
+.defaultSkin .mce_forecolorpicker {background-position:-720px 0}
+.defaultSkin .mce_backcolorpicker {background-position:-760px 0}
+
+/* Plugins */
+.defaultSkin span.mce_advhr {background-position:-0px -20px}
+.defaultSkin span.mce_ltr {background-position:-20px -20px}
+.defaultSkin span.mce_rtl {background-position:-40px -20px}
+.defaultSkin span.mce_emotions {background-position:-60px -20px}
+.defaultSkin span.mce_fullpage {background-position:-80px -20px}
+.defaultSkin span.mce_fullscreen {background-position:-100px -20px}
+.defaultSkin span.mce_iespell {background-position:-120px -20px}
+.defaultSkin span.mce_insertdate {background-position:-140px -20px}
+.defaultSkin span.mce_inserttime {background-position:-160px -20px}
+.defaultSkin span.mce_absolute {background-position:-180px -20px}
+.defaultSkin span.mce_backward {background-position:-200px -20px}
+.defaultSkin span.mce_forward {background-position:-220px -20px}
+.defaultSkin span.mce_insert_layer {background-position:-240px -20px}
+.defaultSkin span.mce_insertlayer {background-position:-260px -20px}
+.defaultSkin span.mce_movebackward {background-position:-280px -20px}
+.defaultSkin span.mce_moveforward {background-position:-300px -20px}
+.defaultSkin span.mce_media {background-position:-320px -20px}
+.defaultSkin span.mce_nonbreaking {background-position:-340px -20px}
+.defaultSkin span.mce_pastetext {background-position:-360px -20px}
+.defaultSkin span.mce_pasteword {background-position:-380px -20px}
+.defaultSkin span.mce_selectall {background-position:-400px -20px}
+.defaultSkin span.mce_preview {background-position:-420px -20px}
+.defaultSkin span.mce_print {background-position:-440px -20px}
+.defaultSkin span.mce_cancel {background-position:-460px -20px}
+.defaultSkin span.mce_save {background-position:-480px -20px}
+.defaultSkin span.mce_replace {background-position:-500px -20px}
+.defaultSkin span.mce_search {background-position:-520px -20px}
+.defaultSkin span.mce_styleprops {background-position:-560px -20px}
+.defaultSkin span.mce_table {background-position:-580px -20px}
+.defaultSkin span.mce_cell_props {background-position:-600px -20px}
+.defaultSkin span.mce_delete_table {background-position:-620px -20px}
+.defaultSkin span.mce_delete_col {background-position:-640px -20px}
+.defaultSkin span.mce_delete_row {background-position:-660px -20px}
+.defaultSkin span.mce_col_after {background-position:-680px -20px}
+.defaultSkin span.mce_col_before {background-position:-700px -20px}
+.defaultSkin span.mce_row_after {background-position:-720px -20px}
+.defaultSkin span.mce_row_before {background-position:-740px -20px}
+.defaultSkin span.mce_merge_cells {background-position:-760px -20px}
+.defaultSkin span.mce_table_props {background-position:-980px -20px}
+.defaultSkin span.mce_row_props {background-position:-780px -20px}
+.defaultSkin span.mce_split_cells {background-position:-800px -20px}
+.defaultSkin span.mce_template {background-position:-820px -20px}
+.defaultSkin span.mce_visualchars {background-position:-840px -20px}
+.defaultSkin span.mce_abbr {background-position:-860px -20px}
+.defaultSkin span.mce_acronym {background-position:-880px -20px}
+.defaultSkin span.mce_attribs {background-position:-900px -20px}
+.defaultSkin span.mce_cite {background-position:-920px -20px}
+.defaultSkin span.mce_del {background-position:-940px -20px}
+.defaultSkin span.mce_ins {background-position:-960px -20px}
+.defaultSkin span.mce_pagebreak {background-position:0 -40px}
+.defaultSkin .mce_spellchecker span.mceAction {background-position:-540px -20px}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/content.css 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/content.css
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/content.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/content.css	2008-03-12 17:47:11.000000000 -0500
@@ -0,0 +1,25 @@
+body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;}
+body {background:#FFF;}
+body.mceForceColors {background:#FFF; color:#000;}
+h1 {font-size: 2em}
+h2 {font-size: 1.5em}
+h3 {font-size: 1.17em}
+h4 {font-size: 1em}
+h5 {font-size: .83em}
+h6 {font-size: .75em}
+.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;}
+a.mceItemAnchor {width:12px; line-height:6px; overflow:hidden; padding-left:12px; background:url(../default/img/items.gif) no-repeat bottom left;}
+img.mceItemAnchor {width:12px; height:12px; background:url(../default/img/items.gif) no-repeat;}
+img {border:0;}
+
+/* IE */
+* html body {
+scrollbar-3dlight-color:#F0F0EE;
+scrollbar-arrow-color:#676662;
+scrollbar-base-color:#F0F0EE;
+scrollbar-darkshadow-color:#DDD;
+scrollbar-face-color:#E0E0DD;
+scrollbar-highlight-color:#F0F0EE;
+scrollbar-shadow-color:#F0F0EE;
+scrollbar-track-color:#F5F5F5;
+}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/dialog.css 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/dialog.css
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/dialog.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/dialog.css	2008-02-21 15:40:25.000000000 -0600
@@ -0,0 +1,113 @@
+/* Generic */
+body {
+font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px;
+scrollbar-3dlight-color:#F0F0EE;
+scrollbar-arrow-color:#676662;
+scrollbar-base-color:#F0F0EE;
+scrollbar-darkshadow-color:#DDDDDD;
+scrollbar-face-color:#E0E0DD;
+scrollbar-highlight-color:#F0F0EE;
+scrollbar-shadow-color:#F0F0EE;
+scrollbar-track-color:#F5F5F5;
+background:#F0F0EE;
+padding:0;
+margin:8px 8px 0 8px;
+}
+
+html {background:#F0F0EE;}
+td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}
+textarea {resize:none;outline:none;}
+a:link, a:visited {color:black;}
+a:hover {color:#2B6FB6;}
+
+/* Forms */
+fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;}
+legend {color:#2B6FB6; font-weight:bold;}
+label.msg {display:none;}
+label.invalid {color:#EE0000; display:inline;}
+input.invalid {border:1px solid #EE0000;}
+input {background:#FFF; border:1px solid #CCC;}
+input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}
+input, select, textarea {border:1px solid #808080;}
+input.radio {border:1px none #000000; background:transparent; vertical-align:middle;}
+input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;}
+.input_noborder {border:0;}
+
+/* Buttons */
+#insert, #cancel, input.button, .updateButton {
+border:0; margin:0; padding:0;
+font-weight:bold;
+width:94px; height:26px;
+background:url(../default/img/buttons.png) 0 -26px;
+cursor:pointer;
+padding-bottom:2px;
+}
+
+#insert {background:url(../default/img/buttons.png) 0 -52px;}
+#cancel {background:url(../default/img/buttons.png) 0 0;}
+
+/* Browse */
+a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;}
+.mceOldBoxModel a.browse span {width:22px; height:20px;}
+a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;}
+a.browse span.disabled {border:1px solid white; -moz-opacity:0.3; opacity:0.3; filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);}
+a.browse:hover span.disabled {border:1px solid white; background-color:transparent;}
+a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;}
+.mceOldBoxModel a.pickcolor span {width:21px; height:17px;}
+a.pickcolor:hover span {background-color:#B2BBD0;}
+a.pickcolor:hover span.disabled {}
+
+/* Charmap */
+table.charmap {border:1px solid #AAA; text-align:center}
+td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;}
+#charmap a {display:block; color:#000; text-decoration:none; border:0}
+#charmap a:hover {background:#CCC;color:#2B6FB6}
+#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center}
+#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center}
+
+/* Source */
+.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;}
+.mceActionPanel {margin-top:5px;}
+
+/* Tabs classes */
+.tabs {width:100%; height:18px; line-height:normal; background:url(../default/img/tabs.gif) repeat-x 0 -72px;}
+.tabs ul {margin:0; padding:0; list-style:none;}
+.tabs li {float:left; background:url(../default/img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;}
+.tabs li.current {background:url(../default/img/tabs.gif) no-repeat 0 -18px; margin-right:2px;}
+.tabs span {float:left; display:block; background:url(../default/img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;}
+.tabs .current span {background:url(../default/img/tabs.gif) no-repeat right -54px;}
+.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;}
+.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;}
+
+/* Panels */
+.panel_wrapper div.panel {display:none;}
+.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;}
+.panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;}
+
+/* Columns */
+.column {float:left;}
+.properties {width:100%;}
+.properties .column1 {}
+.properties .column2 {text-align:left;}
+
+/* Titles */
+h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;}
+h3 {font-size:14px;}
+.title {font-size:12px; font-weight:bold; color:#2B6FB6;}
+
+/* Dialog specific */
+#link .panel_wrapper, #link div.current {height:125px;}
+#image .panel_wrapper, #image div.current {height:200px;}
+#plugintable thead {font-weight:bold; background:#DDD;}
+#plugintable, #about #plugintable td {border:1px solid #919B9C;}
+#plugintable {width:96%; margin-top:10px;}
+#pluginscontainer {height:290px; overflow:auto;}
+#colorpicker #preview {float:right; width:50px; height:14px;line-height:1px; border:1px solid black; margin-left:5px;}
+#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;}
+#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;}
+#colorpicker #light div {overflow:hidden;}
+#colorpicker #previewblock {float:right; padding-left:10px; height:20px;}
+#colorpicker .panel_wrapper div.current {height:175px;}
+#colorpicker #namedcolors {width:150px;}
+#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;}
+#colorpicker #colornamecontainer {margin-top:5px;}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/img/button_bg.png 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/img/button_bg.png
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/img/button_bg.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/img/button_bg.png	2008-01-17 09:44:05.000000000 -0600
@@ -0,0 +1,20 @@
+PNG
+
+   
IHDR   X   B      	pHYs       
+OiCCPPhotoshop ICC profile  xڝSgTS=BKKoR RB&*!	J!QEEȠQ,
+!{kּ>H3Q5B.@
+$p d!s# ~<<+" x M0B\t8K @zB @F&S  `cb P- `' { [!  eD h; VE X0 fK9 - 0IWfH    0Q) { `##x  FW<+*  x<$9E[-qWW.(I+6aa@.y24  x6_-"bbϫp@  t~,/;m%h^uf@ Wp~<<EJB[aW}g_Wl~<$2]GLϒ	bG"IbX*QqD2"B)%d,>5 j>{-]cK'Xt  o(hw?G% fIq  ^D$.Tʳ?  D*A,`6B$BB
+dr`)B(Ͱ*`/@4Qhp.U=pa(	Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F; 2G1Q=C7Fdt1r=6Ыhڏ>C03l0.B8,	c˱"VcϱwE	6wB aAHXLXNH $4	7	Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![
+b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw
ǈg(gwLӋT071oUX**|
+J&*/TުUUT^S}FU3S	ԖUPSSg;goT?~YYLOCQ_ cx,!k
u5&|v*=9C3J3WRf?qtN	(~))4L1e\kXHQG6EYAJ'\'GgSSݧ
+M=:.kDwn^Loy}/TmGX$<5qo</QC]@Caaᄑ<FFi\$mmƣ&&!&KMMRM);L;L֙͢5=12כ߷`ZxZ,eIZYnZ9YXUZ]F%ֻNNgðɶۮm}agbgŮ}}=
Z~sr:V:ޚΜ?}/gX3)iSGggs󈋉K.>.ȽJtq]zۯ6iܟ4)Y3sCQ?0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz %gA[z|!?:eAAA!h쐭!ΑiP~aa~'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl{/]py.,:@LN8A*%w%
+yg"/6шC\*NH*Mz쑼5y$3,幄'L
Lݛ:v m2=:1qB!Mggfvˬen/kY-
+BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9<qy
++V<*mOW~&zMk^ʂkU
+}]OX/Yߵa>(xoʿܔĹdff-[n
ڴ
VE/(ۻC<e;?TTTT6ݵan{4[>ɾUUMfeI?m]Nmq#׹=TR+Gw-
6
U#pDy	
:v{vg/jBFS[b[O>zG4<YyJTiӓgό}~.`ۢ{cjotE;;\tWW:_mt<Oǻ\kz{f7y՞9=ݽzo~r'˻w'O_@AC݇?[jwGCˆ
8>99?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-   gAMA  |Q    cHRM  z%        u0  `  :  o_F   PLTE   Ι߃ÃÄĄÛ࠼䕯ՠ▯ԸV}⟻ᠼ⠻ܟޠޟݴIMMNNV`defjvߍux|܁܃كڄڄߋߍyyxzلutvu_`hji·͆ψUVWW`Ԙبڪʴɴ٩۶ڵʴɳӵӵڵ8D   tRNS S%  IDATxڔ\g-BZ}X]IumXn3Ar\_cozY		$27J`2(du")@l\<+y^w}Cߪu\}>[r+++>⍽*+ҒqR[)(im aP)ķr*++dC$_5ZoȩɀRpqM}M}="@s*q #$ $$ {ꔎ0܄ y$IDHAHAH<fەD0&`AIG $j΀%w GjAD,Ҏ!w6\PqQ8wXm&8   O  (***J
ۇaab}0ۛekT1aM &{ i  ]XXX؀Gq5`@qwіyM.X,bn
(8pE
(7XV\ZZZZTZZZvF6FMfɼd6MfS~,h{e/j`ؔo2rsd2̦Ckm{#
+͇eWYۭx\Uu*T_oϡTr7@AjD!$= N.mw@A;TTX**,
+rłw˥CPЎJQG(+u(JrJ;~{`Ph*....>P,9GqoJA	 8HD	AX)2෥z}NuzEŲSAL+unpwvg"O靟J~aeavQ;57_~x<^iga<7a/=n9~ni{KbؕSRSi h
=קw:Apo0H(
+`(
+C!qn\3P(
+5B2ԩ4r76666v^\KUIohOzzY/eY/zgX  T[  C3,^/˲
+  :==4 HVּW*8
44
+)ǞIX=1114xfffg?1,_ u)
\:<?qV
3I>;S)xyqq2/~
f#H4DHDpQ$Wex.7t|?@>__uBpߨ9q9wntttT~R+W`䞃Fq"=*}Y޴[j'4GD^2|00M$I$H$O/$/gJ+zF~]P[Rd'Nhׯm\۸M1mJSߒԆVV*~X]][[U;A]mxy~*<yo'ίx\AS!ByS_B\xG>/sm8	  U΁   OjKKKKK @[YVbbJ,SMҀiWyyq]\y*U4444D


Hq<7-s_Ԩ6D#sHdv6DhT}ᑴĉ7??iÁ?|}?_OaWhu\.lu8]V6.?kNr9.p\NTqRᛀNr9.Gt:T᧓}tbBdWwWɮ'T$u6LDI	ADo4G/gJ+ 6r>w    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/img/button_bg_black.png 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/img/button_bg_black.png
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/img/button_bg_black.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/img/button_bg_black.png	2008-03-12 17:47:11.000000000 -0500
@@ -0,0 +1,15 @@
+PNG
+
+   
IHDR   X   B      	pHYs       
+OiCCPPhotoshop ICC profile  xڝSgTS=BKKoR RB&*!	J!QEEȠQ,
+!{kּ>H3Q5B.@
+$p d!s# ~<<+" x M0B\t8K @zB @F&S  `cb P- `' { [!  eD h; VE X0 fK9 - 0IWfH    0Q) { `##x  FW<+*  x<$9E[-qWW.(I+6aa@.y24  x6_-"bbϫp@  t~,/;m%h^uf@ Wp~<<EJB[aW}g_Wl~<$2]GLϒ	bG"IbX*QqD2"B)%d,>5 j>{-]cK'Xt  o(hw?G% fIq  ^D$.Tʳ?  D*A,`6B$BB
+dr`)B(Ͱ*`/@4Qhp.U=pa(	Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F; 2G1Q=C7Fdt1r=6Ыhڏ>C03l0.B8,	c˱"VcϱwE	6wB aAHXLXNH $4	7	Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![
+b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw
ǈg(gwLӋT071oUX**|
+J&*/TުUUT^S}FU3S	ԖUPSSg;goT?~YYLOCQ_ cx,!k
u5&|v*=9C3J3WRf?qtN	(~))4L1e\kXHQG6EYAJ'\'GgSSݧ
+M=:.kDwn^Loy}/TmGX$<5qo</QC]@Caaᄑ<FFi\$mmƣ&&!&KMMRM);L;L֙͢5=12כ߷`ZxZ,eIZYnZ9YXUZ]F%ֻNNgðɶۮm}agbgŮ}}=
Z~sr:V:ޚΜ?}/gX3)iSGggs󈋉K.>.ȽJtq]zۯ6iܟ4)Y3sCQ?0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz %gA[z|!?:eAAA!h쐭!ΑiP~aa~'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl{/]py.,:@LN8A*%w%
+yg"/6шC\*NH*Mz쑼5y$3,幄'L
Lݛ:v m2=:1qB!Mggfvˬen/kY-
+BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9<qy
++V<*mOW~&zMk^ʂkU
+}]OX/Yߵa>(xoʿܔĹdff-[n
ڴ
VE/(ۻC<e;?TTTT6ݵan{4[>ɾUUMfeI?m]Nmq#׹=TR+Gw-
6
U#pDy	
:v{vg/jBFS[b[O>zG4<YyJTiӓgό}~.`ۢ{cjotE;;\tWW:_mt<Oǻ\kz{f7y՞9=ݽzo~r'˻w'O_@AC݇?[jwGCˆ
8>99?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-   gAMA  |Q    cHRM  z%        u0  `  :  o_F  IDATx[kA~^J)4PR"Ƴ^XJЂP5"fŴjQEVh1XfCM&dfwM6{͛~y3q^}/`2U֟O\;睨q_omk回wqk{oA5A g2+qQ'ƭ,+D I^u+qQmy;5y&U04쯚"&-4쯚 `[ 5-3]#5-311XXs)sok9ėkR՘"{Z""ATFb]cB=&ZsUBDD^abשѵu}uC<Y_uƖU~`?&[Zil_5g0`܃߃_b/פݝ]aTGːIbJ+"fOlmC͍'Ol8upXtqӟ'B vneeTh]6p˽}>?f}l jpP'(Vjr6EA*3`0`paEnљ~\|Πg7#2T@/`RU&ªɠofdp%F |G(5*Y_CTWaQ-hթTɉxz3PWe>EX9EE$t`H^W2mי}b ``V$ y#;pFO*;*VXPUFҚZUW8m@tFQjM,c:
+8R0`[g> V3=[n#U9KQLGe[D@;-BDl2$)<T=-ڶ$)D5UZSˁUs pޫ    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/img/button_bg_silver.png 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/img/button_bg_silver.png
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/img/button_bg_silver.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/img/button_bg_silver.png	2008-03-12 17:47:11.000000000 -0500
@@ -0,0 +1,28 @@
+PNG
+
+   
IHDR   X   B      	pHYs       
+OiCCPPhotoshop ICC profile  xڝSgTS=BKKoR RB&*!	J!QEEȠQ,
+!{kּ>H3Q5B.@
+$p d!s# ~<<+" x M0B\t8K @zB @F&S  `cb P- `' { [!  eD h; VE X0 fK9 - 0IWfH    0Q) { `##x  FW<+*  x<$9E[-qWW.(I+6aa@.y24  x6_-"bbϫp@  t~,/;m%h^uf@ Wp~<<EJB[aW}g_Wl~<$2]GLϒ	bG"IbX*QqD2"B)%d,>5 j>{-]cK'Xt  o(hw?G% fIq  ^D$.Tʳ?  D*A,`6B$BB
+dr`)B(Ͱ*`/@4Qhp.U=pa(	Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F; 2G1Q=C7Fdt1r=6Ыhڏ>C03l0.B8,	c˱"VcϱwE	6wB aAHXLXNH $4	7	Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![
+b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw
ǈg(gwLӋT071oUX**|
+J&*/TުUUT^S}FU3S	ԖUPSSg;goT?~YYLOCQ_ cx,!k
u5&|v*=9C3J3WRf?qtN	(~))4L1e\kXHQG6EYAJ'\'GgSSݧ
+M=:.kDwn^Loy}/TmGX$<5qo</QC]@Caaᄑ<FFi\$mmƣ&&!&KMMRM);L;L֙͢5=12כ߷`ZxZ,eIZYnZ9YXUZ]F%ֻNNgðɶۮm}agbgŮ}}=
Z~sr:V:ޚΜ?}/gX3)iSGggs󈋉K.>.ȽJtq]zۯ6iܟ4)Y3sCQ?0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz %gA[z|!?:eAAA!h쐭!ΑiP~aa~'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl{/]py.,:@LN8A*%w%
+yg"/6шC\*NH*Mz쑼5y$3,幄'L
Lݛ:v m2=:1qB!Mggfvˬen/kY-
+BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9<qy
++V<*mOW~&zMk^ʂkU
+}]OX/Yߵa>(xoʿܔĹdff-[n
ڴ
VE/(ۻC<e;?TTTT6ݵan{4[>ɾUUMfeI?m]Nmq#׹=TR+Gw-
6
U#pDy	
:v{vg/jBFS[b[O>zG4<YyJTiӓgό}~.`ۢ{cjotE;;\tWW:_mt<Oǻ\kz{f7y՞9=ݽzo~r'˻w'O_@AC݇?[jwGCˆ
8>99?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-   gAMA  |Q    cHRM  z%        u0  `  :  o_F  
+	IDATx\MG^u;1`"$N!LDh57.̙SH|A	N$7G1(↰wv#I3SCuuWlWmzuׯo۷Y)UpHɄ`0Uнswá;G!wpÏ=ʏffhZfk<
+x2{B&m:kj'6j<Yk ,%f%]SWB~fnԗ1x$G? 0d&LG.0$$It/̠}8Nx,~-'	)%HL$R"M$L!I IvLSL@&I"M$2A&RX7{7HER)!e4YB;Ɯap+k̦ 3 C
31q9S"f@FD1wC)K'D 鷓%Hd%JBT"76c-}jGۺ8=;ЏP/=L`XQSPD˴	Q
j%&!C&?mRncs`OK`zze3+BDLw.ƖVńw
N0"W8"M/S2?	&`Ӝ._v^Tn[q0!몫|H&`Nk*@ `cRfEL%`(/4ж]X(öB28Z2ZhS#
+Vߋzڥ4Sr˟fjM%.]
+_ٵ<|E?}vo")ʓ<&}h@K gTmS(̱
+q>4(gC`VY1HhoJ[Lً";7ϱb׃MpശOւΨ?g9:nPT9UdB
+MJAN2'v4ȿGN5JSP"sm2 k\b1 LE<;*<7<AdBd("qt4ZuY~eh#sO5]-D O3CU0*f*t e~M; BM}CbPUUd9\hGv (5ZrLXgP.}vq>DJ})'xs^:7'~ vn\a/4W~HGEϊ*U||SoR%U *МSпysF 9䤚vvr U&OS0 `z$ׯ GŽVx<G.{ǺWܢ̊eN%9D̇̎$7qۂ8oer̎37Kll9ҧX
+O*\(˭e(Y6Ѡ=Am [X]:8&&:,D'IW)pbD7jK'4=3pr bp֮ެ5OEܢۖJeVFaL}GOYDPSAOQS,!Lz -~ʈ+NŊ!Z@L
8` ௽
+>	,o +FG &@lr/>% k=2@\v=\}Lx'Ur( 
+#SY`e'O|U9>/W+U/[p8C4܈ҷWʥ?x3[^D~7}Xkm-y2XQI5
+)Ϝ &{ c5Wu./)";4dKbL'>I)Cx^ļ |ysý%1Pn,-Z*v"	1WFrzkH~.u{}+8O'
+?Y)P
+8젛iV tj{H8A278i7 .s;l! p֢}꓋?.H(]YO2K?*9
+*"r0_w\T_7
u}sof5}ߜSn7uHKbz3f~SC
s˒4{.9a hg_֋ gD[LbF(58A Jnn|	K,+VM*!U蔆"ZWDĆ:nNU@_pw,<7ԒFz*ryi8㡾 X7rJ0[(n3H"js
+DuͭTlvCmeVGb2J*b9Oÿ"6G#._CuɼeaiϽ:SO~ X'X-յHy2x      IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/ui.css 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/ui.css
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/ui.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/ui.css	2008-03-18 01:59:53.000000000 -0500
@@ -0,0 +1,211 @@
+/* Reset */
+.o2k7Skin table, .o2k7Skin tbody, .o2k7Skin a, .o2k7Skin img, .o2k7Skin tr, .o2k7Skin div, .o2k7Skin td, .o2k7Skin iframe, .o2k7Skin span, .o2k7Skin *, .o2k7Skin .mceText {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline; width:auto; border-collapse:separate; text-align:left}
+.o2k7Skin a:hover, .o2k7Skin a:link, .o2k7Skin a:visited, .o2k7Skin a:active {text-decoration:none; font-weight:normal; cursor:default; color:#000}
+.o2k7Skin table td {vertical-align:middle}
+
+/* Containers */
+.o2k7Skin table {background:#E5EFFD}
+.o2k7Skin iframe {display:block; background:#FFF}
+.o2k7Skin .mceToolbar {height:26px}
+
+/* External */
+.o2k7Skin .mceExternalToolbar {position:absolute; border:1px solid #ABC6DD; border-bottom:0; display:none}
+.o2k7Skin .mceExternalToolbar td.mceToolbar {padding-right:13px;}
+.o2k7Skin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px; background:url(../../img/icons.gif) -820px 0}
+
+/* Layout */
+.o2k7Skin table.mceLayout {border:0; border-left:1px solid #ABC6DD; border-right:1px solid #ABC6DD}
+.o2k7Skin table.mceLayout tr.mceFirst td {border-top:1px solid #ABC6DD}
+.o2k7Skin table.mceLayout tr.mceLast td {border-bottom:1px solid #ABC6DD}
+.o2k7Skin table.mceToolbar, .o2k7Skin tr.mceFirst .mceToolbar tr td, .o2k7Skin tr.mceLast .mceToolbar tr td {border:0; margin:0; padding:0}
+.o2k7Skin .mceIframeContainer {border-top:1px solid #ABC6DD; border-bottom:1px solid #ABC6DD}
+.o2k7Skin .mceStatusbar {display:block; font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; height:20px}
+.o2k7Skin .mceStatusbar div {float:left; padding:2px}
+.o2k7Skin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize}
+.o2k7Skin .mceStatusbar a:hover {text-decoration:underline}
+.o2k7Skin table.mceToolbar {margin-left:3px}
+.o2k7Skin .mceToolbar .mceToolbarStart span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px; margin-left:3px;}
+.o2k7Skin .mceToolbar td.mceFirst span {margin:0}
+.o2k7Skin .mceToolbar .mceToolbarEnd span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px}
+.o2k7Skin .mceToolbar .mceToolbarEndListBox span, .o2k7Skin .mceToolbar .mceToolbarStartListBox span {display:none}
+.o2k7Skin span.mceIcon, .o2k7Skin img.mceIcon {display:block; width:20px; height:20px}
+.o2k7Skin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px}
+.o2k7Skin td.mceCenter {text-align:center;}
+.o2k7Skin td.mceCenter table {margin:0 auto; text-align:left;}
+.o2k7Skin td.mceRight table {margin:0 0 0 auto;}
+
+/* Button */
+.o2k7Skin .mceButton {display:block; background:url(img/button_bg.png); width:22px; height:22px}
+.o2k7Skin a.mceButton span, .o2k7Skin a.mceButton img {margin-left:1px}
+.o2k7Skin .mceOldBoxModel a.mceButton span, .o2k7Skin .mceOldBoxModel a.mceButton img {margin:0 0 0 1px}
+.o2k7Skin a.mceButtonEnabled:hover {background-color:#B2BBD0; background-position:0 -22px}
+.o2k7Skin a.mceButtonActive, .o2k7Skin a.mceButtonSelected {background-position:0 -44px}
+.o2k7Skin .mceButtonDisabled .mceIcon {opacity:0.3; filter:alpha(opacity=30)}
+
+/* Separator */
+.o2k7Skin .mceSeparator {display:block; background:url(img/button_bg.png) -22px 0; width:5px; height:22px}
+
+/* ListBox */
+.o2k7Skin .mceListBox {margin-left:3px}
+.o2k7Skin .mceListBox, .o2k7Skin .mceListBox a {display:block}
+.o2k7Skin .mceListBox .mceText {padding-left:4px; text-align:left; width:70px; border:1px solid #b3c7e1; border-right:0; background:#eaf2fb; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; height:20px; line-height:20px; overflow:hidden}
+.o2k7Skin .mceListBox .mceOpen {width:14px; height:22px; background:url(img/button_bg.png) -66px 0}
+.o2k7Skin table.mceListBoxEnabled:hover .mceText, .o2k7Skin .mceListBoxHover .mceText, .o2k7Skin .mceListBoxSelected .mceText {background:#FFF}
+.o2k7Skin table.mceListBoxEnabled:hover .mceOpen, .o2k7Skin .mceListBoxHover .mceOpen, .o2k7Skin .mceListBoxSelected .mceOpen {background-position:-66px -22px}
+.o2k7Skin .mceListBoxDisabled .mceText {color:gray}
+.o2k7Skin .mceListBoxMenu {overflow:auto; overflow-x:hidden}
+.o2k7Skin .mceOldBoxModel .mceListBox .mceText {height:22px}
+.o2k7Skin select.mceListBox {font-family:Tahoma,Verdana,Arial,Helvetica; font-size:12px; border:1px solid #b3c7e1; background:#FFF;}
+
+/* SplitButton */
+.o2k7Skin .mceSplitButton, .o2k7Skin .mceSplitButton a, .o2k7Skin .mceSplitButton span {display:block; height:22px}
+.o2k7Skin .mceSplitButton {background:url(img/button_bg.png)}
+.o2k7Skin .mceSplitButton a.mceAction {width:22px}
+.o2k7Skin .mceSplitButton span.mceAction {width:22px; background:url(../../img/icons.gif) 20px 20px}
+.o2k7Skin .mceSplitButton a.mceOpen {width:10px}
+.o2k7Skin .mceSplitButton span.mceOpen {width:10px; background:url(img/button_bg.png) -44px 0}
+.o2k7Skin table.mceSplitButtonEnabled:hover a.mceAction, .o2k7Skin .mceSplitButtonHover a.mceAction, .o2k7Skin .mceSplitButtonSelected {background:url(img/button_bg.png) 0 -22px}
+.o2k7Skin table.mceSplitButtonEnabled:hover span.mceOpen, .o2k7Skin .mceSplitButtonHover span.mceOpen, .o2k7Skin .mceSplitButtonSelected span.mceOpen {background-position:-44px -44px}
+.o2k7Skin .mceSplitButtonDisabled .mceAction {opacity:0.3; filter:alpha(opacity=30)}
+.o2k7Skin .mceSplitButtonActive {background-position:0 -44px}
+
+/* ColorSplitButton */
+.o2k7Skin div.mceColorSplitMenu table {background:#FFF; border:1px solid gray}
+.o2k7Skin .mceColorSplitMenu td {padding:2px}
+.o2k7Skin .mceColorSplitMenu a {display:block; width:9px; height:9px; overflow:hidden; border:1px solid #808080}
+.o2k7Skin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px}
+.o2k7Skin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF}
+.o2k7Skin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid #0A246A; background-color:#B6BDD2}
+.o2k7Skin a.mceMoreColors:hover {border:1px solid #0A246A}
+.o2k7Skin .mceColorPreview {margin-left:2px; width:16px; height:4px; overflow:hidden; background:#9a9b9a}
+.o2k7Skin .mce_forecolor span.mceAction, .o2k7Skin .mce_backcolor span.mceAction {height:15px}
+
+/* Menu */
+.o2k7Skin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid #ABC6DD}
+.o2k7Skin .mceNoIcons span.mceIcon {width:0;}
+.o2k7Skin .mceNoIcons a .mceText {padding-left:10px}
+.o2k7Skin .mceMenu table {background:#FFF}
+.o2k7Skin .mceMenu a, .o2k7Skin .mceMenu span, .o2k7Skin .mceMenu {display:block}
+.o2k7Skin .mceMenu td {height:20px}
+.o2k7Skin .mceMenu a {position:relative;padding:3px 0 4px 0}
+.o2k7Skin .mceMenu .mceText {position:relative; display:block; font-family:Tahoma,Verdana,Arial,Helvetica; color:#000; cursor:default; margin:0; padding:0 25px 0 25px; display:block}
+.o2k7Skin .mceMenu span.mceText, .o2k7Skin .mceMenu .mcePreview {font-size:11px}
+.o2k7Skin .mceMenu pre.mceText {font-family:Monospace}
+.o2k7Skin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:22px;}
+.o2k7Skin .mceMenu .mceMenuItemEnabled a:hover, .o2k7Skin .mceMenu .mceMenuItemActive {background-color:#dbecf3}
+.o2k7Skin td.mceMenuItemSeparator {background:#DDD; height:1px}
+.o2k7Skin .mceMenuItemTitle a {border:0; background:#E5EFFD; border-bottom:1px solid #ABC6DD}
+.o2k7Skin .mceMenuItemTitle span.mceText {color:#000; font-weight:bold; padding-left:4px}
+.o2k7Skin .mceMenuItemDisabled .mceText {color:#888}
+.o2k7Skin .mceMenuItemSelected .mceIcon {background:url(../default/img/menu_check.gif)}
+.o2k7Skin .mceNoIcons .mceMenuItemSelected a {background:url(../default/img/menu_arrow.gif) no-repeat -6px center}
+.o2k7Skin .mceMenu span.mceMenuLine {display:none}
+.o2k7Skin .mceMenuItemSub a {background:url(../default/img/menu_arrow.gif) no-repeat top right;}
+
+/* Progress,Resize */
+.o2k7Skin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; filter:alpha(opacity=50); background:#FFF}
+.o2k7Skin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(../default/img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px}
+.o2k7Skin .mcePlaceHolder {border:1px dotted gray}
+
+/* Formats */
+.o2k7Skin .mce_formatPreview a {font-size:10px}
+.o2k7Skin .mce_p span.mceText {}
+.o2k7Skin .mce_address span.mceText {font-style:italic}
+.o2k7Skin .mce_pre span.mceText {font-family:monospace}
+.o2k7Skin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em}
+.o2k7Skin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em}
+.o2k7Skin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em}
+.o2k7Skin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em}
+.o2k7Skin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em}
+.o2k7Skin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em}
+
+/* Theme */
+.o2k7Skin span.mce_bold {background-position:0 0}
+.o2k7Skin span.mce_italic {background-position:-60px 0}
+.o2k7Skin span.mce_underline {background-position:-140px 0}
+.o2k7Skin span.mce_strikethrough {background-position:-120px 0}
+.o2k7Skin span.mce_undo {background-position:-160px 0}
+.o2k7Skin span.mce_redo {background-position:-100px 0}
+.o2k7Skin span.mce_cleanup {background-position:-40px 0}
+.o2k7Skin span.mce_bullist {background-position:-20px 0}
+.o2k7Skin span.mce_numlist {background-position:-80px 0}
+.o2k7Skin span.mce_justifyleft {background-position:-460px 0}
+.o2k7Skin span.mce_justifyright {background-position:-480px 0}
+.o2k7Skin span.mce_justifycenter {background-position:-420px 0}
+.o2k7Skin span.mce_justifyfull {background-position:-440px 0}
+.o2k7Skin span.mce_anchor {background-position:-200px 0}
+.o2k7Skin span.mce_indent {background-position:-400px 0}
+.o2k7Skin span.mce_outdent {background-position:-540px 0}
+.o2k7Skin span.mce_link {background-position:-500px 0}
+.o2k7Skin span.mce_unlink {background-position:-640px 0}
+.o2k7Skin span.mce_sub {background-position:-600px 0}
+.o2k7Skin span.mce_sup {background-position:-620px 0}
+.o2k7Skin span.mce_removeformat {background-position:-580px 0}
+.o2k7Skin span.mce_newdocument {background-position:-520px 0}
+.o2k7Skin span.mce_image {background-position:-380px 0}
+.o2k7Skin span.mce_help {background-position:-340px 0}
+.o2k7Skin span.mce_code {background-position:-260px 0}
+.o2k7Skin span.mce_hr {background-position:-360px 0}
+.o2k7Skin span.mce_visualaid {background-position:-660px 0}
+.o2k7Skin span.mce_charmap {background-position:-240px 0}
+.o2k7Skin span.mce_paste {background-position:-560px 0}
+.o2k7Skin span.mce_copy {background-position:-700px 0}
+.o2k7Skin span.mce_cut {background-position:-680px 0}
+.o2k7Skin span.mce_blockquote {background-position:-220px 0}
+.o2k7Skin .mce_forecolor span.mceAction {background-position:-720px 0}
+.o2k7Skin .mce_backcolor span.mceAction {background-position:-760px 0}
+.o2k7Skin .mce_forecolorpicker {background-position:-720px 0}
+.o2k7Skin .mce_backcolorpicker {background-position:-760px 0}
+
+/* Plugins */
+.o2k7Skin span.mce_advhr {background-position:-0px -20px}
+.o2k7Skin span.mce_ltr {background-position:-20px -20px}
+.o2k7Skin span.mce_rtl {background-position:-40px -20px}
+.o2k7Skin span.mce_emotions {background-position:-60px -20px}
+.o2k7Skin span.mce_fullpage {background-position:-80px -20px}
+.o2k7Skin span.mce_fullscreen {background-position:-100px -20px}
+.o2k7Skin span.mce_iespell {background-position:-120px -20px}
+.o2k7Skin span.mce_insertdate {background-position:-140px -20px}
+.o2k7Skin span.mce_inserttime {background-position:-160px -20px}
+.o2k7Skin span.mce_absolute {background-position:-180px -20px}
+.o2k7Skin span.mce_backward {background-position:-200px -20px}
+.o2k7Skin span.mce_forward {background-position:-220px -20px}
+.o2k7Skin span.mce_insert_layer {background-position:-240px -20px}
+.o2k7Skin span.mce_insertlayer {background-position:-260px -20px}
+.o2k7Skin span.mce_movebackward {background-position:-280px -20px}
+.o2k7Skin span.mce_moveforward {background-position:-300px -20px}
+.o2k7Skin span.mce_media {background-position:-320px -20px}
+.o2k7Skin span.mce_nonbreaking {background-position:-340px -20px}
+.o2k7Skin span.mce_pastetext {background-position:-360px -20px}
+.o2k7Skin span.mce_pasteword {background-position:-380px -20px}
+.o2k7Skin span.mce_selectall {background-position:-400px -20px}
+.o2k7Skin span.mce_preview {background-position:-420px -20px}
+.o2k7Skin span.mce_print {background-position:-440px -20px}
+.o2k7Skin span.mce_cancel {background-position:-460px -20px}
+.o2k7Skin span.mce_save {background-position:-480px -20px}
+.o2k7Skin span.mce_replace {background-position:-500px -20px}
+.o2k7Skin span.mce_search {background-position:-520px -20px}
+.o2k7Skin span.mce_styleprops {background-position:-560px -20px}
+.o2k7Skin span.mce_table {background-position:-580px -20px}
+.o2k7Skin span.mce_cell_props {background-position:-600px -20px}
+.o2k7Skin span.mce_delete_table {background-position:-620px -20px}
+.o2k7Skin span.mce_delete_col {background-position:-640px -20px}
+.o2k7Skin span.mce_delete_row {background-position:-660px -20px}
+.o2k7Skin span.mce_col_after {background-position:-680px -20px}
+.o2k7Skin span.mce_col_before {background-position:-700px -20px}
+.o2k7Skin span.mce_row_after {background-position:-720px -20px}
+.o2k7Skin span.mce_row_before {background-position:-740px -20px}
+.o2k7Skin span.mce_merge_cells {background-position:-760px -20px}
+.o2k7Skin span.mce_table_props {background-position:-980px -20px}
+.o2k7Skin span.mce_row_props {background-position:-780px -20px}
+.o2k7Skin span.mce_split_cells {background-position:-800px -20px}
+.o2k7Skin span.mce_template {background-position:-820px -20px}
+.o2k7Skin span.mce_visualchars {background-position:-840px -20px}
+.o2k7Skin span.mce_abbr {background-position:-860px -20px}
+.o2k7Skin span.mce_acronym {background-position:-880px -20px}
+.o2k7Skin span.mce_attribs {background-position:-900px -20px}
+.o2k7Skin span.mce_cite {background-position:-920px -20px}
+.o2k7Skin span.mce_del {background-position:-940px -20px}
+.o2k7Skin span.mce_ins {background-position:-960px -20px}
+.o2k7Skin span.mce_pagebreak {background-position:0 -40px}
+.o2k7Skin .mce_spellchecker span.mceAction {background-position:-540px -20px}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/ui_black.css 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/ui_black.css
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/ui_black.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/ui_black.css	2008-03-12 17:47:11.000000000 -0500
@@ -0,0 +1,8 @@
+/* Black */
+.o2k7SkinBlack .mceToolbar .mceToolbarStart span, .o2k7SkinBlack .mceToolbar .mceToolbarEnd span, .o2k7SkinBlack .mceButton, .o2k7SkinBlack .mceSplitButton, .o2k7SkinBlack .mceSeparator, .o2k7SkinBlack .mceSplitButton span.mceOpen, .o2k7SkinBlack .mceListBox .mceOpen {background-image:url(img/button_bg_black.png)}
+.o2k7SkinBlack table, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack .mceMenuItemTitle span.mceText, .o2k7SkinBlack .mceStatusbar div, .o2k7SkinBlack .mceStatusbar span, .o2k7SkinBlack .mceStatusbar a {background:#535353; color:#FFF}
+.o2k7SkinBlack table.mceListBoxEnabled .mceText, o2k7SkinBlack .mceListBox .mceText {background:#FFF; border:1px solid #CBCFD4; border-bottom-color:#989FA9; border-right:0}
+.o2k7SkinBlack table.mceListBoxEnabled:hover .mceText, .o2k7Skin .mceListBoxHover .mceText, .o2k7Skin .mceListBoxSelected .mceText {background:#FFF; border:1px solid #FFBD69; border-right:0}
+.o2k7SkinBlack .mceExternalToolbar, .o2k7SkinBlack .mceListBox .mceText, .o2k7SkinBlack div.mceMenu, .o2k7SkinBlack table.mceLayout, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack table.mceLayout tr.mceFirst td, .o2k7SkinBlack table.mceLayout, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack table.mceLayout tr.mceLast td, .o2k7SkinBlack .mceIframeContainer {border-color: #535353;}
+.o2k7SkinBlack table.mceSplitButtonEnabled:hover a.mceAction, .o2k7Skin .mceSplitButtonHover a.mceAction, .o2k7Skin .mceSplitButtonSelected {background-image:url(img/button_bg_black.png)}
+.o2k7SkinBlack .mceMenu .mceMenuItemEnabled a:hover, .o2k7Skin .mceMenu .mceMenuItemActive {background-color:#FFE7A1}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/ui_silver.css 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/ui_silver.css
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/ui_silver.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/ui_silver.css	2008-02-26 23:37:13.000000000 -0600
@@ -0,0 +1,5 @@
+/* Silver */
+.o2k7SkinSilver .mceToolbar .mceToolbarStart span, .o2k7SkinSilver .mceButton, .o2k7SkinSilver .mceSplitButton, .o2k7SkinSilver .mceSeparator, .o2k7SkinSilver .mceSplitButton span.mceOpen, .o2k7SkinSilver .mceListBox .mceOpen {background-image:url(img/button_bg_silver.png)}
+.o2k7SkinSilver table, .o2k7SkinSilver .mceMenuItemTitle a {background:#eee}
+.o2k7SkinSilver .mceListBox .mceText {background:#FFF}
+.o2k7SkinSilver .mceExternalToolbar, .o2k7SkinSilver .mceListBox .mceText, .o2k7SkinSilver div.mceMenu, .o2k7SkinSilver table.mceLayout, .o2k7SkinSilver .mceMenuItemTitle a, .o2k7SkinSilver table.mceLayout tr.mceFirst td, .o2k7SkinSilver table.mceLayout, .o2k7SkinSilver .mceMenuItemTitle a, .o2k7SkinSilver table.mceLayout tr.mceLast td, .o2k7SkinSilver .mceIframeContainer {border-color: #bbb}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/content.css 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/content.css
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/content.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/content.css	2008-03-18 01:59:53.000000000 -0500
@@ -0,0 +1,26 @@
+body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;}
+body {background:#FFF;}
+body.mceForceColors {background:#FFF; color:#000;}
+h1 {font-size: 2em}
+h2 {font-size: 1.5em}
+h3 {font-size: 1.17em}
+h4 {font-size: 1em}
+h5 {font-size: .83em}
+h6 {font-size: .75em}
+.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;}
+a.mceItemAnchor {width:12px; line-height:6px; overflow:hidden; padding-left:12px; background:url(img/items.gif) no-repeat bottom left;}
+img.mceItemAnchor {width:12px; height:12px; background:url(img/items.gif) no-repeat;}
+img {border:0;}
+
+/* IE 
+* html body {
+scrollbar-3dlight-color:#F0F0EE;
+scrollbar-arrow-color:#676662;
+scrollbar-base-color:#F0F0EE;
+scrollbar-darkshadow-color:#DDD;
+scrollbar-face-color:#E0E0DD;
+scrollbar-highlight-color:#F0F0EE;
+scrollbar-shadow-color:#F0F0EE;
+scrollbar-track-color:#F5F5F5;
+}
+*/
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/dialog.css 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/dialog.css
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/dialog.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/dialog.css	2008-03-22 03:23:18.000000000 -0500
@@ -0,0 +1,119 @@
+/* Generic */
+body {
+font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px;
+/*scrollbar-3dlight-color:#F0F0EE;
+scrollbar-arrow-color:#676662;
+scrollbar-base-color:#F0F0EE;
+scrollbar-darkshadow-color:#DDDDDD;
+scrollbar-face-color:#E0E0DD;
+scrollbar-highlight-color:#F0F0EE;
+scrollbar-shadow-color:#F0F0EE;
+scrollbar-track-color:#F5F5F5;*/
+background:#E4F2FD;
+padding:0;
+margin:8px 8px 0 8px;
+}
+
+html {background:#E4F2FD;}
+td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}
+textarea {resize:none;outline:none;}
+a:link, a:visited {color:black;}
+a:hover {color:#2B6FB6;}
+
+/* Forms */
+fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;}
+legend {color:#2B6FB6; font-weight:bold;}
+label.msg {display:none;}
+label.invalid {color:#EE0000; display:inline;}
+input.invalid {border:1px solid #EE0000;}
+input {background:#FFF; border:1px solid #CCC;}
+input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}
+input, select, textarea {border:1px solid #808080;}
+input.radio {border:1px none #000000; background:transparent; vertical-align:middle;}
+input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;}
+.input_noborder {border:0;}
+
+/* Buttons */
+#insert, #cancel, input.mceButton, .updateButton {
+border: 1px solid #bbb; 
+margin:0; 
+padding:0 0 1px;
+font-weight:bold;
+font-size: 11px;
+width:94px; 
+height:24px;
+background:url(img/fade-butt.png) 0 0;
+cursor:pointer;
+}
+#insert:hover, #cancel:hover, input.mceButton:hover, .updateButton:hover,
+#insert:focus, #cancel:focus, input.mceButton:focus, .updateButton:focus {
+border: 1px solid #555;
+} 
+
+/* Browse */
+a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;}
+.mceOldBoxModel a.browse span {width:22px; height:20px;}
+a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;}
+a.browse span.disabled {border:1px solid white; -moz-opacity:0.3; opacity:0.3; filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);}
+a.browse:hover span.disabled {border:1px solid white; background-color:transparent;}
+a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;}
+.mceOldBoxModel a.pickcolor span {width:21px; height:17px;}
+a.pickcolor:hover span {background-color:#B2BBD0;}
+a.pickcolor:hover span.disabled {}
+
+/* Charmap */
+table.charmap {border:1px solid #AAA; text-align:center}
+td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;}
+#charmap a {display:block; color:#000; text-decoration:none; border:0}
+#charmap a:hover {background:#CCC;color:#2B6FB6}
+#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center}
+#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center}
+#charmap #charmapView {background-color:#fff;}
+
+/* Source */
+.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;}
+.mceActionPanel {margin-top:5px;}
+
+/* Tabs classes */
+.tabs {width:100%; height:18px; line-height:normal; background:url(img/tabs.gif) repeat-x 0 -72px;}
+.tabs ul {margin:0; padding:0; list-style:none;}
+.tabs li {float:left; background:url(img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;}
+.tabs li.current {background:url(img/tabs.gif) no-repeat 0 -18px; margin-right:2px;}
+.tabs span {float:left; display:block; background:url(img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;}
+.tabs .current span {background:url(img/tabs.gif) no-repeat right -54px;}
+.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;}
+.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;}
+
+/* Panels */
+.panel_wrapper div.panel {display:none;}
+.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;}
+.panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;}
+
+/* Columns */
+.column {float:left;}
+.properties {width:100%;}
+.properties .column1 {}
+.properties .column2 {text-align:left;}
+
+/* Titles */
+h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;}
+h3 {font-size:14px;}
+.title {font-size:12px; font-weight:bold; color:#2B6FB6;}
+
+/* Dialog specific */
+#link .panel_wrapper, #link div.current {height:125px;}
+#image .panel_wrapper, #image div.current {height:200px;}
+#plugintable thead {font-weight:bold; background:#DDD;}
+#plugintable, #about #plugintable td {border:1px solid #919B9C;}
+#plugintable {width:96%; margin-top:10px;}
+#pluginscontainer {height:290px; overflow:auto;}
+#colorpicker #preview {float:right; width:50px; height:14px;line-height:1px; border:1px solid black; margin-left:5px;}
+#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;}
+#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;}
+#colorpicker #light div {overflow:hidden;}
+#colorpicker #previewblock {float:right; padding-left:10px; height:20px;}
+#colorpicker .panel_wrapper div.current {height:175px;}
+#colorpicker #namedcolors {width:150px;}
+#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;}
+#colorpicker #colornamecontainer {margin-top:5px;}
+#colorpicker #picker_panel fieldset {margin:auto;width:325px;}
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/butt2.png 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/butt2.png
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/butt2.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/butt2.png	2008-01-31 12:10:46.000000000 -0600
@@ -0,0 +1,5 @@
+PNG
+
+   
IHDR         W?   PLTE	U   IDATx^NQ{sw]pw%\pdw;)8NH%y%xqP*(J=9~Q_sRyrC	CPs&*ڹ
+C{hرkım6h,gƘX
+n,KK["`64L$1?HzzO """Y>tyMf9 vmmnݪjZzG)uX:xxz<m2!2#    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/button_bg.png 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/button_bg.png
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/button_bg.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/button_bg.png	2008-01-31 12:10:46.000000000 -0600
@@ -0,0 +1,20 @@
+PNG
+
+   
IHDR   X   B      	pHYs       
+OiCCPPhotoshop ICC profile  xڝSgTS=BKKoR RB&*!	J!QEEȠQ,
+!{kּ>H3Q5B.@
+$p d!s# ~<<+" x M0B\t8K @zB @F&S  `cb P- `' { [!  eD h; VE X0 fK9 - 0IWfH    0Q) { `##x  FW<+*  x<$9E[-qWW.(I+6aa@.y24  x6_-"bbϫp@  t~,/;m%h^uf@ Wp~<<EJB[aW}g_Wl~<$2]GLϒ	bG"IbX*QqD2"B)%d,>5 j>{-]cK'Xt  o(hw?G% fIq  ^D$.Tʳ?  D*A,`6B$BB
+dr`)B(Ͱ*`/@4Qhp.U=pa(	Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F; 2G1Q=C7Fdt1r=6Ыhڏ>C03l0.B8,	c˱"VcϱwE	6wB aAHXLXNH $4	7	Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![
+b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw
ǈg(gwLӋT071oUX**|
+J&*/TުUUT^S}FU3S	ԖUPSSg;goT?~YYLOCQ_ cx,!k
u5&|v*=9C3J3WRf?qtN	(~))4L1e\kXHQG6EYAJ'\'GgSSݧ
+M=:.kDwn^Loy}/TmGX$<5qo</QC]@Caaᄑ<FFi\$mmƣ&&!&KMMRM);L;L֙͢5=12כ߷`ZxZ,eIZYnZ9YXUZ]F%ֻNNgðɶۮm}agbgŮ}}=
Z~sr:V:ޚΜ?}/gX3)iSGggs󈋉K.>.ȽJtq]zۯ6iܟ4)Y3sCQ?0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz %gA[z|!?:eAAA!h쐭!ΑiP~aa~'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl{/]py.,:@LN8A*%w%
+yg"/6шC\*NH*Mz쑼5y$3,幄'L
Lݛ:v m2=:1qB!Mggfvˬen/kY-
+BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9<qy
++V<*mOW~&zMk^ʂkU
+}]OX/Yߵa>(xoʿܔĹdff-[n
ڴ
VE/(ۻC<e;?TTTT6ݵan{4[>ɾUUMfeI?m]Nmq#׹=TR+Gw-
6
U#pDy	
:v{vg/jBFS[b[O>zG4<YyJTiӓgό}~.`ۢ{cjotE;;\tWW:_mt<Oǻ\kz{f7y՞9=ݽzo~r'˻w'O_@AC݇?[jwGCˆ
8>99?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-   gAMA  |Q    cHRM  z%        u0  `  :  o_F   PLTE   Ι߃ÃÄĄÛ࠼䕯ՠ▯ԸV}⟻ᠼ⠻ܟޠޟݴIMMNNV`defjvߍux|܁܃كڄڄߋߍyyxzلutvu_`hji·͆ψUVWW`Ԙبڪʴɴ٩۶ڵʴɳӵӵڵ8D   tRNS S%  IDATxڔ\g-BZ}X]IumXn3Ar\_cozY		$27J`2(du")@l\<+y^w}Cߪu\}>[r+++>⍽*+ҒqR[)(im aP)ķr*++dC$_5ZoȩɀRpqM}M}="@s*q #$ $$ {ꔎ0܄ y$IDHAHAH<fەD0&`AIG $j΀%w GjAD,Ҏ!w6\PqQ8wXm&8   O  (***J
ۇaab}0ۛekT1aM &{ i  ]XXX؀Gq5`@qwіyM.X,bn
(8pE
(7XV\ZZZZTZZZvF6FMfɼd6MfS~,h{e/j`ؔo2rsd2̦Ckm{#
+͇eWYۭx\Uu*T_oϡTr7@AjD!$= N.mw@A;TTX**,
+rłw˥CPЎJQG(+u(JrJ;~{`Ph*....>P,9GqoJA	 8HD	AX)2෥z}NuzEŲSAL+unpwvg"O靟J~aeavQ;57_~x<^iga<7a/=n9~ni{KbؕSRSi h
=קw:Apo0H(
+`(
+C!qn\3P(
+5B2ԩ4r76666v^\KUIohOzzY/eY/zgX  T[  C3,^/˲
+  :==4 HVּW*8
44
+)ǞIX=1114xfffg?1,_ u)
\:<?qV
3I>;S)xyqq2/~
f#H4DHDpQ$Wex.7t|?@>__uBpߨ9q9wntttT~R+W`䞃Fq"=*}Y޴[j'4GD^2|00M$I$H$O/$/gJ+zF~]P[Rd'Nhׯm\۸M1mJSߒԆVV*~X]][[U;A]mxy~*<yo'ίx\AS!ByS_B\xG>/sm8	  U΁   OjKKKKK @[YVbbJ,SMҀiWyyq]\y*U4444D


Hq<7-s_Ԩ6D#sHdv6DhT}ᑴĉ7??iÁ?|}?_OaWhu\.lu8]V6.?kNr9.p\NTqRᛀNr9.Gt:T᧓}tbBdWwWɮ'T$u6LDI	ADo4G/gJ+ 6r>w    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/down_arrow.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/down_arrow.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/down_arrow.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/down_arrow.gif	2008-01-31 12:10:46.000000000 -0600
@@ -0,0 +1,3 @@
+GIF89a
+       !   ,    
+   je9L ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/fade-butt.png 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/fade-butt.png
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/fade-butt.png	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/fade-butt.png	2008-01-31 12:10:46.000000000 -0600
@@ -0,0 +1,7 @@
+PNG
+
+   
IHDR      (   *   gAMA  7   tEXtSoftware Adobe ImageReadyqe<   PLTE2  IDATxbpP``"uf Rg $`CM888 eueeeuA]_J]JL]_L DE#e@<<@GBGH )f@|||||V| Ġjh(*i*)
+ dĤjĤdd288CI bT6UV䔖VV0V4 'AAM{A-AM-A%%M-A% bbbaab KE[ |  *@X @ a  U 
+VA *@X @ a  U 
+VA *@X @ a  U 
+VA  Kv%FU    IENDB`
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/separator.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/separator.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/separator.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/separator.gif	2008-01-31 12:10:46.000000000 -0600
@@ -0,0 +1,3 @@
+GIF89a      !   ,       
+b
+ ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/tabs.gif 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/tabs.gif
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/tabs.gif	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/tabs.gif	2008-02-21 15:40:25.000000000 -0600
@@ -0,0 +1,6 @@
+GIF89a,Z      2Jb͑󡳻둛                     !  8 ,    ,Z  @da(Ȥrl:ШtJZج)xL.zn|N~""6#7$% !! 
+H*\ȰÇ#JHQ0hȱǏ CIɓ(S\ɲ˗-
h@͛8sɳ@
+JѣH5@SӧPJJիXjʵׯ`Êր	Ҫ]˶۷pʝKݻx˷_RLÈ+^̸ǐ#KL˘-ذϠCMӨS^ͺװc˞
+sͻNȓ+_μr-HNسkνËO
X˟OϿ h&J D(Vhfv ($hb,0(4h8<> DiH&6 PF)TJiǕXf\v%NV)V~ihkIU)tign©'w矀bzj衈&裐F&)饘f*Ʃ駠N)ꩨFJjQꫀꓰjz뮼z++lj&6,>+Vk
+öv+k覫&ko	 l'|p
,G,@gwLw,$|*l,
+/412۬<B9,DE''PGrOKmBXwu*docBl-/=x |7~nx*}K?8x[=y+}yyy褷<z験|zozKz'<K{|{{{ķ;|'7G/Wogw/o7 ;
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/ui.css 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/ui.css
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/ui.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/ui.css	2008-03-18 01:59:53.000000000 -0500
@@ -0,0 +1,382 @@
+/* Reset */
+.wp_themeSkin table, .wp_themeSkin tbody, .wp_themeSkin a, .wp_themeSkin img, .wp_themeSkin tr, .wp_themeSkin div, .wp_themeSkin td, .wp_themeSkin iframe, .wp_themeSkin span, .wp_themeSkin *, .wp_themeSkin .mceText {
+border:0; margin:0; padding:0; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; vertical-align:baseline; width:auto; border-collapse:separate;
+}
+.wp_themeSkin a:hover, .wp_themeSkin a:link, .wp_themeSkin a:visited, .wp_themeSkin a:active {text-decoration:none; font-weight:normal; cursor:default;}
+.wp_themeSkin table td {vertical-align:middle}
+
+/* Containers */
+.wp_themeSkin table {}
+.wp_themeSkin iframe {display:block;}
+.wp_themeSkin .mceToolbar {padding: 2px;}
+
+/* External */
+.wp_themeSkin .mceExternalToolbar {position:absolute; border-bottom:0; display:none}
+.wp_themeSkin .mceExternalToolbar td.mceToolbar {padding-right:13px;}
+.wp_themeSkin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px; background:url(../../img/icons.gif) -820px 0}
+
+/* Layout */
+.wp_themeSkin table.mceToolbar, .wp_themeSkin tr.mceFirst .mceToolbar tr td, .wp_themeSkin tr.mceLast .mceToolbar tr td {border:0; margin:0; padding:0}
+.wp_themeSkin table.mceLayout {border:0;}
+.wp_themeSkin .mceIframeContainer {}
+.wp_themeSkin .mceStatusbar {display:block; font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible;height:20px;}
+.wp_themeSkin .mceStatusbar div {float:left; padding:2px;}
+.wp_themeSkin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize}
+.wp_themeSkin .mceStatusbar a:hover {text-decoration:underline}
+.wp_themeSkin table.mceToolbar {margin: 0 2px 2px;}
+.wp_themeSkin #content_toolbar1 {margin-top: 2px;}
+.wp_themeSkin .mceToolbar .mceToolbarEndListBox span {display:none}
+.wp_themeSkin span.mceIcon, .wp_themeSkin img.mceIcon {display:block; width:20px; height:20px}
+.wp_themeSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px}
+
+/* Button */
+.wp_themeSkin .mceButton {
+	display:block; 
+	width: 20px; 
+	height: 20px; 
+	cursor: default; 
+	padding: 1px 2px; 
+	margin: 1px; 
+	background-image: url(img/butt2.png);
+	background-position: 2px 1px;
+	background-repeat: no-repeat;
+	-moz-border-radius: 3px;
+	-webkit-border-radius: 3px;
+	-khtml-border-radius: 3px;
+	border-radius: 3px;
+}
+.wp_themeSkin a.mceButton span, .wp_themeSkin a.mceButton img {}
+.wp_themeSkin .mceOldBoxModel a.mceButton span, .wp_themeSkin .mceOldBoxModel a.mceButton img {margin:0 0 0 1px}
+.wp_themeSkin a.mceButtonEnabled:hover {
+	background-position:0 -20px;
+}
+.wp_themeSkin a.mceButtonActive, .wp_themeSkin a.mceButtonSelected {
+	background-position:0 -20px;
+}
+.wp_themeSkin .mceButtonDisabled .mceIcon {opacity:0.3; filter:alpha(opacity=30);}
+.wp_themeSkin .mceButtonDisabled {}
+
+/* Separator */
+.wp_themeSkin .mceSeparator { 
+	height: 24px; 
+	width: 1px;
+	display: block;
+	background: transparent;
+	overflow: hidden; 
+	margin: 0 2px; 
+}
+
+/* ListBox */
+.wp_themeSkin .mceListBox, .wp_themeSkin .mceListBox a {display:block}
+.wp_themeSkin .mceListBox .mceText {
+	padding: 1px 2px 1px 5px;
+	text-align:left; 
+	text-decoration: none !important;
+	width:70px;  
+	background-image: url(img/butt2.png);
+	background-position: 1px 1px;
+	background-repeat: repeat-x;
+	font-family: Tahoma,Verdana,Arial,Helvetica; 
+	font-size: 11px; 
+	height: 20px; 
+	line-height: 20px; 
+	overflow: hidden;
+}
+.wp_themeSkin .mceListBox {
+	margin: 1px;
+	direction: ltr;
+}
+.wp_themeSkin .mceListBox .mceOpen {
+	width: 14px;
+	height: 20px; 
+	border-collapse: separate;
+	background-image: url(img/butt2.png);
+	background-position: 1px 1px;
+	background-repeat: repeat-x;
+	padding: 1px;
+	border-left: 0 none !important;
+}
+.wp_themeSkin .mceListBox .mceOpen span {
+	display: block;
+	width:14px;
+	height:20px;
+	background-image: url(img/down_arrow.gif);
+	background-position: 2px 1px;
+	background-repeat: no-repeat;
+}
+.wp_themeSkin table.mceListBoxEnabled:hover .mceText, 
+.wp_themeSkin .mceListBoxHover .mceText, 
+.wp_themeSkin .mceListBoxSelected .mceText,
+.wp_themeSkin table.mceListBoxEnabled:hover .mceOpen, 
+.wp_themeSkin .mceListBoxHover .mceOpen, 
+.wp_themeSkin .mceListBoxSelected .mceOpen {
+	background-image: none;
+}
+.wp_themeSkin .mceListBoxDisabled .mceText {color:gray}
+.wp_themeSkin .mceListBoxMenu {overflow:auto; overflow-x:hidden}
+.wp_themeSkin .mceOldBoxModel .mceListBox .mceText {height:22px}
+.wp_themeSkin select.mceListBox {font-family:Tahoma,Verdana,Arial,Helvetica; font-size:12px;}
+
+/* SplitButton */
+.wp_themeSkin .mceSplitButton a, .wp_themeSkin .mceSplitButton span {display:block; height:20px}
+.wp_themeSkin .mceSplitButton { 
+	display:block;
+	margin: 1px;
+	direction: ltr;
+}
+.wp_themeSkin table.mceSplitButton td {
+	padding: 2px;
+}
+.wp_themeSkin .mceSplitButton a.mceAction {
+	height:20px;
+	width:20px;
+	background-image: url(img/butt2.png);
+	background-position: 1px 1px;
+	background-repeat: repeat-x;
+	padding: 1px 2px;
+}
+.wp_themeSkin .mceSplitButton span.mceAction {
+	background: url(../../img/icons.gif) 20px 20px;
+	width:20px; 
+}
+.wp_themeSkin .mceSplitButton a.mceOpen {
+	width:10px;
+	height:20px;
+	border-collapse:separate;
+	background-image: url(img/butt2.png);
+	background-position: 1px 1px;
+	background-repeat: repeat-x;
+	padding: 1px;
+	border-left: 0 none !important;
+}
+.wp_themeSkin .mceSplitButton span.mceOpen {
+	width:10px; 
+	background-image: url(img/down_arrow.gif);
+	background-position: 0px 1px;
+	background-repeat: no-repeat;
+	border-collapse:separate;
+	border-left: 0 none !important;
+}
+.wp_themeSkin .mceSplitButton a.mceOpen:hover,
+.wp_themeSkin .mceSplitButtonSelected a.mceOpen,
+.wp_themeSkin table.mceSplitButtonEnabled:hover a.mceAction,
+.wp_themeSkin .mceSplitButton a.mceAction:hover {
+	background-image: none;
+}
+.wp_themeSkin table.mceSplitButtonEnabled:hover span.mceOpen, 
+.wp_themeSkin .mceSplitButtonHover span.mceOpen, 
+.wp_themeSkin .mceSplitButtonSelected span.mceOpen {
+}
+.wp_themeSkin .mceSplitButtonDisabled .mceAction {
+	opacity:0.3; filter:alpha(opacity=30);
+}
+.wp_themeSkin .mceListBox a.mceText, .wp_themeSkin .mceSplitButton a.mceAction {
+	-moz-border-radius-bottomleft: 3px;
+	-webkit-border-bottom-left-radius: 3px;
+	-khtml-border-bottom-left-radius: 3px;
+	border-bottom-left-radius: 3px;
+	-moz-border-radius-topleft: 3px;
+	-webkit-border-top-left-radius: 3px;
+	-khtml-border-top-left-radius: 3px;
+	border-top-left-radius: 3px;
+}
+.wp_themeSkin .mceSplitButton a.mceOpen, .wp_themeSkin .mceListBox a.mceOpen {
+	-moz-border-radius-bottomright: 3px;
+	-webkit-border-bottom-right-radius: 3px;
+	-khtml-border-bottom-right-radius: 3px;
+	border-bottom-right-radius: 3px;
+	-moz-border-radius-topright: 3px;
+	-webkit-border-top-right-radius: 3px;
+	-khtml-border-top-right-radius: 3px;
+	border-top-right-radius: 3px;
+}
+
+/* ColorSplitButton */
+.wp_themeSkin div.mceColorSplitMenu table {}
+.wp_themeSkin .mceColorSplitMenu td {padding:2px}
+.wp_themeSkin .mceColorSplitMenu a {display:block; width:9px; height:9px; overflow:hidden;}
+.wp_themeSkin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px}
+.wp_themeSkin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px;}
+.wp_themeSkin .mceColorSplitMenu a.mceMoreColors:hover {}
+.wp_themeSkin a.mceMoreColors:hover {}
+.wp_themeSkin .mceColorPreview {position:absolute; top:15px; left:2px; width:16px; height:4px; overflow:hidden}
+
+/* Menu */
+.wp_themeSkin .mceMenu {position:absolute; left:0; top:0; z-index:1000;}
+.wp_themeSkin .mceNoIcons span.mceIcon {width:0;}
+.wp_themeSkin .mceNoIcons a .mceText {padding-left:10px}
+.wp_themeSkin .mceMenu table {}
+.wp_themeSkin .mceMenu a, .wp_themeSkin .mceMenu span, .wp_themeSkin .mceMenu {display:block}
+.wp_themeSkin .mceMenu td {height:20px;overflow:hidden;}
+.wp_themeSkin .mceMenu a {
+	position:relative;
+	padding:3px 0 4px 0;
+	text-decoration: none !important;
+}
+.wp_themeSkin .mceMenu .mceText {
+	position:relative; 
+	display:block; 
+	font-family:Tahoma,Verdana,Arial,Helvetica; 
+	cursor:default; 
+	margin:0; 
+	padding:0 25px;
+}
+.wp_themeSkin .mceMenu span.mceText, .wp_themeSkin .mceMenu .mcePreview {font-size:11px}
+.wp_themeSkin .mceMenu pre.mceText {font-family:Monospace}
+.wp_themeSkin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:22px;}
+.wp_themeSkin .mceMenu .mceMenuItemEnabled a:hover, 
+.wp_themeSkin .mceMenu .mceMenuItemActive {}
+.wp_themeSkin td.mceMenuItemSeparator {height:1px}
+.wp_themeSkin .mceMenuItemTitle a {
+	border-top: 0;
+	border-right: 0;
+	border-left: 0;
+	border-bottom-style: solid;
+	border-bottom-width: 1px;
+	text-decoration: none !important;
+}
+.wp_themeSkin .mceMenuItemTitle span.mceText {font-weight:bold; padding-left:4px}
+.wp_themeSkin .mceMenuItemDisabled .mceText {}
+.wp_themeSkin .mceMenuItemSelected .mceIcon {background:url(../default/img/menu_check.gif)}
+.wp_themeSkin .mceNoIcons .mceMenuItemSelected a {background:url(../default/img/menu_arrow.gif) no-repeat -6px center}
+.wp_themeSkin .mceMenu span.mceMenuLine {display:none}
+.wp_themeSkin .mceMenuItemSub a {background:url(../default/img/menu_arrow.gif) no-repeat top right;}
+
+/* Progress,Resize */
+.wp_themeSkin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; filter:alpha(opacity=50); background:#FFF}
+.wp_themeSkin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(../default/img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px}
+.wp_themeSkin .mcePlaceHolder {border:1px dotted gray}
+
+/* Formats */
+.wp_themeSkin .mce_formatPreview a {font-size:10px}
+.wp_themeSkin .mce_p span.mceText {}
+.wp_themeSkin .mce_address span.mceText {font-style:italic}
+.wp_themeSkin .mce_pre span.mceText {font-family:monospace}
+.wp_themeSkin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em}
+.wp_themeSkin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em}
+.wp_themeSkin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em}
+.wp_themeSkin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em}
+.wp_themeSkin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em}
+.wp_themeSkin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em}
+
+/* Theme */
+.wp_themeSkin span.mce_bold {background-position:0 0}
+.wp_themeSkin span.mce_italic {background-position:-60px 0}
+.wp_themeSkin span.mce_underline {background-position:-140px 0}
+.wp_themeSkin span.mce_strikethrough {background-position:-120px 0}
+.wp_themeSkin span.mce_undo {background-position:-160px 0}
+.wp_themeSkin span.mce_redo {background-position:-100px 0}
+.wp_themeSkin span.mce_cleanup {background-position:-40px 0}
+.wp_themeSkin span.mce_bullist {background-position:-20px 0}
+.wp_themeSkin span.mce_numlist {background-position:-80px 0}
+.wp_themeSkin span.mce_justifyleft {background-position:-460px 0}
+.wp_themeSkin span.mce_justifyright {background-position:-480px 0}
+.wp_themeSkin span.mce_justifycenter {background-position:-420px 0}
+.wp_themeSkin span.mce_justifyfull {background-position:-440px 0}
+.wp_themeSkin span.mce_anchor {background-position:-200px 0}
+.wp_themeSkin span.mce_indent {background-position:-400px 0}
+.wp_themeSkin span.mce_outdent {background-position:-540px 0}
+.wp_themeSkin span.mce_link {background-position:-500px 0}
+.wp_themeSkin span.mce_unlink {background-position:-640px 0}
+.wp_themeSkin span.mce_sub {background-position:-600px 0}
+.wp_themeSkin span.mce_sup {background-position:-620px 0}
+.wp_themeSkin span.mce_removeformat {background-position:-580px 0}
+.wp_themeSkin span.mce_newdocument {background-position:-520px 0}
+.wp_themeSkin span.mce_image {background-position:-380px 0}
+.wp_themeSkin span.mce_help {background-position:-340px 0}
+.wp_themeSkin span.mce_code {background-position:-260px 0}
+.wp_themeSkin span.mce_hr {background-position:-360px 0}
+.wp_themeSkin span.mce_visualaid {background-position:-660px 0}
+.wp_themeSkin span.mce_charmap {background-position:-240px 0}
+.wp_themeSkin span.mce_paste {background-position:-560px 0}
+.wp_themeSkin span.mce_copy {background-position:-700px 0}
+.wp_themeSkin span.mce_cut {background-position:-680px 0}
+.wp_themeSkin span.mce_blockquote {background-position:-220px 0}
+.wp_themeSkin .mce_forecolor span.mceAction {background-position:-720px 0}
+.wp_themeSkin .mce_backcolor span.mceAction {background-position:-760px 0}
+.wp_themeSkin .mce_forecolorpicker {background-position:-720px 0}
+.wp_themeSkin .mce_backcolorpicker {background-position:-760px 0}
+
+/* Plugins */
+.wp_themeSkin span.mce_advhr {background-position:-0px -20px}
+.wp_themeSkin span.mce_ltr {background-position:-20px -20px}
+.wp_themeSkin span.mce_rtl {background-position:-40px -20px}
+.wp_themeSkin span.mce_emotions {background-position:-60px -20px}
+.wp_themeSkin span.mce_fullpage {background-position:-80px -20px}
+.wp_themeSkin span.mce_fullscreen {background-position:-100px -20px}
+.wp_themeSkin span.mce_iespell {background-position:-120px -20px}
+.wp_themeSkin span.mce_insertdate {background-position:-140px -20px}
+.wp_themeSkin span.mce_inserttime {background-position:-160px -20px}
+.wp_themeSkin span.mce_absolute {background-position:-180px -20px}
+.wp_themeSkin span.mce_backward {background-position:-200px -20px}
+.wp_themeSkin span.mce_forward {background-position:-220px -20px}
+.wp_themeSkin span.mce_insert_layer {background-position:-240px -20px}
+.wp_themeSkin span.mce_insertlayer {background-position:-260px -20px}
+.wp_themeSkin span.mce_movebackward {background-position:-280px -20px}
+.wp_themeSkin span.mce_moveforward {background-position:-300px -20px}
+.wp_themeSkin span.mce_media {background-position:-320px -20px}
+.wp_themeSkin span.mce_nonbreaking {background-position:-340px -20px}
+.wp_themeSkin span.mce_pastetext {background-position:-360px -20px}
+.wp_themeSkin span.mce_pasteword {background-position:-380px -20px}
+.wp_themeSkin span.mce_selectall {background-position:-400px -20px}
+.wp_themeSkin span.mce_preview {background-position:-420px -20px}
+.wp_themeSkin span.mce_print {background-position:-440px -20px}
+.wp_themeSkin span.mce_cancel {background-position:-460px -20px}
+.wp_themeSkin span.mce_save {background-position:-480px -20px}
+.wp_themeSkin span.mce_replace {background-position:-500px -20px}
+.wp_themeSkin span.mce_search {background-position:-520px -20px}
+.wp_themeSkin span.mce_styleprops {background-position:-560px -20px}
+.wp_themeSkin span.mce_table {background-position:-580px -20px}
+.wp_themeSkin span.mce_cell_props {background-position:-600px -20px}
+.wp_themeSkin span.mce_delete_table {background-position:-620px -20px}
+.wp_themeSkin span.mce_delete_col {background-position:-640px -20px}
+.wp_themeSkin span.mce_delete_row {background-position:-660px -20px}
+.wp_themeSkin span.mce_col_after {background-position:-680px -20px}
+.wp_themeSkin span.mce_col_before {background-position:-700px -20px}
+.wp_themeSkin span.mce_row_after {background-position:-720px -20px}
+.wp_themeSkin span.mce_row_before {background-position:-740px -20px}
+.wp_themeSkin span.mce_merge_cells {background-position:-760px -20px}
+.wp_themeSkin span.mce_table_props {background-position:-980px -20px}
+.wp_themeSkin span.mce_row_props {background-position:-780px -20px}
+.wp_themeSkin span.mce_split_cells {background-position:-800px -20px}
+.wp_themeSkin span.mce_template {background-position:-820px -20px}
+.wp_themeSkin span.mce_visualchars {background-position:-840px -20px}
+.wp_themeSkin span.mce_abbr {background-position:-860px -20px}
+.wp_themeSkin span.mce_acronym {background-position:-880px -20px}
+.wp_themeSkin span.mce_attribs {background-position:-900px -20px}
+.wp_themeSkin span.mce_cite {background-position:-920px -20px}
+.wp_themeSkin span.mce_del {background-position:-940px -20px}
+.wp_themeSkin span.mce_ins {background-position:-960px -20px}
+.wp_themeSkin span.mce_pagebreak {background-position:0 -40px}
+.wp_themeSkin .mce_spellchecker span.mceAction {background-position:-540px -20px}
+
+/* border */
+.wp_themeSkin .mceExternalToolbar, 
+.wp_themeSkin .mceButton, 
+.wp_themeSkin a.mceButtonEnabled:hover, 
+.wp_themeSkin a.mceButtonActive, 
+.wp_themeSkin a.mceButtonSelected, 
+.wp_themeSkin .mceListBox .mceText, 
+.wp_themeSkin .mceListBox .mceOpen, 
+.wp_themeSkin table.mceListBoxEnabled:hover .mceText, 
+.wp_themeSkin .mceListBoxHover .mceText, 
+.wp_themeSkin .mceListBoxSelected .mceText, 
+.wp_themeSkin table.mceListBoxEnabled:hover .mceOpen, 
+.wp_themeSkin .mceListBoxHover .mceOpen, 
+.wp_themeSkin .mceListBoxSelected .mceOpen, 
+.wp_themeSkin select.mceListBox, 
+.wp_themeSkin .mceSplitButton a.mceAction, 
+.wp_themeSkin .mceSplitButton a.mceOpen,
+.wp_themeSkin .mceSplitButton a.mceOpen:hover, 
+.wp_themeSkin .mceSplitButtonSelected a.mceOpen, 
+.wp_themeSkin table.mceSplitButtonEnabled:hover a.mceAction, 
+.wp_themeSkin .mceSplitButton a.mceAction:hover, 
+.wp_themeSkin div.mceColorSplitMenu table, 
+.wp_themeSkin .mceColorSplitMenu a, 
+.wp_themeSkin .mceColorSplitMenu a.mceMoreColors, 
+.wp_themeSkin .mceColorSplitMenu a.mceMoreColors:hover, 
+.wp_themeSkin a.mceMoreColors:hover, 
+.wp_themeSkin .mceMenu {
+	border-style: solid; 
+	border-width: 1px;
+}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/themes/advanced/source_editor.htm 2.5.src/wp-includes/js/tinymce/themes/advanced/source_editor.htm
--- 2.2.2.src/wp-includes/js/tinymce/themes/advanced/source_editor.htm	2007-01-08 19:16:40.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/themes/advanced/source_editor.htm	2008-03-12 17:47:11.000000000 -0500
@@ -1,30 +1,30 @@
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
-	<title>{$lang_theme_code_title}</title>
-	<script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
-	<script language="javascript" type="text/javascript" src="jscripts/source_editor.js"></script>
+	<title>{#advanced_dlg.code_title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="js/source_editor.js"></script>
 	<base target="_self" />
 </head>
-<body onload="tinyMCEPopup.executeOnLoad('onLoadInit();');document.body.style.display='';document.getElementById('htmlSource').focus();" onresize="resizeInputs();" style="display: none">
-	<form name="source" onsubmit="saveContent();" action="#">
-		<div style="float: left" class="title">{$lang_theme_code_title}</div>
+<body onresize="resizeInputs();" style="display:none; overflow:hidden;">
+	<form name="source" onsubmit="saveContent();return false;" action="#">
+		<div style="float: left" class="title">{#advanced_dlg.code_title}</div>
 
 		<div id="wrapline" style="float: right">
-			<input type="checkbox" name="wraped" id="wraped" onclick="toggleWordWrap(this);" class="wordWrapCode" /><label for="wraped">{$lang_theme_code_wordwrap}</label>
+			<input type="checkbox" name="wraped" id="wraped" onclick="toggleWordWrap(this);" class="wordWrapCode" /><label for="wraped">{#advanced_dlg.code_wordwrap}</label>
 		</div>
 
 		<br style="clear: both" />
 
-		<textarea name="htmlSource" id="htmlSource" rows="15" cols="100" style="width: 100%; height: 100%; font-family: 'Courier New',Courier,mono; font-size: 12px" dir="ltr" wrap="off"></textarea>
+		<textarea name="htmlSource" id="htmlSource" rows="15" cols="100" style="width: 100%; height: 100%; font-family: 'Courier New',Courier,monospace; font-size: 12px;" dir="ltr" wrap="off" class="mceFocus"></textarea>
 
 		<div class="mceActionPanel">
 			<div style="float: left">
-				<input type="button" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" id="cancel" />
+				<input type="button" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" id="cancel" />
 			</div>
 
 			<div style="float: right">
-				<input type="submit" name="insert" value="{$lang_update}" onclick="saveContent();" id="insert" />
+				<input type="submit" name="insert" value="{#update}" id="insert" />
 			</div>
 		</div>
 	</form>
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/tiny_mce.js 2.5.src/wp-includes/js/tinymce/tiny_mce.js
--- 2.2.2.src/wp-includes/js/tinymce/tiny_mce.js	2007-04-12 12:04:03.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/tiny_mce.js	2008-03-25 22:22:53.000000000 -0500
@@ -1,7492 +1 @@
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_Engine.class.js */
-
-function TinyMCE_Engine() {
-	var ua;
-
-	this.majorVersion = "2";
-	this.minorVersion = "1.0";
-	this.releaseDate = "2007-02-13";
-
-	this.instances = new Array();
-	this.switchClassCache = new Array();
-	this.windowArgs = new Array();
-	this.loadedFiles = new Array();
-	this.pendingFiles = new Array();
-	this.loadingIndex = 0;
-	this.configs = new Array();
-	this.currentConfig = 0;
-	this.eventHandlers = new Array();
-	this.log = new Array();
-	this.undoLevels = [];
-	this.undoIndex = 0;
-	this.typingUndoIndex = -1;
-
-	// Browser check
-	ua = navigator.userAgent;
-	this.isMSIE = (navigator.appName == "Microsoft Internet Explorer");
-	this.isMSIE5 = this.isMSIE && (ua.indexOf('MSIE 5') != -1);
-	this.isMSIE5_0 = this.isMSIE && (ua.indexOf('MSIE 5.0') != -1);
-	this.isMSIE7 = this.isMSIE && (ua.indexOf('MSIE 7') != -1);
-	this.isGecko = ua.indexOf('Gecko') != -1;
-	this.isSafari = ua.indexOf('Safari') != -1;
-	this.isOpera = ua.indexOf('Opera') != -1;
-	this.isMac = ua.indexOf('Mac') != -1;
-	this.isNS7 = ua.indexOf('Netscape/7') != -1;
-	this.isNS71 = ua.indexOf('Netscape/7.1') != -1;
-	this.dialogCounter = 0;
-	this.plugins = new Array();
-	this.themes = new Array();
-	this.menus = new Array();
-	this.loadedPlugins = new Array();
-	this.buttonMap = new Array();
-	this.isLoaded = false;
-
-	// Fake MSIE on Opera and if Opera fakes IE, Gecko or Safari cancel those
-	if (this.isOpera) {
-		this.isMSIE = true;
-		this.isGecko = false;
-		this.isSafari =  false;
-	}
-
-	this.isIE = this.isMSIE;
-	this.isRealIE = this.isMSIE && !this.isOpera;
-
-	// TinyMCE editor id instance counter
-	this.idCounter = 0;
-};
-
-TinyMCE_Engine.prototype = {
-	init : function(settings) {
-		var theme, nl, baseHREF = "", i;
-
-		// IE 5.0x is no longer supported since 5.5, 6.0 and 7.0 now exists. We can't support old browsers forever, sorry.
-		if (this.isMSIE5_0)
-			return;
-
-		this.settings = settings;
-
-		// Check if valid browser has execcommand support
-		if (typeof(document.execCommand) == 'undefined')
-			return;
-
-		// Get script base path
-		if (!tinyMCE.baseURL) {
-			var elements = document.getElementsByTagName('script');
-
-			// If base element found, add that infront of baseURL
-			nl = document.getElementsByTagName('base');
-			for (i=0; i<nl.length; i++) {
-				if (nl[i].href)
-					baseHREF = nl[i].href;
-			}
-
-			for (var i=0; i<elements.length; i++) {
-				if (elements[i].src && (elements[i].src.indexOf("tiny_mce.js") != -1 || elements[i].src.indexOf("tiny_mce_dev.js") != -1 || elements[i].src.indexOf("tiny_mce_src.js") != -1 || elements[i].src.indexOf("tiny_mce_gzip") != -1)) {
-					var src = elements[i].src;
-
-					tinyMCE.srcMode = (src.indexOf('_src') != -1 || src.indexOf('_dev') != -1) ? '_src' : '';
-					tinyMCE.gzipMode = src.indexOf('_gzip') != -1;
-					src = src.substring(0, src.lastIndexOf('/'));
-
-					if (settings.exec_mode == "src" || settings.exec_mode == "normal")
-						tinyMCE.srcMode = settings.exec_mode == "src" ? '_src' : '';
-
-					// Force it absolute if page has a base href
-					if (baseHREF != "" && src.indexOf('://') == -1)
-						tinyMCE.baseURL = baseHREF + src;
-					else
-						tinyMCE.baseURL = src;
-
-					break;
-				}
-			}
-		}
-
-		// Get document base path
-		this.documentBasePath = document.location.href;
-		if (this.documentBasePath.indexOf('?') != -1)
-			this.documentBasePath = this.documentBasePath.substring(0, this.documentBasePath.indexOf('?'));
-		this.documentURL = this.documentBasePath;
-		this.documentBasePath = this.documentBasePath.substring(0, this.documentBasePath.lastIndexOf('/'));
-
-		// If not HTTP absolute
-		if (tinyMCE.baseURL.indexOf('://') == -1 && tinyMCE.baseURL.charAt(0) != '/') {
-			// If site absolute
-			tinyMCE.baseURL = this.documentBasePath + "/" + tinyMCE.baseURL;
-		}
-
-		// Set default values on settings
-		this._def("mode", "none");
-		this._def("theme", "advanced");
-		this._def("plugins", "", true);
-		this._def("language", "en");
-		this._def("docs_language", this.settings['language']);
-		this._def("elements", "");
-		this._def("textarea_trigger", "mce_editable");
-		this._def("editor_selector", "");
-		this._def("editor_deselector", "mceNoEditor");
-		this._def("valid_elements", "+a[id|style|rel|rev|charset|hreflang|dir|lang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],-strong/-b[class|style],-em/-i[class|style],-strike[class|style],-u[class|style],#p[id|style|dir|class|align],-ol[class|style],-ul[class|style],-li[class|style],br,img[id|dir|lang|longdesc|usemap|style|class|src|onmouseover|onmouseout|border|alt=|title|hspace|vspace|width|height|align],-sub[style|class],-sup[style|class],-blockquote[dir|style],-table[border=0|cellspacing|cellpadding|width|height|class|align|summary|style|dir|id|lang|bgcolor|background|bordercolor],-tr[id|lang|dir|class|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor],tbody[id|class],thead[id|class],tfoot[id|class],#td[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor|scope],-th[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|scope],caption[id|lang|dir|class|style],-div[id|dir|class|align|style],-span[style|class|align],-pre[class|align|style],address[class|align|style],-h1[id|style|dir|class|align],-h2[id|style|dir|class|align],-h3[id|style|dir|class|align],-h4[id|style|dir|class|align],-h5[id|style|dir|class|align],-h6[id|style|dir|class|align],hr[class|style],-font[face|size|style|id|class|dir|color],dd[id|class|title|style|dir|lang],dl[id|class|title|style|dir|lang],dt[id|class|title|style|dir|lang],cite[title|id|class|style|dir|lang],abbr[title|id|class|style|dir|lang],acronym[title|id|class|style|dir|lang],del[title|id|class|style|dir|lang|datetime|cite],ins[title|id|class|style|dir|lang|datetime|cite]");
-		this._def("extended_valid_elements", "");
-		this._def("invalid_elements", "");
-		this._def("encoding", "");
-		this._def("urlconverter_callback", tinyMCE.getParam("urlconvertor_callback", "TinyMCE_Engine.prototype.convertURL"));
-		this._def("save_callback", "");
-		this._def("debug", false);
-		this._def("force_br_newlines", false);
-		this._def("force_p_newlines", true);
-		this._def("add_form_submit_trigger", true);
-		this._def("relative_urls", true);
-		this._def("remove_script_host", true);
-		this._def("focus_alert", true);
-		this._def("document_base_url", this.documentURL);
-		this._def("visual", true);
-		this._def("visual_table_class", "mceVisualAid");
-		this._def("setupcontent_callback", "");
-		this._def("fix_content_duplication", true);
-		this._def("custom_undo_redo", true);
-		this._def("custom_undo_redo_levels", -1);
-		this._def("custom_undo_redo_keyboard_shortcuts", true);
-		this._def("custom_undo_redo_restore_selection", true);
-		this._def("custom_undo_redo_global", false);
-		this._def("verify_html", true);
-		this._def("apply_source_formatting", false);
-		this._def("directionality", "ltr");
-		this._def("cleanup_on_startup", false);
-		this._def("inline_styles", false);
-		this._def("convert_newlines_to_brs", false);
-		this._def("auto_reset_designmode", true);
-		this._def("entities", "39,#39,160,nbsp,161,iexcl,162,cent,163,pound,164,curren,165,yen,166,brvbar,167,sect,168,uml,169,copy,170,ordf,171,laquo,172,not,173,shy,174,reg,175,macr,176,deg,177,plusmn,178,sup2,179,sup3,180,acute,181,micro,182,para,183,middot,184,cedil,185,sup1,186,ordm,187,raquo,188,frac14,189,frac12,190,frac34,191,iquest,192,Agrave,193,Aacute,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,201,Eacute,202,Ecirc,203,Euml,204,Igrave,205,Iacute,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,211,Oacute,212,Ocirc,213,Otilde,214,Ouml,215,times,216,Oslash,217,Ugrave,218,Uacute,219,Ucirc,220,Uuml,221,Yacute,222,THORN,223,szlig,224,agrave,225,aacute,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,233,eacute,234,ecirc,235,euml,236,igrave,237,iacute,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,243,oacute,244,ocirc,245,otilde,246,ouml,247,divide,248,oslash,249,ugrave,250,uacute,251,ucirc,252,uuml,253,yacute,254,thorn,255,yuml,402,fnof,913,Alpha,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,977,thetasym,978,upsih,982,piv,8226,bull,8230,hellip,8242,prime,8243,Prime,8254,oline,8260,frasl,8472,weierp,8465,image,8476,real,8482,trade,8501,alefsym,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8704,forall,8706,part,8707,exist,8709,empty,8711,nabla,8712,isin,8713,notin,8715,ni,8719,prod,8721,sum,8722,minus,8727,lowast,8730,radic,8733,prop,8734,infin,8736,ang,8743,and,8744,or,8745,cap,8746,cup,8747,int,8756,there4,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8804,le,8805,ge,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,34,quot,38,amp,60,lt,62,gt,338,OElig,339,oelig,352,Scaron,353,scaron,376,Yuml,710,circ,732,tilde,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,8211,ndash,8212,mdash,8216,lsquo,8217,rsquo,8218,sbquo,8220,ldquo,8221,rdquo,8222,bdquo,8224,dagger,8225,Dagger,8240,permil,8249,lsaquo,8250,rsaquo,8364,euro", true);
-		this._def("entity_encoding", "named");
-		this._def("cleanup_callback", "");
-		this._def("add_unload_trigger", true);
-		this._def("ask", false);
-		this._def("nowrap", false);
-		this._def("auto_resize", false);
-		this._def("auto_focus", false);
-		this._def("cleanup", true);
-		this._def("remove_linebreaks", true);
-		this._def("button_tile_map", false);
-		this._def("submit_patch", true);
-		this._def("browsers", "msie,safari,gecko,opera", true);
-		this._def("dialog_type", "window");
-		this._def("accessibility_warnings", true);
-		this._def("accessibility_focus", true);
-		this._def("merge_styles_invalid_parents", "");
-		this._def("force_hex_style_colors", true);
-		this._def("trim_span_elements", true);
-		this._def("convert_fonts_to_spans", false);
-		this._def("doctype", '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">');
-		this._def("font_size_classes", '');
-		this._def("font_size_style_values", 'xx-small,x-small,small,medium,large,x-large,xx-large', true);
-		this._def("event_elements", 'a,img', true);
-		this._def("convert_urls", true);
-		this._def("table_inline_editing", false);
-		this._def("object_resizing", true);
-		this._def("custom_shortcuts", true);
-		this._def("convert_on_click", false);
-		this._def("content_css", '');
-		this._def("fix_list_elements", true);
-		this._def("fix_table_elements", false);
-		this._def("strict_loading_mode", document.contentType == 'application/xhtml+xml');
-		this._def("hidden_tab_class", '');
-		this._def("display_tab_class", '');
-		this._def("gecko_spellcheck", false);
-		this._def("hide_selects_on_submit", true);
-
-		// Force strict loading mode to false on non Gecko browsers
-		if (this.isMSIE && !this.isOpera)
-			this.settings.strict_loading_mode = false;
-
-		// Browser check IE
-		if (this.isMSIE && this.settings['browsers'].indexOf('msie') == -1)
-			return;
-
-		// Browser check Gecko
-		if (this.isGecko && this.settings['browsers'].indexOf('gecko') == -1)
-			return;
-
-		// Browser check Safari
-		if (this.isSafari && this.settings['browsers'].indexOf('safari') == -1)
-			return;
-
-		// Browser check Opera
-		if (this.isOpera && this.settings['browsers'].indexOf('opera') == -1)
-			return;
-
-		// If not super absolute make it so
-		baseHREF = tinyMCE.settings['document_base_url'];
-		var h = document.location.href;
-		var p = h.indexOf('://');
-		if (p > 0 && document.location.protocol != "file:") {
-			p = h.indexOf('/', p + 3);
-			h = h.substring(0, p);
-
-			if (baseHREF.indexOf('://') == -1)
-				baseHREF = h + baseHREF;
-
-			tinyMCE.settings['document_base_url'] = baseHREF;
-			tinyMCE.settings['document_base_prefix'] = h;
-		}
-
-		// Trim away query part
-		if (baseHREF.indexOf('?') != -1)
-			baseHREF = baseHREF.substring(0, baseHREF.indexOf('?'));
-
-		this.settings['base_href'] = baseHREF.substring(0, baseHREF.lastIndexOf('/')) + "/";
-
-		theme = this.settings['theme'];
-		this.inlineStrict = 'A|BR|SPAN|BDO|MAP|OBJECT|IMG|TT|I|B|BIG|SMALL|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|#text|#comment';
-		this.inlineTransitional = 'A|BR|SPAN|BDO|OBJECT|APPLET|IMG|MAP|IFRAME|TT|I|B|U|S|STRIKE|BIG|SMALL|FONT|BASEFONT|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|INPUT|SELECT|TEXTAREA|LABEL|BUTTON|#text|#comment';
-		this.blockElms = 'H[1-6]|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|FORM|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP';
-		this.blockRegExp = new RegExp("^(" + this.blockElms + ")$", "i");
-		this.posKeyCodes = new Array(13,45,36,35,33,34,37,38,39,40);
-		this.uniqueURL = 'javascript:void(091039730);'; // Make unique URL non real URL
-		this.uniqueTag = '<div id="mceTMPElement" style="display: none">TMP</div>';
-		this.callbacks = new Array('onInit', 'getInfo', 'getEditorTemplate', 'setupContent', 'onChange', 'onPageLoad', 'handleNodeChange', 'initInstance', 'execCommand', 'getControlHTML', 'handleEvent', 'cleanup', 'removeInstance');
-
-		// Theme url
-		this.settings['theme_href'] = tinyMCE.baseURL + "/themes/" + theme;
-
-		if (!tinyMCE.isIE || tinyMCE.isOpera)
-			this.settings['force_br_newlines'] = false;
-
-		if (tinyMCE.getParam("popups_css", false)) {
-			var cssPath = tinyMCE.getParam("popups_css", "");
-
-			// Is relative
-			if (cssPath.indexOf('://') == -1 && cssPath.charAt(0) != '/')
-				this.settings['popups_css'] = this.documentBasePath + "/" + cssPath;
-			else
-				this.settings['popups_css'] = cssPath;
-		} else
-			this.settings['popups_css'] = tinyMCE.baseURL + "/themes/" + theme + "/css/editor_popup.css";
-
-		if (tinyMCE.getParam("editor_css", false)) {
-			var cssPath = tinyMCE.getParam("editor_css", "");
-
-			// Is relative
-			if (cssPath.indexOf('://') == -1 && cssPath.charAt(0) != '/')
-				this.settings['editor_css'] = this.documentBasePath + "/" + cssPath;
-			else
-				this.settings['editor_css'] = cssPath;
-		} else {
-			if (this.settings.editor_css != '')
-				this.settings['editor_css'] = tinyMCE.baseURL + "/themes/" + theme + "/css/editor_ui.css";
-		}
-
-		if (tinyMCE.settings['debug']) {
-			var msg = "Debug: \n";
-
-			msg += "baseURL: " + this.baseURL + "\n";
-			msg += "documentBasePath: " + this.documentBasePath + "\n";
-			msg += "content_css: " + this.settings['content_css'] + "\n";
-			msg += "popups_css: " + this.settings['popups_css'] + "\n";
-			msg += "editor_css: " + this.settings['editor_css'] + "\n";
-
-			alert(msg);
-		}
-
-		// Only do this once
-		if (this.configs.length == 0) {
-			if (typeof(TinyMCECompressed) == "undefined") {
-				tinyMCE.addEvent(window, "DOMContentLoaded", TinyMCE_Engine.prototype.onLoad);
-
-				if (tinyMCE.isRealIE) {
-					if (document.body)
-						tinyMCE.addEvent(document.body, "readystatechange", TinyMCE_Engine.prototype.onLoad);
-					else
-						tinyMCE.addEvent(document, "readystatechange", TinyMCE_Engine.prototype.onLoad);
-				}
-
-				tinyMCE.addEvent(window, "load", TinyMCE_Engine.prototype.onLoad);
-				tinyMCE._addUnloadEvents();
-			}
-		}
-
-		this.loadScript(tinyMCE.baseURL + '/themes/' + this.settings['theme'] + '/editor_template' + tinyMCE.srcMode + '.js');
-		this.loadScript(tinyMCE.baseURL + '/langs/' + this.settings['language'] +  '.js');
-		this.loadCSS(this.settings['editor_css']);
-
-		// Add plugins
-		var p = tinyMCE.getParam('plugins', '', true, ',');
-		if (p.length > 0) {
-			for (var i=0; i<p.length; i++) {
-				if (p[i].charAt(0) != '-')
-					this.loadScript(tinyMCE.baseURL + '/plugins/' + p[i] + '/editor_plugin' + tinyMCE.srcMode + '.js');
-			}
-		}
-
-		// Setup entities
-		if (tinyMCE.getParam('entity_encoding') == 'named') {
-			settings['cleanup_entities'] = new Array();
-			var entities = tinyMCE.getParam('entities', '', true, ',');
-			for (var i=0; i<entities.length; i+=2)
-				settings['cleanup_entities']['c' + entities[i]] = entities[i+1];
-		}
-
-		// Save away this config
-		settings['index'] = this.configs.length;
-		this.configs[this.configs.length] = settings;
-
-		// Start loading first one in chain
-		this.loadNextScript();
-
-		// Force flicker free CSS backgrounds in IE
-		if (this.isIE && !this.isOpera) {
-			try {
-				document.execCommand('BackgroundImageCache', false, true);
-			} catch (e) {
-			}
-		}
-
-		// Setup XML encoding regexps
-		this.xmlEncodeAposRe = new RegExp('[<>&"\']', 'g');
-		this.xmlEncodeRe = new RegExp('[<>&"]', 'g');
-//		this.xmlEncodeEnts = {'&':'&amp;','"':'&quot;',"'":'&#39;','<':'&lt;','>':'&gt;'};
-	},
-
-	_addUnloadEvents : function() {
-		if (tinyMCE.isIE) {
-			if (tinyMCE.settings['add_unload_trigger']) {
-				tinyMCE.addEvent(window, "unload", TinyMCE_Engine.prototype.unloadHandler);
-				tinyMCE.addEvent(window.document, "beforeunload", TinyMCE_Engine.prototype.unloadHandler);
-			}
-		} else {
-			if (tinyMCE.settings['add_unload_trigger'])
-				tinyMCE.addEvent(window, "unload", function () {tinyMCE.triggerSave(true, true);});
-		}
-	},
-
-	_def : function(key, def_val, t) {
-		var v = tinyMCE.getParam(key, def_val);
-
-		v = t ? v.replace(/\s+/g, "") : v;
-
-		this.settings[key] = v;
-	},
-
-	hasPlugin : function(n) {
-		return typeof(this.plugins[n]) != "undefined" && this.plugins[n] != null;
-	},
-
-	addPlugin : function(n, p) {
-		var op = this.plugins[n];
-
-		// Use the previous plugin object base URL used when loading external plugins
-		p.baseURL = op ? op.baseURL : tinyMCE.baseURL + "/plugins/" + n;
-		this.plugins[n] = p;
-
-		this.loadNextScript();
-	},
-
-	setPluginBaseURL : function(n, u) {
-		var op = this.plugins[n];
-
-		if (op)
-			op.baseURL = u;
-		else
-			this.plugins[n] = {baseURL : u};
-	},
-
-	loadPlugin : function(n, u) {
-		u = u.indexOf('.js') != -1 ? u.substring(0, u.lastIndexOf('/')) : u;
-		u = u.charAt(u.length-1) == '/' ? u.substring(0, u.length-1) : u;
-		this.plugins[n] = {baseURL : u};
-		this.loadScript(u + "/editor_plugin" + (tinyMCE.srcMode ? '_src' : '') + ".js");
-	},
-
-	hasTheme : function(n) {
-		return typeof(this.themes[n]) != "undefined" && this.themes[n] != null;
-	},
-
-	addTheme : function(n, t) {
-		this.themes[n] = t;
-
-		this.loadNextScript();
-	},
-
-	addMenu : function(n, m) {
-		this.menus[n] = m;
-	},
-
-	hasMenu : function(n) {
-		return typeof(this.plugins[n]) != "undefined" && this.plugins[n] != null;
-	},
-
-	loadScript : function(url) {
-		var i;
-
-		for (i=0; i<this.loadedFiles.length; i++) {
-			if (this.loadedFiles[i] == url)
-				return;
-		}
-
-		if (tinyMCE.settings.strict_loading_mode)
-			this.pendingFiles[this.pendingFiles.length] = url;
-		else
-			document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></script>');
-
-		this.loadedFiles[this.loadedFiles.length] = url;
-	},
-
-	loadNextScript : function() {
-		var d = document, se;
-
-		if (!tinyMCE.settings.strict_loading_mode)
-			return;
-
-		if (this.loadingIndex < this.pendingFiles.length) {
-			se = d.createElementNS('http://www.w3.org/1999/xhtml', 'script');
-			se.setAttribute('language', 'javascript');
-			se.setAttribute('type', 'text/javascript');
-			se.setAttribute('src', this.pendingFiles[this.loadingIndex++]);
-
-			d.getElementsByTagName("head")[0].appendChild(se);
-		} else
-			this.loadingIndex = -1; // Done with loading
-	},
-
-	loadCSS : function(url) {
-		var ar = url.replace(/\s+/, '').split(',');
-		var lflen = 0, csslen = 0;
-		var skip = false;
-		var x = 0, i = 0, nl, le;
-
-		for (x = 0,csslen = ar.length; x<csslen; x++) {
-			if (ar[x] != null && ar[x] != 'null' && ar[x].length > 0) {
-				/* Make sure it doesn't exist. */
-				for (i=0, lflen=this.loadedFiles.length; i<lflen; i++) {
-					if (this.loadedFiles[i] == ar[x]) {
-						skip = true;
-						break;
-					}
-				}
-
-				if (!skip) {
-					if (tinyMCE.settings.strict_loading_mode) {
-						nl = document.getElementsByTagName("head");
-
-						le = document.createElement('link');
-						le.setAttribute('href', ar[x]);
-						le.setAttribute('rel', 'stylesheet');
-						le.setAttribute('type', 'text/css');
-
-						nl[0].appendChild(le);			
-					} else
-						document.write('<link href="' + ar[x] + '" rel="stylesheet" type="text/css" />');
-
-					this.loadedFiles[this.loadedFiles.length] = ar[x];
-				}
-			}
-		}
-	},
-
-	importCSS : function(doc, css) {
-		var css_ary = css.replace(/\s+/, '').split(',');
-		var csslen, elm, headArr, x, css_file;
-
-		for (x = 0, csslen = css_ary.length; x<csslen; x++) {
-			css_file = css_ary[x];
-
-			if (css_file != null && css_file != 'null' && css_file.length > 0) {
-				// Is relative, make absolute
-				if (css_file.indexOf('://') == -1 && css_file.charAt(0) != '/')
-					css_file = this.documentBasePath + "/" + css_file;
-
-				if (typeof(doc.createStyleSheet) == "undefined") {
-					elm = doc.createElement("link");
-
-					elm.rel = "stylesheet";
-					elm.href = css_file;
-
-					if ((headArr = doc.getElementsByTagName("head")) != null && headArr.length > 0)
-						headArr[0].appendChild(elm);
-				} else
-					doc.createStyleSheet(css_file);
-			}
-		}
-	},
-
-	confirmAdd : function(e, settings) {
-		var elm = tinyMCE.isIE ? event.srcElement : e.target;
-		var elementId = elm.name ? elm.name : elm.id;
-
-		tinyMCE.settings = settings;
-
-		if (tinyMCE.settings['convert_on_click'] || (!elm.getAttribute('mce_noask') && confirm(tinyMCELang['lang_edit_confirm'])))
-			tinyMCE.addMCEControl(elm, elementId);
-
-		elm.setAttribute('mce_noask', 'true');
-	},
-
-	updateContent : function(form_element_name) {
-		// Find MCE instance linked to given form element and copy it's value
-		var formElement = document.getElementById(form_element_name);
-		for (var n in tinyMCE.instances) {
-			var inst = tinyMCE.instances[n];
-			if (!tinyMCE.isInstance(inst))
-				continue;
-
-			inst.switchSettings();
-
-			if (inst.formElement == formElement) {
-				var doc = inst.getDoc();
-		
-				tinyMCE._setHTML(doc, inst.formElement.value);
-
-				if (!tinyMCE.isIE)
-					doc.body.innerHTML = tinyMCE._cleanupHTML(inst, doc, this.settings, doc.body, inst.visualAid);
-			}
-		}
-	},
-
-	addMCEControl : function(replace_element, form_element_name, target_document) {
-		var id = "mce_editor_" + tinyMCE.idCounter++;
-		var inst = new TinyMCE_Control(tinyMCE.settings);
-
-		inst.editorId = id;
-		this.instances[id] = inst;
-
-		inst._onAdd(replace_element, form_element_name, target_document);
-	},
-
-	removeInstance : function(ti) {
-		var t = [], n, i;
-
-		// Remove from instances
-		for (n in tinyMCE.instances) {
-			i = tinyMCE.instances[n];
-
-			if (tinyMCE.isInstance(i) && ti != i)
-					t[n] = i;
-		}
-
-		tinyMCE.instances = t;
-
-		// Remove from global undo/redo
-		n = [];
-		t = tinyMCE.undoLevels;
-
-		for (i=0; i<t.length; i++) {
-			if (t[i] != ti)
-				n.push(t[i]);
-		}
-
-		tinyMCE.undoLevels = n;
-		tinyMCE.undoIndex = n.length;
-
-		// Dispatch remove instance call
-		tinyMCE.dispatchCallback(ti, 'remove_instance_callback', 'removeInstance', ti);
-
-		return ti;
-	},
-
-	removeMCEControl : function(editor_id) {
-		var inst = tinyMCE.getInstanceById(editor_id), h, re, ot, tn;
-
-		if (inst) {
-			inst.switchSettings();
-
-			editor_id = inst.editorId;
-			h = tinyMCE.getContent(editor_id);
-
-			this.removeInstance(inst);
-
-			tinyMCE.selectedElement = null;
-			tinyMCE.selectedInstance = null;
-
-			// Remove element
-			re = document.getElementById(editor_id + "_parent");
-			ot = inst.oldTargetElement;
-			tn = ot.nodeName.toLowerCase();
-
-			if (tn == "textarea" || tn == "input") {
-				re.parentNode.removeChild(re);
-				ot.style.display = "inline";
-				ot.value = h;
-			} else {
-				ot.innerHTML = h;
-				ot.style.display = 'block';
-				re.parentNode.insertBefore(ot, re);
-				re.parentNode.removeChild(re);
-			}
-		}
-	},
-
-	triggerSave : function(skip_cleanup, skip_callback) {
-		var inst, n;
-
-		// Default to false
-		if (typeof(skip_cleanup) == "undefined")
-			skip_cleanup = false;
-
-		// Default to false
-		if (typeof(skip_callback) == "undefined")
-			skip_callback = false;
-
-		// Cleanup and set all form fields
-		for (n in tinyMCE.instances) {
-			inst = tinyMCE.instances[n];
-
-			if (!tinyMCE.isInstance(inst))
-				continue;
-
-			inst.triggerSave(skip_cleanup, skip_callback);
-		}
-	},
-
-	resetForm : function(form_index) {
-		var i, inst, n, formObj = document.forms[form_index];
-
-		for (n in tinyMCE.instances) {
-			inst = tinyMCE.instances[n];
-
-			if (!tinyMCE.isInstance(inst))
-				continue;
-
-			inst.switchSettings();
-
-			for (i=0; i<formObj.elements.length; i++) {
-				if (inst.formTargetElementId == formObj.elements[i].name)
-					inst.getBody().innerHTML = inst.startContent;
-			}
-		}
-	},
-
-	execInstanceCommand : function(editor_id, command, user_interface, value, focus) {
-		var inst = tinyMCE.getInstanceById(editor_id), r;
-
-		if (inst) {
-			r = inst.selection.getRng();
-
-			if (typeof(focus) == "undefined")
-				focus = true;
-
-			// IE bug lost focus on images in absolute divs Bug #1534575
-			if (focus && (!r || !r.item))
-				inst.contentWindow.focus();
-
-			// Reset design mode if lost
-			inst.autoResetDesignMode();
-
-			this.selectedElement = inst.getFocusElement();
-			inst.select();
-			tinyMCE.execCommand(command, user_interface, value);
-
-			// Cancel event so it doesn't call onbeforeonunlaod
-			if (tinyMCE.isIE && window.event != null)
-				tinyMCE.cancelEvent(window.event);
-		}
-	},
-
-	execCommand : function(command, user_interface, value) {
-		var inst = tinyMCE.selectedInstance;
-
-		// Default input
-		user_interface = user_interface ? user_interface : false;
-		value = value ? value : null;
-
-		if (inst)
-			inst.switchSettings();
-
-		switch (command) {
-			case "Undo":
-				if (this.getParam('custom_undo_redo_global')) {
-					if (this.undoIndex > 0) {
-						tinyMCE.nextUndoRedoAction = 'Undo';
-						inst = this.undoLevels[--this.undoIndex];
-						inst.select();
-
-						if (!tinyMCE.nextUndoRedoInstanceId)
-							inst.execCommand('Undo');
-					}
-				} else
-					inst.execCommand('Undo');
-				return true;
-
-			case "Redo":
-				if (this.getParam('custom_undo_redo_global')) {
-					if (this.undoIndex <= this.undoLevels.length - 1) {
-						tinyMCE.nextUndoRedoAction = 'Redo';
-						inst = this.undoLevels[this.undoIndex++];
-						inst.select();
-
-						if (!tinyMCE.nextUndoRedoInstanceId)
-							inst.execCommand('Redo');
-					}
-				} else
-					inst.execCommand('Redo');
-
-				return true;
-
-			case 'mceFocus':
-				var inst = tinyMCE.getInstanceById(value);
-				if (inst)
-					inst.getWin().focus();
-			return;
-
-			case "mceAddControl":
-			case "mceAddEditor":
-				tinyMCE.addMCEControl(tinyMCE._getElementById(value), value);
-				return;
-
-			case "mceAddFrameControl":
-				tinyMCE.addMCEControl(tinyMCE._getElementById(value['element'], value['document']), value['element'], value['document']);
-				return;
-
-			case "mceRemoveControl":
-			case "mceRemoveEditor":
-				tinyMCE.removeMCEControl(value);
-				return;
-
-			case "mceToggleEditor":
-				var inst = tinyMCE.getInstanceById(value), pe, te;
-
-				if (inst) {
-					pe = document.getElementById(inst.editorId + '_parent');
-					te = inst.oldTargetElement;
-
-					if (typeof(inst.enabled) == 'undefined')
-						inst.enabled = true;
-
-					inst.enabled = !inst.enabled;
-
-					if (!inst.enabled) {
-						pe.style.display = 'none';
-						te.value = inst.getHTML();
-						te.style.display = inst.oldTargetDisplay;
-						tinyMCE.dispatchCallback(inst, 'hide_instance_callback', 'hideInstance', inst);
-					} else {
-						pe.style.display = 'block';
-						te.style.display = 'none';
-						inst.setHTML(te.value);
-						inst.useCSS = false;
-						tinyMCE.dispatchCallback(inst, 'show_instance_callback', 'showInstance', inst);
-					}
-				} else
-					tinyMCE.addMCEControl(tinyMCE._getElementById(value), value);
-
-				return;
-
-			case "mceResetDesignMode":
-				// Resets the designmode state of the editors in Gecko
-				if (!tinyMCE.isIE) {
-					for (var n in tinyMCE.instances) {
-						if (!tinyMCE.isInstance(tinyMCE.instances[n]))
-							continue;
-
-						try {
-							tinyMCE.instances[n].getDoc().designMode = "on";
-						} catch (e) {
-							// Ignore any errors
-						}
-					}
-				}
-
-				return;
-		}
-
-		if (inst) {
-			inst.execCommand(command, user_interface, value);
-		} else if (tinyMCE.settings['focus_alert'])
-			alert(tinyMCELang['lang_focus_alert']);
-	},
-
-	_createIFrame : function(replace_element, doc, win) {
-		var iframe, id = replace_element.getAttribute("id");
-		var aw, ah;
-
-		if (typeof(doc) == "undefined")
-			doc = document;
-
-		if (typeof(win) == "undefined")
-			win = window;
-
-		iframe = doc.createElement("iframe");
-
-		aw = "" + tinyMCE.settings['area_width'];
-		ah = "" + tinyMCE.settings['area_height'];
-
-		if (aw.indexOf('%') == -1) {
-			aw = parseInt(aw);
-			aw = (isNaN(aw) || aw < 0) ? 300 : aw;
-			aw = aw + "px";
-		}
-
-		if (ah.indexOf('%') == -1) {
-			ah = parseInt(ah);
-			ah = (isNaN(ah) || ah < 0) ? 240 : ah;
-			ah = ah + "px";
-		}
-
-		iframe.setAttribute("id", id);
-		iframe.setAttribute("name", id);
-		iframe.setAttribute("class", "mceEditorIframe");
-		iframe.setAttribute("border", "0");
-		iframe.setAttribute("frameBorder", "0");
-		iframe.setAttribute("marginWidth", "0");
-		iframe.setAttribute("marginHeight", "0");
-		iframe.setAttribute("leftMargin", "0");
-		iframe.setAttribute("topMargin", "0");
-		iframe.setAttribute("width", aw);
-		iframe.setAttribute("height", ah);
-		iframe.setAttribute("allowtransparency", "true");
-		iframe.className = 'mceEditorIframe';
-
-		if (tinyMCE.settings["auto_resize"])
-			iframe.setAttribute("scrolling", "no");
-
-		// Must have a src element in MSIE HTTPs breaks aswell as absoute URLs
-		if (tinyMCE.isRealIE)
-			iframe.setAttribute("src", this.settings['default_document']);
-
-		iframe.style.width = aw;
-		iframe.style.height = ah;
-
-		// Ugly hack for Gecko problem in strict mode
-		if (tinyMCE.settings.strict_loading_mode)
-			iframe.style.marginBottom = '-5px';
-
-		// MSIE 5.0 issue
-		if (tinyMCE.isRealIE)
-			replace_element.outerHTML = iframe.outerHTML;
-		else
-			replace_element.parentNode.replaceChild(iframe, replace_element);
-
-		if (tinyMCE.isRealIE)
-			return win.frames[id];
-		else
-			return iframe;
-	},
-
-	setupContent : function(editor_id) {
-		var inst = tinyMCE.instances[editor_id], i;
-		var doc = inst.getDoc();
-		var head = doc.getElementsByTagName('head').item(0);
-		var content = inst.startContent;
-
-		// HTML values get XML encoded in strict mode
-		if (tinyMCE.settings.strict_loading_mode) {
-			content = content.replace(/&lt;/g, '<');
-			content = content.replace(/&gt;/g, '>');
-			content = content.replace(/&quot;/g, '"');
-			content = content.replace(/&amp;/g, '&');
-		}
-
-		tinyMCE.selectedInstance = inst;
-		inst.switchSettings();
-
-		// Not loaded correctly hit it again, Mozilla bug #997860
-		if (!tinyMCE.isIE && tinyMCE.getParam("setupcontent_reload", false) && doc.title != "blank_page") {
-			// This part will remove the designMode status
-			// Failes first time in Firefox 1.5b2 on Mac
-			try {doc.location.href = tinyMCE.baseURL + "/blank.htm";} catch (ex) {}
-			window.setTimeout("tinyMCE.setupContent('" + editor_id + "');", 1000);
-			return;
-		}
-
-		if (!head) {
-			window.setTimeout("tinyMCE.setupContent('" + editor_id + "');", 10);
-			return;
-		}
-
-		// Import theme specific content CSS the user specific
-		tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/themes/" + inst.settings['theme'] + "/css/editor_content.css");
-		tinyMCE.importCSS(inst.getDoc(), inst.settings['content_css']);
-		tinyMCE.dispatchCallback(inst, 'init_instance_callback', 'initInstance', inst);
-
-		// Setup keyboard shortcuts
-		if (tinyMCE.getParam('custom_undo_redo_keyboard_shortcuts')) {
-			inst.addShortcut('ctrl', 'z', 'lang_undo_desc', 'Undo');
-			inst.addShortcut('ctrl', 'y', 'lang_redo_desc', 'Redo');
-		}
-
-		// BlockFormat shortcuts keys
-		for (i=1; i<=6; i++)
-			inst.addShortcut('ctrl', '' + i, '', 'FormatBlock', false, '<h' + i + '>');
-
-		inst.addShortcut('ctrl', '7', '', 'FormatBlock', false, '<p>');
-		inst.addShortcut('ctrl', '8', '', 'FormatBlock', false, '<div>');
-		inst.addShortcut('ctrl', '9', '', 'FormatBlock', false, '<address>');
-
-		// Add default shortcuts for gecko
-		if (tinyMCE.isGecko) {
-			inst.addShortcut('ctrl', 'b', 'lang_bold_desc', 'Bold');
-			inst.addShortcut('ctrl', 'i', 'lang_italic_desc', 'Italic');
-			inst.addShortcut('ctrl', 'u', 'lang_underline_desc', 'Underline');
-		}
-
-		// Setup span styles
-		if (tinyMCE.getParam("convert_fonts_to_spans"))
-			inst.getBody().setAttribute('id', 'mceSpanFonts');
-
-		if (tinyMCE.settings['nowrap'])
-			doc.body.style.whiteSpace = "nowrap";
-
-		doc.body.dir = this.settings['directionality'];
-		doc.editorId = editor_id;
-
-		// Add on document element in Mozilla
-		if (!tinyMCE.isIE)
-			doc.documentElement.editorId = editor_id;
-
-		inst.setBaseHREF(tinyMCE.settings['base_href']);
-
-		// Replace new line characters to BRs
-		if (tinyMCE.settings['convert_newlines_to_brs']) {
-			content = tinyMCE.regexpReplace(content, "\r\n", "<br />", "gi");
-			content = tinyMCE.regexpReplace(content, "\r", "<br />", "gi");
-			content = tinyMCE.regexpReplace(content, "\n", "<br />", "gi");
-		}
-
-		// Open closed anchors
-	//	content = content.replace(new RegExp('<a(.*?)/>', 'gi'), '<a$1></a>');
-
-		// Call custom cleanup code
-		content = tinyMCE.storeAwayURLs(content);
-		content = tinyMCE._customCleanup(inst, "insert_to_editor", content);
-
-		if (tinyMCE.isIE) {
-			// Ugly!!!
-			window.setInterval('try{tinyMCE.getCSSClasses(tinyMCE.instances["' + editor_id + '"].getDoc(), "' + editor_id + '");}catch(e){}', 500);
-
-			if (tinyMCE.settings["force_br_newlines"])
-				doc.styleSheets[0].addRule("p", "margin: 0;");
-
-			var body = inst.getBody();
-			body.editorId = editor_id;
-		}
-
-		content = tinyMCE.cleanupHTMLCode(content);
-
-		// Fix for bug #958637
-		if (!tinyMCE.isIE) {
-			var contentElement = inst.getDoc().createElement("body");
-			var doc = inst.getDoc();
-
-			contentElement.innerHTML = content;
-
-			// Remove weridness!
-			if (tinyMCE.isGecko && tinyMCE.settings['remove_lt_gt'])
-				content = content.replace(new RegExp('&lt;&gt;', 'g'), "");
-
-			if (tinyMCE.settings['cleanup_on_startup'])
-				tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, doc, this.settings, contentElement));
-			else
-				tinyMCE.setInnerHTML(inst.getBody(), content);
-
-			tinyMCE.convertAllRelativeURLs(inst.getBody());
-		} else {
-			if (tinyMCE.settings['cleanup_on_startup']) {
-				tinyMCE._setHTML(inst.getDoc(), content);
-
-				// Produces permission denied error in MSIE 5.5
-				eval('try {tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, inst.contentDocument, this.settings, inst.getBody()));} catch(e) {}');
-			} else
-				tinyMCE._setHTML(inst.getDoc(), content);
-		}
-
-		// Fix for bug #957681
-		//inst.getDoc().designMode = inst.getDoc().designMode;
-
-		tinyMCE.handleVisualAid(inst.getBody(), true, tinyMCE.settings['visual'], inst);
-		tinyMCE.dispatchCallback(inst, 'setupcontent_callback', 'setupContent', editor_id, inst.getBody(), inst.getDoc());
-
-		// Re-add design mode on mozilla
-		if (!tinyMCE.isIE)
-			tinyMCE.addEventHandlers(inst);
-
-		// Add blur handler
-		if (tinyMCE.isIE) {
-			tinyMCE.addEvent(inst.getBody(), "blur", TinyMCE_Engine.prototype._eventPatch);
-			tinyMCE.addEvent(inst.getBody(), "beforedeactivate", TinyMCE_Engine.prototype._eventPatch); // Bug #1439953
-
-			// Workaround for drag drop/copy paste base href bug
-			if (!tinyMCE.isOpera) {
-				tinyMCE.addEvent(doc.body, "mousemove", TinyMCE_Engine.prototype.onMouseMove);
-				tinyMCE.addEvent(doc.body, "beforepaste", TinyMCE_Engine.prototype._eventPatch);
-				tinyMCE.addEvent(doc.body, "drop", TinyMCE_Engine.prototype._eventPatch);
-			}
-		}
-
-		// Trigger node change, this call locks buttons for tables and so forth
-		inst.select();
-		tinyMCE.selectedElement = inst.contentWindow.document.body;
-
-		// Call custom DOM cleanup
-		tinyMCE._customCleanup(inst, "insert_to_editor_dom", inst.getBody());
-		tinyMCE._customCleanup(inst, "setup_content_dom", inst.getBody());
-		tinyMCE._setEventsEnabled(inst.getBody(), false);
-		tinyMCE.cleanupAnchors(inst.getDoc());
-
-		if (tinyMCE.getParam("convert_fonts_to_spans"))
-			tinyMCE.convertSpansToFonts(inst.getDoc());
-
-		inst.startContent = tinyMCE.trim(inst.getBody().innerHTML);
-		inst.undoRedo.add({ content : inst.startContent });
-
-		// Cleanup any mess left from storyAwayURLs
-		if (tinyMCE.isGecko) {
-			// Remove mce_src from textnodes and comments
-			tinyMCE.selectNodes(inst.getBody(), function(n) {
-				if (n.nodeType == 3 || n.nodeType == 8)
-					n.nodeValue = n.nodeValue.replace(new RegExp('\\s(mce_src|mce_href)=\"[^\"]*\"', 'gi'), "");
-
-				return false;
-			});
-		}
-
-		// Remove Gecko spellchecking
-		if (tinyMCE.isGecko)
-			inst.getBody().spellcheck = tinyMCE.getParam("gecko_spellcheck");
-
-		// Cleanup any mess left from storyAwayURLs
-		tinyMCE._removeInternal(inst.getBody());
-
-		inst.select();
-		tinyMCE.triggerNodeChange(false, true);
-	},
-
-	storeAwayURLs : function(s) {
-		// Remove all mce_src, mce_href and replace them with new ones
-		// s = s.replace(new RegExp('mce_src\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');
-		// s = s.replace(new RegExp('mce_href\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');
-
-		if (!s.match(/(mce_src|mce_href)/gi, s)) {
-			s = s.replace(new RegExp('src\\s*=\\s*\"([^ >\"]*)\"', 'gi'), 'src="$1" mce_src="$1"');
-			s = s.replace(new RegExp('href\\s*=\\s*\"([^ >\"]*)\"', 'gi'), 'href="$1" mce_href="$1"');
-		}
-
-		return s;
-	},
-
-	_removeInternal : function(n) {
-		if (tinyMCE.isGecko) {
-			// Remove mce_src from textnodes and comments
-			tinyMCE.selectNodes(n, function(n) {
-				if (n.nodeType == 3 || n.nodeType == 8)
-					n.nodeValue = n.nodeValue.replace(new RegExp('\\s(mce_src|mce_href)=\"[^\"]*\"', 'gi'), "");
-
-				return false;
-			});
-		}
-	},
-
-	removeTinyMCEFormElements : function(form_obj) {
-		var i, elementId;
-
-		// Skip form element removal
-		if (!tinyMCE.getParam('hide_selects_on_submit'))
-			return;
-
-		// Check if form is valid
-		if (typeof(form_obj) == "undefined" || form_obj == null)
-			return;
-
-		// If not a form, find the form
-		if (form_obj.nodeName != "FORM") {
-			if (form_obj.form)
-				form_obj = form_obj.form;
-			else
-				form_obj = tinyMCE.getParentElement(form_obj, "form");
-		}
-
-		// Still nothing
-		if (form_obj == null)
-			return;
-
-		// Disable all UI form elements that TinyMCE created
-		for (i=0; i<form_obj.elements.length; i++) {
-			elementId = form_obj.elements[i].name ? form_obj.elements[i].name : form_obj.elements[i].id;
-
-			if (elementId.indexOf('mce_editor_') == 0)
-				form_obj.elements[i].disabled = true;
-		}
-	},
-
-	handleEvent : function(e) {
-		var inst = tinyMCE.selectedInstance;
-
-		// Remove odd, error
-		if (typeof(tinyMCE) == "undefined")
-			return true;
-
-		//tinyMCE.debug(e.type + " " + e.target.nodeName + " " + (e.relatedTarget ? e.relatedTarget.nodeName : ""));
-
-		if (tinyMCE.executeCallback(tinyMCE.selectedInstance, 'handle_event_callback', 'handleEvent', e))
-			return false;
-
-		switch (e.type) {
-			case "beforedeactivate": // Was added due to bug #1439953
-			case "blur":
-				if (tinyMCE.selectedInstance)
-					tinyMCE.selectedInstance.execCommand('mceEndTyping');
-
-				tinyMCE.hideMenus();
-
-				return;
-
-			// Workaround for drag drop/copy paste base href bug
-			case "drop":
-			case "beforepaste":
-				if (tinyMCE.selectedInstance)
-					tinyMCE.selectedInstance.setBaseHREF(null);
-
-				// Fixes odd MSIE bug where drag/droping elements in a iframe with height 100% breaks
-				// This logic forces the width/height to be in pixels while the user is drag/dropping
-				if (tinyMCE.isRealIE) {
-					var ife = tinyMCE.selectedInstance.iframeElement;
-
-					/*if (ife.style.width.indexOf('%') != -1) {
-						ife._oldWidth = ife.width.height;
-						ife.style.width = ife.clientWidth;
-					}*/
-
-					if (ife.style.height.indexOf('%') != -1) {
-						ife._oldHeight = ife.style.height;
-						ife.style.height = ife.clientHeight;
-					}
-				}
-
-				window.setTimeout("tinyMCE.selectedInstance.setBaseHREF(tinyMCE.settings['base_href']);tinyMCE._resetIframeHeight();", 1);
-				return;
-
-			case "submit":
-				tinyMCE.removeTinyMCEFormElements(tinyMCE.isMSIE ? window.event.srcElement : e.target);
-				tinyMCE.triggerSave();
-				tinyMCE.isNotDirty = true;
-				return;
-
-			case "reset":
-				var formObj = tinyMCE.isIE ? window.event.srcElement : e.target;
-
-				for (var i=0; i<document.forms.length; i++) {
-					if (document.forms[i] == formObj)
-						window.setTimeout('tinyMCE.resetForm(' + i + ');', 10);
-				}
-
-				return;
-
-			case "keypress":
-				if (inst && inst.handleShortcut(e))
-					return false;
-
-				if (e.target.editorId) {
-					tinyMCE.instances[e.target.editorId].select();
-				} else {
-					if (e.target.ownerDocument.editorId)
-						tinyMCE.instances[e.target.ownerDocument.editorId].select();
-				}
-
-				if (tinyMCE.selectedInstance)
-					tinyMCE.selectedInstance.switchSettings();
-
-				// Insert P element
-				if ((tinyMCE.isGecko || tinyMCE.isOpera || tinyMCE.isSafari) && tinyMCE.settings['force_p_newlines'] && e.keyCode == 13 && !e.shiftKey) {
-					// Insert P element instead of BR
-					if (TinyMCE_ForceParagraphs._insertPara(tinyMCE.selectedInstance, e)) {
-						// Cancel event
-						tinyMCE.execCommand("mceAddUndoLevel");
-						return tinyMCE.cancelEvent(e);
-					}
-				}
-
-				// Handle backspace
-				if ((tinyMCE.isGecko && !tinyMCE.isSafari) && tinyMCE.settings['force_p_newlines'] && (e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) {
-					// Insert P element instead of BR
-					if (TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance, e.type)) {
-						// Cancel event
-						tinyMCE.execCommand("mceAddUndoLevel");
-						return tinyMCE.cancelEvent(e);
-					}
-				}
-
-				// Return key pressed
-				if (tinyMCE.isIE && tinyMCE.settings['force_br_newlines'] && e.keyCode == 13) {
-					if (e.target.editorId)
-						tinyMCE.instances[e.target.editorId].select();
-
-					if (tinyMCE.selectedInstance) {
-						var sel = tinyMCE.selectedInstance.getDoc().selection;
-						var rng = sel.createRange();
-
-						if (tinyMCE.getParentElement(rng.parentElement(), "li") != null)
-							return false;
-
-						// Cancel event
-						e.returnValue = false;
-						e.cancelBubble = true;
-
-						// Insert BR element
-						rng.pasteHTML("<br />");
-						rng.collapse(false);
-						rng.select();
-
-						tinyMCE.execCommand("mceAddUndoLevel");
-						tinyMCE.triggerNodeChange(false);
-						return false;
-					}
-				}
-
-				// Backspace or delete
-				if (e.keyCode == 8 || e.keyCode == 46) {
-					tinyMCE.selectedElement = e.target;
-					tinyMCE.linkElement = tinyMCE.getParentElement(e.target, "a");
-					tinyMCE.imgElement = tinyMCE.getParentElement(e.target, "img");
-					tinyMCE.triggerNodeChange(false);
-				}
-
-				return false;
-			break;
-
-			case "keyup":
-			case "keydown":
-				tinyMCE.hideMenus();
-				tinyMCE.hasMouseMoved = false;
-
-				if (inst && inst.handleShortcut(e))
-					return false;
-
-				if (e.target.editorId)
-					tinyMCE.instances[e.target.editorId].select();
-
-				if (tinyMCE.selectedInstance)
-					tinyMCE.selectedInstance.switchSettings();
-
-				var inst = tinyMCE.selectedInstance;
-
-				// Handle backspace
-				if (tinyMCE.isGecko && tinyMCE.settings['force_p_newlines'] && (e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) {
-					// Insert P element instead of BR
-					if (TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance, e.type)) {
-						// Cancel event
-						tinyMCE.execCommand("mceAddUndoLevel");
-						e.preventDefault();
-						return false;
-					}
-				}
-
-				tinyMCE.selectedElement = null;
-				tinyMCE.selectedNode = null;
-				var elm = tinyMCE.selectedInstance.getFocusElement();
-				tinyMCE.linkElement = tinyMCE.getParentElement(elm, "a");
-				tinyMCE.imgElement = tinyMCE.getParentElement(elm, "img");
-				tinyMCE.selectedElement = elm;
-
-				// Update visualaids on tabs
-				if (tinyMCE.isGecko && e.type == "keyup" && e.keyCode == 9)
-					tinyMCE.handleVisualAid(tinyMCE.selectedInstance.getBody(), true, tinyMCE.settings['visual'], tinyMCE.selectedInstance);
-
-				// Fix empty elements on return/enter, check where enter occured
-				if (tinyMCE.isIE && e.type == "keydown" && e.keyCode == 13)
-					tinyMCE.enterKeyElement = tinyMCE.selectedInstance.getFocusElement();
-
-				// Fix empty elements on return/enter
-				if (tinyMCE.isIE && e.type == "keyup" && e.keyCode == 13) {
-					var elm = tinyMCE.enterKeyElement;
-					if (elm) {
-						var re = new RegExp('^HR|IMG|BR$','g'); // Skip these
-						var dre = new RegExp('^H[1-6]$','g'); // Add double on these
-
-						if (!elm.hasChildNodes() && !re.test(elm.nodeName)) {
-							if (dre.test(elm.nodeName))
-								elm.innerHTML = "&nbsp;&nbsp;";
-							else
-								elm.innerHTML = "&nbsp;";
-						}
-					}
-				}
-
-				// Check if it's a position key
-				var keys = tinyMCE.posKeyCodes;
-				var posKey = false;
-				for (var i=0; i<keys.length; i++) {
-					if (keys[i] == e.keyCode) {
-						posKey = true;
-						break;
-					}
-				}
-
-				// MSIE custom key handling
-				if (tinyMCE.isIE && tinyMCE.settings['custom_undo_redo']) {
-					var keys = new Array(8,46); // Backspace,Delete
-
-					for (var i=0; i<keys.length; i++) {
-						if (keys[i] == e.keyCode) {
-							if (e.type == "keyup")
-								tinyMCE.triggerNodeChange(false);
-						}
-					}
-				}
-
-				// If Ctrl key
-				if (e.keyCode == 17)
-					return true;
-
-				// Handle Undo/Redo when typing content
-
-				if (tinyMCE.isGecko) {
-					// Start typing (not a position key or ctrl key, but ctrl+x and ctrl+p is ok)
-					if (!posKey && e.type == "keyup" && !e.ctrlKey || (e.ctrlKey && (e.keyCode == 86 || e.keyCode == 88)))
-						tinyMCE.execCommand("mceStartTyping");
-				} else {
-					// IE seems to be working better with this setting
-					if (!posKey && e.type == "keyup")
-						tinyMCE.execCommand("mceStartTyping");
-				}
-
-				// Store undo bookmark
-				if (e.type == "keydown" && (posKey || e.ctrlKey) && inst)
-					inst.undoBookmark = inst.selection.getBookmark();
-
-				// End typing (position key) or some Ctrl event
-				if (e.type == "keyup" && (posKey || e.ctrlKey))
-					tinyMCE.execCommand("mceEndTyping");
-
-				if (posKey && e.type == "keyup")
-					tinyMCE.triggerNodeChange(false);
-
-				if (tinyMCE.isIE && e.ctrlKey)
-					window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);
-			break;
-
-			case "mousedown":
-			case "mouseup":
-			case "click":
-			case "dblclick":
-			case "focus":
-				tinyMCE.hideMenus();
-
-				if (tinyMCE.selectedInstance) {
-					tinyMCE.selectedInstance.switchSettings();
-					tinyMCE.selectedInstance.isFocused = true;
-				}
-
-				// Check instance event trigged on
-				var targetBody = tinyMCE.getParentElement(e.target, "html");
-				for (var instanceName in tinyMCE.instances) {
-					if (!tinyMCE.isInstance(tinyMCE.instances[instanceName]))
-						continue;
-
-					var inst = tinyMCE.instances[instanceName];
-
-					// Reset design mode if lost (on everything just in case)
-					inst.autoResetDesignMode();
-
-					// Use HTML element since users might click outside of body element
-					if (inst.getBody().parentNode == targetBody) {
-						inst.select();
-						tinyMCE.selectedElement = e.target;
-						tinyMCE.linkElement = tinyMCE.getParentElement(tinyMCE.selectedElement, "a");
-						tinyMCE.imgElement = tinyMCE.getParentElement(tinyMCE.selectedElement, "img");
-						break;
-					}
-				}
-
-				// Add first bookmark location
-				if (!tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark && (e.type == "mouseup" || e.type == "dblclick"))
-					tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark = tinyMCE.selectedInstance.selection.getBookmark();
-
-				// Reset selected node
-				if (e.type != "focus")
-					tinyMCE.selectedNode = null;
-
-				tinyMCE.triggerNodeChange(false);
-				tinyMCE.execCommand("mceEndTyping");
-
-				if (e.type == "mouseup")
-					tinyMCE.execCommand("mceAddUndoLevel");
-
-				// Just in case
-				if (!tinyMCE.selectedInstance && e.target.editorId)
-					tinyMCE.instances[e.target.editorId].select();
-
-				return false;
-			break;
-		}
-	},
-
-	getButtonHTML : function(id, lang, img, cmd, ui, val) {
-		var h = '', m, x, io = '';
-
-		cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + cmd + '\'';
-
-		if (typeof(ui) != "undefined" && ui != null)
-			cmd += ',' + ui;
-
-		if (typeof(val) != "undefined" && val != null)
-			cmd += ",'" + val + "'";
-
-		cmd += ');';
-
-		// Patch for IE7 bug with hover out not restoring correctly
-		if (tinyMCE.isRealIE)
-			io = 'onmouseover="tinyMCE.lastHover = this;"';
-
-		// Use tilemaps when enabled and found and never in MSIE since it loads the tile each time from cache if cahce is disabled
-		if (tinyMCE.getParam('button_tile_map') && (!tinyMCE.isIE || tinyMCE.isOpera) && (m = this.buttonMap[id]) != null && (tinyMCE.getParam("language") == "en" || img.indexOf('$lang') == -1)) {
-			// Tiled button
-			x = 0 - (m * 20) == 0 ? '0' : 0 - (m * 20);
-			h += '<a id="{$editor_id}_' + id + '" href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" ' + io + ' class="mceTiledButton mceButtonNormal" target="_self">';
-			h += '<img src="{$themeurl}/images/spacer.gif" style="background-position: ' + x + 'px 0" title="{$' + lang + '}" />';
-			h += '</a>';
-		} else {
-			// Normal button
-			h += '<a id="{$editor_id}_' + id + '" href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" ' + io + ' class="mceButtonNormal" target="_self">';
-			h += '<img src="' + img + '" title="{$' + lang + '}" />';
-			h += '</a>';
-		}
-
-		return h;
-	},
-
-	getMenuButtonHTML : function(id, lang, img, mcmd, cmd, ui, val) {
-		var h = '', m, x;
-
-		mcmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + mcmd + '\');';
-		cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + cmd + '\'';
-
-		if (typeof(ui) != "undefined" && ui != null)
-			cmd += ',' + ui;
-
-		if (typeof(val) != "undefined" && val != null)
-			cmd += ",'" + val + "'";
-
-		cmd += ');';
-
-		// Use tilemaps when enabled and found and never in MSIE since it loads the tile each time from cache if cahce is disabled
-		if (tinyMCE.getParam('button_tile_map') && (!tinyMCE.isIE || tinyMCE.isOpera) && (m = tinyMCE.buttonMap[id]) != null && (tinyMCE.getParam("language") == "en" || img.indexOf('$lang') == -1)) {
-			x = 0 - (m * 20) == 0 ? '0' : 0 - (m * 20);
-
-			if (tinyMCE.isRealIE)
-				h += '<span id="{$editor_id}_' + id + '" class="mceMenuButton" onmouseover="tinyMCE._menuButtonEvent(\'over\',this);tinyMCE.lastHover = this;" onmouseout="tinyMCE._menuButtonEvent(\'out\',this);">';
-			else
-				h += '<span id="{$editor_id}_' + id + '" class="mceMenuButton">';
-
-			h += '<a href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" class="mceTiledButton mceMenuButtonNormal" target="_self">';
-			h += '<img src="{$themeurl}/images/spacer.gif" style="width: 20px; height: 20px; background-position: ' + x + 'px 0" title="{$' + lang + '}" /></a>';
-			h += '<a href="javascript:' + mcmd + '" onclick="' + mcmd + 'return false;" onmousedown="return false;"><img src="{$themeurl}/images/button_menu.gif" title="{$' + lang + '}" class="mceMenuButton" />';
-			h += '</a></span>';
-		} else {
-			if (tinyMCE.isRealIE)
-				h += '<span id="{$editor_id}_' + id + '" dir="ltr" class="mceMenuButton" onmouseover="tinyMCE._menuButtonEvent(\'over\',this);tinyMCE.lastHover = this;" onmouseout="tinyMCE._menuButtonEvent(\'out\',this);">';
-			else
-				h += '<span id="{$editor_id}_' + id + '" dir="ltr" class="mceMenuButton">';
-
-			h += '<a href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" class="mceMenuButtonNormal" target="_self">';
-			h += '<img src="' + img + '" title="{$' + lang + '}" /></a>';
-			h += '<a href="javascript:' + mcmd + '" onclick="' + mcmd + 'return false;" onmousedown="return false;"><img src="{$themeurl}/images/button_menu.gif" title="{$' + lang + '}" class="mceMenuButton" />';
-			h += '</a></span>';
-		}
-
-		return h;
-	},
-
-	_menuButtonEvent : function(e, o) {
-		if (o.className == 'mceMenuButtonFocus')
-			return;
-
-		if (e == 'over')
-			o.className = o.className + ' mceMenuHover';
-		else
-			o.className = o.className.replace(/\s.*$/, '');
-	},
-
-	addButtonMap : function(m) {
-		var i, a = m.replace(/\s+/, '').split(',');
-
-		for (i=0; i<a.length; i++)
-			this.buttonMap[a[i]] = i;
-	},
-
-	submitPatch : function() {
-		tinyMCE.removeTinyMCEFormElements(this);
-		tinyMCE.triggerSave();
-		tinyMCE.isNotDirty = true;
-		this.mceOldSubmit();
-	},
-
-	onLoad : function() {
-		var r;
-
-		// Wait for everything to be loaded first
-		if (tinyMCE.settings.strict_loading_mode && this.loadingIndex != -1) {
-			window.setTimeout('tinyMCE.onLoad();', 1);
-			return;
-		}
-
-		if (tinyMCE.isRealIE && window.event.type == "readystatechange" && document.readyState != "complete")
-			return true;
-
-		if (tinyMCE.isLoaded)
-			return true;
-
-		tinyMCE.isLoaded = true;
-
-		// IE produces JS error if TinyMCE is placed in a frame
-		// It seems to have something to do with the selection not beeing
-		// correctly initialized in IE so this hack solves the problem
-		if (tinyMCE.isRealIE && document.body) {
-			r = document.body.createTextRange();
-			r.collapse(true);
-			r.select();
-		}
-
-		tinyMCE.dispatchCallback(null, 'onpageload', 'onPageLoad');
-
-		for (var c=0; c<tinyMCE.configs.length; c++) {
-			tinyMCE.settings = tinyMCE.configs[c];
-
-			var selector = tinyMCE.getParam("editor_selector");
-			var deselector = tinyMCE.getParam("editor_deselector");
-			var elementRefAr = new Array();
-
-			// Add submit triggers
-			if (document.forms && tinyMCE.settings['add_form_submit_trigger'] && !tinyMCE.submitTriggers) {
-				for (var i=0; i<document.forms.length; i++) {
-					var form = document.forms[i];
-
-					tinyMCE.addEvent(form, "submit", TinyMCE_Engine.prototype.handleEvent);
-					tinyMCE.addEvent(form, "reset", TinyMCE_Engine.prototype.handleEvent);
-					tinyMCE.submitTriggers = true; // Do it only once
-
-					// Patch the form.submit function
-					if (tinyMCE.settings['submit_patch']) {
-						try {
-							form.mceOldSubmit = form.submit;
-							form.submit = TinyMCE_Engine.prototype.submitPatch;
-						} catch (e) {
-							// Do nothing
-						}
-					}
-				}
-			}
-
-			// Add editor instances based on mode
-			var mode = tinyMCE.settings['mode'];
-			switch (mode) {
-				case "exact":
-					var elements = tinyMCE.getParam('elements', '', true, ',');
-
-					for (var i=0; i<elements.length; i++) {
-						var element = tinyMCE._getElementById(elements[i]);
-						var trigger = element ? element.getAttribute(tinyMCE.settings['textarea_trigger']) : "";
-
-						if (new RegExp('\\b' + deselector + '\\b').test(tinyMCE.getAttrib(element, "class")))
-							continue;
-
-						if (trigger == "false")
-							continue;
-
-						if ((tinyMCE.settings['ask'] || tinyMCE.settings['convert_on_click']) && element) {
-							elementRefAr[elementRefAr.length] = element;
-							continue;
-						}
-
-						if (element)
-							tinyMCE.addMCEControl(element, elements[i]);
-						else if (tinyMCE.settings['debug'])
-							alert("Error: Could not find element by id or name: " + elements[i]);
-					}
-				break;
-
-				case "specific_textareas":
-				case "textareas":
-					var nodeList = document.getElementsByTagName("textarea");
-
-					for (var i=0; i<nodeList.length; i++) {
-						var elm = nodeList.item(i);
-						var trigger = elm.getAttribute(tinyMCE.settings['textarea_trigger']);
-
-						if (selector != '' && !new RegExp('\\b' + selector + '\\b').test(tinyMCE.getAttrib(elm, "class")))
-							continue;
-
-						if (selector != '')
-							trigger = selector != "" ? "true" : "";
-
-						if (new RegExp('\\b' + deselector + '\\b').test(tinyMCE.getAttrib(elm, "class")))
-							continue;
-
-						if ((mode == "specific_textareas" && trigger == "true") || (mode == "textareas" && trigger != "false"))
-							elementRefAr[elementRefAr.length] = elm;
-					}
-				break;
-			}
-
-			for (var i=0; i<elementRefAr.length; i++) {
-				var element = elementRefAr[i];
-				var elementId = element.name ? element.name : element.id;
-
-				if (tinyMCE.settings['ask'] || tinyMCE.settings['convert_on_click']) {
-					// Focus breaks in Mozilla
-					if (tinyMCE.isGecko) {
-						var settings = tinyMCE.settings;
-
-						tinyMCE.addEvent(element, "focus", function (e) {window.setTimeout(function() {TinyMCE_Engine.prototype.confirmAdd(e, settings);}, 10);});
-
-						if (element.nodeName != "TEXTAREA" && element.nodeName != "INPUT")
-							tinyMCE.addEvent(element, "click", function (e) {window.setTimeout(function() {TinyMCE_Engine.prototype.confirmAdd(e, settings);}, 10);});
-						// tinyMCE.addEvent(element, "mouseover", function (e) {window.setTimeout(function() {TinyMCE_Engine.prototype.confirmAdd(e, settings);}, 10);});
-					} else {
-						var settings = tinyMCE.settings;
-
-						tinyMCE.addEvent(element, "focus", function () { TinyMCE_Engine.prototype.confirmAdd(null, settings); });
-						tinyMCE.addEvent(element, "click", function () { TinyMCE_Engine.prototype.confirmAdd(null, settings); });
-						// tinyMCE.addEvent(element, "mouseenter", function () { TinyMCE_Engine.prototype.confirmAdd(null, settings); });
-					}
-				} else
-					tinyMCE.addMCEControl(element, elementId);
-			}
-
-			// Handle auto focus
-			if (tinyMCE.settings['auto_focus']) {
-				window.setTimeout(function () {
-					var inst = tinyMCE.getInstanceById(tinyMCE.settings['auto_focus']);
-					inst.selection.selectNode(inst.getBody(), true, true);
-					inst.contentWindow.focus();
-				}, 100);
-			}
-
-			tinyMCE.dispatchCallback(null, 'oninit', 'onInit');
-		}
-	},
-
-	isInstance : function(o) {
-		return o != null && typeof(o) == "object" && o.isTinyMCE_Control;
-	},
-
-	getParam : function(name, default_value, strip_whitespace, split_chr) {
-		var value = (typeof(this.settings[name]) == "undefined") ? default_value : this.settings[name];
-
-		// Fix bool values
-		if (value == "true" || value == "false")
-			return (value == "true");
-
-		if (strip_whitespace)
-			value = tinyMCE.regexpReplace(value, "[ \t\r\n]", "");
-
-		if (typeof(split_chr) != "undefined" && split_chr != null) {
-			value = value.split(split_chr);
-			var outArray = new Array();
-
-			for (var i=0; i<value.length; i++) {
-				if (value[i] && value[i] != "")
-					outArray[outArray.length] = value[i];
-			}
-
-			value = outArray;
-		}
-
-		return value;
-	},
-
-	getLang : function(name, default_value, parse_entities, va) {
-		var v = (typeof(tinyMCELang[name]) == "undefined") ? default_value : tinyMCELang[name], n;
-
-		if (parse_entities)
-			v = tinyMCE.entityDecode(v);
-
-		if (va) {
-			for (n in va)
-				v = this.replaceVar(v, n, va[n]);
-		}
-
-		return v;
-	},
-
-	entityDecode : function(s) {
-		var e = document.createElement("div");
-
-		e.innerHTML = s;
-
-		return e.firstChild.nodeValue;
-	},
-
-	addToLang : function(prefix, ar) {
-		for (var key in ar) {
-			if (typeof(ar[key]) == 'function')
-				continue;
-
-			tinyMCELang[(key.indexOf('lang_') == -1 ? 'lang_' : '') + (prefix != '' ? (prefix + "_") : '') + key] = ar[key];
-		}
-
-		this.loadNextScript();
-
-	//	for (var key in ar)
-	//		tinyMCELang[(key.indexOf('lang_') == -1 ? 'lang_' : '') + (prefix != '' ? (prefix + "_") : '') + key] = "|" + ar[key] + "|";
-	},
-
-	triggerNodeChange : function(focus, setup_content) {
-		var elm, inst, editorId, undoIndex = -1, undoLevels = -1, doc, anySelection = false, st;
-
-		if (tinyMCE.selectedInstance) {
-			inst = tinyMCE.selectedInstance;
-			elm = (typeof(setup_content) != "undefined" && setup_content) ? tinyMCE.selectedElement : inst.getFocusElement();
-
-/*			if (elm == inst.lastTriggerEl)
-				return;
-
-			inst.lastTriggerEl = elm;*/
-
-			editorId = inst.editorId;
-			st = inst.selection.getSelectedText();
-
-			if (tinyMCE.settings.auto_resize)
-				inst.resizeToContent();
-
-			if (setup_content && tinyMCE.isGecko && inst.isHidden())
-				elm = inst.getBody();
-
-			inst.switchSettings();
-
-			if (tinyMCE.selectedElement)
-				anySelection = (tinyMCE.selectedElement.nodeName.toLowerCase() == "img") || (st && st.length > 0);
-
-			if (tinyMCE.settings['custom_undo_redo']) {
-				undoIndex = inst.undoRedo.undoIndex;
-				undoLevels = inst.undoRedo.undoLevels.length;
-			}
-
-			tinyMCE.dispatchCallback(inst, 'handle_node_change_callback', 'handleNodeChange', editorId, elm, undoIndex, undoLevels, inst.visualAid, anySelection, setup_content);
-		}
-
-		if (this.selectedInstance && (typeof(focus) == "undefined" || focus))
-			this.selectedInstance.contentWindow.focus();
-	},
-
-	_customCleanup : function(inst, type, content) {
-		var pl, po, i;
-
-		// Call custom cleanup
-		var customCleanup = tinyMCE.settings['cleanup_callback'];
-		if (customCleanup != "" && eval("typeof(" + customCleanup + ")") != "undefined")
-			content = eval(customCleanup + "(type, content, inst);");
-
-		// Trigger theme cleanup
-		po = tinyMCE.themes[tinyMCE.settings['theme']];
-		if (po && po.cleanup)
-			content = po.cleanup(type, content, inst);
-
-		// Trigger plugin cleanups
-		pl = inst.plugins;
-		for (i=0; i<pl.length; i++) {
-			po = tinyMCE.plugins[pl[i]];
-
-			if (po && po.cleanup)
-				content = po.cleanup(type, content, inst);
-		}
-
-		return content;
-	},
-
-	setContent : function(h) {
-		if (tinyMCE.selectedInstance) {
-			tinyMCE.selectedInstance.execCommand('mceSetContent', false, h);
-			tinyMCE.selectedInstance.repaint();
-		}
-	},
-
-	importThemeLanguagePack : function(name) {
-		if (typeof(name) == "undefined")
-			name = tinyMCE.settings['theme'];
-
-		tinyMCE.loadScript(tinyMCE.baseURL + '/themes/' + name + '/langs/' + tinyMCE.settings['language'] + '.js');
-	},
-
-	importPluginLanguagePack : function(name) {
-		var b = tinyMCE.baseURL + '/plugins/' + name;
-
-		if (this.plugins[name])
-			b = this.plugins[name].baseURL;
-
-		tinyMCE.loadScript(b + '/langs/' + tinyMCE.settings['language'] +  '.js');
-	},
-
-	applyTemplate : function(h, as) {
-		return h.replace(new RegExp('\\{\\$([a-z0-9_]+)\\}', 'gi'), function(m, s) {
-			if (s.indexOf('lang_') == 0 && tinyMCELang[s])
-				return tinyMCELang[s];
-
-			if (as && as[s])
-				return as[s];
-
-			if (tinyMCE.settings[s])
-				return tinyMCE.settings[s];
-
-			if (m == 'themeurl')
-				return tinyMCE.themeURL;
-
-			return m;
-		});
-	},
-
-	replaceVar : function(h, r, v) {
-		return h.replace(new RegExp('{\\\$' + r + '}', 'g'), v);
-	},
-
-	openWindow : function(template, args) {
-		var html, width, height, x, y, resizable, scrollbars, url;
-
-		args = !args ? {} : args;
-
-		args['mce_template_file'] = template['file'];
-		args['mce_width'] = template['width'];
-		args['mce_height'] = template['height'];
-		tinyMCE.windowArgs = args;
-
-		html = template['html'];
-		if (!(width = parseInt(template['width'])))
-			width = 320;
-
-		if (!(height = parseInt(template['height'])))
-			height = 200;
-
-		// Add to height in M$ due to SP2 WHY DON'T YOU GUYS IMPLEMENT innerWidth of windows!!
-		if (tinyMCE.isIE)
-			height += 40;
-		else
-			height += 20;
-
-		x = parseInt(screen.width / 2.0) - (width / 2.0);
-		y = parseInt(screen.height / 2.0) - (height / 2.0);
-
-		resizable = (args && args['resizable']) ? args['resizable'] : "no";
-		scrollbars = (args && args['scrollbars']) ? args['scrollbars'] : "no";
-
-		if (template['file'].charAt(0) != '/' && template['file'].indexOf('://') == -1)
-			url = tinyMCE.baseURL + "/themes/" + tinyMCE.getParam("theme") + "/" + template['file'];
-		else
-			url = template['file'];
-
-		// Replace all args as variables in URL
-		for (var name in args) {
-			if (typeof(args[name]) == 'function')
-				continue;
-
-			url = tinyMCE.replaceVar(url, name, escape(args[name]));
-		}
-
-		if (html) {
-			html = tinyMCE.replaceVar(html, "css", this.settings['popups_css']);
-			html = tinyMCE.applyTemplate(html, args);
-
-			var win = window.open("", "mcePopup" + new Date().getTime(), "top=" + y + ",left=" + x + ",scrollbars=" + scrollbars + ",dialog=yes,minimizable=" + resizable + ",modal=yes,width=" + width + ",height=" + height + ",resizable=" + resizable);
-			if (win == null) {
-				alert(tinyMCELang['lang_popup_blocked']);
-				return;
-			}
-
-			win.document.write(html);
-			win.document.close();
-			win.resizeTo(width, height);
-			win.focus();
-		} else {
-			if ((tinyMCE.isRealIE) && resizable != 'yes' && tinyMCE.settings["dialog_type"] == "modal") {
-				height += 10;
-
-				var features = "resizable:" + resizable 
-					+ ";scroll:"
-					+ scrollbars + ";status:yes;center:yes;help:no;dialogWidth:"
-					+ width + "px;dialogHeight:" + height + "px;";
-
-				window.showModalDialog(url, window, features);
-			} else {
-				var modal = (resizable == "yes") ? "no" : "yes";
-
-				if (tinyMCE.isGecko && tinyMCE.isMac)
-					modal = "no";
-
-				if (template['close_previous'] != "no")
-					try {tinyMCE.lastWindow.close();} catch (ex) {}
-
-				var win = window.open(url, "mcePopup" + new Date().getTime(), "top=" + y + ",left=" + x + ",scrollbars=" + scrollbars + ",dialog=" + modal + ",minimizable=" + resizable + ",modal=" + modal + ",width=" + width + ",height=" + height + ",resizable=" + resizable);
-				if (win == null) {
-					alert(tinyMCELang['lang_popup_blocked']);
-					return;
-				}
-
-				if (template['close_previous'] != "no")
-					tinyMCE.lastWindow = win;
-
-				eval('try { win.resizeTo(width, height); } catch(e) { }');
-
-				// Make it bigger if statusbar is forced
-				if (tinyMCE.isGecko) {
-					if (win.document.defaultView.statusbar.visible)
-						win.resizeBy(0, tinyMCE.isMac ? 10 : 24);
-				}
-
-				win.focus();
-			}
-		}
-	},
-
-	closeWindow : function(win) {
-		win.close();
-	},
-
-	getVisualAidClass : function(class_name, state) {
-		var aidClass = tinyMCE.settings['visual_table_class'];
-
-		if (typeof(state) == "undefined")
-			state = tinyMCE.settings['visual'];
-
-		// Split
-		var classNames = new Array();
-		var ar = class_name.split(' ');
-		for (var i=0; i<ar.length; i++) {
-			if (ar[i] == aidClass)
-				ar[i] = "";
-
-			if (ar[i] != "")
-				classNames[classNames.length] = ar[i];
-		}
-
-		if (state)
-			classNames[classNames.length] = aidClass;
-
-		// Glue
-		var className = "";
-		for (var i=0; i<classNames.length; i++) {
-			if (i > 0)
-				className += " ";
-
-			className += classNames[i];
-		}
-
-		return className;
-	},
-
-	handleVisualAid : function(el, deep, state, inst, skip_dispatch) {
-		if (!el)
-			return;
-
-		if (!skip_dispatch)
-			tinyMCE.dispatchCallback(inst, 'handle_visual_aid_callback', 'handleVisualAid', el, deep, state, inst);
-
-		var tableElement = null;
-
-		switch (el.nodeName) {
-			case "TABLE":
-				var oldW = el.style.width;
-				var oldH = el.style.height;
-				var bo = tinyMCE.getAttrib(el, "border");
-
-				bo = bo == "" || bo == "0" ? true : false;
-
-				tinyMCE.setAttrib(el, "class", tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el, "class"), state && bo));
-
-				el.style.width = oldW;
-				el.style.height = oldH;
-
-				for (var y=0; y<el.rows.length; y++) {
-					for (var x=0; x<el.rows[y].cells.length; x++) {
-						var cn = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el.rows[y].cells[x], "class"), state && bo);
-						tinyMCE.setAttrib(el.rows[y].cells[x], "class", cn);
-					}
-				}
-
-				break;
-
-			case "A":
-				var anchorName = tinyMCE.getAttrib(el, "name");
-
-				if (anchorName != '' && state) {
-					el.title = anchorName;
-					tinyMCE.addCSSClass(el, 'mceItemAnchor');
-				} else if (anchorName != '' && !state)
-					el.className = '';
-
-				break;
-		}
-
-		if (deep && el.hasChildNodes()) {
-			for (var i=0; i<el.childNodes.length; i++)
-				tinyMCE.handleVisualAid(el.childNodes[i], deep, state, inst, true);
-		}
-	},
-
-	/*
-	applyClassesToFonts : function(doc, size) {
-		var f = doc.getElementsByTagName("font");
-		for (var i=0; i<f.length; i++) {
-			var s = tinyMCE.getAttrib(f[i], "size");
-
-			if (s != "")
-				tinyMCE.setAttrib(f[i], 'class', "mceItemFont" + s);
-		}
-
-		if (typeof(size) != "undefined") {
-			var css = "";
-
-			for (var x=0; x<doc.styleSheets.length; x++) {
-				for (var i=0; i<doc.styleSheets[x].rules.length; i++) {
-					if (doc.styleSheets[x].rules[i].selectorText == '#mceSpanFonts .mceItemFont' + size) {
-						css = doc.styleSheets[x].rules[i].style.cssText;
-						break;
-					}
-				}
-
-				if (css != "")
-					break;
-			}
-
-			if (doc.styleSheets[0].rules[0].selectorText == "FONT")
-				doc.styleSheets[0].removeRule(0);
-
-			doc.styleSheets[0].addRule("FONT", css, 0);
-		}
-	},
-	*/
-
-	fixGeckoBaseHREFBug : function(m, e, h) {
-		var xsrc, xhref;
-
-		if (tinyMCE.isGecko) {
-			if (m == 1) {
-				h = h.replace(/\ssrc=/gi, " mce_tsrc=");
-				h = h.replace(/\shref=/gi, " mce_thref=");
-
-				return h;
-			} else {
-				// Why bother if there is no src or href broken
-				if (!new RegExp('(src|href)=', 'g').test(h))
-					return h;
-
-				// Restore src and href that gets messed up by Gecko
-				tinyMCE.selectElements(e, 'A,IMG,SELECT,AREA,IFRAME,BASE,INPUT,SCRIPT,EMBED,OBJECT,LINK', function (n) {
-					xsrc = tinyMCE.getAttrib(n, "mce_tsrc");
-					xhref = tinyMCE.getAttrib(n, "mce_thref");
-
-					if (xsrc != "") {
-						try {
-							n.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], xsrc);
-						} catch (e) {
-							// Ignore, Firefox cast exception if local file wasn't found
-						}
-
-						n.removeAttribute("mce_tsrc");
-					}
-
-					if (xhref != "") {
-						try {
-							n.href = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], xhref);
-						} catch (e) {
-							// Ignore, Firefox cast exception if local file wasn't found
-						}
-
-						n.removeAttribute("mce_thref");
-					}
-
-					return false;
-				});
-
-				// Restore text/comment nodes
-				tinyMCE.selectNodes(e, function(n) {
-					if (n.nodeType == 3 || n.nodeType == 8) {
-						n.nodeValue = n.nodeValue.replace(/\smce_tsrc=/gi, " src=");
-						n.nodeValue = n.nodeValue.replace(/\smce_thref=/gi, " href=");
-					}
-
-					return false;
-				});
-			}
-		}
-
-		return h;
-	},
-
-	_setHTML : function(doc, html_content) {
-		// Force closed anchors open
-		//html_content = html_content.replace(new RegExp('<a(.*?)/>', 'gi'), '<a$1></a>');
-
-		html_content = tinyMCE.cleanupHTMLCode(html_content);
-
-		// Try innerHTML if it fails use pasteHTML in MSIE
-		try {
-			tinyMCE.setInnerHTML(doc.body, html_content);
-		} catch (e) {
-			if (this.isMSIE)
-				doc.body.createTextRange().pasteHTML(html_content);
-		}
-
-		// Content duplication bug fix
-		if (tinyMCE.isIE && tinyMCE.settings['fix_content_duplication']) {
-			// Remove P elements in P elements
-			var paras = doc.getElementsByTagName("P");
-			for (var i=0; i<paras.length; i++) {
-				var node = paras[i];
-				while ((node = node.parentNode) != null) {
-					if (node.nodeName == "P")
-						node.outerHTML = node.innerHTML;
-				}
-			}
-
-			// Content duplication bug fix (Seems to be word crap)
-			var html = doc.body.innerHTML;
-/*
-			if (html.indexOf('="mso') != -1) {
-				for (var i=0; i<doc.body.all.length; i++) {
-					var el = doc.body.all[i];
-					el.removeAttribute("className","",0);
-					el.removeAttribute("style","",0);
-				}
-
-				html = doc.body.innerHTML;
-				html = tinyMCE.regexpReplace(html, "<o:p><\/o:p>", "<br />");
-				html = tinyMCE.regexpReplace(html, "<o:p>&nbsp;<\/o:p>", "");
-				html = tinyMCE.regexpReplace(html, "<st1:.*?>", "");
-				html = tinyMCE.regexpReplace(html, "<p><\/p>", "");
-				html = tinyMCE.regexpReplace(html, "<p><\/p>\r\n<p><\/p>", "");
-				html = tinyMCE.regexpReplace(html, "<p>&nbsp;<\/p>", "<br />");
-				html = tinyMCE.regexpReplace(html, "<p>\s*(<p>\s*)?", "<p>");
-				html = tinyMCE.regexpReplace(html, "<\/p>\s*(<\/p>\s*)?", "</p>");
-			}*/
-
-			// Always set the htmlText output
-			tinyMCE.setInnerHTML(doc.body, html);
-		}
-
-		tinyMCE.cleanupAnchors(doc);
-
-		if (tinyMCE.getParam("convert_fonts_to_spans"))
-			tinyMCE.convertSpansToFonts(doc);
-	},
-
-	getEditorId : function(form_element) {
-		var inst = this.getInstanceById(form_element);
-		if (!inst)
-			return null;
-
-		return inst.editorId;
-	},
-
-	getInstanceById : function(editor_id) {
-		var inst = this.instances[editor_id];
-		if (!inst) {
-			for (var n in tinyMCE.instances) {
-				var instance = tinyMCE.instances[n];
-				if (!tinyMCE.isInstance(instance))
-					continue;
-
-				if (instance.formTargetElementId == editor_id) {
-					inst = instance;
-					break;
-				}
-			}
-		}
-
-		return inst;
-	},
-
-	queryInstanceCommandValue : function(editor_id, command) {
-		var inst = tinyMCE.getInstanceById(editor_id);
-		if (inst)
-			return inst.queryCommandValue(command);
-
-		return false;
-	},
-
-	queryInstanceCommandState : function(editor_id, command) {
-		var inst = tinyMCE.getInstanceById(editor_id);
-		if (inst)
-			return inst.queryCommandState(command);
-
-		return null;
-	},
-
-	setWindowArg : function(n, v) {
-		this.windowArgs[n] = v;
-	},
-
-	getWindowArg : function(n, d) {
-		return (typeof(this.windowArgs[n]) == "undefined") ? d : this.windowArgs[n];
-	},
-
-	getCSSClasses : function(editor_id, doc) {
-		var inst = tinyMCE.getInstanceById(editor_id);
-
-		// Is cached, use that
-		if (inst && inst.cssClasses.length > 0)
-			return inst.cssClasses;
-
-		if (typeof(editor_id) == "undefined" && typeof(doc) == "undefined") {
-			var instance;
-
-			for (var instanceName in tinyMCE.instances) {
-				instance = tinyMCE.instances[instanceName];
-				if (!tinyMCE.isInstance(instance))
-					continue;
-
-				break;
-			}
-
-			doc = instance.getDoc();
-		}
-
-		if (typeof(doc) == "undefined") {
-			var instance = tinyMCE.getInstanceById(editor_id);
-			doc = instance.getDoc();
-		}
-
-		if (doc) {
-			var styles = doc.styleSheets;
-
-			if (styles && styles.length > 0) {
-				for (var x=0; x<styles.length; x++) {
-					var csses = null;
-
-					// Just ignore any errors
-					eval("try {var csses = tinyMCE.isIE ? doc.styleSheets(" + x + ").rules : styles[" + x + "].cssRules;} catch(e) {}");
-					if (!csses)
-						return new Array();
-
-					for (var i=0; i<csses.length; i++) {
-						var selectorText = csses[i].selectorText;
-
-						// Can be multiple rules per selector
-						if (selectorText) {
-							var rules = selectorText.split(',');
-							for (var c=0; c<rules.length; c++) {
-								var rule = rules[c];
-
-								// Strip spaces between selectors
-								while (rule.indexOf(' ') == 0)
-									rule = rule.substring(1);
-
-								// Invalid rule
-								if (rule.indexOf(' ') != -1 || rule.indexOf(':') != -1 || rule.indexOf('mceItem') != -1)
-									continue;
-
-								if (rule.indexOf(tinyMCE.settings['visual_table_class']) != -1 || rule.indexOf('mceEditable') != -1 || rule.indexOf('mceNonEditable') != -1)
-									continue;
-
-								// Is class rule
-								if (rule.indexOf('.') != -1) {
-									var cssClass = rule.substring(rule.indexOf('.') + 1);
-									var addClass = true;
-
-									for (var p=0; p<inst.cssClasses.length && addClass; p++) {
-										if (inst.cssClasses[p] == cssClass)
-											addClass = false;
-									}
-
-									if (addClass)
-										inst.cssClasses[inst.cssClasses.length] = cssClass;
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-
-		return inst.cssClasses;
-	},
-
-	regexpReplace : function(in_str, reg_exp, replace_str, opts) {
-		if (in_str == null)
-			return in_str;
-
-		if (typeof(opts) == "undefined")
-			opts = 'g';
-
-		var re = new RegExp(reg_exp, opts);
-		return in_str.replace(re, replace_str);
-	},
-
-	trim : function(s) {
-		return s.replace(/^\s*|\s*$/g, "");
-	},
-
-	cleanupEventStr : function(s) {
-		s = "" + s;
-		s = s.replace('function anonymous()\n{\n', '');
-		s = s.replace('\n}', '');
-		s = s.replace(/^return true;/gi, ''); // Remove event blocker
-
-		return s;
-	},
-
-	getControlHTML : function(c) {
-		var i, l, n, o, v, rtl = tinyMCE.getLang('lang_dir') == 'rtl';
-
-		l = tinyMCE.plugins;
-		for (n in l) {
-			o = l[n];
-
-			if (o.getControlHTML && (v = o.getControlHTML(c)) != '') {
-				if (rtl)
-					return '<span dir="rtl">' + tinyMCE.replaceVar(v, "pluginurl", o.baseURL) + '</span>';
-
-				return tinyMCE.replaceVar(v, "pluginurl", o.baseURL);
-			}
-		}
-
-		o = tinyMCE.themes[tinyMCE.settings['theme']];
-		if (o.getControlHTML && (v = o.getControlHTML(c)) != '') {
-			if (rtl)
-				return '<span dir="rtl">' + v + '</span>';
-
-			return v;
-		}
-
-		return '';
-	},
-
-	evalFunc : function(f, idx, a, o) {
-		o = !o ? window : o;
-		f = typeof(f) == 'function' ? f : o[f];
-
-		return f.apply(o, Array.prototype.slice.call(a, idx));
-	},
-
-	dispatchCallback : function(i, p, n) {
-		return this.callFunc(i, p, n, 0, this.dispatchCallback.arguments);
-	},
-
-	executeCallback : function(i, p, n) {
-		return this.callFunc(i, p, n, 1, this.executeCallback.arguments);
-	},
-
-	execCommandCallback : function(i, p, n) {
-		return this.callFunc(i, p, n, 2, this.execCommandCallback.arguments);
-	},
-
-	callFunc : function(ins, p, n, m, a) {
-		var l, i, on, o, s, v;
-
-		s = m == 2;
-
-		l = tinyMCE.getParam(p, '');
-
-		if (l != '' && (v = tinyMCE.evalFunc(l, 3, a)) == s && m > 0)
-			return true;
-
-		if (ins != null) {
-			for (i=0, l = ins.plugins; i<l.length; i++) {
-				o = tinyMCE.plugins[l[i]];
-
-				if (o[n] && (v = tinyMCE.evalFunc(n, 3, a, o)) == s && m > 0)
-					return true;
-			}
-		}
-
-		l = tinyMCE.themes;
-		for (on in l) {
-			o = l[on];
-
-			if (o[n] && (v = tinyMCE.evalFunc(n, 3, a, o)) == s && m > 0)
-				return true;
-		}
-
-		return false;
-	},
-
-	xmlEncode : function(s, skip_apos) {
-		return s ? ('' + s).replace(!skip_apos ? this.xmlEncodeAposRe : this.xmlEncodeRe, function (c, b) {
-			switch (c) {
-				case '&':
-					return '&amp;';
-
-				case '"':
-					return '&quot;';
-
-				case '\'':
-					return '&#39;'; // &apos; is not working in MSIE
-
-				case '<':
-					return '&lt;';
-
-				case '>':
-					return '&gt;';
-			}
-
-			return c;
-		}) : s;
-	},
-
-	extend : function(p, np) {
-		var o = {};
-
-		o.parent = p;
-
-		for (n in p)
-			o[n] = p[n];
-
-		for (n in np)
-			o[n] = np[n];
-
-		return o;
-	},
-
-	hideMenus : function() {
-		var e = tinyMCE.lastSelectedMenuBtn;
-
-		if (tinyMCE.lastMenu) {
-			tinyMCE.lastMenu.hide();
-			tinyMCE.lastMenu = null;
-		}
-
-		if (e) {
-			tinyMCE.switchClass(e, tinyMCE.lastMenuBtnClass);
-			tinyMCE.lastSelectedMenuBtn = null;
-		}
-	}
-
-	};
-
-// Global instances
-var TinyMCE = TinyMCE_Engine; // Compatiblity with gzip compressors
-var tinyMCE = new TinyMCE_Engine();
-var tinyMCELang = {};
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_Control.class.js */
-
-function TinyMCE_Control(settings) {
-	var t, i, to, fu, p, x, fn, fu, pn, s = settings;
-
-	this.undoRedoLevel = true;
-	this.isTinyMCE_Control = true;
-
-	// Default settings
-	this.settings = s;
-	this.settings['theme'] = tinyMCE.getParam("theme", "default");
-	this.settings['width'] = tinyMCE.getParam("width", -1);
-	this.settings['height'] = tinyMCE.getParam("height", -1);
-	this.selection = new TinyMCE_Selection(this);
-	this.undoRedo = new TinyMCE_UndoRedo(this);
-	this.cleanup = new TinyMCE_Cleanup();
-	this.shortcuts = new Array();
-	this.hasMouseMoved = false;
-	this.foreColor = this.backColor = "#999999";
-	this.data = {};
-	this.cssClasses = [];
-
-	this.cleanup.init({
-		valid_elements : s.valid_elements,
-		extended_valid_elements : s.extended_valid_elements,
-		valid_child_elements : s.valid_child_elements,
-		entities : s.entities,
-		entity_encoding : s.entity_encoding,
-		debug : s.cleanup_debug,
-		indent : s.apply_source_formatting,
-		invalid_elements : s.invalid_elements,
-		verify_html : s.verify_html,
-		fix_content_duplication : s.fix_content_duplication,
-		convert_fonts_to_spans : s.convert_fonts_to_spans
-	});
-
-	// Wrap old theme
-	t = this.settings['theme'];
-	if (!tinyMCE.hasTheme(t)) {
-		fn = tinyMCE.callbacks;
-		to = {};
-
-		for (i=0; i<fn.length; i++) {
-			if ((fu = window['TinyMCE_' + t + "_" + fn[i]]))
-				to[fn[i]] = fu;
-		}
-
-		tinyMCE.addTheme(t, to);
-	}
-
-	// Wrap old plugins
-	this.plugins = new Array();
-	p = tinyMCE.getParam('plugins', '', true, ',');
-	if (p.length > 0) {
-		for (i=0; i<p.length; i++) {
-			pn = p[i];
-
-			if (pn.charAt(0) == '-')
-				pn = pn.substring(1);
-
-			if (!tinyMCE.hasPlugin(pn)) {
-				fn = tinyMCE.callbacks;
-				to = {};
-
-				for (x=0; x<fn.length; x++) {
-					if ((fu = window['TinyMCE_' + pn + "_" + fn[x]]))
-						to[fn[x]] = fu;
-				}
-
-				tinyMCE.addPlugin(pn, to);
-			}
-
-			this.plugins[this.plugins.length] = pn; 
-		}
-	}
-};
-
-TinyMCE_Control.prototype = {
-	selection : null,
-
-	settings : null,
-
-	cleanup : null,
-
-	getData : function(na) {
-		var o = this.data[na];
-
-		if (!o)
-			o = this.data[na] = {};
-
-		return o;
-	},
-
-	hasPlugin : function(n) {
-		var i;
-
-		for (i=0; i<this.plugins.length; i++) {
-			if (this.plugins[i] == n)
-				return true;
-		}
-
-		return false;
-	},
-
-	addPlugin : function(n, p) {
-		if (!this.hasPlugin(n)) {
-			tinyMCE.addPlugin(n, p);
-			this.plugins[this.plugins.length] = n;
-		}
-	},
-
-	repaint : function() {
-		var s, b, ex;
-
-		if (tinyMCE.isRealIE)
-			return;
-
-		try {
-			s = this.selection;
-			b = s.getBookmark(true);
-			this.getBody().style.display = 'none';
-			this.getDoc().execCommand('selectall', false, null);
-			this.getSel().collapseToStart();
-			this.getBody().style.display = 'block';
-			s.moveToBookmark(b);
-		} catch (ex) {
-			// Ignore
-		}
-	},
-
-	switchSettings : function() {
-		if (tinyMCE.configs.length > 1 && tinyMCE.currentConfig != this.settings['index']) {
-			tinyMCE.settings = this.settings;
-			tinyMCE.currentConfig = this.settings['index'];
-		}
-	},
-
-	select : function() {
-		var oldInst = tinyMCE.selectedInstance;
-
-		if (oldInst != this) {
-			if (oldInst)
-				oldInst.execCommand('mceEndTyping');
-
-			tinyMCE.dispatchCallback(this, 'select_instance_callback', 'selectInstance', this, oldInst);
-			tinyMCE.selectedInstance = this;
-		}
-	},
-
-	getBody : function() {
-		return this.contentBody ? this.contentBody : this.getDoc().body;
-	},
-
-	getDoc : function() {
-//		return this.contentDocument ? this.contentDocument : this.contentWindow.document; // Removed due to IE 5.5 ?
-		return this.contentWindow.document;
-	},
-
-	getWin : function() {
-		return this.contentWindow;
-	},
-
-	getContainerWin : function() {
-		return this.containerWindow ? this.containerWindow : window;
-	},
-
-	getViewPort : function() {
-		return tinyMCE.getViewPort(this.getWin());
-	},
-
-	getParentNode : function(n, f) {
-		return tinyMCE.getParentNode(n, f, this.getBody());
-	},
-
-	getParentElement : function(n, na, f) {
-		return tinyMCE.getParentElement(n, na, f, this.getBody());
-	},
-
-	getParentBlockElement : function(n) {
-		return tinyMCE.getParentBlockElement(n, this.getBody());
-	},
-
-	resizeToContent : function() {
-		var d = this.getDoc(), b = d.body, de = d.documentElement;
-
-		this.iframeElement.style.height = (tinyMCE.isRealIE) ? b.scrollHeight : de.offsetHeight + 'px';
-	},
-
-	addShortcut : function(m, k, d, cmd, ui, va) {
-		var n = typeof(k) == "number", ie = tinyMCE.isIE, c, sc, i, scl = this.shortcuts;
-
-		if (!tinyMCE.getParam('custom_shortcuts'))
-			return false;
-
-		m = m.toLowerCase();
-		k = ie && !n ? k.toUpperCase() : k;
-		c = n ? null : k.charCodeAt(0);
-		d = d && d.indexOf('lang_') == 0 ? tinyMCE.getLang(d) : d;
-
-		sc = {
-			alt : m.indexOf('alt') != -1,
-			ctrl : m.indexOf('ctrl') != -1,
-			shift : m.indexOf('shift') != -1,
-			charCode : c,
-			keyCode : n ? k : (ie ? c : null),
-			desc : d,
-			cmd : cmd,
-			ui : ui,
-			val : va
-		};
-
-		for (i=0; i<scl.length; i++) {
-			if (sc.alt == scl[i].alt && sc.ctrl == scl[i].ctrl && sc.shift == scl[i].shift
-				&& sc.charCode == scl[i].charCode && sc.keyCode == scl[i].keyCode) {
-				return false;
-			}
-		}
-
-		scl[scl.length] = sc;
-
-		return true;
-	},
-
-	handleShortcut : function(e) {
-		var i, s, o;
-
-		// Normal key press, then ignore it
-		if (!e.altKey && !e.ctrlKey)
-			return false;
-
-		s = this.shortcuts;
-
-		for (i=0; i<s.length; i++) {
-			o = s[i];
-
-			if (o.alt == e.altKey && o.ctrl == e.ctrlKey && (o.keyCode == e.keyCode || o.charCode == e.charCode)) {
-				if (o.cmd && (e.type == "keydown" || (e.type == "keypress" && !tinyMCE.isOpera)))
-					tinyMCE.execCommand(o.cmd, o.ui, o.val);
-
-				tinyMCE.cancelEvent(e);
-				return true;
-			}
-		}
-
-		return false;
-	},
-
-	autoResetDesignMode : function() {
-		// Add fix for tab/style.display none/block problems in Gecko
-		if (!tinyMCE.isIE && this.isHidden() && tinyMCE.getParam('auto_reset_designmode'))
-			eval('try { this.getDoc().designMode = "On"; this.useCSS = false; } catch(e) {}');
-	},
-
-	isHidden : function() {
-		var s;
-
-		if (tinyMCE.isIE)
-			return false;
-
-		s = this.getSel();
-
-		// Weird, wheres that cursor selection?
-		return (!s || !s.rangeCount || s.rangeCount == 0);
-	},
-
-	isDirty : function() {
-		// Is content modified and not in a submit procedure
-		return tinyMCE.trim(this.startContent) != tinyMCE.trim(this.getBody().innerHTML) && !tinyMCE.isNotDirty;
-	},
-
-	_mergeElements : function(scmd, pa, ch, override) {
-		if (scmd == "removeformat") {
-			pa.className = "";
-			pa.style.cssText = "";
-			ch.className = "";
-			ch.style.cssText = "";
-			return;
-		}
-
-		var st = tinyMCE.parseStyle(tinyMCE.getAttrib(pa, "style"));
-		var stc = tinyMCE.parseStyle(tinyMCE.getAttrib(ch, "style"));
-		var className = tinyMCE.getAttrib(pa, "class");
-
-		// Removed class adding due to bug #1478272
-		className = tinyMCE.getAttrib(ch, "class");
-
-		if (override) {
-			for (var n in st) {
-				if (typeof(st[n]) == 'function')
-					continue;
-
-				stc[n] = st[n];
-			}
-		} else {
-			for (var n in stc) {
-				if (typeof(stc[n]) == 'function')
-					continue;
-
-				st[n] = stc[n];
-			}
-		}
-
-		tinyMCE.setAttrib(pa, "style", tinyMCE.serializeStyle(st));
-		tinyMCE.setAttrib(pa, "class", tinyMCE.trim(className));
-		ch.className = "";
-		ch.style.cssText = "";
-		ch.removeAttribute("class");
-		ch.removeAttribute("style");
-	},
-
-	_setUseCSS : function(b) {
-		var d = this.getDoc();
-
-		try {d.execCommand("useCSS", false, !b);} catch (ex) {}
-		try {d.execCommand("styleWithCSS", false, b);} catch (ex) {}
-
-		if (!tinyMCE.getParam("table_inline_editing"))
-			try {d.execCommand('enableInlineTableEditing', false, "false");} catch (ex) {}
-
-		if (!tinyMCE.getParam("object_resizing"))
-			try {d.execCommand('enableObjectResizing', false, "false");} catch (ex) {}
-	},
-
-	execCommand : function(command, user_interface, value) {
-		var doc = this.getDoc(), win = this.getWin(), focusElm = this.getFocusElement();
-
-		// Is not a undo specific command
-		if (!new RegExp('mceStartTyping|mceEndTyping|mceBeginUndoLevel|mceEndUndoLevel|mceAddUndoLevel', 'gi').test(command))
-			this.undoBookmark = null;
-
-		// Mozilla issue
-		if (!tinyMCE.isIE && !this.useCSS) {
-			this._setUseCSS(false);
-			this.useCSS = true;
-		}
-
-		//debug("command: " + command + ", user_interface: " + user_interface + ", value: " + value);
-		this.contentDocument = doc; // <-- Strange, unless this is applied Mozilla 1.3 breaks
-
-		// Don't dispatch key commands
-		if (!/mceStartTyping|mceEndTyping/.test(command)) {
-			if (tinyMCE.execCommandCallback(this, 'execcommand_callback', 'execCommand', this.editorId, this.getBody(), command, user_interface, value))
-				return;
-		}
-
-		// Fix align on images
-		if (focusElm && focusElm.nodeName == "IMG") {
-			var align = focusElm.getAttribute('align');
-			var img = command == "JustifyCenter" ? focusElm.cloneNode(false) : focusElm;
-
-			switch (command) {
-				case "JustifyLeft":
-					if (align == 'left')
-						img.removeAttribute('align');
-					else
-						img.setAttribute('align', 'left');
-
-					// Remove the div
-					var div = focusElm.parentNode;
-					if (div && div.nodeName == "DIV" && div.childNodes.length == 1 && div.parentNode)
-						div.parentNode.replaceChild(img, div);
-
-					this.selection.selectNode(img);
-					this.repaint();
-					tinyMCE.triggerNodeChange();
-					return;
-
-				case "JustifyCenter":
-					img.removeAttribute('align');
-
-					// Is centered
-					var div = tinyMCE.getParentElement(focusElm, "div");
-					if (div && div.style.textAlign == "center") {
-						// Remove div
-						if (div.nodeName == "DIV" && div.childNodes.length == 1 && div.parentNode)
-							div.parentNode.replaceChild(img, div);
-					} else {
-						// Add div
-						var div = this.getDoc().createElement("div");
-						div.style.textAlign = 'center';
-						div.appendChild(img);
-						focusElm.parentNode.replaceChild(div, focusElm);
-					}
-
-					this.selection.selectNode(img);
-					this.repaint();
-					tinyMCE.triggerNodeChange();
-					return;
-
-				case "JustifyRight":
-					if (align == 'right')
-						img.removeAttribute('align');
-					else
-						img.setAttribute('align', 'right');
-
-					// Remove the div
-					var div = focusElm.parentNode;
-					if (div && div.nodeName == "DIV" && div.childNodes.length == 1 && div.parentNode)
-						div.parentNode.replaceChild(img, div);
-
-					this.selection.selectNode(img);
-					this.repaint();
-					tinyMCE.triggerNodeChange();
-					return;
-			}
-		}
-
-		if (tinyMCE.settings['force_br_newlines']) {
-			var alignValue = "";
-
-			if (doc.selection.type != "Control") {
-				switch (command) {
-						case "JustifyLeft":
-							alignValue = "left";
-							break;
-
-						case "JustifyCenter":
-							alignValue = "center";
-							break;
-
-						case "JustifyFull":
-							alignValue = "justify";
-							break;
-
-						case "JustifyRight":
-							alignValue = "right";
-							break;
-				}
-
-				if (alignValue != "") {
-					var rng = doc.selection.createRange();
-
-					if ((divElm = tinyMCE.getParentElement(rng.parentElement(), "div")) != null)
-						divElm.setAttribute("align", alignValue);
-					else if (rng.pasteHTML && rng.htmlText.length > 0)
-						rng.pasteHTML('<div align="' + alignValue + '">' + rng.htmlText + "</div>");
-
-					tinyMCE.triggerNodeChange();
-					return;
-				}
-			}
-		}
-
-		switch (command) {
-			case "mceRepaint":
-				this.repaint();
-				return true;
-
-			case "unlink":
-				// Unlink if caret is inside link
-				if (tinyMCE.isGecko && this.getSel().isCollapsed) {
-					focusElm = tinyMCE.getParentElement(focusElm, 'A');
-
-					if (focusElm)
-						this.selection.selectNode(focusElm, false);
-				}
-
-				this.getDoc().execCommand(command, user_interface, value);
-
-				tinyMCE.isGecko && this.getSel().collapseToEnd();
-
-				tinyMCE.triggerNodeChange();
-
-				return true;
-
-			case "InsertUnorderedList":
-			case "InsertOrderedList":
-				this.getDoc().execCommand(command, user_interface, value);
-				tinyMCE.triggerNodeChange();
-				break;
-
-			case "Strikethrough":
-				this.getDoc().execCommand(command, user_interface, value);
-				tinyMCE.triggerNodeChange();
-				break;
-
-			case "mceSelectNode":
-				this.selection.selectNode(value);
-				tinyMCE.triggerNodeChange();
-				tinyMCE.selectedNode = value;
-				break;
-
-			case "FormatBlock":
-				if (value == null || value == "") {
-					var elm = tinyMCE.getParentElement(this.getFocusElement(), "p,div,h1,h2,h3,h4,h5,h6,pre,address,blockquote,dt,dl,dd,samp");
-
-					if (elm)
-						this.execCommand("mceRemoveNode", false, elm);
-				} else {
-					if (!this.cleanup.isValid(value))
-						return true;
-
-					if (tinyMCE.isGecko && new RegExp('<(div|blockquote|code|dt|dd|dl|samp)>', 'gi').test(value))
-						value = value.replace(/[^a-z]/gi, '');
-
-					if (tinyMCE.isIE && new RegExp('blockquote|code|samp', 'gi').test(value)) {
-						var b = this.selection.getBookmark();
-						this.getDoc().execCommand("FormatBlock", false, '<p>');
-						tinyMCE.renameElement(tinyMCE.getParentBlockElement(this.getFocusElement()), value);
-						this.selection.moveToBookmark(b);
-					} else
-						this.getDoc().execCommand("FormatBlock", false, value);
-				}
-
-				tinyMCE.triggerNodeChange();
-
-				break;
-
-			case "mceRemoveNode":
-				if (!value)
-					value = tinyMCE.getParentElement(this.getFocusElement());
-
-				if (tinyMCE.isIE) {
-					value.outerHTML = value.innerHTML;
-				} else {
-					var rng = value.ownerDocument.createRange();
-					rng.setStartBefore(value);
-					rng.setEndAfter(value);
-					rng.deleteContents();
-					rng.insertNode(rng.createContextualFragment(value.innerHTML));
-				}
-
-				tinyMCE.triggerNodeChange();
-
-				break;
-
-			case "mceSelectNodeDepth":
-				var parentNode = this.getFocusElement();
-				for (var i=0; parentNode; i++) {
-					if (parentNode.nodeName.toLowerCase() == "body")
-						break;
-
-					if (parentNode.nodeName.toLowerCase() == "#text") {
-						i--;
-						parentNode = parentNode.parentNode;
-						continue;
-					}
-
-					if (i == value) {
-						this.selection.selectNode(parentNode, false);
-						tinyMCE.triggerNodeChange();
-						tinyMCE.selectedNode = parentNode;
-						return;
-					}
-
-					parentNode = parentNode.parentNode;
-				}
-
-				break;
-
-			case "mceSetStyleInfo":
-			case "SetStyleInfo":
-				var rng = this.getRng();
-				var sel = this.getSel();
-				var scmd = value['command'];
-				var sname = value['name'];
-				var svalue = value['value'] == null ? '' : value['value'];
-				//var svalue = value['value'] == null ? '' : value['value'];
-				var wrapper = value['wrapper'] ? value['wrapper'] : "span";
-				var parentElm = null;
-				var invalidRe = new RegExp("^BODY|HTML$", "g");
-				var invalidParentsRe = tinyMCE.settings['merge_styles_invalid_parents'] != '' ? new RegExp(tinyMCE.settings['merge_styles_invalid_parents'], "gi") : null;
-
-				// Whole element selected check
-				if (tinyMCE.isIE) {
-					// Control range
-					if (rng.item)
-						parentElm = rng.item(0);
-					else {
-						var pelm = rng.parentElement();
-						var prng = doc.selection.createRange();
-						prng.moveToElementText(pelm);
-
-						if (rng.htmlText == prng.htmlText || rng.boundingWidth == 0) {
-							if (invalidParentsRe == null || !invalidParentsRe.test(pelm.nodeName))
-								parentElm = pelm;
-						}
-					}
-				} else {
-					var felm = this.getFocusElement();
-					if (sel.isCollapsed || (new RegExp('td|tr|tbody|table', 'gi').test(felm.nodeName) && sel.anchorNode == felm.parentNode))
-						parentElm = felm;
-				}
-
-				// Whole element selected
-				if (parentElm && !invalidRe.test(parentElm.nodeName)) {
-					if (scmd == "setstyle")
-						tinyMCE.setStyleAttrib(parentElm, sname, svalue);
-
-					if (scmd == "setattrib")
-						tinyMCE.setAttrib(parentElm, sname, svalue);
-
-					if (scmd == "removeformat") {
-						parentElm.style.cssText = '';
-						tinyMCE.setAttrib(parentElm, 'class', '');
-					}
-
-					// Remove style/attribs from all children
-					var ch = tinyMCE.getNodeTree(parentElm, new Array(), 1);
-					for (var z=0; z<ch.length; z++) {
-						if (ch[z] == parentElm)
-							continue;
-
-						if (scmd == "setstyle")
-							tinyMCE.setStyleAttrib(ch[z], sname, '');
-
-						if (scmd == "setattrib")
-							tinyMCE.setAttrib(ch[z], sname, '');
-
-						if (scmd == "removeformat") {
-							ch[z].style.cssText = '';
-							tinyMCE.setAttrib(ch[z], 'class', '');
-						}
-					}
-				} else {
-					this._setUseCSS(false); // Bug in FF when running in fullscreen
-					doc.execCommand("FontName", false, "#mce_temp_font#");
-					var elementArray = tinyMCE.getElementsByAttributeValue(this.getBody(), "font", "face", "#mce_temp_font#");
-
-					// Change them all
-					for (var x=0; x<elementArray.length; x++) {
-						elm = elementArray[x];
-						if (elm) {
-							var spanElm = doc.createElement(wrapper);
-
-							if (scmd == "setstyle")
-								tinyMCE.setStyleAttrib(spanElm, sname, svalue);
-
-							if (scmd == "setattrib")
-								tinyMCE.setAttrib(spanElm, sname, svalue);
-
-							if (scmd == "removeformat") {
-								spanElm.style.cssText = '';
-								tinyMCE.setAttrib(spanElm, 'class', '');
-							}
-
-							if (elm.hasChildNodes()) {
-								for (var i=0; i<elm.childNodes.length; i++)
-									spanElm.appendChild(elm.childNodes[i].cloneNode(true));
-							}
-
-							spanElm.setAttribute("mce_new", "true");
-							elm.parentNode.replaceChild(spanElm, elm);
-
-							// Remove style/attribs from all children
-							var ch = tinyMCE.getNodeTree(spanElm, new Array(), 1);
-							for (var z=0; z<ch.length; z++) {
-								if (ch[z] == spanElm)
-									continue;
-
-								if (scmd == "setstyle")
-									tinyMCE.setStyleAttrib(ch[z], sname, '');
-
-								if (scmd == "setattrib")
-									tinyMCE.setAttrib(ch[z], sname, '');
-
-								if (scmd == "removeformat") {
-									ch[z].style.cssText = '';
-									tinyMCE.setAttrib(ch[z], 'class', '');
-								}
-							}
-						}
-					}
-				}
-
-				// Cleaup wrappers
-				var nodes = doc.getElementsByTagName(wrapper);
-				for (var i=nodes.length-1; i>=0; i--) {
-					var elm = nodes[i];
-					var isNew = tinyMCE.getAttrib(elm, "mce_new") == "true";
-
-					elm.removeAttribute("mce_new");
-
-					// Is only child a element
-					if (elm.childNodes && elm.childNodes.length == 1 && elm.childNodes[0].nodeType == 1) {
-						//tinyMCE.debug("merge1" + isNew);
-						this._mergeElements(scmd, elm, elm.childNodes[0], isNew);
-						continue;
-					}
-
-					// Is I the only child
-					if (elm.parentNode.childNodes.length == 1 && !invalidRe.test(elm.nodeName) && !invalidRe.test(elm.parentNode.nodeName)) {
-						//tinyMCE.debug("merge2" + isNew + "," + elm.nodeName + "," + elm.parentNode.nodeName);
-						if (invalidParentsRe == null || !invalidParentsRe.test(elm.parentNode.nodeName))
-							this._mergeElements(scmd, elm.parentNode, elm, false);
-					}
-				}
-
-				// Remove empty wrappers
-				var nodes = doc.getElementsByTagName(wrapper);
-				for (var i=nodes.length-1; i>=0; i--) {
-					var elm = nodes[i];
-					var isEmpty = true;
-
-					// Check if it has any attribs
-					var tmp = doc.createElement("body");
-					tmp.appendChild(elm.cloneNode(false));
-
-					// Is empty span, remove it
-					tmp.innerHTML = tmp.innerHTML.replace(new RegExp('style=""|class=""', 'gi'), '');
-					//tinyMCE.debug(tmp.innerHTML);
-					if (new RegExp('<span>', 'gi').test(tmp.innerHTML)) {
-						for (var x=0; x<elm.childNodes.length; x++) {
-							if (elm.parentNode != null)
-								elm.parentNode.insertBefore(elm.childNodes[x].cloneNode(true), elm);
-						}
-
-						elm.parentNode.removeChild(elm);
-					}
-				}
-
-				// Re add the visual aids
-				if (scmd == "removeformat")
-					tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);
-
-				tinyMCE.triggerNodeChange();
-
-				break;
-
-			case "FontName":
-				if (value == null) {
-					var s = this.getSel();
-
-					// Find font and select it
-					if (tinyMCE.isGecko && s.isCollapsed) {
-						var f = tinyMCE.getParentElement(this.getFocusElement(), "font");
-
-						if (f != null)
-							this.selection.selectNode(f, false);
-					}
-
-					// Remove format
-					this.getDoc().execCommand("RemoveFormat", false, null);
-
-					// Collapse range if font was found
-					if (f != null && tinyMCE.isGecko) {
-						var r = this.getRng().cloneRange();
-						r.collapse(true);
-						s.removeAllRanges();
-						s.addRange(r);
-					}
-				} else
-					this.getDoc().execCommand('FontName', false, value);
-
-				if (tinyMCE.isGecko)
-					window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);
-
-				return;
-
-			case "FontSize":
-				this.getDoc().execCommand('FontSize', false, value);
-
-				if (tinyMCE.isGecko)
-					window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);
-
-				return;
-
-			case "forecolor":
-				value = value == null ? this.foreColor : value;
-				value = tinyMCE.trim(value);
-				value = value.charAt(0) != '#' ? (isNaN('0x' + value) ? value : '#' + value) : value;
-
-				this.foreColor = value;
-				this.getDoc().execCommand('forecolor', false, value);
-				break;
-
-			case "HiliteColor":
-				value = value == null ? this.backColor : value;
-				value = tinyMCE.trim(value);
-				value = value.charAt(0) != '#' ? (isNaN('0x' + value) ? value : '#' + value) : value;
-				this.backColor = value;
-
-				if (tinyMCE.isGecko) {
-					this._setUseCSS(true);
-					this.getDoc().execCommand('hilitecolor', false, value);
-					this._setUseCSS(false);
-				} else
-					this.getDoc().execCommand('BackColor', false, value);
-				break;
-
-			case "Cut":
-			case "Copy":
-			case "Paste":
-				var cmdFailed = false;
-
-				// Try executing command
-				eval('try {this.getDoc().execCommand(command, user_interface, value);} catch (e) {cmdFailed = true;}');
-
-				if (tinyMCE.isOpera && cmdFailed)
-					alert('Currently not supported by your browser, use keyboard shortcuts instead.');
-
-				// Alert error in gecko if command failed
-				if (tinyMCE.isGecko && cmdFailed) {
-					// Confirm more info
-					if (confirm(tinyMCE.entityDecode(tinyMCE.getLang('lang_clipboard_msg'))))
-						window.open('http://www.mozilla.org/editor/midasdemo/securityprefs.html', 'mceExternal');
-
-					return;
-				} else
-					tinyMCE.triggerNodeChange();
-			break;
-
-			case "mceSetContent":
-				if (!value)
-					value = "";
-
-				// Call custom cleanup code
-				value = tinyMCE.storeAwayURLs(value);
-				value = tinyMCE._customCleanup(this, "insert_to_editor", value);
-
-				if (this.getBody().nodeName == 'BODY')
-					tinyMCE._setHTML(doc, value);
-				else
-					this.getBody().innerHTML = value;
-
-				tinyMCE.setInnerHTML(this.getBody(), tinyMCE._cleanupHTML(this, doc, this.settings, this.getBody(), false, false, false, true));
-				tinyMCE.convertAllRelativeURLs(this.getBody());
-
-				// Cleanup any mess left from storyAwayURLs
-				tinyMCE._removeInternal(this.getBody());
-
-				// When editing always use fonts internaly
-				if (tinyMCE.getParam("convert_fonts_to_spans"))
-					tinyMCE.convertSpansToFonts(doc);
-
-				tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);
-				tinyMCE._setEventsEnabled(this.getBody(), false);
-				return true;
-
-			case "mceCleanup":
-				var b = this.selection.getBookmark();
-				tinyMCE._setHTML(this.contentDocument, this.getBody().innerHTML);
-				tinyMCE.setInnerHTML(this.getBody(), tinyMCE._cleanupHTML(this, this.contentDocument, this.settings, this.getBody(), this.visualAid));
-				tinyMCE.convertAllRelativeURLs(doc.body);
-
-				// When editing always use fonts internaly
-				if (tinyMCE.getParam("convert_fonts_to_spans"))
-					tinyMCE.convertSpansToFonts(doc);
-
-				tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);
-				tinyMCE._setEventsEnabled(this.getBody(), false);
-				this.repaint();
-				this.selection.moveToBookmark(b);
-				tinyMCE.triggerNodeChange();
-			break;
-
-			case "mceReplaceContent":
-				// Force empty string
-				if (!value)
-					value = '';
-
-				this.getWin().focus();
-
-				var selectedText = "";
-
-				if (tinyMCE.isIE) {
-					var rng = doc.selection.createRange();
-					selectedText = rng.text;
-				} else
-					selectedText = this.getSel().toString();
-
-				if (selectedText.length > 0) {
-					value = tinyMCE.replaceVar(value, "selection", selectedText);
-					tinyMCE.execCommand('mceInsertContent', false, value);
-				}
-
-				tinyMCE.triggerNodeChange();
-			break;
-
-			case "mceSetAttribute":
-				if (typeof(value) == 'object') {
-					var targetElms = (typeof(value['targets']) == "undefined") ? "p,img,span,div,td,h1,h2,h3,h4,h5,h6,pre,address" : value['targets'];
-					var targetNode = tinyMCE.getParentElement(this.getFocusElement(), targetElms);
-
-					if (targetNode) {
-						targetNode.setAttribute(value['name'], value['value']);
-						tinyMCE.triggerNodeChange();
-					}
-				}
-			break;
-
-			case "mceSetCSSClass":
-				this.execCommand("mceSetStyleInfo", false, {command : "setattrib", name : "class", value : value});
-			break;
-
-			case "mceInsertRawHTML":
-				var key = 'tiny_mce_marker';
-
-				this.execCommand('mceBeginUndoLevel');
-
-				// Insert marker key
-				this.execCommand('mceInsertContent', false, key);
-
-				// Store away scroll pos
-				var scrollX = this.getBody().scrollLeft + this.getDoc().documentElement.scrollLeft;
-				var scrollY = this.getBody().scrollTop + this.getDoc().documentElement.scrollTop;
-
-				// Find marker and replace with RAW HTML
-				var html = this.getBody().innerHTML;
-				if ((pos = html.indexOf(key)) != -1)
-					tinyMCE.setInnerHTML(this.getBody(), html.substring(0, pos) + value + html.substring(pos + key.length));
-
-				// Restore scoll pos
-				this.contentWindow.scrollTo(scrollX, scrollY);
-
-				this.execCommand('mceEndUndoLevel');
-
-				break;
-
-			case "mceInsertContent":
-				// Force empty string
-				if (!value)
-					value = '';
-
-				var insertHTMLFailed = false;
-
-				// Removed since it produced problems in IE
-				// this.getWin().focus();
-
-				if (tinyMCE.isGecko || tinyMCE.isOpera) {
-					try {
-						// Is plain text or HTML, &amp;, &nbsp; etc will be encoded wrong in FF
-						if (value.indexOf('<') == -1 && !value.match(/(&#38;|&#160;|&#60;|&#62;)/g)) {
-							var r = this.getRng();
-							var n = this.getDoc().createTextNode(tinyMCE.entityDecode(value));
-							var s = this.getSel();
-							var r2 = r.cloneRange();
-
-							// Insert text at cursor position
-							s.removeAllRanges();
-							r.deleteContents();
-							r.insertNode(n);
-
-							// Move the cursor to the end of text
-							r2.selectNode(n);
-							r2.collapse(false);
-							s.removeAllRanges();
-							s.addRange(r2);
-						} else {
-							value = tinyMCE.fixGeckoBaseHREFBug(1, this.getDoc(), value);
-							this.getDoc().execCommand('inserthtml', false, value);
-							tinyMCE.fixGeckoBaseHREFBug(2, this.getDoc(), value);
-						}
-					} catch (ex) {
-						insertHTMLFailed = true;
-					}
-
-					if (!insertHTMLFailed) {
-						tinyMCE.triggerNodeChange();
-						return;
-					}
-				}
-
-				if (!tinyMCE.isIE) {
-					var isHTML = value.indexOf('<') != -1;
-					var sel = this.getSel();
-					var rng = this.getRng();
-
-					if (isHTML) {
-						if (tinyMCE.isSafari) {
-							var tmpRng = this.getDoc().createRange();
-
-							tmpRng.setStart(this.getBody(), 0);
-							tmpRng.setEnd(this.getBody(), 0);
-
-							value = tmpRng.createContextualFragment(value);
-						} else
-							value = rng.createContextualFragment(value);
-					} else {
-						// Setup text node
-						var el = document.createElement("div");
-						el.innerHTML = value;
-						value = el.firstChild.nodeValue;
-						value = doc.createTextNode(value);
-					}
-
-					// Insert plain text in Safari
-					if (tinyMCE.isSafari && !isHTML) {
-						this.execCommand('InsertText', false, value.nodeValue);
-						tinyMCE.triggerNodeChange();
-						return true;
-					} else if (tinyMCE.isSafari && isHTML) {
-						rng.deleteContents();
-						rng.insertNode(value);
-						tinyMCE.triggerNodeChange();
-						return true;
-					}
-
-					rng.deleteContents();
-
-					// If target node is text do special treatment, (Mozilla 1.3 fix)
-					if (rng.startContainer.nodeType == 3) {
-						var node = rng.startContainer.splitText(rng.startOffset);
-						node.parentNode.insertBefore(value, node); 
-					} else
-						rng.insertNode(value);
-
-					if (!isHTML) {
-						// Removes weird selection trails
-						sel.selectAllChildren(doc.body);
-						sel.removeAllRanges();
-
-						// Move cursor to end of content
-						var rng = doc.createRange();
-
-						rng.selectNode(value);
-						rng.collapse(false);
-
-						sel.addRange(rng);
-					} else
-						rng.collapse(false);
-
-					tinyMCE.fixGeckoBaseHREFBug(2, this.getDoc(), value);
-				} else {
-					var rng = doc.selection.createRange(), tmpRng = null;
-					var c = value.indexOf('<!--') != -1;
-
-					// Fix comment bug, add tag before comments
-					if (c)
-						value = tinyMCE.uniqueTag + value;
-
-					//	tmpRng = rng.duplicate(); // Store away range (Fixes Undo bookmark bug in IE)
-
-					if (rng.item)
-						rng.item(0).outerHTML = value;
-					else
-						rng.pasteHTML(value);
-
-					//if (tmpRng)
-					//	tmpRng.select(); // Restore range  (Fixes Undo bookmark bug in IE)
-
-					// Remove unique tag
-					if (c) {
-						var e = this.getDoc().getElementById('mceTMPElement');
-						e.parentNode.removeChild(e);
-					}
-				}
-
-				tinyMCE.execCommand("mceAddUndoLevel");
-				tinyMCE.triggerNodeChange();
-			break;
-
-			case "mceStartTyping":
-				if (tinyMCE.settings['custom_undo_redo'] && this.undoRedo.typingUndoIndex == -1) {
-					this.undoRedo.typingUndoIndex = this.undoRedo.undoIndex;
-					tinyMCE.typingUndoIndex = tinyMCE.undoIndex;
-					this.execCommand('mceAddUndoLevel');
-				}
-				break;
-
-			case "mceEndTyping":
-				if (tinyMCE.settings['custom_undo_redo'] && this.undoRedo.typingUndoIndex != -1) {
-					this.execCommand('mceAddUndoLevel');
-					this.undoRedo.typingUndoIndex = -1;
-				}
-
-				tinyMCE.typingUndoIndex = -1;
-				break;
-
-			case "mceBeginUndoLevel":
-				this.undoRedoLevel = false;
-				break;
-
-			case "mceEndUndoLevel":
-				this.undoRedoLevel = true;
-				this.execCommand('mceAddUndoLevel');
-				break;
-
-			case "mceAddUndoLevel":
-				if (tinyMCE.settings['custom_undo_redo'] && this.undoRedoLevel) {
-					if (this.undoRedo.add())
-						tinyMCE.triggerNodeChange(false);
-				}
-				break;
-
-			case "Undo":
-				if (tinyMCE.settings['custom_undo_redo']) {
-					tinyMCE.execCommand("mceEndTyping");
-					this.undoRedo.undo();
-					tinyMCE.triggerNodeChange();
-				} else
-					this.getDoc().execCommand(command, user_interface, value);
-				break;
-
-			case "Redo":
-				if (tinyMCE.settings['custom_undo_redo']) {
-					tinyMCE.execCommand("mceEndTyping");
-					this.undoRedo.redo();
-					tinyMCE.triggerNodeChange();
-				} else
-					this.getDoc().execCommand(command, user_interface, value);
-				break;
-
-			case "mceToggleVisualAid":
-				this.visualAid = !this.visualAid;
-				tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);
-				tinyMCE.triggerNodeChange();
-				break;
-
-			case "Indent":
-				this.getDoc().execCommand(command, user_interface, value);
-				tinyMCE.triggerNodeChange();
-
-				if (tinyMCE.isIE) {
-					var n = tinyMCE.getParentElement(this.getFocusElement(), "blockquote");
-					do {
-						if (n && n.nodeName == "BLOCKQUOTE") {
-							n.removeAttribute("dir");
-							n.removeAttribute("style");
-						}
-					} while (n != null && (n = n.parentNode) != null);
-				}
-				break;
-
-			case "RemoveFormat":
-			case "removeformat":
-				var text = this.selection.getSelectedText();
-
-				if (tinyMCE.isOpera) {
-					this.getDoc().execCommand("RemoveFormat", false, null);
-					return;
-				}
-
-				if (tinyMCE.isIE) {
-					try {
-						var rng = doc.selection.createRange();
-						rng.execCommand("RemoveFormat", false, null);
-					} catch (e) {
-						// Do nothing
-					}
-
-					this.execCommand("mceSetStyleInfo", false, {command : "removeformat"});
-				} else {
-					this.getDoc().execCommand(command, user_interface, value);
-
-					this.execCommand("mceSetStyleInfo", false, {command : "removeformat"});
-				}
-
-				// Remove class
-				if (text.length == 0)
-					this.execCommand("mceSetCSSClass", false, "");
-
-				tinyMCE.triggerNodeChange();
-				break;
-
-			default:
-				this.getDoc().execCommand(command, user_interface, value);
-
-				if (tinyMCE.isGecko)
-					window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);
-				else
-					tinyMCE.triggerNodeChange();
-		}
-
-		// Add undo level after modification
-		if (command != "mceAddUndoLevel" && command != "Undo" && command != "Redo" && command != "mceStartTyping" && command != "mceEndTyping")
-			tinyMCE.execCommand("mceAddUndoLevel");
-	},
-
-	queryCommandValue : function(c) {
-		try {
-			return this.getDoc().queryCommandValue(c);
-		} catch (e) {
-			return null;
-		}
-	},
-
-	queryCommandState : function(c) {
-		return this.getDoc().queryCommandState(c);
-	},
-
-	_onAdd : function(replace_element, form_element_name, target_document) {
-		var hc, th, to, editorTemplate;
-
-		th = this.settings['theme'];
-		to = tinyMCE.themes[th];
-
-		var targetDoc = target_document ? target_document : document;
-
-		this.targetDoc = targetDoc;
-
-		tinyMCE.themeURL = tinyMCE.baseURL + "/themes/" + this.settings['theme'];
-		this.settings['themeurl'] = tinyMCE.themeURL;
-
-		if (!replace_element) {
-			alert("Error: Could not find the target element.");
-			return false;
-		}
-
-		if (to.getEditorTemplate)
-			editorTemplate = to.getEditorTemplate(this.settings, this.editorId);
-
-		var deltaWidth = editorTemplate['delta_width'] ? editorTemplate['delta_width'] : 0;
-		var deltaHeight = editorTemplate['delta_height'] ? editorTemplate['delta_height'] : 0;
-		var html = '<span id="' + this.editorId + '_parent" class="mceEditorContainer">' + editorTemplate['html'];
-
-		html = tinyMCE.replaceVar(html, "editor_id", this.editorId);
-		this.settings['default_document'] = tinyMCE.baseURL + "/blank.htm";
-
-		this.settings['old_width'] = this.settings['width'];
-		this.settings['old_height'] = this.settings['height'];
-
-		// Set default width, height
-		if (this.settings['width'] == -1)
-			this.settings['width'] = replace_element.offsetWidth;
-
-		if (this.settings['height'] == -1)
-			this.settings['height'] = replace_element.offsetHeight;
-
-		// Try the style width
-		if (this.settings['width'] == 0)
-			this.settings['width'] = replace_element.style.width;
-
-		// Try the style height
-		if (this.settings['height'] == 0)
-			this.settings['height'] = replace_element.style.height; 
-
-		// If no width/height then default to 320x240, better than nothing
-		if (this.settings['width'] == 0)
-			this.settings['width'] = 320;
-
-		if (this.settings['height'] == 0)
-			this.settings['height'] = 240;
-
-		this.settings['area_width'] = parseInt(this.settings['width']);
-		this.settings['area_height'] = parseInt(this.settings['height']);
-		this.settings['area_width'] += deltaWidth;
-		this.settings['area_height'] += deltaHeight;
-
-		this.settings['width_style'] = "" + this.settings['width'];
-		this.settings['height_style'] = "" + this.settings['height'];
-
-		// Special % handling
-		if (("" + this.settings['width']).indexOf('%') != -1)
-			this.settings['area_width'] = "100%";
-		else
-			this.settings['width_style'] += 'px';
-
-		if (("" + this.settings['height']).indexOf('%') != -1)
-			this.settings['area_height'] = "100%";
-		else
-			this.settings['height_style'] += 'px';
-
-		if (("" + replace_element.style.width).indexOf('%') != -1) {
-			this.settings['width'] = replace_element.style.width;
-			this.settings['area_width'] = "100%";
-			this.settings['width_style'] = "100%";
-		}
-
-		if (("" + replace_element.style.height).indexOf('%') != -1) {
-			this.settings['height'] = replace_element.style.height;
-			this.settings['area_height'] = "100%";
-			this.settings['height_style'] = "100%";
-		}
-
-		html = tinyMCE.applyTemplate(html);
-
-		this.settings['width'] = this.settings['old_width'];
-		this.settings['height'] = this.settings['old_height'];
-
-		this.visualAid = this.settings['visual'];
-		this.formTargetElementId = form_element_name;
-
-		// Get replace_element contents
-		if (replace_element.nodeName == "TEXTAREA" || replace_element.nodeName == "INPUT")
-			this.startContent = replace_element.value;
-		else
-			this.startContent = replace_element.innerHTML;
-
-		// If not text area or input
-		if (replace_element.nodeName != "TEXTAREA" && replace_element.nodeName != "INPUT") {
-			this.oldTargetElement = replace_element;
-
-			// Debug mode
-			if (tinyMCE.settings['debug']) {
-				hc = '<textarea wrap="off" id="' + form_element_name + '" name="' + form_element_name + '" cols="100" rows="15"></textarea>';
-			} else {
-				hc = '<input type="hidden" id="' + form_element_name + '" name="' + form_element_name + '" />';
-				this.oldTargetDisplay = tinyMCE.getStyle(this.oldTargetElement, 'display', 'inline');
-				this.oldTargetElement.style.display = "none";
-			}
-
-			html += '</span>';
-
-			if (tinyMCE.isGecko)
-				html = hc + html;
-			else
-				html += hc;
-
-			// Output HTML and set editable
-			if (tinyMCE.isGecko) {
-				var rng = replace_element.ownerDocument.createRange();
-				rng.setStartBefore(replace_element);
-
-				var fragment = rng.createContextualFragment(html);
-				tinyMCE.insertAfter(fragment, replace_element);
-			} else
-				replace_element.insertAdjacentHTML("beforeBegin", html);
-		} else {
-			html += '</span>';
-
-			// Just hide the textarea element
-			this.oldTargetElement = replace_element;
-
-			if (!tinyMCE.settings['debug']) {
-				this.oldTargetDisplay = tinyMCE.getStyle(this.oldTargetElement, 'display', 'inline');
-				this.oldTargetElement.style.display = "none";
-			}
-
-			// Output HTML and set editable
-			if (tinyMCE.isGecko) {
-				var rng = replace_element.ownerDocument.createRange();
-				rng.setStartBefore(replace_element);
-
-				var fragment = rng.createContextualFragment(html);
-				tinyMCE.insertAfter(fragment, replace_element);
-			} else
-				replace_element.insertAdjacentHTML("beforeBegin", html);
-		}
-
-		// Setup iframe
-		var dynamicIFrame = false;
-		var tElm = targetDoc.getElementById(this.editorId);
-
-		if (!tinyMCE.isIE) {
-			// Node case is preserved in XML strict mode
-			if (tElm && (tElm.nodeName == "SPAN" || tElm.nodeName == "span")) {
-				tElm = tinyMCE._createIFrame(tElm, targetDoc);
-				dynamicIFrame = true;
-			}
-
-			this.targetElement = tElm;
-			this.iframeElement = tElm;
-			this.contentDocument = tElm.contentDocument;
-			this.contentWindow = tElm.contentWindow;
-
-			//this.getDoc().designMode = "on";
-		} else {
-			if (tElm && tElm.nodeName == "SPAN")
-				tElm = tinyMCE._createIFrame(tElm, targetDoc, targetDoc.parentWindow);
-			else
-				tElm = targetDoc.frames[this.editorId];
-
-			this.targetElement = tElm;
-			this.iframeElement = targetDoc.getElementById(this.editorId);
-
-			if (tinyMCE.isOpera) {
-				this.contentDocument = this.iframeElement.contentDocument;
-				this.contentWindow = this.iframeElement.contentWindow;
-				dynamicIFrame = true;
-			} else {
-				this.contentDocument = tElm.window.document;
-				this.contentWindow = tElm.window;
-			}
-
-			this.getDoc().designMode = "on";
-		}
-
-		// Setup base HTML
-		var doc = this.contentDocument;
-		if (dynamicIFrame) {
-			var html = tinyMCE.getParam('doctype') + '<html><head xmlns="http://www.w3.org/1999/xhtml"><base href="' + tinyMCE.settings['base_href'] + '" /><title>blank_page</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body class="mceContentBody"></body></html>';
-
-			try {
-				if (!this.isHidden())
-					this.getDoc().designMode = "on";
-
-				doc.open();
-				doc.write(html);
-				doc.close();
-			} catch (e) {
-				// Failed Mozilla 1.3
-				this.getDoc().location.href = tinyMCE.baseURL + "/blank.htm";
-			}
-		}
-
-		// This timeout is needed in MSIE 5.5 for some odd reason
-		// it seems that the document.frames isn't initialized yet?
-		if (tinyMCE.isIE)
-			window.setTimeout("tinyMCE.addEventHandlers(tinyMCE.instances[\"" + this.editorId + "\"]);", 1);
-
-		// Setup element references
-		var parentElm = this.targetDoc.getElementById(this.editorId + '_parent');
-		this.formElement = tinyMCE.isGecko ? parentElm.previousSibling : parentElm.nextSibling;
-
-		tinyMCE.setupContent(this.editorId, true);
-
-		return true;
-	},
-
-	setBaseHREF : function(u) {
-		var h, b, d, nl;
-
-		d = this.getDoc();
-		nl = d.getElementsByTagName("base");
-		b = nl.length > 0 ? nl[0] : null;
-
-		if (!b) {
-			nl = d.getElementsByTagName("head");
-			h = nl.length > 0 ? nl[0] : null;
-
-			b = d.createElement("base");
-			b.setAttribute('href', u);
-			h.appendChild(b);
-		} else {
-			if (u == "" || u == null)
-				b.parentNode.removeChild(b);
-			else
-				b.setAttribute('href', u);
-		}
-	},
-
-	getHTML : function(r) {
-		var h, d = this.getDoc(), b = this.getBody();
-
-		if (r)
-			return b.innerHTML;
-
-		h = tinyMCE._cleanupHTML(this, d, this.settings, b, false, true, false, true);
-
-		if (tinyMCE.getParam("convert_fonts_to_spans"))
-			tinyMCE.convertSpansToFonts(d);
-
-		return h;
-	},
-
-	setHTML : function(h) {
-		this.execCommand('mceSetContent', false, h);
-		this.repaint();
-	},
-
-	getFocusElement : function() {
-		return this.selection.getFocusElement();
-	},
-
-	getSel : function() {
-		return this.selection.getSel();
-	},
-
-	getRng : function() {
-		return this.selection.getRng();
-	},
-
-	triggerSave : function(skip_cleanup, skip_callback) {
-		var e, nl = [], i, s;
-
-		this.switchSettings();
-		s = tinyMCE.settings;
-
-		// Force hidden tabs visible while serializing
-		if (tinyMCE.isRealIE) {
-			e = this.iframeElement;
-
-			do {
-				if (e.style && e.style.display == 'none') {
-					e.style.display = 'block';
-					nl[nl.length] = {elm : e, type : 'style'};
-				}
-
-				if (e.style && s.hidden_tab_class.length > 0 && e.className.indexOf(s.hidden_tab_class) != -1) {
-					e.className = s.display_tab_class;
-					nl[nl.length] = {elm : e, type : 'class'};
-				}
-			} while ((e = e.parentNode) != null)
-		}
-
-		tinyMCE.settings['preformatted'] = false;
-
-		// Default to false
-		if (typeof(skip_cleanup) == "undefined")
-			skip_cleanup = false;
-
-		// Default to false
-		if (typeof(skip_callback) == "undefined")
-			skip_callback = false;
-
-		tinyMCE._setHTML(this.getDoc(), this.getBody().innerHTML);
-
-		// Remove visual aids when cleanup is disabled
-		if (this.settings['cleanup'] == false) {
-			tinyMCE.handleVisualAid(this.getBody(), true, false, this);
-			tinyMCE._setEventsEnabled(this.getBody(), true);
-		}
-
-		tinyMCE._customCleanup(this, "submit_content_dom", this.contentWindow.document.body);
-		var htm = skip_cleanup ? this.getBody().innerHTML : tinyMCE._cleanupHTML(this, this.getDoc(), this.settings, this.getBody(), tinyMCE.visualAid, true, true);
-		htm = tinyMCE._customCleanup(this, "submit_content", htm);
-
-		if (!skip_callback && tinyMCE.settings['save_callback'] != "")
-			var content = eval(tinyMCE.settings['save_callback'] + "(this.formTargetElementId,htm,this.getBody());");
-
-		// Use callback content if available
-		if ((typeof(content) != "undefined") && content != null)
-			htm = content;
-
-		// Replace some weird entities (Bug: #1056343)
-		htm = tinyMCE.regexpReplace(htm, "&#40;", "(", "gi");
-		htm = tinyMCE.regexpReplace(htm, "&#41;", ")", "gi");
-		htm = tinyMCE.regexpReplace(htm, "&#59;", ";", "gi");
-		htm = tinyMCE.regexpReplace(htm, "&#34;", "&quot;", "gi");
-		htm = tinyMCE.regexpReplace(htm, "&#94;", "^", "gi");
-
-		if (this.formElement)
-			this.formElement.value = htm;
-
-		if (tinyMCE.isSafari && this.formElement)
-			this.formElement.innerText = htm;
-
-		// Hide them again (tabs in MSIE)
-		for (i=0; i<nl.length; i++) {
-			if (nl[i].type == 'style')
-				nl[i].elm.style.display = 'none';
-			else
-				nl[i].elm.className = s.hidden_tab_class;
-		}
-	}
-
-	};
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_Cleanup.class.js */
-
-TinyMCE_Engine.prototype.cleanupHTMLCode = function(s) {
-	s = s.replace(new RegExp('<p \\/>', 'gi'), '<p>&nbsp;</p>');
-	s = s.replace(new RegExp('<p>\\s*<\\/p>', 'gi'), '<p>&nbsp;</p>');
-
-	// Fix close BR elements
-	s = s.replace(new RegExp('<br>\\s*<\\/br>', 'gi'), '<br />');
-
-	// Open closed tags like <b/> to <b></b>
-	s = s.replace(new RegExp('<(h[1-6]|p|div|address|pre|form|table|li|ol|ul|td|b|font|em|strong|i|strike|u|span|a|ul|ol|li|blockquote)([a-z]*)([^\\\\|>]*)\\/>', 'gi'), '<$1$2$3></$1$2>');
-
-	// Remove trailing space <b > to <b>
-	s = s.replace(new RegExp('\\s+></', 'gi'), '></');
-
-	// Close tags <img></img> to <img/>
-	s = s.replace(new RegExp('<(img|br|hr)([^>]*)><\\/(img|br|hr)>', 'gi'), '<$1$2 />');
-
-	// Weird MSIE bug, <p><hr /></p> breaks runtime?
-	if (tinyMCE.isIE)
-		s = s.replace(new RegExp('<p><hr \\/><\\/p>', 'gi'), "<hr>");
-
-	// Weird tags will make IE error #bug: 1538495
-	if (tinyMCE.isIE)
-		s = s.replace(/<!(\s*)\/>/g, '');
-
-	// Convert relative anchors to absolute URLs ex: #something to file.htm#something
-	// Removed: Since local document anchors should never be forced absolute example edit.php?id=something
-	//if (tinyMCE.getParam('convert_urls'))
-	//	s = s.replace(new RegExp('(href=\"{0,1})(\\s*#)', 'gi'), '$1' + tinyMCE.settings['document_base_url'] + "#");
-
-	return s;
-};
-
-TinyMCE_Engine.prototype.parseStyle = function(str) {
-	var ar = new Array();
-
-	if (str == null)
-		return ar;
-
-	var st = str.split(';');
-
-	tinyMCE.clearArray(ar);
-
-	for (var i=0; i<st.length; i++) {
-		if (st[i] == '')
-			continue;
-
-		var re = new RegExp('^\\s*([^:]*):\\s*(.*)\\s*$');
-		var pa = st[i].replace(re, '$1||$2').split('||');
-//tinyMCE.debug(str, pa[0] + "=" + pa[1], st[i].replace(re, '$1||$2'));
-		if (pa.length == 2)
-			ar[pa[0].toLowerCase()] = pa[1];
-	}
-
-	return ar;
-};
-
-TinyMCE_Engine.prototype.compressStyle = function(ar, pr, sf, res) {
-	var box = new Array();
-
-	box[0] = ar[pr + '-top' + sf];
-	box[1] = ar[pr + '-left' + sf];
-	box[2] = ar[pr + '-right' + sf];
-	box[3] = ar[pr + '-bottom' + sf];
-
-	for (var i=0; i<box.length; i++) {
-		if (box[i] == null)
-			return;
-
-		for (var a=0; a<box.length; a++) {
-			if (box[a] != box[i])
-				return;
-		}
-	}
-
-	// They are all the same
-	ar[res] = box[0];
-	ar[pr + '-top' + sf] = null;
-	ar[pr + '-left' + sf] = null;
-	ar[pr + '-right' + sf] = null;
-	ar[pr + '-bottom' + sf] = null;
-};
-
-TinyMCE_Engine.prototype.serializeStyle = function(ar) {
-	var str = "";
-
-	// Compress box
-	tinyMCE.compressStyle(ar, "border", "", "border");
-	tinyMCE.compressStyle(ar, "border", "-width", "border-width");
-	tinyMCE.compressStyle(ar, "border", "-color", "border-color");
-	tinyMCE.compressStyle(ar, "border", "-style", "border-style");
-	tinyMCE.compressStyle(ar, "padding", "", "padding");
-	tinyMCE.compressStyle(ar, "margin", "", "margin");
-
-	for (var key in ar) {
-		var val = ar[key];
-
-		if (typeof(val) == 'function')
-			continue;
-
-		if (key.indexOf('mso-') == 0)
-			continue;
-
-		if (val != null && val != '') {
-			val = '' + val; // Force string
-
-			// Fix style URL
-			val = val.replace(new RegExp("url\\(\\'?([^\\']*)\\'?\\)", 'gi'), "url('$1')");
-
-			// Convert URL
-			if (val.indexOf('url(') != -1 && tinyMCE.getParam('convert_urls')) {
-				var m = new RegExp("url\\('(.*?)'\\)").exec(val);
-
-				if (m.length > 1)
-					val = "url('" + eval(tinyMCE.getParam('urlconverter_callback') + "(m[1], null, true);") + "')";
-			}
-
-			// Force HEX colors
-			if (tinyMCE.getParam("force_hex_style_colors"))
-				val = tinyMCE.convertRGBToHex(val, true);
-
-			val = val.replace(/\"/g, '\'');
-
-			if (val != "url('')")
-				str += key.toLowerCase() + ": " + val + "; ";
-		}
-	}
-
-	if (new RegExp('; $').test(str))
-		str = str.substring(0, str.length - 2);
-
-	return str;
-};
-
-TinyMCE_Engine.prototype.convertRGBToHex = function(s, k) {
-	if (s.toLowerCase().indexOf('rgb') != -1) {
-		var re = new RegExp("(.*?)rgb\\s*?\\(\\s*?([0-9]+).*?,\\s*?([0-9]+).*?,\\s*?([0-9]+).*?\\)(.*?)", "gi");
-		var rgb = s.replace(re, "$1,$2,$3,$4,$5").split(',');
-		if (rgb.length == 5) {
-			r = parseInt(rgb[1]).toString(16);
-			g = parseInt(rgb[2]).toString(16);
-			b = parseInt(rgb[3]).toString(16);
-
-			r = r.length == 1 ? '0' + r : r;
-			g = g.length == 1 ? '0' + g : g;
-			b = b.length == 1 ? '0' + b : b;
-
-			s = "#" + r + g + b;
-
-			if (k)
-				s = rgb[0] + s + rgb[4];
-		}
-	}
-
-	return s;
-};
-
-TinyMCE_Engine.prototype.convertHexToRGB = function(s) {
-	if (s.indexOf('#') != -1) {
-		s = s.replace(new RegExp('[^0-9A-F]', 'gi'), '');
-		return "rgb(" + parseInt(s.substring(0, 2), 16) + "," + parseInt(s.substring(2, 4), 16) + "," + parseInt(s.substring(4, 6), 16) + ")";
-	}
-
-	return s;
-};
-
-TinyMCE_Engine.prototype.convertSpansToFonts = function(doc) {
-	var sizes = tinyMCE.getParam('font_size_style_values').replace(/\s+/, '').split(',');
-
-	/*var h = doc.body.innerHTML;
-	h = h.replace(/<span/gi, '<font');
-	h = h.replace(/<\/span/gi, '</font');
-	tinyMCE.setInnerHTML(doc.body, h);*/
-
-	var s = tinyMCE.selectElements(doc, 'span,font');
-	for (var i=0; i<s.length; i++) {
-		var size = tinyMCE.trim(s[i].style.fontSize).toLowerCase();
-		var fSize = 0;
-
-		for (var x=0; x<sizes.length; x++) {
-			if (sizes[x] == size) {
-				fSize = x + 1;
-				break;
-			}
-		}
-
-		if (fSize > 0) {
-			tinyMCE.setAttrib(s[i], 'size', fSize);
-			s[i].style.fontSize = '';
-		}
-
-		var fFace = s[i].style.fontFamily;
-		if (fFace != null && fFace != "") {
-			tinyMCE.setAttrib(s[i], 'face', fFace);
-			s[i].style.fontFamily = '';
-		}
-
-		var fColor = s[i].style.color;
-		if (fColor != null && fColor != "") {
-			tinyMCE.setAttrib(s[i], 'color', tinyMCE.convertRGBToHex(fColor));
-			s[i].style.color = '';
-		}
-	}
-};
-
-TinyMCE_Engine.prototype.convertFontsToSpans = function(doc) {
-	var sizes = tinyMCE.getParam('font_size_style_values').replace(/\s+/, '').split(',');
-
-/*	var h = doc.body.innerHTML;
-	h = h.replace(/<font/gi, '<span');
-	h = h.replace(/<\/font/gi, '</span');
-	tinyMCE.setInnerHTML(doc.body, h);*/
-
-	var fsClasses = tinyMCE.getParam('font_size_classes');
-	if (fsClasses != '')
-		fsClasses = fsClasses.replace(/\s+/, '').split(',');
-	else
-		fsClasses = null;
-
-	var s = tinyMCE.selectElements(doc, 'span,font');
-	for (var i=0; i<s.length; i++) {
-		var fSize, fFace, fColor;
-
-		fSize = tinyMCE.getAttrib(s[i], 'size');
-		fFace = tinyMCE.getAttrib(s[i], 'face');
-		fColor = tinyMCE.getAttrib(s[i], 'color');
-
-		if (fSize != "") {
-			fSize = parseInt(fSize);
-
-			if (fSize > 0 && fSize < 8) {
-				if (fsClasses != null)
-					tinyMCE.setAttrib(s[i], 'class', fsClasses[fSize-1]);
-				else
-					s[i].style.fontSize = sizes[fSize-1];
-			}
-
-			s[i].removeAttribute('size');
-		}
-
-		if (fFace != "") {
-			s[i].style.fontFamily = fFace;
-			s[i].removeAttribute('face');
-		}
-
-		if (fColor != "") {
-			s[i].style.color = fColor;
-			s[i].removeAttribute('color');
-		}
-	}
-};
-
-TinyMCE_Engine.prototype.cleanupAnchors = function(doc) {
-	var i, cn, x, an = doc.getElementsByTagName("a");
-
-	// Loops backwards due to bug #1467987
-	for (i=an.length-1; i>=0; i--) {
-		if (tinyMCE.getAttrib(an[i], "name") != "" && tinyMCE.getAttrib(an[i], "href") == "") {
-			cn = an[i].childNodes;
-
-			for (x=cn.length-1; x>=0; x--)
-				tinyMCE.insertAfter(cn[x], an[i]);
-		}
-	}
-};
-
-TinyMCE_Engine.prototype.getContent = function(editor_id) {
-	if (typeof(editor_id) != "undefined")
-		 tinyMCE.getInstanceById(editor_id).select();
-
-	if (tinyMCE.selectedInstance)
-		return tinyMCE.selectedInstance.getHTML();
-
-	return null;
-};
-
-TinyMCE_Engine.prototype._fixListElements = function(d) {
-	var nl, x, a = ['ol', 'ul'], i, n, p, r = new RegExp('^(OL|UL)$'), np;
-
-	for (x=0; x<a.length; x++) {
-		nl = d.getElementsByTagName(a[x]);
-
-		for (i=0; i<nl.length; i++) {
-			n = nl[i];
-			p = n.parentNode;
-
-			if (r.test(p.nodeName)) {
-				np = tinyMCE.prevNode(n, 'LI');
-
-				if (!np) {
-					np = d.createElement('li');
-					np.innerHTML = '&nbsp;';
-					np.appendChild(n);
-					p.insertBefore(np, p.firstChild);
-				} else
-					np.appendChild(n);
-			}
-		}
-	}
-};
-
-TinyMCE_Engine.prototype._fixTables = function(d) {
-	var nl, i, n, p, np, x, t;
-
-	nl = d.getElementsByTagName('table');
-	for (i=0; i<nl.length; i++) {
-		n = nl[i];
-
-		if ((p = tinyMCE.getParentElement(n, 'p,h1,h2,h3,h4,h5,h6')) != null) {
-			np = p.cloneNode(false);
-			np.removeAttribute('id');
-
-			t = n;
-
-			while ((n = n.nextSibling))
-				np.appendChild(n);
-
-			tinyMCE.insertAfter(np, p);
-			tinyMCE.insertAfter(t, p);
-		}
-	}
-};
-
-TinyMCE_Engine.prototype._cleanupHTML = function(inst, doc, config, elm, visual, on_save, on_submit, inn) {
-	var h, d, t1, t2, t3, t4, t5, c, s, nb;
-
-	if (!tinyMCE.getParam('cleanup'))
-		return elm.innerHTML;
-
-	on_save = typeof(on_save) == 'undefined' ? false : on_save;
-
-	c = inst.cleanup;
-	s = inst.settings;
-	d = c.settings.debug;
-
-	if (d)
-		t1 = new Date().getTime();
-
-	if (tinyMCE.getParam("convert_fonts_to_spans"))
-		tinyMCE.convertFontsToSpans(doc);
-
-	if (tinyMCE.getParam("fix_list_elements"))
-		tinyMCE._fixListElements(doc);
-
-	if (tinyMCE.getParam("fix_table_elements"))
-		tinyMCE._fixTables(doc);
-
-	// Call custom cleanup code
-	tinyMCE._customCleanup(inst, on_save ? "get_from_editor_dom" : "insert_to_editor_dom", doc.body);
-
-	if (d)
-		t2 = new Date().getTime();
-
-	c.settings.on_save = on_save;
-	//for (var i=0; i<100; i++)
-
-	c.idCount = 0;
-	c.serializationId++;
-	c.serializedNodes = new Array();
-	c.sourceIndex = -1;
-
-	if (s.cleanup_serializer == "xml")
-		h = c.serializeNodeAsXML(elm, inn);
-	else
-		h = c.serializeNodeAsHTML(elm, inn);
-
-	if (d)
-		t3 = new Date().getTime();
-
-	// Post processing
-	nb = tinyMCE.getParam('entity_encoding') == 'numeric' ? '&#160;' : '&nbsp;';
-	h = h.replace(/<\/?(body|head|html)[^>]*>/gi, '');
-	h = h.replace(new RegExp(' (rowspan="1"|colspan="1")', 'g'), '');
-	h = h.replace(/<p><hr \/><\/p>/g, '<hr />');
-	h = h.replace(/<p>(&nbsp;|&#160;)<\/p><hr \/><p>(&nbsp;|&#160;)<\/p>/g, '<hr />');
-	h = h.replace(/<td>\s*<br \/>\s*<\/td>/g, '<td>' + nb + '</td>');
-	h = h.replace(/<p>\s*<br \/>\s*<\/p>/g, '<p>' + nb + '</p>');
-	h = h.replace(/<br \/>$/, ''); // Remove last BR for Gecko
-	h = h.replace(/<br \/><\/p>/g, '</p>'); // Remove last BR in P tags for Gecko
-	h = h.replace(/<p>\s*(&nbsp;|&#160;)\s*<br \/>\s*(&nbsp;|&#160;)\s*<\/p>/g, '<p>' + nb + '</p>');
-	h = h.replace(/<p>\s*(&nbsp;|&#160;)\s*<br \/>\s*<\/p>/g, '<p>' + nb + '</p>');
-	h = h.replace(/<p>\s*<br \/>\s*&nbsp;\s*<\/p>/g, '<p>' + nb + '</p>');
-	h = h.replace(new RegExp('<a>(.*?)<\\/a>', 'g'), '$1');
-	h = h.replace(/<p([^>]*)>\s*<\/p>/g, '<p$1>' + nb + '</p>');
-
-	// Clean body
-	if (/^\s*(<br \/>|<p>&nbsp;<\/p>|<p>&#160;<\/p>|<p><\/p>)\s*$/.test(h))
-		h = '';
-
-	// If preformatted
-	if (s.preformatted) {
-		h = h.replace(/^<pre>/, '');
-		h = h.replace(/<\/pre>$/, '');
-		h = '<pre>' + h + '</pre>';
-	}
-
-	// Gecko specific processing
-	if (tinyMCE.isGecko) {
-		h = h.replace(/<o:p _moz-userdefined="" \/>/g, '');
-		h = h.replace(/<td([^>]*)>\s*<br \/>\s*<\/td>/g, '<td$1>' + nb + '</td>');
-	}
-
-	if (s.force_br_newlines)
-		h = h.replace(/<p>(&nbsp;|&#160;)<\/p>/g, '<br />');
-
-	// Call custom cleanup code
-	h = tinyMCE._customCleanup(inst, on_save ? "get_from_editor" : "insert_to_editor", h);
-
-	// Remove internal classes
-	if (on_save) {
-		h = h.replace(new RegExp(' ?(mceItem[a-zA-Z0-9]*|' + s.visual_table_class + ')', 'g'), '');
-		h = h.replace(new RegExp(' ?class=""', 'g'), '');
-	}
-
-	if (s.remove_linebreaks && !c.settings.indent)
-		h = h.replace(/\n|\r/g, ' ');
-
-	if (d)
-		t4 = new Date().getTime();
-
-	if (on_save && c.settings.indent)
-		h = c.formatHTML(h);
-
-	// If encoding (not recommended option)
-	if (on_submit && (s.encoding == "xml" || s.encoding == "html"))
-		h = c.xmlEncode(h);
-
-	if (d)
-		t5 = new Date().getTime();
-
-	if (c.settings.debug)
-		tinyMCE.debug("Cleanup in ms: Pre=" + (t2-t1) + ", Serialize: " + (t3-t2) + ", Post: " + (t4-t3) + ", Format: " + (t5-t4) + ", Sum: " + (t5-t1) + ".");
-
-	return h;
-};
-
-function TinyMCE_Cleanup() {
-	this.isIE = (navigator.appName == "Microsoft Internet Explorer");
-	this.rules = tinyMCE.clearArray(new Array());
-
-	// Default config
-	this.settings = {
-		indent_elements : 'head,table,tbody,thead,tfoot,form,tr,ul,ol,blockquote,object',
-		newline_before_elements : 'h1,h2,h3,h4,h5,h6,pre,address,div,ul,ol,li,meta,option,area,title,link,base,script,td',
-		newline_after_elements : 'br,hr,p,pre,address,div,ul,ol,meta,option,area,link,base,script',
-		newline_before_after_elements : 'html,head,body,table,thead,tbody,tfoot,tr,form,ul,ol,blockquote,p,object,param,hr,div',
-		indent_char : '\t',
-		indent_levels : 1,
-		entity_encoding : 'raw',
-		valid_elements : '*[*]',
-		entities : '',
-		url_converter : '',
-		invalid_elements : '',
-		verify_html : false
-	};
-
-	this.vElements = tinyMCE.clearArray(new Array());
-	this.vElementsRe = '';
-	this.closeElementsRe = /^(IMG|BR|HR|LINK|META|BASE|INPUT|AREA)$/;
-	this.codeElementsRe = /^(SCRIPT|STYLE)$/;
-	this.serializationId = 0;
-	this.mceAttribs = {
-		href : 'mce_href',
-		src : 'mce_src',
-		type : 'mce_type'
-	};
-}
-
-TinyMCE_Cleanup.prototype = {
-	init : function(s) {
-		var n, a, i, ir, or, st;
-
-		for (n in s)
-			this.settings[n] = s[n];
-
-		// Setup code formating
-		s = this.settings;
-
-		// Setup regexps
-		this.inRe = this._arrayToRe(s.indent_elements.split(','), '', '^<(', ')[^>]*');
-		this.ouRe = this._arrayToRe(s.indent_elements.split(','), '', '^<\\/(', ')[^>]*');
-		this.nlBeforeRe = this._arrayToRe(s.newline_before_elements.split(','), 'gi', '<(',  ')([^>]*)>');
-		this.nlAfterRe = this._arrayToRe(s.newline_after_elements.split(','), 'gi', '<(',  ')([^>]*)>');
-		this.nlBeforeAfterRe = this._arrayToRe(s.newline_before_after_elements.split(','), 'gi', '<(\\/?)(', ')([^>]*)>');
-		this.serializedNodes = [];
-
-		if (s.invalid_elements != '')
-			this.iveRe = this._arrayToRe(s.invalid_elements.toUpperCase().split(','), 'g', '^(', ')$');
-		else
-			this.iveRe = null;
-
-		// Setup separator
-		st = '';
-		for (i=0; i<s.indent_levels; i++)
-			st += s.indent_char;
-
-		this.inStr = st;
-
-		// If verify_html if false force *[*]
-		if (!s.verify_html) {
-			s.valid_elements = '*[*]';
-			s.extended_valid_elements = '';
-		}
-
-		this.fillStr = s.entity_encoding == "named" ? "&nbsp;" : "&#160;";
-		this.idCount = 0;
-		this.xmlEncodeRe = new RegExp('[\u007F-\uFFFF<>&"]', 'g');
-		this.xmlEncodeAposRe = new RegExp('[\u007F-\uFFFF<>&"\']', 'g');
-	},
-
-	addRuleStr : function(s) {
-		var r = this.parseRuleStr(s);
-		var n;
-
-		for (n in r) {
-			if (r[n])
-				this.rules[n] = r[n];
-		}
-
-		this.vElements = tinyMCE.clearArray(new Array());
-
-		for (n in this.rules) {
-			if (this.rules[n])
-				this.vElements[this.vElements.length] = this.rules[n].tag;
-		}
-
-		this.vElementsRe = this._arrayToRe(this.vElements, '');
-	},
-
-	isValid : function(n) {
-		this._setupRules(); // Will initialize cleanup rules
-
-		// Empty is true since it removes formatting
-		if (!n)
-			return true;
-
-		// Clean the name up a bit
-		n = n.replace(/[^a-z0-9]+/gi, '').toUpperCase();
-
-		return !tinyMCE.getParam('cleanup') || this.vElementsRe.test(n);
-	},
-
-	addChildRemoveRuleStr : function(s) {
-		var x, y, p, i, t, tn, ta, cl, r;
-
-		if (!s)
-			return;
-
-		ta = s.split(',');
-		for (x=0; x<ta.length; x++) {
-			s = ta[x];
-
-			// Split tag/children
-			p = this.split(/\[|\]/, s);
-			if (p == null || p.length < 1)
-				t = s.toUpperCase();
-			else
-				t = p[0].toUpperCase();
-
-			// Handle all tag names
-			tn = this.split('/', t);
-			for (y=0; y<tn.length; y++) {
-				r = "^(";
-
-				// Build regex
-				cl = this.split(/\|/, p[1]);
-				for (i=0; i<cl.length; i++) {
-					if (cl[i] == '%istrict')
-						r += tinyMCE.inlineStrict;
-					else if (cl[i] == '%itrans')
-						r += tinyMCE.inlineTransitional;
-					else if (cl[i] == '%istrict_na')
-						r += tinyMCE.inlineStrict.substring(2);
-					else if (cl[i] == '%itrans_na')
-						r += tinyMCE.inlineTransitional.substring(2);
-					else if (cl[i] == '%btrans')
-						r += tinyMCE.blockElms;
-					else if (cl[i] == '%strict')
-						r += tinyMCE.blockStrict;
-					else
-						r += (cl[i].charAt(0) != '#' ? cl[i].toUpperCase() : cl[i]);
-
-					r += (i != cl.length - 1 ? '|' : '');
-				}
-
-				r += ')$';
-//tinyMCE.debug(t + "=" + r);
-				if (this.childRules == null)
-					this.childRules = tinyMCE.clearArray(new Array());
-
-				this.childRules[tn[y]] = new RegExp(r);
-
-				if (p.length > 1)
-					this.childRules[tn[y]].wrapTag = p[2];
-			}
-		}
-	},
-
-	parseRuleStr : function(s) {
-		var ta, p, r, a, i, x, px, t, tn, y, av, or = tinyMCE.clearArray(new Array()), dv;
-
-		if (s == null || s.length == 0)
-			return or;
-
-		ta = s.split(',');
-		for (x=0; x<ta.length; x++) {
-			s = ta[x];
-			if (s.length == 0)
-				continue;
-
-			// Split tag/attrs
-			p = this.split(/\[|\]/, s);
-			if (p == null || p.length < 1)
-				t = s.toUpperCase();
-			else
-				t = p[0].toUpperCase();
-
-			// Handle all tag names
-			tn = this.split('/', t);
-			for (y=0; y<tn.length; y++) {
-				r = {};
-
-				r.tag = tn[y];
-				r.forceAttribs = null;
-				r.defaultAttribs = null;
-				r.validAttribValues = null;
-
-				// Handle prefixes
-				px = r.tag.charAt(0);
-				r.forceOpen = px == '+';
-				r.removeEmpty = px == '-';
-				r.fill = px == '#';
-				r.tag = r.tag.replace(/\+|-|#/g, '');
-				r.oTagName = tn[0].replace(/\+|-|#/g, '').toLowerCase();
-				r.isWild = new RegExp('\\*|\\?|\\+', 'g').test(r.tag);
-				r.validRe = new RegExp(this._wildcardToRe('^' + r.tag + '$'));
-
-				// Setup valid attributes
-				if (p.length > 1) {
-					r.vAttribsRe = '^(';
-					a = this.split(/\|/, p[1]);
-
-					for (i=0; i<a.length; i++) {
-						t = a[i];
-
-						if (t.charAt(0) == '!') {
-							a[i] = t = t.substring(1);
-
-							if (!r.reqAttribsRe)
-								r.reqAttribsRe = '\\s+(' + t;
-							else
-								r.reqAttribsRe += '|' + t;
-						}
-
-						av = new RegExp('(=|:|<)(.*?)$').exec(t);
-						t = t.replace(new RegExp('(=|:|<).*?$'), '');
-						if (av && av.length > 0) {
-							if (av[0].charAt(0) == ':') {
-								if (!r.forceAttribs)
-									r.forceAttribs = tinyMCE.clearArray(new Array());
-
-								r.forceAttribs[t.toLowerCase()] = av[0].substring(1);
-							} else if (av[0].charAt(0) == '=') {
-								if (!r.defaultAttribs)
-									r.defaultAttribs = tinyMCE.clearArray(new Array());
-
-								dv = av[0].substring(1);
-
-								r.defaultAttribs[t.toLowerCase()] = dv == "" ? "mce_empty" : dv;
-							} else if (av[0].charAt(0) == '<') {
-								if (!r.validAttribValues)
-									r.validAttribValues = tinyMCE.clearArray(new Array());
-
-								r.validAttribValues[t.toLowerCase()] = this._arrayToRe(this.split('?', av[0].substring(1)), 'i');
-							}
-						}
-
-						r.vAttribsRe += '' + t.toLowerCase() + (i != a.length - 1 ? '|' : '');
-
-						a[i] = t.toLowerCase();
-					}
-
-					if (r.reqAttribsRe)
-						r.reqAttribsRe = new RegExp(r.reqAttribsRe + ')=\"', 'g');
-
-					r.vAttribsRe += ')$';
-					r.vAttribsRe = this._wildcardToRe(r.vAttribsRe);
-					r.vAttribsReIsWild = new RegExp('\\*|\\?|\\+', 'g').test(r.vAttribsRe);
-					r.vAttribsRe = new RegExp(r.vAttribsRe);
-					r.vAttribs = a.reverse();
-
-					//tinyMCE.debug(r.tag, r.oTagName, r.vAttribsRe, r.vAttribsReWC);
-				} else {
-					r.vAttribsRe = '';
-					r.vAttribs = tinyMCE.clearArray(new Array());
-					r.vAttribsReIsWild = false;
-				}
-
-				or[r.tag] = r;
-			}
-		}
-
-		return or;
-	},
-
-	serializeNodeAsXML : function(n) {
-		var s, b;
-
-		if (!this.xmlDoc) {
-			if (this.isIE) {
-				try {this.xmlDoc = new ActiveXObject('MSXML2.DOMDocument');} catch (e) {}
-
-				if (!this.xmlDoc)
-					try {this.xmlDoc = new ActiveXObject('Microsoft.XmlDom');} catch (e) {}
-			} else
-				this.xmlDoc = document.implementation.createDocument('', '', null);
-
-			if (!this.xmlDoc)
-				alert("Error XML Parser could not be found.");
-		}
-
-		if (this.xmlDoc.firstChild)
-			this.xmlDoc.removeChild(this.xmlDoc.firstChild);
-
-		b = this.xmlDoc.createElement("html");
-		b = this.xmlDoc.appendChild(b);
-
-		this._convertToXML(n, b);
-
-		if (this.isIE)
-			return this.xmlDoc.xml;
-		else
-			return new XMLSerializer().serializeToString(this.xmlDoc);
-	},
-
-	_convertToXML : function(n, xn) {
-		var xd, el, i, l, cn, at, no, hc = false;
-
-		if (tinyMCE.isRealIE && this._isDuplicate(n))
-			return;
-
-		xd = this.xmlDoc;
-
-		switch (n.nodeType) {
-			case 1: // Element
-				hc = n.hasChildNodes();
-
-				el = xd.createElement(n.nodeName.toLowerCase());
-
-				at = n.attributes;
-				for (i=at.length-1; i>-1; i--) {
-					no = at[i];
-
-					if (no.specified && no.nodeValue)
-						el.setAttribute(no.nodeName.toLowerCase(), no.nodeValue);
-				}
-
-				if (!hc && !this.closeElementsRe.test(n.nodeName))
-					el.appendChild(xd.createTextNode(""));
-
-				xn = xn.appendChild(el);
-				break;
-
-			case 3: // Text
-				xn.appendChild(xd.createTextNode(n.nodeValue));
-				return;
-
-			case 8: // Comment
-				xn.appendChild(xd.createComment(n.nodeValue));
-				return;
-		}
-
-		if (hc) {
-			cn = n.childNodes;
-
-			for (i=0, l=cn.length; i<l; i++)
-				this._convertToXML(cn[i], xn);
-		}
-	},
-
-	serializeNodeAsHTML : function(n, inn) {
-		var en, no, h = '', i, l, t, st, r, cn, va = false, f = false, at, hc, cr, nn;
-
-		this._setupRules(); // Will initialize cleanup rules
-
-		if (tinyMCE.isRealIE && this._isDuplicate(n))
-			return '';
-
-		// Skip non valid child elements
-		if (n.parentNode && this.childRules != null) {
-			cr = this.childRules[n.parentNode.nodeName];
-
-			if (typeof(cr) != "undefined" && !cr.test(n.nodeName)) {
-				st = true;
-				t = null;
-			}
-		}
-
-		switch (n.nodeType) {
-			case 1: // Element
-				hc = n.hasChildNodes();
-
-				if (st)
-					break;
-
-				// MSIE sometimes produces <//tag>
-				if ((tinyMCE.isRealIE) && n.nodeName.indexOf('/') != -1)
-					break;
-
-				nn = n.nodeName;
-
-				// Convert fonts to spans
-				if (this.settings.convert_fonts_to_spans) {
-					// On get content FONT -> SPAN
-					if (this.settings.on_save && nn == 'FONT')
-						nn = 'SPAN';
-
-					// On insert content SPAN -> FONT
-					if (!this.settings.on_save && nn == 'SPAN')
-						nn = 'FONT';
-				}
-
-				if (this.vElementsRe.test(nn) && (!this.iveRe || !this.iveRe.test(nn)) && !inn) {
-					va = true;
-
-					r = this.rules[nn];
-					if (!r) {
-						at = this.rules;
-						for (no in at) {
-							if (at[no] && at[no].validRe.test(nn)) {
-								r = at[no];
-								break;
-							}
-						}
-					}
-
-					en = r.isWild ? nn.toLowerCase() : r.oTagName;
-					f = r.fill;
-
-					if (r.removeEmpty && !hc)
-						return "";
-
-					t = '<' + en;
-
-					if (r.vAttribsReIsWild) {
-						// Serialize wildcard attributes
-						at = n.attributes;
-						for (i=at.length-1; i>-1; i--) {
-							no = at[i];
-							if (no.specified && r.vAttribsRe.test(no.nodeName))
-								t += this._serializeAttribute(n, r, no.nodeName);
-						}
-					} else {
-						// Serialize specific attributes
-						for (i=r.vAttribs.length-1; i>-1; i--)
-							t += this._serializeAttribute(n, r, r.vAttribs[i]);
-					}
-
-					// Serialize mce_ atts
-					if (!this.settings.on_save) {
-						at = this.mceAttribs;
-
-						for (no in at) {
-							if (at[no])
-								t += this._serializeAttribute(n, r, at[no]);
-						}
-					}
-
-					// Check for required attribs
-					if (r.reqAttribsRe && !t.match(r.reqAttribsRe))
-						t = null;
-
-					// Close these
-					if (t != null && this.closeElementsRe.test(nn))
-						return t + ' />';
-
-					if (t != null)
-						h += t + '>';
-
-					if (this.isIE && this.codeElementsRe.test(nn))
-						h += n.innerHTML;
-				}
-			break;
-
-			case 3: // Text
-				if (st)
-					break;
-
-				if (n.parentNode && this.codeElementsRe.test(n.parentNode.nodeName))
-					return this.isIE ? '' : n.nodeValue;
-
-				return this.xmlEncode(n.nodeValue);
-
-			case 8: // Comment
-				if (st)
-					break;
-
-				return "<!--" + this._trimComment(n.nodeValue) + "-->";
-		}
-
-		if (hc) {
-			cn = n.childNodes;
-
-			for (i=0, l=cn.length; i<l; i++)
-				h += this.serializeNodeAsHTML(cn[i]);
-		}
-
-		// Fill empty nodes
-		if (f && !hc)
-			h += this.fillStr;
-
-		// End element
-		if (t != null && va)
-			h += '</' + en + '>';
-
-		return h;
-	},
-
-	_serializeAttribute : function(n, r, an) {
-		var av = '', t, os = this.settings.on_save;
-
-		if (os && (an.indexOf('mce_') == 0 || an.indexOf('_moz') == 0))
-			return '';
-
-		if (os && this.mceAttribs[an])
-			av = this._getAttrib(n, this.mceAttribs[an]);
-
-		if (av.length == 0)
-			av = this._getAttrib(n, an);
-
-		if (av.length == 0 && r.defaultAttribs && (t = r.defaultAttribs[an])) {
-			av = t;
-
-			if (av == "mce_empty")
-				return " " + an + '=""';
-		}
-
-		if (r.forceAttribs && (t = r.forceAttribs[an]))
-			av = t;
-
-		if (os && av.length != 0 && /^(src|href|longdesc)$/.test(an))
-			av = this._urlConverter(this, n, av);
-
-		if (av.length != 0 && r.validAttribValues && r.validAttribValues[an] && !r.validAttribValues[an].test(av))
-			return "";
-
-		if (av.length != 0 && av == "{$uid}")
-			av = "uid_" + (this.idCount++);
-
-		if (av.length != 0) {
-			if (an.indexOf('on') != 0)
-				av = this.xmlEncode(av, 1);
-
-			return " " + an + "=" + '"' + av + '"';
-		}
-
-		return "";
-	},
-
-	formatHTML : function(h) {
-		var s = this.settings, p = '', i = 0, li = 0, o = '', l;
-
-		// Replace BR in pre elements to \n
-		h = h.replace(/<pre([^>]*)>(.*?)<\/pre>/gi, function (a, b, c) {
-			c = c.replace(/<br\s*\/>/gi, '\n');
-			return '<pre' + b + '>' + c + '</pre>';
-		});
-
-		h = h.replace(/\r/g, ''); // Windows sux, isn't carriage return a thing of the past :)
-		h = '\n' + h;
-		h = h.replace(new RegExp('\\n\\s+', 'gi'), '\n'); // Remove previous formatting
-		h = h.replace(this.nlBeforeRe, '\n<$1$2>');
-		h = h.replace(this.nlAfterRe, '<$1$2>\n');
-		h = h.replace(this.nlBeforeAfterRe, '\n<$1$2$3>\n');
-		h += '\n';
-
-		//tinyMCE.debug(h);
-
-		while ((i = h.indexOf('\n', i + 1)) != -1) {
-			if ((l = h.substring(li + 1, i)).length != 0) {
-				if (this.ouRe.test(l) && p.length >= s.indent_levels)
-					p = p.substring(s.indent_levels);
-
-				o += p + l + '\n';
-	
-				if (this.inRe.test(l))
-					p += this.inStr;
-			}
-
-			li = i;
-		}
-
-		//tinyMCE.debug(h);
-
-		return o;
-	},
-
-	xmlEncode : function(s, skip_apos) {
-		var cl = this, re = !skip_apos ? this.xmlEncodeAposRe : this.xmlEncodeRe;
-
-		this._setupEntities(); // Will intialize lookup table
-
-		switch (this.settings.entity_encoding) {
-			case "raw":
-				return tinyMCE.xmlEncode(s, skip_apos);
-
-			case "named":
-				return s.replace(re, function (c, b) {
-					b = cl.entities[c.charCodeAt(0)];
-
-					return b ? '&' + b + ';' : c;
-				});
-
-			case "numeric":
-				return s.replace(re, function (c, b) {
-					return b ? '&#' + c.charCodeAt(0) + ';' : c;
-				});
-		}
-
-		return s;
-	},
-
-	split : function(re, s) {
-		var c = s.split(re);
-		var i, l, o = new Array();
-
-		for (i=0, l=c.length; i<l; i++) {
-			if (c[i] != '')
-				o[i] = c[i];
-		}
-
-		return o;
-	},
-
-	_trimComment : function(s) {
-		// Remove mce_src, mce_href
-		s = s.replace(new RegExp('\\smce_src=\"[^\"]*\"', 'gi'), "");
-		s = s.replace(new RegExp('\\smce_href=\"[^\"]*\"', 'gi'), "");
-
-		return s;
-	},
-
-	_getAttrib : function(e, n, d) {
-		var v, ex, nn;
-
-		if (typeof(d) == "undefined")
-			d = "";
-
-		if (!e || e.nodeType != 1)
-			return d;
-
-		try {
-			v = e.getAttribute(n, 0);
-		} catch (ex) {
-			// IE 7 may cast exception on invalid attributes
-			v = e.getAttribute(n, 2);
-		}
-
-		if (n == "class" && !v)
-			v = e.className;
-
-		if (this.isIE) {
-			if (n == "http-equiv")
-				v = e.httpEquiv;
-
-			nn = e.nodeName;
-
-			// Skip the default values that IE returns
-			if (nn == "FORM" && n == "enctype" && v == "application/x-www-form-urlencoded")
-				v = "";
-
-			if (nn == "INPUT" && n == "size" && v == "20")
-				v = "";
-
-			if (nn == "INPUT" && n == "maxlength" && v == "2147483647")
-				v = "";
-		}
-
-		if (n == 'style' && v) {
-			if (!tinyMCE.isOpera)
-				v = e.style.cssText;
-
-			v = tinyMCE.serializeStyle(tinyMCE.parseStyle(v));
-		}
-
-		if (this.settings.on_save && n.indexOf('on') != -1 && this.settings.on_save && v && v != "")
-			v = tinyMCE.cleanupEventStr(v);
-
-		return (v && v != "") ? '' + v : d;
-	},
-
-	_urlConverter : function(c, n, v) {
-		if (!c.settings.on_save)
-			return tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, v);
-		else if (tinyMCE.getParam('convert_urls')) {
-			if (!this.urlConverter)
-				this.urlConverter = eval(tinyMCE.settings.urlconverter_callback);
-
-			return this.urlConverter(v, n, true);
-		}
-
-		return v;
-	},
-
-	_arrayToRe : function(a, op, be, af) {
-		var i, r;
-
-		op = typeof(op) == "undefined" ? "gi" : op;
-		be = typeof(be) == "undefined" ? "^(" : be;
-		af = typeof(af) == "undefined" ? ")$" : af;
-
-		r = be;
-
-		for (i=0; i<a.length; i++)
-			r += this._wildcardToRe(a[i]) + (i != a.length-1 ? "|" : "");
-
-		r += af;
-
-		return new RegExp(r, op);
-	},
-
-	_wildcardToRe : function(s) {
-		s = s.replace(/\?/g, '(\\S?)');
-		s = s.replace(/\+/g, '(\\S+)');
-		s = s.replace(/\*/g, '(\\S*)');
-
-		return s;
-	},
-
-	_setupEntities : function() {
-		var n, a, i, s = this.settings;
-
-		// Setup entities
-		if (!this.entitiesDone) {
-			if (s.entity_encoding == "named") {
-				n = tinyMCE.clearArray(new Array());
-				a = this.split(',', s.entities);
-				for (i=0; i<a.length; i+=2)
-					n[a[i]] = a[i+1];
-
-				this.entities = n;
-			}
-
-			this.entitiesDone = true;
-		}
-	},
-
-	_setupRules : function() {
-		var s = this.settings;
-
-		// Setup default rule
-		if (!this.rulesDone) {
-			this.addRuleStr(s.valid_elements);
-			this.addRuleStr(s.extended_valid_elements);
-			this.addChildRemoveRuleStr(s.valid_child_elements);
-
-			this.rulesDone = true;
-		}
-	},
-
-	_isDuplicate : function(n) {
-		var i;
-
-		if (!this.settings.fix_content_duplication)
-			return false;
-
-		if (tinyMCE.isRealIE && n.nodeType == 1) {
-			// Mark elements
-			if (n.mce_serialized == this.serializationId)
-				return true;
-
-			n.setAttribute('mce_serialized', this.serializationId);
-		} else {
-			// Search lookup table for text nodes  and comments
-			for (i=0; i<this.serializedNodes.length; i++) {
-				if (this.serializedNodes[i] == n)
-					return true;
-			}
-
-			this.serializedNodes[this.serializedNodes.length] = n;
-		}
-
-		return false;
-	}
-
-	};
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_DOMUtils.class.js */
-
-TinyMCE_Engine.prototype.createTagHTML = function(tn, a, h) {
-	var o = '', f = tinyMCE.xmlEncode;
-
-	o = '<' + tn;
-
-	if (a) {
-		for (n in a) {
-			if (typeof(a[n]) != 'function' && a[n] != null)
-				o += ' ' + f(n) + '="' + f('' + a[n]) + '"';
-		}
-	}
-
-	o += !h ? ' />' : '>' + h + '</' + tn + '>';
-
-	return o;
-};
-
-TinyMCE_Engine.prototype.createTag = function(d, tn, a, h) {
-	var o = d.createElement(tn);
-
-	if (a) {
-		for (n in a) {
-			if (typeof(a[n]) != 'function' && a[n] != null)
-				tinyMCE.setAttrib(o, n, a[n]);
-		}
-	}
-
-	if (h)
-		o.innerHTML = h;
-
-	return o;
-};
-
-TinyMCE_Engine.prototype.getElementByAttributeValue = function(n, e, a, v) {
-	return (n = this.getElementsByAttributeValue(n, e, a, v)).length == 0 ? null : n[0];
-};
-
-TinyMCE_Engine.prototype.getElementsByAttributeValue = function(n, e, a, v) {
-	var i, nl = n.getElementsByTagName(e), o = new Array();
-
-	for (i=0; i<nl.length; i++) {
-		if (tinyMCE.getAttrib(nl[i], a).indexOf(v) != -1)
-			o[o.length] = nl[i];
-	}
-
-	return o;
-};
-
-TinyMCE_Engine.prototype.isBlockElement = function(n) {
-	return n != null && n.nodeType == 1 && this.blockRegExp.test(n.nodeName);
-};
-
-TinyMCE_Engine.prototype.getParentBlockElement = function(n, r) {
-	return this.getParentNode(n, function(n) {
-		return tinyMCE.isBlockElement(n);
-	}, r);
-
-	return null;
-};
-
-TinyMCE_Engine.prototype.insertAfter = function(n, r){
-	if (r.nextSibling)
-		r.parentNode.insertBefore(n, r.nextSibling);
-	else
-		r.parentNode.appendChild(n);
-};
-
-TinyMCE_Engine.prototype.setInnerHTML = function(e, h) {
-	var i, nl, n;
-
-	// Convert all strong/em to b/i in Gecko
-	if (tinyMCE.isGecko) {
-		h = h.replace(/<embed([^>]*)>/gi, '<tmpembed$1>');
-		h = h.replace(/<em([^>]*)>/gi, '<i$1>');
-		h = h.replace(/<tmpembed([^>]*)>/gi, '<embed$1>');
-		h = h.replace(/<strong([^>]*)>/gi, '<b$1>');
-		h = h.replace(/<\/strong>/gi, '</b>');
-		h = h.replace(/<\/em>/gi, '</i>');
-	}
-
-	if (tinyMCE.isRealIE) {
-		// Since MSIE handles invalid HTML better that valid XHTML we
-		// need to make some things invalid. <hr /> gets converted to <hr>.
-		h = h.replace(/\s\/>/g, '>');
-
-		// Since MSIE auto generated emtpy P tags some times we must tell it to keep the real ones
-		h = h.replace(/<p([^>]*)>\u00A0?<\/p>/gi, '<p$1 mce_keep="true">&nbsp;</p>'); // Keep empty paragraphs
-		h = h.replace(/<p([^>]*)>\s*&nbsp;\s*<\/p>/gi, '<p$1 mce_keep="true">&nbsp;</p>'); // Keep empty paragraphs
-		h = h.replace(/<p([^>]*)>\s+<\/p>/gi, '<p$1 mce_keep="true">&nbsp;</p>'); // Keep empty paragraphs
-
-		// Remove first comment
-		e.innerHTML = tinyMCE.uniqueTag + h;
-		e.firstChild.removeNode(true);
-
-		// Remove weird auto generated empty paragraphs unless it's supposed to be there
-		nl = e.getElementsByTagName("p");
-		for (i=nl.length-1; i>=0; i--) {
-			n = nl[i];
-
-			if (n.nodeName == 'P' && !n.hasChildNodes() && !n.mce_keep)
-				n.parentNode.removeChild(n);
-		}
-	} else {
-		h = this.fixGeckoBaseHREFBug(1, e, h);
-		e.innerHTML = h;
-		this.fixGeckoBaseHREFBug(2, e, h);
-	}
-};
-
-TinyMCE_Engine.prototype.getOuterHTML = function(e) {
-	if (tinyMCE.isIE)
-		return e.outerHTML;
-
-	var d = e.ownerDocument.createElement("body");
-	d.appendChild(e.cloneNode(true));
-	return d.innerHTML;
-};
-
-TinyMCE_Engine.prototype.setOuterHTML = function(e, h, d) {
-	var d = typeof(d) == "undefined" ? e.ownerDocument : d, i, nl, t;
-
-	if (tinyMCE.isIE && e.nodeType == 1)
-		e.outerHTML = h;
-	else {
-		t = d.createElement("body");
-		t.innerHTML = h;
-
-		for (i=0, nl=t.childNodes; i<nl.length; i++)
-			e.parentNode.insertBefore(nl[i].cloneNode(true), e);
-
-		e.parentNode.removeChild(e);
-	}
-};
-
-TinyMCE_Engine.prototype._getElementById = function(id, d) {
-	var e, i, j, f;
-
-	if (typeof(d) == "undefined")
-		d = document;
-
-	e = d.getElementById(id);
-	if (!e) {
-		f = d.forms;
-
-		for (i=0; i<f.length; i++) {
-			for (j=0; j<f[i].elements.length; j++) {
-				if (f[i].elements[j].name == id) {
-					e = f[i].elements[j];
-					break;
-				}
-			}
-		}
-	}
-
-	return e;
-};
-
-TinyMCE_Engine.prototype.getNodeTree = function(n, na, t, nn) {
-	return this.selectNodes(n, function(n) {
-		return (!t || n.nodeType == t) && (!nn || n.nodeName == nn);
-	}, na ? na : new Array());
-};
-
-TinyMCE_Engine.prototype.getParentElement = function(n, na, f, r) {
-	var re = na ? new RegExp('^(' + na.toUpperCase().replace(/,/g, '|') + ')$') : 0, v;
-
-	// Compatiblity with old scripts where f param was a attribute string
-	if (f && typeof(f) == 'string')
-		return this.getParentElement(n, na, function(no) {return tinyMCE.getAttrib(no, f) != '';});
-
-	return this.getParentNode(n, function(n) {
-		return ((n.nodeType == 1 && !re) || (re && re.test(n.nodeName))) && (!f || f(n));
-	}, r);
-};
-
-TinyMCE_Engine.prototype.getParentNode = function(n, f, r) {
-	while (n) {
-		if (n == r)
-			return null;
-
-		if (f(n))
-			return n;
-
-		n = n.parentNode;
-	}
-
-	return null;
-};
-
-TinyMCE_Engine.prototype.getAttrib = function(elm, name, dv) {
-	var v;
-
-	if (typeof(dv) == "undefined")
-		dv = "";
-
-	// Not a element
-	if (!elm || elm.nodeType != 1)
-		return dv;
-
-	try {
-		v = elm.getAttribute(name, 0);
-	} catch (ex) {
-		// IE 7 may cast exception on invalid attributes
-		v = elm.getAttribute(name, 2);
-	}
-
-	// Try className for class attrib
-	if (name == "class" && !v)
-		v = elm.className;
-
-	// Workaround for a issue with Firefox 1.5rc2+
-	if (tinyMCE.isGecko && name == "src" && elm.src != null && elm.src != "")
-		v = elm.src;
-
-	// Workaround for a issue with Firefox 1.5rc2+
-	if (tinyMCE.isGecko && name == "href" && elm.href != null && elm.href != "")
-		v = elm.href;
-
-	if (name == "http-equiv" && tinyMCE.isIE)
-		v = elm.httpEquiv;
-
-	if (name == "style" && !tinyMCE.isOpera)
-		v = elm.style.cssText;
-
-	return (v && v != "") ? v : dv;
-};
-
-TinyMCE_Engine.prototype.setAttrib = function(el, name, va, fix) {
-	if (typeof(va) == "number" && va != null)
-		va = "" + va;
-
-	if (fix) {
-		if (va == null)
-			va = "";
-
-		va = va.replace(/[^0-9%]/g, '');
-	}
-
-	if (name == "style")
-		el.style.cssText = va;
-
-	if (name == "class")
-		el.className = va;
-
-	if (va != null && va != "" && va != -1)
-		el.setAttribute(name, va);
-	else
-		el.removeAttribute(name);
-};
-
-TinyMCE_Engine.prototype.setStyleAttrib = function(e, n, v) {
-	e.style[n] = v;
-
-	// Style attrib deleted in IE
-	if (tinyMCE.isIE && v == null || v == '') {
-		v = tinyMCE.serializeStyle(tinyMCE.parseStyle(e.style.cssText));
-		e.style.cssText = v;
-		e.setAttribute("style", v);
-	}
-};
-
-TinyMCE_Engine.prototype.switchClass = function(ei, c) {
-	var e;
-
-	if (tinyMCE.switchClassCache[ei])
-		e = tinyMCE.switchClassCache[ei];
-	else
-		e = tinyMCE.switchClassCache[ei] = document.getElementById(ei);
-
-	if (e) {
-		// Keep tile mode
-		if (tinyMCE.settings.button_tile_map && e.className && e.className.indexOf('mceTiledButton') == 0)
-			c = 'mceTiledButton ' + c;
-
-		e.className = c;
-	}
-};
-
-TinyMCE_Engine.prototype.getAbsPosition = function(n, cn) {
-	var l = 0, t = 0;
-
-	while (n && n != cn) {
-		l += n.offsetLeft;
-		t += n.offsetTop;
-		n = n.offsetParent;
-	}
-
-	return {absLeft : l, absTop : t};
-};
-
-TinyMCE_Engine.prototype.prevNode = function(e, n) {
-	var a = n.split(','), i;
-
-	while ((e = e.previousSibling) != null) {
-		for (i=0; i<a.length; i++) {
-			if (e.nodeName == a[i])
-				return e;
-		}
-	}
-
-	return null;
-};
-
-TinyMCE_Engine.prototype.nextNode = function(e, n) {
-	var a = n.split(','), i;
-
-	while ((e = e.nextSibling) != null) {
-		for (i=0; i<a.length; i++) {
-			if (e.nodeName == a[i])
-				return e;
-		}
-	}
-
-	return null;
-};
-
-TinyMCE_Engine.prototype.selectElements = function(n, na, f) {
-	var i, a = [], nl, x;
-
-	for (x=0, na = na.split(','); x<na.length; x++)
-		for (i=0, nl = n.getElementsByTagName(na[x]); i<nl.length; i++)
-			(!f || f(nl[i])) && a.push(nl[i]);
-
-	return a;
-};
-
-TinyMCE_Engine.prototype.selectNodes = function(n, f, a) {
-	var i;
-
-	if (!a)
-		a = new Array();
-
-	if (f(n))
-		a[a.length] = n;
-
-	if (n.hasChildNodes()) {
-		for (i=0; i<n.childNodes.length; i++)
-			tinyMCE.selectNodes(n.childNodes[i], f, a);
-	}
-
-	return a;
-};
-
-TinyMCE_Engine.prototype.addCSSClass = function(e, c, b) {
-	var o = this.removeCSSClass(e, c);
-	return e.className = b ? c + (o != '' ? (' ' + o) : '') : (o != '' ? (o + ' ') : '') + c;
-};
-
-TinyMCE_Engine.prototype.removeCSSClass = function(e, c) {
-	c = e.className.replace(new RegExp("(^|\\s+)" + c + "(\\s+|$)"), ' ');
-	return e.className = c != ' ' ? c : '';
-};
-
-TinyMCE_Engine.prototype.hasCSSClass = function(n, c) {
-	return new RegExp('\\b' + c + '\\b', 'g').test(n.className);
-};
-
-TinyMCE_Engine.prototype.renameElement = function(e, n, d) {
-	var ne, i, ar;
-
-	d = typeof(d) == "undefined" ? tinyMCE.selectedInstance.getDoc() : d;
-
-	if (e) {
-		ne = d.createElement(n);
-
-		ar = e.attributes;
-		for (i=ar.length-1; i>-1; i--) {
-			if (ar[i].specified && ar[i].nodeValue)
-				ne.setAttribute(ar[i].nodeName.toLowerCase(), ar[i].nodeValue);
-		}
-
-		ar = e.childNodes;
-		for (i=0; i<ar.length; i++)
-			ne.appendChild(ar[i].cloneNode(true));
-
-		e.parentNode.replaceChild(ne, e);
-	}
-};
-
-TinyMCE_Engine.prototype.getViewPort = function(w) {
-	var d = w.document, m = d.compatMode == 'CSS1Compat', b = d.body, de = d.documentElement;
-
-	return {
-		left : w.pageXOffset || (m ? de.scrollLeft : b.scrollLeft),
-		top : w.pageYOffset || (m ? de.scrollTop : b.scrollTop),
-		width : w.innerWidth || (m ? de.clientWidth : b.clientWidth),
-		height : w.innerHeight || (m ? de.clientHeight : b.clientHeight)
-	};
-};
-
-TinyMCE_Engine.prototype.getStyle = function(n, na, d) {
-	if (!n)
-		return false;
-
-	// Gecko
-	if (tinyMCE.isGecko && n.ownerDocument.defaultView) {
-		try {
-			return n.ownerDocument.defaultView.getComputedStyle(n, null).getPropertyValue(na);
-		} catch (n) {
-			// Old safari might fail
-			return null;
-		}
-	}
-
-	// Camelcase it, if needed
-	na = na.replace(/-(\D)/g, function(a, b){
-		return b.toUpperCase();
-	});
-
-	// IE & Opera
-	if (n.currentStyle)
-		return n.currentStyle[na];
-
-	return false;
-};
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_URL.class.js */
-
-TinyMCE_Engine.prototype.parseURL = function(url_str) {
-	var urlParts = new Array();
-
-	if (url_str) {
-		var pos, lastPos;
-
-		// Parse protocol part
-		pos = url_str.indexOf('://');
-		if (pos != -1) {
-			urlParts['protocol'] = url_str.substring(0, pos);
-			lastPos = pos + 3;
-		}
-
-		// Find port or path start
-		for (var i=lastPos; i<url_str.length; i++) {
-			var chr = url_str.charAt(i);
-
-			if (chr == ':')
-				break;
-
-			if (chr == '/')
-				break;
-		}
-		pos = i;
-
-		// Get host
-		urlParts['host'] = url_str.substring(lastPos, pos);
-
-		// Get port
-		urlParts['port'] = "";
-		lastPos = pos;
-		if (url_str.charAt(pos) == ':') {
-			pos = url_str.indexOf('/', lastPos);
-			urlParts['port'] = url_str.substring(lastPos+1, pos);
-		}
-
-		// Get path
-		lastPos = pos;
-		pos = url_str.indexOf('?', lastPos);
-
-		if (pos == -1)
-			pos = url_str.indexOf('#', lastPos);
-
-		if (pos == -1)
-			pos = url_str.length;
-
-		urlParts['path'] = url_str.substring(lastPos, pos);
-
-		// Get query
-		lastPos = pos;
-		if (url_str.charAt(pos) == '?') {
-			pos = url_str.indexOf('#');
-			pos = (pos == -1) ? url_str.length : pos;
-			urlParts['query'] = url_str.substring(lastPos+1, pos);
-		}
-
-		// Get anchor
-		lastPos = pos;
-		if (url_str.charAt(pos) == '#') {
-			pos = url_str.length;
-			urlParts['anchor'] = url_str.substring(lastPos+1, pos);
-		}
-	}
-
-	return urlParts;
-};
-
-TinyMCE_Engine.prototype.serializeURL = function(up) {
-	var o = "";
-
-	if (up['protocol'])
-		o += up['protocol'] + "://";
-
-	if (up['host'])
-		o += up['host'];
-
-	if (up['port'])
-		o += ":" + up['port'];
-
-	if (up['path'])
-		o += up['path'];
-
-	if (up['query'])
-		o += "?" + up['query'];
-
-	if (up['anchor'])
-		o += "#" + up['anchor'];
-
-	return o;
-};
-
-TinyMCE_Engine.prototype.convertAbsoluteURLToRelativeURL = function(base_url, url_to_relative) {
-	var baseURL = this.parseURL(base_url);
-	var targetURL = this.parseURL(url_to_relative);
-	var strTok1;
-	var strTok2;
-	var breakPoint = 0;
-	var outPath = "";
-	var forceSlash = false;
-
-	if (targetURL.path == "")
-		targetURL.path = "/";
-	else
-		forceSlash = true;
-
-	// Crop away last path part
-	base_url = baseURL.path.substring(0, baseURL.path.lastIndexOf('/'));
-	strTok1 = base_url.split('/');
-	strTok2 = targetURL.path.split('/');
-
-	if (strTok1.length >= strTok2.length) {
-		for (var i=0; i<strTok1.length; i++) {
-			if (i >= strTok2.length || strTok1[i] != strTok2[i]) {
-				breakPoint = i + 1;
-				break;
-			}
-		}
-	}
-
-	if (strTok1.length < strTok2.length) {
-		for (var i=0; i<strTok2.length; i++) {
-			if (i >= strTok1.length || strTok1[i] != strTok2[i]) {
-				breakPoint = i + 1;
-				break;
-			}
-		}
-	}
-
-	if (breakPoint == 1)
-		return targetURL.path;
-
-	for (var i=0; i<(strTok1.length-(breakPoint-1)); i++)
-		outPath += "../";
-
-	for (var i=breakPoint-1; i<strTok2.length; i++) {
-		if (i != (breakPoint-1))
-			outPath += "/" + strTok2[i];
-		else
-			outPath += strTok2[i];
-	}
-
-	targetURL.protocol = null;
-	targetURL.host = null;
-	targetURL.port = null;
-	targetURL.path = outPath == "" && forceSlash ? "/" : outPath;
-
-	// Remove document prefix from local anchors
-	var fileName = baseURL.path;
-	var pos;
-
-	if ((pos = fileName.lastIndexOf('/')) != -1)
-		fileName = fileName.substring(pos + 1);
-
-	// Is local anchor
-	if (fileName == targetURL.path && targetURL.anchor != "")
-		targetURL.path = "";
-
-	// If empty and not local anchor force filename or slash
-	if (targetURL.path == "" && !targetURL.anchor)
-		targetURL.path = fileName != "" ? fileName : "/";
-
-	return this.serializeURL(targetURL);
-};
-
-TinyMCE_Engine.prototype.convertRelativeToAbsoluteURL = function(base_url, relative_url) {
-	var baseURL = this.parseURL(base_url), baseURLParts, relURLParts;
-	var relURL = this.parseURL(relative_url);
-
-	if (relative_url == "" || relative_url.indexOf('://') != -1 || /^(mailto:|javascript:|#|\/)/.test(relative_url))
-		return relative_url;
-
-	// Split parts
-	baseURLParts = baseURL['path'].split('/');
-	relURLParts = relURL['path'].split('/');
-
-	// Remove empty chunks
-	var newBaseURLParts = new Array();
-	for (var i=baseURLParts.length-1; i>=0; i--) {
-		if (baseURLParts[i].length == 0)
-			continue;
-
-		newBaseURLParts[newBaseURLParts.length] = baseURLParts[i];
-	}
-	baseURLParts = newBaseURLParts.reverse();
-
-	// Merge relURLParts chunks
-	var newRelURLParts = new Array();
-	var numBack = 0;
-	for (var i=relURLParts.length-1; i>=0; i--) {
-		if (relURLParts[i].length == 0 || relURLParts[i] == ".")
-			continue;
-
-		if (relURLParts[i] == '..') {
-			numBack++;
-			continue;
-		}
-
-		if (numBack > 0) {
-			numBack--;
-			continue;
-		}
-
-		newRelURLParts[newRelURLParts.length] = relURLParts[i];
-	}
-
-	relURLParts = newRelURLParts.reverse();
-
-	// Remove end from absolute path
-	var len = baseURLParts.length-numBack;
-	var absPath = (len <= 0 ? "" : "/") + baseURLParts.slice(0, len).join('/') + "/" + relURLParts.join('/');
-	var start = "", end = "";
-
-	// Build output URL
-	relURL.protocol = baseURL.protocol;
-	relURL.host = baseURL.host;
-	relURL.port = baseURL.port;
-
-	// Re-add trailing slash if it's removed
-	if (relURL.path.charAt(relURL.path.length-1) == "/")
-		absPath += "/";
-
-	relURL.path = absPath;
-
-	return this.serializeURL(relURL);
-};
-
-TinyMCE_Engine.prototype.convertURL = function(url, node, on_save) {
-	var prot = document.location.protocol;
-	var host = document.location.hostname;
-	var port = document.location.port;
-
-	// Pass through file protocol
-	if (prot == "file:")
-		return url;
-
-	// Something is wrong, remove weirdness
-	url = tinyMCE.regexpReplace(url, '(http|https):///', '/');
-
-	// Mailto link or anchor (Pass through)
-	if (url.indexOf('mailto:') != -1 || url.indexOf('javascript:') != -1 || tinyMCE.regexpReplace(url,'[ \t\r\n\+]|%20','').charAt(0) == "#")
-		return url;
-
-	// Fix relative/Mozilla
-	if (!tinyMCE.isIE && !on_save && url.indexOf("://") == -1 && url.charAt(0) != '/')
-		return tinyMCE.settings['base_href'] + url;
-
-	// Handle relative URLs
-	if (on_save && tinyMCE.getParam('relative_urls')) {
-		var curl = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], url);
-		if (curl.charAt(0) == '/')
-			curl = tinyMCE.settings['document_base_prefix'] + curl;
-
-		var urlParts = tinyMCE.parseURL(curl);
-		var tmpUrlParts = tinyMCE.parseURL(tinyMCE.settings['document_base_url']);
-
-		// Force relative
-		if (urlParts['host'] == tmpUrlParts['host'] && (urlParts['port'] == tmpUrlParts['port']))
-			return tinyMCE.convertAbsoluteURLToRelativeURL(tinyMCE.settings['document_base_url'], curl);
-	}
-
-	// Handle absolute URLs
-	if (!tinyMCE.getParam('relative_urls')) {
-		var urlParts = tinyMCE.parseURL(url);
-		var baseUrlParts = tinyMCE.parseURL(tinyMCE.settings['base_href']);
-
-		// Force absolute URLs from relative URLs
-		url = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], url);
-
-		// If anchor and path is the same page
-		if (urlParts['anchor'] && urlParts['path'] == baseUrlParts['path'])
-			return "#" + urlParts['anchor'];
-	}
-
-	// Remove current domain
-	if (tinyMCE.getParam('remove_script_host')) {
-		var start = "", portPart = "";
-
-		if (port != "")
-			portPart = ":" + port;
-
-		start = prot + "//" + host + portPart + "/";
-
-		if (url.indexOf(start) == 0)
-			url = url.substring(start.length-1);
-	}
-
-	return url;
-};
-
-TinyMCE_Engine.prototype.convertAllRelativeURLs = function(body) {
-	var i, elms, src, href, mhref, msrc;
-
-	// Convert all image URL:s to absolute URL
-	elms = body.getElementsByTagName("img");
-	for (i=0; i<elms.length; i++) {
-		src = tinyMCE.getAttrib(elms[i], 'src');
-
-		msrc = tinyMCE.getAttrib(elms[i], 'mce_src');
-		if (msrc != "")
-			src = msrc;
-
-		if (src != "") {
-			src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], src);
-			elms[i].setAttribute("src", src);
-		}
-	}
-
-	// Convert all link URL:s to absolute URL
-	elms = body.getElementsByTagName("a");
-	for (i=0; i<elms.length; i++) {
-		href = tinyMCE.getAttrib(elms[i], 'href');
-
-		mhref = tinyMCE.getAttrib(elms[i], 'mce_href');
-		if (mhref != "")
-			href = mhref;
-
-		if (href && href != "") {
-			href = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], href);
-			elms[i].setAttribute("href", href);
-		}
-	}
-};
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_Array.class.js */
-
-TinyMCE_Engine.prototype.clearArray = function(a) {
-	var n;
-
-	for (n in a)
-		a[n] = null;
-
-	return a;
-};
-
-TinyMCE_Engine.prototype.explode = function(d, s) {
-	var ar = s.split(d), oar = new Array(), i;
-
-	for (i = 0; i<ar.length; i++) {
-		if (ar[i] != "")
-			oar[oar.length] = ar[i];
-	}
-
-	return oar;
-};
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_Event.class.js */
-
-TinyMCE_Engine.prototype._setEventsEnabled = function(node, state) {
-	var evs, x, y, elms, i, event;
-	var events = ['onfocus','onblur','onclick','ondblclick',
-				'onmousedown','onmouseup','onmouseover','onmousemove',
-				'onmouseout','onkeypress','onkeydown','onkeydown','onkeyup'];
-
-	evs = tinyMCE.settings['event_elements'].split(',');
-	for (y=0; y<evs.length; y++){
-		elms = node.getElementsByTagName(evs[y]);
-		for (i=0; i<elms.length; i++) {
-			event = "";
-
-			for (x=0; x<events.length; x++) {
-				if ((event = tinyMCE.getAttrib(elms[i], events[x])) != '') {
-					event = tinyMCE.cleanupEventStr("" + event);
-
-					if (!state)
-						event = "return true;" + event;
-					else
-						event = event.replace(/^return true;/gi, '');
-
-					elms[i].removeAttribute(events[x]);
-					elms[i].setAttribute(events[x], event);
-				}
-			}
-		}
-	}
-};
-
-TinyMCE_Engine.prototype._eventPatch = function(editor_id) {
-	var n, inst, win, e;
-
-	// Remove odd, error
-	if (typeof(tinyMCE) == "undefined")
-		return true;
-
-	try {
-		// Try selected instance first
-		if (tinyMCE.selectedInstance) {
-			win = tinyMCE.selectedInstance.getWin();
-
-			if (win && win.event) {
-				e = win.event;
-
-				if (!e.target)
-					e.target = e.srcElement;
-
-				TinyMCE_Engine.prototype.handleEvent(e);
-				return;
-			}
-		}
-
-		// Search for it
-		for (n in tinyMCE.instances) {
-			inst = tinyMCE.instances[n];
-
-			if (!tinyMCE.isInstance(inst))
-				continue;
-
-			inst.select();
-			win = inst.getWin();
-
-			if (win && win.event) {
-				e = win.event;
-
-				if (!e.target)
-					e.target = e.srcElement;
-
-				TinyMCE_Engine.prototype.handleEvent(e);
-				return;
-			}
-		}
-	} catch (ex) {
-		// Ignore error if iframe is pointing to external URL
-	}
-};
-
-TinyMCE_Engine.prototype.findEvent = function(e) {
-	var n, inst;
-
-	if (e)
-		return e;
-
-	for (n in tinyMCE.instances) {
-		inst = tinyMCE.instances[n];
-
-		if (tinyMCE.isInstance(inst) && inst.getWin().event)
-			return inst.getWin().event;
-	}
-
-	return null;
-};
-
-TinyMCE_Engine.prototype.unloadHandler = function() {
-	tinyMCE.triggerSave(true, true);
-};
-
-TinyMCE_Engine.prototype.addEventHandlers = function(inst) {
-	this.setEventHandlers(inst, 1);
-};
-
-TinyMCE_Engine.prototype.setEventHandlers = function(inst, s) {
-	var doc = inst.getDoc(), ie, ot, i, f = s ? tinyMCE.addEvent : tinyMCE.removeEvent;
-
-	ie = ['keypress', 'keyup', 'keydown', 'click', 'mouseup', 'mousedown', 'controlselect', 'dblclick'];
-	ot = ['keypress', 'keyup', 'keydown', 'click', 'mouseup', 'mousedown', 'focus', 'blur', 'dragdrop'];
-
-	inst.switchSettings();
-
-	if (tinyMCE.isIE) {
-		for (i=0; i<ie.length; i++)
-			f(doc, ie[i], TinyMCE_Engine.prototype._eventPatch);
-	} else {
-		for (i=0; i<ot.length; i++)
-			f(doc, ot[i], tinyMCE.handleEvent);
-
-		// Force designmode
-		try {
-			doc.designMode = "On";
-		} catch (e) {
-			// Ignore
-		}
-	}
-};
-
-TinyMCE_Engine.prototype.onMouseMove = function() {
-	var inst, lh;
-
-	// Fix for IE7 bug where it's not restoring hover on anchors correctly
-	if (tinyMCE.lastHover) {
-		lh = tinyMCE.lastHover;
-
-		// Call out on menus and refresh class on normal buttons
-		if (lh.className.indexOf('mceMenu') != -1)
-			tinyMCE._menuButtonEvent('out', lh);
-		else
-			lh.className = lh.className;
-
-		tinyMCE.lastHover = null;
-	}
-
-	if (!tinyMCE.hasMouseMoved) {
-		inst = tinyMCE.selectedInstance;
-
-		// Workaround for bug #1437457 (Odd MSIE bug)
-		if (inst.isFocused) {
-			inst.undoBookmark = inst.selection.getBookmark();
-			tinyMCE.hasMouseMoved = true;
-		}
-	}
-
-//	tinyMCE.cancelEvent(inst.getWin().event);
-//	return false;
-};
-
-TinyMCE_Engine.prototype.cancelEvent = function(e) {
-	if (!e)
-		return false;
-
-	if (tinyMCE.isIE) {
-		e.returnValue = false;
-		e.cancelBubble = true;
-	} else {
-		e.preventDefault();
-		e.stopPropagation && e.stopPropagation();
-	}
-
-	return false;
-};
-
-TinyMCE_Engine.prototype.addEvent = function(o, n, h) {
-	// Add cleanup for all non unload events
-	if (n != 'unload') {
-		function clean() {
-			var ex;
-
-			try {
-				tinyMCE.removeEvent(o, n, h);
-				tinyMCE.removeEvent(window, 'unload', clean);
-				o = n = h = null;
-			} catch (ex) {
-				// IE may produce access denied exception on unload
-			}
-		}
-
-		// Add memory cleaner
-		tinyMCE.addEvent(window, 'unload', clean);
-	}
-
-	if (o.attachEvent)
-		o.attachEvent("on" + n, h);
-	else
-		o.addEventListener(n, h, false);
-};
-
-TinyMCE_Engine.prototype.removeEvent = function(o, n, h) {
-	if (o.detachEvent)
-		o.detachEvent("on" + n, h);
-	else
-		o.removeEventListener(n, h, false);
-};
-
-TinyMCE_Engine.prototype.addSelectAccessibility = function(e, s, w) {
-	// Add event handlers 
-	if (!s._isAccessible) {
-		s.onkeydown = tinyMCE.accessibleEventHandler;
-		s.onblur = tinyMCE.accessibleEventHandler;
-		s._isAccessible = true;
-		s._win = w;
-	}
-
-	return false;
-};
-
-TinyMCE_Engine.prototype.accessibleEventHandler = function(e) {
-	var win = this._win;
-	e = tinyMCE.isIE ? win.event : e;
-	var elm = tinyMCE.isIE ? e.srcElement : e.target;
-
-	// Unpiggyback onchange on blur
-	if (e.type == "blur") {
-		if (elm.oldonchange) {
-			elm.onchange = elm.oldonchange;
-			elm.oldonchange = null;
-		}
-
-		return true;
-	}
-
-	// Piggyback onchange
-	if (elm.nodeName == "SELECT" && !elm.oldonchange) {
-		elm.oldonchange = elm.onchange;
-		elm.onchange = null;
-	}
-
-	// Execute onchange and remove piggyback
-	if (e.keyCode == 13 || e.keyCode == 32) {
-		elm.onchange = elm.oldonchange;
-		elm.onchange();
-		elm.oldonchange = null;
-
-		tinyMCE.cancelEvent(e);
-		return false;
-	}
-
-	return true;
-};
-
-TinyMCE_Engine.prototype._resetIframeHeight = function() {
-	var ife;
-
-	if (tinyMCE.isRealIE) {
-		ife = tinyMCE.selectedInstance.iframeElement;
-
-/*		if (ife._oldWidth) {
-			ife.style.width = ife._oldWidth;
-			ife.width = ife._oldWidth;
-		}*/
-
-		if (ife._oldHeight) {
-			ife.style.height = ife._oldHeight;
-			ife.height = ife._oldHeight;
-		}
-	}
-};
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_Selection.class.js */
-
-function TinyMCE_Selection(inst) {
-	this.instance = inst;
-};
-
-TinyMCE_Selection.prototype = {
-	getSelectedHTML : function() {
-		var inst = this.instance;
-		var e, r = this.getRng(), h;
-
-		if (!r)
-			return null;
-
-		e = document.createElement("body");
-
-		if (r.cloneContents)
-			e.appendChild(r.cloneContents());
-		else if (typeof(r.item) != 'undefined' || typeof(r.htmlText) != 'undefined')
-			e.innerHTML = r.item ? r.item(0).outerHTML : r.htmlText;
-		else
-			e.innerHTML = r.toString(); // Failed, use text for now
-
-		h = tinyMCE._cleanupHTML(inst, inst.contentDocument, inst.settings, e, e, false, true, false);
-
-		// When editing always use fonts internaly
-		//if (tinyMCE.getParam("convert_fonts_to_spans"))
-		//	tinyMCE.convertSpansToFonts(inst.getDoc());
-
-		return h;
-	},
-
-	getSelectedText : function() {
-		var inst = this.instance;
-		var d, r, s, t;
-
-		if (tinyMCE.isIE) {
-			d = inst.getDoc();
-
-			if (d.selection.type == "Text") {
-				r = d.selection.createRange();
-				t = r.text;
-			} else
-				t = '';
-		} else {
-			s = this.getSel();
-
-			if (s && s.toString)
-				t = s.toString();
-			else
-				t = '';
-		}
-
-		return t;
-	},
-
-	getBookmark : function(simple) {
-		var inst = this.instance;
-		var rng = this.getRng();
-		var doc = inst.getDoc(), b = inst.getBody();
-		var sp, le, s, e, nl, i, si, ei, w;
-		var trng, sx, sy, xx = -999999999, vp = inst.getViewPort();
-
-		sx = vp.left;
-		sy = vp.top;
-
-		if (tinyMCE.isSafari || tinyMCE.isOpera || simple)
-			return {rng : rng, scrollX : sx, scrollY : sy};
-
-		if (tinyMCE.isIE) {
-			if (rng.item) {
-				e = rng.item(0);
-
-				nl = b.getElementsByTagName(e.nodeName);
-				for (i=0; i<nl.length; i++) {
-					if (e == nl[i]) {
-						sp = i;
-						break;
-					}
-				}
-
-				return {
-					tag : e.nodeName,
-					index : sp,
-					scrollX : sx,
-					scrollY : sy
-				};
-			} else {
-				trng = doc.body.createTextRange();
-				trng.moveToElementText(inst.getBody());
-				trng.collapse(true);
-				bp = Math.abs(trng.move('character', xx));
-
-				trng = rng.duplicate();
-				trng.collapse(true);
-				sp = Math.abs(trng.move('character', xx));
-
-				trng = rng.duplicate();
-				trng.collapse(false);
-				le = Math.abs(trng.move('character', xx)) - sp;
-
-				return {
-					start : sp - bp,
-					length : le,
-					scrollX : sx,
-					scrollY : sy
-				};
-			}
-		}
-
-		if (tinyMCE.isGecko) {
-			s = this.getSel();
-			e = this.getFocusElement();
-
-			if (!s)
-				return null;
-
-			if (e && e.nodeName == 'IMG') {
-				/*nl = b.getElementsByTagName('IMG');
-				for (i=0; i<nl.length; i++) {
-					if (e == nl[i]) {
-						sp = i;
-						break;
-					}
-				}*/
-
-				return {
-					start : -1,
-					end : -1,
-					index : sp,
-					scrollX : sx,
-					scrollY : sy
-				};
-			}
-
-			// Caret or selection
-			if (s.anchorNode == s.focusNode && s.anchorOffset == s.focusOffset) {
-				e = this._getPosText(b, s.anchorNode, s.focusNode);
-
-				if (!e)
-					return {scrollX : sx, scrollY : sy};
-
-				return {
-					start : e.start + s.anchorOffset,
-					end : e.end + s.focusOffset,
-					scrollX : sx,
-					scrollY : sy
-				};
-			} else {
-				e = this._getPosText(b, rng.startContainer, rng.endContainer);
-
-				if (!e)
-					return {scrollX : sx, scrollY : sy};
-
-				return {
-					start : e.start + rng.startOffset,
-					end : e.end + rng.endOffset,
-					scrollX : sx,
-					scrollY : sy
-				};
-			}
-		}
-
-		return null;
-	},
-
-	moveToBookmark : function(bookmark) {
-		var inst = this.instance;
-		var rng, nl, i, ex, b = inst.getBody(), sd;
-		var doc = inst.getDoc();
-		var win = inst.getWin();
-		var sel = this.getSel();
-
-		if (!bookmark)
-			return false;
-
-		if (tinyMCE.isSafari) {
-			sel.setBaseAndExtent(bookmark.rng.startContainer, bookmark.rng.startOffset, bookmark.rng.endContainer, bookmark.rng.endOffset);
-			return true;
-		}
-
-		if (tinyMCE.isRealIE) {
-			if (bookmark.rng) {
-				try {
-					bookmark.rng.select();
-				} catch (ex) {
-					// Ignore
-				}
-
-				return true;
-			}
-
-			win.focus();
-
-			if (bookmark.tag) {
-				rng = b.createControlRange();
-
-				nl = b.getElementsByTagName(bookmark.tag);
-
-				if (nl.length > bookmark.index) {
-					try {
-						rng.addElement(nl[bookmark.index]);
-					} catch (ex) {
-						// Might be thrown if the node no longer exists
-					}
-				}
-			} else {
-				// Try/catch needed since this operation breaks when TinyMCE is placed in hidden divs/tabs
-				try {
-					// Incorrect bookmark
-					if (bookmark.start < 0)
-						return true;
-
-					rng = inst.getSel().createRange();
-					rng.moveToElementText(inst.getBody());
-					rng.collapse(true);
-					rng.moveStart('character', bookmark.start);
-					rng.moveEnd('character', bookmark.length);
-				} catch (ex) {
-					return true;
-				}
-			}
-
-			rng.select();
-
-			win.scrollTo(bookmark.scrollX, bookmark.scrollY);
-			return true;
-		}
-
-		if (tinyMCE.isGecko || tinyMCE.isOpera) {
-			if (!sel)
-				return false;
-
-			if (bookmark.rng) {
-				sel.removeAllRanges();
-				sel.addRange(bookmark.rng);
-			}
-
-			if (bookmark.start != -1 && bookmark.end != -1) {
-				try {
-					sd = this._getTextPos(b, bookmark.start, bookmark.end);
-					rng = doc.createRange();
-					rng.setStart(sd.startNode, sd.startOffset);
-					rng.setEnd(sd.endNode, sd.endOffset);
-					sel.removeAllRanges();
-					sel.addRange(rng);
-					win.focus();
-				} catch (ex) {
-					// Ignore
-				}
-			}
-
-			/*
-			if (typeof(bookmark.index) != 'undefined') {
-				tinyMCE.selectElements(b, 'IMG', function (n) {
-					if (bookmark.index-- == 0) {
-						// Select image in Gecko here
-					}
-
-					return false;
-				});
-			}
-			*/
-
-			win.scrollTo(bookmark.scrollX, bookmark.scrollY);
-			return true;
-		}
-
-		return false;
-	},
-
-	_getPosText : function(r, sn, en) {
-		var w = document.createTreeWalker(r, NodeFilter.SHOW_TEXT, null, false), n, p = 0, d = {};
-
-		while ((n = w.nextNode()) != null) {
-			if (n == sn)
-				d.start = p;
-
-			if (n == en) {
-				d.end = p;
-				return d;
-			}
-
-			p += n.nodeValue ? n.nodeValue.length : 0;
-		}
-
-		return null;
-	},
-
-	_getTextPos : function(r, sp, ep) {
-		var w = document.createTreeWalker(r, NodeFilter.SHOW_TEXT, null, false), n, p = 0, d = {};
-
-		while ((n = w.nextNode()) != null) {
-			p += n.nodeValue ? n.nodeValue.length : 0;
-
-			if (p >= sp && !d.startNode) {
-				d.startNode = n;
-				d.startOffset = sp - (p - n.nodeValue.length);
-			}
-
-			if (p >= ep) {
-				d.endNode = n;
-				d.endOffset = ep - (p - n.nodeValue.length);
-
-				return d;
-			}
-		}
-
-		return null;
-	},
-
-	selectNode : function(node, collapse, select_text_node, to_start) {
-		var inst = this.instance, sel, rng, nodes;
-
-		if (!node)
-			return;
-
-		if (typeof(collapse) == "undefined")
-			collapse = true;
-
-		if (typeof(select_text_node) == "undefined")
-			select_text_node = false;
-
-		if (typeof(to_start) == "undefined")
-			to_start = true;
-
-		if (inst.settings.auto_resize)
-			inst.resizeToContent();
-
-		if (tinyMCE.isRealIE) {
-			rng = inst.getDoc().body.createTextRange();
-
-			try {
-				rng.moveToElementText(node);
-
-				if (collapse)
-					rng.collapse(to_start);
-
-				rng.select();
-			} catch (e) {
-				// Throws illigal agrument in MSIE some times
-			}
-		} else {
-			sel = this.getSel();
-
-			if (!sel)
-				return;
-
-			if (tinyMCE.isSafari) {
-				sel.setBaseAndExtent(node, 0, node, node.innerText.length);
-
-				if (collapse) {
-					if (to_start)
-						sel.collapseToStart();
-					else
-						sel.collapseToEnd();
-				}
-
-				this.scrollToNode(node);
-
-				return;
-			}
-
-			rng = inst.getDoc().createRange();
-
-			if (select_text_node) {
-				// Find first textnode in tree
-				nodes = tinyMCE.getNodeTree(node, new Array(), 3);
-				if (nodes.length > 0)
-					rng.selectNodeContents(nodes[0]);
-				else
-					rng.selectNodeContents(node);
-			} else
-				rng.selectNode(node);
-
-			if (collapse) {
-				// Special treatment of textnode collapse
-				if (!to_start && node.nodeType == 3) {
-					rng.setStart(node, node.nodeValue.length);
-					rng.setEnd(node, node.nodeValue.length);
-				} else
-					rng.collapse(to_start);
-			}
-
-			sel.removeAllRanges();
-			sel.addRange(rng);
-		}
-
-		this.scrollToNode(node);
-
-		// Set selected element
-		tinyMCE.selectedElement = null;
-		if (node.nodeType == 1)
-			tinyMCE.selectedElement = node;
-	},
-
-	scrollToNode : function(node) {
-		var inst = this.instance, w = inst.getWin(), vp = inst.getViewPort(), pos = tinyMCE.getAbsPosition(node), cvp, p, cwin;
-
-		// Only scroll if out of visible area
-		if (pos.absLeft < vp.left || pos.absLeft > vp.left + vp.width || pos.absTop < vp.top || pos.absTop > vp.top + (vp.height-25))
-			w.scrollTo(pos.absLeft, pos.absTop - vp.height + 25);
-
-		// Scroll container window
-		if (inst.settings.auto_resize) {
-			cwin = inst.getContainerWin();
-			cvp = tinyMCE.getViewPort(cwin);
-			p = this.getAbsPosition(node);
-
-			if (p.absLeft < cvp.left || p.absLeft > cvp.left + cvp.width || p.absTop < cvp.top || p.absTop > cvp.top + cvp.height)
-				cwin.scrollTo(p.absLeft, p.absTop - cvp.height + 25);
-		}
-	},
-
-	getAbsPosition : function(n) {
-		var pos = tinyMCE.getAbsPosition(n), ipos = tinyMCE.getAbsPosition(this.instance.iframeElement);
-
-		return {
-			absLeft : ipos.absLeft + pos.absLeft,
-			absTop : ipos.absTop + pos.absTop
-		};
-	},
-
-	getSel : function() {
-		var inst = this.instance;
-
-		if (tinyMCE.isRealIE)
-			return inst.getDoc().selection;
-
-		return inst.contentWindow.getSelection();
-	},
-
-	getRng : function() {
-		var s = this.getSel();
-
-		if (s == null)
-			return null;
-
-		if (tinyMCE.isRealIE)
-			return s.createRange();
-
-		if (tinyMCE.isSafari && !s.getRangeAt)
-			return '' + window.getSelection();
-
-		if (s.rangeCount > 0)
-			return s.getRangeAt(0);
-
-		return null;
-	},
-
-	isCollapsed : function() {
-		var r = this.getRng();
-
-		if (r.item)
-			return false;
-
-		return r.boundingWidth == 0 || this.getSel().isCollapsed;
-	},
-
-	collapse : function(b) {
-		var r = this.getRng(), s = this.getSel();
-
-		if (r.select) {
-			r.collapse(b);
-			r.select();
-		} else {
-			if (b)
-				s.collapseToStart();
-			else
-				s.collapseToEnd();
-		}
-	},
-
-	getFocusElement : function() {
-		var inst = this.instance, doc, rng, sel, elm;
-
-		if (tinyMCE.isRealIE) {
-			doc = inst.getDoc();
-			rng = doc.selection.createRange();
-
-	//		if (rng.collapse)
-	//			rng.collapse(true);
-
-			elm = rng.item ? rng.item(0) : rng.parentElement();
-		} else {
-			if (!tinyMCE.isSafari && inst.isHidden())
-				return inst.getBody();
-
-			sel = this.getSel();
-			rng = this.getRng();
-
-			if (!sel || !rng)
-				return null;
-
-			elm = rng.commonAncestorContainer;
-			//elm = (sel && sel.anchorNode) ? sel.anchorNode : null;
-
-			// Handle selection a image or other control like element such as anchors
-			if (!rng.collapsed) {
-				// Is selection small
-				if (rng.startContainer == rng.endContainer) {
-					if (rng.startOffset - rng.endOffset < 2) {
-						if (rng.startContainer.hasChildNodes())
-							elm = rng.startContainer.childNodes[rng.startOffset];
-					}
-				}
-			}
-
-			// Get the element parent of the node
-			elm = tinyMCE.getParentElement(elm);
-
-			//if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img")
-			//	elm = tinyMCE.selectedElement;
-		}
-
-		return elm;
-	}
-
-	};
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_UndoRedo.class.js */
-
-function TinyMCE_UndoRedo(inst) {
-	this.instance = inst;
-	this.undoLevels = new Array();
-	this.undoIndex = 0;
-	this.typingUndoIndex = -1;
-	this.undoRedo = true;
-};
-
-TinyMCE_UndoRedo.prototype = {
-	add : function(l) {
-		var b, customUndoLevels, newHTML, inst = this.instance, i, ul, ur;
-
-		if (l) {
-			this.undoLevels[this.undoLevels.length] = l;
-			return true;
-		}
-
-		if (this.typingUndoIndex != -1) {
-			this.undoIndex = this.typingUndoIndex;
-
-			if (tinyMCE.typingUndoIndex != -1)
-				tinyMCE.undoIndex = tinyMCE.typingUndoIndex;
-		}
-
-		newHTML = tinyMCE.trim(inst.getBody().innerHTML);
-		if (this.undoLevels[this.undoIndex] && newHTML != this.undoLevels[this.undoIndex].content) {
-			//tinyMCE.debug(newHTML, this.undoLevels[this.undoIndex].content);
-
-			tinyMCE.dispatchCallback(inst, 'onchange_callback', 'onChange', inst);
-
-			// Time to compress
-			customUndoLevels = tinyMCE.settings['custom_undo_redo_levels'];
-			if (customUndoLevels != -1 && this.undoLevels.length > customUndoLevels) {
-				for (i=0; i<this.undoLevels.length-1; i++)
-					this.undoLevels[i] = this.undoLevels[i+1];
-
-				this.undoLevels.length--;
-				this.undoIndex--;
-
-				// Todo: Implement global undo/redo logic here
-			}
-
-			b = inst.undoBookmark;
-
-			if (!b)
-				b = inst.selection.getBookmark();
-
-			this.undoIndex++;
-			this.undoLevels[this.undoIndex] = {
-				content : newHTML,
-				bookmark : b
-			};
-
-			// Remove all above from global undo/redo
-			ul = tinyMCE.undoLevels;
-			for (i=tinyMCE.undoIndex + 1; i<ul.length; i++) {
-				ur = ul[i].undoRedo;
-
-				if (ur.undoIndex == ur.undoLevels.length -1)
-					ur.undoIndex--;
-
-				ur.undoLevels.length--;
-			}
-
-			// Add global undo level
-			tinyMCE.undoLevels[tinyMCE.undoIndex++] = inst;
-			tinyMCE.undoLevels.length = tinyMCE.undoIndex;
-
-			this.undoLevels.length = this.undoIndex + 1;
-
-			return true;
-		}
-
-		return false;
-	},
-
-	undo : function() {
-		var inst = this.instance;
-
-		// Do undo
-		if (this.undoIndex > 0) {
-			this.undoIndex--;
-
-			tinyMCE.setInnerHTML(inst.getBody(), this.undoLevels[this.undoIndex].content);
-			inst.repaint();
-
-			if (inst.settings.custom_undo_redo_restore_selection)
-				inst.selection.moveToBookmark(this.undoLevels[this.undoIndex].bookmark);
-		}
-	},
-
-	redo : function() {
-		var inst = this.instance;
-
-		tinyMCE.execCommand("mceEndTyping");
-
-		if (this.undoIndex < (this.undoLevels.length-1)) {
-			this.undoIndex++;
-
-			tinyMCE.setInnerHTML(inst.getBody(), this.undoLevels[this.undoIndex].content);
-			inst.repaint();
-
-			if (inst.settings.custom_undo_redo_restore_selection)
-				inst.selection.moveToBookmark(this.undoLevels[this.undoIndex].bookmark);
-		}
-
-		tinyMCE.triggerNodeChange();
-	}
-
-	};
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_ForceParagraphs.class.js */
-
-var TinyMCE_ForceParagraphs = {
-	_insertPara : function(inst, e) {
-		var doc = inst.getDoc(), sel = inst.getSel(), body = inst.getBody(), win = inst.contentWindow, rng = sel.getRangeAt(0);
-		var rootElm = doc.documentElement, blockName = "P", startNode, endNode, startBlock, endBlock;
-		var rngBefore, rngAfter, direct, startNode, startOffset, endNode, endOffset, b = tinyMCE.isOpera ? inst.selection.getBookmark() : null;
-		var paraBefore, paraAfter, startChop, endChop, contents;
-
-		function isEmpty(para) {
-			function isEmptyHTML(html) {
-				return html.replace(new RegExp('[ \t\r\n]+', 'g'), '').toLowerCase() == "";
-			}
-
-			// Check for images
-			if (para.getElementsByTagName("img").length > 0)
-				return false;
-
-			// Check for tables
-			if (para.getElementsByTagName("table").length > 0)
-				return false;
-
-			// Check for HRs
-			if (para.getElementsByTagName("hr").length > 0)
-				return false;
-
-			// Check all textnodes
-			var nodes = tinyMCE.getNodeTree(para, new Array(), 3);
-			for (var i=0; i<nodes.length; i++) {
-				if (!isEmptyHTML(nodes[i].nodeValue))
-					return false;
-			}
-
-			// No images, no tables, no hrs, no text content then it's empty
-			return true;
-		}
-
-	//	tinyMCE.debug(body.innerHTML);
-
-	//	debug(e.target, sel.anchorNode.nodeName, sel.focusNode.nodeName, rng.startContainer, rng.endContainer, rng.commonAncestorContainer, sel.anchorOffset, sel.focusOffset, rng.toString());
-
-		// Setup before range
-		rngBefore = doc.createRange();
-		rngBefore.setStart(sel.anchorNode, sel.anchorOffset);
-		rngBefore.collapse(true);
-
-		// Setup after range
-		rngAfter = doc.createRange();
-		rngAfter.setStart(sel.focusNode, sel.focusOffset);
-		rngAfter.collapse(true);
-
-		// Setup start/end points
-		direct = rngBefore.compareBoundaryPoints(rngBefore.START_TO_END, rngAfter) < 0;
-		startNode = direct ? sel.anchorNode : sel.focusNode;
-		startOffset = direct ? sel.anchorOffset : sel.focusOffset;
-		endNode = direct ? sel.focusNode : sel.anchorNode;
-		endOffset = direct ? sel.focusOffset : sel.anchorOffset;
-
-		startNode = startNode.nodeName == "BODY" ? startNode.firstChild : startNode;
-		endNode = endNode.nodeName == "BODY" ? endNode.firstChild : endNode;
-
-		// Get block elements
-		startBlock = inst.getParentBlockElement(startNode);
-		endBlock = inst.getParentBlockElement(endNode);
-
-		// If absolute force paragraph generation within
-		if (startBlock && new RegExp('absolute|relative|static', 'gi').test(startBlock.style.position))
-			startBlock = null;
-
-		if (endBlock && new RegExp('absolute|relative|static', 'gi').test(endBlock.style.position))
-			endBlock = null;
-
-		// Use current block name
-		if (startBlock != null) {
-			blockName = startBlock.nodeName;
-
-			// Use P instead
-			if (blockName == "TD" || blockName == "TABLE" || (blockName == "DIV" && new RegExp('left|right', 'gi').test(startBlock.style.cssFloat)))
-				blockName = "P";
-		}
-
-		// Within a list use normal behaviour
-		if (tinyMCE.getParentElement(startBlock, "OL,UL", null, body) != null)
-			return false;
-
-		// Within a table create new paragraphs
-		if ((startBlock != null && startBlock.nodeName == "TABLE") || (endBlock != null && endBlock.nodeName == "TABLE"))
-			startBlock = endBlock = null;
-
-		// Setup new paragraphs
-		paraBefore = (startBlock != null && startBlock.nodeName == blockName) ? startBlock.cloneNode(false) : doc.createElement(blockName);
-		paraAfter = (endBlock != null && endBlock.nodeName == blockName) ? endBlock.cloneNode(false) : doc.createElement(blockName);
-
-		// Is header, then force paragraph under
-		if (/^(H[1-6])$/.test(blockName))
-			paraAfter = doc.createElement("p");
-
-		// Setup chop nodes
-		startChop = startNode;
-		endChop = endNode;
-
-		// Get startChop node
-		node = startChop;
-		do {
-			if (node == body || node.nodeType == 9 || tinyMCE.isBlockElement(node))
-				break;
-
-			startChop = node;
-		} while ((node = node.previousSibling ? node.previousSibling : node.parentNode));
-
-		// Get endChop node
-		node = endChop;
-		do {
-			if (node == body || node.nodeType == 9 || tinyMCE.isBlockElement(node))
-				break;
-
-			endChop = node;
-		} while ((node = node.nextSibling ? node.nextSibling : node.parentNode));
-
-		// Fix when only a image is within the TD
-		if (startChop.nodeName == "TD")
-			startChop = startChop.firstChild;
-
-		if (endChop.nodeName == "TD")
-			endChop = endChop.lastChild;
-
-		// If not in a block element
-		if (startBlock == null) {
-			// Delete selection
-			rng.deleteContents();
-
-			if (!tinyMCE.isSafari)
-				sel.removeAllRanges();
-
-			if (startChop != rootElm && endChop != rootElm) {
-				// Insert paragraph before
-				rngBefore = rng.cloneRange();
-
-				if (startChop == body)
-					rngBefore.setStart(startChop, 0);
-				else
-					rngBefore.setStartBefore(startChop);
-
-				paraBefore.appendChild(rngBefore.cloneContents());
-
-				// Insert paragraph after
-				if (endChop.parentNode.nodeName == blockName)
-					endChop = endChop.parentNode;
-
-				// If not after image
-				//if (rng.startContainer.nodeName != "BODY" && rng.endContainer.nodeName != "BODY")
-					rng.setEndAfter(endChop);
-
-				if (endChop.nodeName != "#text" && endChop.nodeName != "BODY")
-					rngBefore.setEndAfter(endChop);
-
-				contents = rng.cloneContents();
-				if (contents.firstChild && (contents.firstChild.nodeName == blockName || contents.firstChild.nodeName == "BODY"))
-					paraAfter.innerHTML = contents.firstChild.innerHTML;
-				else
-					paraAfter.appendChild(contents);
-
-				// Check if it's a empty paragraph
-				if (isEmpty(paraBefore))
-					paraBefore.innerHTML = "&nbsp;";
-
-				// Check if it's a empty paragraph
-				if (isEmpty(paraAfter))
-					paraAfter.innerHTML = "&nbsp;";
-
-				// Delete old contents
-				rng.deleteContents();
-				rngAfter.deleteContents();
-				rngBefore.deleteContents();
-
-				// Insert new paragraphs
-				if (tinyMCE.isOpera) {
-					paraBefore.normalize();
-					rngBefore.insertNode(paraBefore);
-					paraAfter.normalize();
-					rngBefore.insertNode(paraAfter);
-				} else {
-					paraAfter.normalize();
-					rngBefore.insertNode(paraAfter);
-					paraBefore.normalize();
-					rngBefore.insertNode(paraBefore);
-				}
-
-				//tinyMCE.debug("1: ", paraBefore.innerHTML, paraAfter.innerHTML);
-			} else {
-				body.innerHTML = "<" + blockName + ">&nbsp;</" + blockName + "><" + blockName + ">&nbsp;</" + blockName + ">";
-				paraAfter = body.childNodes[1];
-			}
-
-			inst.selection.moveToBookmark(b);
-			inst.selection.selectNode(paraAfter, true, true);
-
-			return true;
-		}
-
-		// Place first part within new paragraph
-		if (startChop.nodeName == blockName)
-			rngBefore.setStart(startChop, 0);
-		else
-			rngBefore.setStartBefore(startChop);
-
-		rngBefore.setEnd(startNode, startOffset);
-		paraBefore.appendChild(rngBefore.cloneContents());
-
-		// Place secound part within new paragraph
-		rngAfter.setEndAfter(endChop);
-		rngAfter.setStart(endNode, endOffset);
-		contents = rngAfter.cloneContents();
-
-		if (contents.firstChild && contents.firstChild.nodeName == blockName) {
-	/*		var nodes = contents.firstChild.childNodes;
-			for (var i=0; i<nodes.length; i++) {
-				//tinyMCE.debug(nodes[i].nodeName);
-				if (nodes[i].nodeName != "BODY")
-					paraAfter.appendChild(nodes[i]);
-			}
-	*/
-			paraAfter.innerHTML = contents.firstChild.innerHTML;
-		} else
-			paraAfter.appendChild(contents);
-
-		// Check if it's a empty paragraph
-		if (isEmpty(paraBefore))
-			paraBefore.innerHTML = "&nbsp;";
-
-		// Check if it's a empty paragraph
-		if (isEmpty(paraAfter))
-			paraAfter.innerHTML = "&nbsp;";
-
-		// Create a range around everything
-		rng = doc.createRange();
-
-		if (!startChop.previousSibling && startChop.parentNode.nodeName.toUpperCase() == blockName) {
-			rng.setStartBefore(startChop.parentNode);
-		} else {
-			if (rngBefore.startContainer.nodeName.toUpperCase() == blockName && rngBefore.startOffset == 0)
-				rng.setStartBefore(rngBefore.startContainer);
-			else
-				rng.setStart(rngBefore.startContainer, rngBefore.startOffset);
-		}
-
-		if (!endChop.nextSibling && endChop.parentNode.nodeName.toUpperCase() == blockName)
-			rng.setEndAfter(endChop.parentNode);
-		else
-			rng.setEnd(rngAfter.endContainer, rngAfter.endOffset);
-
-		// Delete all contents and insert new paragraphs
-		rng.deleteContents();
-
-		if (tinyMCE.isOpera) {
-			rng.insertNode(paraBefore);
-			rng.insertNode(paraAfter);
-		} else {
-			rng.insertNode(paraAfter);
-			rng.insertNode(paraBefore);
-		}
-
-		//tinyMCE.debug("2", paraBefore.innerHTML, paraAfter.innerHTML);
-
-		// Normalize
-		paraAfter.normalize();
-		paraBefore.normalize();
-
-		inst.selection.moveToBookmark(b);
-		inst.selection.selectNode(paraAfter, true, true);
-
-		return true;
-	},
-
-	_handleBackSpace : function(inst) {
-		var r = inst.getRng(), sn = r.startContainer, nv, s = false;
-
-		// Added body check for bug #1527787
-		if (sn && sn.nextSibling && sn.nextSibling.nodeName == "BR" && sn.parentNode.nodeName != "BODY") {
-			nv = sn.nodeValue;
-
-			// Handle if a backspace is pressed after a space character #bug 1466054 removed since fix for #1527787
-			/*if (nv != null && nv.length >= r.startOffset && nv.charAt(r.startOffset - 1) == ' ')
-				s = true;*/
-
-			// Only remove BRs if we are at the end of line #bug 1464152
-			if (nv != null && r.startOffset == nv.length)
-				sn.nextSibling.parentNode.removeChild(sn.nextSibling);
-		}
-
-		if (inst.settings.auto_resize)
-			inst.resizeToContent();
-
-		return s;
-	}
-
-	};
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_Layer.class.js */
-
-function TinyMCE_Layer(id, bm) {
-	this.id = id;
-	this.blockerElement = null;
-	this.events = false;
-	this.element = null;
-	this.blockMode = typeof(bm) != 'undefined' ? bm : true;
-	this.doc = document;
-};
-
-TinyMCE_Layer.prototype = {
-	moveRelativeTo : function(re, p) {
-		var rep = this.getAbsPosition(re);
-		var w = parseInt(re.offsetWidth);
-		var h = parseInt(re.offsetHeight);
-		var e = this.getElement();
-		var ew = parseInt(e.offsetWidth);
-		var eh = parseInt(e.offsetHeight);
-		var x, y;
-
-		switch (p) {
-			case "tl":
-				x = rep.absLeft;
-				y = rep.absTop;
-				break;
-
-			case "tr":
-				x = rep.absLeft + w;
-				y = rep.absTop;
-				break;
-
-			case "bl":
-				x = rep.absLeft;
-				y = rep.absTop + h;
-				break;
-
-			case "br":
-				x = rep.absLeft + w;
-				y = rep.absTop + h;
-				break;
-
-			case "cc":
-				x = rep.absLeft + (w / 2) - (ew / 2);
-				y = rep.absTop + (h / 2) - (eh / 2);
-				break;
-		}
-
-		this.moveTo(x, y);
-	},
-
-	moveBy : function(x, y) {
-		var e = this.getElement();
-		this.moveTo(parseInt(e.style.left) + x, parseInt(e.style.top) + y);
-	},
-
-	moveTo : function(x, y) {
-		var e = this.getElement();
-
-		e.style.left = x + "px";
-		e.style.top = y + "px";
-
-		this.updateBlocker();
-	},
-
-	resizeBy : function(w, h) {
-		var e = this.getElement();
-		this.resizeTo(parseInt(e.style.width) + w, parseInt(e.style.height) + h);
-	},
-
-	resizeTo : function(w, h) {
-		var e = this.getElement();
-
-		if (w != null)
-			e.style.width = w + "px";
-
-		if (h != null)
-			e.style.height = h + "px";
-
-		this.updateBlocker();
-	},
-
-	show : function() {
-		var el = this.getElement();
-
-		if (el) {
-			el.style.display = 'block';
-			this.updateBlocker();
-		}
-	},
-
-	hide : function() {
-		var el = this.getElement();
-
-		if (el) {
-			el.style.display = 'none';
-			this.updateBlocker();
-		}
-	},
-
-	isVisible : function() {
-		return this.getElement().style.display == 'block';
-	},
-
-	getElement : function() {
-		if (!this.element)
-			this.element = this.doc.getElementById(this.id);
-
-		return this.element;
-	},
-
-	setBlockMode : function(s) {
-		this.blockMode = s;
-	},
-
-	updateBlocker : function() {
-		var e, b, x, y, w, h;
-
-		b = this.getBlocker();
-		if (b) {
-			if (this.blockMode) {
-				e = this.getElement();
-				x = this.parseInt(e.style.left);
-				y = this.parseInt(e.style.top);
-				w = this.parseInt(e.offsetWidth);
-				h = this.parseInt(e.offsetHeight);
-
-				b.style.left = x + 'px';
-				b.style.top = y + 'px';
-				b.style.width = w + 'px';
-				b.style.height = h + 'px';
-				b.style.display = e.style.display;
-			} else
-				b.style.display = 'none';
-		}
-	},
-
-	getBlocker : function() {
-		var d, b;
-
-		if (!this.blockerElement && this.blockMode) {
-			d = this.doc;
-			b = d.getElementById(this.id + "_blocker");
-
-			if (!b) {
-				b = d.createElement("iframe");
-
-				b.setAttribute('id', this.id + "_blocker");
-				b.style.cssText = 'display: none; position: absolute; left: 0; top: 0';
-				b.src = 'javascript:false;';
-				b.frameBorder = '0';
-				b.scrolling = 'no';
-	
-				d.body.appendChild(b);
-			}
-
-			this.blockerElement = b;
-		}
-
-		return this.blockerElement;
-	},
-
-	getAbsPosition : function(n) {
-		var p = {absLeft : 0, absTop : 0};
-
-		while (n) {
-			p.absLeft += n.offsetLeft;
-			p.absTop += n.offsetTop;
-			n = n.offsetParent;
-		}
-
-		return p;
-	},
-
-	create : function(n, c, p, h) {
-		var d = this.doc, e = d.createElement(n);
-
-		e.setAttribute('id', this.id);
-
-		if (c)
-			e.className = c;
-
-		if (!p)
-			p = d.body;
-
-		if (h)
-			e.innerHTML = h;
-
-		p.appendChild(e);
-
-		return this.element = e;
-	},
-
-	exists : function() {
-		return this.doc.getElementById(this.id) != null;
-	},
-
-	parseInt : function(s) {
-		if (s == null || s == '')
-			return 0;
-
-		return parseInt(s);
-	},
-
-	remove : function() {
-		var e = this.getElement(), b = this.getBlocker();
-
-		if (e)
-			e.parentNode.removeChild(e);
-
-		if (b)
-			b.parentNode.removeChild(b);
-	}
-
-	};
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_Menu.class.js */
-
-function TinyMCE_Menu() {
-	var id;
-
-	if (typeof(tinyMCE.menuCounter) == "undefined")
-		tinyMCE.menuCounter = 0;
-
-	id = "mc_menu_" + tinyMCE.menuCounter++;
-
-	TinyMCE_Layer.call(this, id, true);
-
-	this.id = id;
-	this.items = new Array();
-	this.needsUpdate = true;
-};
-
-TinyMCE_Menu.prototype = tinyMCE.extend(TinyMCE_Layer.prototype, {
-	init : function(s) {
-		var n;
-
-		// Default params
-		this.settings = {
-			separator_class : 'mceMenuSeparator',
-			title_class : 'mceMenuTitle',
-			disabled_class : 'mceMenuDisabled',
-			menu_class : 'mceMenu',
-			drop_menu : true
-		};
-
-		for (n in s)
-			this.settings[n] = s[n];
-
-		this.create('div', this.settings.menu_class);
-	},
-
-	clear : function() {
-		this.items = new Array();
-	},
-
-	addTitle : function(t) {
-		this.add({type : 'title', text : t});
-	},
-
-	addDisabled : function(t) {
-		this.add({type : 'disabled', text : t});
-	},
-
-	addSeparator : function() {
-		this.add({type : 'separator'});
-	},
-
-	addItem : function(t, js) {
-		this.add({text : t, js : js});
-	},
-
-	add : function(mi) {
-		this.items[this.items.length] = mi;
-		this.needsUpdate = true;
-	},
-
-	update : function() {
-		var e = this.getElement(), h = '', i, t, m = this.items, s = this.settings;
-
-		if (this.settings.drop_menu)
-			h += '<span class="mceMenuLine"></span>';
-
-		h += '<table border="0" cellpadding="0" cellspacing="0">';
-
-		for (i=0; i<m.length; i++) {
-			t = tinyMCE.xmlEncode(m[i].text);
-			c = m[i].class_name ? ' class="' + m[i].class_name + '"' : '';
-
-			switch (m[i].type) {
-				case 'separator':
-					h += '<tr class="' + s.separator_class + '"><td>';
-					break;
-
-				case 'title':
-					h += '<tr class="' + s.title_class + '"><td><span' + c +'>' + t + '</span>';
-					break;
-
-				case 'disabled':
-					h += '<tr class="' + s.disabled_class + '"><td><span' + c +'>' + t + '</span>';
-					break;
-
-				default:
-					h += '<tr><td><a href="' + tinyMCE.xmlEncode(m[i].js) + '" onmousedown="' + tinyMCE.xmlEncode(m[i].js) + ';return tinyMCE.cancelEvent(event);" onclick="return tinyMCE.cancelEvent(event);" onmouseup="return tinyMCE.cancelEvent(event);"><span' + c +'>' + t + '</span></a>';
-			}
-
-			h += '</td></tr>';
-		}
-
-		h += '</table>';
-
-		e.innerHTML = h;
-
-		this.needsUpdate = false;
-		this.updateBlocker();
-	},
-
-	show : function() {
-		var nl, i;
-
-		if (tinyMCE.lastMenu == this)
-			return;
-
-		if (this.needsUpdate)
-			this.update();
-
-		if (tinyMCE.lastMenu && tinyMCE.lastMenu != this)
-			tinyMCE.lastMenu.hide();
-
-		TinyMCE_Layer.prototype.show.call(this);
-
-		if (!tinyMCE.isOpera) {
-			// Accessibility stuff
-/*			nl = this.getElement().getElementsByTagName("a");
-			if (nl.length > 0)
-				nl[0].focus();*/
-		}
-
-		tinyMCE.lastMenu = this;
-	}
-
-	});
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_Compatibility.class.js */
-
-if (!Function.prototype.call) {
-	Function.prototype.call = function() {
-		var a = arguments, s = a[0], i, as = '', r, o;
-
-		for (i=1; i<a.length; i++)
-			as += (i > 1 ? ',' : '') + 'a[' + i + ']';
-
-		o = s._fu;
-		s._fu = this;
-		r = eval('s._fu(' + as + ')');
-		s._fu = o;
-
-		return r;
-	};
-};
-
-/* file:jscripts/tiny_mce/classes/TinyMCE_Debug.class.js */
-
-TinyMCE_Engine.prototype.debug = function() {
-	var m = "", a, i, l = tinyMCE.log.length;
-
-	for (i=0, a = this.debug.arguments; i<a.length; i++) {
-		m += a[i];
-
-		if (i<a.length-1)
-			m += ', ';
-	}
-
-	if (l < 1000)
-		tinyMCE.log[l] = "[debug] " + m;
-};
-
+var tinymce={majorVersion:'3',minorVersion:'0.6',releaseDate:'2008-03-xx',_init:function(){var t=this,ua=navigator.userAgent,i,nl,n,base;t.isOpera=window.opera&&opera.buildNumber;t.isWebKit=/WebKit/.test(ua);t.isOldWebKit=t.isWebKit&&!window.getSelection().getRangeAt;t.isIE=!t.isWebKit&&!t.isOpera&&(/MSIE/gi).test(ua)&&(/Explorer/gi).test(navigator.appName);t.isIE6=t.isIE&&/MSIE [56]/.test(ua);t.isGecko=!t.isWebKit&&/Gecko/.test(ua);t.isMac=ua.indexOf('Mac')!=-1;if(window.tinyMCEPreInit){t.suffix=tinyMCEPreInit.suffix;t.baseURL=tinyMCEPreInit.base;return;}t.suffix='';nl=document.getElementsByTagName('base');for(i=0;i<nl.length;i++){if(nl[i].href)base=nl[i].href;}function getBase(n){if(n.src&&/tiny_mce(|_dev|_src|_gzip|_jquery|_prototype).js/.test(n.src)){if(/_(src|dev)\.js/g.test(n.src))t.suffix='_src';t.baseURL=n.src.substring(0,n.src.lastIndexOf('/'));if(base&&t.baseURL.indexOf('://')==-1)t.baseURL=base+t.baseURL;return t.baseURL;}return null;};nl=document.getElementsByTagName('script');for(i=0;i<nl.length;i++){if(getBase(nl[i]))return;}n=document.getElementsByTagName('head')[0];if(n){nl=n.getElementsByTagName('script');for(i=0;i<nl.length;i++){if(getBase(nl[i]))return;}}return;},is:function(o,t){var n=typeof(o);if(!t)return n!='undefined';if(t=='array'&&(o instanceof Array))return true;return n==t;},each:function(o,cb,s){var n,l;if(!o)return 0;s=s||o;if(typeof(o.length)!='undefined'){for(n=0,l=o.length;n<l;n++){if(cb.call(s,o[n],n,o)===false)return 0;}}else{for(n in o){if(o.hasOwnProperty(n)){if(cb.call(s,o[n],n,o)===false)return 0;}}}return 1;},map:function(a,f){var o=[];tinymce.each(a,function(v){o.push(f(v));});return o;},grep:function(a,f){var o=[];tinymce.each(a,function(v){if(!f||f(v))o.push(v);});return o;},inArray:function(a,v){var i,l;if(a){for(i=0,l=a.length;i<l;i++){if(a[i]===v)return i;}}return-1;},extend:function(o,e){var i,a=arguments;for(i=1;i<a.length;i++){e=a[i];tinymce.each(e,function(v,n){if(typeof(v)!=='undefined')o[n]=v;});}return o;},trim:function(s){return(s?''+s:'').replace(/^\s*|\s*$/g,'');},create:function(s,p){var t=this,sp,ns,cn,scn,c,de=0;s=/^((static) )?([\w.]+)(:([\w.]+))?/.exec(s);cn=s[3].match(/(^|\.)(\w+)$/i)[2];ns=t.createNS(s[3].replace(/\.\w+$/,''));if(ns[cn])return;if(s[2]=='static'){ns[cn]=p;if(this.onCreate)this.onCreate(s[2],s[3],ns[cn]);return;}if(!p[cn]){p[cn]=function(){};de=1;}ns[cn]=p[cn];t.extend(ns[cn].prototype,p);if(s[5]){sp=t.resolve(s[5]).prototype;scn=s[5].match(/\.(\w+)$/i)[1];c=ns[cn];if(de){ns[cn]=function(){return sp[scn].apply(this,arguments);};}else{ns[cn]=function(){this.parent=sp[scn];return c.apply(this,arguments);};}ns[cn].prototype[cn]=ns[cn];t.each(sp,function(f,n){ns[cn].prototype[n]=sp[n];});t.each(p,function(f,n){if(sp[n]){ns[cn].prototype[n]=function(){this.parent=sp[n];return f.apply(this,arguments);};}else{if(n!=cn)ns[cn].prototype[n]=f;}});}t.each(p['static'],function(f,n){ns[cn][n]=f;});if(this.onCreate)this.onCreate(s[2],s[3],ns[cn].prototype);},walk:function(o,f,n,s){s=s||this;if(o){if(n)o=o[n];tinymce.each(o,function(o,i){if(f.call(s,o,i,n)===false)return false;tinymce.walk(o,f,n,s);});}},createNS:function(n,o){var i,v;o=o||window;n=n.split('.');for(i=0;i<n.length;i++){v=n[i];if(!o[v])o[v]={};o=o[v];}return o;},resolve:function(n,o){var i,l;o=o||window;n=n.split('.');for(i=0,l=n.length;i<l;i++){o=o[n[i]];if(!o)break;}return o;},addUnload:function(f,s){var t=this,w=window,unload;f={func:f,scope:s||this};if(!t.unloads){unload=function(){var li=t.unloads,o,n;for(n in li){o=li[n];if(o&&o.func)o.func.call(o.scope);}if(w.detachEvent)w.detachEvent('onunload',unload);else if(w.removeEventListener)w.removeEventListener('unload',unload,false);o=li=w=unload=null;if(window.CollectGarbage)window.CollectGarbage();};if(w.attachEvent)w.attachEvent('onunload',unload);else if(w.addEventListener)w.addEventListener('unload',unload,false);t.unloads=[f];}else t.unloads.push(f);return f;},removeUnload:function(f){var u=this.unloads,r=null;tinymce.each(u,function(o,i){if(o&&o.func==f){u.splice(i,1);r=f;return false;}});return r;},explode:function(s,d){return tinymce.map(s.split(d||','),tinymce.trim);}};window.tinymce=tinymce;tinymce._init();tinymce.create('tinymce.util.Dispatcher',{scope:null,listeners:null,Dispatcher:function(s){this.scope=s||this;this.listeners=[];},add:function(cb,s){this.listeners.push({cb:cb,scope:s||this.scope});return cb;},addToTop:function(cb,s){this.listeners.unshift({cb:cb,scope:s||this.scope});return cb;},remove:function(cb){var l=this.listeners,o=null;tinymce.each(l,function(c,i){if(cb==c.cb){o=cb;l.splice(i,1);return false;}});return o;},dispatch:function(){var s,a=arguments,i,li=this.listeners,c;for(i=0;i<li.length;i++){c=li[i];s=c.cb.apply(c.scope,a);if(s===false)break;}return s;}});(function(){var each=tinymce.each;tinymce.create('tinymce.util.URI',{URI:function(u,s){var t=this,o,a,b;s=t.settings=s||{};if(/^(mailto|news|javascript|about):/i.test(u)||/^\s*#/.test(u)){t.source=u;return;}if(u.indexOf('/')===0&&u.indexOf('//')!==0)u=(s.base_uri?s.base_uri.protocol||'http':'http')+'://mce_host'+u;if(u.indexOf('://')===-1&&u.indexOf('//')!==0)u=(s.base_uri.protocol||'http')+'://mce_host'+t.toAbsPath(s.base_uri.path,u);u=u.replace(/@@/g,'(mce_at)');u=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(u);each(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],function(v,i){var s=u[i];if(s)s=s.replace(/\(mce_at\)/g,'@@');t[v]=s;});if(b=s.base_uri){if(!t.protocol)t.protocol=b.protocol;if(!t.userInfo)t.userInfo=b.userInfo;if(!t.port&&t.host=='mce_host')t.port=b.port;if(!t.host||t.host=='mce_host')t.host=b.host;t.source='';}},setPath:function(p){var t=this;p=/^(.*?)\/?(\w+)?$/.exec(p);t.path=p[0];t.directory=p[1];t.file=p[2];t.source='';t.getURI();},toRelative:function(u){var t=this,o;u=new tinymce.util.URI(u,{base_uri:t});if((u.host!='mce_host'&&t.host!=u.host&&u.host)||t.port!=u.port||t.protocol!=u.protocol)return u.getURI();o=t.toRelPath(t.path,u.path);if(u.query)o+='?'+u.query;if(u.anchor)o+='#'+u.anchor;return o;},toAbsolute:function(u,nh){var u=new tinymce.util.URI(u,{base_uri:this});return u.getURI(this.host==u.host?nh:0);},toRelPath:function(base,path){var items,bp=0,out='',i;base=base.substring(0,base.lastIndexOf('/'));base=base.split('/');items=path.split('/');if(base.length>=items.length){for(i=0;i<base.length;i++){if(i>=items.length||base[i]!=items[i]){bp=i+1;break;}}}if(base.length<items.length){for(i=0;i<items.length;i++){if(i>=base.length||base[i]!=items[i]){bp=i+1;break;}}}if(bp==1)return path;for(i=0;i<base.length-(bp-1);i++)out+="../";for(i=bp-1;i<items.length;i++){if(i!=bp-1)out+="/"+items[i];else out+=items[i];}return out;},toAbsPath:function(base,path){var i,nb=0,o=[];base=base.split('/');path=path.split('/');each(base,function(k){if(k)o.push(k);});base=o;for(i=path.length-1,o=[];i>=0;i--){if(path[i].length==0||path[i]==".")continue;if(path[i]=='..'){nb++;continue;}if(nb>0){nb--;continue;}o.push(path[i]);}i=base.length-nb;if(i<=0)return'/'+o.reverse().join('/');return'/'+base.slice(0,i).join('/')+'/'+o.reverse().join('/');},getURI:function(nh){var s,t=this;if(!t.source||nh){s='';if(!nh){if(t.protocol)s+=t.protocol+'://';if(t.userInfo)s+=t.userInfo+'@';if(t.host)s+=t.host;if(t.port)s+=':'+t.port;}if(t.path)s+=t.path;if(t.query)s+='?'+t.query;if(t.anchor)s+='#'+t.anchor;t.source=s;}return t.source;}});})();(function(){var each=tinymce.each;tinymce.create('static tinymce.util.Cookie',{getHash:function(n){var v=this.get(n),h;if(v){each(v.split('&'),function(v){v=v.split('=');h=h||{};h[unescape(v[0])]=unescape(v[1]);});}return h;},setHash:function(n,v,e,p,d,s){var o='';each(v,function(v,k){o+=(!o?'':'&')+escape(k)+'='+escape(v);});this.set(n,o,e,p,d,s);},get:function(n){var c=document.cookie,e,p=n+"=",b;if(!c)return;b=c.indexOf("; "+p);if(b==-1){b=c.indexOf(p);if(b!=0)return null;}else b+=2;e=c.indexOf(";",b);if(e==-1)e=c.length;return unescape(c.substring(b+p.length,e));},set:function(n,v,e,p,d,s){document.cookie=n+"="+escape(v)+((e)?"; expires="+e.toGMTString():"")+((p)?"; path="+escape(p):"")+((d)?"; domain="+d:"")+((s)?"; secure":"");},remove:function(n,p){var d=new Date();d.setTime(d.getTime()-1000);this.set(n,'',d,p,d);}});})();tinymce.create('static tinymce.util.JSON',{serialize:function(o){var i,v,s=tinymce.util.JSON.serialize,t;if(o==null)return'null';t=typeof o;if(t=='string'){v='\bb\tt\nn\ff\rr\""\'\'\\\\';return'"'+o.replace(/([\u0080-\uFFFF\x00-\x1f\"\'])/g,function(a,b){i=v.indexOf(b);if(i+1)return'\\'+v.charAt(i+1);a=b.charCodeAt().toString(16);return'\\u'+'0000'.substring(a.length)+a;})+'"';}if(t=='object'){if(o instanceof Array){for(i=0,v='[';i<o.length;i++)v+=(i>0?',':'')+s(o[i]);return v+']';}v='{';for(i in o)v+=typeof o[i]!='function'?(v.length>1?',"':'"')+i+'":'+s(o[i]):'';return v+'}';}return''+o;},parse:function(s){try{return eval('('+s+')');}catch(ex){}}});tinymce.create('static tinymce.util.XHR',{send:function(o){var x,t,w=window,c=0;o.scope=o.scope||this;o.success_scope=o.success_scope||o.scope;o.error_scope=o.error_scope||o.scope;o.async=o.async===false?false:true;o.data=o.data||'';function get(s){x=0;try{x=new ActiveXObject(s);}catch(ex){}return x;};x=w.XMLHttpRequest?new XMLHttpRequest():get('Microsoft.XMLHTTP')||get('Msxml2.XMLHTTP');if(x){if(x.overrideMimeType)x.overrideMimeType(o.content_type);x.open(o.type||(o.data?'POST':'GET'),o.url,o.async);if(o.content_type)x.setRequestHeader('Content-Type',o.content_type);x.send(o.data);t=w.setInterval(function(){if(x.readyState==4||c++>10000){w.clearInterval(t);if(o.success&&c<10000&&x.status==200)o.success.call(o.success_scope,''+x.responseText,x,o);else if(o.error)o.error.call(o.error_scope,c>10000?'TIMED_OUT':'GENERAL',x,o);x=null;}},10);}}});(function(){var extend=tinymce.extend,JSON=tinymce.util.JSON,XHR=tinymce.util.XHR;tinymce.create('tinymce.util.JSONRequest',{JSONRequest:function(s){this.settings=extend({},s);this.count=0;},send:function(o){var ecb=o.error,scb=o.success;o=extend(this.settings,o);o.success=function(c,x){c=JSON.parse(c);if(typeof(c)=='undefined'){c={error:'JSON Parse error.'};}if(c.error)ecb.call(o.error_scope||o.scope,c.error,x);else scb.call(o.success_scope||o.scope,c.result);};o.error=function(ty,x){ecb.call(o.error_scope||o.scope,ty,x);};o.data=JSON.serialize({id:o.id||'c'+(this.count++),method:o.method,params:o.params});o.content_type='application/json';XHR.send(o);},'static':{sendRPC:function(o){return new tinymce.util.JSONRequest().send(o);}}});}());(function(){var each=tinymce.each,is=tinymce.is;var isWebKit=tinymce.isWebKit,isIE=tinymce.isIE;tinymce.create('tinymce.dom.DOMUtils',{doc:null,root:null,files:null,listeners:{},pixelStyles:/^(top|left|bottom|right|width|height|borderWidth)$/,cache:{},idPattern:/^#[\w]+$/,elmPattern:/^[\w_*]+$/,elmClassPattern:/^([\w_]*)\.([\w_]+)$/,DOMUtils:function(d,s){var t=this;t.doc=d;t.files={};t.cssFlicker=false;t.counter=0;t.boxModel=!tinymce.isIE||d.compatMode=="CSS1Compat";t.stdMode=d.documentMode===8;this.settings=s=tinymce.extend({keep_values:false,hex_colors:1,process_html:1},s);if(tinymce.isIE6){try{d.execCommand('BackgroundImageCache',false,true);}catch(e){t.cssFlicker=true;}}tinymce.addUnload(function(){t.doc=t.root=null;});},getRoot:function(){var t=this,s=t.settings;return(s&&t.get(s.root_element))||t.doc.body;},getViewPort:function(w){var d,b;w=!w?window:w;d=w.document;b=this.boxModel?d.documentElement:d.body;return{x:w.pageXOffset||b.scrollLeft,y:w.pageYOffset||b.scrollTop,w:w.innerWidth||b.clientWidth,h:w.innerHeight||b.clientHeight};},getRect:function(e){var p,t=this,w,h;e=t.get(e);p=t.getPos(e);w=t.getStyle(e,'width');h=t.getStyle(e,'height');if(w.indexOf('px')===-1)w=0;if(h.indexOf('px')===-1)h=0;return{x:p.x,y:p.y,w:parseInt(w)||e.offsetWidth||e.clientWidth,h:parseInt(h)||e.offsetHeight||e.clientHeight};},getParent:function(n,f,r){var na,se=this.settings;n=this.get(n);if(se.strict_root)r=r||this.getRoot();if(is(f,'string')){na=f.toUpperCase();f=function(n){var s=false;if(n.nodeType==1&&na==='*'){s=true;return false;}each(na.split(','),function(v){if(n.nodeType==1&&((se.strict&&n.nodeName.toUpperCase()==v)||n.nodeName==v)){s=true;return false;}});return s;};}while(n){if(n==r)return null;if(f(n))return n;n=n.parentNode;}return null;},get:function(e){var n;if(typeof(e)=='string'){n=e;e=this.doc.getElementById(e);if(e&&e.id!==n)return this.doc.getElementsByName(n)[1];}return e;},select:function(pa,s){var t=this,cs,c,pl,o=[],x,i,l,n;s=t.get(s)||t.doc;if(s.querySelectorAll){if(s!=t.doc){i=s.id;s.id='_mc_tmp';pa='#_mc_tmp '+pa;}l=tinymce.grep(s.querySelectorAll(pa));s.id=i;return l;}if(t.settings.strict){function get(s,n){return s.getElementsByTagName(n.toLowerCase());};}else{function get(s,n){return s.getElementsByTagName(n);};}if(t.elmPattern.test(pa)){x=get(s,pa);for(i=0,l=x.length;i<l;i++)o.push(x[i]);return o;}if(t.elmClassPattern.test(pa)){pl=t.elmClassPattern.exec(pa);x=get(s,pl[1]||'*');c=' '+pl[2]+' ';for(i=0,l=x.length;i<l;i++){n=x[i];if(n.className&&(' '+n.className+' ').indexOf(c)!==-1)o.push(n);}return o;}function collect(n){if(!n.mce_save){n.mce_save=1;o.push(n);}};function collectIE(n){if(!n.getAttribute('mce_save')){n.setAttribute('mce_save','1');o.push(n);}};function find(n,f,r){var i,l,nl=get(r,n);for(i=0,l=nl.length;i<l;i++)f(nl[i]);};each(pa.split(','),function(v,i){v=tinymce.trim(v);if(t.elmPattern.test(v)){each(get(s,v),function(n){collect(n);});return;}if(t.elmClassPattern.test(v)){x=t.elmClassPattern.exec(v);each(get(s,x[1]),function(n){if(t.hasClass(n,x[2]))collect(n);});return;}if(!(cs=t.cache[pa])){cs='x=(function(cf, s) {';pl=v.split(' ');each(pl,function(v){var p=/^([\w\\*]+)?(?:#([\w\\]+))?(?:\.([\w\\\.]+))?(?:\[\@([\w\\]+)([\^\$\*!]?=)([\w\\]+)\])?(?:\:([\w\\]+))?/i.exec(v);p[1]=p[1]||'*';cs+='find("'+p[1]+'", function(n) {';if(p[2])cs+='if (n.id !== "'+p[2]+'") return;';if(p[3]){cs+='var c = " " + n.className + " ";';cs+='if (';c='';each(p[3].split('.'),function(v){if(v)c+=(c?'||':'')+'c.indexOf(" '+v+' ") === -1';});cs+=c+') return;';}});cs+='cf(n);';for(i=pl.length-1;i>=0;i--)cs+='}, '+(i?'n':'s')+');';cs+='})';t.cache[pa]=cs=eval(cs);}cs(isIE?collectIE:collect,s);});each(o,function(n){if(isIE)n.removeAttribute('mce_save');else delete n.mce_save;});return o;},add:function(p,n,a,h,c){var t=this;return this.run(p,function(p){var e,k;e=is(n,'string')?t.doc.createElement(n):n;if(a){for(k in a){if(a.hasOwnProperty(k)&&!is(a[k],'object'))t.setAttrib(e,k,''+a[k]);}if(a.style&&!is(a.style,'string')){each(a.style,function(v,n){t.setStyle(e,n,v);});}}if(h){if(h.nodeType)e.appendChild(h);else t.setHTML(e,h);}return!c?p.appendChild(e):e;});},create:function(n,a,h){return this.add(this.doc.createElement(n),n,a,h,1);},createHTML:function(n,a,h){var o='',t=this,k;o+='<'+n;for(k in a){if(a.hasOwnProperty(k))o+=' '+k+'="'+t.encode(a[k])+'"';}if(tinymce.is(h))return o+'>'+h+'</'+n+'>';return o+' />';},remove:function(n,k){return this.run(n,function(n){var p;p=n.parentNode;if(!p)return null;if(k){each(n.childNodes,function(c){p.insertBefore(c.cloneNode(true),n);});}return p.removeChild(n);});},setStyle:function(n,na,v){var t=this;return t.run(n,function(e){var s,i;s=e.style;na=na.replace(/-(\D)/g,function(a,b){return b.toUpperCase();});if(t.pixelStyles.test(na)&&(tinymce.is(v,'number')||/^[\-0-9\.]+$/.test(v)))v+='px';switch(na){case'opacity':if(isIE){s.filter=v===''?'':"alpha(opacity="+(v*100)+")";if(!n.currentStyle||!n.currentStyle.hasLayout)s.display='inline-block';}s[na]=s['-moz-opacity']=s['-khtml-opacity']=v||'';break;case'float':isIE?s.styleFloat=v:s.cssFloat=v;break;default:s[na]=v||'';}if(t.settings.update_styles)t.setAttrib(e,'mce_style');});},getStyle:function(n,na,c){n=this.get(n);if(!n)return false;if(this.doc.defaultView&&c){na=na.replace(/[A-Z]/g,function(a){return'-'+a;});try{return this.doc.defaultView.getComputedStyle(n,null).getPropertyValue(na);}catch(ex){return null;}}na=na.replace(/-(\D)/g,function(a,b){return b.toUpperCase();});if(na=='float')na=isIE?'styleFloat':'cssFloat';if(n.currentStyle&&c)return n.currentStyle[na];return n.style[na];},setStyles:function(e,o){var t=this,s=t.settings,ol;ol=s.update_styles;s.update_styles=0;each(o,function(v,n){t.setStyle(e,n,v);});s.update_styles=ol;if(s.update_styles)t.setAttrib(e,s.cssText);},setAttrib:function(e,n,v){var t=this;if(t.settings.strict)n=n.toLowerCase();return this.run(e,function(e){var s=t.settings;switch(n){case"style":if(s.keep_values){if(v)e.setAttribute('mce_style',v,2);else e.removeAttribute('mce_style',2);}e.style.cssText=v;break;case"class":e.className=v||'';break;case"src":case"href":if(s.keep_values){if(s.url_converter)v=s.url_converter.call(s.url_converter_scope||t,v,n,e);t.setAttrib(e,'mce_'+n,v,2);}break;}if(is(v)&&v!==null&&v.length!==0)e.setAttribute(n,''+v,2);else e.removeAttribute(n,2);});},setAttribs:function(e,o){var t=this;return this.run(e,function(e){each(o,function(v,n){t.setAttrib(e,n,v);});});},getAttrib:function(e,n,dv){var v,t=this;e=t.get(e);if(!e)return false;if(!is(dv))dv="";if(/^(src|href|style|coords)$/.test(n)){v=e.getAttribute("mce_"+n);if(v)return v;}v=e.getAttribute(n,2);if(!v){switch(n){case'class':v=e.className;break;default:if(isIE&&n==='name'&&e.nodeName==='A'){v=e.name;break;}v=e.attributes[n];v=v&&is(v.nodeValue)?v.nodeValue:v;}}switch(n){case'style':v=v||e.style.cssText;if(v){v=t.serializeStyle(t.parseStyle(v));if(t.settings.keep_values)e.setAttribute('mce_style',v);}break;}if(isWebKit&&n==="class"&&v)v=v.replace(/(apple|webkit)\-[a-z\-]+/gi,'');if(isIE){switch(n){case'rowspan':case'colspan':if(v===1)v='';break;case'size':if(v==='+0')v='';break;case'hspace':if(v===-1)v='';break;case'tabindex':if(v===32768)v='';break;case'shape':v=v.toLowerCase();break;default:if(n.indexOf('on')===0&&v)v=(''+v).replace(/^function\s+anonymous\(\)\s+\{\s+(.*)\s+\}$/,'$1');}}return(v&&v!='')?''+v:dv;},getPos:function(n){var t=this,x=0,y=0,e,d=t.doc,r;n=t.get(n);if(n&&isIE){n=n.getBoundingClientRect();e=t.boxModel?d.documentElement:d.body;x=t.getStyle(t.select('html')[0],'borderWidth');x=(x=='medium'||t.boxModel&&!t.isIE6)&&2||x;n.top+=window.self!=window.top?2:0;return{x:n.left+e.scrollLeft-x,y:n.top+e.scrollTop-x};}r=n;while(r){x+=r.offsetLeft||0;y+=r.offsetTop||0;r=r.offsetParent;}r=n;while(r){if(!/^table-row|inline.*/i.test(t.getStyle(r,"display",1))){x-=r.scrollLeft||0;y-=r.scrollTop||0;}r=r.parentNode;if(r==d.body)break;}return{x:x,y:y};},parseStyle:function(st){var t=this,s=t.settings,o={};if(!st)return o;function compress(p,s,ot){var t,r,b,l;t=o[p+'-top'+s];if(!t)return;r=o[p+'-right'+s];if(t!=r)return;b=o[p+'-bottom'+s];if(r!=b)return;l=o[p+'-left'+s];if(b!=l)return;o[ot]=l;delete o[p+'-top'+s];delete o[p+'-right'+s];delete o[p+'-bottom'+s];delete o[p+'-left'+s];};function compress2(ta,a,b,c){var t;t=o[a];if(!t)return;t=o[b];if(!t)return;t=o[c];if(!t)return;o[ta]=o[a]+' '+o[b]+' '+o[c];delete o[a];delete o[b];delete o[c];};each(st.split(';'),function(v){var sv,ur=[];if(v){v=v.replace(/url\([^\)]+\)/g,function(v){ur.push(v);return'url('+ur.length+')';});v=v.split(':');sv=tinymce.trim(v[1]);sv=sv.replace(/url\(([^\)]+)\)/g,function(a,b){return ur[parseInt(b)-1];});sv=sv.replace(/rgb\([^\)]+\)/g,function(v){return t.toHex(v);});if(s.url_converter){sv=sv.replace(/url\([\'\"]?([^\)\'\"]+)[\'\"]?\)/g,function(x,c){return'url('+t.encode(s.url_converter.call(s.url_converter_scope||t,t.decode(c),'style',null))+')';});}o[tinymce.trim(v[0]).toLowerCase()]=sv;}});compress("border","","border");compress("border","-width","border-width");compress("border","-color","border-color");compress("border","-style","border-style");compress("padding","","padding");compress("margin","","margin");compress2('border','border-width','border-style','border-color');if(isIE){if(o.border=='medium none')o.border='';}return o;},serializeStyle:function(o){var s='';each(o,function(v,k){if(k&&v){switch(k){case'color':case'background-color':v=v.toLowerCase();break;}s+=(s?' ':'')+k+': '+v+';';}});return s;},loadCSS:function(u){var t=this,d=t.doc;if(!u)u='';each(u.split(','),function(u){if(t.files[u])return;t.files[u]=true;t.add(t.select('head')[0],'link',{rel:'stylesheet',href:u});});},addClass:function(e,c){return this.run(e,function(e){var o;if(!c)return 0;if(this.hasClass(e,c))return e.className;o=this.removeClass(e,c);return e.className=(o!=''?(o+' '):'')+c;});},removeClass:function(e,c){var t=this,re;return t.run(e,function(e){var v;if(t.hasClass(e,c)){if(!re)re=new RegExp("(^|\\s+)"+c+"(\\s+|$)","g");v=e.className.replace(re,' ');return e.className=tinymce.trim(v!=' '?v:'');}return e.className;});},hasClass:function(n,c){n=this.get(n);if(!n||!c)return false;return(' '+n.className+' ').indexOf(' '+c+' ')!==-1;},show:function(e){return this.setStyle(e,'display','block');},hide:function(e){return this.setStyle(e,'display','none');},isHidden:function(e){e=this.get(e);return e.style.display=='none'||this.getStyle(e,'display')=='none';},uniqueId:function(p){return(!p?'mce_':p)+(this.counter++);},setHTML:function(e,h){var t=this;return this.run(e,function(e){var x,i,nl,n,p,x;h=t.processHTML(h);if(isIE){function set(){try{e.innerHTML='<br />'+h;e.removeChild(e.firstChild);}catch(ex){while(e.firstChild)e.firstChild.removeNode();x=t.create('div');x.innerHTML='<br />'+h;each(x.childNodes,function(n,i){if(i)e.appendChild(n);});}};if(t.settings.fix_ie_paragraphs)h=h.replace(/<p><\/p>|<p([^>]+)><\/p>|<p[^\/+]\/>/gi,'<p$1 mce_keep="true">&nbsp;</p>');set();if(t.settings.fix_ie_paragraphs){nl=e.getElementsByTagName("p");for(i=nl.length-1,x=0;i>=0;i--){n=nl[i];if(!n.hasChildNodes()){if(!n.mce_keep){x=1;break;}n.removeAttribute('mce_keep');}}}if(x){h=h.replace(/<p([^>]+)>|<p>/g,'<div$1 mce_tmp="1">');h=h.replace(/<\/p>/g,'</div>');set();if(t.settings.fix_ie_paragraphs){nl=e.getElementsByTagName("DIV");for(i=nl.length-1;i>=0;i--){n=nl[i];if(n.mce_tmp){p=t.doc.createElement('p');n.cloneNode(false).outerHTML.replace(/([a-z0-9\-_]+)=/gi,function(a,b){var v;if(b!=='mce_tmp'){v=n.getAttribute(b);if(!v&&b==='class')v=n.className;p.setAttribute(b,v);}});for(x=0;x<n.childNodes.length;x++)p.appendChild(n.childNodes[x].cloneNode(true));n.swapNode(p);}}}}}else e.innerHTML=h;return h;});},processHTML:function(h){var t=this,s=t.settings;if(!s.process_html)return h;if(tinymce.isGecko){h=h.replace(/<(\/?)strong>|<strong( [^>]+)>/gi,'<$1b$2>');h=h.replace(/<(\/?)em>|<em( [^>]+)>/gi,'<$1i$2>');}h=h.replace(/<a( )([^>]+)\/>|<a\/>/gi,'<a$1$2></a>');if(s.keep_values){if(h.indexOf('<script')!==-1){h=h.replace(/<script>/g,'<script type="text/javascript">');h=h.replace(/<script(|[^>]+)>(\s*<!--|\/\/\s*<\[CDATA\[)?[\r\n]*/g,'<mce:script$1><!--\n');h=h.replace(/\s*(\/\/\s*-->|\/\/\s*]]>)?<\/script>/g,'\n// --></mce:script>');h=h.replace(/<mce:script(|[^>]+)><!--\n\/\/ --><\/mce:script>/g,'<mce:script$1></mce:script>');}h=h.replace(/<([\w:]+) [^>]*(src|href|style|coords)[^>]*>/gi,function(a,n){function handle(m,b,c){var u=c;if(a.indexOf('mce_'+b)!=-1)return m;if(b=='style'){if(s.hex_colors){u=u.replace(/rgb\([^\)]+\)/g,function(v){return t.toHex(v);});}if(s.url_converter){u=u.replace(/url\([\'\"]?([^\)\'\"]+)\)/g,function(x,c){return'url('+t.encode(s.url_converter.call(s.url_converter_scope||t,t.decode(c),b,n))+')';});}}else if(b!='coords'){if(s.url_converter)u=t.encode(s.url_converter.call(s.url_converter_scope||t,t.decode(c),b,n));}return' '+b+'="'+c+'" mce_'+b+'="'+u+'"';};a=a.replace(/ (src|href|style|coords)=[\"]([^\"]+)[\"]/gi,handle);a=a.replace(/ (src|href|style|coords)=[\']([^\']+)[\']/gi,handle);return a.replace(/ (src|href|style|coords)=([^\s\"\'>]+)/gi,handle);});}return h;},getOuterHTML:function(e){var d;e=this.get(e);if(!e)return null;if(isIE)return e.outerHTML;d=(e.ownerDocument||this.doc).createElement("body");d.appendChild(e.cloneNode(true));return d.innerHTML;},setOuterHTML:function(e,h,d){var t=this;return this.run(e,function(e){var n,tp;e=t.get(e);d=d||e.ownerDocument||t.doc;if(isIE&&e.nodeType==1)e.outerHTML=h;else{tp=d.createElement("body");tp.innerHTML=h;n=tp.lastChild;while(n){t.insertAfter(n.cloneNode(true),e);n=n.previousSibling;}t.remove(e);}});},decode:function(s){var e;if(/&[^;]+;/.test(s)){e=this.doc.createElement("div");e.innerHTML=s;return!e.firstChild?s:e.firstChild.nodeValue;}return s;},encode:function(s){return s?(''+s).replace(/[<>&\"]/g,function(c,b){switch(c){case'&':return'&amp;';case'"':return'&quot;';case'<':return'&lt;';case'>':return'&gt;';}return c;}):s;},insertAfter:function(n,r){var t=this;r=t.get(r);return this.run(n,function(n){var p,ns;p=r.parentNode;ns=r.nextSibling;if(ns)p.insertBefore(n,ns);else p.appendChild(n);return n;});},isBlock:function(n){if(n.nodeType&&n.nodeType!==1)return false;n=n.nodeName||n;return/^(H[1-6]|HR|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|FORM|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP)$/.test(n);},replace:function(n,o,k){if(is(o,'array'))n=n.cloneNode(true);return this.run(o,function(o){if(k){each(o.childNodes,function(c){n.appendChild(c.cloneNode(true));});}return o.parentNode.replaceChild(n,o);});},toHex:function(s){var c=/^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(s);function hex(s){s=parseInt(s).toString(16);return s.length>1?s:'0'+s;};if(c){s='#'+hex(c[1])+hex(c[2])+hex(c[3]);return s;}return s;},getClasses:function(){var t=this,cl=[],i,lo={},f=t.settings.class_filter,ov;if(t.classes)return t.classes;function addClasses(s){each(s.imports,function(r){addClasses(r);});each(s.cssRules||s.rules,function(r){switch(r.type||1){case 1:if(r.selectorText){each(r.selectorText.split(','),function(v){v=v.replace(/^\s*|\s*$|^\s\./g,"");if(/\.mce/.test(v)||!/\.[\w\-]+$/.test(v))return;ov=v;v=v.replace(/.*\.([a-z0-9_\-]+).*/i,'$1');if(f&&!(v=f(v,ov)))return;if(!lo[v]){cl.push({'class':v});lo[v]=1;}});}break;case 3:addClasses(r.styleSheet);break;}});};try{each(t.doc.styleSheets,addClasses);}catch(ex){}if(cl.length>0)t.classes=cl;return cl;},run:function(e,f,s){var t=this,o;if(typeof(e)==='string')e=t.doc.getElementById(e);if(!e)return false;s=s||this;if(!e.nodeType&&(e.length||e.length===0)){o=[];each(e,function(e,i){if(e){if(typeof(e)=='string')e=t.doc.getElementById(e);o.push(f.call(s,e,i));}});return o;}return f.call(s,e);}});tinymce.DOM=new tinymce.dom.DOMUtils(document,{process_html:0});})();(function(){var each=tinymce.each,DOM=tinymce.DOM,isIE=tinymce.isIE,isWebKit=tinymce.isWebKit,Event;tinymce.create('static tinymce.dom.Event',{inits:[],events:[],add:function(o,n,f,s){var cb,t=this,el=t.events,r;if(o&&o instanceof Array){r=[];each(o,function(o){o=DOM.get(o);r.push(t.add(o,n,f,s));});return r;}o=DOM.get(o);if(!o)return;cb=function(e){e=e||window.event;if(e&&!e.target&&isIE)e.target=e.srcElement;if(!s)return f(e);return f.call(s,e);};if(n=='unload'){tinymce.unloads.unshift({func:cb});return cb;}if(n=='init'){if(t.domLoaded)cb();else t.inits.push(cb);return cb;}el.push({obj:o,name:n,func:f,cfunc:cb,scope:s});t._add(o,n,cb);return f;},remove:function(o,n,f){var t=this,a=t.events,s=false,r;if(o&&o instanceof Array){r=[];each(o,function(o){o=DOM.get(o);r.push(t.remove(o,n,f));});return r;}o=DOM.get(o);each(a,function(e,i){if(e.obj==o&&e.name==n&&(!f||(e.func==f||e.cfunc==f))){a.splice(i,1);t._remove(o,n,e.cfunc);s=true;return false;}});return s;},clear:function(o){var t=this,a=t.events,i,e;for(i=a.length-1;i>=0;i--){e=a[i];if(e.obj==o){a.splice(i,1);t._remove(o,e.name,e.cfunc);}}},cancel:function(e){if(!e)return false;this.stop(e);return this.prevent(e);},stop:function(e){if(e.stopPropagation)e.stopPropagation();else e.cancelBubble=true;return false;},prevent:function(e){if(e.preventDefault)e.preventDefault();else e.returnValue=false;return false;},_unload:function(){var t=Event;each(t.events,function(e,i){t._remove(e.obj,e.name,e.cfunc);e.obj=e.cfunc=null;});t.events=[];t=null;},_add:function(o,n,f){if(o.attachEvent)o.attachEvent('on'+n,f);else if(o.addEventListener)o.addEventListener(n,f,false);else o['on'+n]=f;},_remove:function(o,n,f){if(o.detachEvent)o.detachEvent('on'+n,f);else if(o.removeEventListener)o.removeEventListener(n,f,false);else o['on'+n]=null;},_pageInit:function(){var e=Event;e._remove(window,'DOMContentLoaded',e._pageInit);e.domLoaded=true;each(e.inits,function(c){c();});e.inits=[];},_wait:function(){var t;if(window.tinyMCE_GZ&&tinyMCE_GZ.loaded)return;if(isIE&&document.location.protocol!='https:'){document.write('<script id=__ie_onload defer src=\'javascript:""\';><\/script>');DOM.get("__ie_onload").onreadystatechange=function(){if(this.readyState=="complete"){Event._pageInit();DOM.get("__ie_onload").onreadystatechange=null;}};}else{Event._add(window,'DOMContentLoaded',Event._pageInit,Event);if(isIE||isWebKit){t=setInterval(function(){if(/loaded|complete/.test(document.readyState)){clearInterval(t);Event._pageInit();}},10);}}}});Event=tinymce.dom.Event;Event._wait();tinymce.addUnload(Event._unload);})();(function(){var each=tinymce.each;tinymce.create('tinymce.dom.Element',{Element:function(id,s){var t=this,dom,el;s=s||{};t.id=id;t.dom=dom=s.dom||tinymce.DOM;t.settings=s;if(!tinymce.isIE)el=t.dom.get(t.id);each(['getPos','getRect','getParent','add','setStyle','getStyle','setStyles','setAttrib','setAttribs','getAttrib','addClass','removeClass','hasClass','getOuterHTML','setOuterHTML','remove','show','hide','isHidden','setHTML','get'],function(k){t[k]=function(){var a=arguments,o;if(tinymce.isOpera){a=[id];each(arguments,function(v){a.push(v);});}else Array.prototype.unshift.call(a,el||id);o=dom[k].apply(dom,a);t.update(k);return o;};});},on:function(n,f,s){return tinymce.dom.Event.add(this.id,n,f,s);},getXY:function(){return{x:parseInt(this.getStyle('left')),y:parseInt(this.getStyle('top'))};},getSize:function(){var n=this.dom.get(this.id);return{w:parseInt(this.getStyle('width')||n.clientWidth),h:parseInt(this.getStyle('height')||n.clientHeight)};},moveTo:function(x,y){this.setStyles({left:x,top:y});},moveBy:function(x,y){var p=this.getXY();this.moveTo(p.x+x,p.y+y);},resizeTo:function(w,h){this.setStyles({width:w,height:h});},resizeBy:function(w,h){var s=this.getSize();this.resizeTo(s.w+w,s.h+h);},update:function(k){var t=this,b,dom=t.dom;if(tinymce.isIE6&&t.settings.blocker){k=k||'';if(k.indexOf('get')===0||k.indexOf('has')===0||k.indexOf('is')===0)return;if(k=='remove'){dom.remove(t.blocker);return;}if(!t.blocker){t.blocker=dom.uniqueId();b=dom.add(t.settings.container||dom.getRoot(),'iframe',{id:t.blocker,style:'position:absolute;',frameBorder:0,src:'javascript:""'});dom.setStyle(b,'opacity',0);}else b=dom.get(t.blocker);dom.setStyle(b,'left',t.getStyle('left',1));dom.setStyle(b,'top',t.getStyle('top',1));dom.setStyle(b,'width',t.getStyle('width',1));dom.setStyle(b,'height',t.getStyle('height',1));dom.setStyle(b,'display',t.getStyle('display',1));dom.setStyle(b,'zIndex',parseInt(t.getStyle('zIndex',1)||0)-1);}}});})();(function(){var is=tinymce.is,isIE=tinymce.isIE,each=tinymce.each;tinymce.create('tinymce.dom.Selection',{Selection:function(dom,win,serializer){var t=this;t.dom=dom;t.win=win;t.serializer=serializer;tinymce.addUnload(function(){t.win=null;});},getContent:function(s){var t=this,r=t.getRng(),e=t.dom.create("body"),se=t.getSel(),wb,wa,n;s=s||{};wb=wa='';s.get=true;s.format=s.format||'html';if(s.format=='text')return t.isCollapsed()?'':(r.text||(se.toString?se.toString():''));if(r.cloneContents){n=r.cloneContents();if(n)e.appendChild(n);}else if(is(r.item)||is(r.htmlText))e.innerHTML=r.item?r.item(0).outerHTML:r.htmlText;else e.innerHTML=r.toString();if(/^\s/.test(e.innerHTML))wb=' ';if(/\s+$/.test(e.innerHTML))wa=' ';s.getInner=true;return t.isCollapsed()?'':wb+t.serializer.serialize(e,s)+wa;},setContent:function(h,s){var t=this,r=t.getRng(),d;s=s||{format:'html'};s.set=true;h=t.dom.processHTML(h);if(r.insertNode){d=t.win.document;if(tinymce.isGecko&&h.indexOf('<')==-1){r.deleteContents();r.insertNode(t.getRng().createContextualFragment(h+'<span id="__caret">_</span>'));t.select(t.dom.get('__caret'));t.getRng().deleteContents();return;}try{if(d.queryCommandEnabled('InsertHTML'))return d.execCommand('InsertHTML',false,h);}catch(ex){r.deleteContents();r.insertNode(t.getRng().createContextualFragment(h));}}else{if(r.item)r.item(0).outerHTML=h;else r.pasteHTML(h);}},getStart:function(){var t=this,r=t.getRng(),e;if(isIE){if(r.item)return r.item(0);r=r.duplicate();r.collapse(1);e=r.parentElement();if(e.nodeName=='BODY')return e.firstChild;return e;}else{e=r.startContainer;if(e.nodeName=='BODY')return e.firstChild;return t.dom.getParent(e,function(n){return n.nodeType==1;});}},getEnd:function(){var t=this,r=t.getRng(),e;if(isIE){if(r.item)return r.item(0);r=r.duplicate();r.collapse(0);e=r.parentElement();if(e.nodeName=='BODY')return e.lastChild;return e;}else{e=r.endContainer;if(e.nodeName=='BODY')return e.lastChild;return t.dom.getParent(e,function(n){return n.nodeType==1;});}},getBookmark:function(si){var t=this,r=t.getRng(),tr,sx,sy,vp=t.dom.getViewPort(t.win),e,sp,bp,le,c=-0xFFFFFF,s,ro=t.dom.getRoot(),wb=0,wa=0,nv;sx=vp.x;sy=vp.y;if(si=='simple')return{rng:r,scrollX:sx,scrollY:sy};if(isIE){if(r.item){e=r.item(0);each(t.dom.select(e.nodeName),function(n,i){if(e==n){sp=i;return false;}});return{tag:e.nodeName,index:sp,scrollX:sx,scrollY:sy};}tr=t.dom.doc.body.createTextRange();tr.moveToElementText(ro);tr.collapse(true);bp=Math.abs(tr.move('character',c));tr=r.duplicate();tr.collapse(true);sp=Math.abs(tr.move('character',c));tr=r.duplicate();tr.collapse(false);le=Math.abs(tr.move('character',c))-sp;return{start:sp-bp,length:le,scrollX:sx,scrollY:sy};}e=t.getNode();s=t.getSel();if(!s)return null;if(e&&e.nodeName=='IMG'){return{scrollX:sx,scrollY:sy};}function getPos(r,sn,en){var w=t.dom.doc.createTreeWalker(r,NodeFilter.SHOW_TEXT,null,false),n,p=0,d={};while((n=w.nextNode())!=null){if(n==sn)d.start=p;if(n==en){d.end=p;return d;}p+=tinymce.trim(n.nodeValue||'').length;}return null;};if(s.anchorNode==s.focusNode&&s.anchorOffset==s.focusOffset){e=getPos(ro,s.anchorNode,s.focusNode);if(!e)return{scrollX:sx,scrollY:sy};(s.anchorNode.nodeValue||'').replace(/^\s+/,function(a){wb=a.length;});return{start:Math.max(e.start+s.anchorOffset-wb,0),end:Math.max(e.end+s.focusOffset-wb,0),scrollX:sx,scrollY:sy,beg:s.anchorOffset-wb==0};}else{e=getPos(ro,r.startContainer,r.endContainer);(r.startContainer.nodeValue||'').replace(/^\s+/,function(a){wb=a.length;});(r.endContainer.nodeValue||'').replace(/^\s+/,function(a){wa=a.length;});if(!e)return{scrollX:sx,scrollY:sy};return{start:Math.max(e.start+r.startOffset-wb,0),end:Math.max(e.end+r.endOffset-wa,0),scrollX:sx,scrollY:sy,beg:r.startOffset-wb==0};}},moveToBookmark:function(b){var t=this,r=t.getRng(),s=t.getSel(),ro=t.dom.getRoot(),sd,nvl,nv;function getPos(r,sp,ep){var w=t.dom.doc.createTreeWalker(r,NodeFilter.SHOW_TEXT,null,false),n,p=0,d={},o,v,wa,wb;while((n=w.nextNode())!=null){wa=wb=0;nv=n.nodeValue||'';nv.replace(/^\s+[^\s]/,function(a){wb=a.length-1;});nv.replace(/[^\s]\s+$/,function(a){wa=a.length-1;});nvl=tinymce.trim(nv).length;p+=nvl;if(p>=sp&&!d.startNode){o=sp-(p-nvl);if(b.beg&&o>=nvl)continue;d.startNode=n;d.startOffset=o+wb;}if(p>=ep){d.endNode=n;d.endOffset=ep-(p-nvl)+wb;return d;}}return null;};if(!b)return false;t.win.scrollTo(b.scrollX,b.scrollY);if(isIE){if(r=b.rng){try{r.select();}catch(ex){}return true;}t.win.focus();if(b.tag){r=ro.createControlRange();each(t.dom.select(b.tag),function(n,i){if(i==b.index)r.addElement(n);});}else{try{if(b.start<0)return true;r=s.createRange();r.moveToElementText(ro);r.collapse(true);r.moveStart('character',b.start);r.moveEnd('character',b.length);}catch(ex2){return true;}}try{r.select();}catch(ex){}return true;}if(!s)return false;if(b.rng){s.removeAllRanges();s.addRange(b.rng);}else{if(is(b.start)&&is(b.end)){try{sd=getPos(ro,b.start,b.end);if(sd){r=t.dom.doc.createRange();r.setStart(sd.startNode,sd.startOffset);r.setEnd(sd.endNode,sd.endOffset);s.removeAllRanges();s.addRange(r);}if(!tinymce.isOpera)t.win.focus();}catch(ex){}}}},select:function(n,c){var t=this,r=t.getRng(),s=t.getSel(),b,fn,ln,d=t.win.document;function first(n){return n?d.createTreeWalker(n,NodeFilter.SHOW_TEXT,null,false).nextNode():null;};function last(n){var c,o,w;if(!n)return null;w=d.createTreeWalker(n,NodeFilter.SHOW_TEXT,null,false);while(c=w.nextNode())o=c;return o;};if(isIE){try{b=d.body;if(/^(IMG|TABLE)$/.test(n.nodeName)){r=b.createControlRange();r.addElement(n);}else{r=b.createTextRange();r.moveToElementText(n);}r.select();}catch(ex){}}else{if(c){fn=first(n);ln=last(n);if(fn&&ln){r=d.createRange();r.setStart(fn,0);r.setEnd(ln,ln.nodeValue.length);}else r.selectNode(n);}else r.selectNode(n);t.setRng(r);}return n;},isCollapsed:function(){var t=this,r=t.getRng(),s=t.getSel();if(!r||r.item)return false;return!s||r.boundingWidth==0||s.isCollapsed;},collapse:function(b){var t=this,r=t.getRng(),n;if(r.item){n=r.item(0);r=this.win.document.body.createTextRange();r.moveToElementText(n);}r.collapse(!!b);t.setRng(r);},getSel:function(){var t=this,w=this.win;return w.getSelection?w.getSelection():w.document.selection;},getRng:function(){var t=this,s=t.getSel(),r;try{if(s)r=s.rangeCount>0?s.getRangeAt(0):(s.createRange?s.createRange():t.win.document.createRange());}catch(ex){}if(!r)r=isIE?t.win.document.body.createTextRange():t.win.document.createRange();return r;},setRng:function(r){var s;if(!isIE){s=this.getSel();if(s){s.removeAllRanges();s.addRange(r);}}else{try{r.select();}catch(ex){}}},setNode:function(n){var t=this;t.setContent(t.dom.getOuterHTML(n));return n;},getNode:function(){var t=this,r=t.getRng(),s=t.getSel(),e;if(!isIE){if(!r)return t.dom.getRoot();e=r.commonAncestorContainer;if(!r.collapsed){if(r.startContainer==r.endContainer||(tinymce.isWebKit&&r.startContainer==r.endContainer.parentNode)){if(r.startOffset-r.endOffset<2||tinymce.isWebKit){if(r.startContainer.hasChildNodes())e=r.startContainer.childNodes[r.startOffset];}}}return t.dom.getParent(e,function(n){return n.nodeType==1;});}return r.item?r.item(0):r.parentElement();}});})();(function(){tinymce.create('tinymce.dom.XMLWriter',{node:null,XMLWriter:function(s){function getXML(){var i=document.implementation;if(!i||!i.createDocument){try{return new ActiveXObject('MSXML2.DOMDocument');}catch(ex){}try{return new ActiveXObject('Microsoft.XmlDom');}catch(ex){}}else return i.createDocument('','',null);};this.doc=getXML();this.valid=tinymce.isOpera||tinymce.isWebKit;this.reset();},reset:function(){var t=this,d=t.doc;if(d.firstChild)d.removeChild(d.firstChild);t.node=d.appendChild(d.createElement("html"));},writeStartElement:function(n){var t=this;t.node=t.node.appendChild(t.doc.createElement(n));},writeAttribute:function(n,v){if(this.valid)v=v.replace(/>/g,'%MCGT%');this.node.setAttribute(n,v);},writeEndElement:function(){this.node=this.node.parentNode;},writeFullEndElement:function(){var t=this,n=t.node;n.appendChild(t.doc.createTextNode(""));t.node=n.parentNode;},writeText:function(v){if(this.valid)v=v.replace(/>/g,'%MCGT%');this.node.appendChild(this.doc.createTextNode(v));},writeCDATA:function(v){this.node.appendChild(this.doc.createCDATA(v));},writeComment:function(v){this.node.appendChild(this.doc.createComment(v));},getContent:function(){var h;h=this.doc.xml||new XMLSerializer().serializeToString(this.doc);h=h.replace(/<\?[^?]+\?>|<html>|<\/html>|<html\/>|<!DOCTYPE[^>]+>/g,'');h=h.replace(/ ?\/>/g,' />');if(this.valid)h=h.replace(/\%MCGT%/g,'&gt;');return h;}});})();(function(){tinymce.create('tinymce.dom.StringWriter',{str:null,tags:null,count:0,settings:null,indent:null,StringWriter:function(s){this.settings=tinymce.extend({indent_char:' ',indentation:1},s);this.reset();},reset:function(){this.indent='';this.str="";this.tags=[];this.count=0;},writeStartElement:function(n){this._writeAttributesEnd();this.writeRaw('<'+n);this.tags.push(n);this.inAttr=true;this.count++;this.elementCount=this.count;},writeAttribute:function(n,v){var t=this;t.writeRaw(" "+t.encode(n)+'="'+t.encode(v)+'"');},writeEndElement:function(){var n;if(this.tags.length>0){n=this.tags.pop();if(this._writeAttributesEnd(1))this.writeRaw('</'+n+'>');if(this.settings.indentation>0)this.writeRaw('\n');}},writeFullEndElement:function(){if(this.tags.length>0){this._writeAttributesEnd();this.writeRaw('</'+this.tags.pop()+'>');if(this.settings.indentation>0)this.writeRaw('\n');}},writeText:function(v){this._writeAttributesEnd();this.writeRaw(this.encode(v));this.count++;},writeCDATA:function(v){this._writeAttributesEnd();this.writeRaw('<![CDATA['+v+']]>');this.count++;},writeComment:function(v){this._writeAttributesEnd();this.writeRaw('<!-- '+v+'-->');this.count++;},writeRaw:function(v){this.str+=v;},encode:function(s){return s.replace(/[<>&"]/g,function(v){switch(v){case'<':return'&lt;';case'>':return'&gt;';case'&':return'&amp;';case'"':return'&quot;';}return v;});},getContent:function(){return this.str;},_writeAttributesEnd:function(s){if(!this.inAttr)return;this.inAttr=false;if(s&&this.elementCount==this.count){this.writeRaw(' />');return false;}this.writeRaw('>');return true;}});})();(function(){var extend=tinymce.extend,each=tinymce.each,Dispatcher=tinymce.util.Dispatcher,isIE=tinymce.isIE,isGecko=tinymce.isGecko;function getIEAtts(n){var o=[];if(n.nodeName=='OBJECT')return n.attributes;n.cloneNode(false).outerHTML.replace(/([a-z0-9\:\-_]+)=/gi,function(a,b){o.push({specified:1,nodeName:b});});return o;};function wildcardToRE(s){return s.replace(/([?+*])/g,'.$1');};tinymce.create('tinymce.dom.Serializer',{Serializer:function(s){var t=this;t.key=0;t.onPreProcess=new Dispatcher(t);t.onPostProcess=new Dispatcher(t);if(tinymce.relaxedDomain&&tinymce.isGecko){t.writer=new tinymce.dom.StringWriter();}else{try{t.writer=new tinymce.dom.XMLWriter();}catch(ex){t.writer=new tinymce.dom.StringWriter();}}t.settings=s=extend({dom:tinymce.DOM,valid_nodes:0,node_filter:0,attr_filter:0,invalid_attrs:/^(mce_|_moz_)/,closed:/(br|hr|input|meta|img|link|param)/,entity_encoding:'named',entities:'160,nbsp,161,iexcl,162,cent,163,pound,164,curren,165,yen,166,brvbar,167,sect,168,uml,169,copy,170,ordf,171,laquo,172,not,173,shy,174,reg,175,macr,176,deg,177,plusmn,178,sup2,179,sup3,180,acute,181,micro,182,para,183,middot,184,cedil,185,sup1,186,ordm,187,raquo,188,frac14,189,frac12,190,frac34,191,iquest,192,Agrave,193,Aacute,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,201,Eacute,202,Ecirc,203,Euml,204,Igrave,205,Iacute,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,211,Oacute,212,Ocirc,213,Otilde,214,Ouml,215,times,216,Oslash,217,Ugrave,218,Uacute,219,Ucirc,220,Uuml,221,Yacute,222,THORN,223,szlig,224,agrave,225,aacute,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,233,eacute,234,ecirc,235,euml,236,igrave,237,iacute,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,243,oacute,244,ocirc,245,otilde,246,ouml,247,divide,248,oslash,249,ugrave,250,uacute,251,ucirc,252,uuml,253,yacute,254,thorn,255,yuml,402,fnof,913,Alpha,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,977,thetasym,978,upsih,982,piv,8226,bull,8230,hellip,8242,prime,8243,Prime,8254,oline,8260,frasl,8472,weierp,8465,image,8476,real,8482,trade,8501,alefsym,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8704,forall,8706,part,8707,exist,8709,empty,8711,nabla,8712,isin,8713,notin,8715,ni,8719,prod,8721,sum,8722,minus,8727,lowast,8730,radic,8733,prop,8734,infin,8736,ang,8743,and,8744,or,8745,cap,8746,cup,8747,int,8756,there4,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8804,le,8805,ge,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,338,OElig,339,oelig,352,Scaron,353,scaron,376,Yuml,710,circ,732,tilde,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,8211,ndash,8212,mdash,8216,lsquo,8217,rsquo,8218,sbquo,8220,ldquo,8221,rdquo,8222,bdquo,8224,dagger,8225,Dagger,8240,permil,8249,lsaquo,8250,rsaquo,8364,euro',valid_elements:'*[*]',extended_valid_elements:0,valid_child_elements:0,invalid_elements:0,fix_table_elements:0,fix_list_elements:true,fix_content_duplication:true,convert_fonts_to_spans:false,font_size_classes:0,font_size_style_values:0,apply_source_formatting:0,indent_mode:'simple',indent_char:'\t',indent_levels:1,remove_linebreaks:1},s);t.dom=s.dom;if(s.fix_list_elements){t.onPreProcess.add(function(se,o){var nl,x,a=['ol','ul'],i,n,p,r=/^(OL|UL)$/,np;function prevNode(e,n){var a=n.split(','),i;while((e=e.previousSibling)!=null){for(i=0;i<a.length;i++){if(e.nodeName==a[i])return e;}}return null;};for(x=0;x<a.length;x++){nl=t.dom.select(a[x],o.node);for(i=0;i<nl.length;i++){n=nl[i];p=n.parentNode;if(r.test(p.nodeName)){np=prevNode(n,'LI');if(!np){np=t.dom.create('li');np.innerHTML='&nbsp;';np.appendChild(n);p.insertBefore(np,p.firstChild);}else np.appendChild(n);}}}});}if(s.fix_table_elements){t.onPreProcess.add(function(se,o){each(t.dom.select('table',o.node),function(e){var pa=t.dom.getParent(e,'H1,H2,H3,H4,H5,H6,P'),pa2,n,tm,pl=[],i,ns;if(pa){pa2=pa.cloneNode(false);pl.push(e);for(n=e;n=n.parentNode;){pl.push(n);if(n==pa)break;}tm=pa2;for(i=pl.length-1;i>=0;i--){if(i==pl.length-1){while(ns=pl[i-1].nextSibling)tm.appendChild(ns.parentNode.removeChild(ns));}else{n=pl[i].cloneNode(false);if(i!=0){while(ns=pl[i-1].nextSibling)n.appendChild(ns.parentNode.removeChild(ns));}tm=tm.appendChild(n);}}e=t.dom.insertAfter(e.parentNode.removeChild(e),pa);t.dom.insertAfter(e,pa);t.dom.insertAfter(pa2,e);}});});}},setEntities:function(s){var t=this,a,i,l={},re='',v;if(t.entityLookup)return;a=s.split(',');for(i=0;i<a.length;i+=2){v=a[i];if(v==34||v==38||v==60||v==62)continue;l[String.fromCharCode(a[i])]=a[i+1];v=parseInt(a[i]).toString(16);re+='\\u'+'0000'.substring(v.length)+v;}if(!re){t.settings.entity_encoding='raw';return;}t.entitiesRE=new RegExp('['+re+']','g');t.entityLookup=l;},setValidChildRules:function(s){this.childRules=null;this.addValidChildRules(s);},addValidChildRules:function(s){var t=this,inst,intr,bloc;if(!s)return;inst='A|BR|SPAN|BDO|MAP|OBJECT|IMG|TT|I|B|BIG|SMALL|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|#text|#comment';intr='A|BR|SPAN|BDO|OBJECT|APPLET|IMG|MAP|IFRAME|TT|I|B|U|S|STRIKE|BIG|SMALL|FONT|BASEFONT|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|INPUT|SELECT|TEXTAREA|LABEL|BUTTON|#text|#comment';bloc='H[1-6]|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|FORM|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP';each(s.split(','),function(s){var p=s.split(/\[|\]/),re;s='';each(p[1].split('|'),function(v){if(s)s+='|';switch(v){case'%itrans':v=intr;break;case'%itrans_na':v=intr.substring(2);break;case'%istrict':v=inst;break;case'%istrict_na':v=inst.substring(2);break;case'%btrans':v=bloc;break;case'%bstrict':v=bloc;break;}s+=v;});re=new RegExp('^('+s.toLowerCase()+')$','i');each(p[0].split('/'),function(s){t.childRules=t.childRules||{};t.childRules[s]=re;});});s='';each(t.childRules,function(v,k){if(s)s+='|';s+=k;});t.parentElementsRE=new RegExp('^('+s.toLowerCase()+')$','i');},setRules:function(s){var t=this;t._setup();t.rules={};t.wildRules=[];t.validElements={};return t.addRules(s);},addRules:function(s){var t=this,dr;if(!s)return;t._setup();each(s.split(','),function(s){var p=s.split(/\[|\]/),tn=p[0].split('/'),ra,at,wat,va=[];if(dr)at=tinymce.extend([],dr.attribs);if(p.length>1){each(p[1].split('|'),function(s){var ar={},i;at=at||[];s=s.replace(/::/g,'~');s=/^([!\-])?([\w*.?~_\-]+|)([=:<])?(.+)?$/.exec(s);s[2]=s[2].replace(/~/g,':');if(s[1]=='!'){ra=ra||[];ra.push(s[2]);}if(s[1]=='-'){for(i=0;i<at.length;i++){if(at[i].name==s[2]){at.splice(i,1);return;}}}switch(s[3]){case'=':ar.defaultVal=s[4]||'';break;case':':ar.forcedVal=s[4];break;case'<':ar.validVals=s[4].split('?');break;}if(/[*.?]/.test(s[2])){wat=wat||[];ar.nameRE=new RegExp('^'+wildcardToRE(s[2])+'$');wat.push(ar);}else{ar.name=s[2];at.push(ar);}va.push(s[2]);});}each(tn,function(s,i){var pr=s.charAt(0),x=1,ru={};if(dr){if(dr.noEmpty)ru.noEmpty=dr.noEmpty;if(dr.fullEnd)ru.fullEnd=dr.fullEnd;if(dr.padd)ru.padd=dr.padd;}switch(pr){case'-':ru.noEmpty=true;break;case'+':ru.fullEnd=true;break;case'#':ru.padd=true;break;default:x=0;}tn[i]=s=s.substring(x);t.validElements[s]=1;if(/[*.?]/.test(tn[0])){ru.nameRE=new RegExp('^'+wildcardToRE(tn[0])+'$');t.wildRules=t.wildRules||{};t.wildRules.push(ru);}else{ru.name=tn[0];if(tn[0]=='@')dr=ru;t.rules[s]=ru;}ru.attribs=at;if(ra)ru.requiredAttribs=ra;if(wat){s='';each(va,function(v){if(s)s+='|';s+='('+wildcardToRE(v)+')';});ru.validAttribsRE=new RegExp('^'+s.toLowerCase()+'$');ru.wildAttribs=wat;}});});s='';each(t.validElements,function(v,k){if(s)s+='|';if(k!='@')s+=k;});t.validElementsRE=new RegExp('^('+wildcardToRE(s.toLowerCase())+')$');},findRule:function(n){var t=this,rl=t.rules,i,r;t._setup();r=rl[n];if(r)return r;rl=t.wildRules;for(i=0;i<rl.length;i++){if(rl[i].nameRE.test(n))return rl[i];}return null;},findAttribRule:function(ru,n){var i,wa=ru.wildAttribs;for(i=0;i<wa.length;i++){if(wa[i].nameRE.test(n))return wa[i];}return null;},serialize:function(n,o){var h,t=this;t._setup();o=o||{};o.format=o.format||'html';t.processObj=o;n=n.cloneNode(true);t.key=''+(parseInt(t.key)+1);if(!o.no_events){o.node=n;t.onPreProcess.dispatch(t,o);}t.writer.reset();t._serializeNode(n,o.getInner);o.content=t.writer.getContent();if(!o.no_events)t.onPostProcess.dispatch(t,o);t._postProcess(o);o.node=null;return tinymce.trim(o.content);},_postProcess:function(o){var t=this,s=t.settings,h=o.content,sc=[],p,l;if(o.format=='html'){p=t._protect({content:h,patterns:[/(<script[^>]*>)(.*?)(<\/script>)/g,/(<style[^>]*>)(.*?)(<\/style>)/g,/(<pre[^>]*>)(.*?)(<\/pre>)/g]});h=p.content;if(s.entity_encoding!=='raw'){if(s.entity_encoding.indexOf('named')!=-1){t.setEntities(s.entities);l=t.entityLookup;h=h.replace(t.entitiesRE,function(a){var v;if(v=l[a])a='&'+v+';';return a;});}if(s.entity_encoding.indexOf('numeric')!=-1){h=h.replace(/[\u007E-\uFFFF]/g,function(a){return'&#'+a.charCodeAt(0)+';';});}}if(!o.set){h=h.replace(/<p>\s+<\/p>|<p([^>]+)>\s+<\/p>/g,s.entity_encoding=='numeric'?'<p$1>&#160;</p>':'<p$1>&nbsp;</p>');if(s.remove_linebreaks){h=h.replace(/\r?\n|\r/g,' ');h=h.replace(/(<[^>]+>)\s+/g,'$1 ');h=h.replace(/\s+(<\/[^>]+>)/g,' $1');h=h.replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object) ([^>]+)>\s+/g,'<$1 $2>');h=h.replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>\s+/g,'<$1>');h=h.replace(/\s+<\/(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>/g,'</$1>');}if(s.apply_source_formatting&&s.indent_mode=='simple'){h=h.replace(/<(\/?)(ul|hr|table|meta|link|tbody|tr|object|body|head|html|map)(|[^>]+)>\s*/g,'\n<$1$2$3>\n');h=h.replace(/\s*<(p|h[1-6]|blockquote|div|title|style|pre|script|td|li|area)(|[^>]+)>/g,'\n<$1$2>');h=h.replace(/<\/(p|h[1-6]|blockquote|div|title|style|pre|script|td|li)>\s*/g,'</$1>\n');h=h.replace(/\n\n/g,'\n');}}h=t._unprotect(h,p);if(s.entity_encoding=='raw')h=h.replace(/<p>&nbsp;<\/p>|<p([^>]+)>&nbsp;<\/p>/g,'<p$1>\u00a0</p>');}o.content=h;},_serializeNode:function(n,inn){var t=this,s=t.settings,w=t.writer,hc,el,cn,i,l,a,at,no,v,nn,ru,ar,iv;if(!s.node_filter||s.node_filter(n)){switch(n.nodeType){case 1:if(n.hasAttribute?n.hasAttribute('mce_bogus'):n.getAttribute('mce_bogus'))return;iv=false;hc=n.hasChildNodes();nn=n.getAttribute('mce_name')||n.nodeName.toLowerCase();if(isIE){if(n.scopeName!=='HTML'&&n.scopeName!=='html')nn=n.scopeName+':'+nn;}if(nn.indexOf('mce:')===0)nn=nn.substring(4);if(!t.validElementsRE.test(nn)||(t.invalidElementsRE&&t.invalidElementsRE.test(nn))||inn){iv=true;break;}if(isIE){if(s.fix_content_duplication){if(n.mce_serialized==t.key)return;n.mce_serialized=t.key;}if(nn.charAt(0)=='/')nn=nn.substring(1);}else if(isGecko){if(n.nodeName==='BR'&&n.getAttribute('type')=='_moz')return;}if(t.childRules){if(t.parentElementsRE.test(t.elementName)){if(!t.childRules[t.elementName].test(nn)){iv=true;break;}}t.elementName=nn;}ru=t.findRule(nn);nn=ru.name||nn;if((!hc&&ru.noEmpty)||(isIE&&!nn)){iv=true;break;}if(ru.requiredAttribs){a=ru.requiredAttribs;for(i=a.length-1;i>=0;i--){if(this.dom.getAttrib(n,a[i])!=='')break;}if(i==-1){iv=true;break;}}w.writeStartElement(nn);if(ru.attribs){for(i=0,at=ru.attribs,l=at.length;i<l;i++){a=at[i];v=t._getAttrib(n,a);if(v!==null)w.writeAttribute(a.name,v);}}if(ru.validAttribsRE){at=isIE?getIEAtts(n):n.attributes;for(i=at.length-1;i>-1;i--){no=at[i];if(no.specified){a=no.nodeName.toLowerCase();if(s.invalid_attrs.test(a)||!ru.validAttribsRE.test(a))continue;ar=t.findAttribRule(ru,a);v=t._getAttrib(n,ar,a);if(v!==null)w.writeAttribute(a,v);}}}if(!hc&&ru.padd)w.writeText('\u00a0');break;case 3:if(t.childRules&&t.parentElementsRE.test(t.elementName)){if(!t.childRules[t.elementName].test(n.nodeName))return;}return w.writeText(n.nodeValue);case 4:return w.writeCDATA(n.nodeValue);case 8:return w.writeComment(n.nodeValue);}}else if(n.nodeType==1)hc=n.hasChildNodes();if(hc){cn=n.firstChild;while(cn){t._serializeNode(cn);t.elementName=nn;cn=cn.nextSibling;}}if(!iv){if(hc||!s.closed.test(nn))w.writeFullEndElement();else w.writeEndElement();}},_protect:function(o){o.items=o.items||[];function enc(s){return s.replace(/[\r\n\\]/g,function(c){if(c==='\n')return'\\n';else if(c==='\\')return'\\\\';return'\\r';});};function dec(s){return s.replace(/\\[\\rn]/g,function(c){if(c==='\\n')return'\n';else if(c==='\\\\')return'\\';return'\r';});};each(o.patterns,function(p){o.content=dec(enc(o.content).replace(p,function(x,a,b,c){o.items.push(dec(b));return a+'<!--mce:'+(o.items.length-1)+'-->'+c;}));});return o;},_unprotect:function(h,o){h=h.replace(/\<!--mce:([0-9]+)--\>/g,function(a,b){return o.items[parseInt(b)];});o.items=[];return h;},_setup:function(){var t=this,s=this.settings;if(t.done)return;t.done=1;t.setRules(s.valid_elements);t.addRules(s.extended_valid_elements);t.addValidChildRules(s.valid_child_elements);if(s.invalid_elements)t.invalidElementsRE=new RegExp('^('+wildcardToRE(s.invalid_elements.replace(',','|').toLowerCase())+')$');if(s.attrib_value_filter)t.attribValueFilter=s.attribValueFilter;},_getAttrib:function(n,a,na){var i,v;na=na||a.name;if(a.forcedVal&&(v=a.forcedVal)){if(v==='{$uid}')return this.dom.uniqueId();return v;}v=this.dom.getAttrib(n,na);switch(na){case'rowspan':case'colspan':if(v=='1')v='';break;}if(this.attribValueFilter)v=this.attribValueFilter(na,v,n);if(a.validVals){for(i=a.validVals.length-1;i>=0;i--){if(v==a.validVals[i])break;}if(i==-1)return null;}if(v===''&&typeof(a.defaultVal)!='undefined'){v=a.defaultVal;if(v==='{$uid}')return this.dom.uniqueId();return v;}else{if(na=='class'&&this.processObj.get)v=v.replace(/\s?mceItem\w+\s?/g,'');}if(v==='')return null;return v;}});})();(function(){var each=tinymce.each;tinymce.create('tinymce.dom.ScriptLoader',{ScriptLoader:function(s){this.settings=s||{};this.queue=[];this.lookup={};},isDone:function(u){return this.lookup[u]?this.lookup[u].state==2:0;},markDone:function(u){this.lookup[u]={state:2,url:u};},add:function(u,cb,s,pr){var t=this,lo=t.lookup,o;if(o=lo[u]){if(cb&&o.state==2)cb.call(s||this);return o;}o={state:0,url:u,func:cb,scope:s||this};if(pr)t.queue.unshift(o);else t.queue.push(o);lo[u]=o;return o;},load:function(u,cb,s){var t=this,o;if(o=t.lookup[u]){if(cb&&o.state==2)cb.call(s||t);return o;}function loadScript(u){if(tinymce.dom.Event.domLoaded||t.settings.strict_mode){tinymce.util.XHR.send({url:u,error:t.settings.error,async:false,success:function(co){t.eval(co);}});}else document.write('<script type="text/javascript" src="'+u+'"></script>');};if(!tinymce.is(u,'string')){each(u,function(u){loadScript(u);});if(cb)cb.call(s||t);}else{loadScript(u);if(cb)cb.call(s||t);}},loadQueue:function(cb,s){var t=this;if(!t.queueLoading){t.queueLoading=1;t.queueCallbacks=[];t.loadScripts(t.queue,function(){t.queueLoading=0;if(cb)cb.call(s||t);each(t.queueCallbacks,function(o){o.func.call(o.scope);});});}else if(cb)t.queueCallbacks.push({func:cb,scope:s||t});},eval:function(co){var w=window;if(!w.execScript){try{eval.call(w,co);}catch(ex){eval(co,w);}}else w.execScript(co);},loadScripts:function(sc,cb,s){var t=this,lo=t.lookup;function done(o){o.state=2;if(o.func)o.func.call(o.scope||t);};function allDone(){var l;l=sc.length;each(sc,function(o){o=lo[o.url];if(o.state===2){done(o);l--;}else load(o);});if(l===0&&cb){cb.call(s||t);cb=0;}};function load(o){if(o.state>0)return;o.state=1;tinymce.util.XHR.send({url:o.url,error:t.settings.error,success:function(co){t.eval(co);done(o);allDone();}});};each(sc,function(o){var u=o.url;if(!lo[u]){lo[u]=o;t.queue.push(o);}else o=lo[u];if(o.state>0)return;if(!tinymce.dom.Event.domLoaded&&!t.settings.strict_mode){var ix,ol='';if(cb||o.func){o.state=1;ix=tinymce.dom.ScriptLoader._addOnLoad(function(){done(o);allDone();});if(tinymce.isIE)ol=' onreadystatechange="';else ol=' onload="';ol+='tinymce.dom.ScriptLoader._onLoad(this,\''+u+'\','+ix+');"';}document.write('<script type="text/javascript" src="'+u+'"'+ol+'></script>');if(!o.func)done(o);}else load(o);});allDone();},'static':{_addOnLoad:function(f){var t=this;t._funcs=t._funcs||[];t._funcs.push(f);return t._funcs.length-1;},_onLoad:function(e,u,ix){if(!tinymce.isIE||e.readyState=='complete')this._funcs[ix].call(this);}}});tinymce.ScriptLoader=new tinymce.dom.ScriptLoader();})();(function(){var DOM=tinymce.DOM,is=tinymce.is;tinymce.create('tinymce.ui.Control',{Control:function(id,s){this.id=id;this.settings=s=s||{};this.rendered=false;this.onRender=new tinymce.util.Dispatcher(this);this.classPrefix='';this.scope=s.scope||this;this.disabled=0;this.active=0;},setDisabled:function(s){var e;if(s!=this.disabled){e=DOM.get(this.id);if(e&&this.settings.unavailable_prefix){if(s){this.prevTitle=e.title;e.title=this.settings.unavailable_prefix+": "+e.title;}else e.title=this.prevTitle;}this.setState('Disabled',s);this.setState('Enabled',!s);this.disabled=s;}},isDisabled:function(){return this.disabled;},setActive:function(s){if(s!=this.active){this.setState('Active',s);this.active=s;}},isActive:function(){return this.active;},setState:function(c,s){var n=DOM.get(this.id);c=this.classPrefix+c;if(s)DOM.addClass(n,c);else DOM.removeClass(n,c);},isRendered:function(){return this.rendered;},renderHTML:function(){},renderTo:function(n){DOM.setHTML(n,this.renderHTML());},postRender:function(){var t=this,b;if(is(t.disabled)){b=t.disabled;t.disabled=-1;t.setDisabled(b);}if(is(t.active)){b=t.active;t.active=-1;t.setActive(b);}},destroy:function(){DOM.remove(this.id);}});})();tinymce.create('tinymce.ui.Container:tinymce.ui.Control',{Container:function(id,s){this.parent(id,s);this.controls=[];this.lookup={};},add:function(c){this.lookup[c.id]=c;this.controls.push(c);return c;},get:function(n){return this.lookup[n];}});tinymce.create('tinymce.ui.Separator:tinymce.ui.Control',{renderHTML:function(){return tinymce.DOM.createHTML('span',{'class':'mceSeparator'});}});(function(){var is=tinymce.is,DOM=tinymce.DOM,each=tinymce.each,walk=tinymce.walk;tinymce.create('tinymce.ui.MenuItem:tinymce.ui.Control',{MenuItem:function(id,s){this.parent(id,s);this.classPrefix='mceMenuItem';},setSelected:function(s){this.setState('Selected',s);this.selected=s;},isSelected:function(){return this.selected;},postRender:function(){var t=this;t.parent();if(is(t.selected))t.setSelected(t.selected);}});})();(function(){var is=tinymce.is,DOM=tinymce.DOM,each=tinymce.each,walk=tinymce.walk;tinymce.create('tinymce.ui.Menu:tinymce.ui.MenuItem',{Menu:function(id,s){var t=this;t.parent(id,s);t.items={};t.collapsed=false;t.menuCount=0;t.onAddItem=new tinymce.util.Dispatcher(this);},expand:function(d){var t=this;if(d){walk(t,function(o){if(o.expand)o.expand();},'items',t);}t.collapsed=false;},collapse:function(d){var t=this;if(d){walk(t,function(o){if(o.collapse)o.collapse();},'items',t);}t.collapsed=true;},isCollapsed:function(){return this.collapsed;},add:function(o){if(!o.settings)o=new tinymce.ui.MenuItem(o.id||DOM.uniqueId(),o);this.onAddItem.dispatch(this,o);return this.items[o.id]=o;},addSeparator:function(){return this.add({separator:true});},addMenu:function(o){if(!o.collapse)o=this.createMenu(o);this.menuCount++;return this.add(o);},hasMenus:function(){return this.menuCount!==0;},remove:function(o){delete this.items[o.id];},removeAll:function(){var t=this;walk(t,function(o){if(o.removeAll)o.removeAll();o.destroy();},'items',t);t.items={};},createMenu:function(o){var m=new tinymce.ui.Menu(o.id||DOM.uniqueId(),o);m.onAddItem.add(this.onAddItem.dispatch,this.onAddItem);return m;}});})();(function(){var is=tinymce.is,DOM=tinymce.DOM,each=tinymce.each,Event=tinymce.dom.Event,Element=tinymce.dom.Element;tinymce.create('tinymce.ui.DropMenu:tinymce.ui.Menu',{DropMenu:function(id,s){s=s||{};s.container=s.container||document.body;s.offset_x=s.offset_x||0;s.offset_y=s.offset_y||0;s.vp_offset_x=s.vp_offset_x||0;s.vp_offset_y=s.vp_offset_y||0;if(is(s.icons)&&!s.icons)s['class']+=' mceNoIcons';this.parent(id,s);this.onShowMenu=new tinymce.util.Dispatcher(this);this.onHideMenu=new tinymce.util.Dispatcher(this);this.classPrefix='mceMenu';this.fixIE=tinymce.isIE&&window.top!=window;},createMenu:function(s){var t=this,cs=t.settings,m;s.container=s.container||cs.container;s.parent=t;s.constrain=s.constrain||cs.constrain;s['class']=s['class']||cs['class'];s.vp_offset_x=s.vp_offset_x||cs.vp_offset_x;s.vp_offset_y=s.vp_offset_y||cs.vp_offset_y;m=new tinymce.ui.DropMenu(s.id||DOM.uniqueId(),s);m.onAddItem.add(t.onAddItem.dispatch,t.onAddItem);return m;},update:function(){var t=this,s=t.settings,tb=DOM.get('menu_'+t.id+'_tbl'),co=DOM.get('menu_'+t.id+'_co'),tw,th;tw=s.max_width?Math.min(tb.clientWidth,s.max_width):tb.clientWidth;th=s.max_height?Math.min(tb.clientHeight,s.max_height):tb.clientHeight;if(!DOM.boxModel)t.element.setStyles({width:tw+2,height:th+2});else t.element.setStyles({width:tw,height:th});if(s.max_width)DOM.setStyle(co,'width',tw);if(s.max_height){DOM.setStyle(co,'height',th);if(tb.clientHeight<s.max_height)DOM.setStyle(co,'overflow','hidden');}},showMenu:function(x,y,px){var t=this,s=t.settings,co,vp=DOM.getViewPort(),w,h,mx,my,ot=2,dm,tb;t.collapse(1);if(t.isMenuVisible)return;if(!t.rendered){co=DOM.add(t.settings.container,t.renderNode());each(t.items,function(o){o.postRender();});t.element=new Element('menu_'+t.id,{blocker:1,container:s.container});}else co=DOM.get('menu_'+t.id);if(!tinymce.isOpera)DOM.setStyles(co,{left:-0xFFFF,top:-0xFFFF});DOM.show(co);t.update();x+=s.offset_x||0;y+=s.offset_y||0;vp.w-=4;vp.h-=4;if(s.constrain){w=co.clientWidth-ot;h=co.clientHeight-ot;mx=vp.x+vp.w;my=vp.y+vp.h;if((x+s.vp_offset_x+w)>mx)x=px?px-w:Math.max(0,(mx-s.vp_offset_x)-w);if((y+s.vp_offset_y+h)>my)y=Math.max(0,(my-s.vp_offset_y)-h);}DOM.setStyles(co,{left:x,top:y});t.element.update();t.isMenuVisible=1;t.mouseClickFunc=Event.add(co,t.fixIE?'mousedown':'click',function(e){var m;e=e.target;if(e&&(e=DOM.getParent(e,'TR'))&&!DOM.hasClass(e,'mceMenuItemSub')){m=t.items[e.id];if(m.isDisabled())return;dm=t;while(dm){if(dm.hideMenu)dm.hideMenu();dm=dm.settings.parent;}if(m.settings.onclick)m.settings.onclick(e);return Event.cancel(e);}});if(t.hasMenus()){t.mouseOverFunc=Event.add(co,'mouseover',function(e){var m,r,mi;e=e.target;if(e&&(e=DOM.getParent(e,'TR'))){m=t.items[e.id];if(t.lastMenu)t.lastMenu.collapse(1);if(m.isDisabled())return;if(e&&DOM.hasClass(e,'mceMenuItemSub')){r=DOM.getRect(e);m.showMenu((r.x+r.w-ot),r.y-ot,r.x);t.lastMenu=m;DOM.addClass(DOM.get(m.id).firstChild,'mceMenuItemActive');}}});}t.onShowMenu.dispatch(t);if(s.keyboard_focus){Event.add(co,'keydown',t._keyHandler,t);DOM.select('a','menu_'+t.id)[0].focus();}},hideMenu:function(c){var t=this,co=DOM.get('menu_'+t.id),e;if(!t.isMenuVisible)return;Event.remove(co,'mouseover',t.mouseOverFunc);Event.remove(co,t.fixIE?'mousedown':'click',t.mouseClickFunc);Event.remove(co,'keydown',t._keyHandler);DOM.hide(co);t.isMenuVisible=0;if(!c)t.collapse(1);if(t.element)t.element.hide();if(e=DOM.get(t.id))DOM.removeClass(e.firstChild,'mceMenuItemActive');t.onHideMenu.dispatch(t);},add:function(o){var t=this,co;o=t.parent(o);if(t.isRendered&&(co=DOM.get('menu_'+t.id)))t._add(DOM.select('tbody',co)[0],o);return o;},collapse:function(d){this.parent(d);this.hideMenu(1);},remove:function(o){DOM.remove(o.id);return this.parent(o);},destroy:function(){var t=this,co=DOM.get('menu_'+t.id);Event.remove(co,'mouseover',t.mouseOverFunc);Event.remove(co,'click',t.mouseClickFunc);if(t.element)t.element.remove();DOM.remove(co);},renderNode:function(){var t=this,s=t.settings,n,tb,co,w;w=DOM.create('div',{id:'menu_'+t.id,dir:'ltr','class':s['class'],'style':'position:absolute;left:0;top:0;z-index:150'});co=DOM.add(w,'div',{id:'menu_'+t.id+'_co','class':'mceMenu'+(s['class']?' '+s['class']:'')});t.element=new Element('menu_'+t.id,{blocker:1,container:s.container});if(s.menu_line)DOM.add(co,'span',{'class':'mceMenuLine'});n=DOM.add(co,'table',{id:'menu_'+t.id+'_tbl',border:0,cellPadding:0,cellSpacing:0});tb=DOM.add(n,'tbody');each(t.items,function(o){t._add(tb,o);});t.rendered=true;return w;},_keyHandler:function(e){if(e.keyCode==27)this.hideMenu();},_add:function(tb,o){var n,s=o.settings,a,ro,it;if(s.separator){ro=DOM.add(tb,'tr',{id:o.id,'class':'mceMenuItemSeparator'});DOM.add(ro,'td',{'class':'mceMenuItemSeparator'});if(n=ro.previousSibling)DOM.addClass(n,'mceLast');return;}n=ro=DOM.add(tb,'tr',{id:o.id,'class':'mceMenuItem mceMenuItemEnabled'});n=it=DOM.add(n,'td');n=a=DOM.add(n,'a',{href:'javascript:;',onclick:"return false;",onmousedown:'return false;'});DOM.addClass(it,s['class']);DOM.add(n,'span',{'class':'mceIcon'+(s.icon?' mce_'+s.icon:'')});n=DOM.add(n,s.element||'span',{'class':'mceText',title:o.settings.title},o.settings.title);if(o.settings.style)DOM.setAttrib(n,'style',o.settings.style);if(tb.childNodes.length==1)DOM.addClass(ro,'mceFirst');if((n=ro.previousSibling)&&DOM.hasClass(n,'mceMenuItemSeparator'))DOM.addClass(ro,'mceFirst');if(o.collapse)DOM.addClass(ro,'mceMenuItemSub');if(n=ro.previousSibling)DOM.removeClass(n,'mceLast');DOM.addClass(ro,'mceLast');}});})();(function(){var DOM=tinymce.DOM;tinymce.create('tinymce.ui.Button:tinymce.ui.Control',{Button:function(id,s){this.parent(id,s);this.classPrefix='mceButton';},renderHTML:function(){var s=this.settings,h='<a id="'+this.id+'" href="javascript:;" class="mceButton mceButtonEnabled '+s['class']+'" onmousedown="return false;" onclick="return false;" title="'+DOM.encode(s.title)+'">';if(s.image)h+='<img class="mceIcon" src="'+s.image+'" /></a>';else h+='<span class="mceIcon '+s['class']+'"></span></a>';return h;},postRender:function(){var t=this,s=t.settings;tinymce.dom.Event.add(t.id,'click',function(e){if(!t.isDisabled())return s.onclick.call(s.scope,e);});}});})();(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,each=tinymce.each,Dispatcher=tinymce.util.Dispatcher;tinymce.create('tinymce.ui.ListBox:tinymce.ui.Control',{ListBox:function(id,s){var t=this;t.parent(id,s);t.items=[];t.onChange=new Dispatcher(t);t.onPostRender=new Dispatcher(t);t.onAdd=new Dispatcher(t);t.onRenderMenu=new tinymce.util.Dispatcher(this);t.classPrefix='mceListBox';},select:function(v){var t=this,e,fv;if(v!=t.selectedValue){e=DOM.get(t.id+'_text');t.selectedValue=v;each(t.items,function(o){if(o.value==v){DOM.setHTML(e,DOM.encode(o.title));fv=1;return false;}});if(!fv){DOM.setHTML(e,DOM.encode(t.settings.title));DOM.addClass(e,'mceTitle');e=0;return;}else DOM.removeClass(e,'mceTitle');}e=0;},add:function(n,v,o){var t=this;o=o||{};o=tinymce.extend(o,{title:n,value:v});t.items.push(o);t.onAdd.dispatch(t,o);},getLength:function(){return this.items.length;},renderHTML:function(){var h='',t=this,s=t.settings;h='<table id="'+t.id+'" cellpadding="0" cellspacing="0" class="mceListBox mceListBoxEnabled'+(s['class']?(' '+s['class']):'')+'"><tbody><tr>';h+='<td>'+DOM.createHTML('a',{id:t.id+'_text',href:'javascript:;','class':'mceText',onclick:"return false;",onmousedown:'return false;'},DOM.encode(t.settings.title))+'</td>';h+='<td>'+DOM.createHTML('a',{id:t.id+'_open',tabindex:-1,href:'javascript:;','class':'mceOpen',onclick:"return false;",onmousedown:'return false;'},'<span></span>')+'</td>';h+='</tr></tbody></table>';return h;},showMenu:function(){var t=this,p1,p2,e=DOM.get(this.id),m;if(t.isDisabled()||t.items.length==0)return;if(!t.isMenuRendered){t.renderMenu();t.isMenuRendered=true;}p1=DOM.getPos(this.settings.menu_container);p2=DOM.getPos(e);m=t.menu;m.settings.offset_x=p2.x;m.settings.offset_y=p2.y;m.settings.keyboard_focus=t._focused;if(t.oldID)m.items[t.oldID].setSelected(0);each(t.items,function(o){if(o.value===t.selectedValue){m.items[o.id].setSelected(1);t.oldID=o.id;}});m.showMenu(0,e.clientHeight);Event.add(document,'mousedown',t.hideMenu,t);DOM.addClass(t.id,'mceListBoxSelected');},hideMenu:function(e){var t=this;if(!e||!DOM.getParent(e.target,function(n){return DOM.hasClass(n,'mceMenu');})){DOM.removeClass(t.id,'mceListBoxSelected');Event.remove(document,'mousedown',t.hideMenu,t);if(t.menu)t.menu.hideMenu();}},renderMenu:function(){var t=this,m;m=t.settings.control_manager.createDropMenu(t.id+'_menu',{menu_line:1,'class':'mceListBoxMenu mceNoIcons',max_width:150,max_height:150});m.onHideMenu.add(t.hideMenu,t);m.add({title:t.settings.title,'class':'mceMenuItemTitle'}).setDisabled(1);each(t.items,function(o){o.id=DOM.uniqueId();o.onclick=function(){if(t.settings.onselect(o.value)!==false)t.select(o.value);};m.add(o);});t.onRenderMenu.dispatch(t,m);t.menu=m;},postRender:function(){var t=this;Event.add(t.id,'click',t.showMenu,t);Event.add(t.id+'_text','focus',function(){t._focused=1;});Event.add(t.id+'_text','blur',function(){t._focused=0;});if(tinymce.isIE6||!DOM.boxModel){Event.add(t.id,'mouseover',function(){if(!DOM.hasClass(t.id,'mceListBoxDisabled'))DOM.addClass(t.id,'mceListBoxHover');});Event.add(t.id,'mouseout',function(){if(!DOM.hasClass(t.id,'mceListBoxDisabled'))DOM.removeClass(t.id,'mceListBoxHover');});}t.onPostRender.dispatch(t,DOM.get(t.id));}});})();(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,each=tinymce.each,Dispatcher=tinymce.util.Dispatcher;tinymce.create('tinymce.ui.NativeListBox:tinymce.ui.ListBox',{NativeListBox:function(id,s){this.parent(id,s);this.classPrefix='mceNativeListBox';},setDisabled:function(s){DOM.get(this.id).disabled=s;},isDisabled:function(){return DOM.get(this.id).disabled;},select:function(v){var e=DOM.get(this.id),ol=e.options;v=''+(v||'');e.selectedIndex=0;each(ol,function(o,i){if(o.value==v){e.selectedIndex=i;return false;}});},add:function(n,v,a){var o,t=this;a=a||{};a.value=v;if(t.isRendered())DOM.add(DOM.get(this.id),'option',a,n);o={title:n,value:v,attribs:a};t.items.push(o);t.onAdd.dispatch(t,o);},getLength:function(){return DOM.get(this.id).options.length-1;},renderHTML:function(){var h,t=this;h=DOM.createHTML('option',{value:''},'-- '+t.settings.title+' --');each(t.items,function(it){h+=DOM.createHTML('option',{value:it.value},it.title);});h=DOM.createHTML('select',{id:t.id,'class':'mceNativeListBox'},h);return h;},postRender:function(){var t=this,ch;t.rendered=true;function onChange(e){var v=e.target.options[e.target.selectedIndex].value;t.onChange.dispatch(t,v);if(t.settings.onselect)t.settings.onselect(v);};Event.add(t.id,'change',onChange);Event.add(t.id,'keydown',function(e){var bf;Event.remove(t.id,'change',ch);bf=Event.add(t.id,'blur',function(){Event.add(t.id,'change',onChange);Event.remove(t.id,'blur',bf);});if(e.keyCode==13||e.keyCode==32){onChange(e);return Event.cancel(e);}});t.onPostRender.dispatch(t,DOM.get(t.id));}});})();(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,each=tinymce.each;tinymce.create('tinymce.ui.MenuButton:tinymce.ui.Button',{MenuButton:function(id,s){this.parent(id,s);this.onRenderMenu=new tinymce.util.Dispatcher(this);s.menu_container=s.menu_container||document.body;},showMenu:function(){var t=this,p1,p2,e=DOM.get(t.id),m;if(t.isDisabled())return;if(!t.isMenuRendered){t.renderMenu();t.isMenuRendered=true;}p1=DOM.getPos(t.settings.menu_container);p2=DOM.getPos(e);m=t.menu;m.settings.offset_x=p2.x;m.settings.offset_y=p2.y;m.settings.vp_offset_x=p2.x;m.settings.vp_offset_y=p2.y;m.settings.keyboard_focus=t._focused;m.showMenu(0,e.clientHeight);Event.add(document,'mousedown',t.hideMenu,t);t.setState('Selected',1);},renderMenu:function(){var t=this,m;m=t.settings.control_manager.createDropMenu(t.id+'_menu',{menu_line:1,'class':this.classPrefix+'Menu',icons:t.settings.icons});m.onHideMenu.add(t.hideMenu,t);t.onRenderMenu.dispatch(t,m);t.menu=m;},hideMenu:function(e){var t=this;if(!e||!DOM.getParent(e.target,function(n){return DOM.hasClass(n,'mceMenu');})){t.setState('Selected',0);Event.remove(document,'mousedown',t.hideMenu,t);if(t.menu)t.menu.hideMenu();}},postRender:function(){var t=this,s=t.settings;Event.add(t.id,'click',function(){if(!t.isDisabled()){if(s.onclick)s.onclick(t.value);t.showMenu();}});}});})();(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,each=tinymce.each;tinymce.create('tinymce.ui.SplitButton:tinymce.ui.MenuButton',{SplitButton:function(id,s){this.parent(id,s);this.classPrefix='mceSplitButton';},renderHTML:function(){var h,t=this,s=t.settings,h1;h='<tbody><tr>';if(s.image)h1=DOM.createHTML('img ',{src:s.image,'class':'mceAction '+s['class']});else h1=DOM.createHTML('span',{'class':'mceAction '+s['class']},'');h+='<td>'+DOM.createHTML('a',{id:t.id+'_action',href:'javascript:;','class':'mceAction '+s['class'],onclick:"return false;",onmousedown:'return false;',title:s.title},h1)+'</td>';h1=DOM.createHTML('span',{'class':'mceOpen '+s['class']});h+='<td>'+DOM.createHTML('a',{id:t.id+'_open',href:'javascript:;','class':'mceOpen '+s['class'],onclick:"return false;",onmousedown:'return false;',title:s.title},h1)+'</td>';h+='</tr></tbody>';return DOM.createHTML('table',{id:t.id,'class':'mceSplitButton mceSplitButtonEnabled '+s['class'],cellpadding:'0',cellspacing:'0',onmousedown:'return false;',title:s.title},h);},postRender:function(){var t=this,s=t.settings;if(s.onclick){Event.add(t.id+'_action','click',function(){if(!t.isDisabled())s.onclick(t.value);});}Event.add(t.id+'_open','click',t.showMenu,t);Event.add(t.id+'_open','focus',function(){t._focused=1;});Event.add(t.id+'_open','blur',function(){t._focused=0;});if(tinymce.isIE6||!DOM.boxModel){Event.add(t.id,'mouseover',function(){if(!DOM.hasClass(t.id,'mceSplitButtonDisabled'))DOM.addClass(t.id,'mceSplitButtonHover');});Event.add(t.id,'mouseout',function(){if(!DOM.hasClass(t.id,'mceSplitButtonDisabled'))DOM.removeClass(t.id,'mceSplitButtonHover');});}}});})();(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,is=tinymce.is,each=tinymce.each;tinymce.create('tinymce.ui.ColorSplitButton:tinymce.ui.SplitButton',{ColorSplitButton:function(id,s){var t=this;t.parent(id,s);t.settings=s=tinymce.extend({colors:'000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,008000,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF',grid_width:8,default_color:'#888888'},t.settings);t.value=s.default_color;},showMenu:function(){var t=this,r,p,e,p2;if(t.isDisabled())return;if(!t.isMenuRendered){t.renderMenu();t.isMenuRendered=true;}e=DOM.get(t.id);DOM.show(t.id+'_menu');DOM.addClass(e,'mceSplitButtonSelected');p2=DOM.getPos(e);DOM.setStyles(t.id+'_menu',{left:p2.x,top:p2.y+e.clientHeight,zIndex:150});e=0;Event.add(document,'mousedown',t.hideMenu,t);if(t._focused){t._keyHandler=Event.add(t.id+'_menu','keydown',function(e){if(e.keyCode==27)t.hideMenu();});DOM.select('a',t.id+'_menu')[0].focus();}},hideMenu:function(e){var t=this;if(!e||!DOM.getParent(e.target,function(n){return DOM.hasClass(n,'mceSplitButtonMenu');})){DOM.removeClass(t.id,'mceSplitButtonSelected');Event.remove(document,'mousedown',t.hideMenu,t);Event.remove(t.id+'_menu','keydown',t._keyHandler);DOM.hide(t.id+'_menu');}},renderMenu:function(){var t=this,m,i=0,s=t.settings,n,tb,tr,w;w=DOM.add(s.menu_container,'div',{id:t.id+'_menu',dir:'ltr','class':s['menu_class']+' '+s['class'],style:'position:absolute;left:0;top:-1000px;'});m=DOM.add(w,'div',{'class':s['class']+' mceSplitButtonMenu'});DOM.add(m,'span',{'class':'mceMenuLine'});n=DOM.add(m,'table',{'class':'mceColorSplitMenu'});tb=DOM.add(n,'tbody');i=0;each(is(s.colors,'array')?s.colors:s.colors.split(','),function(c){c=c.replace(/^#/,'');if(!i--){tr=DOM.add(tb,'tr');i=s.grid_width-1;}n=DOM.add(tr,'td');n=DOM.add(n,'a',{href:'javascript:;',style:{backgroundColor:'#'+c}});Event.add(n,'click',function(){t.setColor('#'+c);});});if(s.more_colors_func){n=DOM.add(tb,'tr');n=DOM.add(n,'td',{colspan:s.grid_width,'class':'mceMoreColors'});n=DOM.add(n,'a',{href:'javascript:;',onclick:'return false;','class':'mceMoreColors'},s.more_colors_title);Event.add(n,'click',function(e){s.more_colors_func.call(s.more_colors_scope||this);return Event.cancel(e);});}DOM.addClass(m,'mceColorSplitMenu');return w;},setColor:function(c){var t=this;DOM.setStyle(t.id+'_preview','backgroundColor',c);t.value=c;t.hideMenu();t.settings.onselect(c);},postRender:function(){var t=this,id=t.id;t.parent();DOM.add(id+'_action','div',{id:id+'_preview','class':'mceColorPreview'});},destroy:function(){this.parent();DOM.remove(this.id+'_menu');}});})();tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container',{renderHTML:function(){var t=this,h='',c,co,dom=tinymce.DOM,s=t.settings,i,pr,nx,cl;cl=t.controls;for(i=0;i<cl.length;i++){co=cl[i];pr=cl[i-1];nx=cl[i+1];if(i===0){c='mceToolbarStart';if(co.Button)c+=' mceToolbarStartButton';else if(co.SplitButton)c+=' mceToolbarStartSplitButton';else if(co.ListBox)c+=' mceToolbarStartListBox';h+=dom.createHTML('td',{'class':c},dom.createHTML('span',null,'<!-- IE -->'));}if(pr&&co.ListBox){if(pr.Button||pr.SplitButton)h+=dom.createHTML('td',{'class':'mceToolbarEnd'},dom.createHTML('span',null,'<!-- IE -->'));}if(dom.stdMode)h+='<td style="position: relative">'+co.renderHTML()+'</td>';else h+='<td>'+co.renderHTML()+'</td>';if(nx&&co.ListBox){if(nx.Button||nx.SplitButton)h+=dom.createHTML('td',{'class':'mceToolbarStart'},dom.createHTML('span',null,'<!-- IE -->'));}}c='mceToolbarEnd';if(co.Button)c+=' mceToolbarEndButton';else if(co.SplitButton)c+=' mceToolbarEndSplitButton';else if(co.ListBox)c+=' mceToolbarEndListBox';h+=dom.createHTML('td',{'class':c},dom.createHTML('span',null,'<!-- IE -->'));return dom.createHTML('table',{id:t.id,'class':'mceToolbar'+(s['class']?' '+s['class']:''),cellpadding:'0',cellspacing:'0',align:t.settings.align||''},'<tbody><tr>'+h+'</tr></tbody>');}});(function(){var Dispatcher=tinymce.util.Dispatcher,each=tinymce.each;tinymce.create('tinymce.AddOnManager',{items:[],urls:{},lookup:{},onAdd:new Dispatcher(this),get:function(n){return this.lookup[n];},requireLangPack:function(n){var u,s;if(tinymce.EditorManager.settings){u=this.urls[n]+'/langs/'+tinymce.EditorManager.settings.language+'.js';s=tinymce.EditorManager.settings;if(s){if(!tinymce.dom.Event.domLoaded&&!s.strict_mode)tinymce.ScriptLoader.load(u);else tinymce.ScriptLoader.add(u);}}},add:function(id,o){this.items.push(o);this.lookup[id]=o;this.onAdd.dispatch(this,id,o);return o;},load:function(n,u,cb,s){var t=this;if(t.urls[n])return;if(u.indexOf('/')!=0&&u.indexOf('://')==-1)u=tinymce.baseURL+'/'+u;t.urls[n]=u.substring(0,u.lastIndexOf('/'));tinymce.ScriptLoader.add(u,cb,s);}});tinymce.PluginManager=new tinymce.AddOnManager();tinymce.ThemeManager=new tinymce.AddOnManager();}());(function(){var each=tinymce.each,extend=tinymce.extend,DOM=tinymce.DOM,Event=tinymce.dom.Event,ThemeManager=tinymce.ThemeManager,PluginManager=tinymce.PluginManager,explode=tinymce.explode;tinymce.create('static tinymce.EditorManager',{editors:{},i18n:{},activeEditor:null,init:function(s){var t=this,pl,sl=tinymce.ScriptLoader,c;function execCallback(se,n,s){var f=se[n];if(!f)return;if(tinymce.is(f,'string')){s=f.replace(/\.\w+$/,'');s=s?tinymce.resolve(s):0;f=tinymce.resolve(f);}return f.apply(s||this,Array.prototype.slice.call(arguments,2));};s=extend({theme:"simple",language:"en",strict_loading_mode:document.contentType=='application/xhtml+xml'},s);t.settings=s;if(!Event.domLoaded&&!s.strict_loading_mode){if(s.language)sl.add(tinymce.baseURL+'/langs/'+s.language+'.js');if(s.theme&&s.theme.charAt(0)!='-'&&!ThemeManager.urls[s.theme])ThemeManager.load(s.theme,'themes/'+s.theme+'/editor_template'+tinymce.suffix+'.js');if(s.plugins){pl=explode(s.plugins);if(tinymce.inArray(pl,'compat2x')!=-1)PluginManager.load('compat2x','plugins/compat2x/editor_plugin'+tinymce.suffix+'.js');each(pl,function(v){if(v&&v.charAt(0)!='-'&&!PluginManager.urls[v]){if(!tinymce.isWebKit&&v=='safari')return;PluginManager.load(v,'plugins/'+v+'/editor_plugin'+tinymce.suffix+'.js');}});}sl.loadQueue();}Event.add(document,'init',function(){var l,co;execCallback(s,'onpageload');if(s.browsers){l=false;each(explode(s.browsers),function(v){switch(v){case'ie':case'msie':if(tinymce.isIE)l=true;break;case'gecko':if(tinymce.isGecko)l=true;break;case'safari':case'webkit':if(tinymce.isWebKit)l=true;break;case'opera':if(tinymce.isOpera)l=true;break;}});if(!l)return;}switch(s.mode){case"exact":l=s.elements||'';if(l.length>0){each(explode(l),function(v){if(DOM.get(v))new tinymce.Editor(v,s).render(1);else{c=0;each(document.forms,function(f){each(f.elements,function(e){if(e.name===v){v='mce_editor_'+c;DOM.setAttrib(e,'id',v);new tinymce.Editor(v,s).render(1);}});});}});}break;case"textareas":case"specific_textareas":function hasClass(n,c){return new RegExp('\\b'+c+'\\b','g').test(n.className);};each(DOM.select('textarea'),function(v){if(s.editor_deselector&&hasClass(v,s.editor_deselector))return;if(!s.editor_selector||hasClass(v,s.editor_selector))new tinymce.Editor(v.id=(v.id||v.name||(v.id=DOM.uniqueId())),s).render(1);});break;}if(s.oninit){l=co=0;each(t.editors,function(ed){co++;if(!ed.initialized){ed.onInit.add(function(){l++;if(l==co)execCallback(s,'oninit');});}else l++;if(l==co)execCallback(s,'oninit');});}});},get:function(id){return this.editors[id];},getInstanceById:function(id){return this.get(id);},add:function(e){this.editors[e.id]=e;this._setActive(e);return e;},remove:function(e){var t=this;if(!t.editors[e.id])return null;delete t.editors[e.id];if(t.activeEditor==e){each(t.editors,function(e){t._setActive(e);return false;});}e._destroy();return e;},execCommand:function(c,u,v){var t=this,ed=t.get(v);switch(c){case"mceFocus":ed.focus();return true;case"mceAddEditor":case"mceAddControl":new tinymce.Editor(v,t.settings).render();return true;case"mceAddFrameControl":return true;case"mceRemoveEditor":case"mceRemoveControl":ed.remove();return true;case'mceToggleEditor':if(!ed){t.execCommand('mceAddControl',0,v);return true;}if(ed.isHidden())ed.show();else ed.hide();return true;}if(t.activeEditor)return t.activeEditor.execCommand(c,u,v);return false;},execInstanceCommand:function(id,c,u,v){var ed=this.get(id);if(ed)return ed.execCommand(c,u,v);return false;},triggerSave:function(){each(this.editors,function(e){e.save();});},addI18n:function(p,o){var lo,i18n=this.i18n;if(!tinymce.is(p,'string')){each(p,function(o,lc){each(o,function(o,g){each(o,function(o,k){if(g==='common')i18n[lc+'.'+k]=o;else i18n[lc+'.'+g+'.'+k]=o;});});});}else{each(o,function(o,k){i18n[p+'.'+k]=o;});}},_setActive:function(e){this.selectedInstance=this.activeEditor=e;}});tinymce.documentBaseURL=window.location.href.replace(/[\?#].*$/,'').replace(/[\/\\][^\/]+$/,'');if(!/[\/\\]$/.test(tinymce.documentBaseURL))tinymce.documentBaseURL+='/';tinymce.baseURL=new tinymce.util.URI(tinymce.documentBaseURL).toAbsolute(tinymce.baseURL);tinymce.EditorManager.baseURI=new tinymce.util.URI(tinymce.baseURL);if(tinymce.EditorManager.baseURI.host!=window.location.hostname&&window.location.hostname)document.domain=tinymce.relaxedDomain=window.location.hostname.replace(/.*\.(.+\..+)$/,'$1');})();var tinyMCE=window.tinyMCE=tinymce.EditorManager;(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,extend=tinymce.extend,Dispatcher=tinymce.util.Dispatcher;var each=tinymce.each,isGecko=tinymce.isGecko,isIE=tinymce.isIE,isWebKit=tinymce.isWebKit;var is=tinymce.is,ThemeManager=tinymce.ThemeManager,PluginManager=tinymce.PluginManager,EditorManager=tinymce.EditorManager;var inArray=tinymce.inArray,grep=tinymce.grep,explode=tinymce.explode;tinymce.create('tinymce.Editor',{Editor:function(id,s){var t=this;t.id=t.editorId=id;t.execCommands={};t.queryStateCommands={};t.queryValueCommands={};t.plugins={};each(['onPreInit','onBeforeRenderUI','onPostRender','onInit','onRemove','onActivate','onDeactivate','onClick','onEvent','onMouseUp','onMouseDown','onDblClick','onKeyDown','onKeyUp','onKeyPress','onContextMenu','onSubmit','onReset','onPaste','onPreProcess','onPostProcess','onBeforeSetContent','onBeforeGetContent','onSetContent','onGetContent','onLoadContent','onSaveContent','onNodeChange','onChange','onBeforeExecCommand','onExecCommand','onUndo','onRedo','onVisualAid','onSetProgressState','onBeforeDestroy'],function(e){t[e]=new Dispatcher(t);});t.settings=s=extend({id:id,language:'en',docs_language:'en',theme:'simple',skin:'default',delta_width:0,delta_height:0,popup_css:'',plugins:'',document_base_url:tinymce.documentBaseURL,add_form_submit_trigger:1,submit_patch:1,add_unload_trigger:1,convert_urls:1,relative_urls:1,remove_script_host:1,table_inline_editing:0,object_resizing:1,cleanup:1,accessibility_focus:1,custom_shortcuts:1,custom_undo_redo_keyboard_shortcuts:1,custom_undo_redo_restore_selection:1,custom_undo_redo:1,doctype:'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">',visual_table_class:'mceItemTable',visual:1,inline_styles:true,convert_fonts_to_spans:true,font_size_style_values:'xx-small,x-small,small,medium,large,x-large,xx-large',apply_source_formatting:1,directionality:'ltr',forced_root_block:'p',valid_elements:'@[id|class|style|title|dir<ltr?rtl|lang|xml::lang|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],a[rel|rev|charset|hreflang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur],strong/b,em/i,strike,u,#p[align],-ol[type|compact],-ul[type|compact],-li,br,img[longdesc|usemap|src|border|alt=|title|hspace|vspace|width|height|align],-sub,-sup,-blockquote,-table[border=0|cellspacing|cellpadding|width|frame|rules|height|align|summary|bgcolor|background|bordercolor],-tr[rowspan|width|height|align|valign|bgcolor|background|bordercolor],tbody,thead,tfoot,#td[colspan|rowspan|width|height|align|valign|bgcolor|background|bordercolor|scope],#th[colspan|rowspan|width|height|align|valign|scope],caption,-div,-span,-code,-pre,address,-h1,-h2,-h3,-h4,-h5,-h6,hr[size|noshade],-font[face|size|color],dd,dl,dt,cite,abbr,acronym,del[datetime|cite],ins[datetime|cite],object[classid|width|height|codebase|*],param[name|value|_value],embed[type|width|height|src|*],script[src|type],map[name],area[shape|coords|href|alt|target],bdo,button,col[align|char|charoff|span|valign|width],colgroup[align|char|charoff|span|valign|width],dfn,fieldset,form[action|accept|accept-charset|enctype|method],input[accept|alt|checked|disabled|maxlength|name|readonly|size|src|type|value],kbd,label[for],legend,noscript,optgroup[label|disabled],option[disabled|label|selected|value],q[cite],samp,select[disabled|multiple|name|size],small,textarea[cols|rows|disabled|name|readonly],tt,var,big',hidden_input:1,padd_empty_editor:1,render_ui:1,init_theme:1,force_p_newlines:1,indentation:'30px'},s);t.documentBaseURI=new tinymce.util.URI(s.document_base_url||tinymce.documentBaseURL,{base_uri:tinyMCE.baseURI});t.baseURI=EditorManager.baseURI;t.execCallback('setup',t);},render:function(nst){var t=this,s=t.settings,id=t.id,sl=tinymce.ScriptLoader;if(!Event.domLoaded){Event.add(document,'init',function(){t.render();});return;}if(!nst){s.strict_loading_mode=1;tinyMCE.settings=s;}if(!t.getElement())return;if(s.strict_loading_mode){sl.settings.strict_mode=s.strict_loading_mode;tinymce.DOM.settings.strict=1;}if(!/TEXTAREA|INPUT/i.test(t.getElement().nodeName)&&s.hidden_input&&DOM.getParent(id,'form'))DOM.insertAfter(DOM.create('input',{type:'hidden',name:id}),id);t.windowManager=new tinymce.WindowManager(t);if(s.encoding=='xml'){t.onGetContent.add(function(ed,o){if(o.get)o.content=DOM.encode(o.content);});}if(s.add_form_submit_trigger){t.onSubmit.addToTop(function(){if(t.initialized){t.save();t.isNotDirty=1;}});}if(s.add_unload_trigger){Event.add(document,'beforeunload',function(){if(t.initialized&&!t.destroyed)t.save({format:'raw',no_events:true});});}tinymce.addUnload(t._destroy,t);if(s.submit_patch){t.onBeforeRenderUI.add(function(){var n=t.getElement().form;if(!n)return;if(n._mceOldSubmit)return;if(!n.submit.nodeType&&!n.submit.length){t.formElement=n;n._mceOldSubmit=n.submit;n.submit=function(){EditorManager.triggerSave();t.isNotDirty=1;return this._mceOldSubmit(this);};}n=null;});}function loadScripts(){if(s.language)sl.add(tinymce.baseURL+'/langs/'+s.language+'.js');if(s.theme.charAt(0)!='-'&&!ThemeManager.urls[s.theme])ThemeManager.load(s.theme,'themes/'+s.theme+'/editor_template'+tinymce.suffix+'.js');each(explode(s.plugins),function(p){if(p&&p.charAt(0)!='-'&&!PluginManager.urls[p]){if(!isWebKit&&p=='safari')return;PluginManager.load(p,'plugins/'+p+'/editor_plugin'+tinymce.suffix+'.js');}});sl.loadQueue(function(){if(s.ask){function ask(){t.windowManager.confirm(t.getLang('edit_confirm'),function(s){if(s)t.init();else Event.remove(t.id,'focus',ask);});};Event.add(t.id,'focus',ask);return;}if(!t.removed)t.init();});};if(s.plugins.indexOf('compat2x')!=-1){PluginManager.load('compat2x','plugins/compat2x/editor_plugin'+tinymce.suffix+'.js');sl.loadQueue(loadScripts);}else loadScripts();},init:function(){var n,t=this,s=t.settings,w,h,e=t.getElement(),o,ti,u,bi,bc,re;EditorManager.add(t);s.theme=s.theme.replace(/-/,'');o=ThemeManager.get(s.theme);t.theme=new o();if(t.theme.init&&s.init_theme)t.theme.init(t,ThemeManager.urls[s.theme]||tinymce.documentBaseURL.replace(/\/$/,''));each(explode(s.plugins.replace(/\-/g,'')),function(p){var c=PluginManager.get(p),u=PluginManager.urls[p]||tinymce.documentBaseURL.replace(/\/$/,''),po;if(c){po=new c(t,u);t.plugins[p]=po;if(po.init)po.init(t,u);}});if(s.popup_css)s.popup_css=t.documentBaseURI.toAbsolute(s.popup_css);else s.popup_css=t.baseURI.toAbsolute("themes/"+s.theme+"/skins/"+s.skin+"/dialog.css");if(s.popup_css_add)s.popup_css+=','+t.documentBaseURI.toAbsolute(s.popup_css_add);t.controlManager=new tinymce.ControlManager(t);t.undoManager=new tinymce.UndoManager(t);t.undoManager.onAdd.add(function(um,l){return t.onChange.dispatch(t,l,um);});t.undoManager.onUndo.add(function(um,l){return t.onUndo.dispatch(t,l,um);});t.undoManager.onRedo.add(function(um,l){return t.onRedo.dispatch(t,l,um);});if(s.custom_undo_redo){t.onExecCommand.add(function(ed,cmd,ui,val,a){if(cmd!='Undo'&&cmd!='Redo'&&cmd!='mceRepaint'&&(!a||!a.skip_undo))t.undoManager.add();});}t.onExecCommand.add(function(ed,c){if(!/^(FontName|FontSize)$/.test(c))t.nodeChanged();});if(isGecko){function repaint(a,o){if(!o||!o.initial)t.execCommand('mceRepaint');};t.onUndo.add(repaint);t.onRedo.add(repaint);t.onSetContent.add(repaint);}t.onBeforeRenderUI.dispatch(t,t.controlManager);if(s.render_ui){w=s.width||e.style.width||e.clientWidth;h=s.height||e.style.height||e.clientHeight;t.orgDisplay=e.style.display;re=/^[0-9\.]+(|px)$/i;if(re.test(''+w))w=Math.max(parseInt(w)+(o.deltaWidth||0),100);if(re.test(''+h))h=Math.max(parseInt(h)+(o.deltaHeight||0),100);o=t.theme.renderUI({targetNode:e,width:w,height:h,deltaWidth:s.delta_width,deltaHeight:s.delta_height});t.editorContainer=o.editorContainer;}DOM.setStyles(o.sizeContainer||o.editorContainer,{width:w,height:h});h=(o.iframeHeight||h)+((h+'').indexOf('%')==-1?(o.deltaHeight||0):'');if(h<100)h=100;t.iframeHTML=s.doctype+'<html><head xmlns="http://www.w3.org/1999/xhtml"><base href="'+t.documentBaseURI.getURI()+'"></base>';t.iframeHTML+='<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';if(tinymce.relaxedDomain)t.iframeHTML+='<script type="text/javascript">document.domain = "'+tinymce.relaxedDomain+'";</script>';bi=s.body_id||'tinymce';if(bi.indexOf('=')!=-1){bi=t.getParam('body_id','','hash');bi=bi[t.id]||bi;}bc=s.body_class||'';if(bc.indexOf('=')!=-1){bc=t.getParam('body_class','','hash');bc=bc[t.id]||'';}t.iframeHTML+='</head><body id="'+bi+'" class="mceContentBody '+bc+'"></body></html>';if(tinymce.relaxedDomain){if(isIE)u='javascript:(function(){document.open();document.domain="'+document.domain+'";var ed = window.parent.tinyMCE.get("'+t.id+'");document.write(ed.iframeHTML);document.close();ed.setupIframe();})()';else if(tinymce.isOpera)u='javascript:(function(){document.open();document.domain="'+document.domain+'";document.close();ed.setupIframe();})()';}n=DOM.add(o.iframeContainer,'iframe',{id:t.id+"_ifr",src:u||'javascript:""',frameBorder:'0',style:{width:'100%',height:h}});t.contentAreaContainer=o.iframeContainer;DOM.get(o.editorContainer).style.display=t.orgDisplay;DOM.get(t.id).style.display='none';if(tinymce.isOldWebKit){Event.add(n,'load',t.setupIframe,t);n.src=tinymce.baseURL+'/plugins/safari/blank.htm';}else{if(!isIE||!tinymce.relaxedDomain)t.setupIframe();e=n=o=null;}},setupIframe:function(){var t=this,s=t.settings,e=DOM.get(t.id),d=t.getDoc(),h;if(!isIE||!tinymce.relaxedDomain){d.open();d.write(t.iframeHTML);d.close();}if(!isIE){try{d.designMode='On';}catch(ex){}}if(isIE)t.getBody().contentEditable=true;t.dom=new tinymce.DOM.DOMUtils(t.getDoc(),{keep_values:true,url_converter:t.convertURL,url_converter_scope:t,hex_colors:s.force_hex_style_colors,class_filter:s.class_filter,update_styles:1,fix_ie_paragraphs:1});t.serializer=new tinymce.dom.Serializer({entity_encoding:s.entity_encoding,entities:s.entities,valid_elements:s.verify_html===false?'*[*]':s.valid_elements,extended_valid_elements:s.extended_valid_elements,valid_child_elements:s.valid_child_elements,invalid_elements:s.invalid_elements,fix_table_elements:s.fix_table_elements,fix_list_elements:s.fix_list_elements,fix_content_duplication:s.fix_content_duplication,convert_fonts_to_spans:s.convert_fonts_to_spans,font_size_classes:s.font_size_classes,font_size_style_values:s.font_size_style_values,apply_source_formatting:s.apply_source_formatting,remove_linebreaks:s.remove_linebreaks,dom:t.dom});t.selection=new tinymce.dom.Selection(t.dom,t.getWin(),t.serializer);t.forceBlocks=new tinymce.ForceBlocks(t,{forced_root_block:s.forced_root_block});t.editorCommands=new tinymce.EditorCommands(t);t.serializer.onPreProcess.add(function(se,o){return t.onPreProcess.dispatch(t,o,se);});t.serializer.onPostProcess.add(function(se,o){return t.onPostProcess.dispatch(t,o,se);});t.onPreInit.dispatch(t);if(!s.gecko_spellcheck)t.getBody().spellcheck=0;t._addEvents();t.controlManager.onPostRender.dispatch(t,t.controlManager);t.onPostRender.dispatch(t);if(s.directionality)t.getBody().dir=s.directionality;if(s.nowrap)t.getBody().style.whiteSpace="nowrap";if(s.auto_resize)t.onNodeChange.add(t.resizeToContent,t);if(s.custom_elements){function handleCustom(ed,o){each(explode(s.custom_elements),function(v){var n;if(v.indexOf('~')===0){v=v.substring(1);n='span';}else n='div';o.content=o.content.replace(new RegExp('<('+v+')([^>]*)>','g'),'<'+n+' mce_name="$1"$2>');o.content=o.content.replace(new RegExp('</('+v+')>','g'),'</'+n+'>');});};t.onBeforeSetContent.add(handleCustom);t.onPostProcess.add(function(ed,o){if(o.set)handleCustom(ed,o)});}if(s.handle_node_change_callback){t.onNodeChange.add(function(ed,cm,n){t.execCallback('handle_node_change_callback',t.id,n,-1,-1,true,t.selection.isCollapsed());});}if(s.save_callback){t.onSaveContent.add(function(ed,o){var h=t.execCallback('save_callback',t.id,o.content,t.getBody());if(h)o.content=h;});}if(s.onchange_callback){t.onChange.add(function(ed,l){t.execCallback('onchange_callback',t,l);});}if(s.convert_newlines_to_brs){t.onBeforeSetContent.add(function(ed,o){if(o.initial)o.content=o.content.replace(/\r?\n/g,'<br />');});}if(s.fix_nesting&&isIE){t.onBeforeSetContent.add(function(ed,o){o.content=t._fixNesting(o.content);});}if(s.preformatted){t.onPostProcess.add(function(ed,o){o.content=o.content.replace(/^\s*<pre.*?>/,'');o.content=o.content.replace(/<\/pre>\s*$/,'');if(o.set)o.content='<pre class="mceItemHidden">'+o.content+'</pre>';});}if(s.verify_css_classes){t.serializer.attribValueFilter=function(n,v){var s,cl;if(n=='class'){if(!t.classesRE){cl=t.dom.getClasses();if(cl.length>0){s='';each(cl,function(o){s+=(s?'|':'')+o['class'];});t.classesRE=new RegExp('('+s+')','gi');}}return!t.classesRE||/(\bmceItem\w+\b|\bmceTemp\w+\b)/g.test(v)||t.classesRE.test(v)?v:'';}return v;};}if(s.convert_fonts_to_spans)t._convertFonts();if(s.inline_styles)t._convertInlineElements();if(s.cleanup_callback){t.onBeforeSetContent.add(function(ed,o){o.content=t.execCallback('cleanup_callback','insert_to_editor',o.content,o);});t.onPreProcess.add(function(ed,o){if(o.set)t.execCallback('cleanup_callback','insert_to_editor_dom',o.node,o);if(o.get)t.execCallback('cleanup_callback','get_from_editor_dom',o.node,o);});t.onPostProcess.add(function(ed,o){if(o.set)o.content=t.execCallback('cleanup_callback','insert_to_editor',o.content,o);if(o.get)o.content=t.execCallback('cleanup_callback','get_from_editor',o.content,o);});}if(s.save_callback){t.onGetContent.add(function(ed,o){if(o.save)o.content=t.execCallback('save_callback',t.id,o.content,t.getBody());});}if(s.handle_event_callback){t.onEvent.add(function(ed,e,o){if(t.execCallback('handle_event_callback',e,ed,o)===false)Event.cancel(e);});}t.onSetContent.add(function(){t.addVisual(t.getBody());});if(s.padd_empty_editor){t.onPostProcess.add(function(ed,o){o.content=o.content.replace(/^<p>(&nbsp;|#160;|\s|\u00a0)<\/p>$/,'');});}if(isGecko){try{d.designMode='Off';d.designMode='On';}catch(ex){}}setTimeout(function(){if(t.removed)return;t.load({initial:true,format:(s.cleanup_on_startup?'html':'raw')});t.startContent=t.getContent({format:'raw'});t.undoManager.add({initial:true});t.initialized=true;t.onInit.dispatch(t);t.execCallback('setupcontent_callback',t.id,t.getBody(),t.getDoc());t.execCallback('init_instance_callback',t);t.focus(true);t.nodeChanged({initial:1});if(s.content_css){tinymce.each(explode(s.content_css),function(u){t.dom.loadCSS(t.documentBaseURI.toAbsolute(u));});}if(s.auto_focus){setTimeout(function(){var ed=EditorManager.get(s.auto_focus);ed.selection.select(ed.getBody(),1);ed.selection.collapse(1);ed.getWin().focus();},100);}},1);e=null;},focus:function(sf){var oed,t=this;if(!sf){t.getWin().focus();}if(EditorManager.activeEditor!=t){if((oed=EditorManager.activeEditor)!=null)oed.onDeactivate.dispatch(oed,t);t.onActivate.dispatch(t,oed);}EditorManager._setActive(t);},execCallback:function(n){var t=this,f=t.settings[n],s;if(!f)return;if(t.callbackLookup&&(s=t.callbackLookup[n])){f=s.func;s=s.scope;}if(is(f,'string')){s=f.replace(/\.\w+$/,'');s=s?tinymce.resolve(s):0;f=tinymce.resolve(f);t.callbackLookup=t.callbackLookup||{};t.callbackLookup[n]={func:f,scope:s};}return f.apply(s||t,Array.prototype.slice.call(arguments,1));},translate:function(s){var c=this.settings.language,i18n=EditorManager.i18n;if(!s)return'';return i18n[c+'.'+s]||s.replace(/{\#([^}]+)\}/g,function(a,b){return i18n[c+'.'+b]||'{#'+b+'}';});},getLang:function(n,dv){return EditorManager.i18n[this.settings.language+'.'+n]||(is(dv)?dv:'{#'+n+'}');},getParam:function(n,dv,ty){var tr=tinymce.trim,v=is(this.settings[n])?this.settings[n]:dv,o;if(ty==='hash'){o={};if(is(v,'string')){each(v.indexOf('=')>0?v.split(/[;,](?![^=;,]*(?:[;,]|$))/):v.split(','),function(v){v=v.split('=');if(v.length>1)o[tr(v[0])]=tr(v[1]);else o[tr(v[0])]=tr(v);});}else o=v;return o;}return v;},nodeChanged:function(o){var t=this,s=t.selection,n=s.getNode()||t.getBody();if(t.initialized){t.onNodeChange.dispatch(t,o?o.controlManager||t.controlManager:t.controlManager,isIE&&n.ownerDocument!=t.getDoc()?t.getBody():n,s.isCollapsed(),o);}},addButton:function(n,s){var t=this;t.buttons=t.buttons||{};t.buttons[n]=s;},addCommand:function(n,f,s){this.execCommands[n]={func:f,scope:s||this};},addQueryStateHandler:function(n,f,s){this.queryStateCommands[n]={func:f,scope:s||this};},addQueryValueHandler:function(n,f,s){this.queryValueCommands[n]={func:f,scope:s||this};},addShortcut:function(pa,desc,cmd_func,sc){var t=this,c;if(!t.settings.custom_shortcuts)return false;t.shortcuts=t.shortcuts||{};if(is(cmd_func,'string')){c=cmd_func;cmd_func=function(){t.execCommand(c,false,null);};}if(is(cmd_func,'object')){c=cmd_func;cmd_func=function(){t.execCommand(c[0],c[1],c[2]);};}each(explode(pa),function(pa){var o={func:cmd_func,scope:sc||this,desc:desc,alt:false,ctrl:false,shift:false};each(explode(pa,'+'),function(v){switch(v){case'alt':case'ctrl':case'shift':o[v]=true;break;default:o.charCode=v.charCodeAt(0);o.keyCode=v.toUpperCase().charCodeAt(0);}});t.shortcuts[(o.ctrl?'ctrl':'')+','+(o.alt?'alt':'')+','+(o.shift?'shift':'')+','+o.keyCode]=o;});return true;},execCommand:function(cmd,ui,val,a){var t=this,s=0,o;if(!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(cmd)&&(!a||!a.skip_focus))t.focus();o={};t.onBeforeExecCommand.dispatch(t,cmd,ui,val,o);if(o.terminate)return false;if(t.execCallback('execcommand_callback',t.id,t.selection.getNode(),cmd,ui,val)){t.onExecCommand.dispatch(t,cmd,ui,val,a);return true;}if(o=t.execCommands[cmd]){s=o.func.call(o.scope,ui,val);t.onExecCommand.dispatch(t,cmd,ui,val,a);return s;}each(t.plugins,function(p){if(p.execCommand&&p.execCommand(cmd,ui,val)){t.onExecCommand.dispatch(t,cmd,ui,val,a);s=1;return false;}});if(s)return true;if(t.theme.execCommand&&t.theme.execCommand(cmd,ui,val)){t.onExecCommand.dispatch(t,cmd,ui,val,a);return true;}if(t.editorCommands.execCommand(cmd,ui,val)){t.onExecCommand.dispatch(t,cmd,ui,val,a);return true;}t.getDoc().execCommand(cmd,ui,val);t.onExecCommand.dispatch(t,cmd,ui,val,a);},queryCommandState:function(c){var t=this,o;if(t._isHidden())return;if(o=t.queryStateCommands[c])return o.func.call(o.scope);o=t.editorCommands.queryCommandState(c);if(o!==-1)return o;try{return this.getDoc().queryCommandState(c);}catch(ex){}},queryCommandValue:function(c){var t=this,o;if(t._isHidden())return;if(o=t.queryValueCommands[c])return o.func.call(o.scope);o=t.editorCommands.queryCommandValue(c);if(is(o))return o;try{return this.getDoc().queryCommandValue(c);}catch(ex){}},show:function(){var t=this;DOM.show(t.getContainer());DOM.hide(t.id);t.load();},hide:function(){var t=this,d=t.getDoc();if(isIE&&d)d.execCommand('SelectAll');t.save();DOM.hide(t.getContainer());DOM.setStyle(t.id,'display',t.orgDisplay);},isHidden:function(){return!DOM.isHidden(this.id);},setProgressState:function(b,ti,o){this.onSetProgressState.dispatch(this,b,ti,o);return b;},remove:function(){var t=this;t.removed=1;t.hide();DOM.remove(t.getContainer());t.execCallback('remove_instance_callback',t);t.onRemove.dispatch(t);t.onExecCommand.listeners=[];EditorManager.remove(t);},resizeToContent:function(){var t=this;DOM.setStyle(t.id+"_ifr",'height',t.getBody().scrollHeight);},load:function(o){var t=this,e=t.getElement(),h;o=o||{};o.load=true;h=t.setContent(is(e.value)?e.value:e.innerHTML,o);o.element=e;if(!o.no_events)t.onLoadContent.dispatch(t,o);o.element=e=null;return h;},save:function(o){var t=this,e=t.getElement(),h,f;if(!t.initialized)return;o=o||{};o.save=true;o.element=e;h=o.content=t.getContent(o);if(!o.no_events)t.onSaveContent.dispatch(t,o);h=o.content;if(!/TEXTAREA|INPUT/i.test(e.nodeName)){e.innerHTML=h;if(f=DOM.getParent(t.id,'form')){each(f.elements,function(e){if(e.name==t.id){e.value=h;return false;}});}}else e.value=h;o.element=e=null;return h;},setContent:function(h,o){var t=this;o=o||{};o.format=o.format||'html';o.set=true;o.content=h;if(!o.no_events)t.onBeforeSetContent.dispatch(t,o);if(!tinymce.isIE&&(h.length===0||/^\s+$/.test(h))){o.content=t.dom.setHTML(t.getBody(),'<br mce_bogus="1" />',1);o.format='raw';}o.content=t.dom.setHTML(t.getBody(),tinymce.trim(o.content));if(o.format!='raw'&&t.settings.cleanup){o.getInner=true;o.content=t.dom.setHTML(t.getBody(),t.serializer.serialize(t.getBody(),o));}if(!o.no_events)t.onSetContent.dispatch(t,o);return o.content;},getContent:function(o){var t=this,h;o=o||{};o.format=o.format||'html';o.get=true;if(!o.no_events)t.onBeforeGetContent.dispatch(t,o);if(o.format!='raw'&&t.settings.cleanup){o.getInner=true;h=t.serializer.serialize(t.getBody(),o);}else h=t.getBody().innerHTML;h=h.replace(/^\s*|\s*$/g,'');o={content:h};t.onGetContent.dispatch(t,o);return o.content;},isDirty:function(){var t=this;return tinymce.trim(t.startContent)!=tinymce.trim(t.getContent({format:'raw',no_events:1}))&&!t.isNotDirty;},getContainer:function(){var t=this;if(!t.container)t.container=DOM.get(t.editorContainer||t.id+'_parent');return t.container;},getContentAreaContainer:function(){return this.contentAreaContainer;},getElement:function(){return DOM.get(this.settings.content_element||this.id);},getWin:function(){var t=this,e;if(!t.contentWindow){e=DOM.get(t.id+"_ifr");if(e)t.contentWindow=e.contentWindow;}return t.contentWindow;},getDoc:function(){var t=this,w;if(!t.contentDocument){w=t.getWin();if(w)t.contentDocument=w.document;}return t.contentDocument;},getBody:function(){return this.bodyElement||this.getDoc().body;},convertURL:function(u,n,e){var t=this,s=t.settings;if(s.urlconverter_callback)return t.execCallback('urlconverter_callback',u,e,true,n);if(!s.convert_urls||(e&&e.nodeName=='LINK')||u.indexOf('file:')===0)return u;if(s.relative_urls)return t.documentBaseURI.toRelative(u);u=t.documentBaseURI.toAbsolute(u,s.remove_script_host);return u;},addVisual:function(e){var t=this,s=t.settings;e=e||t.getBody();if(!is(t.hasVisual))t.hasVisual=s.visual;each(t.dom.select('table,a',e),function(e){var v;switch(e.nodeName){case'TABLE':v=t.dom.getAttrib(e,'border');if(!v||v=='0'){if(t.hasVisual)t.dom.addClass(e,s.visual_table_class);else t.dom.removeClass(e,s.visual_table_class);}return;case'A':v=t.dom.getAttrib(e,'name');if(v){if(t.hasVisual)t.dom.addClass(e,'mceItemAnchor');else t.dom.removeClass(e,'mceItemAnchor');}return;}});t.onVisualAid.dispatch(t,e,t.hasVisual);},_addEvents:function(){var t=this,i,s=t.settings,lo={mouseup:'onMouseUp',mousedown:'onMouseDown',click:'onClick',keyup:'onKeyUp',keydown:'onKeyDown',keypress:'onKeyPress',submit:'onSubmit',reset:'onReset',contextmenu:'onContextMenu',dblclick:'onDblClick',paste:'onPaste'};function eventHandler(e,o){var ty=e.type;if(t.removed)return;if(t.onEvent.dispatch(t,e,o)!==false){t[lo[e.fakeType||e.type]].dispatch(t,e,o);}};each(lo,function(v,k){switch(k){case'contextmenu':if(tinymce.isOpera){Event.add(t.getDoc(),'mousedown',function(e){if(e.ctrlKey){e.fakeType='contextmenu';eventHandler(e);}});}else Event.add(t.getDoc(),k,eventHandler);break;case'paste':Event.add(t.getBody(),k,function(e){var tx,h,el,r;if(e.clipboardData)tx=e.clipboardData.getData('text/plain');else if(tinymce.isIE)tx=t.getWin().clipboardData.getData('Text');eventHandler(e,{text:tx,html:h});});break;case'submit':case'reset':Event.add(t.getElement().form||DOM.getParent(t.id,'form'),k,eventHandler);break;default:Event.add(s.content_editable?t.getBody():t.getDoc(),k,eventHandler);}});Event.add(s.content_editable?t.getBody():(isGecko?t.getDoc():t.getWin()),'focus',function(e){t.focus(true);});if(tinymce.isGecko){Event.add(t.getDoc(),'DOMNodeInserted',function(e){var v;e=e.target;if(e.nodeType===1&&e.nodeName==='IMG'&&(v=e.getAttribute('mce_src')))e.src=t.documentBaseURI.toAbsolute(v);});}if(isGecko){function setOpts(){var t=this,d=t.getDoc(),s=t.settings;if(isGecko){if(t._isHidden()){try{if(!s.content_editable)d.designMode='On';}catch(ex){}}try{d.execCommand("styleWithCSS",0,false);}catch(ex){if(!t._isHidden())d.execCommand("useCSS",0,true);}if(!s.table_inline_editing)try{d.execCommand('enableInlineTableEditing',false,false);}catch(ex){}if(!s.object_resizing)try{d.execCommand('enableObjectResizing',false,false);}catch(ex){}}};t.onBeforeExecCommand.add(setOpts);t.onMouseDown.add(setOpts);}t.onMouseUp.add(t.nodeChanged);t.onClick.add(t.nodeChanged);t.onKeyUp.add(function(ed,e){if((e.keyCode>=33&&e.keyCode<=36)||(e.keyCode>=37&&e.keyCode<=40)||e.keyCode==13||e.keyCode==45||e.keyCode==46||e.keyCode==8||e.ctrlKey)t.nodeChanged();});t.onReset.add(function(){t.setContent(t.startContent,{format:'raw'});});if(t.getParam('tab_focus')){function tabCancel(ed,e){if(e.keyCode===9)return Event.cancel(e);};function tabHandler(ed,e){var x,i,f,el,v;function find(d){f=DOM.getParent(ed.id,'form');el=f.elements;if(f){each(el,function(e,i){if(e.id==ed.id){x=i;return false;}});if(d>0){for(i=x+1;i<el.length;i++){if(el[i].type!='hidden')return el[i];}}else{for(i=x-1;i>=0;i--){if(el[i].type!='hidden')return el[i];}}}return null;};if(e.keyCode===9){v=explode(ed.getParam('tab_focus'));if(v.length==1){v[1]=v[0];v[0]=':prev';}if(e.shiftKey){if(v[0]==':prev')el=find(-1);else el=DOM.get(v[0]);}else{if(v[1]==':next')el=find(1);else el=DOM.get(v[1]);}if(el){if(ed=EditorManager.get(el.id||el.name))ed.focus();else window.setTimeout(function(){window.focus();el.focus();},10);return Event.cancel(e);}}};t.onKeyUp.add(tabCancel);if(isGecko){t.onKeyPress.add(tabHandler);t.onKeyDown.add(tabCancel);}else t.onKeyDown.add(tabHandler);}if(s.custom_shortcuts){if(s.custom_undo_redo_keyboard_shortcuts){t.addShortcut('ctrl+z',t.getLang('undo_desc'),'Undo');t.addShortcut('ctrl+y',t.getLang('redo_desc'),'Redo');}if(isGecko){t.addShortcut('ctrl+b',t.getLang('bold_desc'),'Bold');t.addShortcut('ctrl+i',t.getLang('italic_desc'),'Italic');t.addShortcut('ctrl+u',t.getLang('underline_desc'),'Underline');}for(i=1;i<=6;i++)t.addShortcut('ctrl+'+i,'',['FormatBlock',false,'<h'+i+'>']);t.addShortcut('ctrl+7','',['FormatBlock',false,'<p>']);t.addShortcut('ctrl+8','',['FormatBlock',false,'<div>']);t.addShortcut('ctrl+9','',['FormatBlock',false,'<address>']);function find(e){var v=null;if(!e.altKey&&!e.ctrlKey&&!e.metaKey)return v;each(t.shortcuts,function(o){if(o.ctrl!=e.ctrlKey&&(!tinymce.isMac||o.ctrl==e.metaKey))return;if(o.alt!=e.altKey)return;if(o.shift!=e.shiftKey)return;if(e.keyCode==o.keyCode||(e.charCode&&e.charCode==o.charCode)){v=o;return false;}});return v;};t.onKeyUp.add(function(ed,e){var o=find(e);if(o)return Event.cancel(e);});t.onKeyPress.add(function(ed,e){var o=find(e);if(o)return Event.cancel(e);});t.onKeyDown.add(function(ed,e){var o=find(e);if(o){o.func.call(o.scope);return Event.cancel(e);}});}if(tinymce.isIE){Event.add(t.getDoc(),'controlselect',function(e){var re=t.resizeInfo,cb;e=e.target;if(re)Event.remove(re.node,re.ev,re.cb);if(!t.dom.hasClass(e,'mceItemNoResize')){ev='resizeend';cb=Event.add(e,ev,function(e){var v;e=e.target;if(v=t.dom.getStyle(e,'width')){t.dom.setAttrib(e,'width',v.replace(/[^0-9%]+/g,''));t.dom.setStyle(e,'width','');}if(v=t.dom.getStyle(e,'height')){t.dom.setAttrib(e,'height',v.replace(/[^0-9%]+/g,''));t.dom.setStyle(e,'height','');}});}else{ev='resizestart';cb=Event.add(e,'resizestart',Event.cancel,Event);}re=t.resizeInfo={node:e,ev:ev,cb:cb};});t.onKeyDown.add(function(ed,e){switch(e.keyCode){case 8:if(t.selection.getRng().item){t.selection.getRng().item(0).removeNode();return Event.cancel(e);}}});}if(tinymce.isOpera){t.onClick.add(function(ed,e){Event.prevent(e);});}if(s.custom_undo_redo){function addUndo(){t.undoManager.typing=0;t.undoManager.add();};if(tinymce.isIE){Event.add(t.getWin(),'blur',function(e){var n;if(t.selection){n=t.selection.getNode();if(!t.removed&&n.ownerDocument&&n.ownerDocument!=t.getDoc())addUndo();}});}else{Event.add(t.getDoc(),'blur',function(){if(t.selection&&!t.removed)addUndo();});}t.onMouseDown.add(addUndo);t.onKeyUp.add(function(ed,e){if((e.keyCode>=33&&e.keyCode<=36)||(e.keyCode>=37&&e.keyCode<=40)||e.keyCode==13||e.keyCode==45||e.ctrlKey){t.undoManager.typing=0;t.undoManager.add();}});t.onKeyDown.add(function(ed,e){if((e.keyCode>=33&&e.keyCode<=36)||(e.keyCode>=37&&e.keyCode<=40)||e.keyCode==13||e.keyCode==45){if(t.undoManager.typing){t.undoManager.add();t.undoManager.typing=0;}return;}if(!t.undoManager.typing){t.undoManager.add();t.undoManager.typing=1;}});}},_destroy:function(){var t=this;t.onBeforeDestroy.dispatch(t);if(t.formElement){t.formElement.submit=t.formElement._mceOldSubmit;t.formElement._mceOldSubmit=null;}t.contentAreaContainer=t.formElement=t.container=t.settings.content_element=t.bodyElement=t.contentDocument=t.contentWindow=null;if(t.selection)t.selection=t.selection.win=t.selection.dom=t.selection.dom.doc=null;t.destroyed=1;},_convertInlineElements:function(){var t=this,s=t.settings,dom=t.dom,v,e,na,st,sp;function convert(ed,o){if(!s.inline_styles)return;if(o.get){each(t.dom.select('table,u,strike',o.node),function(n){switch(n.nodeName){case'TABLE':if(v=dom.getAttrib(n,'height')){dom.setStyle(n,'height',v);dom.setAttrib(n,'height','');}break;case'U':case'STRIKE':sp=dom.create('span',{style:dom.getAttrib(n,'style')});sp.style.textDecoration=n.nodeName=='U'?'underline':'line-through';dom.setAttrib(sp,'mce_style','');dom.replace(sp,n,1);break;}});}else if(o.set){each(t.dom.select('table,span',o.node),function(n){if(n.nodeName=='TABLE'){if(v=dom.getStyle(n,'height'))dom.setAttrib(n,'height',v.replace(/[^0-9%]+/g,''));}else{if(n.style.textDecoration=='underline')na='u';else if(n.style.textDecoration=='line-through')na='strike';else na='';if(na){n.style.textDecoration='';dom.setAttrib(n,'mce_style','');e=dom.create(na,{style:dom.getAttrib(n,'style')});dom.replace(e,n,1);}}});}};t.onPreProcess.add(convert);if(!s.cleanup_on_startup){t.onInit.add(function(){convert(t,{node:t.getBody(),set:1});});}},_convertFonts:function(){var t=this,s=t.settings,dom=t.dom,sl,cl,fz,fzn,v,i,st,x,nl,sp,f,n;if(!s.inline_styles)return;fz=[8,10,12,14,18,24,36];fzn=['xx-small','x-small','small','medium','large','x-large','xx-large'];if(sl=s.font_size_style_values)sl=explode(sl);if(cl=s.font_size_classes)cl=explode(cl);function convertToFonts(no){if(tinymce.isWebKit||!s.inline_styles)return;nl=t.dom.select('span',no);for(x=nl.length-1;x>=0;x--){n=nl[x];f=dom.create('font',{color:dom.toHex(dom.getStyle(n,'color')),face:dom.getStyle(n,'fontFamily'),style:dom.getAttrib(n,'style'),'class':dom.getAttrib(n,'class')});st=f.style;if(st.color||st.fontFamily){st.color=st.fontFamily='';dom.setAttrib(f,'mce_style','');}if(sl){i=inArray(sl,dom.getStyle(n,'fontSize'));if(i!=-1){dom.setAttrib(f,'size',''+(i+1||1));f.style.fontSize='';}}else if(cl){i=inArray(cl,dom.getAttrib(n,'class'));v=dom.getStyle(n,'fontSize');if(i==-1&&v.indexOf('pt')>0)i=inArray(fz,parseInt(v));if(i==-1)i=inArray(fzn,v);if(i!=-1){dom.setAttrib(f,'size',''+(i+1||1));f.style.fontSize='';}}if(f.color||f.face||f.size){f.style.fontFamily='';dom.setAttrib(f,'mce_style','');dom.replace(f,n,1);}}};t.onSetContent.add(function(ed,o){convertToFonts(ed.getBody());});t.onPreProcess.add(function(ed,o){if(!s.inline_styles)return;if(o.get){nl=t.dom.select('font',o.node);for(x=nl.length-1;x>=0;x--){n=nl[x];sp=dom.create('span',{style:dom.getAttrib(n,'style'),'class':dom.getAttrib(n,'class')});dom.setStyles(sp,{fontFamily:dom.getAttrib(n,'face'),color:dom.getAttrib(n,'color'),backgroundColor:n.style.backgroundColor});if(n.size){if(sl)dom.setStyle(sp,'fontSize',sl[parseInt(n.size)-1]);else dom.setAttrib(sp,'class',cl[parseInt(n.size)-1]);}dom.setAttrib(sp,'mce_style','');dom.replace(sp,n,1);}}});},_isHidden:function(){var s;if(!isGecko)return 0;s=this.selection.getSel();return(!s||!s.rangeCount||s.rangeCount==0);},_fixNesting:function(s){var d=[],i;s=s.replace(/<(\/)?([^\s>]+)[^>]*?>/g,function(a,b,c){var e;if(b==='/'){if(!d.length)return'';if(c!==d[d.length-1].tag){for(i=d.length-1;i>=0;i--){if(d[i].tag===c){d[i].close=1;break;}}return'';}else{d.pop();if(d.length&&d[d.length-1].close){a=a+'</'+d[d.length-1].tag+'>';d.pop();}}}else{if(/^(br|hr|input|meta|img|link|param)$/i.test(c))return a;if(/\/>$/.test(a))return a;d.push({tag:c});}return a;});for(i=d.length-1;i>=0;i--)s+='</'+d[i].tag+'>';return s;}});})();(function(){var each=tinymce.each,isIE=tinymce.isIE,isGecko=tinymce.isGecko,isOpera=tinymce.isOpera,isWebKit=tinymce.isWebKit;tinymce.create('tinymce.EditorCommands',{EditorCommands:function(ed){this.editor=ed;},execCommand:function(cmd,ui,val){var t=this,ed=t.editor,f;switch(cmd){case'Cut':case'Copy':case'Paste':try{ed.getDoc().execCommand(cmd,ui,val);}catch(ex){if(isGecko){ed.windowManager.confirm(ed.getLang('clipboard_msg'),function(s){if(s)window.open('http://www.mozilla.org/editor/midasdemo/securityprefs.html','mceExternal');});}else ed.windowManager.alert(ed.getLang('clipboard_no_support'));}return true;case'mceResetDesignMode':case'mceBeginUndoLevel':return true;case'unlink':t.UnLink();return true;case'JustifyLeft':case'JustifyCenter':case'JustifyRight':case'JustifyFull':t.mceJustify(cmd,cmd.substring(7).toLowerCase());return true;case'mceEndUndoLevel':case'mceAddUndoLevel':ed.undoManager.add();return true;default:f=this[cmd];if(f){f.call(this,ui,val);return true;}}return false;},Indent:function(){var ed=this.editor,d=ed.dom,s=ed.selection,e,iv,iu;iv=ed.settings.indentation;iu=/[a-z%]+$/i.exec(iv);iv=parseInt(iv);if(ed.settings.inline_styles&&(!this.queryStateInsertUnorderedList()&&!this.queryStateInsertOrderedList())){each(this._getSelectedBlocks(),function(e){d.setStyle(e,'paddingLeft',(parseInt(e.style.paddingLeft||0)+iv)+iu);});return;}ed.getDoc().execCommand('Indent',false,null);if(isIE){d.getParent(s.getNode(),function(n){if(n.nodeName=='BLOCKQUOTE'){n.dir=n.style.cssText='';}});}},Outdent:function(){var ed=this.editor,d=ed.dom,s=ed.selection,e,v,iv,iu;iv=ed.settings.indentation;iu=/[a-z%]+$/i.exec(iv);iv=parseInt(iv);if(ed.settings.inline_styles&&(!this.queryStateInsertUnorderedList()&&!this.queryStateInsertOrderedList())){each(this._getSelectedBlocks(),function(e){v=Math.max(0,parseInt(e.style.paddingLeft||0)-iv);d.setStyle(e,'paddingLeft',v?v+iu:'');});return;}ed.getDoc().execCommand('Outdent',false,null);},mceSetAttribute:function(u,v){var ed=this.editor,d=ed.dom,e;if(e=d.getParent(ed.selection.getNode(),d.isBlock))d.setAttrib(e,v.name,v.value);},mceSetContent:function(u,v){this.editor.setContent(v);},mceToggleVisualAid:function(){var ed=this.editor;ed.hasVisual=!ed.hasVisual;ed.addVisual();},mceReplaceContent:function(u,v){var s=this.editor.selection;s.setContent(v.replace(/\{\$selection\}/g,s.getContent({format:'text'})));},mceInsertLink:function(u,v){var ed=this.editor,e=ed.dom.getParent(ed.selection.getNode(),'A');if(tinymce.is(v,'string'))v={href:v};function set(e){each(v,function(v,k){ed.dom.setAttrib(e,k,v);});};if(!e){ed.execCommand('CreateLink',false,'javascript:mctmp(0);');each(ed.dom.select('a'),function(e){if(e.href=='javascript:mctmp(0);')set(e);});}else{if(v.href)set(e);else ed.dom.remove(e,1);}},UnLink:function(){var ed=this.editor,s=ed.selection;if(s.isCollapsed())s.select(s.getNode());ed.getDoc().execCommand('unlink',false,null);s.collapse(0);},FontName:function(u,v){var t=this,ed=t.editor,s=ed.selection,e;if(!v){if(s.isCollapsed())s.select(s.getNode());t.RemoveFormat();}else ed.getDoc().execCommand('FontName',false,v);},queryCommandValue:function(c){var f=this['queryValue'+c];if(f)return f.call(this,c);return false;},queryCommandState:function(cmd){var f;switch(cmd){case'JustifyLeft':case'JustifyCenter':case'JustifyRight':case'JustifyFull':return this.queryStateJustify(cmd,cmd.substring(7).toLowerCase());default:if(f=this['queryState'+cmd])return f.call(this,cmd);}return-1;},queryValueFontSize:function(){var ed=this.editor,v=0,p;if(isOpera||isWebKit){if(p=ed.dom.getParent(ed.selection.getNode(),'FONT'))v=p.size;return v;}return ed.getDoc().queryCommandValue('FontSize');},queryValueFontName:function(){var ed=this.editor,v=0,p;if(p=ed.dom.getParent(ed.selection.getNode(),'FONT'))v=p.face;if(!v)v=ed.getDoc().queryCommandValue('FontName');return v;},mceJustify:function(c,v){var ed=this.editor,se=ed.selection,n=se.getNode(),nn=n.nodeName,bl,nb,dom=ed.dom,rm;if(ed.settings.inline_styles&&this.queryStateJustify(c,v))rm=1;bl=dom.getParent(n,ed.dom.isBlock);if(nn=='IMG'){if(v=='full')return;if(rm){if(v=='center')dom.setStyle(n.parentNode,'textAlign','');dom.setStyle(n,'float','');this.mceRepaint();return;}if(v=='center'){if(/^(TD|TH)$/.test(bl.nodeName))bl=0;if(!bl||bl.childNodes.length>1){nb=dom.create('p');nb.appendChild(n.cloneNode(false));if(bl)dom.insertAfter(nb,bl);else dom.insertAfter(nb,n);dom.remove(n);n=nb.firstChild;bl=nb;}dom.setStyle(bl,'textAlign',v);dom.setStyle(n,'float','');}else{dom.setStyle(n,'float',v);dom.setStyle(n.parentNode,'textAlign','');}this.mceRepaint();return;}if(ed.settings.inline_styles&&ed.settings.forced_root_block){if(rm)v='';each(this._getSelectedBlocks(dom.getParent(se.getStart(),dom.isBlock),dom.getParent(se.getEnd(),dom.isBlock)),function(e){dom.setAttrib(e,'align','');dom.setStyle(e,'textAlign',v=='full'?'justify':v);});return;}else if(!rm)ed.getDoc().execCommand(c,false,null);if(ed.settings.inline_styles){if(rm){dom.getParent(ed.selection.getNode(),function(n){if(n.style&&n.style.textAlign)dom.setStyle(n,'textAlign','');});return;}each(dom.select('*'),function(n){var v=n.align;if(v){if(v=='full')v='justify';dom.setStyle(n,'textAlign',v);dom.setAttrib(n,'align','');}});}},mceSetCSSClass:function(u,v){this.mceSetStyleInfo(0,{command:'setattrib',name:'class',value:v});},getSelectedElement:function(){var t=this,ed=t.editor,dom=ed.dom,se=ed.selection,r=se.getRng(),r1,r2,sc,ec,so,eo,e,sp,ep,re;if(se.isCollapsed()||r.item)return se.getNode();re=ed.settings.merge_styles_invalid_parents;if(tinymce.is(re,'string'))re=new RegExp(re,'i');if(isIE){r1=r.duplicate();r1.collapse(true);sc=r1.parentElement();r2=r.duplicate();r2.collapse(false);ec=r2.parentElement();if(sc!=ec){r1.move('character',1);sc=r1.parentElement();}if(sc==ec){r1=r.duplicate();r1.moveToElementText(sc);if(r1.compareEndPoints('StartToStart',r)==0&&r1.compareEndPoints('EndToEnd',r)==0)return re&&re.test(sc.nodeName)?null:sc;}}else{function getParent(n){return dom.getParent(n,function(n){return n.nodeType==1;});};sc=r.startContainer;ec=r.endContainer;so=r.startOffset;eo=r.endOffset;if(!r.collapsed){if(sc==ec){if(so-eo<2){if(sc.hasChildNodes()){sp=sc.childNodes[so];return re&&re.test(sp.nodeName)?null:sp;}}}}if(sc.nodeType!=3||ec.nodeType!=3)return null;if(so==0){sp=getParent(sc);if(sp&&sp.firstChild!=sc)sp=null;}if(so==sc.nodeValue.length){e=sc.nextSibling;if(e&&e.nodeType==1)sp=sc.nextSibling;}if(eo==0){e=ec.previousSibling;if(e&&e.nodeType==1)ep=e;}if(eo==ec.nodeValue.length){ep=getParent(ec);if(ep&&ep.lastChild!=ec)ep=null;}if(sp==ep)return re&&sp&&re.test(sp.nodeName)?null:sp;}return null;},InsertHorizontalRule:function(){if(isGecko||isIE)this.editor.selection.setContent('<hr />');else this.editor.getDoc().execCommand('InsertHorizontalRule',false,'');},RemoveFormat:function(){var t=this,ed=t.editor,s=ed.selection,b;if(isWebKit)s.setContent(s.getContent({format:'raw'}).replace(/(<(span|b|i|strong|em|strike) [^>]+>|<(span|b|i|strong|em|strike)>|<\/(span|b|i|strong|em|strike)>|)/g,''),{format:'raw'});else ed.getDoc().execCommand('RemoveFormat',false,null);t.mceSetStyleInfo(0,{command:'removeformat'});ed.addVisual();},mceSetStyleInfo:function(u,v){var t=this,ed=t.editor,d=ed.getDoc(),dom=ed.dom,e,b,s=ed.selection,nn=v.wrapper||'span',b=s.getBookmark(),re;function set(n,e){if(n.nodeType==1){switch(v.command){case'setattrib':return dom.setAttrib(n,v.name,v.value);case'setstyle':return dom.setStyle(n,v.name,v.value);case'removeformat':return dom.setAttrib(n,'class','');}}};re=ed.settings.merge_styles_invalid_parents;if(tinymce.is(re,'string'))re=new RegExp(re,'i');if(e=t.getSelectedElement())set(e,1);else{d.execCommand('FontName',false,'__');each(isWebKit?dom.select('span'):dom.select('font'),function(n){var sp,e;if(dom.getAttrib(n,'face')=='__'||n.style.fontFamily==='__'){sp=dom.create(nn,{mce_new:'1'});set(sp);each(n.childNodes,function(n){sp.appendChild(n.cloneNode(true));});dom.replace(sp,n);}});}each(dom.select(nn).reverse(),function(n){var p=n.parentNode;if(!dom.getAttrib(n,'mce_new')){p=dom.getParent(n,function(n){return n.nodeType==1&&dom.getAttrib(n,'mce_new');});if(p)dom.remove(n,1);}});each(dom.select(nn).reverse(),function(n){var p=n.parentNode;if(!p||!dom.getAttrib(n,'mce_new'))return;if(p.nodeName==nn.toUpperCase()&&p.childNodes.length==1)return dom.remove(p,1);if(n.nodeType==1&&(!re||!re.test(p.nodeName))&&p.childNodes.length==1){set(p);dom.setAttrib(n,'class','');}});each(dom.select(nn).reverse(),function(n){if(dom.getAttrib(n,'mce_new')){if(!dom.getAttrib(n,'class')&&!dom.getAttrib(n,'style'))return dom.remove(n,1);dom.setAttrib(n,'mce_new','');}});s.moveToBookmark(b);},queryStateJustify:function(c,v){var ed=this.editor,n=ed.selection.getNode(),dom=ed.dom;if(n&&n.nodeName=='IMG'){if(dom.getStyle(n,'float')==v)return 1;return n.parentNode.style.textAlign==v;}n=dom.getParent(ed.selection.getStart(),function(n){return n.nodeType==1&&n.style.textAlign;});if(v=='full')v='justify';if(ed.settings.inline_styles)return(n&&n.style.textAlign==v);return ed.getDoc().queryCommandState(c);},HiliteColor:function(ui,val){var t=this,ed=t.editor,d=ed.getDoc();function set(s){if(!isGecko)return;try{d.execCommand("styleWithCSS",0,s);}catch(ex){d.execCommand("useCSS",0,!s);}};if(isGecko||isOpera){set(true);d.execCommand('hilitecolor',false,val);set(false);}else d.execCommand('BackColor',false,val);},Undo:function(){var ed=this.editor;if(ed.settings.custom_undo_redo){ed.undoManager.undo();ed.nodeChanged();}else ed.getDoc().execCommand('Undo',false,null);},Redo:function(){var ed=this.editor;if(ed.settings.custom_undo_redo){ed.undoManager.redo();ed.nodeChanged();}else ed.getDoc().execCommand('Redo',false,null);},FormatBlock:function(ui,val){var t=this,ed=t.editor;val=ed.settings.forced_root_block?(val||'<p>'):val;if(/^(P|DIV|H[1-6]|ADDRESS|BLOCKQUOTE|PRE)$/.test(ed.selection.getNode().nodeName))t.mceRemoveNode();if(val.indexOf('<')==-1)val='<'+val+'>';if(tinymce.isGecko)val=val.replace(/<(div|blockquote|code|dt|dd|dl|samp)>/gi,'$1');ed.getDoc().execCommand('FormatBlock',false,val);},mceCleanup:function(){var ed=this.editor,s=ed.selection,b=s.getBookmark();ed.setContent(ed.getContent());s.moveToBookmark(b);},mceRemoveNode:function(ui,val){var ed=this.editor,s=ed.selection,b,n=val||s.getNode();if(n==ed.getBody())return;b=s.getBookmark();ed.dom.remove(n,1);s.moveToBookmark(b);ed.nodeChanged();},mceSelectNodeDepth:function(ui,val){var ed=this.editor,s=ed.selection,c=0;ed.dom.getParent(s.getNode(),function(n){if(n.nodeType==1&&c++==val){s.select(n);ed.nodeChanged();return false;}},ed.getBody());},mceSelectNode:function(u,v){this.editor.selection.select(v);},mceInsertContent:function(ui,val){this.editor.selection.setContent(val);},mceInsertRawHTML:function(ui,val){var ed=this.editor;ed.selection.setContent('tiny_mce_marker');ed.setContent(ed.getContent().replace(/tiny_mce_marker/g,val));},mceRepaint:function(){var s,b,e=this.editor;if(tinymce.isGecko){try{s=e.selection;b=s.getBookmark(true);if(s.getSel())s.getSel().selectAllChildren(e.getBody());s.collapse(true);s.moveToBookmark(b);}catch(ex){}}},queryStateUnderline:function(){var ed=this.editor,n;if(n&&n.nodeName=='A')return false;return ed.getDoc().queryCommandState('Underline');},queryStateOutdent:function(){var ed=this.editor,n;if(ed.settings.inline_styles){if((n=ed.dom.getParent(ed.selection.getStart(),ed.dom.isBlock))&&parseInt(n.style.paddingLeft)>0)return true;if((n=ed.dom.getParent(ed.selection.getEnd(),ed.dom.isBlock))&&parseInt(n.style.paddingLeft)>0)return true;}else return!!ed.dom.getParent(ed.selection.getNode(),'BLOCKQUOTE');return this.queryStateInsertUnorderedList()||this.queryStateInsertOrderedList();},queryStateInsertUnorderedList:function(){return this.editor.dom.getParent(this.editor.selection.getNode(),'UL');},queryStateInsertOrderedList:function(){return this.editor.dom.getParent(this.editor.selection.getNode(),'OL');},queryStatemceBlockQuote:function(){return!!this.editor.dom.getParent(this.editor.selection.getStart(),function(n){return n.nodeName==='BLOCKQUOTE';});},mceBlockQuote:function(){var t=this,ed=t.editor,s=ed.selection,dom=ed.dom,sb,eb,n,bm,bq,r,bq2,i,nl;function getBQ(e){return dom.getParent(e,function(n){return n.nodeName==='BLOCKQUOTE';});};sb=dom.getParent(s.getStart(),dom.isBlock);eb=dom.getParent(s.getEnd(),dom.isBlock);if(bq=getBQ(sb)){if(sb!=eb||sb.childNodes.length>1||(sb.childNodes.length==1&&sb.firstChild.nodeName!='BR'))bm=s.getBookmark();if(getBQ(eb)){bq2=bq.cloneNode(false);while(n=eb.nextSibling)bq2.appendChild(n.parentNode.removeChild(n));}if(bq2)dom.insertAfter(bq2,bq);nl=t._getSelectedBlocks(sb,eb);for(i=nl.length-1;i>=0;i--){dom.insertAfter(nl[i],bq);}if(/^\s*$/.test(bq.innerHTML))dom.remove(bq,1);if(bq2&&/^\s*$/.test(bq2.innerHTML))dom.remove(bq2,1);if(!bm){if(!isIE){r=ed.getDoc().createRange();r.setStart(sb,0);r.setEnd(sb,0);s.setRng(r);}else{s.select(sb);s.collapse(0);if(dom.getParent(s.getStart(),dom.isBlock)!=sb){r=s.getRng();r.move('character',-1);r.select();}}}else t.editor.selection.moveToBookmark(bm);return;}if(isIE&&!sb&&!eb){t.editor.getDoc().execCommand('Indent');n=getBQ(s.getNode());n.style.margin=n.dir='';return;}if(!sb||!eb)return;if(sb!=eb||sb.childNodes.length>1||(sb.childNodes.length==1&&sb.firstChild.nodeName!='BR'))bm=s.getBookmark();each(t._getSelectedBlocks(getBQ(s.getStart()),getBQ(s.getEnd())),function(e){if(e.nodeName=='BLOCKQUOTE'&&!bq){bq=e;return;}if(!bq){bq=dom.create('blockquote');e.parentNode.insertBefore(bq,e);}if(e.nodeName=='BLOCKQUOTE'&&bq){n=e.firstChild;while(n){bq.appendChild(n.cloneNode(true));n=n.nextSibling;}dom.remove(e);return;}bq.appendChild(dom.remove(e));});if(!bm){if(!isIE){r=ed.getDoc().createRange();r.setStart(sb,0);r.setEnd(sb,0);s.setRng(r);}else{s.select(sb);s.collapse(1);}}else s.moveToBookmark(bm);},_getSelectedBlocks:function(st,en){var ed=this.editor,dom=ed.dom,s=ed.selection,sb,eb,n,bl=[];sb=dom.getParent(st||s.getStart(),dom.isBlock);eb=dom.getParent(en||s.getEnd(),dom.isBlock);if(sb)bl.push(sb);if(sb&&eb&&sb!=eb){n=sb;while((n=n.nextSibling)&&n!=eb){if(dom.isBlock(n))bl.push(n);}}if(eb&&sb!=eb)bl.push(eb);return bl;}});})();tinymce.create('tinymce.UndoManager',{index:0,data:null,typing:0,UndoManager:function(ed){var t=this,Dispatcher=tinymce.util.Dispatcher;t.editor=ed;t.data=[];t.onAdd=new Dispatcher(this);t.onUndo=new Dispatcher(this);t.onRedo=new Dispatcher(this);},add:function(l){var t=this,i,ed=t.editor,b,s=ed.settings,la;l=l||{};l.content=l.content||ed.getContent({format:'raw',no_events:1});l.content=l.content.replace(/^\s*|\s*$/g,'');la=t.data[t.index>0?t.index-1:0];if(!l.initial&&la&&l.content==la.content)return null;if(s.custom_undo_redo_levels){if(t.data.length>s.custom_undo_redo_levels){for(i=0;i<t.data.length-1;i++)t.data[i]=t.data[i+1];t.data.length--;t.index=t.data.length;}}if(s.custom_undo_redo_restore_selection&&!l.initial)l.bookmark=b=l.bookmark||ed.selection.getBookmark();if(t.index<t.data.length&&t.data[t.index].initial)t.index++;t.data.length=t.index+1;t.data[t.index++]=l;if(l.initial)t.index=0;if(t.data.length==2&&t.data[0].initial)t.data[0].bookmark=b;t.onAdd.dispatch(t,l);ed.isNotDirty=0;return l;},undo:function(){var t=this,ed=t.editor,l=l,i;if(t.typing){t.add();t.typing=0;}if(t.index>0){if(t.index==t.data.length&&t.index>1){i=t.index;t.typing=0;if(!t.add())t.index=i;--t.index;}l=t.data[--t.index];ed.setContent(l.content,{format:'raw'});ed.selection.moveToBookmark(l.bookmark);t.onUndo.dispatch(t,l);}return l;},redo:function(){var t=this,ed=t.editor,l=null;if(t.index<t.data.length-1){l=t.data[++t.index];ed.setContent(l.content,{format:'raw'});ed.selection.moveToBookmark(l.bookmark);t.onRedo.dispatch(t,l);}return l;},clear:function(){var t=this;t.data=[];t.index=0;t.typing=0;t.add({initial:true});},hasUndo:function(){return this.index!=0||this.typing;},hasRedo:function(){return this.index<this.data.length-1;}});(function(){var Event,isIE,isGecko,isOpera,each,extend;Event=tinymce.dom.Event;isIE=tinymce.isIE;isGecko=tinymce.isGecko;isOpera=tinymce.isOpera;each=tinymce.each;extend=tinymce.extend;tinymce.create('tinymce.ForceBlocks',{ForceBlocks:function(ed){var t=this,s=ed.settings,elm;t.editor=ed;t.dom=ed.dom;elm=(s.forced_root_block||'p').toLowerCase();s.element=elm.toUpperCase();ed.onPreInit.add(t.setup,t);t.reOpera=new RegExp('(\\u00a0|&#160;|&nbsp;)<\/'+elm+'>','gi');t.rePadd=new RegExp('<p( )([^>]+)><\\\/p>|<p( )([^>]+)\\\/>|<p( )([^>]+)>\\s+<\\\/p>|<p><\\\/p>|<p\\\/>|<p>\\s+<\\\/p>'.replace(/p/g,elm),'gi');t.reNbsp2BR1=new RegExp('<p( )([^>]+)>[\\s\\u00a0]+<\\\/p>|<p>[\\s\\u00a0]+<\\\/p>'.replace(/p/g,elm),'gi');t.reNbsp2BR2=new RegExp('<p( )([^>]+)>(&nbsp;|&#160;)<\\\/p>|<p>(&nbsp;|&#160;)<\\\/p>'.replace(/p/g,elm),'gi');t.reBR2Nbsp=new RegExp('<p( )([^>]+)>\\s*<br \\\/>\\s*<\\\/p>|<p>\\s*<br \\\/>\\s*<\\\/p>'.replace(/p/g,elm),'gi');t.reTrailBr=new RegExp('\\s*<br \\/>\\s*<\\\/p>'.replace(/p/g,elm),'gi');function padd(ed,o){if(isOpera)o.content=o.content.replace(t.reOpera,'</'+elm+'>');o.content=o.content.replace(t.rePadd,'<'+elm+'$1$2$3$4$5$6>\u00a0</'+elm+'>');if(!isIE&&!isOpera&&o.set){o.content=o.content.replace(t.reNbsp2BR1,'<'+elm+'$1$2><br /></'+elm+'>');o.content=o.content.replace(t.reNbsp2BR2,'<'+elm+'$1$2><br /></'+elm+'>');}else{o.content=o.content.replace(t.reBR2Nbsp,'<'+elm+'$1$2>\u00a0</'+elm+'>');o.content=o.content.replace(t.reTrailBr,'</'+elm+'>');}};ed.onBeforeSetContent.add(padd);ed.onPostProcess.add(padd);if(s.forced_root_block){ed.onInit.add(t.forceRoots,t);ed.onSetContent.add(t.forceRoots,t);ed.onBeforeGetContent.add(t.forceRoots,t);}},setup:function(){var t=this,ed=t.editor,s=ed.settings;if(s.forced_root_block){ed.onKeyUp.add(t.forceRoots,t);ed.onPreProcess.add(t.forceRoots,t);}if(s.force_br_newlines){if(isIE){ed.onKeyPress.add(function(ed,e){var n,s=ed.selection;if(e.keyCode==13&&s.getNode().nodeName!='LI'){s.setContent('<br id="__" /> ',{format:'raw'});n=ed.dom.get('__');n.removeAttribute('id');s.select(n);s.collapse();return Event.cancel(e);}});}return;}if(!isIE&&s.force_p_newlines){ed.onKeyPress.add(function(ed,e){if(e.keyCode==13&&!e.shiftKey){if(!t.insertPara(e))Event.cancel(e);}});if(isGecko){ed.onKeyDown.add(function(ed,e){if((e.keyCode==8||e.keyCode==46)&&!e.shiftKey)t.backspaceDelete(e,e.keyCode==8);});}}function ren(rn,na){var ne=ed.dom.create(na);each(rn.attributes,function(a){if(a.specified&&a.nodeValue)ne.setAttribute(a.nodeName.toLowerCase(),a.nodeValue);});each(rn.childNodes,function(n){ne.appendChild(n.cloneNode(true));});rn.parentNode.replaceChild(ne,rn);return ne;};if(isIE&&s.element!='P'){ed.onKeyPress.add(function(ed,e){t.lastElm=ed.selection.getNode().nodeName;});ed.onKeyUp.add(function(ed,e){var bl,sel=ed.selection,n=sel.getNode(),b=ed.getBody();if(b.childNodes.length===1&&n.nodeName=='P'){n=ren(n,s.element);sel.select(n);sel.collapse();ed.nodeChanged();}else if(e.keyCode==13&&!e.shiftKey&&t.lastElm!='P'){bl=ed.dom.getParent(n,'P');if(bl){ren(bl,s.element);ed.nodeChanged();}}});}},find:function(n,t,s){var ed=this.editor,w=ed.getDoc().createTreeWalker(n,4,null,false),c=-1;while(n=w.nextNode()){c++;if(t==0&&n==s)return c;if(t==1&&c==s)return n;}return-1;},forceRoots:function(ed,e){var t=this,ed=t.editor,b=ed.getBody(),d=ed.getDoc(),se=ed.selection,s=se.getSel(),r=se.getRng(),si=-2,ei,so,eo,tr,c=-0xFFFFFF;var nx,bl,bp,sp,le,nl=b.childNodes,i;if(e&&e.keyCode==13)return true;for(i=nl.length-1;i>=0;i--){nx=nl[i];if(nx.nodeType==3||!t.dom.isBlock(nx)){if(!bl){if(nx.nodeType!=3||/[^\s]/g.test(nx.nodeValue)){if(si==-2&&r){if(!isIE){so=r.startOffset;eo=r.endOffset;si=t.find(b,0,r.startContainer);ei=t.find(b,0,r.endContainer);}else{tr=d.body.createTextRange();tr.moveToElementText(b);tr.collapse(1);bp=tr.move('character',c)*-1;tr=r.duplicate();tr.collapse(1);sp=tr.move('character',c)*-1;tr=r.duplicate();tr.collapse(0);le=(tr.move('character',c)*-1)-sp;si=sp-bp;ei=le;}}bl=ed.dom.create(ed.settings.forced_root_block);bl.appendChild(nx.cloneNode(1));nx.parentNode.replaceChild(bl,nx);}}else{if(bl.hasChildNodes())bl.insertBefore(nx,bl.firstChild);else bl.appendChild(nx);}}else bl=null;}if(si!=-2){if(!isIE){bl=d.getElementsByTagName(ed.settings.element)[0];r=d.createRange();if(si!=-1)r.setStart(t.find(b,1,si),so);else r.setStart(bl,0);if(ei!=-1)r.setEnd(t.find(b,1,ei),eo);else r.setEnd(bl,0);if(s){s.removeAllRanges();s.addRange(r);}}else{try{r=s.createRange();r.moveToElementText(b);r.collapse(1);r.moveStart('character',si);r.moveEnd('character',ei);r.select();}catch(ex){}}}},getParentBlock:function(n){var d=this.dom;return d.getParent(n,d.isBlock);},insertPara:function(e){var t=this,ed=t.editor,d=ed.getDoc(),se=ed.settings,s=ed.selection.getSel(),r=s.getRangeAt(0),b=d.body;var rb,ra,dir,sn,so,en,eo,sb,eb,bn,bef,aft,sc,ec,n;function isEmpty(n){n=n.innerHTML;n=n.replace(/<(img|hr|table)/gi,'-');n=n.replace(/<[^>]+>/g,'');return n.replace(/[ \t\r\n]+/g,'')=='';};rb=d.createRange();rb.setStart(s.anchorNode,s.anchorOffset);rb.collapse(true);ra=d.createRange();ra.setStart(s.focusNode,s.focusOffset);ra.collapse(true);dir=rb.compareBoundaryPoints(rb.START_TO_END,ra)<0;sn=dir?s.anchorNode:s.focusNode;so=dir?s.anchorOffset:s.focusOffset;en=dir?s.focusNode:s.anchorNode;eo=dir?s.focusOffset:s.anchorOffset;if(sn==b&&en==b&&b.firstChild&&ed.dom.isBlock(b.firstChild)){sn=en=sn.firstChild;so=eo=0;rb=d.createRange();rb.setStart(sn,0);ra=d.createRange();ra.setStart(en,0);}sn=sn.nodeName=="HTML"?d.body:sn;sn=sn.nodeName=="BODY"?sn.firstChild:sn;en=en.nodeName=="HTML"?d.body:en;en=en.nodeName=="BODY"?en.firstChild:en;sb=t.getParentBlock(sn);eb=t.getParentBlock(en);bn=sb?sb.nodeName:se.element;if(t.dom.getParent(sb,function(n){return/OL|UL|PRE/.test(n.nodeName);}))return true;if(sb&&(sb.nodeName=='CAPTION'||/absolute|relative|static/gi.test(sb.style.position))){bn=se.element;sb=null;}if(eb&&(eb.nodeName=='CAPTION'||/absolute|relative|static/gi.test(eb.style.position))){bn=se.element;eb=null;}if(/(TD|TABLE|TH|CAPTION)/.test(bn)||(sb&&bn=="DIV"&&/left|right/gi.test(sb.style.cssFloat))){bn=se.element;sb=eb=null;}bef=(sb&&sb.nodeName==bn)?sb.cloneNode(0):ed.dom.create(bn);aft=(eb&&eb.nodeName==bn)?eb.cloneNode(0):ed.dom.create(bn);aft.removeAttribute('id');if(/^(H[1-6])$/.test(bn)&&sn.nodeValue&&so==sn.nodeValue.length)aft=ed.dom.create(se.element);n=sc=sn;do{if(n==b||n.nodeType==9||t.dom.isBlock(n)||/(TD|TABLE|TH|CAPTION)/.test(n.nodeName))break;sc=n;}while((n=n.previousSibling?n.previousSibling:n.parentNode));n=ec=en;do{if(n==b||n.nodeType==9||t.dom.isBlock(n)||/(TD|TABLE|TH|CAPTION)/.test(n.nodeName))break;ec=n;}while((n=n.nextSibling?n.nextSibling:n.parentNode));if(sc.nodeName==bn)rb.setStart(sc,0);else rb.setStartBefore(sc);rb.setEnd(sn,so);bef.appendChild(rb.cloneContents()||d.createTextNode(''));try{ra.setEndAfter(ec);}catch(ex){}ra.setStart(en,eo);aft.appendChild(ra.cloneContents()||d.createTextNode(''));r=d.createRange();if(!sc.previousSibling&&sc.parentNode.nodeName==bn){r.setStartBefore(sc.parentNode);}else{if(rb.startContainer.nodeName==bn&&rb.startOffset==0)r.setStartBefore(rb.startContainer);else r.setStart(rb.startContainer,rb.startOffset);}if(!ec.nextSibling&&ec.parentNode.nodeName==bn)r.setEndAfter(ec.parentNode);else r.setEnd(ra.endContainer,ra.endOffset);r.deleteContents();if(bef.firstChild&&bef.firstChild.nodeName==bn)bef.innerHTML=bef.firstChild.innerHTML;if(aft.firstChild&&aft.firstChild.nodeName==bn)aft.innerHTML=aft.firstChild.innerHTML;if(isEmpty(bef))bef.innerHTML='<br />';if(isEmpty(aft))aft.innerHTML=isOpera?'&nbsp;':'<br />';if(isOpera){r.insertNode(bef);r.insertNode(aft);}else{r.insertNode(aft);r.insertNode(bef);}aft.normalize();bef.normalize();r=d.createRange();r.selectNodeContents(aft);r.collapse(1);s.removeAllRanges();s.addRange(r);if(tinymce.isWebKit)ed.getWin().scrollTo(0,ed.dom.getPos(aft).y);else aft.scrollIntoView(0);return false;},backspaceDelete:function(e,bs){var t=this,ed=t.editor,b=ed.getBody(),n,se=ed.selection,r=se.getRng(),sc=r.startContainer,n,w,tn;if(sc&&ed.dom.isBlock(sc)&&bs){if(sc.childNodes.length==0||(sc.childNodes.length==1&&sc.firstChild.nodeName=='BR')){n=sc;while((n=n.previousSibling)&&!ed.dom.isBlock(n));if(n){if(sc!=b.firstChild){w=ed.dom.doc.createTreeWalker(n,NodeFilter.SHOW_TEXT,null,false);while(tn=w.nextNode())n=tn;r=ed.getDoc().createRange();r.setStart(n,n.nodeValue?n.nodeValue.length:0);r.setEnd(n,n.nodeValue?n.nodeValue.length:0);se.setRng(r);ed.dom.remove(sc);}return Event.cancel(e);}}}function handler(e){e=e.target;if(e&&e.parentNode&&e.nodeName=='BR'&&(n=t.getParentBlock(e))){Event.remove(b,'DOMNodeInserted',handler);if(e.previousSibling||e.nextSibling)ed.dom.remove(e);}};Event._add(b,'DOMNodeInserted',handler);window.setTimeout(function(){Event._remove(b,'DOMNodeInserted',handler);},1);}});})();(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,each=tinymce.each,extend=tinymce.extend;tinymce.create('tinymce.ControlManager',{ControlManager:function(ed,s){var t=this,i;s=s||{};t.editor=ed;t.controls={};t.onAdd=new tinymce.util.Dispatcher(t);t.onPostRender=new tinymce.util.Dispatcher(t);t.prefix=s.prefix||ed.id+'_';t.onPostRender.add(function(){each(t.controls,function(c){c.postRender();});});},get:function(id){return this.controls[this.prefix+id]||this.controls[id];},setActive:function(id,s){var c=null;if(c=this.get(id))c.setActive(s);return c;},setDisabled:function(id,s){var c=null;if(c=this.get(id))c.setDisabled(s);return c;},add:function(c){var t=this;if(c){t.controls[c.id]=c;t.onAdd.dispatch(c,t);}return c;},createControl:function(n){var c,t=this,ed=t.editor;each(ed.plugins,function(p){if(p.createControl){c=p.createControl(n,t);if(c)return false;}});switch(n){case"|":case"separator":return t.createSeparator();}if(!c&&ed.buttons&&(c=ed.buttons[n]))return t.createButton(n,c);return t.add(c);},createDropMenu:function(id,s){var t=this,ed=t.editor,c,bm,v;s=extend({'class':'mceDropDown',constrain:ed.settings.constrain_menus},s);s['class']=s['class']+' '+ed.getParam('skin')+'Skin';if(v=ed.getParam('skin_variant'))s['class']+=' '+ed.getParam('skin')+'Skin'+v.substring(0,1).toUpperCase()+v.substring(1);id=t.prefix+id;c=t.controls[id]=new tinymce.ui.DropMenu(id,s);c.onAddItem.add(function(c,o){var s=o.settings;s.title=ed.getLang(s.title,s.title);if(!s.onclick){s.onclick=function(v){ed.execCommand(s.cmd,s.ui||false,s.value);};}});ed.onRemove.add(function(){c.destroy();});if(tinymce.isIE){c.onShowMenu.add(function(){var s=ed.selection,n=s.getNode();if(n.nodeName=='IMG')bm=s.getBookmark();else bm=0;});c.onHideMenu.add(function(){if(bm)ed.selection.moveToBookmark(bm);});}return t.add(c);},createListBox:function(id,s){var t=this,ed=t.editor,cmd,c;if(t.get(id))return null;s.title=ed.translate(s.title);s.scope=s.scope||ed;if(!s.onselect){s.onselect=function(v){ed.execCommand(s.cmd,s.ui||false,v||s.value);};}s=extend({title:s.title,'class':'mce_'+id,scope:s.scope,control_manager:t},s);id=t.prefix+id;if(ed.settings.use_native_selects)c=new tinymce.ui.NativeListBox(id,s);else c=new tinymce.ui.ListBox(id,s);t.controls[id]=c;if(tinymce.isWebKit){c.onPostRender.add(function(c,n){Event.add(n,'mousedown',function(){ed.bookmark=ed.selection.getBookmark('simple');});Event.add(n,'focus',function(){ed.selection.moveToBookmark(ed.bookmark);ed.bookmark=null;});});}if(c.hideMenu)ed.onMouseDown.add(c.hideMenu,c);return t.add(c);},createButton:function(id,s){var t=this,ed=t.editor,o,c;if(t.get(id))return null;s.title=ed.translate(s.title);s.scope=s.scope||ed;if(!s.onclick&&!s.menu_button){s.onclick=function(){ed.execCommand(s.cmd,s.ui||false,s.value);};}s=extend({title:s.title,'class':'mce_'+id,unavailable_prefix:ed.getLang('unavailable',''),scope:s.scope,control_manager:t},s);id=t.prefix+id;if(s.menu_button){c=new tinymce.ui.MenuButton(id,s);ed.onMouseDown.add(c.hideMenu,c);}else c=new tinymce.ui.Button(id,s);return t.add(c);},createMenuButton:function(id,s){s=s||{};s.menu_button=1;return this.createButton(id,s);},createSplitButton:function(id,s){var t=this,ed=t.editor,cmd,c;if(t.get(id))return null;s.title=ed.translate(s.title);s.scope=s.scope||ed;if(!s.onclick){s.onclick=function(v){ed.execCommand(s.cmd,s.ui||false,v||s.value);};}if(!s.onselect){s.onselect=function(v){ed.execCommand(s.cmd,s.ui||false,v||s.value);};}s=extend({title:s.title,'class':'mce_'+id,scope:s.scope,control_manager:t},s);id=t.prefix+id;c=t.add(new tinymce.ui.SplitButton(id,s));ed.onMouseDown.add(c.hideMenu,c);return c;},createColorSplitButton:function(id,s){var t=this,ed=t.editor,cmd,c;if(t.get(id))return null;s.title=ed.translate(s.title);s.scope=s.scope||ed;if(!s.onclick){s.onclick=function(v){ed.execCommand(s.cmd,s.ui||false,v||s.value);};}if(!s.onselect){s.onselect=function(v){ed.execCommand(s.cmd,s.ui||false,v||s.value);};}s=extend({title:s.title,'class':'mce_'+id,'menu_class':ed.getParam('skin')+'Skin',scope:s.scope,more_colors_title:ed.getLang('more_colors')},s);id=t.prefix+id;c=new tinymce.ui.ColorSplitButton(id,s);ed.onMouseDown.add(c.hideMenu,c);ed.onRemove.add(function(){c.destroy();});return t.add(c);},createToolbar:function(id,s){var c,t=this;id=t.prefix+id;c=new tinymce.ui.Toolbar(id,s);if(t.get(id))return null;return t.add(c);},createSeparator:function(){return new tinymce.ui.Separator();}});})();(function(){var Dispatcher=tinymce.util.Dispatcher,each=tinymce.each,isIE=tinymce.isIE,isOpera=tinymce.isOpera;tinymce.create('tinymce.WindowManager',{WindowManager:function(ed){var t=this;t.editor=ed;t.onOpen=new Dispatcher(t);t.onClose=new Dispatcher(t);t.params={};t.features={};},open:function(s,p){var t=this,f='',x,y,mo=t.editor.settings.dialog_type=='modal',w,sw,sh,vp=tinymce.DOM.getViewPort(),u;s=s||{};p=p||{};sw=isOpera?vp.w:screen.width;sh=isOpera?vp.h:screen.height;s.name=s.name||'mc_'+new Date().getTime();s.width=parseInt(s.width||320);s.height=parseInt(s.height||240);s.resizable=true;s.left=s.left||parseInt(sw/ 2.0) - (s.width /2.0);s.top=s.top||parseInt(sh/ 2.0) - (s.height /2.0);p.inline=false;p.mce_width=s.width;p.mce_height=s.height;p.mce_auto_focus=s.auto_focus;if(mo){if(isIE){s.center=true;s.help=false;s.dialogWidth=s.width+'px';s.dialogHeight=s.height+'px';s.scroll=s.scrollbars||false;}else s.modal=s.alwaysRaised=s.dialog=s.centerscreen=s.dependent=true;}each(s,function(v,k){if(tinymce.is(v,'boolean'))v=v?'yes':'no';if(!/^(name|url)$/.test(k)){if(isIE&&mo)f+=(f?';':'')+k+':'+v;else f+=(f?',':'')+k+'='+v;}});t.features=s;t.params=p;t.onOpen.dispatch(t,s,p);u=s.url||s.file;if(tinymce.relaxedDomain)u+=(u.indexOf('?')==-1?'?':'&')+'mce_rdomain='+tinymce.relaxedDomain;try{if(isIE&&mo){w=1;window.showModalDialog(s.url||s.file,window,f);}else w=window.open(u,s.name,f);}catch(ex){}if(!w)alert(t.editor.getLang('popup_blocked'));},close:function(w){w.close();this.onClose.dispatch(this);},createInstance:function(cl,a,b,c,d,e){var f=tinymce.resolve(cl);return new f(a,b,c,d,e);},confirm:function(t,cb,s){cb.call(s||this,confirm(this._decode(this.editor.getLang(t,t))));},alert:function(t,cb,s){alert(this._decode(t));if(cb)cb.call(s||this);},_decode:function(s){return tinymce.DOM.decode(s).replace(/\\n/g,'\n');}});}());
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/tiny_mce_config.php 2.5.src/wp-includes/js/tinymce/tiny_mce_config.php
--- 2.2.2.src/wp-includes/js/tinymce/tiny_mce_config.php	2007-04-09 23:28:40.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/tiny_mce_config.php	2008-03-27 22:49:35.000000000 -0500
@@ -1,96 +1,329 @@
-<?php
-	@ require('../../../wp-config.php');
-	cache_javascript_headers();
-
-	function wp_translate_tinymce_lang($text) {
-		if ( ! function_exists('__') ) {
-			return $text;
-		} else {
-			$search1 = "/^tinyMCELang\\[(['\"])(.*)\\1\]( ?= ?)(['\"])(.*)\\4/Uem";
-			$replace1 = "'tinyMCELang[\\1\\2\\1]\\3'.stripslashes('\\4').__('\\5').stripslashes('\\4')";
-
-			$search2 = "/ : (['\"])(.*)\\1/Uem";
-			$replace2 = "' : '.stripslashes('\\1').__('\\2').stripslashes('\\1')";
+<?php 
+// some code below is from:
+/**
+ * $Id: tiny_mce_gzip.php 315 2007-10-25 14:03:43Z spocke $
+ *
+ * @author Moxiecode
+ * @copyright Copyright  2005-2006, Moxiecode Systems AB, All rights reserved.
+ *
+ * This file compresses the TinyMCE JavaScript using GZip.
+ **/
+  
+@ require('../../../wp-config.php');
+
+function getFileContents($path) {
+	$path = realpath($path);
+
+	if ( ! $path || ! @is_file($path) )
+		return '';
+
+	if ( function_exists('file_get_contents') )
+		return @file_get_contents($path);
+
+	$content = '';
+	$fp = @fopen($path, 'r');
+	if ( ! $fp )
+		return '';
+
+	while ( ! feof($fp) )
+		$content .= fgets($fp);
+
+	fclose($fp);
+	return $content;
+}
+
+function putFileContents( $path, $content ) {
+	if ( function_exists('file_put_contents') )
+		return @file_put_contents( $path, $content );
+
+	$newfile = false;
+	$fp = @fopen( $path, 'wb' );
+	if ($fp) {
+		$newfile = fwrite( $fp, $content );
+		fclose($fp);
+	}
+	return $newfile;
+}
+
+// Set up init variables
+$https = ( isset($_SERVER['HTTPS']) && 'on' == strtolower($_SERVER['HTTPS']) ) ? true : false;
+	
+$baseurl = get_option('siteurl') . '/wp-includes/js/tinymce';
+if ( $https ) str_replace('http://', 'https://', $baseurl);
 
-			$search = array($search1, $search2);
-			$replace = array($replace1, $replace2);
+$mce_css = $baseurl . '/wordpress.css';
+$mce_css = apply_filters('mce_css', $mce_css);
+if ( $https ) str_replace('http://', 'https://', $mce_css);
+
+$mce_locale = ( '' == get_locale() ) ? 'en' : strtolower( substr(get_locale(), 0, 2) ); // only ISO 639-1
+
+/*
+The following filter allows localization scripts to change the languages displayed in the spellchecker's drop-down menu.
+By default it uses Google's spellchecker API, but can be configured to use PSpell/ASpell if installed on the server.
+The + sign marks the default language. More information:
+http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker
+*/
+$mce_spellchecker_languages = apply_filters('mce_spellchecker_languages', '+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv');
+
+$plugins = array( 'safari', 'inlinepopups', 'autosave', 'spellchecker', 'paste', 'wordpress', 'media', 'fullscreen' );
+
+/* 
+The following filter takes an associative array of external plugins for TinyMCE in the form 'plugin_name' => 'url'.
+It adds the plugin's name to TinyMCE's plugins init and the call to PluginManager to load the plugin. 
+The url should be absolute and should include the js file name to be loaded. Example: 
+array( 'myplugin' => 'http://my-site.com/wp-content/plugins/myfolder/mce_plugin.js' )
+If the plugin uses a button, it should be added with one of the "$mce_buttons" filters.
+*/
+$mce_external_plugins = apply_filters('mce_external_plugins', array());
 
-			$text = preg_replace($search, $replace, $text);
+$ext_plugins = "\n";
+if ( ! empty($mce_external_plugins) ) {
+	
+	/*
+	The following filter loads external language files for TinyMCE plugins.
+	It takes an associative array 'plugin_name' => 'path', where path is the 
+	include path to the file. The language file should follow the same format as 
+	/tinymce/langs/wp-langs.php and should define a variable $strings that 
+	holds all translated strings. Example: 
+	$strings = 'tinyMCE.addI18n("' . $mce_locale . '.mypluginname_dlg",{tab_general:"General", ... })';
+	*/
+	$mce_external_languages = apply_filters('mce_external_languages', array()); 
+	
+	$loaded_langs = array();
+	$strings = '';
+	
+	if ( ! empty($mce_external_languages) ) {
+		foreach ( $mce_external_languages as $name => $path ) {
+			if ( is_file($path) && is_readable($path) ) { 
+				include_once($path);
+				$ext_plugins .= $strings;
+				$loaded_langs[] = $name;
+			}
+		}
+	}
 
-			return $text;
+	foreach ( $mce_external_plugins as $name => $url ) {
+		
+		if ( $https ) str_replace('http://', 'https://', $url);
+		
+		$plugins[] = '-' . $name;
+
+		if ( in_array($name, $loaded_langs) ) {
+			$plugurl = dirname($url);
+			$ext_plugins .= 'tinyMCEPreInit.load_ext("' . $plugurl . '", "' . $mce_locale . '");' . "\n";
 		}
+		$ext_plugins .= 'tinymce.PluginManager.load("' . $name . '", "' . $url . '");' . "\n";
 	}
+}
+$plugins = implode($plugins, ',');
+
+$mce_buttons = apply_filters('mce_buttons', array('bold', 'italic', 'strikethrough', '|', 'bullist', 'numlist', 'blockquote', '|', 'justifyleft', 'justifycenter', 'justifyright', '|', 'link', 'unlink', 'image', 'wp_more', '|', 'spellchecker', 'fullscreen', 'wp_adv' ));
+$mce_buttons = implode($mce_buttons, ',');
+
+$mce_buttons_2 = apply_filters('mce_buttons_2', array('formatselect', 'underline', 'justifyfull', 'forecolor', '|', 'pastetext', 'pasteword', 'removeformat', '|', 'media', 'charmap', '|', 'outdent', 'indent', '|', 'undo', 'redo', 'wp_help' ));
+$mce_buttons_2 = implode($mce_buttons_2, ',');
+
+$mce_buttons_3 = apply_filters('mce_buttons_3', array());
+$mce_buttons_3 = implode($mce_buttons_3, ',');
+	
+$mce_buttons_4 = apply_filters('mce_buttons_4', array());
+$mce_buttons_4 = implode($mce_buttons_4, ',');
+
+// TinyMCE init settings
+$initArray = array (
+	'mode' => 'none',
+	'onpageload' => 'wpEditorInit',
+	'width' => '100%',
+	'theme' => 'advanced',
+	'skin' => 'wp_theme',
+	'theme_advanced_buttons1' => "$mce_buttons",
+	'theme_advanced_buttons2' => "$mce_buttons_2",
+	'theme_advanced_buttons3' => "$mce_buttons_3",
+	'theme_advanced_buttons4' => "$mce_buttons_4",
+	'language' => "$mce_locale",
+	'spellchecker_languages' => "$mce_spellchecker_languages",
+	'theme_advanced_toolbar_location' => 'top',
+	'theme_advanced_toolbar_align' => 'left',
+	'theme_advanced_statusbar_location' => 'bottom',
+	'theme_advanced_resizing' => true,
+	'theme_advanced_resize_horizontal' => false,
+	'dialog_type' => 'modal',
+	'relative_urls' => false,
+	'remove_script_host' => false,
+	'apply_source_formatting' => false,
+	'remove_linebreaks' => true,
+	'paste_convert_middot_lists' => true,
+	'paste_remove_spans' => true,
+	'paste_remove_styles' => true,
+	'gecko_spellcheck' => true,
+	'entities' => '38,amp,60,lt,62,gt',
+	'accessibility_focus' => false,
+	'tab_focus' => ':next',
+	'content_css' => "$mce_css",
+	'save_callback' => 'switchEditors.saveCallback',
+	'plugins' => "$plugins",
+	// pass-through the settings for compression and caching, so they can be changed with "tiny_mce_before_init"
+	'disk_cache' => true,
+	'compress' => true,
+	'old_cache_max' => '1' // number of cache files to keep
+);
+
+// For people who really REALLY know what they're doing with TinyMCE
+// You can modify initArray to add, remove, change elements of the config before tinyMCE.init (changed from action to filter)
+$initArray = apply_filters('tiny_mce_before_init', $initArray);
+
+// Setting "valid_elements", "invalid_elements" and "extended_valid_elements" can be done through "tiny_mce_before_init".
+// Best is to use the default cleanup by not specifying valid_elements, as TinyMCE contains full set of XHTML 1.0.
+
+// support for deprecated actions
+ob_start();
+do_action('mce_options');
+$mce_deprecated = ob_get_contents();
+ob_end_clean();
+
+$mce_deprecated = (string) $mce_deprecated;
+if ( strlen( $mce_deprecated ) < 10 || ! strpos( $mce_deprecated, ':' ) || ! strpos( $mce_deprecated, ',' ) )	
+	$mce_deprecated = '';
+
+// Settings for the gzip compression and cache
+$disk_cache = ( ! isset($initArray['disk_cache']) || false == $initArray['disk_cache'] ) ? false : true;
+$compress = ( ! isset($initArray['compress']) || false == $initArray['compress'] ) ? false : true;
+$old_cache_max = ( isset($initArray['old_cache_max']) ) ? (int) $initArray['old_cache_max'] : 0;
+
+$initArray['disk_cache'] = $initArray['compress'] = $initArray['old_cache_max'] = null;
+unset( $initArray['disk_cache'], $initArray['compress'], $initArray['old_cache_max'] );
+
+// Anybody still using IE5/5.5? It can't handle gzip compressed js well.
+if ( $msie = strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') ) {
+	$ie_ver = (int) substr( $_SERVER['HTTP_USER_AGENT'] , $msie + 5, 3 );
+	if ( $ie_ver && $ie_ver < 6 ) $compress = false;
+}
+
+// Cache path, this is where the .gz files will be stored
+$cache_path = ABSPATH . 'wp-content/uploads/js_cache'; 
+if ( $disk_cache && ! is_dir($cache_path) )
+	$disk_cache = wp_mkdir_p($cache_path);
+
+$cache_ext = '.js';
+$plugins = explode( ',', $initArray['plugins'] );
+$theme = ( 'simple' == $initArray['theme'] ) ? 'simple' : 'advanced';
+$language = isset($initArray['language']) ? substr( $initArray['language'], 0, 2 ) : 'en';
+$cacheKey = $mce_options = '';	
+
+// Check if browser supports gzip
+if ( $compress && isset($_SERVER['HTTP_ACCEPT_ENCODING']) ) {
+	if ( ( false !== strpos( strtolower($_SERVER['HTTP_ACCEPT_ENCODING']), 'gzip') || isset($_SERVER['---------------']) ) && function_exists('gzencode') && ! ini_get('zlib.output_compression') ) {
+		$cache_ext = '.gz';
+	}
+}
+
+// Setup cache info
+if ( $disk_cache ) {
+
+	$cacheKey = apply_filters('tiny_mce_version', '20080327');
+
+	foreach ( $initArray as $v )
+		$cacheKey .= $v;
+
+	if ( ! empty($mce_external_plugins) ) {
+		foreach ( $mce_external_plugins as $n => $v )
+			$cacheKey .= $n;
+	}
+	
+	$cacheKey = md5( $cacheKey );
+	$cache_file = $cache_path . '/tinymce_' . $cacheKey . $cache_ext;
+}
+
+$expiresOffset = 864000; // 10 days
+header( 'Content-Type: application/x-javascript; charset=UTF-8' );
+header( 'Vary: Accept-Encoding' ); // Handle proxies
+header( 'Expires: ' . gmdate( "D, d M Y H:i:s", time() + $expiresOffset ) . ' GMT' );
+
+// Use cached file if exists
+if ( $disk_cache && is_file($cache_file) && is_readable($cache_file) ) {
+
+	$mtime = gmdate("D, d M Y H:i:s", filemtime($cache_file)) . " GMT";
+	
+	if ( isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $_SERVER['HTTP_IF_MODIFIED_SINCE'] == $mtime ) {
+		header('HTTP/1.1 304 Not Modified');
+		exit;
+	}
+	header("Last-Modified: " . $mtime);
+	header("Cache-Control: must-revalidate", false);
+
+	$content = getFileContents( $cache_file );
+	
+	if ( '.gz' == $cache_ext )
+		header( 'Content-Encoding: gzip' );
+
+	header( 'Content-Length: ' . strlen($content) );
+
+	echo $content;
+	exit;
+}
+
+foreach ( $initArray as $k => $v ) 
+    $mce_options .= $k . ':"' . $v . '",';
+
+if ( $mce_deprecated ) $mce_options .= $mce_deprecated;
+
+$mce_options = rtrim( trim($mce_options), '\n\r,' );
+
+$content = 'var tinyMCEPreInit = { settings : { themes : "' . $theme . '", plugins : "' . $initArray['plugins'] . '", languages : "' . $language . '", debug : false }, base : "' . $baseurl . '", suffix : "" };';
+
+// Load patch
+$content .= getFileContents( 'tiny_mce_ext.js' );
+
+// Add core
+$content .= getFileContents( 'tiny_mce.js' );
+
+// Patch loading functions
+$content .= 'tinyMCEPreInit.start();';
+
+// Add all languages (WP)
+include_once( dirname(__FILE__).'/langs/wp-langs.php' );
+$content .= $strings;
+
+// Add themes
+$content .= getFileContents( 'themes/' . $theme . '/editor_template.js' );
+
+// Add plugins
+foreach ( $plugins as $plugin ) 
+	$content .= getFileContents( 'plugins/' . $plugin . '/editor_plugin.js' );
+
+// Add external plugins and init 
+$content .= $ext_plugins . 'tinyMCE.init({' . $mce_options . '});';
+
+// Generate GZIP'd content
+if ( '.gz' == $cache_ext ) {
+	header('Content-Encoding: gzip');
+	$content = gzencode( $content, 9, FORCE_GZIP );
+}
+
+// Stream to client
+header( 'Content-Length: ' . strlen($content) );
+echo $content;
+
+// Write file
+if ( '' != $cacheKey && is_dir($cache_path) && is_readable($cache_path) ) {	
+
+	$old_cache = array();
+	$handle = opendir($cache_path);
+	while ( false !== ( $file = readdir($handle) ) ) {
+		if ( $file == '.' || $file == '..' ) continue;
+        $saved = filectime("$cache_path/$file");
+		if ( strpos($file, 'tinymce_') !== false && substr($file, -3) == $cache_ext ) $old_cache["$saved"] = $file;
+	}
+	closedir($handle);
+			
+	krsort($old_cache);
+	if ( 1 >= $old_cache_max ) $del_cache = $old_cache;
+	else $del_cache = array_slice( $old_cache, ($old_cache_max - 1) );
+
+	foreach ( $del_cache as $key )
+		@unlink("$cache_path/$key");
 
-	// Set up init variables
-	$valid_elements = 'p/-div[*],-strong/-b[*],-em/-i[*],-font[*],-ul[*],-ol[*],-li[*],*[*]';
-	$valid_elements = apply_filters('mce_valid_elements', $valid_elements);
-
-	$plugins = array('inlinepopups', 'autosave', 'spellchecker', 'paste', 'wordpress');
-	$plugins = apply_filters('mce_plugins', $plugins);
-	$plugins = implode($plugins, ',');
-
-	$mce_buttons = apply_filters('mce_buttons', array('bold', 'italic', 'strikethrough', 'separator', 'bullist', 'numlist', 'outdent', 'indent', 'separator', 'justifyleft', 'justifycenter', 'justifyright', 'separator', 'link', 'unlink', 'image', 'wp_more', 'separator', 'spellchecker', 'separator', 'wp_help', 'wp_adv_start', 'wp_adv', 'separator', 'formatselect', 'underline', 'justifyfull', 'forecolor', 'separator', 'pastetext', 'pasteword', 'separator', 'removeformat', 'cleanup', 'separator', 'charmap', 'separator', 'undo', 'redo', 'wp_adv_end'));
-	$mce_buttons = implode($mce_buttons, ',');
-
-	$mce_buttons_2 = apply_filters('mce_buttons_2', array());
-	$mce_buttons_2 = implode($mce_buttons_2, ',');
-
-	$mce_buttons_3 = apply_filters('mce_buttons_3', array());
-	$mce_buttons_3 = implode($mce_buttons_3, ',');
-
-	$mce_browsers = apply_filters('mce_browsers', array('msie', 'gecko', 'opera', 'safari'));
-	$mce_browsers = implode($mce_browsers, ',');
-
-	$mce_popups_css = get_option('siteurl') . '/wp-includes/js/tinymce/plugins/wordpress/popups.css';
-	$mce_css = get_option('siteurl') . '/wp-includes/js/tinymce/plugins/wordpress/wordpress.css';
-	$mce_css = apply_filters('mce_css', $mce_css);
-	if ( $_SERVER['HTTPS'] == 'on' ) {
-		$mce_css = str_replace('http://', 'https://', $mce_css);
-		$mce_popups_css = str_replace('http://', 'https://', $mce_popups_css);
-	}
-	
-	$mce_locale = ( '' == get_locale() ) ? 'en' : strtolower(get_locale());
-?>
-
-initArray = {
-	mode : "specific_textareas",
-	editor_selector : "mceEditor",
-	width : "100%",
-	theme : "advanced",
-	theme_advanced_buttons1 : "<?php echo $mce_buttons; ?>",
-	theme_advanced_buttons2 : "<?php echo $mce_buttons_2; ?>",
-	theme_advanced_buttons3 : "<?php echo $mce_buttons_3; ?>",
-	language : "<?php echo $mce_locale; ?>",
-	theme_advanced_toolbar_location : "top",
-	theme_advanced_toolbar_align : "left",
-	theme_advanced_path_location : "bottom",
-	theme_advanced_resizing : true,
-	browsers : "<?php echo $mce_browsers; ?>",
-	dialog_type : "modal",
-	theme_advanced_resize_horizontal : false,
-	convert_urls : false,
-	relative_urls : false,
-	remove_script_host : false,
-	force_p_newlines : true,
-	force_br_newlines : false,
-	convert_newlines_to_brs : false,
-	remove_linebreaks : false,
-	fix_list_elements : true,
-	gecko_spellcheck : true,
-	entities : "38,amp,60,lt,62,gt",
-	button_tile_map : true,
-	content_css : "<?php echo $mce_css; ?>",
-	valid_elements : "<?php echo $valid_elements; ?>",
-	save_callback : 'TinyMCE_wordpressPlugin.saveCallback',
-	imp_version : "<?php echo intval($_GET['ver']); ?>",
-<?php do_action('mce_options'); ?>
-	plugins : "<?php echo $plugins; ?>"
-};
-
-<?php
-	// For people who really REALLY know what they're doing with TinyMCE
-	// You can modify initArray to add, remove, change elements of the config before tinyMCE.init
-	do_action('tinymce_before_init');
-?>
+	putFileContents( $cache_file, $content );
+}
 
-tinyMCE.init(initArray);
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/tiny_mce_ext.js 2.5.src/wp-includes/js/tinymce/tiny_mce_ext.js
--- 2.2.2.src/wp-includes/js/tinymce/tiny_mce_ext.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/tiny_mce_ext.js	2008-03-18 01:59:53.000000000 -0500
@@ -0,0 +1,36 @@
+tinyMCEPreInit.start = function() {
+	var t = this, each = tinymce.each, s = t.settings, sl = tinymce.ScriptLoader, ln = s.languages, th = s.themes;
+
+	function load(u, sp) {
+		var o;
+
+		if (!sp)
+			u = t.base + u;
+
+		o = {url : u, state : 2};
+		sl.queue.push(o);
+		sl.lookup[o.url] = o;
+	};
+
+	sl.markDone(t.base + '/langs/' + ln + '.js');
+
+	load('/themes/' + th + '/editor_template' + t.suffix + '.js');
+	sl.markDone(t.base + '/themes/' + th + '/langs/' + ln + '.js');
+	sl.markDone(t.base + '/themes/' + th + '/langs/' + ln + '_dlg.js');
+
+	each(s.plugins.split(','), function(n) {
+		if (n && n.charAt(0) != '-') {
+			load('/plugins/' + n + '/editor_plugin' + t.suffix + '.js');
+
+			sl.markDone(t.base + '/plugins/' + n + '/langs/' + ln + '.js');
+			sl.markDone(t.base + '/plugins/' + n + '/langs/' + ln + '_dlg.js');
+		}
+	});
+};
+tinyMCEPreInit.load_ext = function(url,lang) {
+	var sl = tinymce.ScriptLoader;
+	
+//	sl.add(url + '/langs/lang.php');
+	sl.markDone(url + '/langs/' + lang + '.js');
+	sl.markDone(url + '/langs/' + lang + '_dlg.js');
+};
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/tiny_mce_gzip.php 2.5.src/wp-includes/js/tinymce/tiny_mce_gzip.php
--- 2.2.2.src/wp-includes/js/tinymce/tiny_mce_gzip.php	2007-05-01 21:36:44.000000000 -0500
+++ 2.5.src/wp-includes/js/tinymce/tiny_mce_gzip.php	2008-02-11 11:45:18.000000000 -0600
@@ -1,361 +0,0 @@
-<?php
-/**
- * $Id: tiny_mce_gzip.php 158 2006-12-21 14:32:19Z spocke $
- *
- * @author Moxiecode
- * @copyright Copyright  2005-2006, Moxiecode Systems AB, All rights reserved.
- *
- * This file compresses the TinyMCE JavaScript using GZip and
- * enables the browser to do two requests instead of one for each .js file.
- * Notice: This script defaults the button_tile_map option to true for extra performance.
- */
-
-	@require_once('../../../wp-config.php');  // For get_bloginfo().
-
-	// Get input
-	$plugins = explode(',', getParam("plugins", ""));
-	$languages = explode(',', getParam("languages", ""));
-	$themes = explode(',', getParam("themes", ""));
-	$diskCache = getParam("diskcache", "") == "true";
-	$isJS = getParam("js", "") == "true";
-	$compress = getParam("compress", "true") == "true";
-	$suffix = getParam("suffix", "_src") == "_src" ? "_src" : "";
-	$cachePath = realpath("."); // Cache path, this is where the .gz files will be stored
-	$expiresOffset = 3600 * 24 * 10; // Cache for 10 days in browser cache
-	$content = "";
-	$encodings = array();
-	$supportsGzip = false;
-	$enc = "";
-	$cacheKey = "";
-
-	// Custom extra javascripts to pack
-	$custom = array(/*
-		"some custom .js file",
-		"some custom .js file"
-	*/);
-
-	// WP
-	$index = getParam("index", -1);
-	$theme = getParam("theme", "");
-	$themes = array($theme);
-	$language = getParam("language", "en");
-	if ( empty($language) )
-		$language = 'en';
-	$languages = array($language);
-	if ( $language != strtolower($language) )
-		$languages[] = strtolower($language);
-	if ( $language != substr($language, 0, 2) )
-		$languages[] = substr($language, 0, 2);
-	$diskCache = false;
-	$isJS = true;
-	$suffix = '';
-
-	// Headers
-	header("Content-Type: text/javascript; charset=" . get_bloginfo('charset'));
-	header("Vary: Accept-Encoding");  // Handle proxies
-	header("Expires: " . gmdate("D, d M Y H:i:s", time() + $expiresOffset) . " GMT");
-
-	// Is called directly then auto init with default settings
-	if (!$isJS) {
-		echo getFileContents("tiny_mce_gzip.js");
-		echo "tinyMCE_GZ.init({});";
-		die();
-	}
-
-	// Setup cache info
-	if ($diskCache) {
-		if (!$cachePath)
-			die("alert('Real path failed.');");
-
-		$cacheKey = getParam("plugins", "") . getParam("languages", "") . getParam("themes", "");
-
-		foreach ($custom as $file)
-			$cacheKey .= $file;
-
-		$cacheKey = md5($cacheKey);
-
-		if ($compress)
-			$cacheFile = $cachePath . "/tiny_mce_" . $cacheKey . ".gz";
-		else
-			$cacheFile = $cachePath . "/tiny_mce_" . $cacheKey . ".js";
-	}
-
-	// Check if it supports gzip
-	if (isset($_SERVER['HTTP_ACCEPT_ENCODING']))
-		$encodings = explode(',', strtolower(preg_replace("/\s+/", "", $_SERVER['HTTP_ACCEPT_ENCODING'])));
-
-	if ((in_array('gzip', $encodings) || in_array('x-gzip', $encodings) || isset($_SERVER['---------------'])) && function_exists('ob_gzhandler') && !ini_get('zlib.output_compression') && ini_get('output_handler') != 'ob_gzhandler') {
-		$enc = in_array('x-gzip', $encodings) ? "x-gzip" : "gzip";
-		$supportsGzip = true;
-	}
-
-	// Use cached file disk cache
-	if ($diskCache && $supportsGzip && file_exists($cacheFile)) {
-		if ($compress)
-			header("Content-Encoding: " . $enc);
-
-		echo getFileContents($cacheFile);
-		die();
-	}
-
-if ($index > -1) {
-	// Write main script and patch some things
-	if ( $index == 0 ) {
-		// Add core
-		$content .= wp_compact_tinymce_js(getFileContents("tiny_mce" . $suffix . ".js"));
-		$content .= 'TinyMCE.prototype.orgLoadScript = TinyMCE.prototype.loadScript;';
-		$content .= 'TinyMCE.prototype.loadScript = function() {};var realTinyMCE = tinyMCE;';
-	} else
-		$content .= 'tinyMCE = realTinyMCE;';
-
-	// Patch loading functions
-	//$content .= "tinyMCE_GZ.start();";
-	
-	// Do init based on index
-	$content .= "tinyMCE.init(tinyMCECompressed.configs[" . $index . "]);";
-
-	// Load external plugins
-	if ( $index == 0 )
-		$content .= "tinyMCECompressed.loadPlugins();";
-
-	// Add core languages
-	$lang_content = '';
-	foreach ($languages as $lang)
-		$lang_content .= getFileContents("langs/" . $lang . ".js");
-	if ( empty($lang_content) )
-		$lang_content .= getFileContents("langs/en.js");
-	$content .= $lang_content;
-
-	// Add themes
-	foreach ($themes as $theme) {
-		$content .= wp_compact_tinymce_js(getFileContents( "themes/" . $theme . "/editor_template" . $suffix . ".js"));
-
-		$lang_content = '';
-		foreach ($languages as $lang)
-			$lang_content .= getFileContents("themes/" . $theme . "/langs/" . $lang . ".js");
-		if ( empty($lang_content) )
-			$lang_content .= getFileContents("themes/" . $theme . "/langs/en.js");
-		$content .= $lang_content;
-	}
-
-	// Add plugins
-	foreach ($plugins as $plugin) {
-		$content .= getFileContents("plugins/" . $plugin . "/editor_plugin" . $suffix . ".js");
-
-		$lang_content = '';
-		foreach ($languages as $lang)
-			$lang_content .= getFileContents("plugins/" . $plugin . "/langs/" . $lang . ".js");
-		if ( empty($lang_content) )
-			$lang_content .= getFileContents("plugins/" . $plugin . "/langs/en.js");
-		$content .= $lang_content;
-	}
-
-	// Add custom files
-	foreach ($custom as $file)
-		$content .= getFileContents($file);
-
-	// Reset tinyMCE compressor engine
-	$content .= "tinyMCE = tinyMCECompressed;";
-
-	// Restore loading functions
-	//$content .= "tinyMCE_GZ.end();";
-
-	// Generate GZIP'd content
-	if ($supportsGzip) {
-		if ($compress) {
-			header("Content-Encoding: " . $enc);
-			$cacheData = gzencode($content, 9, FORCE_GZIP);
-		} else
-			$cacheData = $content;
-
-		// Write gz file
-		if ($diskCache && $cacheKey != "")
-			putFileContents($cacheFile, $cacheData);
-
-		// Stream to client
-		echo $cacheData;
-	} else {
-		// Stream uncompressed content
-		echo $content;
-	}
-
-	die;
-}
-
-	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-	function getParam($name, $def = false) {
-		if (!isset($_GET[$name]))
-			return $def;
-
-		return preg_replace("/[^0-9a-z\-_,]+/i", "", $_GET[$name]); // Remove anything but 0-9,a-z,-_
-	}
-
-	function getFileContents($path) {
-		$path = realpath($path);
-
-		if (!$path || !@is_file($path))
-			return "";
-
-		if (function_exists("file_get_contents"))
-			return @file_get_contents($path);
-
-		$content = "";
-		$fp = @fopen($path, "r");
-		if (!$fp)
-			return "";
-
-		while (!feof($fp))
-			$content .= fgets($fp);
-
-		fclose($fp);
-
-		return $content;
-	}
-
-	function putFileContents($path, $content) {
-		if (function_exists("file_put_contents"))
-			return @file_put_contents($path, $content);
-
-		$fp = @fopen($path, "wb");
-		if ($fp) {
-			fwrite($fp, $content);
-			fclose($fp);
-		}
-	}
-
-	// WP specific
-	function wp_compact_tinymce_js($text) {
-		// This function was custom-made for TinyMCE 2.0, not expected to work with any other JS.
-
-		// Strip comments
-		$text = preg_replace("!(^|\s+)//.*$!m", '', $text);
-		$text = preg_replace("!/\*.*?\*/!s", '', $text);
-
-		// Strip leading tabs, carriage returns and unnecessary line breaks.
-		$text = preg_replace("!^\t+!m", '', $text);
-		$text = str_replace("\r", '', $text);
-		$text = preg_replace("!(^|{|}|;|:|\))\n!m", '\\1', $text);
-
-		return "$text\n";
-	}
-?>
-
-function TinyMCECompressed() {
-	this.configs = new Array();
-	this.loadedFiles = new Array();
-	this.externalPlugins = new Array();
-	this.loadAdded = false;
-	this.isLoaded = false;
-}
-
-TinyMCECompressed.prototype.init = function(settings) {
-	var elements = document.getElementsByTagName('script');
-	var scriptURL = "";
-
-	for (var i=0; i<elements.length; i++) {
-		if (elements[i].src && elements[i].src.indexOf("tiny_mce_gzip.php") != -1) {
-			scriptURL = elements[i].src;
-			break;
-		}
-	}
-
-	settings["theme"] = typeof(settings["theme"]) != "undefined" ? settings["theme"] : "default";
-	settings["plugins"] = typeof(settings["plugins"]) != "undefined" ? settings["plugins"] : "";
-	settings["language"] = typeof(settings["language"]) != "undefined" ? settings["language"] : "en";
-	settings["button_tile_map"] = typeof(settings["button_tile_map"]) != "undefined" ? settings["button_tile_map"] : true;
-	this.configs[this.configs.length] = settings;
-	this.settings = settings;
-
-	scriptURL += (scriptURL.indexOf('?') == -1) ? '?' : '&';
-	scriptURL += "theme=" + escape(this.getOnce(settings["theme"])) + "&language=" + escape(this.getOnce(settings["language"])) + "&plugins=" + escape(this.getOnce(settings["plugins"])) + "&lang=" + settings["language"] + "&index=" + escape(this.configs.length-1);
-	document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + scriptURL + '"></script>');
-
-	if (!this.loadAdded) {
-		tinyMCE.addEvent(window, "DOMContentLoaded", TinyMCECompressed.prototype.onLoad);
-		tinyMCE.addEvent(window, "load", TinyMCECompressed.prototype.onLoad);
-		this.loadAdded = true;
-	}
-}
-
-TinyMCECompressed.prototype.onLoad = function() {
-	if (tinyMCE.isLoaded)
-		return true;
-
-	tinyMCE = realTinyMCE;
-	TinyMCE_Engine.prototype.onLoad();
-	tinyMCE._addUnloadEvents();
-
-	tinyMCE.isLoaded = true;
-}
-
-TinyMCECompressed.prototype.addEvent = function(o, n, h) {
-	if (o.attachEvent)
-		o.attachEvent("on" + n, h);
-	else
-		o.addEventListener(n, h, false);
-}
-
-TinyMCECompressed.prototype.getOnce = function(str) {
-	var ar = str.replace(/\s+/g, '').split(',');
-
-	for (var i=0; i<ar.length; i++) {
-		if (ar[i] == '' || ar[i].charAt(0) == '-') {
-			ar[i] = null;
-			continue;
-		}
-
-		// Skip load
-		for (var x=0; x<this.loadedFiles.length; x++) {
-			if (this.loadedFiles[x] == ar[i])
-				ar[i] = null;
-		}
-
-		this.loadedFiles[this.loadedFiles.length] = ar[i];
-	}
-
-	// Glue
-	str = "";
-	for (var i=0; i<ar.length; i++) {
-		if (ar[i] == null)
-			continue;
-
-		str += ar[i];
-
-		if (i != ar.length-1)
-			str += ",";
-	}
-
-	return str;
-};
-
-TinyMCECompressed.prototype.loadPlugins = function() {
-	var i, ar;
-
-	TinyMCE.prototype.loadScript = TinyMCE.prototype.orgLoadScript;
-	tinyMCE = realTinyMCE;
-
-	ar = tinyMCECompressed.externalPlugins;
-	for (i=0; i<ar.length; i++)
-		tinyMCE.loadPlugin(ar[i].name, ar[i].url);
-
-	TinyMCE.prototype.loadScript = function() {};
-};
-
-TinyMCECompressed.prototype.loadPlugin = function(n, u) {
-	this.externalPlugins[this.externalPlugins.length] = {name : n, url : u};
-};
-
-TinyMCECompressed.prototype.importPluginLanguagePack = function(n, v) {
-	tinyMCE = realTinyMCE;
-	TinyMCE.prototype.loadScript = TinyMCE.prototype.orgLoadScript;
-	tinyMCE.importPluginLanguagePack(n, v);
-};
-
-TinyMCECompressed.prototype.addPlugin = function(n, p) {
-	tinyMCE = realTinyMCE;
-	tinyMCE.addPlugin(n, p);
-};
-
-var tinyMCE = new TinyMCECompressed();
-var tinyMCECompressed = tinyMCE;
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/tiny_mce_popup.js 2.5.src/wp-includes/js/tinymce/tiny_mce_popup.js
--- 2.2.2.src/wp-includes/js/tinymce/tiny_mce_popup.js	2006-11-20 18:55:06.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/tiny_mce_popup.js	2008-03-27 22:49:35.000000000 -0500
@@ -1,288 +1,275 @@
-// Some global instances, this will be filled later
-var tinyMCE = null, tinyMCELang = null;
+// Some global instances
+var tinymce = null, tinyMCEPopup, tinyMCE;
 
-function TinyMCE_Popup() {
-};
+tinyMCEPopup = {
+	init : function() {
+		var t = this, w, ti, li, q, i, it;
 
-TinyMCE_Popup.prototype = {
-	findWin : function(w) {
-		var c;
-
-		// Check parents
-		c = w;
-		while (c && (c = c.parent) != null) {
-			if (typeof(c.tinyMCE) != "undefined")
-				return c;
+		li = ('' + document.location.search).replace(/^\?/, '').split('&');
+		q = {};
+		for (i=0; i<li.length; i++) {
+			it = li[i].split('=');
+			q[unescape(it[0])] = unescape(it[1]);
 		}
 
-		// Check openers
-		c = w;
-		while (c && (c = c.opener) != null) {
-			if (typeof(c.tinyMCE) != "undefined")
-				return c;
-		}
+		if (q.mce_rdomain)
+			document.domain = q.mce_rdomain;
 
-		// Try top
-		if (typeof(top.tinyMCE) != "undefined")
-			return top;
+		// Find window & API
+		w = t.getWin();
+		tinymce = w.tinymce;
+		tinyMCE = w.tinyMCE;
+		t.editor = tinymce.EditorManager.activeEditor;
+		t.params = t.editor.windowManager.params;
+
+		// Setup local DOM
+		t.dom = t.editor.windowManager.createInstance('tinymce.dom.DOMUtils', document);
+		t.dom.loadCSS(t.editor.settings.popup_css);
+
+		// Setup on init listeners
+		t.listeners = [];
+		t.onInit = {
+			add : function(f, s) {
+				t.listeners.push({func : f, scope : s});
+			}
+		};
 
-		return null;
+		t.isWindow = !t.getWindowArg('mce_inline');
+		t.id = t.getWindowArg('mce_window_id');
+		t.editor.windowManager.onOpen.dispatch(t.editor.windowManager, window);
 	},
 
-	init : function() {
-		var win = window.opener ? window.opener : window.dialogArguments, c;
-		var inst;
+	getWin : function() {
+		return window.dialogArguments || opener || parent || top;
+	},
 
-		if (!win)
-			win = this.findWin(window);
+	getWindowArg : function(n, dv) {
+		var v = this.params[n];
 
-		if (!win) {
-			alert("tinyMCE object reference not found from popup.");
-			return;
-		}
+		return tinymce.is(v) ? v : dv;
+	},
 
-		window.opener = win;
-		this.windowOpener = win;
-		this.onLoadEval = "";
-
-		// Setup parent references
-		tinyMCE = win.tinyMCE;
-		tinyMCELang = win.tinyMCELang;
-
-		inst = tinyMCE.selectedInstance;
-		this.isWindow = tinyMCE.getWindowArg('mce_inside_iframe', false) == false;
-		this.storeSelection = (tinyMCE.isRealIE) && !this.isWindow && tinyMCE.getWindowArg('mce_store_selection', true);
+	getParam : function(n, dv) {
+		return this.editor.getParam(n, dv);
+	},
 
-		if (this.isWindow)
-			window.focus();
+	getLang : function(n, dv) {
+		return this.editor.getLang(n, dv);
+	},
 
-		// Store selection
-		if (this.storeSelection)
-			inst.selectionBookmark = inst.selection.getBookmark(true);
-
-		// Setup dir
-		if (tinyMCELang['lang_dir'])
-			document.dir = tinyMCELang['lang_dir'];
-
-		// Setup title
-		var re = new RegExp('{|\\\$|}', 'g');
-		var title = document.title.replace(re, "");
-		if (typeof tinyMCELang[title] != "undefined") {
-			var divElm = document.createElement("div");
-			divElm.innerHTML = tinyMCELang[title];
-			document.title = divElm.innerHTML;
+	execCommand : function(cmd, ui, val, a) {
+		a = a || {};
+		a.skip_focus = 1;
 
-			if (tinyMCE.setWindowTitle != null)
-				tinyMCE.setWindowTitle(window, divElm.innerHTML);
-		}
+		this.restoreSelection();
+		return this.editor.execCommand(cmd, ui, val, a);
+	},
 
-		// Output Popup CSS class
-		document.write('<link href="' + tinyMCE.getParam("popups_css") + '" rel="stylesheet" type="text/css">');
+	resizeToInnerSize : function() {
+		var t = this, n, b = document.body, vp = t.dom.getViewPort(window), dw, dh;
 
-		if (tinyMCE.getParam("popups_css_add")) {
-			c = tinyMCE.getParam("popups_css_add");
+		dw = t.getWindowArg('mce_width') - vp.w;
+		dh = t.getWindowArg('mce_height') - vp.h;
 
-			// Is relative
-			if (c.indexOf('://') == -1 && c.charAt(0) != '/')
-				c = tinyMCE.documentBasePath + "/" + c;
+		if (t.isWindow)
+			window.resizeBy(dw, dh);
+		else
+			t.editor.windowManager.resizeBy(dw, dh, t.id);
+	},
 
-			document.write('<link href="' + c + '" rel="stylesheet" type="text/css">');
-		}
+	executeOnLoad : function(s) {
+		this.onInit.add(function() {
+			eval(s);
+		});
+	},
 
-		tinyMCE.addEvent(window, "load", this.onLoad);
+	storeSelection : function() {
+		this.editor.windowManager.bookmark = tinyMCEPopup.editor.selection.getBookmark('simple');
 	},
 
-	onLoad : function() {
-		var dir, i, elms, body = document.body;
+	restoreSelection : function() {
+		var t = tinyMCEPopup;
+
+		if (!t.isWindow && tinymce.isIE)
+			t.editor.selection.moveToBookmark(t.editor.windowManager.bookmark);
+	},
 
-		if (tinyMCE.getWindowArg('mce_replacevariables', true))
-			body.innerHTML = tinyMCE.applyTemplate(body.innerHTML, tinyMCE.windowArgs);
+	requireLangPack : function() {
+		var u = this.getWindowArg('plugin_url') || this.getWindowArg('theme_url');
 
-		dir = tinyMCE.selectedInstance.settings['directionality'];
-		if (dir == "rtl" && document.forms && document.forms.length > 0) {
-			elms = document.forms[0].elements;
-			for (i=0; i<elms.length; i++) {
-				if ((elms[i].type == "text" || elms[i].type == "textarea") && elms[i].getAttribute("dir") != "ltr")
-					elms[i].dir = dir;
+		if (u && this.editor.settings.language) {
+			u += '/langs/' + this.editor.settings.language + '_dlg.js';
+
+			if (!tinymce.ScriptLoader.isDone(u)) {
+				document.write('<script type="text/javascript" src="' + u + '"></script>');
+				tinymce.ScriptLoader.markDone(u);
 			}
 		}
+	},
 
-		if (body.style.display == 'none')
-			body.style.display = 'block';
+	pickColor : function(e, element_id) {
+		this.execCommand('mceColorPicker', true, {
+			color : document.getElementById(element_id).value,
+			func : function(c) {
+				document.getElementById(element_id).value = c;
+
+				try {
+					document.getElementById(element_id).onchange();
+				} catch (ex) {
+					// Try fire event, ignore errors
+				}
+			}
+		});
+	},
 
-		// Execute real onload (Opera fix)
-		if (tinyMCEPopup.onLoadEval != "")
-			eval(tinyMCEPopup.onLoadEval);
+	openBrowser : function(element_id, type, option) {
+		tinyMCEPopup.restoreSelection();
+		this.editor.execCallback('file_browser_callback', element_id, document.getElementById(element_id).value, type, window);
 	},
 
-	executeOnLoad : function(str) {
-		if (tinyMCE.isOpera)
-			this.onLoadEval = str;
+	close : function() {
+		var t = this;
+
+		// To avoid domain relaxing issue in Opera
+		function close() {
+			t.editor.windowManager.close(window, t.id);
+			tinymce = tinyMCE = t.editor = t.params = t.dom = t.dom.doc = null; // Cleanup
+		};
+
+		if (tinymce.isOpera)
+			t.getWin().setTimeout(close, 0);
 		else
-			eval(str);
+			close();
 	},
 
-	resizeToInnerSize : function() {
-		// Netscape 7.1 workaround
-		if (this.isWindow && tinyMCE.isNS71) {
-			window.resizeBy(0, 10);
-			return;
-		}
+	// Internal functions	
 
-		if (this.isWindow) {
-			var doc = document;
-			var body = doc.body;
-			var oldMargin, wrapper, iframe, nodes, dx, dy;
-
-			if (body.style.display == 'none')
-				body.style.display = 'block';
-
-			// Remove margin
-			oldMargin = body.style.margin;
-			body.style.margin = '0';
-
-			// Create wrapper
-			wrapper = doc.createElement("div");
-			wrapper.id = 'mcBodyWrapper';
-			wrapper.style.display = 'none';
-			wrapper.style.margin = '0';
-
-			// Wrap body elements
-			nodes = doc.body.childNodes;
-			for (var i=nodes.length-1; i>=0; i--) {
-				if (wrapper.hasChildNodes())
-					wrapper.insertBefore(nodes[i].cloneNode(true), wrapper.firstChild);
-				else
-					wrapper.appendChild(nodes[i].cloneNode(true));
+	_restoreSelection : function() {
+		var e = window.event.srcElement;
 
-				nodes[i].parentNode.removeChild(nodes[i]);
-			}
+		if (e.nodeName == 'INPUT' && (e.type == 'submit' || e.type == 'button'))
+			tinyMCEPopup.restoreSelection();
+	},
 
-			// Add wrapper
-			doc.body.appendChild(wrapper);
+/*	_restoreSelection : function() {
+		var e = window.event.srcElement;
 
-			// Create iframe
-			iframe = document.createElement("iframe");
-			iframe.id = "mcWinIframe";
-			iframe.src = document.location.href.toLowerCase().indexOf('https') == -1 ? "about:blank" : tinyMCE.settings['default_document'];
-			iframe.width = "100%";
-			iframe.height = "100%";
-			iframe.style.margin = '0';
-
-			// Add iframe
-			doc.body.appendChild(iframe);
-
-			// Measure iframe
-			iframe = document.getElementById('mcWinIframe');
-			dx = tinyMCE.getWindowArg('mce_width') - iframe.clientWidth;
-			dy = tinyMCE.getWindowArg('mce_height') - iframe.clientHeight;
-
-			// Resize window
-			// tinyMCE.debug(tinyMCE.getWindowArg('mce_width') + "," + tinyMCE.getWindowArg('mce_height') + " - " + dx + "," + dy);
-			window.resizeBy(dx, dy);
-
-			// Hide iframe and show wrapper
-			body.style.margin = oldMargin;
-			iframe.style.display = 'none';
-			wrapper.style.display = 'block';
-		}
-	},
+		// If user focus a non text input or textarea
+		if ((e.nodeName != 'INPUT' && e.nodeName != 'TEXTAREA') || e.type != 'text')
+			tinyMCEPopup.restoreSelection();
+	},*/
 
-	resizeToContent : function() {
-		var isMSIE = (navigator.appName == "Microsoft Internet Explorer");
-		var isOpera = (navigator.userAgent.indexOf("Opera") != -1);
-
-		if (isOpera)
-			return;
-
-		if (isMSIE) {
-			try { window.resizeTo(10, 10); } catch (e) {}
-
-			var elm = document.body;
-			var width = elm.offsetWidth;
-			var height = elm.offsetHeight;
-			var dx = (elm.scrollWidth - width) + 4;
-			var dy = elm.scrollHeight - height;
+	_onDOMLoaded : function() {
+		var t = this, ti = document.title, bm, h;
 
-			try { window.resizeBy(dx, dy); } catch (e) {}
-		} else {
-			window.scrollBy(1000, 1000);
-			if (window.scrollX > 0 || window.scrollY > 0) {
-				window.resizeBy(window.innerWidth * 2, window.innerHeight * 2);
-				window.sizeToContent();
-				window.scrollTo(0, 0);
-				var x = parseInt(screen.width / 2.0) - (window.outerWidth / 2.0);
-				var y = parseInt(screen.height / 2.0) - (window.outerHeight / 2.0);
-				window.moveTo(x, y);
-			}
-		}
-	},
+		// Translate page
+		h = document.body.innerHTML;
 
-	getWindowArg : function(name, default_value) {
-		return tinyMCE.getWindowArg(name, default_value);
-	},
+		// Replace a=x with a="x" in IE
+		if (tinymce.isIE)
+			h = h.replace(/ (value|title|alt)=([^"][^\s>]+)/gi, ' $1="$2"')
 
-	restoreSelection : function() {
-		if (this.storeSelection) {
-			var inst = tinyMCE.selectedInstance;
+		document.dir = t.editor.getParam('directionality','');
+		document.body.innerHTML = t.editor.translate(h);
+		document.title = ti = t.editor.translate(ti);
+		document.body.style.display = '';
 
-			inst.getWin().focus();
+		// Restore selection in IE when focus is placed on a non textarea or input element of the type text
+		if (tinymce.isIE)
+			document.attachEvent('onmouseup', tinyMCEPopup._restoreSelection);
 
-			if (inst.selectionBookmark)
-				inst.selection.moveToBookmark(inst.selectionBookmark);
+		t.restoreSelection();
+		t.resizeToInnerSize();
+
+		// Set inline title
+		if (!t.isWindow)
+			t.editor.windowManager.setTitle(ti, t.id);
+		else
+			window.focus();
+
+		if (!tinymce.isIE && !t.isWindow) {
+			tinymce.dom.Event._add(document, 'focus', function() {
+				t.editor.windowManager.focus(t.id)
+			});
 		}
-	},
 
-	execCommand : function(command, user_interface, value) {
-		var inst = tinyMCE.selectedInstance;
+		// Patch for accessibility
+		tinymce.each(t.dom.select('select'), function(e) {
+			e.onkeydown = tinyMCEPopup._accessHandler;
+		});
 
-		this.restoreSelection();
-		inst.execCommand(command, user_interface, value);
+		// Call onInit
+		// Init must be called before focus so the selection won't get lost by the focus call
+		tinymce.each(t.listeners, function(o) {
+			o.func.call(o.scope, t.editor);
+		});
 
-		// Store selection
-		if (this.storeSelection)
-			inst.selectionBookmark = inst.selection.getBookmark(true);
-	},
+		// Move focus to window
+		if (t.getWindowArg('mce_auto_focus', true)) {
+			window.focus();
 
-	close : function() {
-		tinyMCE.closeWindow(window);
-	},
+			// Focus element with mceFocus class
+			tinymce.each(document.forms, function(f) {
+				tinymce.each(f.elements, function(e) {
+					if (t.dom.hasClass(e, 'mceFocus') && !e.disabled) {
+						e.focus();
+						return false; // Break loop
+					}
+				});
+			});
+		}
 
-	pickColor : function(e, element_id) {
-		tinyMCE.selectedInstance.execCommand('mceColorPicker', true, {
-			element_id : element_id,
-			document : document,
-			window : window,
-			store_selection : false
-		});
+		document.onkeydown = tinyMCEPopup._closeWinKeyHandler;
 	},
 
-	openBrowser : function(element_id, type, option) {
-		var cb = tinyMCE.getParam(option, tinyMCE.getParam("file_browser_callback"));
-		var url = document.getElementById(element_id).value;
+	_accessHandler : function(e) {
+		e = e || window.event;
 
-		tinyMCE.setWindowArg("window", window);
-		tinyMCE.setWindowArg("document", document);
+		if (e.keyCode == 13 || e.keyCode == 32) {
+			e = e.target || e.srcElement;
 
-		// Call to external callback
-		if (eval('typeof(tinyMCEPopup.windowOpener.' + cb + ')') == "undefined")
-			alert("Callback function: " + cb + " could not be found.");
-		else
-			eval("tinyMCEPopup.windowOpener." + cb + "(element_id, url, type, window);");
+			if (e.onchange)
+				e.onchange();
+
+			return tinymce.dom.Event.cancel(e);
+		}
 	},
 
-	importClass : function(c) {
-		window[c] = function() {};
+	_closeWinKeyHandler : function(e) {
+		e = e || window.event;
 
-		for (var n in window.opener[c].prototype)
-			window[c].prototype[n] = window.opener[c].prototype[n];
+		if (e.keyCode == 27)
+			tinyMCEPopup.close();
+	},
 
-		window[c].constructor = window.opener[c].constructor;
+	_wait : function() {
+		var t = this, ti;
+
+		if (tinymce.isIE && document.location.protocol != 'https:') {
+			// Fake DOMContentLoaded on IE
+			document.write('<script id=__ie_onload defer src=\'javascript:""\';><\/script>');
+			document.getElementById("__ie_onload").onreadystatechange = function() {
+				if (this.readyState == "complete") {
+					t._onDOMLoaded();
+					document.getElementById("__ie_onload").onreadystatechange = null; // Prevent leak
+				}
+			};
+		} else {
+			if (tinymce.isIE || tinymce.isWebKit) {
+				ti = setInterval(function() {
+					if (/loaded|complete/.test(document.readyState)) {
+						clearInterval(ti);
+						t._onDOMLoaded();
+					}
+				}, 10);
+			} else {
+				window.addEventListener('DOMContentLoaded', function() {
+					t._onDOMLoaded();
+				}, false);
+			}
+		}
 	}
-
-	};
-
-// Setup global instance
-var tinyMCEPopup = new TinyMCE_Popup();
+};
 
 tinyMCEPopup.init();
+tinyMCEPopup._wait(); // Wait for DOM Content Loaded
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/utils/editable_selects.js 2.5.src/wp-includes/js/tinymce/utils/editable_selects.js
--- 2.2.2.src/wp-includes/js/tinymce/utils/editable_selects.js	2007-01-24 19:20:47.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/utils/editable_selects.js	2008-01-17 09:44:05.000000000 -0600
@@ -1,61 +1,61 @@
-/**
- * $Id: editable_selects.js 162 2007-01-03 16:16:52Z spocke $
- *
- * Makes select boxes editable.
- *
- * @author Moxiecode
- * @copyright Copyright  2004-2007, Moxiecode Systems AB, All rights reserved.
- */
-
-var TinyMCE_EditableSelects = {
-	editSelectElm : null,
-
-	init : function() {
-		var nl = document.getElementsByTagName("select"), i, d = document, o;
-
-		for (i=0; i<nl.length; i++) {
-			if (nl[i].className.indexOf('mceEditableSelect') != -1) {
-				o = new Option('(value)', '__mce_add_custom__');
-
-				o.className = 'mceAddSelectValue';
-
-				nl[i].options[nl[i].options.length] = o;
-				nl[i].setAttribute('onchange', 'TinyMCE_EditableSelects.onChangeEditableSelect(this);');
-			}
-		}
-	},
-
-	onChangeEditableSelect : function(se) {
-		var d = document, ne;
-
-		if (se.options[se.selectedIndex].value == '__mce_add_custom__') {
-			ne = d.createElement("input");
-			ne.id = se.id + "_custom";
-			ne.name = se.name + "_custom";
-			ne.type = "text";
-
-			ne.style.width = se.clientWidth;
-			se.parentNode.insertBefore(ne, se);
-			se.style.display = 'none';
-			ne.focus();
-			ne.onblur = TinyMCE_EditableSelects.onBlurEditableSelectInput;
-			TinyMCE_EditableSelects.editSelectElm = se;
-		}
-	},
-
-	onBlurEditableSelectInput : function() {
-		var se = TinyMCE_EditableSelects.editSelectElm;
-
-		if (se) {
-			if (se.previousSibling.value != '') {
-				addSelectValue(document.forms[0], se.id, se.previousSibling.value, se.previousSibling.value);
-				selectByValue(document.forms[0], se.id, se.previousSibling.value);
-			} else
-				selectByValue(document.forms[0], se.id, '');
-
-			se.style.display = 'inline';
-			se.parentNode.removeChild(se.previousSibling);
-			TinyMCE_EditableSelects.editSelectElm = null;
-		}
-	}
-};
+/**
+ * $Id: editable_selects.js 520 2008-01-07 16:30:32Z spocke $
+ *
+ * Makes select boxes editable.
+ *
+ * @author Moxiecode
+ * @copyright Copyright  2004-2008, Moxiecode Systems AB, All rights reserved.
+ */
+
+var TinyMCE_EditableSelects = {
+	editSelectElm : null,
+
+	init : function() {
+		var nl = document.getElementsByTagName("select"), i, d = document, o;
+
+		for (i=0; i<nl.length; i++) {
+			if (nl[i].className.indexOf('mceEditableSelect') != -1) {
+				o = new Option('(value)', '__mce_add_custom__');
+
+				o.className = 'mceAddSelectValue';
+
+				nl[i].options[nl[i].options.length] = o;
+				nl[i].onchange = TinyMCE_EditableSelects.onChangeEditableSelect;
+			}
+		}
+	},
+
+	onChangeEditableSelect : function(e) {
+		var d = document, ne, se = window.event ? window.event.srcElement : e.target;
+
+		if (se.options[se.selectedIndex].value == '__mce_add_custom__') {
+			ne = d.createElement("input");
+			ne.id = se.id + "_custom";
+			ne.name = se.name + "_custom";
+			ne.type = "text";
+
+			ne.style.width = se.offsetWidth + 'px';
+			se.parentNode.insertBefore(ne, se);
+			se.style.display = 'none';
+			ne.focus();
+			ne.onblur = TinyMCE_EditableSelects.onBlurEditableSelectInput;
+			TinyMCE_EditableSelects.editSelectElm = se;
+		}
+	},
+
+	onBlurEditableSelectInput : function() {
+		var se = TinyMCE_EditableSelects.editSelectElm;
+
+		if (se) {
+			if (se.previousSibling.value != '') {
+				addSelectValue(document.forms[0], se.id, se.previousSibling.value, se.previousSibling.value);
+				selectByValue(document.forms[0], se.id, se.previousSibling.value);
+			} else
+				selectByValue(document.forms[0], se.id, '');
+
+			se.style.display = 'inline';
+			se.parentNode.removeChild(se.previousSibling);
+			TinyMCE_EditableSelects.editSelectElm = null;
+		}
+	}
+};
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/utils/form_utils.js 2.5.src/wp-includes/js/tinymce/utils/form_utils.js
--- 2.2.2.src/wp-includes/js/tinymce/utils/form_utils.js	2007-01-24 19:20:47.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/utils/form_utils.js	2008-03-12 17:47:11.000000000 -0500
@@ -1,33 +1,23 @@
 /**
- * $Id: form_utils.js 162 2007-01-03 16:16:52Z spocke $
+ * $Id: form_utils.js 673 2008-03-06 13:26:20Z spocke $
  *
  * Various form utilitiy functions.
  *
  * @author Moxiecode
- * @copyright Copyright  2004-2007, Moxiecode Systems AB, All rights reserved.
+ * @copyright Copyright  2004-2008, Moxiecode Systems AB, All rights reserved.
  */
 
-var themeBaseURL = tinyMCE.baseURL + '/themes/' + tinyMCE.getParam("theme");
+var themeBaseURL = tinyMCEPopup.editor.baseURI.toAbsolute('themes/' + tinyMCEPopup.getParam("theme"));
 
 function getColorPickerHTML(id, target_form_element) {
 	var h = "";
 
-	h += '<a id="' + id + '_link" href="javascript:void(0);" onkeydown="pickColor(event,\'' + target_form_element +'\');" onmousedown="pickColor(event,\'' + target_form_element +'\');return false;">';
-	h += '<img id="' + id + '" src="' + themeBaseURL + '/images/color.gif"';
-	h += ' onmouseover="this.className=\'mceButtonOver\'"';
-	h += ' onmouseout="this.className=\'mceButtonNormal\'"';
-	h += ' onmousedown="this.className=\'mceButtonDown\'"';
-	h += ' width="20" height="16" border="0" title="' + tinyMCE.getLang('lang_browse') + '"';
-	h += ' class="mceButtonNormal" alt="' + tinyMCE.getLang('lang_browse') + '" /></a>';
+	h += '<a id="' + id + '_link" href="javascript:;" onclick="tinyMCEPopup.pickColor(event,\'' + target_form_element +'\');" onmousedown="return false;" class="pickcolor">';
+	h += '<span id="' + id + '" title="' + tinyMCEPopup.getLang('browse') + '"></span></a>';
 
 	return h;
 }
 
-function pickColor(e, target_form_element) {
-	if ((e.keyCode == 32 || e.keyCode == 13) || e.type == "mousedown")
-		tinyMCEPopup.pickColor(e, target_form_element);
-}
-
 function updateColor(img_id, form_element_id) {
 	document.getElementById(img_id).style.backgroundColor = document.forms[0].elements[form_element_id].value;
 }
@@ -40,34 +30,32 @@
 		if (state) {
 			lnk.setAttribute("realhref", lnk.getAttribute("href"));
 			lnk.removeAttribute("href");
-			tinyMCE.switchClass(img, 'mceButtonDisabled', true);
+			tinyMCEPopup.dom.addClass(img, 'disabled');
 		} else {
-			lnk.setAttribute("href", lnk.getAttribute("realhref"));
-			tinyMCE.switchClass(img, 'mceButtonNormal', false);
+			if (lnk.getAttribute("realhref"))
+				lnk.setAttribute("href", lnk.getAttribute("realhref"));
+
+			tinyMCEPopup.dom.removeClass(img, 'disabled');
 		}
 	}
 }
 
 function getBrowserHTML(id, target_form_element, type, prefix) {
-	var option = prefix + "_" + type + "_browser_callback";
-	var cb = tinyMCE.getParam(option, tinyMCE.getParam("file_browser_callback"));
-	if (cb == null)
-		return "";
+	var option = prefix + "_" + type + "_browser_callback", cb, html;
 
-	var html = "";
+	cb = tinyMCEPopup.getParam(option, tinyMCEPopup.getParam("file_browser_callback"));
 
-	html += '<a id="' + id + '_link" href="javascript:openBrower(\'' + id + '\',\'' + target_form_element + '\', \'' + type + '\',\'' + option + '\');" onmousedown="return false;">';
-	html += '<img id="' + id + '" src="' + themeBaseURL + '/images/browse.gif"';
-	html += ' onmouseover="this.className=\'mceButtonOver\';"';
-	html += ' onmouseout="this.className=\'mceButtonNormal\';"';
-	html += ' onmousedown="this.className=\'mceButtonDown\';"';
-	html += ' width="20" height="18" border="0" title="' + tinyMCE.getLang('lang_browse') + '"';
-	html += ' class="mceButtonNormal" alt="' + tinyMCE.getLang('lang_browse') + '" /></a>';
+	if (!cb)
+		return "";
+
+	html = "";
+	html += '<a id="' + id + '_link" href="javascript:openBrowser(\'' + id + '\',\'' + target_form_element + '\', \'' + type + '\',\'' + option + '\');" onmousedown="return false;" class="browse">';
+	html += '<span id="' + id + '" title="' + tinyMCEPopup.getLang('browse') + '"></span></a>';
 
 	return html;
 }
 
-function openBrower(img_id, target_form_element, type, option) {
+function openBrowser(img_id, target_form_element, type, option) {
 	var img = document.getElementById(img_id);
 
 	if (img.className != "mceButtonDisabled")
@@ -119,8 +107,8 @@
 function addClassesToList(list_id, specific_option) {
 	// Setup class droplist
 	var styleSelectElm = document.getElementById(list_id);
-	var styles = tinyMCE.getParam('theme_advanced_styles', false);
-	styles = tinyMCE.getParam(specific_option, styles);
+	var styles = tinyMCEPopup.getParam('theme_advanced_styles', false);
+	styles = tinyMCEPopup.getParam(specific_option, styles);
 
 	if (styles) {
 		var stylesAr = styles.split(';');
@@ -136,10 +124,9 @@
 			}
 		}
 	} else {
-		// Use auto impored classes
-		var csses = tinyMCE.getCSSClasses(tinyMCE.getWindowArg('editor_id'));
-		for (var i=0; i<csses.length; i++)
-			styleSelectElm.options[styleSelectElm.length] = new Option(csses[i], csses[i]);
+		tinymce.each(tinyMCEPopup.editor.dom.getClasses(), function(o) {
+			styleSelectElm.options[styleSelectElm.length] = new Option(o.title || o['class'], o['class']);
+		});
 	}
 }
 
@@ -183,7 +170,7 @@
 }
 
 function trimSize(size) {
-	return size.replace(new RegExp('[^0-9%]', 'gi'), '');
+	return size.replace(/([0-9\.]+)px|(%|in|cm|mm|em|ex|pt|pc)/, '$1$2');
 }
 
 function getCSSSize(size) {
@@ -192,11 +179,15 @@
 	if (size == "")
 		return "";
 
-	return size.indexOf('%') != -1 ? size : size + "px";
+	// Add px
+	if (/^[0-9]+$/.test(size))
+		size += 'px';
+
+	return size;
 }
 
 function getStyle(elm, attrib, style) {
-	var val = tinyMCE.getAttrib(elm, attrib);
+	var val = tinyMCEPopup.dom.getAttrib(elm, attrib);
 
 	if (val != '')
 		return '' + val;
@@ -204,7 +195,5 @@
 	if (typeof(style) == 'undefined')
 		style = attrib;
 
-	val = eval('elm.style.' + style);
-
-	return val == null ? '' : '' + val;
+	return tinyMCEPopup.dom.getStyle(elm, style);
 }
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/utils/mclayer.js 2.5.src/wp-includes/js/tinymce/utils/mclayer.js
--- 2.2.2.src/wp-includes/js/tinymce/utils/mclayer.js	2007-01-24 19:20:47.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/utils/mclayer.js	2008-01-17 09:44:05.000000000 -0600
@@ -1,10 +1,10 @@
 /**
- * $Id: mclayer.js 162 2007-01-03 16:16:52Z spocke $
+ * $Id: mclayer.js 520 2008-01-07 16:30:32Z spocke $
  *
  * Moxiecode floating layer script.
  *
  * @author Moxiecode
- * @copyright Copyright  2004-2007, Moxiecode Systems AB, All rights reserved.
+ * @copyright Copyright  2004-2008, Moxiecode Systems AB, All rights reserved.
  */
 
 function MCLayer(id) {
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/utils/mctabs.js 2.5.src/wp-includes/js/tinymce/utils/mctabs.js
--- 2.2.2.src/wp-includes/js/tinymce/utils/mctabs.js	2007-01-24 19:20:47.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/utils/mctabs.js	2008-01-17 09:44:05.000000000 -0600
@@ -1,10 +1,10 @@
 /**
- * $Id: mctabs.js 162 2007-01-03 16:16:52Z spocke $
+ * $Id: mctabs.js 520 2008-01-07 16:30:32Z spocke $
  *
  * Moxiecode DHTML Tabs script.
  *
  * @author Moxiecode
- * @copyright Copyright  2004-2007, Moxiecode Systems AB, All rights reserved.
+ * @copyright Copyright  2004-2008, Moxiecode Systems AB, All rights reserved.
  */
 
 function MCTabs() {
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/utils/validate.js 2.5.src/wp-includes/js/tinymce/utils/validate.js
--- 2.2.2.src/wp-includes/js/tinymce/utils/validate.js	2007-01-24 19:20:47.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/utils/validate.js	2008-03-12 17:47:11.000000000 -0500
@@ -1,10 +1,10 @@
 /**
- * $Id: validate.js 162 2007-01-03 16:16:52Z spocke $
+ * $Id: validate.js 673 2008-03-06 13:26:20Z spocke $
  *
  * Various form validation methods.
  *
  * @author Moxiecode
- * @copyright Copyright  2004-2007, Moxiecode Systems AB, All rights reserved.
+ * @copyright Copyright  2004-2008, Moxiecode Systems AB, All rights reserved.
  */
 
 /**
@@ -31,7 +31,7 @@
 	},
 
 	isSize : function(s) {
-		return this.test(s, '^[0-9]+(px|%)?$');
+		return this.test(s, '^[0-9]+(%|in|cm|mm|em|ex|pt|pc|px)?$');
 	},
 
 	isId : function(s) {
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/wordpress.css 2.5.src/wp-includes/js/tinymce/wordpress.css
--- 2.2.2.src/wp-includes/js/tinymce/wordpress.css	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/wordpress.css	2008-03-27 22:49:35.000000000 -0500
@@ -0,0 +1,51 @@
+/* This file contains the CSS data for the editable area(iframe) of TinyMCE */
+
+body.mceContentBody {
+	background: #fff;
+	color: #000;
+	font: 13px/19px "Lucida Grande","Lucida Sans Unicode",Tahoma,Verdana,sans-serif;
+	padding: 0.6em;
+	margin: 0;
+}
+
+body.mceForceColors {
+	background:#fff;
+	color:#000;
+}
+
+h1 {font-size: 2em}
+h2 {font-size: 1.5em}
+h3 {font-size: 1.17em}
+h4 {font-size: 1em}
+h5 {font-size: .83em}
+h6 {font-size: .75em}
+
+.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {
+	border: 1px dashed #BBB;
+}
+
+img {
+	border:0;
+}
+
+td {
+	font-size: 10px;
+}
+
+pre {
+	font: 12px/18px "Courier New", monospace;
+}
+
+img.mceItemAnchor {
+	width: 12px;
+	height: 12px;
+	background: url(img/items.gif) no-repeat;
+}
+
+a.mceItemAnchor {
+	width: 12px;
+	line-height: 6px;
+	overflow: hidden;
+	padding-left: 12px;
+	background: url(img/items.gif) no-repeat bottom left;
+}
diff -x .svn -aruN 2.2.2.src/wp-includes/js/tinymce/wp-mce-help.php 2.5.src/wp-includes/js/tinymce/wp-mce-help.php
--- 2.2.2.src/wp-includes/js/tinymce/wp-mce-help.php	2007-03-06 21:05:41.000000000 -0600
+++ 2.5.src/wp-includes/js/tinymce/wp-mce-help.php	2008-03-27 22:49:35.000000000 -0500
@@ -6,31 +6,55 @@
 <head>
 <meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php echo get_option('blog_charset'); ?>" />
 <title><?php _e('Rich Editor Help') ?></title>
-<link rel="stylesheet" href="<?php echo get_option('siteurl') ?>/wp-admin/wp-admin.css?version=<?php bloginfo('version'); ?>" type="text/css" />
-<?php if ( ('rtl' == $wp_locale->text_direction) ) : ?>
-<link rel="stylesheet" href="<?php echo get_option('siteurl') ?>/wp-admin/rtl.css?version=<?php bloginfo('version'); ?>" type="text/css" />
-<?php endif; ?> 
+<script type="text/javascript" src="tiny_mce_popup.js"></script>
+<?php 
+wp_admin_css( 'css/global' );
+wp_admin_css();
+?>
 <style type="text/css">
 	#wphead {
-		padding-top: 5px;
-		padding-bottom: 5px;
-		padding-left: 15px;
-		font-size: 90%;
+		font-size: 80%;
+		border-top: 0;
+		color:#555;
+		background-color: #e4f2fd;
+	}
+	#wphead h1 {
+		font-size: 32px;
+		color: #555;
+		margin: 0;
+		padding: 10px;
 	}
 	#adminmenu {
 		padding-top: 2px;
-		padding-bottom: 2px;
 		padding-left: 15px;
-		font-size: 94%;
+		background-color: #e4f2fd;
+		border-color: #C6D9E9;
 	}
-	#user_info {
-		margin-top: 15px;
+	#adminmenu a.current {
+		background-color: #fff;
+		border-color: #c6d9e9;
+		border-bottom-color: #fff;
+		color: #d54e21;
+	}
+	#adminmenu a {
+		color: #2583AD;
+		padding: 6px;
+		border-width: 1px;
+		border-style: solid solid none;
+		border-color: #E4F2FD;
+	}
+	#adminmenu a:hover {
+		color: #d54e21;
+	}
+	.wrap h2 {
+		border-bottom-color:#DADADA;
+		color:#666666;
+		margin: 12px 0;
+		padding: 0;
 	}
-	h2 {
-		font-size: 2em;
-		border-bottom-width: .5em;
-		margin-top: 12px;
-		margin-bottom: 2px;
+	#user_info {
+		right: 5%;
+		top: 5px;
 	}
 	h3 {
 		font-size: 1.1em;
@@ -38,8 +62,16 @@
 		margin-bottom: 0px;
 	}
 	#flipper {
-		margin: 5px 10px 3px;
-	}
+		margin: 0;
+		padding: 5px 20px 10px;
+		background-color: #fff;
+		border-left: 1px solid #c6d9e9;
+		border-bottom: 1px solid #c6d9e9;
+	}
+	* html {
+        overflow-x: hidden;
+        overflow-y: scroll;
+    }
 	#flipper div p {
 		margin-top: 0.4em;
 		margin-bottom: 0.8em;
@@ -62,19 +94,23 @@
 		border-left: 3px double #333;
 		border-right: 3px double #333;
 	}
-	#keys p {
+	.keys {
+		margin-bottom: 15px;
+	}
+	.keys p {
 		display: inline-block;
 		margin: 0px;
 		padding: 0px;
 	}
-	#keys .left { text-align: left; }
-	#keys .center { text-align: center; }
-	#keys .right { text-align: right; }
+	.keys .left { text-align: left; }
+	.keys .center { text-align: center; }
+	.keys .right { text-align: right; }
 	td b {
 		font-family: "Times New Roman" Times serif;
 	}
 	#buttoncontainer {
 		text-align: center;
+		margin-bottom: 20px;
 	}
 	#buttoncontainer a, #buttoncontainer a:hover {
 		border-bottom: 0px;
@@ -89,19 +125,12 @@
 	#flipper {
 		margin: 5px 0 3px 10px;
 	}
-	#keys .left, .top, .action { text-align: right; }
-	#keys .right { text-align: left; }
+	.keys .left, .top, .action { text-align: right; }
+	.keys .right { text-align: left; }
 	td b { font-family: Tahoma, "Times New Roman", Times, serif }
 </style>
-<?php endif; ?> 
+<?php endif; ?>
 <script type="text/javascript">
-	window.onkeydown = window.onkeypress = function (e) {
-		e = e ? e : window.event;
-		if ( e.keyCode == 27 && !e.shiftKey && !e.controlKey && !e.altKey ) {
-			window.close();
-		}
-	}
-
 	function d(id) { return document.getElementById(id); }
 
 	function flipTab(n) {
@@ -117,17 +146,23 @@
 			}
 		}
 	}
+
+    function init() {
+        document.getElementById('version').innerHTML = tinymce.majorVersion + "." + tinymce.minorVersion;
+        document.getElementById('date').innerHTML = tinymce.releaseDate;
+    }
+    tinyMCEPopup.onInit.add(init);
 </script>
 </head>
 <body>
 <div class="zerosize"></div>
 <div id="wphead"><h1><?php echo get_bloginfo('blogtitle'); ?></h1></div>
-<div id="user_info"><p><strong><?php _e('Rich Editor Help') ?></strong></p></div>
+
 <ul id="adminmenu">
-	<li><a id="tab1" href="javascript:flipTab(1)" title="<?php _e('Basics of Rich Editing') ?>" accesskey="1" class="current"><?php _e('Basics') ?></a></li>
-	<li><a id="tab2" href="javascript:flipTab(2)" title="<?php _e('Advanced use of the Rich Editor') ?>" accesskey="2"><?php _e('Advanced') ?></a></li>
-	<li><a id="tab3" href="javascript:flipTab(3)" title="<?php _e('Hotkeys') ?>" accesskey="3"><?php _e('Hotkeys') ?></a></li>
-	<li><a id="tab4" href="javascript:flipTab(4)" title="<?php _e('About the software') ?>" accesskey="4"><?php _e('About') ?></a></li>
+	<li><a id="tab1" href="javascript:flipTab(1)" title="<?php _e('Basics of Rich Editing') ?>" accesskey="1" tabindex="1" class="current"><?php _e('Basics') ?></a></li>
+	<li><a id="tab2" href="javascript:flipTab(2)" title="<?php _e('Advanced use of the Rich Editor') ?>" accesskey="2" tabindex="2"><?php _e('Advanced') ?></a></li>
+	<li><a id="tab3" href="javascript:flipTab(3)" title="<?php _e('Hotkeys') ?>" accesskey="3" tabindex="3"><?php _e('Hotkeys') ?></a></li>
+	<li><a id="tab4" href="javascript:flipTab(4)" title="<?php _e('About the software') ?>" accesskey="4" tabindex="4"><?php _e('About') ?></a></li>
 </ul>
 
 <div id="flipper" class="wrap">
@@ -135,52 +170,82 @@
 <div id="content1">
 	<h2><?php _e('Rich Editing Basics') ?></h2>
 	<p><?php _e('<em>Rich editing</em>, also called WYSIWYG for What You See Is What You Get, means your text is formatted as you type. The rich editor creates HTML code behind the scenes while you concentrate on writing. Font styles, links and images all appear approximately as they will on the internet.') ?></p>
-	<p><?php _e('WordPress includes a rich HTML editor that works well in most web browsers used today. It is powerful but it has limitations. Pasting text from other word processors may not give the results you expect. If you do not like the way the rich editor works, you may turn it off in the Your Profile and Personal Options form, under Users in the admin menu.') ?></p>
+	<p><?php _e('WordPress includes a rich HTML editor that works well in all major web browsers used today. However editing HTML is not the same as typing text. Each web page has two major components: the structure, which is the actual HTML code and is produced by the editor as you type, and the display, that is applied to it by the currently selected WordPress theme and is defined in style.css. WordPress is producing valid XHTML 1.0 which means that inserting multiple line breaks (BR tags) after a paragraph would not produce white space on the web page. The BR tags will be removed as invalid by the internal HTML correcting functions.') ?></p>
+	<p><?php _e('While using the editor, most basic keyboard shortcuts work like in any other text editor. For example: Shift+Enter inserts line break, Ctrl+C = copy, Ctrl+X = cut, Ctrl+Z = undo, Ctrl+Y = redo, Ctrl+A = select all, etc. (on Mac use the Command key instead of Ctrl). See the Hotkeys tab for all available keyboard shortcuts.') ?></p>
+    <p><?php _e('If you do not like the way the rich editor works, you may turn it off from Your Profile submenu, under Users in the admin menu.') ?></p>
 </div>
 
 <div id="content2" class="hidden">
 	<h2><?php _e('Advanced Rich Editing') ?></h2>
 	<h3><?php _e('Images and Attachments') ?></h3>
 	<p><?php _e('There is a button in the editor toolbar for inserting images that are already hosted somewhere on the internet. If you have a URL for an image, click this button and enter the URL in the box which appears.') ?></p>
-	<p><?php _e('If you need to upload an image or sound file from your computer, you can use the uploading tool below the editor. The tool will attempt to create a thumbnail-sized image when you upload an image. To insert your uploaded image into the post, first click on the thumbnail to reveal a menu of options. Clicking on a "Using.." or "Linked..." option will change that option. For instance, you might want to use the thumbnail in the post and link it to a page showing the original with a caption. When you have selected the options you like, click "Send to Editor" and your image or file will appear in the post you are editing.') ?></p>
+	<p><?php _e('If you need to upload an image or another media file from your computer, you can use the Media Library buttons above the editor. The media library will attempt to create a thumbnail-sized copy from each uploaded image. To insert your image into the post, first click on the thumbnail to reveal a menu of options. When you have selected the options you like, click "Send to Editor" and your image or file will appear in the post you are editing. If you are inserting a movie, there are additional options in the "Media" dialog that can be opened from the second toolbar row.') ?></p>
 	<h3><?php _e('HTML in the Rich Editor') ?></h3>
-	<p><?php _e('Any HTML entered directly into the rich editor will show up as text when the post is viewed. What you see is what you get. When you want to include HTML elements that cannot be generated with the toolbar buttons, you must enter it by hand in the HTML editor. Examples are tables and &lt;code&gt;. To do this, click the HTML button and edit the code, then click Update. If the code is valid and understood by the editor, you should see it rendered immediately.') ?></p>
+	<p><?php _e('Any HTML entered directly into the rich editor will show up as text when the post is viewed. What you see is what you get. When you want to include HTML elements that cannot be generated with the toolbar buttons, you must enter it by hand in the HTML editor. Examples are tables and &lt;code&gt;. To do this, click the HTML tab and edit the code, then switch back to Visual mode. If the code is valid and understood by the editor, you should see it rendered immediately.') ?></p>
+	<h3><?php _e('Pasting in the Rich Editor') ?></h3>
+	<p><?php _e('When pasting content from another web page the results can be inconsistent and depend on your browser and on the web page you are pasting from. The editor tries to correct any invalid HTML code that was pasted, but for best results try using the HTML tab or one of the paste buttons that are on the second row. Alternatively try pasting paragraph by paragraph. In most browsers to select one paragraph at a time, triple-click on it.') ?></p>
+	<p><?php _e('Pasting content from another application, like Word or Excel, is best done with the Paste from Word button on the second row, or in HTML mode.') ?></p>
 </div>
 
 <div id="content3" class="hidden">
 	<h2><?php _e('Writing at Full Speed') ?></h2>
-	<p><?php _e('Rather than reaching for your mouse to click on the toolbar, use these access keys. Windows and Linux use Alt+&lt;letter>. Macintosh uses Ctrl+&lt;letter>.') ?></p>
-	<table id="keys" width="100%" border="0">
+    <p><?php _e('Rather than reaching for your mouse to click on the toolbar, use these access keys. Windows and Linux use Ctrl + letter. Macintosh uses Command + letter.') ?></p>
+	<table class="keys" width="100%" style="border: 0 none;">
+		<tr class="top"><th class="key center"><?php _e('Letter') ?></th><th class="left"><?php _e('Action') ?></th><th class="key center"><?php _e('Letter') ?></th><th class="left"><?php _e('Action') ?></th></tr>
+		<tr><th>c</th><td><?php _e('Copy') ?></td><th>v</th><td><?php _e('Paste') ?></td></tr>
+		<tr><th>a</th><td><?php _e('Select all') ?></td><th>x</th><td><?php _e('Cut') ?></td></tr>
+		<tr><th>z</th><td><?php _e('Undo') ?></td><th>y</th><td><?php _e('Redo') ?></td></tr>
+		<script type="text/javascript">
+		if ( ! tinymce.isWebKit )
+			document.write("<tr><th>b</th><td><?php _e('Bold') ?></td><th>i</th><td><?php _e('Italic') ?></td></tr>"+
+			"<tr><th>u</th><td><?php _e('Underline') ?></td><th>1</th><td><?php _e('Header 1') ?></td></tr>"+
+			"<tr><th>2</th><td><?php _e('Header 2') ?></td><th>3</th><td><?php _e('Header 3') ?></td></tr>"+
+			"<tr><th>4</th><td><?php _e('Header 4') ?></td><th>5</th><td><?php _e('Header 5') ?></td></tr>"+
+			"<tr><th>6</th><td><?php _e('Header 6') ?></td><th>9</th><td><?php _e('Address') ?></td></tr>")
+		</script>
+	</table>
+	
+	<p><?php _e('The following shortcuts use different access keys: Alt + Shift + letter.') ?></p>
+	<table class="keys" width="100%" style="border: 0 none;">
 		<tr class="top"><th class="key center"><?php _e('Letter') ?></th><th class="left"><?php _e('Action') ?></th><th class="key center"><?php _e('Letter') ?></th><th class="left"><?php _e('Action') ?></th></tr>
-		<tr><th>n</th><td><?php _e('Check Spelling') ?></td><th>f</th><td class="align left"><?php _e('Align Left') ?></td></tr>
-		<tr><th>j</th><td><?php _e('Justify Text') ?></td><th>c</th><td class="align center"><?php _e('Align Center') ?></td></tr>
-		<tr><th>k</th><td><strike><?php _e('Strikethrough') ?></strike></td><th>r</th><td class="align right"><?php _e('Align Right') ?></td></tr>
-		<tr><th>l</th><td><b>&bull;</b> <?php _e('List') ?></td><th>a</th><td><?php _e('Insert <span class="anchor">Anchor</span>') ?></td></tr>
-		<tr><th>o</th><td>1. <?php _e('List') ?></td><th>s</th><td><?php _e('Unlink Anchor') ?></td></tr>
-		<tr><th>q</th><td>&rarr;<?php _e('Quote/Indent') ?></td><th>m</th><td><?php _e('Insert Image') ?></td></tr>
-		<tr><th>w</th><td>&larr;<?php _e('Unquote/Outdent') ?></td><th>t</th><td><?php _e('Insert "More" Tag') ?></td></tr>
-		<tr><th>u</th><td><?php _e('Undo') ?></td><th>e</th><td><?php _e('Edit HTML') ?></td></tr>
-		<tr><th>y</th><td><?php _e('Redo') ?></td><th>h</th><td><?php _e('Open Help') ?></td></tr>
+		<script type="text/javascript">
+		if ( tinymce.isWebKit )
+			document.write("<tr><th>b</th><td><?php _e('Bold') ?></td><th>i</th><td><?php _e('Italic') ?></td></tr>")
+		</script>
+		<tr><th>n</th><td><?php _e('Check Spelling') ?></td><th>l</th><td><?php _e('Align Left') ?></td></tr>
+		<tr><th>j</th><td><?php _e('Justify Text') ?></td><th>c</th><td><?php _e('Align Center') ?></td></tr>
+		<tr><th>d</th><td><span style="text-decoration: line-through;"><?php _e('Strikethrough') ?></span></td><th>r</th><td><?php _e('Align Right') ?></td></tr>
+		<tr><th>u</th><td><strong>&bull;</strong> <?php _e('List') ?></td><th>a</th><td><?php _e('Insert link') ?></td></tr>
+		<tr><th>o</th><td>1. <?php _e('List') ?></td><th>s</th><td><?php _e('Remove link') ?></td></tr>
+		<tr><th>q</th><td><?php _e('Quote') ?></td><th>m</th><td><?php _e('Insert Image') ?></td></tr>
+		<tr><th>g</th><td><?php _e('Full Screen') ?></td><th>t</th><td><?php _e('Insert More Tag') ?></td></tr>
+		<tr><th>p</th><td><?php _e('Insert Page Break tag') ?></td><th>h</th><td><?php _e('Help') ?></td></tr>
+		<tr><th>e</th><td colspan="3"><?php _e('Switch to HTML mode') ?></td></tr>
 	</table>
 </div>
 
 <div id="content4" class="hidden">
 	<h2><?php _e('About TinyMCE'); ?></h2>
-	<p><?php printf(__('Version: %s'), '2.0.9') ?></p>
+
+    <p><?php _e('Version:'); ?> <span id="version"></span> (<span id="date"></span>)</p>
 	<p><?php printf(__('TinyMCE is a platform independent web based Javascript HTML WYSIWYG editor control released as Open Source under %sLGPL</a>	by Moxiecode Systems AB. It has the ability to convert HTML TEXTAREA fields or other HTML elements to editor instances.'), '<a href="'.get_bloginfo('url').'/wp-includes/js/tinymce/license.txt" target="_blank" title="'.__('GNU Library General Public Licence').'">') ?></p>
-	<p><?php _e('Copyright &copy; 2005, <a href="http://www.moxiecode.com" target="_blank">Moxiecode Systems AB</a>, All rights reserved.') ?></p>
+	<p><?php _e('Copyright &copy; 2003-2007, <a href="http://www.moxiecode.com" target="_blank">Moxiecode Systems AB</a>, All rights reserved.') ?></p>
 	<p><?php _e('For more information about this software visit the <a href="http://tinymce.moxiecode.com" target="_blank">TinyMCE website</a>.') ?></p>
 
 	<div id="buttoncontainer">
-		<a href="http://www.moxiecode.com" target="_new"><img src="http://tinymce.moxiecode.com/images/gotmoxie.png" alt="<?php _e('Got Moxie?') ?>" border="0" /></a>
-		<a href="http://sourceforge.net/projects/tinymce/" target="_blank"><img src="http://sourceforge.net/sflogo.php?group_id=103281" alt="<?php _e('Hosted By Sourceforge') ?>" border="0" /></a>
-		<a href="http://www.freshmeat.net/projects/tinymce" target="_blank"><img src="http://tinymce.moxiecode.com/images/fm.gif" alt="<?php _e('Also on freshmeat') ?>" border="0" /></a>
+		<a href="http://www.moxiecode.com" target="_new"><img src="themes/advanced/img/gotmoxie.png" alt="<?php _e('Got Moxie?') ?>" style="border: none;" /></a>
+		<a href="http://sourceforge.net/projects/tinymce/" target="_blank"><img src="themes/advanced/img/sflogo.png" alt="<?php _e('Hosted By Sourceforge') ?>" style="border: none;" /></a>
+		<a href="http://www.freshmeat.net/projects/tinymce" target="_blank"><img src="themes/advanced/img/fm.gif" alt="<?php _e('Also on freshmeat') ?>" style="border: none;" /></a>
 	</div>
 
 </div>
+</div>
 
+<div class="mceActionPanel">
+	<div style="margin: 8px auto; text-align: center;padding-bottom: 10px;">
+		<input type="button" id="cancel" name="cancel" value="<?php _e('Close'); ?>" title="<?php _e('Close'); ?>" onclick="tinyMCEPopup.close();" />
+	</div>
 </div>
 
 </body>
 </html>
-
diff -x .svn -aruN 2.2.2.src/wp-includes/js/wp-ajax-response.js 2.5.src/wp-includes/js/wp-ajax-response.js
--- 2.2.2.src/wp-includes/js/wp-ajax-response.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/wp-ajax-response.js	2008-03-20 22:03:38.000000000 -0500
@@ -0,0 +1,60 @@
+wpAjax = jQuery.extend( {
+	unserialize: function( s ) {
+		var r = {}; if ( !s ) { return r; }
+		var q = s.split('?'); if ( q[1] ) { s = q[1]; }
+		var pp = s.split('&');
+		for ( var i in pp ) {
+			if ( jQuery.isFunction(pp.hasOwnProperty) && !pp.hasOwnProperty(i) ) { continue; }
+			var p = pp[i].split('=');
+			r[p[0]] = p[1];
+		}
+		return r;
+	},
+	parseAjaxResponse: function( x, r, e ) { // 1 = good, 0 = strange (bad data?), -1 = you lack permission
+		var parsed = {};
+		var re = jQuery('#' + r).html('');
+		if ( x && typeof x == 'object' && x.getElementsByTagName('wp_ajax') ) {
+			parsed.responses = [];
+			parsed.errors = false;
+			var err = '';
+			jQuery('response', x).each( function() {
+				var th = jQuery(this);
+				var child = jQuery(this.firstChild);
+				var response = { action: th.attr('action'), what: child.get(0).nodeName, id: child.attr('id'), oldId: child.attr('old_id'), position: child.attr('position') };
+				response.data = jQuery( 'response_data', child ).text();
+				response.supplemental = {};
+				if ( !jQuery( 'supplemental', child ).children().each( function() {
+					response.supplemental[this.nodeName] = jQuery(this).text();
+				} ).size() ) { response.supplemental = false }
+				response.errors = [];
+				if ( !jQuery('wp_error', child).each( function() {
+					var code = jQuery(this).attr('code');
+					var anError = { code: code, message: this.firstChild.nodeValue, data: false };
+					var errorData = jQuery('wp_error_data[code="' + code + '"]', x);
+					if ( errorData ) { anError.data = errorData.get(); }
+					var formField = jQuery( 'form-field', errorData ).text();
+					if ( formField ) { code = formField; }
+					if ( e ) { wpAjax.invalidateForm( jQuery('#' + e + ' :input[name="' + code + '"]' ).parents('.form-field:first') ); }
+					err += '<p>' + anError.message + '</p>';
+					response.errors.push( anError );
+					parsed.errors = true;
+				} ).size() ) { response.errors = false; }
+				parsed.responses.push( response );
+			} );
+			if ( err.length ) { re.html( '<div class="error">' + err + '</div>' ); }
+			return parsed;
+		}
+		if ( isNaN(x) ) { return !re.html('<div class="error"><p>' + x + '</p></div>'); }
+		x = parseInt(x,10);
+		if ( -1 == x ) { return !re.html('<div class="error"><p>' + wpAjax.noPerm + '</p></div>'); }
+		else if ( 0 === x ) { return !re.html('<div class="error"><p>' + wpAjax.broken  + '</p></div>'); }
+		return true;
+	},
+	invalidateForm: function ( selector ) {
+		return jQuery( selector ).addClass( 'form-invalid' ).change( function() { jQuery(this).removeClass( 'form-invalid' ); } );
+	},
+	validateForm: function( selector ) {
+		selector = jQuery( selector );
+		return !wpAjax.invalidateForm( selector.find('.form-required').andSelf().filter('.form-required:has(:input[value=""]), .form-required:input[value=""]') ).size();
+	}
+}, wpAjax || { noPerm: 'You do not have permission to do that.', broken: 'An unidentified error has occurred.' } );
diff -x .svn -aruN 2.2.2.src/wp-includes/js/wp-lists.js 2.5.src/wp-includes/js/wp-lists.js
--- 2.2.2.src/wp-includes/js/wp-lists.js	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/js/wp-lists.js	2008-03-22 03:15:48.000000000 -0500
@@ -0,0 +1,370 @@
+(function($) {
+var currentFormEl = false;
+var fs = {add:'ajaxAdd',del:'ajaxDel',dim:'ajaxDim',process:'process',recolor:'recolor'};
+
+var wpList = {
+	settings: {
+		url: wpListL10n.url, type: 'POST',
+		response: 'ajax-response',
+
+		what: '',
+		alt: 'alternate', altOffset: 0,
+		addColor: null, delColor: null, dimAddColor: null, dimDelColor: null,
+
+		confirm: null,
+		addBefore: null, addAfter: null,
+		delBefore: null, delAfter: null,
+		dimBefore: null, dimAfter: null
+	},
+
+	nonce: function(e,s) {
+		var url = wpAjax.unserialize(e.attr('href'));
+		return s.nonce || url._ajax_nonce || $('#' + s.element + ' input[name=_ajax_nonce]').val() || url._wpnonce || $('#' + s.element + ' input[name=_wpnonce]').val() || 0;
+	},
+
+	parseClass: function(e,t) {
+		var c = [], cl;
+		try {
+			cl = $(e).attr('class') || '';
+			cl = cl.match(new RegExp(t+':[A-Za-z0-9:_=-]+'));
+			if ( cl ) { c = cl[0].split(':'); }
+		} catch(r) {}
+		return c;
+	},
+
+	pre: function(e,s,a) {
+		var bg; var r;
+		s = $.extend( {}, this.wpList.settings, {
+			element: null,
+			nonce: 0,
+			target: e.get(0)
+		}, s || {} );
+		if ( $.isFunction( s.confirm ) ) {
+			if ( 'add' != a ) {
+				bg = $('#' + s.element).css('backgroundColor');
+				$('#' + s.element).css('backgroundColor', '#FF9966');
+			}
+			r = s.confirm.call(this,e,s,a,bg);
+			if ( 'add' != a ) { $('#' + s.element).css('backgroundColor', bg ); }
+			if ( !r ) { return false; }
+		}
+		return s;
+	},
+
+	ajaxAdd: function( e, s ) {
+		var list = this; e = $(e); s = s || {};
+		var cls = wpList.parseClass(e,'add');
+		s = wpList.pre.call( list, e, s, 'add' );
+
+		s.element = cls[2] || e.attr( 'id' ) || s.element || null;
+		if ( cls[3] ) { s.addColor = '#' + cls[3]; }
+		else { s.addColor = s.addColor || '#FFFF33'; }
+
+		if ( !s ) { return false; }
+
+		if ( !e.is("[class^=add:" + list.id + ":]") ) { return !wpList.add.call( list, e, s ); }
+
+		if ( !s.element ) { return true; }
+
+		s.action = 'add-' + s.what;
+
+		s.nonce = wpList.nonce(e,s);
+
+		var es = $('#' + s.element + ' :input').not('[name=_ajax_nonce], [name=_wpnonce], [name=action]');
+		var valid = wpAjax.validateForm( '#' + s.element );
+		if ( !valid ) { return false; }
+
+		s.data = $.param( $.extend( { _ajax_nonce: s.nonce, action: s.action }, wpAjax.unserialize( cls[4] || '' ) ) );
+		var formData = $.isFunction(es.fieldSerialize) ? es.fieldSerialize() : es.serialize();
+		if ( formData ) { s.data += '&' + formData; }
+
+		if ( $.isFunction(s.addBefore) ) {
+			s = s.addBefore( s );
+			if ( !s ) { return true; }
+		}
+		if ( !s.data.match(/_ajax_nonce=[a-f0-9]+/) ) { return true; }
+
+		s.success = function(r) {
+			var res = wpAjax.parseAjaxResponse(r, s.response, s.element);
+			if ( !res || res.errors ) { return false; }
+
+			jQuery.each( res.responses, function() {
+				wpList.add.call( list, this.data, $.extend( {}, s, { // this.firstChild.nodevalue
+					pos: this.position || 0,
+					id: this.id || 0,
+					oldId: this.oldId || null
+				} ) );
+			} );
+
+			if ( $.isFunction(s.addAfter) ) {
+				var o = this.complete;
+				this.complete = function(x,st) {
+					var _s = $.extend( { xml: x, status: st, parsed: res }, s );
+					s.addAfter( r, _s );
+					if ( $.isFunction(o) ) { o(x,st); }
+				};
+			}
+			list.wpList.recolor();
+			wpList.clear.call(list,'#' + s.element);
+		};
+
+		$.ajax( s );
+		return false;
+	},
+
+	ajaxDel: function( e, s ) {
+		var list = this; e = $(e); s = s || {};
+		var cls = wpList.parseClass(e,'delete');
+		s = wpList.pre.call( list, e, s, 'delete' );
+
+		s.element = cls[2] || s.element || null;
+		if ( cls[3] ) { s.delColor = '#' + cls[3]; }
+		else { s.delColor = s.delColor || '#FF3333'; }
+
+		if ( !s || !s.element ) { return false; }
+
+		s.action = 'delete-' + s.what;
+
+		s.nonce = wpList.nonce(e,s);
+
+		s.data = $.extend(
+			{ action: s.action, id: s.element.split('-').pop(), _ajax_nonce: s.nonce },
+			wpAjax.unserialize( cls[4] || '' )
+		);
+
+		if ( $.isFunction(s.delBefore) ) {
+			s = s.delBefore( s );
+			if ( !s ) { return true; }
+		}
+		if ( !s.data._ajax_nonce ) { return true; }
+
+		var element = $('#' + s.element);
+
+		if ( 'none' != s.delColor ) {
+			var anim = 'slideUp';
+			if ( element.css( 'display' ).match(/table/) )
+				anim = 'fadeOut'; // Can't slideup table rows and other table elements.  Known jQuery bug
+			element
+				.animate( { backgroundColor: s.delColor }, 'fast'  )[anim]( 'fast' )
+				.queue( function() { list.wpList.recolor(); $(this).dequeue(); } );
+		} else {
+			list.wpList.recolor();
+		}
+
+		s.success = function(r) {
+			var res = wpAjax.parseAjaxResponse(r, s.response, s.element);
+			if ( !res || res.errors ) {
+				element.stop().stop().css( 'backgroundColor', '#FF3333' ).show().queue( function() { list.wpList.recolor(); $(this).dequeue(); } );
+				return false;
+			}
+			if ( $.isFunction(s.delAfter) ) {
+				var o = this.complete;
+				this.complete = function(x,st) {
+					element.queue( function() {
+						var _s = $.extend( { xml: x, status: st, parsed: res }, s );
+						s.delAfter( r, _s );
+						if ( $.isFunction(o) ) { o(x,st); }
+					} ).dequeue();
+				};
+			}
+		};
+		$.ajax( s );
+		return false;
+	},
+
+	ajaxDim: function( e, s ) {
+		var list = this; e = $(e); s = s || {};
+		var cls = wpList.parseClass(e,'dim');
+		s = wpList.pre.call( list, e, s, 'dim' );
+
+		s.element = cls[2] || s.element || null;
+		s.dimClass =  cls[3] || s.dimClass || null;
+		if ( cls[4] ) { s.dimAddColor = '#' + cls[4]; }
+		else { s.dimAddColor = s.dimAddColor || '#FFFF33'; }
+		if ( cls[5] ) { s.dimDelColor = '#' + cls[5]; }
+		else { s.dimDelColor = s.dimDelColor || '#FF3333'; }
+
+		if ( !s || !s.element || !s.dimClass ) { return true; }
+
+		s.action = 'dim-' + s.what;
+
+		s.nonce = wpList.nonce(e,s);
+
+		s.data = $.extend(
+			{ action: s.action, id: s.element.split('-').pop(), dimClass: s.dimClass, _ajax_nonce : s.nonce },
+			wpAjax.unserialize( cls[6] || '' )
+		);
+
+		if ( $.isFunction(s.dimBefore) ) {
+			s = s.dimBefore( s );
+			if ( !s ) { return true; }
+		}
+
+		var element = $('#' + s.element);
+		var isClass = element.toggleClass(s.dimClass).is('.' + s.dimClass);
+		var color = wpList.getColor( element );
+		element.toggleClass( s.dimClass )
+		var dimColor = isClass ? s.dimAddColor : s.dimDelColor;
+		if ( 'none' != dimColor ) {
+			element
+				.animate( { backgroundColor: dimColor }, 'fast' )
+				.queue( function() { element.toggleClass(s.dimClass); $(this).dequeue(); } )
+				.animate( { backgroundColor: color }, { complete: function() { $(this).css( 'backgroundColor', '' ); } } );
+		}
+
+		if ( !s.data._ajax_nonce ) { return true; }
+
+		s.success = function(r) {
+			var res = wpAjax.parseAjaxResponse(r, s.response, s.element);
+			if ( !res || res.errors ) {
+				element.stop().stop().css( 'backgroundColor', '#FF3333' )[isClass?'removeClass':'addClass'](s.dimClass).show().queue( function() { list.wpList.recolor(); $(this).dequeue(); } );
+				return false;
+			}
+			if ( $.isFunction(s.dimAfter) ) {
+				var o = this.complete;
+				this.complete = function(x,st) {
+					element.queue( function() {
+						var _s = $.extend( { xml: x, status: st, parsed: res }, s );
+						s.dimAfter( r, _s );
+						if ( $.isFunction(o) ) { o(x,st); }
+					} ).dequeue();
+				};
+			}
+		};
+
+		$.ajax( s );
+		return false;
+	},
+
+	// From jquery.color.js: jQuery Color Animation by John Resig
+	getColor: function( el ) {
+		if ( el.constructor == Object )
+			el = el.get(0);
+		var elem = el, color, rgbaTrans = new RegExp( "rgba\\(\\s*0,\\s*0,\\s*0,\\s*0\\s*\\)", "i" );
+		do {
+			color = jQuery.curCSS(elem, 'backgroundColor');
+			if ( color != '' && color != 'transparent' && !color.match(rgbaTrans) || jQuery.nodeName(elem, "body") )
+				break;
+		} while ( elem = elem.parentNode );
+		return color || '#ffffff';
+	},
+
+	add: function( e, s ) {
+		var list = $(this);
+		e = $(e);
+
+		var old = false;
+		var _s = { pos: 0, id: 0, oldId: null };
+		if ( 'string' == typeof s ) { s = { what: s }; }
+		s = $.extend(_s, this.wpList.settings, s);
+		if ( !e.size() || !s.what ) { return false; }
+		if ( s.oldId ) { old = $('#' + s.what + '-' + s.oldId); }
+		if ( s.id && ( s.id != s.oldId || !old || !old.size() ) ) { $('#' + s.what + '-' + s.id).remove(); }
+
+		if ( old && old.size() ) {
+			old.replaceWith(e);
+		} else if ( isNaN(s.pos) ) {
+			var ba = 'after';
+			if ( '-' == s.pos.substr(0,1) ) {
+				s.pos = s.pos.substr(1);
+				ba = 'before';
+			}
+			var ref = list.find( '#' + s.pos );
+			if ( 1 === ref.size() ) { ref[ba](e); }
+			else { list.append(e); }
+		} else if ( s.pos < 0 ) {
+			list.prepend(e);
+		} else {
+			list.append(e);
+		}
+
+		if ( s.alt ) {
+			if ( ( list.children(':visible').index( e[0] ) + s.altOffset ) % 2 ) { e.removeClass( s.alt ); }
+			else { e.addClass( s.alt ); }
+		}
+
+		if ( 'none' != s.addColor ) {
+			var color = wpList.getColor( e );
+			e.css( 'backgroundColor', s.addColor ).animate( { backgroundColor: color }, { complete: function() { $(this).css( 'backgroundColor', '' ); } } );
+		}
+		list.each( function() { this.wpList.process( e ); } );
+		return e;
+	},
+
+	clear: function(e) {
+		var list = this;
+		e = $(e);
+		if ( list.wpList && e.parents( '#' + list.id ).size() ) { return; }
+		e.find(':input').each( function() {
+			if ( $(this).parents('.form-no-clear').size() )
+				return;
+			var t = this.type.toLowerCase(); var tag = this.tagName.toLowerCase();
+			if ( 'text' == t || 'password' == t || 'textarea' == tag ) { this.value = ''; }
+			else if ( 'checkbox' == t || 'radio' == t ) { this.checked = false; }
+			else if ( 'select' == tag ) { this.selectedIndex = null; }
+		});
+	},
+
+	process: function(el) {
+		var list = this;
+		$("[class^=add:" + list.id + ":]", el || null)
+			.filter('form').submit( function() { return list.wpList.add(this); } ).end()
+			.not('form').click( function() { return list.wpList.add(this); } ).each( function() {
+				var addEl = this;
+				var c = wpList.parseClass(this,'add')[2] || addEl.id;
+				if ( !c ) { return; }
+				var forms = []; var ins = [];
+				$('#' + c + ' :input').focus( function() { currentFormEl = this; } ).blur( function() { currentFormEl = false; } ).each( function() {
+					ins.push(this);
+					$.merge(forms,$(this).parents('form'));
+					forms = $.unique(forms);
+				} );
+				$(forms).submit( function() {
+					if ( 0 <= $.inArray(currentFormEl,ins) ) {
+						$(addEl).trigger( 'click' );
+						$(currentFormEl).focus();
+						return false;
+					}
+				} );
+			} );
+		$("[class^=delete:" + list.id + ":]", el || null).click( function() { return list.wpList.del(this); } );
+		$("[class^=dim:" + list.id + ":]", el || null).click( function() { return list.wpList.dim(this); } );
+	},
+
+	recolor: function() {
+		var list = this;
+		if ( !list.wpList.settings.alt ) { return; }
+		var items = $('.list-item:visible', list);
+		if ( !items.size() ) { items = $(list).children(':visible'); }
+		var eo = [':even',':odd'];
+		if ( list.wpList.settings.altOffset % 2 ) { eo.reverse(); }
+		items.filter(eo[0]).addClass(list.wpList.settings.alt).end().filter(eo[1]).removeClass(list.wpList.settings.alt);
+	},
+
+	init: function() {
+		var lists = this;
+		lists.wpList.process = function(a) {
+			lists.each( function() {
+				this.wpList.process(a);
+			} );
+		};
+		lists.wpList.recolor = function() {
+			lists.each( function() {
+				this.wpList.recolor();
+			} );
+		};
+	}
+};
+
+$.fn.wpList = function( settings ) {
+	this.each( function() {
+		var _this = this;
+		this.wpList = { settings: $.extend( {}, wpList.settings, { what: wpList.parseClass(this,'list')[1] || '' }, settings ) };
+		$.each( fs, function(i,f) { _this.wpList[i] = function( e, s ) { return wpList[f].call( _this, e, s ); }; } );
+	} );
+	wpList.init.call(this);
+	this.wpList.process();
+	return this;
+};
+
+})(jQuery);
diff -x .svn -aruN 2.2.2.src/wp-includes/kses.php 2.5.src/wp-includes/kses.php
--- 2.2.2.src/wp-includes/kses.php	2006-12-20 22:44:34.000000000 -0600
+++ 2.5.src/wp-includes/kses.php	2008-03-17 20:53:36.000000000 -0500
@@ -1,94 +1,422 @@
 <?php
-
-// Added wp_ prefix to avoid conflicts with existing kses users
-# kses 0.2.2 - HTML/XHTML filter that only allows some elements and attributes
-# Copyright (C) 2002, 2003, 2005  Ulf Harnhammar
-# *** CONTACT INFORMATION ***
-#
-# E-mail:      metaur at users dot sourceforge dot net
-# Web page:    http://sourceforge.net/projects/kses
-# Paper mail:  Ulf Harnhammar
-#              Ymergatan 17 C
-#              753 25  Uppsala
-#              SWEDEN
-#
-# [kses strips evil scripts!]
+/**
+ * HTML/XHTML filter that only allows some elements and attributes
+ *
+ * Added wp_ prefix to avoid conflicts with existing kses users
+ *
+ * @version 0.2.2
+ * @copyright (C) 2002, 2003, 2005
+ * @author Ulf Harnhammar <metaur@users.sourceforge.net>
+ *
+ * @package External
+ * @subpackage KSES
+ *
+ * @internal
+ * *** CONTACT INFORMATION ***
+ * E-mail:      metaur at users dot sourceforge dot net
+ * Web page:    http://sourceforge.net/projects/kses
+ * Paper mail:  Ulf Harnhammar
+ *              Ymergatan 17 C
+ *              753 25  Uppsala
+ *              SWEDEN
+ *
+ * [kses strips evil scripts!]
+ */
+
+/**
+ * You can override this in your my-hacks.php file
+ * You can also override this in a plugin file. The
+ * my-hacks.php is deprecated in its usage.
+ *
+ * @since 1.2.0
+ */
 if (!defined('CUSTOM_TAGS'))
 	define('CUSTOM_TAGS', false);
 
-// You can override this in your my-hacks.php file
 if (!CUSTOM_TAGS) {
-	$allowedposttags = array ('address' => array (), 'a' => array ('href' => array (), 'title' => array (), 'rel' => array (), 'rev' => array (), 'name' => array ()), 'abbr' => array ('title' => array ()), 'acronym' => array ('title' => array ()), 'b' => array (), 'big' => array (), 'blockquote' => array ('cite' => array ()), 'br' => array (), 'button' => array ('disabled' => array (), 'name' => array (), 'type' => array (), 'value' => array ()), 'caption' => array ('align' => array ()), 'code' => array (), 'col' => array ('align' => array (), 'char' => array (), 'charoff' => array (), 'span' => array (), 'valign' => array (), 'width' => array ()), 'del' => array ('datetime' => array ()), 'dd' => array (), 'div' => array ('align' => array ()), 'dl' => array (), 'dt' => array (), 'em' => array (), 'fieldset' => array (), 'font' => array ('color' => array (), 'face' => array (), 'size' => array ()), 'form' => array ('action' => array (), 'accept' => array (), 'accept-charset' => array (), 'enctype' => array (), 'method' => array (), 'name' => array (), 'target' => array ()), 'h1' => array ('align' => array ()), 'h2' => array ('align' => array ()), 'h3' => array ('align' => array ()), 'h4' => array ('align' => array ()), 'h5' => array ('align' => array ()), 'h6' => array ('align' => array ()), 'hr' => array ('align' => array (), 'noshade' => array (), 'size' => array (), 'width' => array ()), 'i' => array (), 'img' => array ('alt' => array (), 'align' => array (), 'border' => array (), 'height' => array (), 'hspace' => array (), 'longdesc' => array (), 'vspace' => array (), 'src' => array (), 'width' => array ()), 'ins' => array ('datetime' => array (), 'cite' => array ()), 'kbd' => array (), 'label' => array ('for' => array ()), 'legend' => array ('align' => array ()), 'li' => array (), 'p' => array ('align' => array ()), 'pre' => array ('width' => array ()), 'q' => array ('cite' => array ()), 's' => array (), 'strike' => array (), 'strong' => array (), 'sub' => array (), 'sup' => array (), 'table' => array ('align' => array (), 'bgcolor' => array (), 'border' => array (), 'cellpadding' => array (), 'cellspacing' => array (), 'rules' => array (), 'summary' => array (), 'width' => array ()), 'tbody' => array ('align' => array (), 'char' => array (), 'charoff' => array (), 'valign' => array ()), 'td' => array ('abbr' => array (), 'align' => array (), 'axis' => array (), 'bgcolor' => array (), 'char' => array (), 'charoff' => array (), 'colspan' => array (), 'headers' => array (), 'height' => array (), 'nowrap' => array (), 'rowspan' => array (), 'scope' => array (), 'valign' => array (), 'width' => array ()), 'textarea' => array ('cols' => array (), 'rows' => array (), 'disabled' => array (), 'name' => array (), 'readonly' => array ()), 'tfoot' => array ('align' => array (), 'char' => array (), 'charoff' => array (), 'valign' => array ()), 'th' => array ('abbr' => array (), 'align' => array (), 'axis' => array (), 'bgcolor' => array (), 'char' => array (), 'charoff' => array (), 'colspan' => array (), 'headers' => array (), 'height' => array (), 'nowrap' => array (), 'rowspan' => array (), 'scope' => array (), 'valign' => array (), 'width' => array ()), 'thead' => array ('align' => array (), 'char' => array (), 'charoff' => array (), 'valign' => array ()), 'title' => array (), 'tr' => array ('align' => array (), 'bgcolor' => array (), 'char' => array (), 'charoff' => array (), 'valign' => array ()), 'tt' => array (), 'u' => array (), 'ul' => array (), 'ol' => array (), 'var' => array () );
-	$allowedtags = array ('a' => array ('href' => array (), 'title' => array ()), 'abbr' => array ('title' => array ()), 'acronym' => array ('title' => array ()), 'b' => array (), 'blockquote' => array ('cite' => array ()),
+	/**
+	 * Kses global for default allowable HTML tags
+	 *
+	 * Can be override by using CUSTOM_TAGS constant
+	 * @global array $allowedposttags
+	 * @since 2.0.0
+	 */
+	$allowedposttags = array(
+		'address' => array(),
+		'a' => array(
+			'class' => array (),
+			'href' => array (),
+			'id' => array (),
+			'title' => array (),
+			'rel' => array (),
+			'rev' => array (),
+			'name' => array (),
+			'target' => array()),
+		'abbr' => array(
+			'class' => array (),
+			'title' => array ()),
+		'acronym' => array(
+			'title' => array ()),
+		'b' => array(),
+		'big' => array(),
+		'blockquote' => array(
+			'id' => array (),
+			'cite' => array (),
+			'class' => array(),
+			'lang' => array(),
+			'xml:lang' => array()),
+		'br' => array (
+			'class' => array ()),
+		'button' => array(
+			'disabled' => array (),
+			'name' => array (),
+			'type' => array (),
+			'value' => array ()),
+		'caption' => array(
+			'align' => array (),
+			'class' => array ()),
+		'cite' => array (
+			'class' => array(),
+			'dir' => array(),
+			'lang' => array(),
+			'title' => array ()),
+		'code' => array (
+			'style' => array()),
+		'col' => array(
+			'align' => array (),
+			'char' => array (),
+			'charoff' => array (),
+			'span' => array (),
+			'dir' => array(),
+			'style' => array (),
+			'valign' => array (),
+			'width' => array ()),
+		'del' => array(
+			'datetime' => array ()),
+		'dd' => array(),
+		'div' => array(
+			'align' => array (),
+			'class' => array (),
+			'dir' => array (),
+			'lang' => array(),
+			'style' => array (),
+			'xml:lang' => array()),
+		'dl' => array(),
+		'dt' => array(),
+		'em' => array(),
+		'fieldset' => array(),
+		'font' => array(
+			'color' => array (),
+			'face' => array (),
+			'size' => array ()),
+		'form' => array(
+			'action' => array (),
+			'accept' => array (),
+			'accept-charset' => array (),
+			'enctype' => array (),
+			'method' => array (),
+			'name' => array (),
+			'target' => array ()),
+		'h1' => array(
+			'align' => array (),
+			'class' => array ()),
+		'h2' => array(
+			'align' => array (),
+			'class' => array ()),
+		'h3' => array(
+			'align' => array (),
+			'class' => array ()),
+		'h4' => array(
+			'align' => array (),
+			'class' => array ()),
+		'h5' => array(
+			'align' => array (),
+			'class' => array ()),
+		'h6' => array(
+			'align' => array (),
+			'class' => array ()),
+		'hr' => array(
+			'align' => array (),
+			'class' => array (),
+			'noshade' => array (),
+			'size' => array (),
+			'width' => array ()),
+		'i' => array(),
+		'img' => array(
+			'alt' => array (),
+			'align' => array (),
+			'border' => array (),
+			'class' => array (),
+			'height' => array (),
+			'hspace' => array (),
+			'longdesc' => array (),
+			'vspace' => array (),
+			'src' => array (),
+			'style' => array (),
+			'width' => array ()),
+		'ins' => array(
+			'datetime' => array (),
+			'cite' => array ()),
+		'kbd' => array(),
+		'label' => array(
+			'for' => array ()),
+		'legend' => array(
+			'align' => array ()),
+		'li' => array (
+			'align' => array (),
+			'class' => array ()),
+		'p' => array(
+			'class' => array (),
+			'align' => array (),
+			'dir' => array(),
+			'lang' => array(),
+			'style' => array (),
+			'xml:lang' => array()),
+		'pre' => array(
+			'style' => array(),
+			'width' => array ()),
+		'q' => array(
+			'cite' => array ()),
+		's' => array(),
+		'span' => array (
+			'class' => array (),
+			'dir' => array (),
+			'align' => array (),
+			'style' => array (),
+			'title' => array ()),
+		'strike' => array(),
+		'strong' => array(),
+		'sub' => array(),
+		'sup' => array(),
+		'table' => array(
+			'align' => array (),
+			'bgcolor' => array (),
+			'border' => array (),
+			'cellpadding' => array (),
+			'cellspacing' => array (),
+			'class' => array (),
+			'dir' => array(),
+			'id' => array(),
+			'rules' => array (),
+			'style' => array (),
+			'summary' => array (),
+			'width' => array ()),
+		'tbody' => array(
+			'align' => array (),
+			'char' => array (),
+			'charoff' => array (),
+			'valign' => array ()),
+		'td' => array(
+			'abbr' => array (),
+			'align' => array (),
+			'axis' => array (),
+			'bgcolor' => array (),
+			'char' => array (),
+			'charoff' => array (),
+			'class' => array (),
+			'colspan' => array (),
+			'dir' => array(),
+			'headers' => array (),
+			'height' => array (),
+			'nowrap' => array (),
+			'rowspan' => array (),
+			'scope' => array (),
+			'style' => array (),
+			'valign' => array (),
+			'width' => array ()),
+		'textarea' => array(
+			'cols' => array (),
+			'rows' => array (),
+			'disabled' => array (),
+			'name' => array (),
+			'readonly' => array ()),
+		'tfoot' => array(
+			'align' => array (),
+			'char' => array (),
+			'class' => array (),
+			'charoff' => array (),
+			'valign' => array ()),
+		'th' => array(
+			'abbr' => array (),
+			'align' => array (),
+			'axis' => array (),
+			'bgcolor' => array (),
+			'char' => array (),
+			'charoff' => array (),
+			'class' => array (),
+			'colspan' => array (),
+			'headers' => array (),
+			'height' => array (),
+			'nowrap' => array (),
+			'rowspan' => array (),
+			'scope' => array (),
+			'valign' => array (),
+			'width' => array ()),
+		'thead' => array(
+			'align' => array (),
+			'char' => array (),
+			'charoff' => array (),
+			'class' => array (),
+			'valign' => array ()),
+		'title' => array(),
+		'tr' => array(
+			'align' => array (),
+			'bgcolor' => array (),
+			'char' => array (),
+			'charoff' => array (),
+			'class' => array (),
+			'style' => array (),
+			'valign' => array ()),
+		'tt' => array(),
+		'u' => array(),
+		'ul' => array (
+			'class' => array (),
+			'style' => array (), 
+			'type' => array ()),
+		'ol' => array (
+			'class' => array (),
+			'start' => array (),
+			'style' => array (), 
+			'type' => array ()),
+		'var' => array ());
+	/**
+	 * Kses allowed HTML elements
+	 *
+	 * @global array $allowedtags
+	 * @since 1.0.0
+	 */
+	$allowedtags = array(
+		'a' => array(
+			'href' => array (),
+			'title' => array ()),
+		'abbr' => array(
+			'title' => array ()),
+		'acronym' => array(
+			'title' => array ()),
+		'b' => array(),
+		'blockquote' => array(
+			'cite' => array ()),
 		//	'br' => array(),
-	'code' => array (),
-		//	'del' => array('datetime' => array()),
+		'cite' => array (),
+		'code' => array(),
+		'del' => array(
+			'datetime' => array ()),
 		//	'dd' => array(),
 		//	'dl' => array(),
 		//	'dt' => array(),
-	'em' => array (), 'i' => array (),
+		'em' => array (), 'i' => array (),
 		//	'ins' => array('datetime' => array(), 'cite' => array()),
 		//	'li' => array(),
 		//	'ol' => array(),
 		//	'p' => array(),
-		//	'q' => array(),
-	'strike' => array (), 'strong' => array (),
+		'q' => array(
+			'cite' => array ()),
+		'strike' => array(),
+		'strong' => array(),
 		//	'sub' => array(),
 		//	'sup' => array(),
 		//	'u' => array(),
 		//	'ul' => array(),
 	);
 }
-function wp_kses($string, $allowed_html, $allowed_protocols = array ('http', 'https', 'ftp', 'ftps', 'mailto', 'news', 'irc', 'gopher', 'nntp', 'feed', 'telnet'))
-	###############################################################################
-		# This function makes sure that only the allowed HTML element names, attribute
-		# names and attribute values plus only sane HTML entities will occur in
-		# $string. You have to remove any slashes from PHP's magic quotes before you
-		# call this function.
-		###############################################################################
-	{
+
+/**
+ * wp_kses() - Filters content and keeps only allowable HTML elements.
+ *
+ * This function makes sure that only the allowed HTML element names,
+ * attribute names and attribute values plus only sane HTML entities
+ * will occur in $string. You have to remove any slashes from PHP's
+ * magic quotes before you call this function.
+ *
+ * The default allowed protocols are 'http', 'https', 'ftp', 'mailto',
+ * 'news', 'irc', 'gopher', 'nntp', 'feed', and finally 'telnet. This
+ * covers all common link protocols, except for 'javascript' which
+ * should not be allowed for untrusted users.
+ *
+ * @since 1.0.0
+ *
+ * @param string $string Content to filter through kses
+ * @param array $allowed_html List of allowed HTML elements
+ * @param array $allowed_protocols Optional. Allowed protocol in links.
+ * @return string Filtered content with only allowed HTML elements
+ */
+function wp_kses($string, $allowed_html, $allowed_protocols = array ('http', 'https', 'ftp', 'ftps', 'mailto', 'news', 'irc', 'gopher', 'nntp', 'feed', 'telnet')) {
 	$string = wp_kses_no_null($string);
 	$string = wp_kses_js_entities($string);
 	$string = wp_kses_normalize_entities($string);
-	$string = wp_kses_hook($string);
 	$allowed_html_fixed = wp_kses_array_lc($allowed_html);
+	$string = wp_kses_hook($string, $allowed_html_fixed, $allowed_protocols); // WP changed the order of these funcs and added args to wp_kses_hook
 	return wp_kses_split($string, $allowed_html_fixed, $allowed_protocols);
-} # function wp_kses
+}
 
-function wp_kses_hook($string)
-###############################################################################
-# You add any kses hooks here.
-###############################################################################
-{
+/**
+ * wp_kses_hook() - You add any kses hooks here.
+ *
+ * There is currently only one kses WordPress hook and it is
+ * called here. All parameters are passed to the hooks and
+ * expected to recieve a string.
+ *
+ * @since 1.0.0
+ *
+ * @param string $string Content to filter through kses
+ * @param array $allowed_html List of allowed HTML elements
+ * @param array $allowed_protocols Allowed protocol in links
+ * @return string Filtered content through 'pre_kses' hook
+ */
+function wp_kses_hook($string, $allowed_html, $allowed_protocols) {
+	$string = apply_filters('pre_kses', $string, $allowed_html, $allowed_protocols);
 	return $string;
-} # function wp_kses_hook
+}
 
-function wp_kses_version()
-###############################################################################
-# This function returns kses' version number.
-###############################################################################
-{
+/**
+ * wp_kses_version() - This function returns kses' version number.
+ *
+ * @since 1.0.0
+ *
+ * @return string Version Number
+ */
+function wp_kses_version() {
 	return '0.2.2';
-} # function wp_kses_version
+}
 
-function wp_kses_split($string, $allowed_html, $allowed_protocols)
-###############################################################################
-# This function searches for HTML tags, no matter how malformed. It also
-# matches stray ">" characters.
-###############################################################################
-{
+/**
+ * wp_kses_split() - Searches for HTML tags, no matter how malformed
+ *
+ * It also matches stray ">" characters.
+ *
+ * @since 1.0.0
+ *
+ * @param string $string Content to filter
+ * @param array $allowed_html Allowed HTML elements
+ * @param array $allowed_protocols Allowed protocols to keep
+ * @return string Content with fixed HTML tags
+ */
+function wp_kses_split($string, $allowed_html, $allowed_protocols) {
 	return preg_replace('%((<!--.*?(-->|$))|(<[^>]*(>|$)|>))%e',
 	"wp_kses_split2('\\1', \$allowed_html, ".'$allowed_protocols)', $string);
-} # function wp_kses_split
+}
 
-function wp_kses_split2($string, $allowed_html, $allowed_protocols)
-###############################################################################
-# This function does a lot of work. It rejects some very malformed things
-# like <:::>. It returns an empty string, if the element isn't allowed (look
-# ma, no strip_tags()!). Otherwise it splits the tag into an element and an
-# attribute list.
-###############################################################################
-{
+/**
+ * wp_kses_split2() - Callback for wp_kses_split for fixing malformed HTML tags
+ *
+ * This function does a lot of work. It rejects some very malformed things
+ * like <:::>. It returns an empty string, if the element isn't allowed (look
+ * ma, no strip_tags()!). Otherwise it splits the tag into an element and an
+ * attribute list.
+ *
+ * After the tag is split into an element and an attribute list, it is run
+ * through another filter which will remove illegal attributes and once
+ * that is completed, will be returned.
+ *
+ * @since 1.0.0
+ * @uses wp_kses_attr()
+ *
+ * @param string $string Content to filter
+ * @param array $allowed_html Allowed HTML elements
+ * @param array $allowed_protocols Allowed protocols to keep
+ * @return string Fixed HTML element
+ */
+function wp_kses_split2($string, $allowed_html, $allowed_protocols) {
 	$string = wp_kses_stripslashes($string);
 
 	if (substr($string, 0, 1) != '<')
@@ -122,18 +450,26 @@
 	# No attributes are allowed for closing elements
 
 	return wp_kses_attr("$slash$elem", $attrlist, $allowed_html, $allowed_protocols);
-} # function wp_kses_split2
+}
 
-function wp_kses_attr($element, $attr, $allowed_html, $allowed_protocols)
-###############################################################################
-# This function removes all attributes, if none are allowed for this element.
-# If some are allowed it calls wp_kses_hair() to split them further, and then it
-# builds up new HTML code from the data that kses_hair() returns. It also
-# removes "<" and ">" characters, if there are any left. One more thing it
-# does is to check if the tag has a closing XHTML slash, and if it does,
-# it puts one in the returned code as well.
-###############################################################################
-{
+/**
+ * wp_kses_attr() - Removes all attributes, if none are allowed for this element
+ *
+ * If some are allowed it calls wp_kses_hair() to split them further, and then
+ * it builds up new HTML code from the data that kses_hair() returns. It also
+ * removes "<" and ">" characters, if there are any left. One more thing it
+ * does is to check if the tag has a closing XHTML slash, and if it does, it
+ * puts one in the returned code as well.
+ *
+ * @since 1.0.0
+ *
+ * @param string $element HTML element/tag
+ * @param string $attr HTML attributes from HTML element to closing HTML element tag
+ * @param array $allowed_html Allowed HTML elements
+ * @param array $allowed_protocols Allowed protocols to keep
+ * @return string Sanitized HTML element
+ */
+function wp_kses_attr($element, $attr, $allowed_html, $allowed_protocols) {
 	# Is there a closing XHTML slash at the end of the attributes?
 
 	$xhtml_slash = '';
@@ -185,18 +521,25 @@
 	$attr2 = preg_replace('/[<>]/', '', $attr2);
 
 	return "<$element$attr2$xhtml_slash>";
-} # function wp_kses_attr
+}
 
-function wp_kses_hair($attr, $allowed_protocols)
-###############################################################################
-# This function does a lot of work. It parses an attribute list into an array
-# with attribute data, and tries to do the right thing even if it gets weird
-# input. It will add quotes around attribute values that don't have any quotes
-# or apostrophes around them, to make it easier to produce HTML code that will
-# conform to W3C's HTML specification. It will also remove bad URL protocols
-# from attribute values.
-###############################################################################
-{
+/**
+ * wp_kses_hair() - Builds an attribute list from string containing attributes.
+ *
+ * This function does a lot of work. It parses an attribute list into an array
+ * with attribute data, and tries to do the right thing even if it gets weird
+ * input. It will add quotes around attribute values that don't have any quotes
+ * or apostrophes around them, to make it easier to produce HTML code that will
+ * conform to W3C's HTML specification. It will also remove bad URL protocols
+ * from attribute values.
+ *
+ * @since 1.0.0
+ *
+ * @param string $attr Attribute list from HTML element to closing HTML element tag
+ * @param array $allowed_protocols Allowed protocols to keep
+ * @return array List of attributes after parsing
+ */
+function wp_kses_hair($attr, $allowed_protocols) {
 	$attrarr = array ();
 	$mode = 0;
 	$attrname = '';
@@ -279,7 +622,7 @@
 		} # switch
 
 		if ($working == 0) # not well formed, remove and try again
-			{
+		{
 			$attr = wp_kses_html_error($attr);
 			$mode = 0;
 		}
@@ -291,15 +634,23 @@
 		$attrarr[] = array ('name' => $attrname, 'value' => '', 'whole' => $attrname, 'vless' => 'y');
 
 	return $attrarr;
-} # function wp_kses_hair
+}
 
-function wp_kses_check_attr_val($value, $vless, $checkname, $checkvalue)
-###############################################################################
-# This function performs different checks for attribute values. The currently
-# implemented checks are "maxlen", "minlen", "maxval", "minval" and "valueless"
-# with even more checks to come soon.
-###############################################################################
-{
+/**
+ * wp_kses_check_attr_val() - Performs different checks for attribute values.
+ *
+ * The currently implemented checks are "maxlen", "minlen", "maxval", "minval"
+ * and "valueless" with even more checks to come soon.
+ *
+ * @since 1.0.0
+ *
+ * @param string $value Attribute value
+ * @param string $vless Whether the value is valueless or not. Use 'y' or 'n'
+ * @param string $checkname What $checkvalue is checking for.
+ * @param mixed $checkvalue What constraint the value should pass
+ * @return bool Whether check passes (true) or not (false)
+ */
+function wp_kses_check_attr_val($value, $vless, $checkname, $checkvalue) {
 	$ok = true;
 
 	switch (strtolower($checkname)) {
@@ -355,16 +706,23 @@
 	} # switch
 
 	return $ok;
-} # function wp_kses_check_attr_val
+}
 
-function wp_kses_bad_protocol($string, $allowed_protocols)
-###############################################################################
-# This function removes all non-allowed protocols from the beginning of
-# $string. It ignores whitespace and the case of the letters, and it does
-# understand HTML entities. It does its work in a while loop, so it won't be
-# fooled by a string like "javascript:javascript:alert(57)".
-###############################################################################
-{
+/**
+ * wp_kses_bad_protocol() - Sanitize string from bad protocols
+ *
+ * This function removes all non-allowed protocols from the beginning
+ * of $string. It ignores whitespace and the case of the letters, and
+ * it does understand HTML entities. It does its work in a while loop,
+ * so it won't be fooled by a string like "javascript:javascript:alert(57)".
+ *
+ * @since 1.0.0
+ *
+ * @param string $string Content to filter bad protocols from
+ * @param array $allowed_protocols Allowed protocols to keep
+ * @return string Filtered content
+ */
+function wp_kses_bad_protocol($string, $allowed_protocols) {
 	$string = wp_kses_no_null($string);
 	$string = preg_replace('/\xad+/', '', $string); # deals with Opera "feature"
 	$string2 = $string.'a';
@@ -375,34 +733,48 @@
 	} # while
 
 	return $string;
-} # function wp_kses_bad_protocol
+}
 
-function wp_kses_no_null($string)
-###############################################################################
-# This function removes any NULL characters in $string.
-###############################################################################
-{
+/**
+ * wp_kses_no_null() - Removes any NULL characters in $string.
+ *
+ * @since 1.0.0
+ *
+ * @param string $string
+ * @return string
+ */
+function wp_kses_no_null($string) {
 	$string = preg_replace('/\0+/', '', $string);
 	$string = preg_replace('/(\\\\0)+/', '', $string);
 
 	return $string;
-} # function wp_kses_no_null
+}
 
-function wp_kses_stripslashes($string)
-###############################################################################
-# This function changes the character sequence  \"  to just  "
-# It leaves all other slashes alone. It's really weird, but the quoting from
-# preg_replace(//e) seems to require this.
-###############################################################################
-{
+/**
+ * wp_kses_stripslashes() - Strips slashes from in front of quotes
+ *
+ * This function changes the character sequence  \"  to just  "
+ * It leaves all other slashes alone. It's really weird, but the
+ * quoting from preg_replace(//e) seems to require this.
+ *
+ * @since 1.0.0
+ *
+ * @param string $string String to strip slashes
+ * @return string Fixed strings with quoted slashes
+ */
+function wp_kses_stripslashes($string) {
 	return preg_replace('%\\\\"%', '"', $string);
-} # function wp_kses_stripslashes
+}
 
-function wp_kses_array_lc($inarray)
-###############################################################################
-# This function goes through an array, and changes the keys to all lower case.
-###############################################################################
-{
+/**
+ * wp_kses_array_lc() - Goes through an array and changes the keys to all lower case.
+ *
+ * @since 1.0.0
+ *
+ * @param array $inarray Unfiltered array
+ * @return array Fixed array with all lowercase keys
+ */
+function wp_kses_array_lc($inarray) {
 	$outarray = array ();
 
 	foreach ($inarray as $inkey => $inval) {
@@ -416,42 +788,73 @@
 	} # foreach $inarray
 
 	return $outarray;
-} # function wp_kses_array_lc
+}
 
-function wp_kses_js_entities($string)
-###############################################################################
-# This function removes the HTML JavaScript entities found in early versions of
-# Netscape 4.
-###############################################################################
-{
+/**
+ * wp_kses_js_entities() - Removes the HTML JavaScript entities found in early versions of Netscape 4.
+ *
+ * @since 1.0.0
+ *
+ * @param string $string
+ * @return string
+ */
+function wp_kses_js_entities($string) {
 	return preg_replace('%&\s*\{[^}]*(\}\s*;?|$)%', '', $string);
-} # function wp_kses_js_entities
+}
 
-function wp_kses_html_error($string)
-###############################################################################
-# This function deals with parsing errors in wp_kses_hair(). The general plan is
-# to remove everything to and including some whitespace, but it deals with
-# quotes and apostrophes as well.
-###############################################################################
-{
+/**
+ * wp_kses_html_error() - Handles parsing errors in wp_kses_hair()
+ *
+ * The general plan is to remove everything to and including some
+ * whitespace, but it deals with quotes and apostrophes as well.
+ *
+ * @since 1.0.0
+ *
+ * @param string $string
+ * @return string
+ */
+function wp_kses_html_error($string) {
 	return preg_replace('/^("[^"]*("|$)|\'[^\']*(\'|$)|\S)*\s*/', '', $string);
-} # function wp_kses_html_error
+}
+
+/**
+ * wp_kses_bad_protocol_once() - Sanitizes content from bad protocols and other characters
+ *
+ * This function searches for URL protocols at the beginning of $string,
+ * while handling whitespace and HTML entities.
+ *
+ * @since 1.0.0
+ *
+ * @param string $string Content to check for bad protocols
+ * @param string $allowed_protocols Allowed protocols
+ * @return string Sanitized content
+ */
+function wp_kses_bad_protocol_once($string, $allowed_protocols) {
+	global $_kses_allowed_protocols;
+	$_kses_allowed_protocols = $allowed_protocols;
+
+	$string2 = preg_split('/:|&#58;|&#x3a;/i', $string, 2);
+	if ( isset($string2[1]) && !preg_match('%/\?%', $string2[0]) )
+		$string = wp_kses_bad_protocol_once2($string2[0], $allowed_protocols) . trim($string2[1]);
+	else
+		$string = preg_replace_callback('/^((&[^;]*;|[\sA-Za-z0-9])*)'.'(:|&#58;|&#[Xx]3[Aa];)\s*/', create_function('$matches', 'global $_kses_allowed_protocols; return wp_kses_bad_protocol_once2($matches[1], $_kses_allowed_protocols);'), $string);
+
+	return $string;
+}
 
-function wp_kses_bad_protocol_once($string, $allowed_protocols)
-###############################################################################
-# This function searches for URL protocols at the beginning of $string, while
-# handling whitespace and HTML entities.
-###############################################################################
-{
-	return preg_replace('/^((&[^;]*;|[\sA-Za-z0-9])*)'.'(:|&#58;|&#[Xx]3[Aa];)\s*/e', 'wp_kses_bad_protocol_once2("\\1", $allowed_protocols)', $string);
-} # function wp_kses_bad_protocol_once
-
-function wp_kses_bad_protocol_once2($string, $allowed_protocols)
-###############################################################################
-# This function processes URL protocols, checks to see if they're in the white-
-# list or not, and returns different data depending on the answer.
-###############################################################################
-{
+/**
+ * wp_kses_bad_protocol_once2() - Callback for wp_kses_bad_protocol_once() regular expression.
+ *
+ * This function processes URL protocols, checks to see if they're in the
+ * white-list or not, and returns different data depending on the answer.
+ *
+ * @since 1.0.0
+ *
+ * @param string $string Content to check for bad protocols
+ * @param array $allowed_protocols Allowed protocols
+ * @return string Sanitized content
+ */
+function wp_kses_bad_protocol_once2($string, $allowed_protocols) {
 	$string2 = wp_kses_decode_entities($string);
 	$string2 = preg_replace('/\s/', '', $string2);
 	$string2 = wp_kses_no_null($string2);
@@ -470,14 +873,21 @@
 		return "$string2:";
 	else
 		return '';
-} # function wp_kses_bad_protocol_once2
+}
 
-function wp_kses_normalize_entities($string)
-###############################################################################
-# This function normalizes HTML entities. It will convert "AT&T" to the correct
-# "AT&amp;T", "&#00058;" to "&#58;", "&#XYZZY;" to "&amp;#XYZZY;" and so on.
-###############################################################################
-{
+/**
+ * wp_kses_normalize_entities() - Converts and fixes HTML entities
+ *
+ * This function normalizes HTML entities. It will convert "AT&T" to the
+ * correct "AT&amp;T", "&#00058;" to "&#58;", "&#XYZZY;" to "&amp;#XYZZY;"
+ * and so on.
+ *
+ * @since 1.0.0
+ *
+ * @param string $string Content to normalize entities
+ * @return string Content with normalized entities
+ */
+function wp_kses_normalize_entities($string) {
 	# Disarm all entities by converting & to &amp;
 
 	$string = str_replace('&', '&amp;', $string);
@@ -485,48 +895,101 @@
 	# Change back the allowed entities in our entity whitelist
 
 	$string = preg_replace('/&amp;([A-Za-z][A-Za-z0-9]{0,19});/', '&\\1;', $string);
-	$string = preg_replace('/&amp;#0*([0-9]{1,5});/e', 'wp_kses_normalize_entities2("\\1")', $string);
+	$string = preg_replace_callback('/&amp;#0*([0-9]{1,5});/', create_function('$matches', 'return wp_kses_normalize_entities2($matches[1]);'), $string);
 	$string = preg_replace('/&amp;#([Xx])0*(([0-9A-Fa-f]{2}){1,2});/', '&#\\1\\2;', $string);
 
 	return $string;
-} # function wp_kses_normalize_entities
+}
 
-function wp_kses_normalize_entities2($i)
-###############################################################################
-# This function helps wp_kses_normalize_entities() to only accept 16 bit values
-# and nothing more for &#number; entities.
-###############################################################################
-{
+/**
+ * wp_kses_normalize_entities2() - Callback for wp_kses_normalize_entities() regular expression
+ *
+ * This function helps wp_kses_normalize_entities() to only accept 16 bit
+ * values and nothing more for &#number; entities.
+ *
+ * @since 1.0.0
+ *
+ * @param int $i Number encoded entity
+ * @return string Correctly encoded entity
+ */
+function wp_kses_normalize_entities2($i) {
 	return (($i > 65535) ? "&amp;#$i;" : "&#$i;");
-} # function wp_kses_normalize_entities2
+}
 
-function wp_kses_decode_entities($string)
-###############################################################################
-# This function decodes numeric HTML entities (&#65; and &#x41;). It doesn't
-# do anything with other entities like &auml;, but we don't need them in the
-# URL protocol whitelisting system anyway.
-###############################################################################
-{
+/**
+ * wp_kses_decode_entities() - Convert all entities to their character counterparts.
+ *
+ * This function decodes numeric HTML entities (&#65; and &#x41;). It
+ * doesn't do anything with other entities like &auml;, but we don't need
+ * them in the URL protocol whitelisting system anyway.
+ *
+ * @since 1.0.0
+ *
+ * @param string $string Content to change entities
+ * @return string Content after decoded entities
+ */
+function wp_kses_decode_entities($string) {
 	$string = preg_replace('/&#([0-9]+);/e', 'chr("\\1")', $string);
 	$string = preg_replace('/&#[Xx]([0-9A-Fa-f]+);/e', 'chr(hexdec("\\1"))', $string);
 
 	return $string;
-} # function wp_kses_decode_entities
+}
 
+/**
+ * wp_filter_kses() - Sanitize content with allowed HTML Kses rules
+ *
+ * @since 1.0.0
+ * @uses $allowedtags
+ *
+ * @param string $data Content to filter
+ * @return string Filtered content
+ */
 function wp_filter_kses($data) {
 	global $allowedtags;
 	return addslashes( wp_kses(stripslashes( $data ), $allowedtags) );
 }
 
+/**
+ * wp_filter_post_kses() - Sanitize content for allowed HTML tags for post content
+ *
+ * Post content refers to the page contents of the 'post' type and not
+ * $_POST data from forms.
+ *
+ * @since 2.0.0
+ * @uses $allowedposttags
+ *
+ * @param string $data Post content to filter
+ * @return string Filtered post content with allowed HTML tags and attributes intact.
+ */
 function wp_filter_post_kses($data) {
 	global $allowedposttags;
 	return addslashes ( wp_kses(stripslashes( $data ), $allowedposttags) );
 }
 
+/**
+ * wp_filter_nohtml_kses() - Strips all of the HTML in the content
+ *
+ * @since 2.1.0
+ *
+ * @param string $data Content to strip all HTML from
+ * @return string Filtered content without any HTML
+ */
 function wp_filter_nohtml_kses($data) {
 	return addslashes ( wp_kses(stripslashes( $data ), array()) );
 }
 
+/**
+ * kses_init_filters() - Adds all Kses input form content filters
+ *
+ * All hooks have default priority. The wp_filter_kses() fucntion
+ * is added to the 'pre_comment_content' and 'title_save_pre'
+ * hooks. The wp_filter_post_kses() function is added to the
+ * 'content_save_pre', 'excerpt_save_pre', and 'content_filtered_save_pre'
+ * hooks.
+ *
+ * @since 2.0.0
+ * @uses add_filter() See description for what functions are added to what hooks.
+ */
 function kses_init_filters() {
 	// Normal filtering.
 	add_filter('pre_comment_content', 'wp_filter_kses');
@@ -538,6 +1001,19 @@
 	add_filter('content_filtered_save_pre', 'wp_filter_post_kses');
 }
 
+/**
+ * kses_remove_filters() - Removes all Kses input form content filters
+ *
+ * A quick procedural method to removing all of the filters
+ * that kses uses for content in WordPress Loop.
+ *
+ * Does not remove the kses_init() function from 'init' hook
+ * (priority is default). Also does not remove kses_init()
+ * function from 'set_current_user' hook (priority is also
+ * default).
+ *
+ * @since 2.0.6
+ */
 function kses_remove_filters() {
 	// Normal filtering.
 	remove_filter('pre_comment_content', 'wp_filter_kses');
@@ -549,6 +1025,22 @@
 	remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');
 }
 
+/**
+ * kses_init() - Sets up most of the Kses filters for input form content
+ *
+ * If you remove the kses_init() function from 'init' hook and
+ * 'set_current_user' (priority is default), then none of the
+ * Kses filter hooks will be added.
+ *
+ * First removes all of the Kses filters in case the current user
+ * does not need to have Kses filter the content. If the user does
+ * not have unfiltered html capability, then Kses filters are added.
+ *
+ * @uses kses_remove_filters() Removes the Kses filters
+ * @uses kses_init_filters() Adds the Kses filters back if the user
+ *		does not have unfiltered HTML capability.
+ * @since 2.0.0
+ */
 function kses_init() {
 	kses_remove_filters();
 
@@ -558,4 +1050,4 @@
 
 add_action('init', 'kses_init');
 add_action('set_current_user', 'kses_init');
-?>
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/l10n.php 2.5.src/wp-includes/l10n.php
--- 2.2.2.src/wp-includes/l10n.php	2007-04-12 16:15:44.000000000 -0500
+++ 2.5.src/wp-includes/l10n.php	2008-03-19 11:00:09.000000000 -0500
@@ -1,4 +1,32 @@
 <?php
+/**
+ * WordPress Translation API
+ *
+ * @package WordPress
+ * @subpackage i18n
+ */
+
+/**
+ * get_locale() - Gets the current locale
+ *
+ * If the locale is set, then it will filter the locale
+ * in the 'locale' filter hook and return the value.
+ *
+ * If the locale is not set already, then the WPLANG
+ * constant is used if it is defined. Then it is filtered
+ * through the 'locale' filter hook and the value for the
+ * locale global set and the locale is returned.
+ *
+ * The process to get the locale should only be done once
+ * but the locale will always be filtered using the
+ * 'locale' hook.
+ *
+ * @since 1.5.0
+ * @uses apply_filters() Calls 'locale' hook on locale value
+ * @uses $locale Gets the locale stored in the global
+ *
+ * @return string The locale of the blog or from the 'locale' hook
+ */
 function get_locale() {
 	global $locale;
 
@@ -17,7 +45,26 @@
 	return $locale;
 }
 
-function translate($text, $domain) {
+/**
+ * translate() - Retrieve the translated text
+ *
+ * If the domain is set in the $l10n global, then the text is run
+ * through the domain's translate method. After it is passed to
+ * the 'gettext' filter hook, along with the untranslated text as
+ * the second parameter.
+ *
+ * If the domain is not set, the $text is just returned.
+ *
+ * @since 2.2.0
+ * @uses $l10n Gets list of domain translated string (gettext_reader) objects
+ * @uses apply_filters() Calls 'gettext' on domain translated text
+ *		with the untranslated text as second parameter
+ *
+ * @param string $text Text to translate
+ * @param string $domain Domain to retrieve the translated text
+ * @return string Translated text
+ */
+function translate($text, $domain = 'default') {
 	global $l10n;
 
 	if (isset($l10n[$domain]))
@@ -26,27 +73,115 @@
 		return $text;
 }
 
-// Return a translated string.
+/**
+ * translate_with_context() - Retrieve the translated text and strip context
+ *
+ * If the domain is set in the $l10n global, then the text is run
+ * through the domain's translate method. After it is passed to
+ * the 'gettext' filter hook, along with the untranslated text as
+ * the second parameter.
+ *
+ * If the domain is not set, the $text is just returned.
+ *
+ * @since 2.5
+ * @uses translate()
+ *
+ * @param string $text Text to translate
+ * @param string $domain Domain to retrieve the translated text
+ * @return string Translated text
+ */
+function translate_with_context($text, $domain = 'default') {
+	$whole = translate($text, $domain);
+	$last_bar = strrpos($whole, '|');
+	if ( false == $last_bar ) {
+		return $whole;
+	} else {
+		return substr($whole, 0, $last_bar);
+	}
+}
+
+/**
+ * __() - Retrieve a translated string
+ *
+ * __() is a convenience function which retrieves the translated
+ * string from the translate().
+ *
+ * @see translate() An alias of translate()
+ * @since 2.1.0
+ *
+ * @param string $text Text to translate
+ * @param string $domain Optional. Domain to retrieve the translated text
+ * @return string Translated text
+ */
 function __($text, $domain = 'default') {
 	return translate($text, $domain);
 }
 
-// Echo a translated string.
+// .
+/**
+ * _e() - Display a translated string
+ *
+ * _e() is a convenience function which displays the returned
+ * translated text from translate().
+ *
+ * @see translate() Echos returned translate() string
+ * @since 1.2.0
+ *
+ * @param string $text Text to translate
+ * @param string $domain Optional. Domain to retrieve the translated text
+ */
 function _e($text, $domain = 'default') {
 	echo translate($text, $domain);
 }
 
+/**
+ * _c() - Retrieve context translated string
+ *
+ * Quite a few times, there will be collisions with similar
+ * translatable text found in more than two places but with
+ * different translated context.
+ *
+ * In order to use the separate contexts, the _c() function
+ * is used and the translatable string uses a pipe ('|')
+ * which has the context the string is in.
+ *
+ * When the translated string is returned, it is everything
+ * before the pipe, not including the pipe character. If
+ * there is no pipe in the translated text then everything
+ * is returned.
+ *
+ * @since 2.2.0
+ *
+ * @param string $text Text to translate
+ * @param string $domain Optional. Domain to retrieve the translated text
+ * @return string Translated context string without pipe
+ */
 function _c($text, $domain = 'default') {
-	$whole = translate($text, $domain);
-	$last_bar = strrpos($whole, '|');
-	if ( false == $last_bar ) {
-		return $whole;
-	} else {
-		return substr($whole, 0, $last_bar);
-	}
+	return translate_with_context($text, $domain);
 }
 
-// Return the plural form.
+/**
+ * __ngettext() - Retrieve the plural or single form based on the amount
+ *
+ * If the domain is not set in the $l10n list, then a comparsion
+ * will be made and either $plural or $single parameters returned.
+ *
+ * If the domain does exist, then the parameters $single, $plural,
+ * and $number will first be passed to the domain's ngettext method.
+ * Then it will be passed to the 'ngettext' filter hook along with
+ * the same parameters. The expected type will be a string.
+ *
+ * @since 1.2.0
+ * @uses $l10n Gets list of domain translated string (gettext_reader) objects
+ * @uses apply_filters() Calls 'ngettext' hook on domains text returned,
+ *		along with $single, $plural, and $number parameters. Expected to return string.
+ *
+ * @param string $single The text that will be used if $number is 1
+ * @param string $plural The text that will be used if $number is not 1
+ * @param int $number The number to compare against to use either $single or $plural
+ * @param string $domain Optional. The domain identifier the text should be retrieved in
+ * @return string Either $single or $plural translated text
+ */
 function __ngettext($single, $plural, $number, $domain = 'default') {
 	global $l10n;
 
@@ -60,6 +195,50 @@
 	}
 }
 
+/**
+ * __ngettext_noop() - register plural strings in POT file, but don't translate them
+ *
+ * Used when you want do keep structures with translatable plural strings and
+ * use them later.
+ *
+ * Example:
+ *  $messages = array(
+ *  	'post' => ngettext_noop('%s post', '%s posts'),
+ *  	'page' => ngettext_noop('%s pages', '%s pages')
+ *  );
+ *  ...
+ *  $message = $messages[$type];
+ *  $usable_text = sprintf(__ngettext($message[0], $message[1], $count), $count);
+ *
+ * @since 2.5
+ * @param $single Single form to be i18ned
+ * @param $plural Plural form to be i18ned
+ * @param $number Not used, here for compatibility with __ngettext, optional
+ * @param $domain Not used, here for compatibility with __ngettext, optional
+ * @return array array($single, $plural)
+ */
+function __ngettext_noop($single, $plural, $number=1, $domain = 'default') {
+	return array($single, $plural);
+}
+
+/**
+ * load_textdomain() - Loads MO file into the list of domains
+ *
+ * If the domain already exists, the inclusion will fail. If the
+ * MO file is not readable, the inclusion will fail.
+ *
+ * On success, the mofile will be placed in the $l10n global by
+ * $domain and will be an gettext_reader object.
+ *
+ * @since 1.5.0
+ * @uses $l10n Gets list of domain translated string (gettext_reader) objects
+ * @uses CacheFileReader Reads the MO file
+ * @uses gettext_reader Allows for retrieving translated strings
+ *
+ * @param string $domain Unique identifier for retrieving translated strings
+ * @param string $mofile Path to the .mo file
+ * @return null On failure returns null and also on success returns nothing.
+ */
 function load_textdomain($domain, $mofile) {
 	global $l10n;
 
@@ -74,9 +253,15 @@
 	$l10n[$domain] = new gettext_reader($input);
 }
 
+/**
+ * load_default_textdomain() - Loads default translated strings based on locale
+ *
+ * Loads the .mo file in LANGDIR constant path from WordPress root.
+ * The translated (.mo) file is named based off of the locale.
+ *
+ * @since 1.5.0
+ */
 function load_default_textdomain() {
-	global $l10n;
-
 	$locale = get_locale();
 	if ( empty($locale) )
 		$locale = 'en_US';
@@ -86,6 +271,24 @@
 	load_textdomain('default', $mofile);
 }
 
+/**
+ * load_plugin_textdomain() - Loads the plugin's translated strings
+ *
+ * If the path is not given then it will be the root of the plugin
+ * directory. The .mo file should be named based on the domain with a
+ * dash followed by a dash, and then the locale exactly.
+ *
+ * The plugin may place all of the .mo files in another folder and set
+ * the $path based on the relative location from ABSPATH constant. The
+ * plugin may use the constant PLUGINDIR and/or plugin_basename() to
+ * get path of the plugin and then add the folder which holds the .mo
+ * files.
+ *
+ * @since 1.5.0
+ *
+ * @param string $domain Unique identifier for retrieving translated strings
+ * @param string $path Optional. Path of the folder where the .mo files reside.
+ */
 function load_plugin_textdomain($domain, $path = false) {
 	$locale = get_locale();
 	if ( empty($locale) )
@@ -98,6 +301,18 @@
 	load_textdomain($domain, $mofile);
 }
 
+/**
+ * load_theme_textdomain() - Includes theme's translated strings for the theme
+ *
+ * If the current locale exists as a .mo file in the theme's root directory, it
+ * will be included in the translated strings by the $domain.
+ *
+ * The .mo files must be named based on the locale exactly.
+ *
+ * @since 1.5.0
+ *
+ * @param string $domain Unique identifier for retrieving translated strings
+ */
 function load_theme_textdomain($domain) {
 	$locale = get_locale();
 	if ( empty($locale) )
diff -x .svn -aruN 2.2.2.src/wp-includes/link-template.php 2.5.src/wp-includes/link-template.php
--- 2.2.2.src/wp-includes/link-template.php	2007-06-13 21:58:04.000000000 -0500
+++ 2.5.src/wp-includes/link-template.php	2008-03-26 15:17:31.000000000 -0500
@@ -6,11 +6,6 @@
 }
 
 
-function permalink_link() { // For backwards compatibility
-	echo apply_filters('the_permalink', get_permalink());
-}
-
-
 /**
  * Conditionally adds a trailing slash if the permalink structure
  * has a trailing slash, strips the trailing slash if not
@@ -37,7 +32,7 @@
 	global $post;
 	switch ( strtolower($mode) ) {
 		case 'title':
-			$title = sanitize_title($post->post_title) . '-' . $id;
+			$title = sanitize_title($post->post_title) . '-' . $post->ID;
 			echo '<a id="'.$title.'"></a>';
 			break;
 		case 'id':
@@ -48,7 +43,7 @@
 }
 
 
-function get_permalink($id = 0) {
+function get_permalink($id = 0, $leavename=false) {
 	$rewritecode = array(
 		'%year%',
 		'%monthnum%',
@@ -56,36 +51,50 @@
 		'%hour%',
 		'%minute%',
 		'%second%',
-		'%postname%',
+		$leavename? '' : '%postname%',
 		'%post_id%',
 		'%category%',
 		'%author%',
-		'%pagename%'
+		$leavename? '' : '%pagename%',
 	);
 
 	$post = &get_post($id);
+
+	if ( empty($post->ID) ) return FALSE;
+
 	if ( $post->post_type == 'page' )
-		return get_page_link($post->ID);
+		return get_page_link($post->ID, $leavename);
 	elseif ($post->post_type == 'attachment')
 		return get_attachment_link($post->ID);
 
 	$permalink = get_option('permalink_structure');
 
-	if ( '' != $permalink && 'draft' != $post->post_status ) {
+	if ( '' != $permalink && !in_array($post->post_status, array('draft', 'pending')) ) {
 		$unixtime = strtotime($post->post_date);
 
 		$category = '';
-		if (strpos($permalink, '%category%') !== false) {
+		if ( strpos($permalink, '%category%') !== false ) {
 			$cats = get_the_category($post->ID);
 			if ( $cats )
-				usort($cats, '_get_the_category_usort_by_ID'); // order by ID
-			$category = $cats[0]->category_nicename;
-			if ( $parent=$cats[0]->category_parent )
+				usort($cats, '_usort_terms_by_ID'); // order by ID
+			$category = $cats[0]->slug;
+			if ( $parent=$cats[0]->parent )
 				$category = get_category_parents($parent, FALSE, '/', TRUE) . $category;
 		}
 
-		$authordata = get_userdata($post->post_author);
-		$author = $authordata->user_nicename;
+		// show default category in permalinks, without
+		// having to assign it explicitly
+		if ( empty($category) ) {
+			$default_category = get_category( get_option( 'default_category' ) );
+			$category = is_wp_error( $default_category)? '' : $default_category->slug; 
+		}
+
+		$author = '';
+		if ( strpos($permalink, '%author%') !== false ) {
+			$authordata = get_userdata($post->post_author);
+			$author = $authordata->user_nicename;
+		}
+
 		$date = explode(" ",date('Y m d H i s', $unixtime));
 		$rewritereplace =
 		array(
@@ -111,12 +120,12 @@
 }
 
 // get permalink from post ID
-function post_permalink($post_id = 0, $mode = '') { // $mode legacy
+function post_permalink($post_id = 0, $deprecated = '') {
 	return get_permalink($post_id);
 }
 
 // Respects page_on_front.  Use this one.
-function get_page_link($id = false) {
+function get_page_link($id = false, $leavename = false) {
 	global $post;
 
 	$id = (int) $id;
@@ -126,23 +135,25 @@
 	if ( 'page' == get_option('show_on_front') && $id == get_option('page_on_front') )
 		$link = get_option('home');
 	else
-		$link = _get_page_link( $id );
+		$link = _get_page_link( $id , $leavename );
 
 	return apply_filters('page_link', $link, $id);
 }
 
 // Ignores page_on_front.  Internal use only.
-function _get_page_link( $id = false ) {
+function _get_page_link( $id = false, $leavename = false ) {
 	global $post, $wp_rewrite;
 
 	if ( !$id )
 		$id = (int) $post->ID;
+	else
+		$post = &get_post($id);
 
 	$pagestruct = $wp_rewrite->get_page_permastruct();
 
-	if ( '' != $pagestruct && 'draft' != $post->post_status ) {
+	if ( '' != $pagestruct && isset($post->post_status) && 'draft' != $post->post_status ) {
 		$link = get_page_uri($id);
-		$link = str_replace('%pagename%', $link, $pagestruct);
+		$link = ( $leavename ) ? $pagestruct : str_replace('%pagename%', $link, $pagestruct);
 		$link = get_option('home') . "/$link";
 		$link = user_trailingslashit($link, 'page');
 	} else {
@@ -168,8 +179,12 @@
 			$parentlink = _get_page_link( $object->post_parent ); // Ignores page_on_front
 		else
 			$parentlink = get_permalink( $object->post_parent );
+		if ( ctype_digit($object->post_name) || false !== strpos(get_option('permalink_structure'), '%category%') )
+			$name = 'attachment/' . $object->post_name; // <permalink>/<int>/ is paged so we use the explicit attachment marker
+		else
+			$name = $object->post_name;
 		if (strpos($parentlink, '?') === false)
-			$link = trim($parentlink, '/') . '/' . $object->post_name . '/';
+			$link = trailingslashit($parentlink) . $name . '/';
 	}
 
 	if (! $link ) {
@@ -228,11 +243,8 @@
 	}
 }
 
-function get_feed_link($feed='rss2') {
+function get_feed_link($feed = '') {
 	global $wp_rewrite;
-	$do_perma = 0;
-	$feed_url = get_option('siteurl');
-	$comment_feed_url = $feed_url;
 
 	$permalink = $wp_rewrite->get_feed_permastruct();
 	if ( '' != $permalink ) {
@@ -241,13 +253,16 @@
 			$permalink = $wp_rewrite->get_comment_feed_permastruct();
 		}
 
-		if ( 'rss2' == $feed )
+		if ( get_default_feed() == $feed )
 			$feed = '';
 
 		$permalink = str_replace('%feed%', $feed, $permalink);
 		$permalink = preg_replace('#/+#', '/', "/$permalink");
 		$output =  get_option('home') . user_trailingslashit($permalink, 'feed');
 	} else {
+		if ( empty($feed) )
+			$feed = get_default_feed();
+
 		if ( false !== strpos($feed, 'comments_') )
 			$feed = str_replace('comments_', 'comments-', $feed);
 
@@ -257,166 +272,331 @@
 	return apply_filters('feed_link', $output, $feed);
 }
 
-function get_post_comments_feed_link($post_id = '', $feed = 'rss2') {
+function get_post_comments_feed_link($post_id = '', $feed = '') {
 	global $id;
 
 	if ( empty($post_id) )
 		$post_id = (int) $id;
 
+	if ( empty($feed) )
+		$feed = get_default_feed();
+
 	if ( '' != get_option('permalink_structure') ) {
-		$url = trailingslashit( get_permalink() ) . 'feed';
-		if ( 'rss2' != $feed )
+		$url = trailingslashit( get_permalink($post_id) ) . 'feed';
+		if ( $feed != get_default_feed() )
 			$url .= "/$feed";
 		$url = user_trailingslashit($url, 'single_feed');
 	} else {
-		$url = get_option('home') . "/?feed=$feed&amp;p=$id";
+		$type = get_post_field('post_type', $post_id);
+		if ( 'page' == $type )
+			$url = get_option('home') . "/?feed=$feed&amp;page_id=$post_id";
+		else
+			$url = get_option('home') . "/?feed=$feed&amp;p=$post_id";
 	}
 
 	return apply_filters('post_comments_feed_link', $url);
 }
 
-function edit_post_link($link = 'Edit This', $before = '', $after = '') {
-	global $post;
+/** post_comments_feed_link() - Output the comment feed link for a post.
+ *
+ * Prints out the comment feed link for a post.  Link text is placed in the
+ * anchor.  If no link text is specified, default text is used.  If no post ID
+ * is specified, the current post is used.
+ *
+ * @package WordPress
+ * @subpackage Feed
+ * @since 2.5
+ *
+ * @param string Descriptive text
+ * @param int Optional post ID.  Default to current post.
+ * @return string Link to the comment feed for the current post
+*/
+function post_comments_feed_link( $link_text = '', $post_id = '', $feed = '' ) {
+	$url = get_post_comments_feed_link($post_id, $feed);
+	if ( empty($link_text) )
+		$link_text = __('Comments Feed');
+
+	echo "<a href='$url'>$link_text</a>";
+}
+
+function get_author_feed_link( $author_id, $feed = '' ) {
+	$author_id = (int) $author_id;
+	$permalink_structure = get_option('permalink_structure');
+
+	if ( empty($feed) )
+		$feed = get_default_feed();
+
+	if ( '' == $permalink_structure ) {
+		$link = get_option('home') . '?feed=rss2&amp;author=' . $author_id;
+	} else {
+		$link = get_author_posts_url($author_id);
+		$link = trailingslashit($link) . user_trailingslashit('feed', 'feed');
+	}
+
+	$link = apply_filters('author_feed_link', $link);
+
+	return $link;
+}
+
+/** get_category_feed_link() - Get the feed link for a given category
+ *
+ * Returns a link to the feed for all post in a given category.  A specific feed can be requested
+ * or left blank to get the default feed.
+ *
+ * @package WordPress
+ * @subpackage Feed
+ * @since 2.5
+ *
+ * @param int $cat_id ID of a category
+ * @param string $feed Feed type
+ * @return string Link to the feed for the category specified by $cat_id
+*/
+function get_category_feed_link($cat_id, $feed = '') {
+	$cat_id = (int) $cat_id;
+
+	$category = get_category($cat_id);
+
+	if ( empty($category) || is_wp_error($category) )
+		return false;
+
+	if ( empty($feed) )
+		$feed = get_default_feed();
+
+	$permalink_structure = get_option('permalink_structure');
+
+	if ( '' == $permalink_structure ) {
+		$link = get_option('home') . "?feed=$feed&amp;cat=" . $cat_id;
+	} else {
+		$link = get_category_link($cat_id);
+		if( $feed == get_default_feed() )
+			$feed_link = 'feed';
+		else
+			$feed_link = "feed/$feed";
+
+		$link = trailingslashit($link) . user_trailingslashit($feed_link, 'feed');
+	}
+
+	$link = apply_filters('category_feed_link', $link, $feed);
+
+	return $link;
+}
+
+function get_tag_feed_link($tag_id, $feed = '') {
+	$tag_id = (int) $tag_id;
+
+	$tag = get_tag($tag_id);
+
+	if ( empty($tag) || is_wp_error($tag) )
+		return false;
+
+	$permalink_structure = get_option('permalink_structure');
+
+	if ( empty($feed) )
+		$feed = get_default_feed();
+
+	if ( '' == $permalink_structure ) {
+		$link = get_option('home') . "?feed=$feed&amp;tag=" . $tag->slug;
+	} else {
+		$link = get_tag_link($tag->term_id);
+		if ( $feed == get_default_feed() )
+			$feed_link = 'feed';
+		else
+			$feed_link = "feed/$feed";
+		$link = $link . user_trailingslashit($feed_link, 'feed');
+	}
+
+	$link = apply_filters('tag_feed_link', $link, $feed);
+
+	return $link;
+}
+
+function get_search_feed_link($search_query = '', $feed = '') {
+	if ( empty($search_query) )
+		$search = attribute_escape(get_search_query());
+	else
+		$search = attribute_escape(stripslashes($search_query));
+
+	if ( empty($feed) )
+		$feed = get_default_feed();
+
+	$link = get_option('home') . "?s=$search&amp;feed=$feed";
+
+	$link = apply_filters('search_feed_link', $link);
+
+	return $link;
+}
+
+function get_search_comments_feed_link($search_query = '', $feed = '') {
+	if ( empty($search_query) )
+		$search = attribute_escape(get_search_query());
+	else
+		$search = attribute_escape(stripslashes($search_query));
+
+	if ( empty($feed) )
+		$feed = get_default_feed();
+
+	$link = get_option('home') . "?s=$search&amp;feed=comments-$feed";
+
+	$link = apply_filters('search_feed_link', $link);
+
+	return $link;
+}
 
-	if ( is_attachment() )
+function get_edit_post_link( $id = 0 ) {
+	if ( !$post = &get_post( $id ) )
 		return;
 
-	if( $post->post_type == 'page' ) {
-		if ( ! current_user_can('edit_page', $post->ID) )
+	switch ( $post->post_type ) :
+	case 'page' :
+		if ( !current_user_can( 'edit_page', $post->ID ) )
 			return;
 		$file = 'page';
-	} else {
-		if ( ! current_user_can('edit_post', $post->ID) )
+		$var  = 'post';
+		break;
+	case 'attachment' :
+		if ( !current_user_can( 'edit_post', $post->ID ) )
+			return;
+		$file = 'media';
+		$var  = 'attachment_id';
+		break;
+	default :
+		if ( !current_user_can( 'edit_post', $post->ID ) )
 			return;
 		$file = 'post';
-	}
-
-	$location = get_option('siteurl') . "/wp-admin/{$file}.php?action=edit&amp;post=$post->ID";
-	echo $before . "<a href=\"$location\">$link</a>" . $after;
+		$var  = 'post';
+		break;
+	endswitch;
+	
+	return apply_filters( 'get_edit_post_link', get_bloginfo( 'wpurl' ) . "/wp-admin/$file.php?action=edit&amp;$var=$post->ID", $post->ID );
 }
 
-function edit_comment_link($link = 'Edit This', $before = '', $after = '') {
-	global $post, $comment;
+function edit_post_link( $link = 'Edit This', $before = '', $after = '' ) {
+	global $post;
 
-	if( $post->post_type == 'page' ){
-		if ( ! current_user_can('edit_page', $post->ID) )
+	if ( $post->post_type == 'page' ) {
+		if ( !current_user_can( 'edit_page', $post->ID ) )
 			return;
 	} else {
-		if ( ! current_user_can('edit_post', $post->ID) )
+		if ( !current_user_can( 'edit_post', $post->ID ) )
 			return;
 	}
 
-	$location = get_option('siteurl') . "/wp-admin/comment.php?action=editcomment&amp;c=$comment->comment_ID";
-	echo $before . "<a href='$location'>$link</a>" . $after;
+	$link = '<a href="' . get_edit_post_link( $post->ID ) . '" title="' . __( 'Edit post' ) . '">' . $link . '</a>';
+	echo $before . apply_filters( 'edit_post_link', $link, $post->ID ) . $after;
 }
 
-// Navigation links
+function get_edit_comment_link( $comment_id = 0 ) {
+	$comment = &get_comment( $comment_id );
+	$post = &get_post( $comment->comment_post_ID );
 
-function get_previous_post($in_same_cat = false, $excluded_categories = '') {
-	global $post, $wpdb;
+	if ( $post->post_type == 'page' ) {
+		if ( !current_user_can( 'edit_page', $post->ID ) )
+			return;
+	} else {
+		if ( !current_user_can( 'edit_post', $post->ID ) )
+			return;
+	}
 
-	if( !is_single() || is_attachment() )
-		return null;
+	$location = get_bloginfo( 'wpurl' ) . '/wp-admin/comment.php?action=editcomment&amp;c=' . $comment->comment_ID;
+	return apply_filters( 'get_edit_comment_link', $location );
+}
 
-	$current_post_date = $post->post_date;
+function edit_comment_link( $link = 'Edit This', $before = '', $after = '' ) {
+	global $comment, $post;
 
-	$join = '';
-	if ( $in_same_cat ) {
-		$join = " INNER JOIN $wpdb->post2cat ON $wpdb->posts.ID= $wpdb->post2cat.post_id ";
-		$cat_array = get_the_category($post->ID);
-		$join .= ' AND (category_id = ' . intval($cat_array[0]->cat_ID);
-		for ( $i = 1; $i < (count($cat_array)); $i++ ) {
-			$join .= ' OR category_id = ' . intval($cat_array[$i]->cat_ID);
-		}
-		$join .= ')';
+	if ( $post->post_type == 'attachment' ) {
+	} elseif ( $post->post_type == 'page' ) {
+		if ( !current_user_can( 'edit_page', $post->ID ) )
+			return;
+	} else {
+		if ( !current_user_can( 'edit_post', $post->ID ) )
+			return;
 	}
 
-	$sql_exclude_cats = '';
-	if ( !empty($excluded_categories) ) {
-		$blah = explode(' and ', $excluded_categories);
-		foreach ( $blah as $category ) {
-			$category = intval($category);
-			$sql_cat_ids = " OR pc.category_ID = '$category'";
-		}
-		$posts_in_ex_cats = $wpdb->get_col("SELECT p.ID FROM $wpdb->posts p LEFT JOIN $wpdb->post2cat pc ON pc.post_id=p.ID WHERE 1 = 0 $sql_cat_ids GROUP BY p.ID");
-		$posts_in_ex_cats_sql = 'AND ID NOT IN (' . implode($posts_in_ex_cats, ',') . ')';
-	}
+	$link = '<a href="' . get_edit_comment_link( $comment->comment_ID ) . '" title="' . __( 'Edit comment' ) . '">' . $link . '</a>';
+	echo $before . apply_filters( 'edit_comment_link', $link, $comment->comment_ID ) . $after;
+}
 
-	$join  = apply_filters( 'get_previous_post_join', $join, $in_same_cat, $excluded_categories );
-	$where = apply_filters( 'get_previous_post_where', "WHERE post_date < '$current_post_date' AND post_type = 'post' AND post_status = 'publish' $posts_in_ex_cats_sql", $in_same_cat, $excluded_categories );
-	$sort  = apply_filters( 'get_previous_post_sort', 'ORDER BY post_date DESC LIMIT 1' );
+// Navigation links
 
-	return @$wpdb->get_row("SELECT ID, post_title FROM $wpdb->posts $join $where $sort");
+function get_previous_post($in_same_cat = false, $excluded_categories = '') {
+	return get_adjacent_post($in_same_cat, $excluded_categories);
 }
 
 function get_next_post($in_same_cat = false, $excluded_categories = '') {
+	return get_adjacent_post($in_same_cat, $excluded_categories, false);
+}
+
+function get_adjacent_post($in_same_cat = false, $excluded_categories = '', $previous = true) {
 	global $post, $wpdb;
 
-	if( !is_single() || is_attachment() )
+	if( empty($post) || !is_single() || is_attachment() )
 		return null;
 
 	$current_post_date = $post->post_date;
 
 	$join = '';
-	if ( $in_same_cat ) {
-		$join = " INNER JOIN $wpdb->post2cat ON $wpdb->posts.ID= $wpdb->post2cat.post_id ";
-		$cat_array = get_the_category($post->ID);
-		$join .= ' AND (category_id = ' . intval($cat_array[0]->cat_ID);
-		for ( $i = 1; $i < (count($cat_array)); $i++ ) {
-			$join .= ' OR category_id = ' . intval($cat_array[$i]->cat_ID);
+	$posts_in_ex_cats_sql = '';
+	if ( $in_same_cat || !empty($excluded_categories) ) {
+		$join = " INNER JOIN $wpdb->term_relationships AS tr ON p.ID = tr.object_id INNER JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id";
+
+		if ( $in_same_cat ) {
+			$cat_array = wp_get_object_terms($post->ID, 'category', 'fields=ids');
+			$join .= " AND tt.taxonomy = 'category' AND tt.term_id IN (" . implode($cat_array, ',') . ')';
 		}
-		$join .= ')';
-	}
 
-	$sql_exclude_cats = '';
-	if ( !empty($excluded_categories) ) {
-		$blah = explode(' and ', $excluded_categories);
-		foreach ( $blah as $category ) {
-			$category = intval($category);
-			$sql_cat_ids = " OR pc.category_ID = '$category'";
+		$posts_in_ex_cats_sql = "AND tt.taxonomy = 'category'";
+		if ( !empty($excluded_categories) ) {
+			$excluded_categories = array_map('intval', explode(' and ', $excluded_categories));
+			if ( !empty($cat_array) ) {
+				$excluded_categories = array_diff($excluded_categories, $cat_array);
+				$posts_in_ex_cats_sql = '';
+			}
+
+			if ( !empty($excluded_categories) ) {
+				$posts_in_ex_cats_sql = " AND tt.term_id NOT IN (" . implode($excluded_categories, ',') . ')';
+			}
 		}
-		$posts_in_ex_cats = $wpdb->get_col("SELECT p.ID from $wpdb->posts p LEFT JOIN $wpdb->post2cat pc ON pc.post_id = p.ID WHERE 1 = 0 $sql_cat_ids GROUP BY p.ID");
-		$posts_in_ex_cats_sql = 'AND ID NOT IN (' . implode($posts_in_ex_cats, ',') . ')';
 	}
 
-	$join  = apply_filters( 'get_next_post_join', $join, $in_same_cat, $excluded_categories );
-	$where = apply_filters( 'get_next_post_where', "WHERE post_date > '$current_post_date' AND post_type = 'post' AND post_status = 'publish' $posts_in_ex_cats_sql AND ID != $post->ID", $in_same_cat, $excluded_categories );
-	$sort  = apply_filters( 'get_next_post_sort', 'ORDER BY post_date ASC LIMIT 1' );
+	$adjacent = $previous ? 'previous' : 'next';
+	$op = $previous ? '<' : '>';
+	$order = $previous ? 'DESC' : 'ASC';
+
+	$join  = apply_filters( "get_{$adjacent}_post_join", $join, $in_same_cat, $excluded_categories );
+	$where = apply_filters( "get_{$adjacent}_post_where", $wpdb->prepare("WHERE p.post_date $op %s AND p.post_type = 'post' AND p.post_status = 'publish' $posts_in_ex_cats_sql", $current_post_date), $in_same_cat, $excluded_categories );
+	$sort  = apply_filters( "get_{$adjacent}_post_sort", "ORDER BY p.post_date $order LIMIT 1" );
 
-	return @$wpdb->get_row("SELECT ID, post_title FROM $wpdb->posts $join $where $sort");
+	return $wpdb->get_row("SELECT p.* FROM $wpdb->posts AS p $join $where $sort");
 }
 
-
 function previous_post_link($format='&laquo; %link', $link='%title', $in_same_cat = false, $excluded_categories = '') {
+	adjacent_post_link($format, $link, $in_same_cat, $excluded_categories, true);
+}
+
+function next_post_link($format='%link &raquo;', $link='%title', $in_same_cat = false, $excluded_categories = '') {
+	adjacent_post_link($format, $link, $in_same_cat, $excluded_categories, false);
+}
 
-	if ( is_attachment() )
+function adjacent_post_link($format, $link, $in_same_cat = false, $excluded_categories = '', $previous = true) {
+	if ( $previous && is_attachment() )
 		$post = & get_post($GLOBALS['post']->post_parent);
 	else
-		$post = get_previous_post($in_same_cat, $excluded_categories);
+		$post = get_adjacent_post($in_same_cat, $excluded_categories, $previous);
 
 	if ( !$post )
 		return;
 
-	$title = apply_filters('the_title', $post->post_title, $post);
-	$string = '<a href="'.get_permalink($post->ID).'">';
-	$link = str_replace('%title', $title, $link);
-	$link = $pre . $string . $link . '</a>';
-
-	$format = str_replace('%link', $link, $format);
+	$title = $post->post_title;
 
-	echo $format;
-}
-
-function next_post_link($format='%link &raquo;', $link='%title', $in_same_cat = false, $excluded_categories = '') {
-	$post = get_next_post($in_same_cat, $excluded_categories);
-
-	if ( !$post )
-		return;
+	if ( empty($post->post_title) )
+		$title = $previous ? __('Previous Post') : __('Next Post');
 
-	$title = apply_filters('the_title', $post->post_title, $post);
-	$string = '<a href="'.get_permalink($post->ID).'">';
+	$title = apply_filters('the_title', $title, $post);
+	$string = '<a href="'.get_permalink($post).'">';
 	$link = str_replace('%title', $title, $link);
 	$link = $string . $link . '</a>';
+
 	$format = str_replace('%link', $link, $format);
 
 	echo $format;
@@ -425,78 +605,59 @@
 function get_pagenum_link($pagenum = 1) {
 	global $wp_rewrite;
 
-	$qstr = $_SERVER['REQUEST_URI'];
+	$pagenum = (int) $pagenum;
 
-	$page_querystring = "paged";
-	$page_modstring = "page/";
-	$page_modregex = "page/?";
-	$permalink = 0;
+	$request = remove_query_arg( 'paged' );
 
 	$home_root = parse_url(get_option('home'));
-	$home_root = $home_root['path'];
-	$home_root = trailingslashit($home_root);
-	$qstr = preg_replace('|^'. $home_root . '|', '', $qstr);
-	$qstr = preg_replace('|^/+|', '', $qstr);
-
-	$index = $_SERVER['PHP_SELF'];
-	$index = preg_replace('|^'. $home_root . '|', '', $index);
-	$index = preg_replace('|^/+|', '', $index);
-
-	// if we already have a QUERY style page string
-	if ( stripos( $qstr, $page_querystring ) !== false ) {
-		$replacement = "$page_querystring=$pagenum";
-		$qstr = preg_replace("/".$page_querystring."[^\d]+\d+/", $replacement, $qstr);
-		// if we already have a mod_rewrite style page string
-	} elseif ( preg_match( '|'.$page_modregex.'\d+|', $qstr ) ) {
-		$permalink = 1;
-		$qstr = preg_replace('|'.$page_modregex.'\d+|',"$page_modstring$pagenum",$qstr);
-
-		// if we don't have a page string at all ...
-		// lets see what sort of URL we have...
-	} else {
-		// we need to know the way queries are being written
-		// if there's a querystring_start (a "?" usually), it's definitely not mod_rewritten
-		if ( stripos( $qstr, '?' ) !== false ) {
-			// so append the query string (using &, since we already have ?)
-			$qstr .=	'&amp;' . $page_querystring . '=' . $pagenum;
-			// otherwise, it could be rewritten, OR just the default index ...
-		} elseif( '' != get_option('permalink_structure') && ! is_admin() ) {
-			$permalink = 1;
-			$index = $wp_rewrite->index;
-			// If it's not a path info permalink structure, trim the index.
-			if ( !$wp_rewrite->using_index_permalinks() ) {
-				$qstr = preg_replace("#/*" . $index . "/*#", '/', $qstr);
-			} else {
-				// If using path info style permalinks, make sure the index is in
-				// the URL.
-				if ( strpos($qstr, $index) === false )
-					$qstr = '/' . $index . $qstr;
-			}
+	$home_root = ( isset($home_root['path']) ) ? $home_root['path'] : '';
+	$home_root = preg_quote( trailingslashit( $home_root ), '|' );
+
+	$request = preg_replace('|^'. $home_root . '|', '', $request);
+	$request = preg_replace('|^/+|', '', $request);
+
+	if ( !$wp_rewrite->using_permalinks() || is_admin() ) {
+		$base = trailingslashit( get_bloginfo( 'home' ) );
 
-			$qstr =	trailingslashit($qstr) . $page_modstring . $pagenum;
+		if ( $pagenum > 1 ) {
+			$result = add_query_arg( 'paged', $pagenum, $base . $request );
 		} else {
-			$qstr = $index . '?' . $page_querystring . '=' . $pagenum;
+			$result = $base . $request;
 		}
-	}
+	} else {
+		$qs_regex = '|\?.*?$|';
+		preg_match( $qs_regex, $request, $qs_match );
 
-	$qstr = preg_replace('|^/+|', '', $qstr);
-	if ( $permalink )
-		$qstr = user_trailingslashit($qstr, 'paged');
+		if ( !empty( $qs_match[0] ) ) {
+			$query_string = $qs_match[0];
+			$request = preg_replace( $qs_regex, '', $request );
+		} else {
+			$query_string = '';
+		}
 
-	// showing /page/1/ or ?paged=1 is redundant
-	if ( 1 === $pagenum ) {
-		$qstr = str_replace(user_trailingslashit('index.php/page/1', 'paged'), '', $qstr); // for PATHINFO style
-		$qstr = str_replace(user_trailingslashit('page/1', 'paged'), '', $qstr); // for mod_rewrite style
-		$qstr = remove_query_arg('paged', $qstr); // for query style
+		$request = preg_replace( '|page/\d+/?$|', '', $request);
+		$request = preg_replace( '|^index\.php|', '', $request);
+		$request = ltrim($request, '/');
+
+		$base = trailingslashit( get_bloginfo( 'url' ) );
+
+		if ( $wp_rewrite->using_index_permalinks() && ( $pagenum > 1 || '' != $request ) )
+			$base .= 'index.php/';
+
+		if ( $pagenum > 1 ) {
+			$request = ( ( !empty( $request ) ) ? trailingslashit( $request ) : $request ) . user_trailingslashit( 'page/' . $pagenum, 'paged' );
+		}
+
+		$result = $base . $request . $query_string;
 	}
 
-	$qstr = preg_replace('/&([^#])(?![a-z]{1,8};)/', '&#038;$1', trailingslashit( get_option('home') ) . $qstr );
+	$result = apply_filters('get_pagenum_link', $result);
 
-	return $qstr;
+	return $result;
 }
 
 function get_next_posts_page_link($max_page = 0) {
-	global $paged, $pagenow;
+	global $paged;
 
 	if ( !is_single() ) {
 		if ( !$paged )
@@ -512,7 +673,7 @@
 }
 
 function next_posts_link($label='Next Page &raquo;', $max_page=0) {
-	global $paged, $wpdb, $wp_query;
+	global $paged, $wp_query;
 	if ( !$max_page ) {
 		$max_page = $wp_query->max_num_pages;
 	}
@@ -527,7 +688,7 @@
 }
 
 function get_previous_posts_page_link() {
-	global $paged, $pagenow;
+	global $paged;
 
 	if ( !is_single() ) {
 		$nextpage = intval($paged) - 1;
diff -x .svn -aruN 2.2.2.src/wp-includes/locale.php 2.5.src/wp-includes/locale.php
--- 2.2.2.src/wp-includes/locale.php	2007-03-19 14:08:15.000000000 -0500
+++ 2.5.src/wp-includes/locale.php	2008-01-10 11:28:50.000000000 -0600
@@ -1,20 +1,110 @@
 <?php
-
-// Date and Time
-
+/**
+ * Date and Time Locale object
+ *
+ * @package WordPress
+ * @subpackage i18n
+ */
+
+/**
+ * {@internal Missing Short Description}}
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @since 2.1.0
+ */
 class WP_Locale {
+	/**
+	 * Stores the translated strings for the full weekday names.
+	 *
+	 * @since 2.1.0
+	 * @var array
+	 * @access private
+	 */
 	var $weekday;
+
+	/**
+	 * Stores the translated strings for the one character weekday names.
+	 *
+	 * There is a hack to make sure that Tuesday and Thursday, as well
+	 * as Sunday and Saturday don't conflict. See init() method for more.
+	 *
+	 * @see WP_Locale::init() for how to handle the hack.
+	 *
+	 * @since 2.1.0
+	 * @var array
+	 * @access private
+	 */
 	var $weekday_initial;
+
+	/**
+	 * Stores the translated strings for the abbreviated weekday names.
+	 *
+	 * @since 2.1.0
+	 * @var array
+	 * @access private
+	 */
 	var $weekday_abbrev;
 
+	/**
+	 * Stores the translated strings for the full month names.
+	 *
+	 * @since 2.1.0
+	 * @var array
+	 * @access private
+	 */
 	var $month;
+
+	/**
+	 * Stores the translated strings for the abbreviated month names.
+	 *
+	 * @since 2.1.0
+	 * @var array
+	 * @access private
+	 */
 	var $month_abbrev;
 
+	/**
+	 * Stores the translated strings for 'am' and 'pm'.
+	 *
+	 * Also the capalized versions.
+	 *
+	 * @since 2.1.0
+	 * @var array
+	 * @access private
+	 */
 	var $meridiem;
 
+	/**
+	 * The text direction of the locale language.
+	 *
+	 * Default is left to right 'ltr'.
+	 *
+	 * @since 2.1.0
+	 * @var string
+	 * @access private
+	 */
 	var $text_direction = 'ltr';
+
+	/**
+	 * Imports the global version to the class property.
+	 *
+	 * @since 2.1.0
+	 * @var array
+	 * @access private
+	 */
 	var $locale_vars = array('text_direction');
 
+	/**
+	 * Sets up the translated strings and object properties.
+	 *
+	 * The method creates the translatable strings for various
+	 * calendar elements. Which allows for specifying locale
+	 * specific calendar names and text direction.
+	 *
+	 * @since 2.1.0
+	 * @access private
+	 */
 	function init() {
 		// The Weekdays
 		$this->weekday[0] = __('Sunday');
@@ -87,6 +177,18 @@
 		$this->meridiem['AM'] = __('AM');
 		$this->meridiem['PM'] = __('PM');
 
+		// Numbers formatting
+		// See http://php.net/number_format
+
+		$trans = _c('number_format_decimals|$decimals argument for http://php.net/number_format, default is 0');
+		$this->number_format['decimals'] = ('number_format_decimals' == $trans) ? 0 : $trans;
+
+		$trans = _c('number_format_decimal_point|$dec_point argument for http://php.net/number_format, default is .');
+		$this->number_format['decimal_point'] = ('number_format_decimal_point' == $trans) ? '.' : $trans;
+
+		$trans = _c('number_format_thousands_sep|$thousands_sep argument for http://php.net/number_format, default is ,');
+		$this->number_format['thousands_sep'] = ('number_format_thousands_sep' == $trans) ? ',' : $trans;
+
 		// Import global locale vars set during inclusion of $locale.php.
 		foreach ( $this->locale_vars as $var ) {
 			if ( isset($GLOBALS[$var]) )
@@ -95,35 +197,117 @@
 
 	}
 
+	/**
+	 * Retrieve the full translated weekday word.
+	 *
+	 * Week starts on translated Sunday and can be fetched
+	 * by using 0 (zero). So the week starts with 0 (zero)
+	 * and ends on Saturday with is fetched by using 6 (six).
+	 *
+	 * @since 2.1.0
+	 * @access public
+	 *
+	 * @param int $weekday_number 0 for Sunday through 6 Saturday
+	 * @return string Full translated weekday
+	 */
 	function get_weekday($weekday_number) {
 		return $this->weekday[$weekday_number];
 	}
 
+	/**
+	 * Retrieve the translated weekday initial.
+	 *
+	 * The weekday initial is retrieved by the translated
+	 * full weekday word. When translating the weekday initial
+	 * pay attention to make sure that the starting letter does
+	 * not conflict.
+	 *
+	 * @since 2.1.0
+	 * @access public
+	 *
+	 * @param string $weekday_name
+	 * @return string
+	 */
 	function get_weekday_initial($weekday_name) {
 		return $this->weekday_initial[$weekday_name];
 	}
 
+	/**
+	 * Retrieve the translated weekday abbreviation.
+	 *
+	 * The weekday abbreviation is retrieved by the translated
+	 * full weekday word.
+	 *
+	 * @since 2.1.0
+	 * @access public
+	 *
+	 * @param string $weekday_name Full translated weekday word
+	 * @return string Translated weekday abbreviation
+	 */
 	function get_weekday_abbrev($weekday_name) {
 		return $this->weekday_abbrev[$weekday_name];
 	}
 
+	/**
+	 * Retrieve the full translated month by month number.
+	 *
+	 * The $month_number parameter has to be a string
+	 * because it must have the '0' in front of any number
+	 * that is less than 10. Starts from '01' and ends at
+	 * '12'.
+	 *
+	 * You can use an integer instead and it will add the
+	 * '0' before the numbers less than 10 for you.
+	 *
+	 * @since 2.1.0
+	 * @access public
+	 *
+	 * @param string|int $month_number '01' through '12'
+	 * @return string Translated full month name
+	 */
 	function get_month($month_number) {
 		return $this->month[zeroise($month_number, 2)];
 	}
 
-	function get_month_initial($month_name) {
-		return $this->month_initial[$month_name];
-	}
-
+	/**
+	 * Retrieve translated version of month abbreviation string.
+	 *
+	 * The $month_name parameter is expected to be the translated or
+	 * translatable version of the month.
+	 *
+	 * @since 2.1.0
+	 * @access public
+	 *
+	 * @param string $month_name Translated month to get abbreviated version
+	 * @return string Translated abbreviated month
+	 */
 	function get_month_abbrev($month_name) {
 		return $this->month_abbrev[$month_name];
 	}
 
+	/**
+	 * Retrieve translated version of meridiem string.
+	 *
+	 * The $meridiem parameter is expected to not be translated.
+	 *
+	 * @since 2.1.0
+	 * @access public
+	 *
+	 * @param string $meridiem Either 'am', 'pm', 'AM', or 'PM'. Not translated version.
+	 * @return string Translated version
+	 */
 	function get_meridiem($meridiem) {
 		return $this->meridiem[$meridiem];
 	}
 
-	// Global variables are deprecated. For backwards compatibility only.
+	/**
+	 * Global variables are deprecated. For backwards compatibility only.
+	 *
+	 * @deprecated For backwards compatibility only.
+	 * @access private
+	 *
+	 * @since 2.1.0
+	 */
 	function register_globals() {
 		$GLOBALS['weekday']         = $this->weekday;
 		$GLOBALS['weekday_initial'] = $this->weekday_initial;
@@ -132,10 +316,19 @@
 		$GLOBALS['month_abbrev']    = $this->month_abbrev;
 	}
 
+	/**
+	 * PHP4 style constructor which calls helper methods to set up object variables
+	 *
+	 * @uses WP_Locale::init()
+	 * @uses WP_Locale::register_globals()
+	 * @since 2.1.0
+	 *
+	 * @return WP_Locale
+	 */
 	function WP_Locale() {
 		$this->init();
 		$this->register_globals();
 	}
 }
 
-?>
\ No newline at end of file
+?>
diff -x .svn -aruN 2.2.2.src/wp-includes/media.php 2.5.src/wp-includes/media.php
--- 2.2.2.src/wp-includes/media.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/media.php	2008-03-26 01:37:19.000000000 -0500
@@ -0,0 +1,472 @@
+<?php
+
+// functions for media display
+
+// scale down the default size of an image so it's a better fit for the editor and theme
+function image_constrain_size_for_editor($width, $height, $size = 'medium') {
+
+	if ( is_array($size) ) {
+		$max_width = $size[0];
+		$max_height = $size[1];
+	}
+	elseif ( $size == 'thumb' || $size == 'thumbnail' ) {
+		$max_width = intval(get_option('thumbnail_size_w'));
+		$max_height = intval(get_option('thumbnail_size_h'));
+		// last chance thumbnail size defaults
+		if ( !$max_width && !$max_height ) {
+			$max_width = 128;
+			$max_height = 96;
+		}
+	}
+	elseif ( $size == 'medium' ) {
+		$max_width = intval(get_option('medium_size_w'));
+		$max_height = intval(get_option('medium_size_h'));
+		// if no width is set, default to the theme content width if available
+	}
+	else { // $size == 'full'
+		// we're inserting a full size image into the editor.  if it's a really big image we'll scale it down to fit reasonably
+		// within the editor itself, and within the theme's content width if it's known.  the user can resize it in the editor
+		// if they wish.
+		if ( !empty($GLOBALS['content_width']) ) {
+			$max_width = $GLOBALS['content_width'];
+		}
+		else
+			$max_width = 500;
+	}
+
+	list( $max_width, $max_height ) = apply_filters( 'editor_max_image_size', array( $max_width, $max_height ), $size );
+
+	return wp_constrain_dimensions( $width, $height, $max_width, $max_height );
+}
+
+// return a width/height string for use in an <img /> tag.  Empty values will be omitted.
+function image_hwstring($width, $height) {
+	$out = '';
+	if ($width)
+		$out .= 'width="'.intval($width).'" ';
+	if ($height)
+		$out .= 'height="'.intval($height).'" ';
+	return $out;
+}
+
+// Scale an image to fit a particular size (such as 'thumb' or 'medium'), and return an image URL, height and width.
+// The URL might be the original image, or it might be a resized version.  This function won't create a new resized copy, it will just return an already resized one if it exists.
+// returns an array($url, $width, $height)
+function image_downsize($id, $size = 'medium') {
+
+	if ( !wp_attachment_is_image($id) )
+		return false;
+
+	$img_url = wp_get_attachment_url($id);
+	$meta = wp_get_attachment_metadata($id);
+	$width = $height = 0;
+
+	// plugins can use this to provide resize services
+	if ( $out = apply_filters('image_downsize', false, $id, $size) )
+		return $out;
+
+	// try for a new style intermediate size
+	if ( $intermediate = image_get_intermediate_size($id, $size) ) {
+		$img_url = str_replace(basename($img_url), $intermediate['file'], $img_url);
+		$width = $intermediate['width'];
+		$height = $intermediate['height'];
+	}
+	elseif ( $size == 'thumbnail' ) {
+		// fall back to the old thumbnail
+		if ( $thumb_file = wp_get_attachment_thumb_file() && $info = getimagesize($thumb_file) ) {
+			$img_url = str_replace(basename($img_url), basename($thumb_file), $img_url);
+			$width = $info[0];
+			$height = $info[1];
+		}
+	}
+	if ( !$width && !$height && isset($meta['width'], $meta['height']) ) {
+		// any other type: use the real image and constrain it
+		list( $width, $height ) = image_constrain_size_for_editor( $meta['width'], $meta['height'], $size );
+	}
+
+	if ( $img_url)
+		return array( $img_url, $width, $height );
+	return false;
+
+}
+
+// return an <img src /> tag for the given image attachment, scaling it down if requested
+function get_image_tag($id, $alt, $title, $align, $size='medium') {
+
+	list( $img_src, $width, $height ) = image_downsize($id, $size);
+	$hwstring = image_hwstring($width, $height);
+
+	$html = '<img src="'.attribute_escape($img_src).'" alt="'.attribute_escape($alt).'" title="'.attribute_escape($title).'" '.$hwstring.'class="align'.attribute_escape($align).' size-'.attribute_escape($size).' wp-image-'.$id.'" />';
+
+	$html = apply_filters( 'image_send_to_editor', $html, $id, $alt, $title, $align, $url );
+
+	return $html;
+}
+
+// same as wp_shrink_dimensions, except the max parameters are optional.
+// if either width or height are empty, no constraint is applied on that dimension.
+function wp_constrain_dimensions( $current_width, $current_height, $max_width=0, $max_height=0 ) {
+	if ( !$max_width and !$max_height )
+		return array( $current_width, $current_height );
+
+	$width_ratio = $height_ratio = 1.0;
+
+	if ( $max_width > 0 && $current_width > $max_width )
+		$width_ratio = $max_width / $current_width;
+
+	if ( $max_height > 0 && $current_height > $max_height )
+		$height_ratio = $max_height / $current_height;
+
+	// the smaller ratio is the one we need to fit it to the constraining box
+	$ratio = min( $width_ratio, $height_ratio );
+
+	return array( intval($current_width * $ratio), intval($current_height * $ratio) );
+}
+
+// calculate dimensions and coordinates for a resized image that fits within a specified width and height
+// if $crop is true, the largest matching central portion of the image will be cropped out and resized to the required size
+function image_resize_dimensions($orig_w, $orig_h, $dest_w, $dest_h, $crop=false) {
+
+	if ($orig_w <= 0 || $orig_h <= 0)
+		return false;
+	// at least one of dest_w or dest_h must be specific
+	if ($dest_w <= 0 && $dest_h <= 0)
+		return false;
+
+	if ( $crop ) {
+		// crop the largest possible portion of the original image that we can size to $dest_w x $dest_h
+		$aspect_ratio = $orig_w / $orig_h;
+		$new_w = min($dest_w, $orig_w);
+		$new_h = min($dest_h, $orig_h);
+		if (!$new_w) {
+			$new_w = intval($new_h * $aspect_ratio);
+		}
+		if (!$new_h) {
+			$new_h = intval($new_w / $aspect_ratio);
+		}
+
+		$size_ratio = max($new_w / $orig_w, $new_h / $orig_h);
+
+		$crop_w = ceil($new_w / $size_ratio);
+		$crop_h = ceil($new_h / $size_ratio);
+
+		$s_x = floor(($orig_w - $crop_w)/2);
+		$s_y = floor(($orig_h - $crop_h)/2);
+	}
+	else {
+		// don't crop, just resize using $dest_w x $dest_h as a maximum bounding box
+		$crop_w = $orig_w;
+		$crop_h = $orig_h;
+
+		$s_x = 0;
+		$s_y = 0;
+
+		list( $new_w, $new_h ) = wp_constrain_dimensions( $orig_w, $orig_h, $dest_w, $dest_h );
+	}
+
+	// if the resulting image would be the same size or larger we don't want to resize it
+	if ($new_w >= $orig_w && $new_h >= $orig_h)
+		return false;
+
+	// the return array matches the parameters to imagecopyresampled()
+	// int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h
+	return array(0, 0, $s_x, $s_y, $new_w, $new_h, $crop_w, $crop_h);
+
+}
+
+// Scale down an image to fit a particular size and save a new copy of the image
+function image_resize( $file, $max_w, $max_h, $crop=false, $suffix=null, $dest_path=null, $jpeg_quality=90) {
+
+	$image = wp_load_image( $file );
+	if ( !is_resource( $image ) )
+		return new WP_Error('error_loading_image', $image);
+
+	list($orig_w, $orig_h, $orig_type) = getimagesize( $file );
+	$dims = image_resize_dimensions($orig_w, $orig_h, $max_w, $max_h, $crop);
+	if (!$dims)
+		return $dims;
+	list($dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) = $dims;
+
+	$newimage = imagecreatetruecolor( $dst_w, $dst_h);
+
+	// preserve PNG transparency
+	if ( IMAGETYPE_PNG == $orig_type && function_exists( 'imagealphablending' ) && function_exists( 'imagesavealpha' ) ) {
+		imagealphablending( $newimage, false);
+		imagesavealpha( $newimage, true);
+	}
+
+	imagecopyresampled( $newimage, $image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h);
+
+	// we don't need the original in memory anymore
+	imagedestroy( $image );
+
+	// $suffix will be appended to the destination filename, just before the extension
+	if ( !$suffix )
+		$suffix = "{$dst_w}x{$dst_h}";
+
+	$info = pathinfo($file);
+	$dir = $info['dirname'];
+	$ext = $info['extension'];
+	$name = basename($file, ".{$ext}");
+	if ( !is_null($dest_path) and $_dest_path = realpath($dest_path) )
+		$dir = $_dest_path;
+	$destfilename = "{$dir}/{$name}-{$suffix}.{$ext}";
+
+	if ( $orig_type == IMAGETYPE_GIF ) {
+		if (!imagegif( $newimage, $destfilename ) )
+			return new WP_Error('resize_path_invalid', __( 'Resize path invalid' ));
+	}
+	elseif ( $orig_type == IMAGETYPE_PNG ) {
+		if (!imagepng( $newimage, $destfilename ) )
+			return new WP_Error('resize_path_invalid', __( 'Resize path invalid' ));
+	}
+	else {
+		// all other formats are converted to jpg
+		$destfilename = "{$dir}/{$name}-{$suffix}.jpg";
+		if (!imagejpeg( $newimage, $destfilename, apply_filters( 'jpeg_quality', $jpeg_quality ) ) )
+			return new WP_Error('resize_path_invalid', __( 'Resize path invalid' ));
+	}
+
+	imagedestroy( $newimage );
+
+	// Set correct file permissions
+	$stat = stat( dirname( $destfilename ));
+	$perms = $stat['mode'] & 0000666; //same permissions as parent folder, strip off the executable bits
+	@ chmod( $destfilename, $perms );
+
+	return $destfilename;
+}
+
+// resize an image to make a thumbnail or intermediate size, and return metadata describing the new copy
+// returns false if no image was created
+function image_make_intermediate_size($file, $width, $height, $crop=false) {
+	if ( $width || $height ) {
+		$resized_file = image_resize($file, $width, $height, $crop);
+		if ( !is_wp_error($resized_file) && $resized_file && $info = getimagesize($resized_file) ) {
+			return array(
+				'file' => basename( $resized_file ),
+				'width' => $info[0],
+				'height' => $info[1],
+			);
+		}
+	}
+	return false;
+}
+
+function image_get_intermediate_size($post_id, $size='thumbnail') {
+	if ( !$imagedata = wp_get_attachment_metadata( $post_id ) )
+		return false;
+
+	// get the best one for a specified set of dimensions
+	if ( is_array($size) && !empty($imagedata['sizes']) ) {
+		foreach ( $imagedata['sizes'] as $_size => $data ) {
+			// already cropped to width or height; so use this size
+			if ( ( $data['width'] == $size[0] && $data['height'] <= $size[1] ) || ( $data['height'] == $size[1] && $data['width'] <= $size[0] ) ) {
+				$file = $data['file'];
+				list($width, $height) = image_constrain_size_for_editor( $data['width'], $data['height'], $size );
+				return compact( 'file', 'width', 'height' );
+			}
+			// add to lookup table: area => size
+			$areas[$data['width'] * $data['height']] = $_size;
+		}
+		if ( !$size || !empty($areas) ) {
+			// find for the smallest image not smaller than the desired size
+			ksort($areas);
+			foreach ( $areas as $_size ) {
+				$data = $imagedata['sizes'][$_size];
+				if ( $data['width'] >= $size[0] || $data['height'] >= $size[1] ) {
+					$file = $data['file'];
+					list($width, $height) = image_constrain_size_for_editor( $data['width'], $data['height'], $size );
+					return compact( 'file', 'width', 'height' );
+				}
+			}
+		}
+	}
+
+	if ( is_array($size) || empty($size) || empty($imagedata['sizes'][$size]) )
+		return false;
+		
+	$data = $imagedata['sizes'][$size];
+	// include the full filesystem path of the intermediate file
+	if ( empty($data['path']) && !empty($data['file']) ) {
+		$file_url = wp_get_attachment_url($post_id);
+		$data['path'] = path_join( dirname($imagedata['file']), $data['file'] );
+		$data['url'] = path_join( dirname($file_url), $data['file'] );
+	}
+	return $data;
+}
+
+// get an image to represent an attachment - a mime icon for files, thumbnail or intermediate size for images
+// returns an array (url, width, height), or false if no image is available
+function wp_get_attachment_image_src($attachment_id, $size='thumbnail', $icon = false) {
+	
+	// get a thumbnail or intermediate image if there is one
+	if ( $image = image_downsize($attachment_id, $size) )
+		return $image;
+
+	if ( $icon && $src = wp_mime_type_icon($attachment_id) ) {
+		$icon_dir = apply_filters( 'icon_dir', ABSPATH . WPINC . '/images/crystal' );
+		$src_file = $icon_dir . '/' . basename($src);
+		@list($width, $height) = getimagesize($src_file);
+	}
+	if ( $src && $width && $height )
+		return array( $src, $width, $height );
+	return false;
+}
+
+// as per wp_get_attachment_image_src, but returns an <img> tag
+function wp_get_attachment_image($attachment_id, $size='thumbnail', $icon = false) {
+
+	$html = '';
+	$image = wp_get_attachment_image_src($attachment_id, $size, $icon);
+	if ( $image ) {
+		list($src, $width, $height) = $image;
+		$hwstring = image_hwstring($width, $height);
+		if ( is_array($size) )
+			$size = join('x', $size);
+		$html = '<img src="'.attribute_escape($src).'" '.$hwstring.'class="attachment-'.attribute_escape($size).'" />';
+	}
+	
+	return $html;
+}
+
+add_shortcode('gallery', 'gallery_shortcode');
+
+function gallery_shortcode($attr) {
+	global $post;
+
+	// Allow plugins/themes to override the default gallery template.
+	$output = apply_filters('post_gallery', '', $attr);
+	if ( $output != '' )
+		return $output;
+		
+	extract(shortcode_atts(array(
+		'orderby'    => 'menu_order ASC, ID ASC',
+		'id'         => $post->ID,
+		'itemtag'    => 'dl',
+		'icontag'    => 'dt',
+		'captiontag' => 'dd',
+		'columns'    => 3,
+		'size'       => 'thumbnail',
+	), $attr));
+
+	$id = intval($id);
+	$orderby = addslashes($orderby);
+	$attachments = get_children("post_parent=$id&post_type=attachment&post_mime_type=image&orderby=\"{$orderby}\"");
+
+	if ( empty($attachments) )
+		return '';
+
+	if ( is_feed() ) {
+		$output = "\n";
+		foreach ( $attachments as $id => $attachment )
+			$output .= wp_get_attachment_link($id, $size, true) . "\n";
+		return $output;
+	}
+
+	$listtag = tag_escape($listtag);
+	$itemtag = tag_escape($itemtag);
+	$captiontag = tag_escape($captiontag);
+	$columns = intval($columns);
+	$itemwidth = $columns > 0 ? floor(100/$columns) : 100;
+	
+	$output = apply_filters('gallery_style', "
+		<style type='text/css'>
+			.gallery {
+				margin: auto;
+			}
+			.gallery-item {
+				float: left;
+				margin-top: 10px;
+				text-align: center;
+				width: {$itemwidth}%;			}
+			.gallery img {
+				border: 2px solid #cfcfcf;
+			}
+			.gallery-caption {
+				margin-left: 0;
+			}
+		</style>
+		<!-- see gallery_shortcode() in wp-includes/media.php -->
+		<div class='gallery'>");
+
+	foreach ( $attachments as $id => $attachment ) {
+		$link = wp_get_attachment_link($id, $size, true);
+		$output .= "<{$itemtag} class='gallery-item'>";
+		$output .= "
+			<{$icontag} class='gallery-icon'>
+				$link
+			</{$icontag}>";
+		if ( $captiontag && trim($attachment->post_excerpt) ) {
+			$output .= "
+				<{$captiontag} class='gallery-caption'>
+				{$attachment->post_excerpt}
+				</{$captiontag}>";
+		}
+		$output .= "</{$itemtag}>";
+		if ( $columns > 0 && ++$i % $columns == 0 )
+			$output .= '<br style="clear: both" />';
+	}
+
+	$output .= "
+			<br style='clear: both;' >
+		</div>\n";
+
+	return $output;
+}
+
+function previous_image_link() {
+	adjacent_image_link(true);
+}
+
+function next_image_link() {
+	adjacent_image_link(false);
+}
+
+function adjacent_image_link($prev = true) {
+	global $post;
+	$post = get_post($post);
+	$attachments = array_values(get_children("post_parent=$post->post_parent&post_type=attachment&post_mime_type=image&orderby=\"menu_order ASC, ID ASC\""));
+
+	foreach ( $attachments as $k => $attachment )
+		if ( $attachment->ID == $post->ID )
+			break;
+
+	$k = $prev ? $k - 1 : $k + 1;
+
+	if ( isset($attachments[$k]) )
+		echo wp_get_attachment_link($attachments[$k]->ID, 'thumbnail', true);
+}
+
+function get_attachment_taxonomies($attachment) {
+	if ( is_int( $attachment ) )
+		$attachment = get_post($attachment);
+	else if ( is_array($attachment) )
+		$attachment = (object) $attachment;
+
+	if ( ! is_object($attachment) )
+		return array();
+
+	$filename = basename($attachment->guid);
+
+	$objects = array('attachment');
+
+	if ( false !== strpos($filename, '.') )
+		$objects[] = 'attachment:' . substr($filename, strrpos($filename, '.') + 1);
+	if ( !empty($attachment->post_mime_type) ) {
+		$objects[] = 'attachment:' . $attachment->post_mime_type;
+		if ( false !== strpos($attachment->post_mime_type, '/') )
+			foreach ( explode('/', $attachment->post_mime_type) as $token )
+				if ( !empty($token) )
+					$objects[] = "attachment:$token";
+	}
+
+	$taxonomies = array();
+	foreach ( $objects as $object )
+		if ( $taxes = get_object_taxonomies($object) )
+			$taxonomies = array_merge($taxonomies, $taxes);
+
+	return array_unique($taxonomies);
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-includes/pluggable.php 2.5.src/wp-includes/pluggable.php
--- 2.2.2.src/wp-includes/pluggable.php	2007-06-15 12:45:21.000000000 -0500
+++ 2.5.src/wp-includes/pluggable.php	2008-03-27 17:44:47.000000000 -0500
@@ -1,15 +1,47 @@
 <?php
-
-	/* These functions can be replaced via plugins.  They are loaded after
-	 plugins are loaded. */
+/**
+ * These functions can be replaced via plugins. They are loaded after
+ * plugins are loaded.
+ *
+ * @package WordPress
+ */
 
 if ( !function_exists('set_current_user') ) :
+/**
+ * set_current_user() - Populates global user information for any user
+ *
+ * Set $id to null and specify a name if you do not know a user's ID
+ *
+ * @since 2.0.1
+ * @see wp_set_current_user() An alias of wp_set_current_user()
+ *
+ * @param int|null $id User ID.
+ * @param string $name Optional. The user's username
+ * @return object returns wp_set_current_user()
+ */
 function set_current_user($id, $name = '') {
 	return wp_set_current_user($id, $name);
 }
 endif;
 
 if ( !function_exists('wp_set_current_user') ) :
+/**
+ * wp_set_current_user() - Changes the current user by ID or name
+ *
+ * Set $id to null and specify a name if you do not know a user's ID
+ *
+ * Some WordPress functionality is based on the current user and
+ * not based on the signed in user. Therefore, it opens the ability
+ * to edit and perform actions on users who aren't signed in.
+ *
+ * @since 2.0.4
+ * @global object $current_user The current user object which holds the user data.
+ * @uses do_action() Calls 'set_current_user' hook after setting the current user.
+ *
+ * @param int $id User ID
+ * @param string $name User's username
+ * @return WP_User Current user User object
+ */
 function wp_set_current_user($id, $name = '') {
 	global $current_user;
 
@@ -27,6 +59,13 @@
 endif;
 
 if ( !function_exists('wp_get_current_user') ) :
+/**
+ * wp_get_current_user() - Retrieve the current user object
+ *
+ * @since 2.0.4
+ *
+ * @return WP_User Current user WP_User object
+ */
 function wp_get_current_user() {
 	global $current_user;
 
@@ -37,6 +76,20 @@
 endif;
 
 if ( !function_exists('get_currentuserinfo') ) :
+/**
+ * get_currentuserinfo() - Populate global variables with information about the currently logged in user
+ *
+ * Will set the current user, if the current user is not set. The current
+ * user will be set to the logged in person. If no user is logged in, then
+ * it will set the current user to 0, which is invalid and won't have any
+ * permissions.
+ *
+ * @since 0.71
+ * @uses $current_user Checks if the current user is set
+ * @uses wp_validate_auth_cookie() Retrieves current logged in user.
+ *
+ * @return bool|null False on XMLRPC Request and invalid auth cookie. Null when current user set
+ */
 function get_currentuserinfo() {
 	global $current_user;
 
@@ -46,21 +99,28 @@
 	if ( ! empty($current_user) )
 		return;
 
-	if ( empty($_COOKIE[USER_COOKIE]) || empty($_COOKIE[PASS_COOKIE]) ||
-		!wp_login($_COOKIE[USER_COOKIE], $_COOKIE[PASS_COOKIE], true) ) {
+	if ( ! $user = wp_validate_auth_cookie() ) {
 		wp_set_current_user(0);
 		return false;
 	}
 
-	$user_login = $_COOKIE[USER_COOKIE];
-	wp_set_current_user(0, $user_login);
+	wp_set_current_user($user);
 }
 endif;
 
 if ( !function_exists('get_userdata') ) :
+/**
+ * get_userdata() - Retrieve user info by user ID
+ *
+ * @since 0.71
+ *
+ * @param int $user_id User ID
+ * @return bool|object False on failure, User DB row object
+ */
 function get_userdata( $user_id ) {
 	global $wpdb;
-	$user_id = (int) $user_id;
+
+	$user_id = absint($user_id);
 	if ( $user_id == 0 )
 		return false;
 
@@ -69,45 +129,39 @@
 	if ( $user )
 		return $user;
 
-	if ( !$user = $wpdb->get_row("SELECT * FROM $wpdb->users WHERE ID = '$user_id' LIMIT 1") )
+	if ( !$user = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->users WHERE ID = %d LIMIT 1", $user_id)) )
 		return false;
 
-	$wpdb->hide_errors();
-	$metavalues = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->usermeta WHERE user_id = '$user_id'");
-	$wpdb->show_errors();
-
-	if ($metavalues) {
-		foreach ( $metavalues as $meta ) {
-			$value = maybe_unserialize($meta->meta_value);
-			$user->{$meta->meta_key} = $value;
-
-			// We need to set user_level from meta, not row
-			if ( $wpdb->prefix . 'user_level' == $meta->meta_key )
-				$user->user_level = $meta->meta_value;
-		} // end foreach
-	} //end if
-
-	// For backwards compat.
-	if ( isset($user->first_name) )
-		$user->user_firstname = $user->first_name;
-	if ( isset($user->last_name) )
-		$user->user_lastname = $user->last_name;
-	if ( isset($user->description) )
-		$user->user_description = $user->description;
+	_fill_user($user);
 
-	wp_cache_add($user_id, $user, 'users');
-	wp_cache_add($user->user_login, $user_id, 'userlogins');
 	return $user;
 }
 endif;
 
 if ( !function_exists('update_user_cache') ) :
+/**
+ * update_user_cache() - Updates a users cache when overridden by a plugin
+ *
+ * Core function does nothing.
+ *
+ * @since 1.5
+ *
+ * @return bool Only returns true
+ */
 function update_user_cache() {
 	return true;
 }
 endif;
 
 if ( !function_exists('get_userdatabylogin') ) :
+/**
+ * get_userdatabylogin() - Retrieve user info by login name
+ *
+ * @since 0.71
+ *
+ * @param string $user_login User's username
+ * @return bool|object False on failure, User DB row object
+ */
 function get_userdatabylogin($user_login) {
 	global $wpdb;
 	$user_login = sanitize_user( $user_login );
@@ -116,145 +170,417 @@
 		return false;
 
 	$user_id = wp_cache_get($user_login, 'userlogins');
-	$userdata = wp_cache_get($user_id, 'users');
 
-	if ( $userdata )
-		return $userdata;
+	$user = false;
+	if ( false !== $user_id )
+		$user = wp_cache_get($user_id, 'users');
 
-	$user_login = $wpdb->escape($user_login);
+	if ( false !== $user )
+		return $user;
 
-	if ( !$user = $wpdb->get_row("SELECT * FROM $wpdb->users WHERE user_login = '$user_login'") )
+	if ( !$user = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->users WHERE user_login = %s", $user_login)) )
 		return false;
 
-	$wpdb->hide_errors();
-	$metavalues = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->usermeta WHERE user_id = '$user->ID'");
-	$wpdb->show_errors();
+	_fill_user($user);
 
-	if ($metavalues) {
-		foreach ( $metavalues as $meta ) {
-			$value = maybe_unserialize($meta->meta_value);
-			$user->{$meta->meta_key} = $value;
+	return $user;
+}
+endif;
 
-			// We need to set user_level from meta, not row
-			if ( $wpdb->prefix . 'user_level' == $meta->meta_key )
-				$user->user_level = $meta->meta_value;
-		}
-	}
+if ( !function_exists('get_user_by_email') ) :
+/**
+ * get_user_by_email() - Retrieve user info by email
+ *
+ * @since 2.5
+ *
+ * @param string $email User's email address
+ * @return bool|object False on failure, User DB row object
+ */
+function get_user_by_email($email) {
+	global $wpdb;
 
-	// For backwards compat.
-	if ( isset($user->first_name) )
-		$user->user_firstname = $user->first_name;
-	if ( isset($user->last_name) )
-		$user->user_lastname = $user->last_name;
-	if ( isset($user->description) )
-		$user->user_description = $user->description;
+	$user_id = wp_cache_get($email, 'useremail');
 
-	wp_cache_add($user->ID, $user, 'users');
-	wp_cache_add($user->user_login, $user->ID, 'userlogins');
-	return $user;
+	$user = false;
+	if ( false !== $user_id )
+		$user = wp_cache_get($user_id, 'users');
+
+	if ( false !== $user )
+		return $user;
 
+	if ( !$user = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->users WHERE user_email = %s", $email)) )
+		return false;
+
+	_fill_user($user);
+
+	return $user;
 }
 endif;
 
 if ( !function_exists( 'wp_mail' ) ) :
-function wp_mail($to, $subject, $message, $headers = '') {
+/**
+ * wp_mail() - Function to send mail, similar to PHP's mail
+ *
+ * A true return value does not automatically mean that the
+ * user received the email successfully. It just only means
+ * that the method used was able to process the request
+ * without any errors.
+ *
+ * Using the two 'wp_mail_from' and 'wp_mail_from_name' hooks
+ * allow from creating a from address like 'Name <email@address.com>'
+ * when both are set. If just 'wp_mail_from' is set, then just
+ * the email address will be used with no name.
+ *
+ * The default content type is 'text/plain' which does not
+ * allow using HTML. However, you can set the content type
+ * of the email by using the 'wp_mail_content_type' filter.
+ *
+ * The default charset is based on the charset used on the
+ * blog. The charset can be set using the 'wp_mail_charset'
+ * filter.
+ *
+ * @since 1.2.1
+ * @uses apply_filters() Calls 'wp_mail' hook on an array of all of the parameters.
+ * @uses apply_filters() Calls 'wp_mail_from' hook to get the from email address.
+ * @uses apply_filters() Calls 'wp_mail_from_name' hook to get the from address name.
+ * @uses apply_filters() Calls 'wp_mail_content_type' hook to get the email content type.
+ * @uses apply_filters() Calls 'wp_mail_charset' hook to get the email charset
+ * @uses do_action_ref_array() Calls 'phpmailer_init' hook on the reference to
+ *		phpmailer object.
+ * @uses PHPMailer
+ * @
+ *
+ * @param string $to Email address to send message
+ * @param string $subject Email subject
+ * @param string $message Message contents
+ * @param string|array $headers Optional. Additional headers.
+ * @return bool Whether the email contents were sent successfully.
+ */
+function wp_mail( $to, $subject, $message, $headers = '' ) {
+	// Compact the input, apply the filters, and extract them back out
+	extract( apply_filters( 'wp_mail', compact( 'to', 'subject', 'message', 'headers' ) ) );
+
 	global $phpmailer;
 
-	if ( !is_object( $phpmailer ) ) {
-		require_once(ABSPATH . WPINC . '/class-phpmailer.php');
-		require_once(ABSPATH . WPINC . '/class-smtp.php');
+	// (Re)create it, if it's gone missing
+	if ( !is_object( $phpmailer ) || !is_a( $phpmailer, 'PHPMailer' ) ) {
+		require_once ABSPATH . WPINC . '/class-phpmailer.php';
+		require_once ABSPATH . WPINC . '/class-smtp.php';
 		$phpmailer = new PHPMailer();
 	}
 
-	$mail = compact('to', 'subject', 'message', 'headers');
-	$mail = apply_filters('wp_mail', $mail);
-	extract($mail, EXTR_SKIP);
-
-	if ( $headers == '' ) {
-		$headers = "MIME-Version: 1.0\n" .
-			"From: " . apply_filters('wp_mail_from', "wordpress@" . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME']))) . "\n" . 
-			"Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n";
+	// Headers
+	if ( empty( $headers ) ) {
+		$headers = array();
+	} elseif ( !is_array( $headers ) ) {
+		// Explode the headers out, so this function can take both
+		// string headers and an array of headers.
+		$tempheaders = (array) explode( "\n", $headers );
+		$headers = array();
+
+		// If it's actually got contents
+		if ( !empty( $tempheaders ) ) {
+			// Iterate through the raw headers
+			foreach ( $tempheaders as $header ) {
+				if ( strpos($header, ':') === false )
+					continue;
+				// Explode them out
+				list( $name, $content ) = explode( ':', trim( $header ), 2 );
+
+				// Cleanup crew
+				$name = trim( $name );
+				$content = trim( $content );
+
+				// Mainly for legacy -- process a From: header if it's there
+				if ( 'from' == strtolower($name) ) {
+					if ( strpos($content, '<' ) !== false ) {
+						// So... making my life hard again?
+						$from_name = substr( $content, 0, strpos( $content, '<' ) - 1 );
+						$from_name = str_replace( '"', '', $from_name );
+						$from_name = trim( $from_name );
+
+						$from_email = substr( $content, strpos( $content, '<' ) + 1 );
+						$from_email = str_replace( '>', '', $from_email );
+						$from_email = trim( $from_email );
+					} else {
+						$from_name = trim( $content );
+					}
+				} elseif ( 'content-type' == strtolower($name) ) {
+					if ( strpos( $content,';' ) !== false ) {
+						list( $type, $charset ) = explode( ';', $content );
+						$content_type = trim( $type );
+						$charset = trim( str_replace( array( 'charset=', '"' ), '', $charset ) );
+					} else {
+						$content_type = trim( $content );
+					}
+				} else {
+					// Add it to our grand headers array
+					$headers[trim( $name )] = trim( $content );
+				}
+			}
+		}
 	}
 
+	// Empty out the values that may be set
 	$phpmailer->ClearAddresses();
-	$phpmailer->ClearCCs();
-	$phpmailer->ClearBCCs();
-	$phpmailer->ClearReplyTos();
 	$phpmailer->ClearAllRecipients();
+	$phpmailer->ClearAttachments();
+	$phpmailer->ClearBCCs();
+	$phpmailer->ClearCCs();
 	$phpmailer->ClearCustomHeaders();
+	$phpmailer->ClearReplyTos();
+
+	// From email and name
+	// If we don't have a name from the input headers
+	if ( !isset( $from_name ) ) {
+		$from_name = 'WordPress';
+	}
+
+	// If we don't have an email from the input headers
+	if ( !isset( $from_email ) ) {
+		// Get the site domain and get rid of www.
+		$sitename = strtolower( $_SERVER['SERVER_NAME'] );
+		if ( substr( $sitename, 0, 4 ) == 'www.' ) {
+			$sitename = substr( $sitename, 4 );
+		}
+
+		$from_email = 'wordpress@' . $sitename;
+	}
+
+	// Set the from name and email
+	$phpmailer->From = apply_filters( 'wp_mail_from', $from_email );
+	$phpmailer->FromName = apply_filters( 'wp_mail_from_name', $from_name );
 
-	$phpmailer->FromName = "WordPress";
-	$phpmailer->AddAddress("$to", "");
+	// Set destination address
+	$phpmailer->AddAddress( $to );
+
+	// Set mail's subject and body
 	$phpmailer->Subject = $subject;
-	$phpmailer->Body    = $message;
-	$phpmailer->IsHTML(false);
-	$phpmailer->IsMail(); // set mailer to use php mail()
-
-	do_action_ref_array('phpmailer_init', array(&$phpmailer));
-
-	$mailheaders = (array) explode( "\n", $headers );
-	foreach ( $mailheaders as $line ) {
-		$header = explode( ":", $line );
-		switch ( trim( $header[0] ) ) {
-			case "From":
-				$from = trim( str_replace( '"', '', $header[1] ) );
-				if ( strpos( $from, '<' ) ) {
-					$phpmailer->FromName = str_replace( '"', '', substr( $header[1], 0, strpos( $header[1], '<' ) - 1 ) );
-					$from = trim( substr( $from, strpos( $from, '<' ) + 1 ) );
-					$from = str_replace( '>', '', $from );
-				} else {
-					$phpmailer->FromName = $from;
-				}
-				$phpmailer->From = trim( $from );
-				break;
-			default:
-				if ( $line != '' && $header[0] != 'MIME-Version' && $header[0] != 'Content-Type' )
-					$phpmailer->AddCustomHeader( $line );
-				break;
+	$phpmailer->Body = $message;
+
+	// Set to use PHP's mail()
+	$phpmailer->IsMail();
+
+	// Set Content-Type and charset
+	// If we don't have a content-type from the input headers
+	if ( !isset( $content_type ) ) {
+		$content_type = 'text/plain';
+	}
+
+	$content_type = apply_filters( 'wp_mail_content_type', $content_type );
+
+	// Set whether it's plaintext or not, depending on $content_type
+	if ( $content_type == 'text/html' ) {
+		$phpmailer->IsHTML( true );
+	} else {
+		$phpmailer->IsHTML( false );
+	}
+
+	// If we don't have a charset from the input headers
+	if ( !isset( $charset ) ) {
+		$charset = get_bloginfo( 'charset' );
+	}
+
+	// Set the content-type and charset
+	$phpmailer->CharSet = apply_filters( 'wp_mail_charset', $charset );
+
+	// Set custom headers
+	if ( !empty( $headers ) ) {
+		foreach ( $headers as $name => $content ) {
+			$phpmailer->AddCustomHeader( sprintf( '%1$s: %2$s', $name, $content ) );
 		}
 	}
 
+	do_action_ref_array( 'phpmailer_init', array( &$phpmailer ) );
+
+	// Send!
 	$result = @$phpmailer->Send();
 
 	return $result;
 }
 endif;
 
-if ( !function_exists('wp_login') ) :
-function wp_login($username, $password, $already_md5 = false) {
-	global $wpdb, $error;
-
+/**
+ * wp_authenticate() - Checks a user's login information and logs them in if it checks out
+ * @since 2.5
+ *
+ * @param string $username User's username
+ * @param string $password User's password
+ * @return WP_Error|WP_User WP_User object if login successful, otherwise WP_Error object.
+ */
+if ( !function_exists('wp_authenticate') ) :
+function wp_authenticate($username, $password) {
 	$username = sanitize_user($username);
 
 	if ( '' == $username )
-		return false;
+		return new WP_Error('empty_username', __('<strong>ERROR</strong>: The username field is empty.'));
 
-	if ( '' == $password ) {
-		$error = __('<strong>ERROR</strong>: The password field is empty.');
-		return false;
+	if ( '' == $password )
+		return new WP_Error('empty_password', __('<strong>ERROR</strong>: The password field is empty.'));
+
+	$user = get_userdatabylogin($username);
+
+	if ( !$user || ($user->user_login != $username) ) {
+		do_action( 'wp_login_failed', $username );
+		return new WP_Error('invalid_username', __('<strong>ERROR</strong>: Invalid username.'));
 	}
 
-	$login = get_userdatabylogin($username);
-	//$login = $wpdb->get_row("SELECT ID, user_login, user_pass FROM $wpdb->users WHERE user_login = '$username'");
+	$user = apply_filters('wp_authenticate_user', $user, $password);
+	if ( is_wp_error($user) ) {
+		do_action( 'wp_login_failed', $username );
+		return $user;
+	}
+
+	if ( !wp_check_password($password, $user->user_pass, $user->ID) ) {
+		do_action( 'wp_login_failed', $username );
+		return new WP_Error('incorrect_password', __('<strong>ERROR</strong>: Incorrect password.'));
+	}
+
+	return new WP_User($user->ID);
+}
+endif;
+
+/**
+ * wp_logout() - Log the current user out
+ * @since 2.5
+ *
+ */
+if ( !function_exists('wp_logout') ) :
+function wp_logout() {
+	wp_clear_auth_cookie();
+	do_action('wp_logout');
+}
+endif;
+
+if ( !function_exists('wp_validate_auth_cookie') ) :
+/**
+ * wp_validate_auth_cookie() - Validates authentication cookie
+ *
+ * The checks include making sure that the authentication cookie
+ * is set and pulling in the contents (if $cookie is not used).
+ *
+ * Makes sure the cookie is not expired. Verifies the hash in
+ * cookie is what is should be and compares the two.
+ *
+ * @since 2.5
+ *
+ * @param string $cookie Optional. If used, will validate contents instead of cookie's
+ * @return bool|int False if invalid cookie, User ID if valid.
+ */
+function wp_validate_auth_cookie($cookie = '') {
+	if ( empty($cookie) ) {
+		if ( empty($_COOKIE[AUTH_COOKIE]) )
+			return false;
+		$cookie = $_COOKIE[AUTH_COOKIE];
+	}
+
+	list($username, $expiration, $hmac) = explode('|', $cookie);
 
-	if (!$login) {
-		$error = __('<strong>ERROR</strong>: Invalid username.');
+	$expired = $expiration;
+
+	// Allow a grace period for POST and AJAX requests
+	if ( defined('DOING_AJAX') || 'POST' == $_SERVER['REQUEST_METHOD'] )
+		$expired += 3600;
+
+	if ( $expired < time() )
+		return false;
+
+	$key = wp_hash($username . $expiration);
+	$hash = hash_hmac('md5', $username . $expiration, $key);
+
+	if ( $hmac != $hash )
+		return false;
+
+	$user = get_userdatabylogin($username);
+	if ( ! $user )
 		return false;
+
+	return $user->ID;
+}
+endif;
+
+if ( !function_exists('wp_generate_auth_cookie') ) :
+/**
+ * wp_generate_auth_cookie() - Generate authentication cookie contents
+ *
+ * @since 2.5
+ * @uses apply_filters() Calls 'auth_cookie' hook on $cookie contents, User ID
+ *		and expiration of cookie.
+ *
+ * @param int $user_id User ID
+ * @param int $expiration Cookie expiration in seconds
+ * @return string Authentication cookie contents
+ */
+function wp_generate_auth_cookie($user_id, $expiration) {
+	$user = get_userdata($user_id);
+
+	$key = wp_hash($user->user_login . $expiration);
+	$hash = hash_hmac('md5', $user->user_login . $expiration, $key);
+
+	$cookie = $user->user_login . '|' . $expiration . '|' . $hash;
+
+	return apply_filters('auth_cookie', $cookie, $user_id, $expiration);
+}
+endif;
+
+if ( !function_exists('wp_set_auth_cookie') ) :
+/**
+ * wp_set_auth_cookie() - Sets the authentication cookies based User ID
+ *
+ * The $remember parameter increases the time that the cookie will
+ * be kept. The default the cookie is kept without remembering is
+ * two days. When $remember is set, the cookies will be kept for
+ * 14 days or two weeks.
+ *
+ * @since 2.5
+ *
+ * @param int $user_id User ID
+ * @param bool $remember Whether to remember the user or not
+ */
+function wp_set_auth_cookie($user_id, $remember = false) {
+	if ( $remember ) {
+		$expiration = $expire = time() + 1209600;
 	} else {
-		// If the password is already_md5, it has been double hashed.
-		// Otherwise, it is plain text.
-		if ( ($already_md5 && md5($login->user_pass) == $password) || ($login->user_login == $username && $login->user_pass == md5($password)) ) {
-			return true;
-		} else {
-			$error = __('<strong>ERROR</strong>: Incorrect password.');
-			$pwd = '';
-			return false;
-		}
+		$expiration = time() + 172800;
+		$expire = 0;
 	}
+
+	$cookie = wp_generate_auth_cookie($user_id, $expiration);
+
+	do_action('set_auth_cookie', $cookie, $expire);
+
+	setcookie(AUTH_COOKIE, $cookie, $expire, COOKIEPATH, COOKIE_DOMAIN);
+	if ( COOKIEPATH != SITECOOKIEPATH )
+		setcookie(AUTH_COOKIE, $cookie, $expire, SITECOOKIEPATH, COOKIE_DOMAIN);
+}
+endif;
+
+if ( !function_exists('wp_clear_auth_cookie') ) :
+/**
+ * wp_clear_auth_cookie() - Deletes all of the cookies associated with authentication
+ *
+ * @since 2.5
+ */
+function wp_clear_auth_cookie() {
+	setcookie(AUTH_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN);
+	setcookie(AUTH_COOKIE, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_DOMAIN);
+
+	// Old cookies
+	setcookie(USER_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN);
+	setcookie(PASS_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN);
+	setcookie(USER_COOKIE, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_DOMAIN);
+	setcookie(PASS_COOKIE, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_DOMAIN);
 }
 endif;
 
 if ( !function_exists('is_user_logged_in') ) :
+/**
+ * is_user_logged_in() - Checks if the current visitor is a logged in user
+ *
+ * @since 2.0.0
+ *
+ * @return bool True if user is logged in, false if not logged in.
+ */
 function is_user_logged_in() {
 	$user = wp_get_current_user();
 
@@ -266,11 +592,16 @@
 endif;
 
 if ( !function_exists('auth_redirect') ) :
+/**
+ * auth_redirect() - Checks if a user is logged in, if not it redirects them to the login page
+ *
+ * @since 1.5
+ */
 function auth_redirect() {
 	// Checks if a user is logged in, if not redirects them to the login page
-	if ( (!empty($_COOKIE[USER_COOKIE]) &&
-				!wp_login($_COOKIE[USER_COOKIE], $_COOKIE[PASS_COOKIE], true)) ||
-			 (empty($_COOKIE[USER_COOKIE])) ) {
+	if ( (!empty($_COOKIE[AUTH_COOKIE]) &&
+				!wp_validate_auth_cookie($_COOKIE[AUTH_COOKIE])) ||
+			(empty($_COOKIE[AUTH_COOKIE])) ) {
 		nocache_headers();
 
 		wp_redirect(get_option('siteurl') . '/wp-login.php?redirect_to=' . urlencode($_SERVER['REQUEST_URI']));
@@ -280,48 +611,75 @@
 endif;
 
 if ( !function_exists('check_admin_referer') ) :
-function check_admin_referer($action = -1) {
+/**
+ * check_admin_referer() - Makes sure that a user was referred from another admin page, to avoid security exploits
+ *
+ * @since 1.2.0
+ * @uses do_action() Calls 'check_admin_referer' on $action.
+ *
+ * @param string $action Action nonce
+ * @param string $query_arg where to look for nonce in $_REQUEST (since 2.5)
+ */
+function check_admin_referer($action = -1, $query_arg = '_wpnonce') {
 	$adminurl = strtolower(get_option('siteurl')).'/wp-admin';
 	$referer = strtolower(wp_get_referer());
-	if ( !wp_verify_nonce($_REQUEST['_wpnonce'], $action) &&
-		!(-1 == $action && strpos($referer, $adminurl) !== false)) {
+	$result = wp_verify_nonce($_REQUEST[$query_arg], $action);
+	if ( !$result && !(-1 == $action && strpos($referer, $adminurl) !== false) ) {
 		wp_nonce_ays($action);
 		die();
 	}
-	do_action('check_admin_referer', $action);
+	do_action('check_admin_referer', $action, $result);
+	return $result;
 }endif;
 
 if ( !function_exists('check_ajax_referer') ) :
-function check_ajax_referer() {
-	$cookie = explode('; ', urldecode(empty($_POST['cookie']) ? $_GET['cookie'] : $_POST['cookie'])); // AJAX scripts must pass cookie=document.cookie
-	foreach ( $cookie as $tasty ) {
-		if ( false !== strpos($tasty, USER_COOKIE) )
-			$user = substr(strstr($tasty, '='), 1);
-		if ( false !== strpos($tasty, PASS_COOKIE) )
-			$pass = substr(strstr($tasty, '='), 1);
-	}
-	if ( !wp_login( $user, $pass, true ) )
+/**
+ * check_ajax_referer() - Verifies the AJAX request to prevent processing requests external of the blog.
+ *
+ * @since 2.0.4
+ *
+ * @param string $action Action nonce
+ * @param string $query_arg where to look for nonce in $_REQUEST (since 2.5)
+ */
+function check_ajax_referer( $action = -1, $query_arg = false, $die = true ) {
+	if ( $query_arg )
+		$nonce = $_REQUEST[$query_arg];
+	else
+		$nonce = $_REQUEST['_ajax_nonce'] ? $_REQUEST['_ajax_nonce'] : $_REQUEST['_wpnonce'];
+
+	$result = wp_verify_nonce( $nonce, $action );
+
+	if ( $die && false == $result )
 		die('-1');
-	do_action('check_ajax_referer');
+
+	do_action('check_ajax_referer', $action, $result);
+
+	return $result;
 }
 endif;
 
-// Cookie safe redirect.  Works around IIS Set-Cookie bug.
-// http://support.microsoft.com/kb/q176113/
 if ( !function_exists('wp_redirect') ) :
+/**
+ * wp_redirect() - Redirects to another page, with a workaround for the IIS Set-Cookie bug
+ *
+ * @link http://support.microsoft.com/kb/q176113/
+ * @since 1.5.1
+ * @uses apply_filters() Calls 'wp_redirect' hook on $location and $status.
+ *
+ * @param string $location The path to redirect to
+ * @param int $status Status code to use
+ * @return bool False if $location is not set
+ */
 function wp_redirect($location, $status = 302) {
 	global $is_IIS;
 
 	$location = apply_filters('wp_redirect', $location, $status);
-
+	$status = apply_filters('wp_redirect_status', $status, $location);
+	
 	if ( !$location ) // allows the wp_redirect filter to cancel a redirect
-		return false; 
-
-	$location = preg_replace('|[^a-z0-9-~+_.?#=&;,/:%]|i', '', $location);
-	$location = wp_kses_no_null($location);
+		return false;
 
-	$strip = array('%0d', '%0a');
-	$location = str_replace($strip, '', $location);
+	$location = wp_sanitize_redirect($location);
 
 	if ( $is_IIS ) {
 		header("Refresh: 0;url=$location");
@@ -333,62 +691,83 @@
 }
 endif;
 
-if ( !function_exists('wp_get_cookie_login') ):
-function wp_get_cookie_login() {
-	if ( empty($_COOKIE[USER_COOKIE]) || empty($_COOKIE[PASS_COOKIE]) )
-		return false;
+if ( !function_exists('wp_sanitize_redirect') ) :
+/**
+ * wp_sanitize_redirect() - Sanitizes a URL for use in a redirect
+ *
+ * @since 2.3
+ *
+ * @return string redirect-sanitized URL
+ **/
+function wp_sanitize_redirect($location) {
+	$location = preg_replace('|[^a-z0-9-~+_.?#=&;,/:%]|i', '', $location);
+	$location = wp_kses_no_null($location);
 
-	return array('login' => $_COOKIE[USER_COOKIE],	'password' => $_COOKIE[PASS_COOKIE]);
+	// remove %0d and %0a from location
+	$strip = array('%0d', '%0a');
+	$found = true;
+	while($found) {
+		$found = false;
+		foreach($strip as $val) {
+			while(strpos($location, $val) !== false) {
+				$found = true;
+				$location = str_replace($val, '', $location);
+			}
+		}
+	}
+	return $location;
 }
-
 endif;
 
-if ( !function_exists('wp_setcookie') ) :
-function wp_setcookie($username, $password, $already_md5 = false, $home = '', $siteurl = '', $remember = false) {
-	if ( !$already_md5 )
-		$password = md5( md5($password) ); // Double hash the password in the cookie.
+if ( !function_exists('wp_safe_redirect') ) :
+/**
+ * wp_safe_redirect() - Performs a safe (local) redirect, using wp_redirect()
+ *
+ * Checks whether the $location is using an allowed host, if it has an absolute
+ * path. A plugin can therefore set or remove allowed host(s) to or from the list.
+ *
+ * If the host is not allowed, then the redirect is to wp-admin on the siteurl
+ * instead. This prevents malicious redirects which redirect to another host, but
+ * only used in a few places.
+ *
+ * @since 2.3
+ * @uses apply_filters() Calls 'allowed_redirect_hosts' on an array containing
+ *		WordPress host string and $location host string.
+ *
+ * @return void Does not return anything
+ **/
+function wp_safe_redirect($location, $status = 302) {
+
+	// Need to look at the URL the way it will end up in wp_redirect()
+	$location = wp_sanitize_redirect($location);
+
+	// browsers will assume 'http' is your protocol, and will obey a redirect to a URL starting with '//'
+	if ( substr($location, 0, 2) == '//' )
+		$location = 'http:' . $location;
+
+	$lp  = parse_url($location);
+	$wpp = parse_url(get_option('home'));
 
-	if ( empty($home) )
-		$cookiepath = COOKIEPATH;
-	else
-		$cookiepath = preg_replace('|https?://[^/]+|i', '', $home . '/' );
+	$allowed_hosts = (array) apply_filters('allowed_redirect_hosts', array($wpp['host']), isset($lp['host']) ? $lp['host'] : '');
 
-	if ( empty($siteurl) ) {
-		$sitecookiepath = SITECOOKIEPATH;
-		$cookiehash = COOKIEHASH;
-	} else {
-		$sitecookiepath = preg_replace('|https?://[^/]+|i', '', $siteurl . '/' );
-		$cookiehash = md5($siteurl);
-	}
-
-	if ( $remember )
-		$expire = time() + 31536000;
-	else
-		$expire = 0;
-
-	setcookie(USER_COOKIE, $username, $expire, $cookiepath, COOKIE_DOMAIN);
-	setcookie(PASS_COOKIE, $password, $expire, $cookiepath, COOKIE_DOMAIN);
-
-	if ( $cookiepath != $sitecookiepath ) {
-		setcookie(USER_COOKIE, $username, $expire, $sitecookiepath, COOKIE_DOMAIN);
-		setcookie(PASS_COOKIE, $password, $expire, $sitecookiepath, COOKIE_DOMAIN);
-	}
-}
-endif;
+	if ( isset($lp['host']) && ( !in_array($lp['host'], $allowed_hosts) && $lp['host'] != strtolower($wpp['host'])) )
+		$location = get_option('siteurl') . '/wp-admin/';
 
-if ( !function_exists('wp_clearcookie') ) :
-function wp_clearcookie() {
-	setcookie(USER_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN);
-	setcookie(PASS_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN);
-	setcookie(USER_COOKIE, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_DOMAIN);
-	setcookie(PASS_COOKIE, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_DOMAIN);
+	wp_redirect($location, $status);
 }
 endif;
 
 if ( ! function_exists('wp_notify_postauthor') ) :
+/**
+ * wp_notify_postauthor() - Notify an author of a comment/trackback/pingback to one of their posts
+ *
+ * @since 1.0.0
+ *
+ * @param int $comment_id Comment ID
+ * @param string $comment_type Optional. The comment type either 'comment' (default), 'trackback', or 'pingback'
+ * @return bool False if user email does not exist. True on completion.
+ */
 function wp_notify_postauthor($comment_id, $comment_type='') {
-	global $wpdb;
-
 	$comment = get_comment($comment_id);
 	$post    = get_post($comment->comment_post_ID);
 	$user    = get_userdata( $post->post_author );
@@ -441,8 +820,7 @@
 			$reply_to = "Reply-To: \"$comment->comment_author_email\" <$comment->comment_author_email>";
 	}
 
-	$message_headers = "MIME-Version: 1.0\n"
-		. "$from\n"
+	$message_headers = "$from\n"
 		. "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n";
 
 	if ( isset($reply_to) )
@@ -453,41 +831,67 @@
 	$message_headers = apply_filters('comment_notification_headers', $message_headers, $comment_id);
 
 	@wp_mail($user->user_email, $subject, $notify_message, $message_headers);
-   
+
 	return true;
 }
 endif;
 
-/* wp_notify_moderator
-   notifies the moderator of the blog (usually the admin)
-   about a new comment that waits for approval
-   always returns true
- */
 if ( !function_exists('wp_notify_moderator') ) :
+/**
+ * wp_notify_moderator() - Notifies the moderator of the blog about a new comment that is awaiting approval
+ *
+ * @since 1.0
+ * @uses $wpdb
+ *
+ * @param int $comment_id Comment ID
+ * @return bool Always returns true
+ */
 function wp_notify_moderator($comment_id) {
 	global $wpdb;
 
 	if( get_option( "moderation_notify" ) == 0 )
-		return true; 
-    
-	$comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID='$comment_id' LIMIT 1");
-	$post = $wpdb->get_row("SELECT * FROM $wpdb->posts WHERE ID='$comment->comment_post_ID' LIMIT 1");
+		return true;
+
+	$comment = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_ID=%d LIMIT 1", $comment_id));
+	$post = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->posts WHERE ID=%d LIMIT 1", $comment->comment_post_ID));
 
 	$comment_author_domain = @gethostbyaddr($comment->comment_author_IP);
 	$comments_waiting = $wpdb->get_var("SELECT count(comment_ID) FROM $wpdb->comments WHERE comment_approved = '0'");
 
-	$notify_message  = sprintf( __('A new comment on the post #%1$s "%2$s" is waiting for your approval'), $post->ID, $post->post_title ) . "\r\n";
-	$notify_message .= get_permalink($comment->comment_post_ID) . "\r\n\r\n";
-	$notify_message .= sprintf( __('Author : %1$s (IP: %2$s , %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain ) . "\r\n";
-	$notify_message .= sprintf( __('E-mail : %s'), $comment->comment_author_email ) . "\r\n";
-	$notify_message .= sprintf( __('URL    : %s'), $comment->comment_author_url ) . "\r\n";
-	$notify_message .= sprintf( __('Whois  : http://ws.arin.net/cgi-bin/whois.pl?queryinput=%s'), $comment->comment_author_IP ) . "\r\n";
-	$notify_message .= __('Comment: ') . "\r\n" . $comment->comment_content . "\r\n\r\n";
+	switch ($comment->comment_type)
+	{
+		case 'trackback':
+			$notify_message  = sprintf( __('A new trackback on the post #%1$s "%2$s" is waiting for your approval'), $post->ID, $post->post_title ) . "\r\n";
+			$notify_message .= get_permalink($comment->comment_post_ID) . "\r\n\r\n";
+			$notify_message .= sprintf( __('Website : %1$s (IP: %2$s , %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain ) . "\r\n";
+			$notify_message .= sprintf( __('URL    : %s'), $comment->comment_author_url ) . "\r\n";
+			$notify_message .= __('Trackback excerpt: ') . "\r\n" . $comment->comment_content . "\r\n\r\n";
+			break;
+		case 'pingback':
+			$notify_message  = sprintf( __('A new pingback on the post #%1$s "%2$s" is waiting for your approval'), $post->ID, $post->post_title ) . "\r\n";
+			$notify_message .= get_permalink($comment->comment_post_ID) . "\r\n\r\n";
+			$notify_message .= sprintf( __('Website : %1$s (IP: %2$s , %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain ) . "\r\n";
+			$notify_message .= sprintf( __('URL    : %s'), $comment->comment_author_url ) . "\r\n";
+			$notify_message .= __('Pingback excerpt: ') . "\r\n" . $comment->comment_content . "\r\n\r\n";
+			break;
+		default: //Comments
+			$notify_message  = sprintf( __('A new comment on the post #%1$s "%2$s" is waiting for your approval'), $post->ID, $post->post_title ) . "\r\n";
+			$notify_message .= get_permalink($comment->comment_post_ID) . "\r\n\r\n";
+			$notify_message .= sprintf( __('Author : %1$s (IP: %2$s , %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain ) . "\r\n";
+			$notify_message .= sprintf( __('E-mail : %s'), $comment->comment_author_email ) . "\r\n";
+			$notify_message .= sprintf( __('URL    : %s'), $comment->comment_author_url ) . "\r\n";
+			$notify_message .= sprintf( __('Whois  : http://ws.arin.net/cgi-bin/whois.pl?queryinput=%s'), $comment->comment_author_IP ) . "\r\n";
+			$notify_message .= __('Comment: ') . "\r\n" . $comment->comment_content . "\r\n\r\n";
+			break;
+	}
+
 	$notify_message .= sprintf( __('Approve it: %s'),  get_option('siteurl')."/wp-admin/comment.php?action=mac&c=$comment_id" ) . "\r\n";
 	$notify_message .= sprintf( __('Delete it: %s'), get_option('siteurl')."/wp-admin/comment.php?action=cdc&c=$comment_id" ) . "\r\n";
 	$notify_message .= sprintf( __('Spam it: %s'), get_option('siteurl')."/wp-admin/comment.php?action=cdc&dt=spam&c=$comment_id" ) . "\r\n";
-	$notify_message .= sprintf( __('Currently %s comments are waiting for approval. Please visit the moderation panel:'), $comments_waiting ) . "\r\n";
-	$notify_message .= get_option('siteurl') . "/wp-admin/moderation.php\r\n";
+
+	$strCommentsPending = sprintf( __ngettext('%s comment', '%s comments', $comments_waiting), $comments_waiting );
+	$notify_message .= sprintf( __('Currently %s are waiting for approval. Please visit the moderation panel:'), $strCommentsPending ) . "\r\n";
+	$notify_message .= get_option('siteurl') . "/wp-admin/edit-comments.php?comment_status=moderated\r\n";
 
 	$subject = sprintf( __('[%1$s] Please moderate: "%2$s"'), get_option('blogname'), $post->post_title );
 	$admin_email = get_option('admin_email');
@@ -502,6 +906,14 @@
 endif;
 
 if ( !function_exists('wp_new_user_notification') ) :
+/**
+ * wp_new_user_notification() - Notify the blog admin of a new user, normally via email
+ *
+ * @since 2.0
+ *
+ * @param int $user_id User ID
+ * @param string $plaintext_pass Optional. The user's plaintext password
+ */
 function wp_new_user_notification($user_id, $plaintext_pass = '') {
 	$user = new WP_User($user_id);
 
@@ -526,42 +938,136 @@
 }
 endif;
 
+if ( !function_exists('wp_nonce_tick') ) :
+/**
+ * wp_nonce_tick() - Get the time-dependent variable for nonce creation
+ *
+ * A nonce has a lifespan of two ticks. Nonces in their second tick may be updated, e.g. by autosave.
+ *
+ * @since 2.5
+ *
+ * @return int
+ */
+function wp_nonce_tick() {
+	$nonce_life = apply_filters('nonce_life', 86400);
+
+	return ceil(time() / ( $nonce_life / 2 ));
+}
+endif;
+
 if ( !function_exists('wp_verify_nonce') ) :
+/**
+ * wp_verify_nonce() - Verify that correct nonce was used with time limit
+ *
+ * The user is given an amount of time to use the token, so therefore, since
+ * the UID and $action remain the same, the independent variable is the time.
+ *
+ * @since 2.0.4
+ *
+ * @param string $nonce Nonce that was used in the form to verify
+ * @param string|int $action Should give context to what is taking place and be the same when nonce was created.
+ * @return bool Whether the nonce check passed or failed.
+ */
 function wp_verify_nonce($nonce, $action = -1) {
 	$user = wp_get_current_user();
 	$uid = (int) $user->id;
 
-	$i = ceil(time() / 43200);
+	$i = wp_nonce_tick();
 
-	//Allow for expanding range, but only do one check if we can
-	if( substr(wp_hash($i . $action . $uid), -12, 10) == $nonce || substr(wp_hash(($i - 1) . $action . $uid), -12, 10) == $nonce )
-		return true;
+	// Nonce generated 0-12 hours ago
+	if ( substr(wp_hash($i . $action . $uid), -12, 10) == $nonce )
+		return 1;
+	// Nonce generated 12-24 hours ago
+	if ( substr(wp_hash(($i - 1) . $action . $uid), -12, 10) == $nonce )
+		return 2;
+	// Invalid nonce
 	return false;
 }
 endif;
 
 if ( !function_exists('wp_create_nonce') ) :
+/**
+ * wp_create_nonce() - Creates a random, one time use token
+ *
+ * @since 2.0.4
+ *
+ * @param string|int $action Scalar value to add context to the nonce.
+ * @return string The one use form token
+ */
 function wp_create_nonce($action = -1) {
 	$user = wp_get_current_user();
 	$uid = (int) $user->id;
 
-	$i = ceil(time() / 43200);
+	$i = wp_nonce_tick();
 
 	return substr(wp_hash($i . $action . $uid), -12, 10);
 }
 endif;
 
 if ( !function_exists('wp_salt') ) :
+/**
+ * wp_salt() - Get salt to add to hashes to help prevent attacks
+ *
+ * You can set the salt by defining two areas. One is in the database and
+ * the other is in your wp-config.php file. The database location is defined
+ * in the option named 'secret', but most likely will not need to be changed.
+ *
+ * The second, located in wp-config.php, is a constant named 'SECRET_KEY', but
+ * is not required. If the constant is not defined then the database constants
+ * will be used, since they are most likely given to be unique. However, given
+ * that the salt will be added to the password and can be seen, the constant
+ * is recommended to be set manually.
+ *
+ * <code>
+ * define('SECRET_KEY', 'mAry1HadA15|\/|b17w55w1t3asSn09w');
+ * </code>
+ *
+ * Attention: Do not use above example!
+ *
+ * Salting passwords helps against tools which has stored hashed values
+ * of common dictionary strings. The added values makes it harder to crack
+ * if given salt string is not weak.
+ *
+ * Salting only helps if the string is not predictable and should be
+ * made up of various characters. Think of the salt as a password for
+ * securing your passwords, but common among all of your passwords.
+ * Therefore the salt should be as long as possible as as difficult as
+ * possible, because you will not have to remember it.
+ *
+ * @since 2.5
+ *
+ * @return string Salt value from either 'SECRET_KEY' or 'secret' option
+ */
 function wp_salt() {
-	$salt = get_option('secret');
-	if ( empty($salt) )
-		$salt = DB_PASSWORD . DB_USER . DB_NAME . DB_HOST . ABSPATH;
+	global $wp_default_secret_key;
+	$secret_key = '';
+	if ( defined('SECRET_KEY') && ('' != SECRET_KEY) && ( $wp_default_secret_key != SECRET_KEY) )
+		$secret_key = SECRET_KEY;
+
+	if ( defined('SECRET_SALT') ) {
+		$salt = SECRET_SALT;
+	} else {
+		$salt = get_option('secret');
+		if ( empty($salt) ) {
+			$salt = wp_generate_password();
+			update_option('secret', $salt);
+		}
+	}
 
-	return $salt;
+	return apply_filters('salt', $secret_key . $salt);
 }
 endif;
 
 if ( !function_exists('wp_hash') ) :
+/**
+ * wp_hash() - Get hash of given string
+ *
+ * @since 2.0.4
+ * @uses wp_salt() Get WordPress salt
+ *
+ * @param string $data Plain text to hash
+ * @return string Hash of $data
+ */
 function wp_hash($data) {
 	$salt = wp_salt();
 
@@ -573,4 +1079,275 @@
 }
 endif;
 
+if ( !function_exists('wp_hash_password') ) :
+/**
+ * wp_hash_password() - Create a hash (encrypt) of a plain text password
+ *
+ * For integration with other applications, this function can be
+ * overwritten to instead use the other package password checking
+ * algorithm.
+ *
+ * @since 2.5
+ * @global object $wp_hasher PHPass object
+ * @uses PasswordHash::HashPassword
+ *
+ * @param string $password Plain text user password to hash
+ * @return string The hash string of the password
+ */
+function wp_hash_password($password) {
+	global $wp_hasher;
+
+	if ( empty($wp_hasher) ) {
+		require_once( ABSPATH . 'wp-includes/class-phpass.php');
+		// By default, use the portable hash from phpass
+		$wp_hasher = new PasswordHash(8, TRUE);
+	}
+
+	return $wp_hasher->HashPassword($password);
+}
+endif;
+
+if ( !function_exists('wp_check_password') ) :
+/**
+ * wp_check_password() - Checks the plaintext password against the encrypted Password
+ *
+ * Maintains compatibility between old version and the new cookie
+ * authentication protocol using PHPass library. The $hash parameter
+ * is the encrypted password and the function compares the plain text
+ * password when encypted similarly against the already encrypted
+ * password to see if they match.
+ *
+ * For integration with other applications, this function can be
+ * overwritten to instead use the other package password checking
+ * algorithm.
+ *
+ * @since 2.5
+ * @global object $wp_hasher PHPass object used for checking the password
+ *	against the $hash + $password
+ * @uses PasswordHash::CheckPassword
+ *
+ * @param string $password Plaintext user's password
+ * @param string $hash Hash of the user's password to check against.
+ * @return bool False, if the $password does not match the hashed password
+ */
+function wp_check_password($password, $hash, $user_id = '') {
+	global $wp_hasher;
+
+	// If the hash is still md5...
+	if ( strlen($hash) <= 32 ) {
+		$check = ( $hash == md5($password) );
+		if ( $check && $user_id ) {
+			// Rehash using new hash.
+			wp_set_password($password, $user_id);
+			$hash = wp_hash_password($password);
+		}
+
+		return apply_filters('check_password', $check, $password, $hash, $user_id);
+	}
+
+	// If the stored hash is longer than an MD5, presume the
+	// new style phpass portable hash.
+	if ( empty($wp_hasher) ) {
+		require_once( ABSPATH . 'wp-includes/class-phpass.php');
+		// By default, use the portable hash from phpass
+		$wp_hasher = new PasswordHash(8, TRUE);
+	}
+
+	$check = $wp_hasher->CheckPassword($password, $hash);
+
+	return apply_filters('check_password', $check, $password, $hash, $user_id);
+}
+endif;
+
+if ( !function_exists('wp_generate_password') ) :
+/**
+ * wp_generate_password() - Generates a random password drawn from the defined set of characters
+ *
+ * @since 2.5
+ *
+ * @return string The random password
+ **/
+function wp_generate_password() {
+	$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+	$length = 7;
+	$password = '';
+	for ( $i = 0; $i < $length; $i++ )
+		$password .= substr($chars, mt_rand(0, 61), 1);
+	return $password;
+}
+endif;
+
+if ( !function_exists('wp_set_password') ) :
+/**
+ * wp_set_password() - Updates the user's password with a new encrypted one
+ *
+ * For integration with other applications, this function can be
+ * overwritten to instead use the other package password checking
+ * algorithm.
+ *
+ * @since 2.5
+ * @uses $wpdb WordPress database object for queries
+ * @uses wp_hash_password() Used to encrypt the user's password before passing to the database
+ *
+ * @param string $password The plaintext new user password
+ * @param int $user_id User ID
+ */
+function wp_set_password( $password, $user_id ) {
+	global $wpdb;
+
+	$hash = wp_hash_password($password);
+	$query = $wpdb->prepare("UPDATE $wpdb->users SET user_pass = %s, user_activation_key = '' WHERE ID = %d", $hash, $user_id);
+	$wpdb->query($query);
+	wp_cache_delete($user_id, 'users');
+}
+endif;
+
+if ( !function_exists( 'get_avatar' ) ) :
+/**
+ * get_avatar() - Get avatar for a user
+ *
+ * Retrieve the avatar for a user provided a user ID or email address
+ *
+ * @since 2.5
+ * @param int|string|object $id_or_email A user ID,  email address, or comment object
+ * @param int $size Size of the avatar image
+ * @param string $default URL to a default image to use if no avatar is available
+ * @return string <img> tag for the user's avatar
+*/
+function get_avatar( $id_or_email, $size = '96', $default = '' ) {
+	if ( ! get_option('show_avatars') )
+		return false;
+
+	if ( !is_numeric($size) )
+		$size = '96';
+
+	$email = '';
+	if ( is_numeric($id_or_email) ) {
+		$id = (int) $id_or_email;
+		$user = get_userdata($id);
+		if ( $user )
+			$email = $user->user_email;
+	} elseif ( is_object($id_or_email) ) {
+		if ( !empty($id_or_email->user_id) ) {
+			$id = (int) $id_or_email->user_id;
+			$user = get_userdata($id);
+			if ( $user)
+				$email = $user->user_email;
+		} elseif ( !empty($id_or_email->comment_author_email) ) {
+			$email = $id_or_email->comment_author_email;
+		}
+	} else {
+		$email = $id_or_email;
+	}
+
+	if ( empty($default) )
+		$default = "http://www.gravatar.com/avatar/ad516503a11cd5ca435acc9bb6523536?s=$size"; // ad516503a11cd5ca435acc9bb6523536 == md5('unknown@gravatar.com')
+
+	if ( !empty($email) ) {
+		$out = 'http://www.gravatar.com/avatar/';
+		$out .= md5( strtolower( $email ) );
+		$out .= '?s='.$size;
+		$out .= '&amp;d=' . urlencode( $default );
+
+		$rating = get_option('avatar_rating');
+		if ( !empty( $rating ) )
+			$out .= "&amp;r={$rating}";
+
+		$avatar = "<img alt='' src='{$out}' class='avatar avatar-{$size}' height='{$size}' width='{$size}' />";
+	} else {
+		$avatar = "<img alt='' src='{$default}' class='avatar avatar-{$size} avatar-default' height='{$size}' width='{$size}' />";
+	}
+
+	return apply_filters('get_avatar', $avatar, $id_or_email, $size, $default);
+}
+endif;
+
+if ( !function_exists('wp_setcookie') ) :
+/**
+ * wp_setcookie() - Sets a cookie for a user who just logged in
+ *
+ * @since 1.5
+ * @deprecated Use wp_set_auth_cookie()
+ * @see wp_set_auth_cookie()
+ *
+ * @param string  $username The user's username
+ * @param string  $password Optional. The user's password
+ * @param bool $already_md5 Optional. Whether the password has already been through MD5
+ * @param string $home Optional. Will be used instead of COOKIEPATH if set
+ * @param string $siteurl Optional. Will be used instead of SITECOOKIEPATH if set
+ * @param bool $remember Optional. Remember that the user is logged in
+ */
+function wp_setcookie($username, $password = '', $already_md5 = false, $home = '', $siteurl = '', $remember = false) {
+	_deprecated_function( __FUNCTION__, '2.5', 'wp_set_auth_cookie()' );
+	$user = get_userdatabylogin($username);
+	wp_set_auth_cookie($user->ID, $remember);
+}
+endif;
+
+if ( !function_exists('wp_clearcookie') ) :
+/**
+ * wp_clearcookie() - Clears the authentication cookie, logging the user out
+ *
+ * @since 1.5
+ * @deprecated Use wp_clear_auth_cookie()
+ * @see wp_clear_auth_cookie()
+ */
+function wp_clearcookie() {
+	_deprecated_function( __FUNCTION__, '2.5', 'wp_clear_auth_cookie()' );
+	wp_clear_auth_cookie();
+}
+endif;
+
+if ( !function_exists('wp_get_cookie_login') ):
+/**
+ * wp_get_cookie_login() - Gets the user cookie login
+ *
+ * This function is deprecated and should no longer be extended as it won't
+ * be used anywhere in WordPress. Also, plugins shouldn't use it either.
+ *
+ * @since 2.0.4
+ * @deprecated No alternative
+ *
+ * @return bool Always returns false
+ */
+function wp_get_cookie_login() {
+	_deprecated_function( __FUNCTION__, '2.5', '' );
+	return false;
+}
+endif;
+
+if ( !function_exists('wp_login') ) :
+/**
+ * wp_login() - Checks a users login information and logs them in if it checks out
+ *
+ * Use the global $error to get the reason why the login failed.
+ * If the username is blank, no error will be set, so assume
+ * blank username on that case.
+ *
+ * Plugins extending this function should also provide the global
+ * $error and set what the error is, so that those checking the
+ * global for why there was a failure can utilize it later.
+ *
+ * @since 1.2.2
+ * @deprecated Use wp_signin()
+ * @global string $error Error when false is returned
+ *
+ * @param string $username User's username
+ * @param string $password User's password
+ * @param bool $deprecated Not used
+ * @return bool False on login failure, true on successful check
+ */
+function wp_login($username, $password, $deprecated = '') {
+	global $error;
+
+	$user = wp_authenticate($username, $password);
+
+	if ( ! is_wp_error($user) )
+		return true;
+
+	$error = $user->get_error_message();
+	return false;
+}
+endif;
+
 ?>
diff -x .svn -aruN 2.2.2.src/wp-includes/plugin.php 2.5.src/wp-includes/plugin.php
--- 2.2.2.src/wp-includes/plugin.php	2007-05-08 12:59:32.000000000 -0500
+++ 2.5.src/wp-includes/plugin.php	2008-02-05 00:47:27.000000000 -0600
@@ -1,146 +1,294 @@
 <?php
+/**
+ * The plugin API is located in this file, which allows for creating actions
+ * and filters and hooking functions, and methods. The functions or methods will
+ * then be run when the action or filter is called.
+ *
+ * The API callback examples reference functions, but can be methods of classes.
+ * To hook methods, you'll need to pass an array one of two ways.
+ *
+ * Any of the syntaxes explained in the PHP documentation for the
+ * {@link http://us2.php.net/manual/en/language.pseudo-types.php#language.types.callback 'callback'}
+ * type are valid.
+ *
+ * Also see the {@link http://codex.wordpress.org/Plugin_API Plugin API} for more information
+ * and examples on how to use a lot of these functions.
+ *
+ * @package WordPress
+ * @subpackage Plugin
+ * @since 1.5
+ */
 
 /**
- * Hooks a function to a specific filter action.
- * 
+ * add_filter() - Hooks a function or method to a specific filter action.
+ *
  * Filters are the hooks that WordPress launches to modify text of various types
- * before adding it to the database or sending it to the browser screen. Plugins 
- * can specify that one or more of its PHP functions is executed to 
+ * before adding it to the database or sending it to the browser screen. Plugins
+ * can specify that one or more of its PHP functions is executed to
  * modify specific types of text at these times, using the Filter API.
- * See the [Plugin API] for a list of filter hooks. 
+ *
+ * To use the API, the following code should be used to bind a callback to the filter
+ * <code>
+ * function example_hook($example) { echo $example; }
+ *
+ * add_filter('example_filter', 'example_hook');
+ * </code>
+ *
+ * In WordPress 1.5.1+, hooked functions can take extra arguments that are set when
+ * the matching do_action() or apply_filters() call is run. The <tt>$accepted_args
+ * allow for calling functions only when the number of args match. Hooked functions
+ * can take extra arguments that are set when the matching <tt>do_action()</tt> or
+ * <tt>apply_filters()</tt> call is run. For example, the action <tt>comment_id_not_found</tt>
+ * will pass any functions that hook onto it the ID of the requested comment.
+ *
+ * <strong>Note:</strong> the function will return true no matter if the function was hooked
+ * fails or not. There are no checks for whether the function exists beforehand and no checks
+ * to whether the <tt>$function_to_add is even a string. It is up to you to take care and
+ * this is done for optimization purposes, so everything is as quick as possible.
+ *
+ * @package WordPress
+ * @subpackage Plugin
+ * @since 0.71
+ * @global array $wp_filter Stores all of the filters added in the form of
+ *	wp_filter['tag']['array of priorities']['array of functions serialized']['array of ['array (functions, accepted_args)]']
+ * @global array $merged_filters Tracks the tags that need to be merged for later. If the hook is added, it doesn't need to run through that process.
  *
  * @param string $tag The name of the filter to hook the <tt>$function_to_add</tt> to.
  * @param callback $function_to_add The name of the function to be called when the filter is applied.
  * @param int $priority optional. Used to specify the order in which the functions associated with a particular action are executed (default: 10). Lower numbers correspond with earlier execution, and functions with the same priority are executed in the order in which they were added to the action.
- * @param int $accepted_args optional. The number of arguments the function accept (default 1). In WordPress 1.5.1+, hooked functions can take extra arguments that are set when the matching do_action() or apply_filters() call is run.
- * @return boolean true if the <tt>$function_to_add</tt> is added succesfully to filter <tt>$tag</tt>. How many arguments your function takes. In WordPress 1.5.1+, hooked functions can take extra arguments that are set when the matching <tt>do_action()</tt> or <tt>apply_filters()</tt> call is run. For example, the action <tt>comment_id_not_found</tt> will pass any functions that hook onto it the ID of the requested comment.
+ * @param int $accepted_args optional. The number of arguments the function accept (default 1).
+ * @return boolean true
  */
 function add_filter($tag, $function_to_add, $priority = 10, $accepted_args = 1) {
 	global $wp_filter, $merged_filters;
 
-	// So the format is wp_filter['tag']['array of priorities']['array of functions serialized']['array of ['array (functions, accepted_args)]']
-	$wp_filter[$tag][$priority][serialize($function_to_add)] = array('function' => $function_to_add, 'accepted_args' => $accepted_args);
+	$idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);
+	$wp_filter[$tag][$priority][$idx] = array('function' => $function_to_add, 'accepted_args' => $accepted_args);
 	unset( $merged_filters[ $tag ] );
 	return true;
 }
 
 /**
- * Call the functions added to a filter hook.
- * 
+ * has_filter() - Check if any filter has been registered for a hook.
+ *
+ * @package WordPress
+ * @subpackage Plugin
+ * @since 2.5
+ * @global array $wp_filter Stores all of the filters
+ *
+ * @param string $tag The name of the filter hook.
+ * @param callback $function_to_check optional.  If specified, return the priority of that function on this hook or false if not attached.
+ * @return int|boolean Optionally returns the priority on that hook for the specified function.
+ */
+function has_filter($tag, $function_to_check = false) {
+	global $wp_filter;
+
+	$has = !empty($wp_filter[$tag]);
+	if ( false === $function_to_check || false == $has )
+		return $has;
+
+	if ( !$idx = _wp_filter_build_unique_id($tag, $function_to_check, false) )
+		return false;
+
+	foreach ( array_keys($wp_filter[$tag]) as $priority ) {
+		if ( isset($wp_filter[$tag][$priority][$idx]) )
+			return $priority;
+	}
+
+	return false;
+}
+
+/**
+ * apply_filters() - Call the functions added to a filter hook.
+ *
  * The callback functions attached to filter hook <tt>$tag</tt> are invoked by
  * calling this function. This function can be used to create a new filter hook
  * by simply calling this function with the name of the new hook specified using
  * the <tt>$tag</a> parameter.
- * @uses merge_filters Merges the filter hooks using this function.
+ *
+ * The function allows for additional arguments to be added and passed to hooks.
+ * <code>
+ * function example_hook($string, $arg1, $arg2)
+ * {
+ *		//Do stuff
+ *		return $string;
+ * }
+ * $value = apply_filters('example_filter', 'filter me', 'arg1', 'arg2');
+ * </code>
+ *
+ * @package WordPress
+ * @subpackage Plugin
+ * @since 0.71
+ * @global array $wp_filter Stores all of the filters
+ * @global array $merge_filters Merges the filter hooks using this function.
+ * @global array $wp_current_filter stores the list of current filters with the current one last
+ *
  * @param string $tag The name of the filter hook.
- * @param string $string The text on which the filters hooked to <tt>$tag</tt> are applied on.
+ * @param mixed $value The value on which the filters hooked to <tt>$tag</tt> are applied on.
  * @param mixed $var,... Additional variables passed to the functions hooked to <tt>$tag</tt>.
- * @return string The text in <tt>$string</tt> after all hooked functions are applied to it.
+ * @return mixed The filtered value after all hooked functions are applied to it.
  */
-function apply_filters($tag, $string) {
-	global $wp_filter, $merged_filters;
+function apply_filters($tag, $value) {
+	global $wp_filter, $merged_filters, $wp_current_filter;
+
+	$args = array();
+	$wp_current_filter[] = $tag;
+
+	// Do 'all' actions first
+	if ( isset($wp_filter['all']) ) {
+		$args = func_get_args();
+		_wp_call_all_hook($args);
+	}
 
-	if ( !isset( $merged_filters[ $tag ] ) )
-		merge_filters($tag);
+	if ( !isset($wp_filter[$tag]) ) {
+		array_pop($wp_current_filter);
+		return $value;
+	}
 
-	if ( !isset($wp_filter[$tag]) )
-		return $string;
+	// Sort
+	if ( !isset( $merged_filters[ $tag ] ) ) {
+		ksort($wp_filter[$tag]);
+		$merged_filters[ $tag ] = true;
+	}
 
 	reset( $wp_filter[ $tag ] );
 
-	$args = func_get_args();
+	if ( empty($args) )
+		$args = func_get_args();
 
-	do{
+	do {
 		foreach( (array) current($wp_filter[$tag]) as $the_ )
 			if ( !is_null($the_['function']) ){
-				$args[1] = $string;
-				$string = call_user_func_array($the_['function'], array_slice($args, 1, (int) $the_['accepted_args']));
+				$args[1] = $value;
+				$value = call_user_func_array($the_['function'], array_slice($args, 1, (int) $the_['accepted_args']));
 			}
 
-	} while ( next($wp_filter[$tag]) );
-
-	return $string;
-}
-
-/**
- * Merge the filter functions of a specific filter hook with generic filter functions.
- * 
- * It is possible to defined generic filter functions using the filter hook 
- * <em>all</e>. These functions are called for every filter tag. This function 
- * merges the functions attached to the <em>all</em> hook with the functions
- * of a specific hoook defined by <tt>$tag</tt>.
- * @param string $tag The filter hook of which the functions should be merged.
- */
-function merge_filters($tag) {
-	global $wp_filter, $merged_filters;
+	} while ( next($wp_filter[$tag]) !== false );
 
-	if ( isset($wp_filter['all']) && is_array($wp_filter['all']) )
-		$wp_filter[$tag] = array_merge($wp_filter['all'], (array) $wp_filter[$tag]);
+	array_pop( $wp_current_filter );
 
-	if ( isset($wp_filter[$tag]) ){
-		reset($wp_filter[$tag]);
-		uksort($wp_filter[$tag], "strnatcasecmp");
-	}
-	$merged_filters[ $tag ] = true;
+	return $value;
 }
 
 /**
- * Removes a function from a specified filter hook. 
- * 
- * This function removes a function attached to a specified filter hook. This 
- * method can be used to remove default functions attached to a specific filter 
+ * remove_filter() - Removes a function from a specified filter hook.
+ *
+ * This function removes a function attached to a specified filter hook. This
+ * method can be used to remove default functions attached to a specific filter
  * hook and possibly replace them with a substitute.
+ *
+ * To remove a hook, the <tt>$function_to_remove</tt> and <tt>$priority</tt> arguments
+ * must match when the hook was added. This goes for both filters and actions. No warning
+ * will be given on removal failure.
+ *
+ * @package WordPress
+ * @subpackage Plugin
+ * @since 1.2
+ *
  * @param string $tag The filter hook to which the function to be removed is hooked.
  * @param callback $function_to_remove The name of the function which should be removed.
  * @param int $priority optional. The priority of the function (default: 10).
  * @param int $accepted_args optional. The number of arguments the function accpets (default: 1).
- * @return boolean Whether the function is removed.
+ * @return boolean Whether the function existed before it was removed.
  */
 function remove_filter($tag, $function_to_remove, $priority = 10, $accepted_args = 1) {
-	global $wp_filter, $merged_filters;
+	$function_to_remove = _wp_filter_build_unique_id($tag, $function_to_remove, $priority);
 
-	unset($GLOBALS['wp_filter'][$tag][$priority][serialize($function_to_remove)]);
-	unset( $merged_filters[ $tag ] );
+	$r = isset($GLOBALS['wp_filter'][$tag][$priority][$function_to_remove]);
 
-	return true;
+	if ( true === $r) {
+		unset($GLOBALS['wp_filter'][$tag][$priority][$function_to_remove]);
+		if ( empty($GLOBALS['wp_filter'][$tag][$priority]) )
+			unset($GLOBALS['wp_filter'][$tag][$priority]);
+		unset($GLOBALS['merged_filters'][$tag]);
+	}
+
+	return $r;
+}
+
+
+/**
+ * current_filter() - Return the name of the current filter or action.
+ *
+ * @package WordPress
+ * @subpackage Plugin
+ * @since 2.5
+ *
+ * @return string Hook name of the current filter or action.
+ */
+function current_filter() {
+	global $wp_current_filter;
+	return end( $wp_current_filter );
 }
 
+
 /**
- * Hooks a function on to a specific action.
- * 
- * Actions are the hooks that the WordPress core launches at specific points 
+ * add_action() - Hooks a function on to a specific action.
+ *
+ * Actions are the hooks that the WordPress core launches at specific points
  * during execution, or when specific events occur. Plugins can specify that
- * one or more of its PHP functions are executed at these points, using the 
+ * one or more of its PHP functions are executed at these points, using the
  * Action API.
- * 
+ *
+ * @uses add_filter() Adds an action. Parameter list and functionality are the same.
+ *
+ * @package WordPress
+ * @subpackage Plugin
+ * @since 1.2
+ *
  * @param string $tag The name of the action to which the <tt>$function_to-add</tt> is hooked.
- * @param callback $function_to_add The name of the function you wish to be called. Note: any of the syntaxes explained in the PHP documentation for the 'callback' type (http://us2.php.net/manual/en/language.pseudo-types.php#language.types.callback) are valid.
+ * @param callback $function_to_add The name of the function you wish to be called.
  * @param int $priority optional. Used to specify the order in which the functions associated with a particular action are executed (default: 10). Lower numbers correspond with earlier execution, and functions with the same priority are executed in the order in which they were added to the action.
- * @param int $accepted_args optional. The number of arguments the function accept (default 1). In WordPress 1.5.1+, hooked functions can take extra arguments that are set when the matching do_action() or apply_filters() call is run. 
- * @return boolean Always true.
+ * @param int $accepted_args optional. The number of arguments the function accept (default 1).
  */
 function add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1) {
-	add_filter($tag, $function_to_add, $priority, $accepted_args);
+	return add_filter($tag, $function_to_add, $priority, $accepted_args);
 }
 
+
 /**
- * Execute functions hooked on a specific action hook.
- * 
+ * do_action() - Execute functions hooked on a specific action hook.
+ *
  * This function invokes all functions attached to action hook <tt>$tag</tt>.
  * It is possible to create new action hooks by simply calling this function,
  * specifying the name of the new hook using the <tt>$tag</tt> parameter.
- * @uses merge_filters
+ *
+ * You can pass extra arguments to the hooks, much like you can with apply_filters().
+ *
+ * @see apply_filters() This function works similar with the exception that nothing is
+ * returned and only the functions or methods are called.
+ *
+ * @package WordPress
+ * @subpackage Plugin
+ * @since 1.2
+ * @global array $wp_filter Stores all of the filters
+ * @global array $wp_actions Increments the amount of times action was triggered.
+ *
  * @param string $tag The name of the action to be executed.
- * @param mixed $arg,... Optional additional arguments which are passed on to the functions hooked to the action. 
+ * @param mixed $arg,... Optional additional arguments which are passed on to the functions hooked to the action.
+ * @return null Will return null if $tag does not exist in $wp_filter array
  */
 function do_action($tag, $arg = '') {
-	global $wp_filter, $wp_actions;
+	global $wp_filter, $wp_actions, $merged_filters, $wp_current_filter;
 
 	if ( is_array($wp_actions) )
 		$wp_actions[] = $tag;
 	else
 		$wp_actions = array($tag);
 
+	$wp_current_filter[] = $tag;
+
+	// Do 'all' actions first
+	if ( isset($wp_filter['all']) ) {
+		$all_args = func_get_args();
+		_wp_call_all_hook($all_args);
+	}
+
+	if ( !isset($wp_filter[$tag]) ) {
+		array_pop($wp_current_filter);
+		return;
+	}
+
 	$args = array();
 	if ( is_array($arg) && 1 == count($arg) && is_object($arg[0]) ) // array(&$this)
 		$args[] =& $arg[0];
@@ -149,22 +297,32 @@
 	for ( $a = 2; $a < func_num_args(); $a++ )
 		$args[] = func_get_arg($a);
 
-	merge_filters($tag);
+	// Sort
+	if ( !isset( $merged_filters[ $tag ] ) ) {
+		ksort($wp_filter[$tag]);
+		$merged_filters[ $tag ] = true;
+	}
 
-	if ( !isset($wp_filter[$tag]) )
-		return;
+	reset( $wp_filter[ $tag ] );
 
-	do{
-		foreach( (array) current($wp_filter[$tag]) as $the_ )
+	do {
+		foreach ( (array) current($wp_filter[$tag]) as $the_ )
 			if ( !is_null($the_['function']) )
 				call_user_func_array($the_['function'], array_slice($args, 0, (int) $the_['accepted_args']));
 
-	} while ( next($wp_filter[$tag]) );
+	} while ( next($wp_filter[$tag]) !== false );
 
+	array_pop($wp_current_filter);
 }
 
 /**
- * Return the number times an action is fired.
+ * did_action() - Return the number times an action is fired.
+ *
+ * @package WordPress
+ * @subpackage Plugin
+ * @since 2.1
+ * @global array $wp_actions Increments the amount of times action was triggered.
+ *
  * @param string $tag The name of the action hook.
  * @return int The number of times action hook <tt>$tag</tt> is fired
  */
@@ -178,41 +336,87 @@
 }
 
 /**
- * Execute functions hooked on a specific action hook, specifying arguments in a array.
- * 
- * This function is identical to {@link do_action}, but the argumetns passe to 
+ * do_action_ref_array() - Execute functions hooked on a specific action hook, specifying arguments in an array.
+ *
+ * @see do_action() This function is identical, but the arguments passed to
  * the functions hooked to <tt>$tag</tt> are supplied using an array.
+ *
+ * @package WordPress
+ * @subpackage Plugin
+ * @since 2.1
+ * @global array $wp_filter Stores all of the filters
+ * @global array $wp_actions Increments the amount of times action was triggered.
+ *
  * @param string $tag The name of the action to be executed.
  * @param array $args The arguments supplied to the functions hooked to <tt>$tag</tt>
+ * @return null Will return null if $tag does not exist in $wp_filter array
  */
 function do_action_ref_array($tag, $args) {
-	global $wp_filter, $wp_actions;
+	global $wp_filter, $wp_actions, $merged_filters, $wp_current_filter;
 
 	if ( !is_array($wp_actions) )
 		$wp_actions = array($tag);
 	else
 		$wp_actions[] = $tag;
 
-	merge_filters($tag);
+	$wp_current_filter[] = $tag;
+
+	// Do 'all' actions first
+	if ( isset($wp_filter['all']) ) {
+		$all_args = func_get_args();
+		_wp_call_all_hook($all_args);
+	}
 
-	if ( !isset($wp_filter[$tag]) )
+	if ( !isset($wp_filter[$tag]) ) {
+		array_pop($wp_current_filter);
 		return;
+	}
+
+	// Sort
+	if ( !isset( $merged_filters[ $tag ] ) ) {
+		ksort($wp_filter[$tag]);
+		$merged_filters[ $tag ] = true;
+	}
+
+	reset( $wp_filter[ $tag ] );
 
-	do{
+	do {
 		foreach( (array) current($wp_filter[$tag]) as $the_ )
 			if ( !is_null($the_['function']) )
 				call_user_func_array($the_['function'], array_slice($args, 0, (int) $the_['accepted_args']));
 
-	} while ( next($wp_filter[$tag]) );
+	} while ( next($wp_filter[$tag]) !== false );
 
+	array_pop($wp_current_filter);
 }
 
 /**
- * Removes a function from a specified action hook. 
- * 
- * This function removes a function attached to a specified action hook. This 
- * method can be used to remove default functions attached to a specific filter 
+ * has_action() - Check if any action has been registered for a hook.
+ *
+ * @package WordPress
+ * @subpackage Plugin
+ * @since 2.5
+ * @see has_filter() has_action() is an alias of has_filter().
+ *
+ * @param string $tag The name of the action hook.
+ * @param callback $function_to_check optional.  If specified, return the priority of that function on this hook or false if not attached.
+ * @return int|boolean Optionally returns the priority on that hook for the specified function.
+ */
+function has_action($tag, $function_to_check = false) {
+	return has_filter($tag, $function_to_check);
+}
+
+/**
+ * remove_action() - Removes a function from a specified action hook.
+ *
+ * This function removes a function attached to a specified action hook. This
+ * method can be used to remove default functions attached to a specific filter
  * hook and possibly replace them with a substitute.
+ *
+ * @package WordPress
+ * @subpackage Plugin
+ * @since 1.2
+ *
  * @param string $tag The action hook to which the function to be removed is hooked.
  * @param callback $function_to_remove The name of the function which should be removed.
  * @param int $priority optional The priority of the function (default: 10).
@@ -220,7 +424,7 @@
  * @return boolean Whether the function is removed.
  */
 function remove_action($tag, $function_to_remove, $priority = 10, $accepted_args = 1) {
-	remove_filter($tag, $function_to_remove, $priority, $accepted_args);
+	return remove_filter($tag, $function_to_remove, $priority, $accepted_args);
 }
 
 //
@@ -228,29 +432,44 @@
 //
 
 /**
- * Gets the basename of a plugin.
- * 
+ * plugin_basename() - Gets the basename of a plugin.
+ *
  * This method extract the name of a plugin from its filename.
+ *
+ * @package WordPress
+ * @subpackage Plugin
+ * @since 1.5
+ *
+ * @access private
+ *
  * @param string $file The filename of plugin.
  * @return string The name of a plugin.
  */
 function plugin_basename($file) {
-	$file = preg_replace('|\\\\+|', '\\\\', $file);
-	$file = preg_replace('/^.*wp-content[\\\\\/]plugins[\\\\\/]/', '', $file);
+	$file = str_replace('\\','/',$file); // sanitize for Win32 installs
+	$file = preg_replace('|/+|','/', $file); // remove any duplicate slash
+	$file = preg_replace('|^.*/' . PLUGINDIR . '/|','',$file); // get relative path from plugins dir
 	return $file;
 }
 
 /**
- * Hook a function on a plugin activation action hook.
- * 
+ * register_activation_hook() - Hook a function on a plugin activation action hook.
+ *
  * When a plugin is activated, the action 'activate_PLUGINNAME' hook is
  * activated. In the name of this hook, PLUGINNAME is replaced with the name of
  * the plugin, including the optional subdirectory. For example, when the plugin
- * is located in <tt>wp-content/plugin/sampleplugin/sample.php</tt>, then the 
- * name of this hook will become 'activate_sampleplugin/sample.php'. 
- * When the plugin consists of only one file and is (as by default) located at 
- * <tt>wp-content/plugin/sample.php</tt> the name of this hook will be 
+ * is located in <tt>wp-content/plugin/sampleplugin/sample.php</tt>, then the
+ * name of this hook will become 'activate_sampleplugin/sample.php'
+ * When the plugin consists of only one file and is (as by default) located at
+ * <tt>wp-content/plugin/sample.php</tt> the name of this hook will be
  * 'activate_sample.php'.
+ *
+ * @package WordPress
+ * @subpackage Plugin
+ * @since 2.0
+ *
+ * @access private
+ *
  * @param string $file The filename of the plugin including the path.
  * @param string $function the function hooked to the 'activate_PLUGIN' action.
  */
@@ -260,16 +479,23 @@
 }
 
 /**
- * Hook a function on a plugin deactivation action hook.
- * 
+ * register_deactivation_hook() - Hook a function on a plugin deactivation action hook.
+ *
  * When a plugin is deactivated, the action 'deactivate_PLUGINNAME' hook is
  * deactivated. In the name of this hook, PLUGINNAME is replaced with the name of
  * the plugin, including the optional subdirectory. For example, when the plugin
- * is located in <tt>wp-content/plugin/sampleplugin/sample.php</tt>, then the 
- * name of this hook will become 'activate_sampleplugin/sample.php'. 
- * When the plugin consists of only one file and is (as by default) located at 
- * <tt>wp-content/plugin/sample.php</tt> the name of this hook will be 
+ * is located in <tt>wp-content/plugin/sampleplugin/sample.php</tt>, then the
+ * name of this hook will become 'activate_sampleplugin/sample.php'.
+ * When the plugin consists of only one file and is (as by default) located at
+ * <tt>wp-content/plugin/sample.php</tt> the name of this hook will be
  * 'activate_sample.php'.
+ *
+ * @package WordPress
+ * @subpackage Plugin
+ * @since 2.0
+ *
+ * @access private
+ *
  * @param string $file The filename of the plugin including the path.
  * @param string $function the function hooked to the 'activate_PLUGIN' action.
  */
@@ -278,4 +504,93 @@
 	add_action('deactivate_' . $file, $function);
 }
 
-?>
\ No newline at end of file
+/**
+ * _wp_call_all_hook() - Calls the 'all' hook, which will process the functions hooked into it.
+ *
+ * The 'all' hook passes all of the arguments or parameters that were used for the
+ * hook, which this function was called for.
+ *
+ * This function is used internally for apply_filters(), do_action(), and do_action_ref_array()
+ * and is not meant to be used from outside those functions. This function does not check for the
+ * existence of the all hook, so it will fail unless the all hook exists prior to this function call.
+ *
+ * @package WordPress
+ * @subpackage Plugin
+ * @since 2.5
+ * @access private
+ *
+ * @uses $wp_filter Used to process all of the functions in the 'all' hook
+ *
+ * @param array $args The collected parameters from the hook that was called.
+ * @param string $hook Optional. The hook name that was used to call the 'all' hook.
+ */
+function _wp_call_all_hook($args) {
+	global $wp_filter;
+
+	reset( $wp_filter['all'] );
+	do {
+		foreach( (array) current($wp_filter['all']) as $the_ )
+			if ( !is_null($the_['function']) )
+				call_user_func_array($the_['function'], $args);
+
+	} while ( next($wp_filter['all']) !== false );
+}
+
+/**
+ * _wp_filter_build_unique_id() - Build Unique ID for storage and retrieval
+ *
+ * The old way to serialize the callback caused issues and this function is the
+ * solution. It works by checking for objects and creating an a new property in
+ * the class to keep track of the object and new objects of the same class that
+ * need to be added.
+ *
+ * It also allows for the removal of actions and filters for objects after they
+ * change class properties. It is possible to include the property $wp_filter_id
+ * in your class and set it to "null" or a number to bypass the workaround. However
+ * this will prevent you from adding new classes and any new classes will overwrite
+ * the previous hook by the same class.
+ *
+ * Functions and static method callbacks are just returned as strings and shouldn't
+ * have any speed penalty.
+ *
+ * @package WordPress
+ * @subpackage Plugin
+ * @since 2.2.3
+ *
+ * @link http://trac.wordpress.org/ticket/3875
+ *
+ * @access private
+ *
+ * @global array $wp_filter Storage for all of the filters and actions
+ * @param string $tag Used in counting how many hooks were applied
+ * @param string|array $function Used for creating unique id
+ * @param int|bool $priority Used in counting how many hooks were applied.  If === false and $function is an object reference, we return the unique id only if it already has one, false otherwise.
+ * @param string $type filter or action
+ * @return string Unique ID for usage as array key
+ */
+function _wp_filter_build_unique_id($tag, $function, $priority) {
+	global $wp_filter;
+
+	// If function then just skip all of the tests and not overwrite the following.
+	if ( is_string($function) )
+		return $function;
+	// Object Class Calling
+	else if (is_object($function[0]) ) {
+		$obj_idx = get_class($function[0]).$function[1];
+		if ( !isset($function[0]->wp_filter_id) ) {
+			if ( false === $priority )
+				return false;
+			$count = count((array)$wp_filter[$tag][$priority]);
+			$function[0]->wp_filter_id = $count;
+			$obj_idx .= $count;
+			unset($count);
+		} else
+			$obj_idx .= $function[0]->wp_filter_id;
+		return $obj_idx;
+	}
+	// Static Calling
+	else if ( is_string($function[0]) )
+		return $function[0].$function[1];
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-includes/post-template.php 2.5.src/wp-includes/post-template.php
--- 2.2.2.src/wp-includes/post-template.php	2007-06-15 12:45:21.000000000 -0500
+++ 2.5.src/wp-includes/post-template.php	2008-03-23 13:19:03.000000000 -0500
@@ -18,26 +18,50 @@
 
 function the_title($before = '', $after = '', $echo = true) {
 	$title = get_the_title();
-	if ( strlen($title) > 0 ) {
-		$title = apply_filters('the_title', $before . $title . $after, $before, $after);
-		if ( $echo )
-			echo $title;
-		else
-			return $title;
-	}
+
+	if ( strlen($title) == 0 )
+		return;
+
+	$title = $before . $title . $after;
+
+	if ( $echo )
+		echo $title;
+	else
+		return $title;
 }
 
+function the_title_attribute( $args = '' ) {
+	$title = get_the_title();
+
+	if ( strlen($title) == 0 )
+		return;
+
+	$defaults = array('before' => '', 'after' =>  '', 'echo' => true);
+	$r = wp_parse_args($args, $defaults);
+	extract( $r, EXTR_SKIP );
+
+
+	$title = $before . $title . $after;
+	$title = attribute_escape(strip_tags($title));
+
+	if ( $echo )
+		echo $title;
+	else
+		return $title;
+}
 
-function get_the_title($id = 0) {
+function get_the_title( $id = 0 ) {
 	$post = &get_post($id);
 
 	$title = $post->post_title;
-	if ( !empty($post->post_password) )
-		$title = sprintf(__('Protected: %s'), $title);
-	else if ( 'private' == $post->post_status )
-		$title = sprintf(__('Private: %s'), $title);
 
-	return $title;
+	if ( !is_admin() ) {
+		if ( !empty($post->post_password) )
+			$title = sprintf(__('Protected: %s'), $title);
+		else if ( isset($post->post_status) && 'private' == $post->post_status )
+			$title = sprintf(__('Private: %s'), $title);
+	}
+	return apply_filters( 'the_title', $title );
 }
 
 function the_guid( $id = 0 ) {
@@ -59,13 +83,12 @@
 
 
 function get_the_content($more_link_text = '(more...)', $stripteaser = 0, $more_file = '') {
-	global $id, $post, $more, $single, $withcomments, $page, $pages, $multipage, $numpages;
-	global $preview;
-	global $pagenow;
+	global $id, $post, $more, $page, $pages, $multipage, $preview, $pagenow;
+
 	$output = '';
 
 	if ( !empty($post->post_password) ) { // if there's a password
-		if ( stripslashes($_COOKIE['wp-postpass_'.COOKIEHASH]) != $post->post_password ) {	// and it doesn't match the cookie
+		if ( !isset($_COOKIE['wp-postpass_'.COOKIEHASH]) || stripslashes($_COOKIE['wp-postpass_'.COOKIEHASH]) != $post->post_password ) {	// and it doesn't match the cookie
 			$output = get_the_password_form();
 			return $output;
 		}
@@ -115,12 +138,12 @@
 }
 
 
-function get_the_excerpt($fakeit = true) {
-	global $id, $post;
+function get_the_excerpt($deprecated = '') {
+	global $post;
 	$output = '';
 	$output = $post->post_excerpt;
 	if ( !empty($post->post_password) ) { // if there's a password
-		if ( $_COOKIE['wp-postpass_'.COOKIEHASH] != $post->post_password ) {  // and it doesn't match the cookie
+		if ( !isset($_COOKIE['wp-postpass_'.COOKIEHASH]) || $_COOKIE['wp-postpass_'.COOKIEHASH] != $post->post_password ) {  // and it doesn't match the cookie
 			$output = __('There is no excerpt because this is a protected post.');
 			return $output;
 		}
@@ -129,21 +152,23 @@
 	return apply_filters('get_the_excerpt', $output);
 }
 
+function has_excerpt( $id = 0 ) {
+	$post = &get_post( $id );
+	return ( !empty( $post->post_excerpt ) );
+}
 
 function wp_link_pages($args = '') {
-	global $post;
-
-	if ( is_array($args) )
-		$r = &$args;
-	else
-		parse_str($args, $r);
+	$defaults = array(
+		'before' => '<p>' . __('Pages:'), 'after' => '</p>',
+		'next_or_number' => 'number', 'nextpagelink' => __('Next page'),
+		'previouspagelink' => __('Previous page'), 'pagelink' => '%',
+		'more_file' => '', 'echo' => 1
+	);
 
-	$defaults = array('before' => '<p>' . __('Pages:'), 'after' => '</p>', 'next_or_number' => 'number', 'nextpagelink' => __('Next page'),
-			'previouspagelink' => __('Previous page'), 'pagelink' => '%', 'more_file' => '', 'echo' => 1);
-	$r = array_merge($defaults, $r);
-	extract($r, EXTR_SKIP);
+	$r = wp_parse_args( $args, $defaults );
+	extract( $r, EXTR_SKIP );
 
-	global $id, $page, $numpages, $multipage, $more, $pagenow;
+	global $post, $page, $numpages, $multipage, $more, $pagenow;
 	if ( $more_file != '' )
 		$file = $more_file;
 	else
@@ -160,7 +185,7 @@
 					if ( 1 == $i ) {
 						$output .= '<a href="' . get_permalink() . '">';
 					} else {
-						if ( '' == get_option('permalink_structure') || 'draft' == $post->post_status )
+						if ( '' == get_option('permalink_structure') || in_array($post->post_status, array('draft', 'pending')) )
 							$output .= '<a href="' . get_permalink() . '&amp;page=' . $i . '">';
 						else
 							$output .= '<a href="' . trailingslashit(get_permalink()) . user_trailingslashit($i, 'single_paged') . '">';
@@ -179,7 +204,7 @@
 					if ( 1 == $i ) {
 						$output .= '<a href="' . get_permalink() . '">' . $previouspagelink . '</a>';
 					} else {
-						if ( '' == get_option('permalink_structure') || 'draft' == $post->post_status )
+						if ( '' == get_option('permalink_structure') || in_array($post->post_status, array('draft', 'pending')) )
 							$output .= '<a href="' . get_permalink() . '&amp;page=' . $i . '">' . $previouspagelink . '</a>';
 						else
 							$output .= '<a href="' . trailingslashit(get_permalink()) . user_trailingslashit($i, 'single_paged') . '">' . $previouspagelink . '</a>';
@@ -190,7 +215,7 @@
 					if ( 1 == $i ) {
 						$output .= '<a href="' . get_permalink() . '">' . $nextpagelink . '</a>';
 					} else {
-						if ( '' == get_option('permalink_structure') || 'draft' == $post->post_status )
+						if ( '' == get_option('permalink_structure') || in_array($post->post_status, array('draft', 'pending')) )
 							$output .= '<a href="' . get_permalink() . '&amp;page=' . $i . '">' . $nextpagelink . '</a>';
 						else
 							$output .= '<a href="' . trailingslashit(get_permalink()) . user_trailingslashit($i, 'single_paged') . '">' . $nextpagelink . '</a>';
@@ -225,8 +250,6 @@
 
 // this will probably change at some point...
 function the_meta() {
-	global $id;
-
 	if ( $keys = get_post_custom_keys() ) {
 		echo "<ul class='post-meta'>\n";
 		foreach ( $keys as $key ) {
@@ -247,15 +270,14 @@
 //
 
 function wp_dropdown_pages($args = '') {
-	if ( is_array($args) )
-		$r = &$args;
-	else
-		parse_str($args, $r);
+	$defaults = array(
+		'depth' => 0, 'child_of' => 0,
+		'selected' => 0, 'echo' => 1,
+		'name' => 'page_id', 'show_option_none' => ''
+	);
 
-	$defaults = array('depth' => 0, 'child_of' => 0, 'selected' => 0, 'echo' => 1,
-		'name' => 'page_id', 'show_option_none' => '');
-	$r = array_merge($defaults, $r);
-	extract($r, EXTR_SKIP);
+	$r = wp_parse_args( $args, $defaults );
+	extract( $r, EXTR_SKIP );
 
 	$pages = get_pages($r);
 	$output = '';
@@ -277,14 +299,16 @@
 }
 
 function wp_list_pages($args = '') {
-	if ( is_array($args) )
-		$r = &$args;
-	else
-		parse_str($args, $r);
+	$defaults = array(
+		'depth' => 0, 'show_date' => '',
+		'date_format' => get_option('date_format'),
+		'child_of' => 0, 'exclude' => '',
+		'title_li' => __('Pages'), 'echo' => 1,
+		'authors' => '', 'sort_column' => 'menu_order, post_title'
+	);
 
-	$defaults = array('depth' => 0, 'show_date' => '', 'date_format' => get_option('date_format'),
-		'child_of' => 0, 'exclude' => '', 'title_li' => __('Pages'), 'echo' => 1, 'authors' => '', 'sort_column' => 'menu_order, post_title');
-	$r = array_merge($defaults, $r);
+	$r = wp_parse_args( $args, $defaults );
+	extract( $r, EXTR_SKIP );
 
 	$output = '';
 	$current_page = 0;
@@ -296,6 +320,7 @@
 	$r['exclude'] = implode(',', apply_filters('wp_list_pages_excludes', explode(',', $r['exclude'])));
 
 	// Query pages.
+	$r['hierarchical'] = 0;
 	$pages = get_pages($r);
 
 	if ( !empty($pages) ) {
@@ -303,7 +328,7 @@
 			$output .= '<li class="pagenav">' . $r['title_li'] . '<ul>';
 
 		global $wp_query;
-		if ( is_page() )
+		if ( is_page() || $wp_query->is_posts_page )
 			$current_page = $wp_query->get_queried_object_id();
 		$output .= walk_page_tree($pages, $r['depth'], $current_page, $r);
 
@@ -339,37 +364,63 @@
 // Attachments
 //
 
-function the_attachment_link($id = 0, $fullsize = false, $max_dims = false) {
-	echo get_the_attachment_link($id, $fullsize, $max_dims);
+function the_attachment_link($id = 0, $fullsize = false, $deprecated = false, $permalink = false) {
+	if ( $fullsize )
+		echo wp_get_attachment_link($id, 'full', $permalink);
+	else
+		echo wp_get_attachment_link($id, 'thumbnail', $permalink);
 }
 
-function get_the_attachment_link($id = 0, $fullsize = false, $max_dims = false) {
+// get an attachment page link using an image or icon if possible
+function wp_get_attachment_link($id = 0, $size = 'thumbnail', $permalink = false, $icon = false) {
+	$_post = & get_post( intval($id) );
+
+	if ( ('attachment' != $_post->post_type) || !$url = wp_get_attachment_url($_post->ID) )
+		return __('Missing Attachment');
+
+	if ( $permalink )
+		$url = get_attachment_link($_post->ID);
+
+	$post_title = attribute_escape($_post->post_title);
+
+	$link_text = wp_get_attachment_image($id, $size, $icon);
+	if ( !$link_text )
+		$link_text = $_post->post_title;
+
+	return "<a href='$url' title='$post_title'>$link_text</a>";
+
+}
+
+// deprecated - use wp_get_attachment_link()
+function get_the_attachment_link($id = 0, $fullsize = false, $max_dims = false, $permalink = false) {
 	$id = (int) $id;
 	$_post = & get_post($id);
 
 	if ( ('attachment' != $_post->post_type) || !$url = wp_get_attachment_url($_post->ID) )
 		return __('Missing Attachment');
 
+	if ( $permalink )
+		$url = get_attachment_link($_post->ID);
+
 	$post_title = attribute_escape($_post->post_title);
 
 	$innerHTML = get_attachment_innerHTML($_post->ID, $fullsize, $max_dims);
 	return "<a href='$url' title='$post_title'>$innerHTML</a>";
 }
 
+
+// deprecated: use wp_get_attachment_image_src()
 function get_attachment_icon_src( $id = 0, $fullsize = false ) {
 	$id = (int) $id;
 	if ( !$post = & get_post($id) )
 		return false;
 
-	$imagedata = wp_get_attachment_metadata( $post->ID );
-
 	$file = get_attached_file( $post->ID );
 
-	if ( !$fullsize && $thumbfile = wp_get_attachment_thumb_file( $post->ID ) ) {
+	if ( !$fullsize && $src = wp_get_attachment_thumb_url( $post->ID ) ) {
 		// We have a thumbnail desired, specified and existing
 
-		$src = wp_get_attachment_thumb_url( $post->ID );
-		$src_file = $thumbfile;
+		$src_file = basename($src);
 		$class = 'attachmentthumb';
 	} elseif ( wp_attachment_is_image( $post->ID ) ) {
 		// We have an image without a thumbnail
@@ -390,11 +441,12 @@
 	return array($src, $src_file);
 }
 
+// deprecated: use wp_get_attachment_image()
 function get_attachment_icon( $id = 0, $fullsize = false, $max_dims = false ) {
 	$id = (int) $id;
 	if ( !$post = & get_post($id) )
 		return false;
-
+		
 	if ( !$src = get_attachment_icon_src( $post->ID, $fullsize ) )
 		return false;
 
@@ -420,7 +472,10 @@
 			}
 		} else {
 			$post->iconsize = array($imagesize[0], $imagesize[1]);
+			$constraint = '';
 		}
+	} else {
+		$constraint = '';
 	}
 
 	$post_title = attribute_escape($post->post_title);
@@ -430,6 +485,7 @@
 	return apply_filters( 'attachment_icon', $icon, $post->ID );
 }
 
+// deprecated: use wp_get_attachment_image()
 function get_attachment_innerHTML($id = 0, $fullsize = false, $max_dims = false) {
 	$id = (int) $id;
 	if ( !$post = & get_post($id) )
@@ -445,8 +501,14 @@
 }
 
 function prepend_attachment($content) {
+	global $post;
+
+	if ( empty($post->post_type) || $post->post_type != 'attachment' )
+		return $content;
+
 	$p = '<p class="attachment">';
-	$p .= get_the_attachment_link(false, true, array(400, 300));
+	// show the medium sized image representation of the attachment if available, and link to the raw file
+	$p .= wp_get_attachment_link(0, 'medium', false);
 	$p .= '</p>';
 	$p = apply_filters('prepend_attachment', $p);
 
@@ -458,12 +520,48 @@
 //
 
 function get_the_password_form() {
+	global $post;
+	$label = 'pwbox-'.(empty($post->ID) ? rand() : $post->ID);
 	$output = '<form action="' . get_option('siteurl') . '/wp-pass.php" method="post">
 	<p>' . __("This post is password protected. To view it please enter your password below:") . '</p>
-	<p><label>' . __("Password:") . ' <input name="post_password" type="password" size="20" /></label> <input type="submit" name="Submit" value="' . __("Submit") . '" /></p>
+	<p><label for="' . $label . '">' . __("Password:") . ' <input name="post_password" id="' . $label . '" type="password" size="20" /></label> <input type="submit" name="Submit" value="' . __("Submit") . '" /></p>
 	</form>
 	';
 	return $output;
 }
 
+/**
+ * is_page_template() - Determine wether or not we are in a page template
+ *
+ * This template tag allows you to determine wether or not you are in a page template.
+ * You can optional provide a template name and then the check will be specific to
+ * that template.
+ *
+ * @package Template Tags
+ * @global object $wp_query
+ * @param string $template The specific template name if specific matching is required
+ */
+function is_page_template($template = '') {
+	if (!is_page()) {
+		return false;
+	}
+
+	global $wp_query;
+
+	$page = $wp_query->get_queried_object();
+	$custom_fields = get_post_custom_values('_wp_page_template',$page->ID);
+	$page_template = $custom_fields[0];
+
+	// We have no argument passed so just see if a page_template has been specified
+	if ( empty( $template ) ) {
+		if (!empty( $page_template ) ) {
+			return true;
+		}
+	} elseif ( $template == $page_template) {
+		return true;
+	}
+
+	return false;
+}
+
 ?>
diff -x .svn -aruN 2.2.2.src/wp-includes/post.php 2.5.src/wp-includes/post.php
--- 2.2.2.src/wp-includes/post.php	2007-06-15 12:45:21.000000000 -0500
+++ 2.5.src/wp-includes/post.php	2008-03-22 19:58:47.000000000 -0500
@@ -1,9 +1,25 @@
 <?php
+/**
+ * Post functions and post utility function
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 1.5
+ */
 
-//
-// Post functions
-//
-
+/**
+ * get_attached_file() - Get metadata for an attached file
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.0
+ *
+ * @param int $attachment_id Attachment ID
+ * @param bool $unfiltered Whether to apply filters or not
+ * @return array {@internal Missing Description}}
+ */
 function get_attached_file( $attachment_id, $unfiltered = false ) {
 	$file = get_post_meta( $attachment_id, '_wp_attached_file', true );
 	if ( $unfiltered )
@@ -11,6 +27,19 @@
 	return apply_filters( 'get_attached_file', $file, $attachment_id );
 }
 
+/**
+ * update_attached_file() - Update attached file metadata
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.1
+ *
+ * @param int $attachment_id Attachment ID
+ * @param string $file {@internal Missing Description}}
+ * @return bool|mixed {@internal Missing Description}}
+ */
 function update_attached_file( $attachment_id, $file ) {
 	if ( !get_post( $attachment_id ) )
 		return false;
@@ -25,36 +54,48 @@
 		return add_post_meta( $attachment_id, '_wp_attached_file', $file );
 }
 
+/**
+ * get_children() - Get post children
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.0
+ *
+ * @param mixed $args {@internal Missing Description}}
+ * @param string $output {@internal Missing Description}}
+ * @return mixed {@internal Missing Description}}
+ */
 function &get_children($args = '', $output = OBJECT) {
-	global $post_cache, $wpdb, $blog_id;
-
-	if ( empty($args) ) {
-		if ( isset($GLOBALS['post']) )
-			$r = array('post_parent' => & $GLOBALS['post']->post_parent);
-		else
+	if ( empty( $args ) ) {
+		if ( isset( $GLOBALS['post'] ) ) {
+			$args = 'post_parent=' . (int) $GLOBALS['post']->post_parent;
+		} else {
 			return false;
-	} elseif ( is_object($args) )
-		$r = array('post_parent' => $post->post_parent);
-	elseif ( is_numeric($args) )
-		$r = array('post_parent' => $args);
-	elseif ( is_array($args) )
-		$r = &$args;
-	else
-		parse_str($args, $r);
+		}
+	} elseif ( is_object( $args ) ) {
+		$args = 'post_parent=' . (int) $args->post_parent;
+	} elseif ( is_numeric( $args ) ) {
+		$args = 'post_parent=' . (int) $args;
+	}
 
-	$defaults = array('numberposts' => -1, 'post_type' => '', 'post_status' => '', 'post_parent' => 0);
-	$r = array_merge($defaults, $r);
+	$defaults = array(
+		'numberposts' => -1, 'post_type' => '',
+		'post_status' => '', 'post_parent' => 0
+	);
+
+	$r = wp_parse_args( $args, $defaults );
 
 	$children = get_posts( $r );
 
-	if ( $children ) {
-		foreach ( $children as $key => $child ) {
-			$post_cache[$blog_id][$child->ID] =& $children[$key];
-			$kids[$child->ID] =& $children[$key];
-		}
-	} else {
+	if ( !$children )
 		return false;
-	}
+
+	update_post_cache($children);
+
+	foreach ( $children as $key => $child )
+		$kids[$child->ID] =& $children[$key];
 
 	if ( $output == OBJECT ) {
 		return $kids;
@@ -71,7 +112,18 @@
 	}
 }
 
-// get extended entry info (<!--more-->)
+/**
+ * get_extended() - get extended entry info (<!--more-->)
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 1.0.1
+ *
+ * @param string $post {@internal Missing Description}}
+ * @return array {@internal Missing Description}}
+ */
 function get_extended($post) {
 	//Match the new style more links
 	if ( preg_match('/<!--more(.*?)?-->/', $post, $matches) ) {
@@ -88,52 +140,118 @@
 	return array('main' => $main, 'extended' => $extended);
 }
 
-// Retrieves post data given a post ID or post object.
-// Handles post caching.
-function &get_post(&$post, $output = OBJECT) {
-	global $post_cache, $wpdb, $blog_id;
+/**
+ * get_post() - Retrieves post data given a post ID or post object.
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 1.5.1
+ * @uses $wpdb
+ *
+ * @param int|object &$post post ID or post object
+ * @param string $output {@internal Missing Description}}
+ * @param string $filter {@internal Missing Description}}
+ * @return mixed {@internal Missing Description}}
+ */
+function &get_post(&$post, $output = OBJECT, $filter = 'raw') {
+	global $wpdb;
+	$null = null;
 
 	if ( empty($post) ) {
 		if ( isset($GLOBALS['post']) )
 			$_post = & $GLOBALS['post'];
 		else
-			$_post = null;
+			return $null;
 	} elseif ( is_object($post) ) {
-		if ( 'page' == $post->post_type )
-			return get_page($post, $output);
-		if ( !isset($post_cache[$blog_id][$post->ID]) )
-			$post_cache[$blog_id][$post->ID] = &$post;
-		$_post = & $post_cache[$blog_id][$post->ID];
+		wp_cache_add($post->ID, $post, 'posts');
+		$_post = &$post;
 	} else {
 		$post = (int) $post;
-		if ( isset($post_cache[$blog_id][$post]) )
-			$_post = & $post_cache[$blog_id][$post];
-		elseif ( $_post = wp_cache_get($post, 'pages') )
-			return get_page($_post, $output);
-		else {
-			$query = "SELECT * FROM $wpdb->posts WHERE ID = '$post' LIMIT 1";
-			$_post = & $wpdb->get_row($query);
-			if ( 'page' == $_post->post_type )
-				return get_page($_post, $output);
-			$post_cache[$blog_id][$post] = & $_post;
+		if ( ! $_post = wp_cache_get($post, 'posts') ) {
+			$_post = & $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->posts WHERE ID = %d LIMIT 1", $post));
+			wp_cache_add($_post->ID, $_post, 'posts');
 		}
 	}
 
-	if ( defined('WP_IMPORTING') )
-		unset($post_cache[$blog_id]);
+	// Populate the ancestors field.
+	// Not cached since we don't clear cache for ancestors when a post changes.
+	_get_post_ancestors($_post);
+
+	$_post = sanitize_post($_post, $filter);
 
 	if ( $output == OBJECT ) {
 		return $_post;
 	} elseif ( $output == ARRAY_A ) {
-		return get_object_vars($_post);
+		$__post = get_object_vars($_post);
+		return $__post;
 	} elseif ( $output == ARRAY_N ) {
-		return array_values(get_object_vars($_post));
+		$__post = array_values(get_object_vars($_post));
+		return $__post;
 	} else {
 		return $_post;
 	}
 }
 
-// Takes a post ID, returns its mime type.
+/**
+ * get_post_ancestors() - Retrieve ancestors for a post
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.5
+ *
+ * @param string $field {@internal Missing Description}}
+ * @param int|object &$post post ID or post object
+ * @return array of ancestor IDs
+ */
+function get_post_ancestors($post) {
+	$post = get_post();
+
+	if ( !empty($post->ancestors) )
+		return $post->ancestors;
+
+	return array();
+}
+
+/**
+ * get_post_field() - Retrieve a field based on a post ID.
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.3
+ *
+ * @param string $field {@internal Missing Description}}
+ * @param id $post Post ID
+ * @param string $context Optional. How to filter the field
+ * @return WP_Error|string Value in post field or WP_Error on failure
+ */
+function get_post_field( $field, $post, $context = 'display' ) {
+	$post = (int) $post;
+	$post = get_post( $post );
+
+	if ( is_wp_error($post) )
+		return $post;
+
+	if ( !is_object($post) )
+		return '';
+
+	if ( !isset($post->$field) )
+		return '';
+
+	return sanitize_post_field($field, $post->$field, $post->ID, $context);
+}
+
+/**
+ * get_post_mime_type() - Takes a post ID, returns its mime type.
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.0
+ *
+ * @param int $ID Post ID
+ * @return bool|string False on failure or returns the mime type
+ */
 function get_post_mime_type($ID = '') {
 	$post = & get_post($ID);
 
@@ -143,6 +261,18 @@
 	return false;
 }
 
+/**
+ * get_post_status() - Takes a post ID and returns its status
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.0
+ *
+ * @param int $ID {@internal Missing Description}}
+ * @return string|bool post status or false
+ */
 function get_post_status($ID = '') {
 	$post = get_post($ID);
 
@@ -156,8 +286,68 @@
 	return false;
 }
 
+/**
+ * get_post_statuses( ) - Retuns the possible user post status values
+ *
+ * Posts have a limited set of valid status values, this provides the
+ * post_status values and descriptions.
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.5
+ *
+ * @return array
+ */
+function get_post_statuses( ) {
+	$status = array(
+		'draft'			=> __('Draft'),
+		'pending'		=> __('Pending Review'),
+		'private'		=> __('Private'),
+		'publish'		=> __('Published')
+	);
+
+	return $status;
+}
+
+/**
+ * get_page_statuses( ) - Retuns the possible user page status values
+ *
+ * Pages have a limited set of valid status values, this provides the
+ * post_status values and descriptions.
+ *
+ * @package WordPress
+ * @subpackage Page
+ * @since 2.5
+ *
+ * @return array
+ */
+function get_page_statuses( ) {
+	$status = array(
+		'draft'			=> __('Draft'),
+		'private'		=> __('Private'),
+		'publish'		=> __('Published')
+	);
+
+	return $status;
+}
+
+/**
+ * get_post_type() - Returns post type
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.1
+ *
+ * @uses $wpdb
+ * @uses $posts {@internal Missing Description}}
+ *
+ * @param mixed $post post object or post ID
+ * @return mixed post type or false
+ */
 function get_post_type($post = false) {
-	global $wpdb, $posts;
+	global $posts;
 
 	if ( false === $post )
 		$post = $posts[0];
@@ -170,19 +360,64 @@
 	return false;
 }
 
-function get_posts($args) {
+/**
+ * set_post_type() - Set post type
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.5
+ *
+ * @uses $wpdb
+ * @uses $posts {@internal Missing Description}}
+ *
+ * @param mixed $post_id post ID
+ * @param mixed post type
+ * @return bool {@internal Missing Description}}
+ */
+function set_post_type( $post_id = 0, $post_type = 'post' ) {
 	global $wpdb;
 
-	if ( is_array($args) )
-		$r = &$args;
+	$post_type = sanitize_post_field('post_type', $post_type, $post_id, 'db');
+	$return = $wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET post_type = %s WHERE ID = %d", $post_type, $post_id) );
+
+	if ( 'page' == $post_type )
+		clean_page_cache($post_id);
 	else
-		parse_str($args, $r);
+		clean_post_cache($post_id);
+
+	return $return;
+}
+
+/**
+ * get_posts() - Returns a number of posts
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 1.2
+ * @uses $wpdb
+ *
+ * @param array $args {@internal Missing Description}}
+ * @return array {@internal Missing Description}}
+ */
+function get_posts($args) {
+	global $wpdb;
+
+	$defaults = array(
+		'numberposts' => 5, 'offset' => 0,
+		'category' => 0, 'orderby' => 'post_date',
+		'order' => 'DESC', 'include' => '',
+		'exclude' => '', 'meta_key' => '',
+		'meta_value' =>'', 'post_type' => 'post',
+		'post_status' => 'publish', 'post_parent' => 0
+	);
+
+	$r = wp_parse_args( $args, $defaults );
+	extract( $r, EXTR_SKIP );
 
-	$defaults = array('numberposts' => 5, 'offset' => 0, 'category' => 0,
-		'orderby' => 'post_date', 'order' => 'DESC', 'include' => '', 'exclude' => '',
-		'meta_key' => '', 'meta_value' =>'', 'post_type' => 'post', 'post_status' => 'publish', 'post_parent' => 0);
-	$r = array_merge($defaults, $r);
-	extract($r, EXTR_SKIP);
 	$numberposts = (int) $numberposts;
 	$offset = (int) $offset;
 	$category = (int) $category;
@@ -201,9 +436,9 @@
 		if ( count($incposts) ) {
 			foreach ( $incposts as $incpost ) {
 				if (empty($inclusions))
-					$inclusions = ' AND ( ID = ' . intval($incpost) . ' ';
+					$inclusions = $wpdb->prepare(' AND ( ID = %d ', $incpost);
 				else
-					$inclusions .= ' OR ID = ' . intval($incpost) . ' ';
+					$inclusions .= $wpdb->prepare(' OR ID = %d ', $incpost);
 			}
 		}
 	}
@@ -216,9 +451,9 @@
 		if ( count($exposts) ) {
 			foreach ( $exposts as $expost ) {
 				if (empty($exclusions))
-					$exclusions = ' AND ( ID <> ' . intval($expost) . ' ';
+					$exclusions = $wpdb->prepare(' AND ( ID <> %d ', $expost);
 				else
-					$exclusions .= ' AND ID <> ' . intval($expost) . ' ';
+					$exclusions .= $wpdb->prepare(' AND ID <> %d ', $expost);
 			}
 		}
 	}
@@ -226,18 +461,20 @@
 		$exclusions .= ')';
 
 	$query  = "SELECT DISTINCT * FROM $wpdb->posts ";
-	$query .= empty( $category ) ? '' : ", $wpdb->post2cat "; 
+	$query .= empty( $category ) ? '' : ", $wpdb->term_relationships, $wpdb->term_taxonomy  ";
 	$query .= empty( $meta_key ) ? '' : ", $wpdb->postmeta ";
 	$query .= " WHERE 1=1 ";
-	$query .= empty( $post_type ) ? '' : "AND post_type = '$post_type' ";
-	$query .= empty( $post_status ) ? '' : "AND post_status = '$post_status' ";
+	$query .= empty( $post_type ) ? '' : $wpdb->prepare("AND post_type = %s ", $post_type);
+	$query .= empty( $post_status ) ? '' : $wpdb->prepare("AND post_status = %s ", $post_status);
 	$query .= "$exclusions $inclusions " ;
-	$query .= empty( $category ) ? '' : "AND ($wpdb->posts.ID = $wpdb->post2cat.post_id AND $wpdb->post2cat.category_id = " . $category. ") ";
-	$query .= empty( $post_parent ) ? '' : "AND $wpdb->posts.post_parent = '$post_parent' ";
+	$query .= empty( $category ) ? '' : $wpdb->prepare("AND ($wpdb->posts.ID = $wpdb->term_relationships.object_id AND $wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id AND $wpdb->term_taxonomy.term_id = %d AND $wpdb->term_taxonomy.taxonomy = 'category')", $category);
+	$query .= empty( $post_parent ) ? '' : $wpdb->prepare("AND $wpdb->posts.post_parent = %d ", $post_parent);
+	// expected_slashed ($meta_key, $meta_value) -- Also, this looks really funky, doesn't seem like it works
 	$query .= empty( $meta_key ) | empty($meta_value)  ? '' : " AND ($wpdb->posts.ID = $wpdb->postmeta.post_id AND $wpdb->postmeta.meta_key = '$meta_key' AND $wpdb->postmeta.meta_value = '$meta_value' )";
+	$query .= empty( $post_mime_type ) ? '' : wp_post_mime_type_where($post_mime_type);
 	$query .= " GROUP BY $wpdb->posts.ID ORDER BY " . $orderby . ' ' . $order;
 	if ( 0 < $numberposts )
-		$query .= " LIMIT " . $offset . ',' . $numberposts;
+		$query .= $wpdb->prepare(" LIMIT %d,%d", $offset, $numberposts);
 
 	$posts = $wpdb->get_results($query);
 
@@ -250,133 +487,224 @@
 // Post meta functions
 //
 
-function add_post_meta($post_id, $key, $value, $unique = false) {
-	global $wpdb, $post_meta_cache, $blog_id;
+/**
+ * add_post_meta() - adds metadata for post
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 1.5
+ * @uses $wpdb
+ *
+ * @param int $post_id post ID
+ * @param string $key {@internal Missing Description}}
+ * @param mixed $value {@internal Missing Description}}
+ * @param bool $unique whether to check for a value with the same key
+ * @return bool {@internal Missing Description}}
+ */
+function add_post_meta($post_id, $meta_key, $meta_value, $unique = false) {
+	global $wpdb;
 
-	$post_id = (int) $post_id;
+	// expected_slashed ($meta_key)
+	$meta_key = stripslashes($meta_key);
 
-	if ( $unique ) {
-		if ( $wpdb->get_var("SELECT meta_key FROM $wpdb->postmeta WHERE meta_key = '$key' AND post_id = '$post_id'") ) {
-			return false;
-		}
-	}
+	if ( $unique && $wpdb->get_var( $wpdb->prepare( "SELECT meta_key FROM $wpdb->postmeta WHERE meta_key = %s AND post_id = %d", $meta_key, $post_id ) ) )
+		return false;
 
-	$post_meta_cache[$blog_id][$post_id][$key][] = $value;
+	$meta_value = maybe_serialize($meta_value);
 
-	$value = maybe_serialize($value);
-	$value = $wpdb->escape($value);
+	$wpdb->insert( $wpdb->postmeta, compact( 'post_id', 'meta_key', 'meta_value' ) );
 
-	$wpdb->query("INSERT INTO $wpdb->postmeta (post_id,meta_key,meta_value) VALUES ('$post_id','$key','$value')");
+	wp_cache_delete($post_id, 'post_meta');
 
 	return true;
 }
 
+/**
+ * delete_post_meta() - delete post metadata
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 1.5
+ * @uses $wpdb
+ *
+ * @param int $post_id post ID
+ * @param string $key {@internal Missing Description}}
+ * @param mixed $value {@internal Missing Description}}
+ * @return bool {@internal Missing Description}}
+ */
 function delete_post_meta($post_id, $key, $value = '') {
-	global $wpdb, $post_meta_cache, $blog_id;
+	global $wpdb;
 
-	$post_id = (int) $post_id;
+	$post_id = absint( $post_id );
 
-	if ( empty($value) ) {
-		$meta_id = $wpdb->get_var("SELECT meta_id FROM $wpdb->postmeta WHERE post_id = '$post_id' AND meta_key = '$key'");
-	} else {
-		$meta_id = $wpdb->get_var("SELECT meta_id FROM $wpdb->postmeta WHERE post_id = '$post_id' AND meta_key = '$key' AND meta_value = '$value'");
-	}
+	// expected_slashed ($key, $value)
+	$key = stripslashes( $key );
+	$value = stripslashes( $value );
+
+	if ( empty( $value ) )
+		$meta_id = $wpdb->get_var( $wpdb->prepare( "SELECT meta_id FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = %s", $post_id, $key ) );
+	else
+		$meta_id = $wpdb->get_var( $wpdb->prepare( "SELECT meta_id FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = %s AND meta_value = %s", $post_id, $key, $value ) );
 
 	if ( !$meta_id )
 		return false;
 
-	if ( empty($value) ) {
-		$wpdb->query("DELETE FROM $wpdb->postmeta WHERE post_id = '$post_id' AND meta_key = '$key'");
-		unset($post_meta_cache[$blog_id][$post_id][$key]);
-	} else {
-		$wpdb->query("DELETE FROM $wpdb->postmeta WHERE post_id = '$post_id' AND meta_key = '$key' AND meta_value = '$value'");
-		$cache_key = $post_meta_cache[$blog_id][$post_id][$key];
-		if ($cache_key) foreach ( $cache_key as $index => $data )
-			if ( $data == $value )
-				unset($post_meta_cache[$blog_id][$post_id][$key][$index]);
-	}
+	if ( empty( $value ) )
+		$wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = %s", $post_id, $key ) );
+	else
+		$wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = %s AND meta_value = %s", $post_id, $key, $value ) );
 
-	unset($post_meta_cache[$blog_id][$post_id][$key]);
+	wp_cache_delete($post_id, 'post_meta');
 
 	return true;
 }
 
+/**
+ * get_post_meta() - Get a post meta field
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 1.5
+ * @uses $wpdb
+ *
+ * @param int $post_id post ID
+ * @param string $key The meta key to retrieve
+ * @param bool $single Whether to return a single value
+ * @return mixed {@internal Missing Description}}
+ */
 function get_post_meta($post_id, $key, $single = false) {
-	global $wpdb, $post_meta_cache, $blog_id;
-
 	$post_id = (int) $post_id;
 
-	if ( isset($post_meta_cache[$blog_id][$post_id][$key]) ) {
+	$meta_cache = wp_cache_get($post_id, 'post_meta');
+
+	if ( isset($meta_cache[$key]) ) {
 		if ( $single ) {
-			return maybe_unserialize( $post_meta_cache[$blog_id][$post_id][$key][0] );
+			return maybe_unserialize( $meta_cache[$key][0] );
 		} else {
-			return maybe_unserialize( $post_meta_cache[$blog_id][$post_id][$key] );
+			return maybe_unserialize( $meta_cache[$key] );
 		}
 	}
 
-	if ( !isset($post_meta_cache[$blog_id][$post_id]) )
+	if ( !$meta_cache ) {
 		update_postmeta_cache($post_id);
+		$meta_cache = wp_cache_get($post_id, 'post_meta');
+	}
 
 	if ( $single ) {
-		if ( isset($post_meta_cache[$blog_id][$post_id][$key][0]) )
-			return maybe_unserialize($post_meta_cache[$blog_id][$post_id][$key][0]);
+		if ( isset($meta_cache[$key][0]) )
+			return maybe_unserialize($meta_cache[$key][0]);
 		else
 			return '';
-	}	else {
-		return maybe_unserialize($post_meta_cache[$blog_id][$post_id][$key]);
+	} else {
+		return maybe_unserialize($meta_cache[$key]);
 	}
 }
 
-function update_post_meta($post_id, $key, $value, $prev_value = '') {
-	global $wpdb, $post_meta_cache, $blog_id;
-
-	$post_id = (int) $post_id;
-
-	$original_value = $value;
-	$value = maybe_serialize($value);
-	$value = $wpdb->escape($value);
+/**
+ * update_post_meta() - Update a post meta field
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 1.5
+ * @uses $wpdb
+ *
+ * @param int $post_id post ID
+ * @param string $key {@internal Missing Description}}
+ * @param mixed $value {@internal Missing Description}}
+ * @param mixed $prev_value previous value (for differentiating between meta fields with the same key and post ID)
+ * @return bool {@internal Missing Description}}
+ */
+function update_post_meta($post_id, $meta_key, $meta_value, $prev_value = '') {
+	global $wpdb;
 
-	$original_prev = $prev_value;
+	$meta_value = maybe_serialize($meta_value);
 	$prev_value = maybe_serialize($prev_value);
-	$prev_value = $wpdb->escape($prev_value);
 
-	if (! $wpdb->get_var("SELECT meta_key FROM $wpdb->postmeta WHERE meta_key = '$key' AND post_id = '$post_id'") ) {
+	// expected_slashed ($meta_key)
+	$meta_key = stripslashes($meta_key);
+
+	if ( ! $wpdb->get_var( $wpdb->prepare( "SELECT meta_key FROM $wpdb->postmeta WHERE meta_key = %s AND post_id = %d", $meta_key, $post_id ) ) )
 		return false;
-	}
 
-	if ( empty($prev_value) ) {
-		$wpdb->query("UPDATE $wpdb->postmeta SET meta_value = '$value' WHERE meta_key = '$key' AND post_id = '$post_id'");
-		$cache_key = $post_meta_cache[$blog_id][$post_id][$key];
-		if ( !empty($cache_key) )
-			foreach ($cache_key as $index => $data)
-				$post_meta_cache[$blog_id][$post_id][$key][$index] = $original_value;
-	} else {
-		$wpdb->query("UPDATE $wpdb->postmeta SET meta_value = '$value' WHERE meta_key = '$key' AND post_id = '$post_id' AND meta_value = '$prev_value'");
-		$cache_key = $post_meta_cache[$blog_id][$post_id][$key];
-		if ( !empty($cache_key) )
-			foreach ($cache_key as $index => $data)
-				if ( $data == $original_prev )
-					$post_meta_cache[$blog_id][$post_id][$key][$index] = $original_value;
-	}
+	$data  = compact( 'meta_value' );
+	$where = compact( 'meta_key', 'post_id' );
 
+	if ( !empty( $prev_value ) )
+		$where['meta_value'] = $prev_value;
+
+	$wpdb->update( $wpdb->postmeta, $data, $where );
+	wp_cache_delete($post_id, 'post_meta');
 	return true;
 }
 
+/**
+ * delete_post_meta_by_key() - Delete everything from post meta matching $post_meta_key
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.3
+ * @uses $wpdb
+ *
+ * @param string $post_meta_key What to search for when deleting
+ * @return bool Whether the post meta key was deleted from the database
+ */
+function delete_post_meta_by_key($post_meta_key) {
+	global $wpdb;
+	if ( $wpdb->query($wpdb->prepare("DELETE FROM $wpdb->postmeta WHERE meta_key = %s", $post_meta_key)) ) {
+		/** @todo Get post_ids and delete cache */
+		// wp_cache_delete($post_id, 'post_meta');
+		return true;
+	}
+	return false;
+}
 
+/**
+ * get_post_custom() - Retrieve post custom fields
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 1.2
+ *
+ * @uses $id
+ * @uses $wpdb
+ *
+ * @param int $post_id post ID
+ * @return array {@internal Missing Description}}
+ */
 function get_post_custom($post_id = 0) {
-	global $id, $post_meta_cache, $wpdb, $blog_id;
+	global $id;
 
 	if ( !$post_id )
 		$post_id = (int) $id;
 
 	$post_id = (int) $post_id;
 
-	if ( !isset($post_meta_cache[$blog_id][$post_id]) )
+	if ( ! wp_cache_get($post_id, 'post_meta') )
 		update_postmeta_cache($post_id);
 
-	return $post_meta_cache[$blog_id][$post_id];
+	return wp_cache_get($post_id, 'post_meta');
 }
 
+/**
+ * get_post_custom_keys() - Retrieve post custom field names
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 1.2
+ *
+ * @param int $post_id post ID
+ * @return array|null Either array of the keys, or null if keys would not be retrieved
+ */
 function get_post_custom_keys( $post_id = 0 ) {
 	$custom = get_post_custom( $post_id );
 
@@ -394,11 +722,251 @@
 	return $custom[$key];
 }
 
+function sanitize_post($post, $context = 'display') {
+	if ( 'raw' == $context )
+		return $post;
+	if ( is_object($post) ) {
+		foreach ( array_keys(get_object_vars($post)) as $field )
+			$post->$field = sanitize_post_field($field, $post->$field, $post->ID, $context);
+	} else {
+		foreach ( array_keys($post) as $field )
+			$post[$field] = sanitize_post_field($field, $post[$field], $post['ID'], $context);
+	}
+	return $post;
+}
+
+/**
+ * sanitize_post_field() - Sanitize post field based on context
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.3
+ *
+ * @param string $field The Post Object field name
+ * @param string $value The Post Object value
+ * @param int $postid Post ID
+ * @param string $context How to sanitize post fields
+ * @return string Sanitized value
+ */
+function sanitize_post_field($field, $value, $post_id, $context) {
+	$int_fields = array('ID', 'post_parent', 'menu_order');
+	if ( in_array($field, $int_fields) )
+		$value = (int) $value;
+
+	if ( 'raw' == $context )
+		return $value;
+
+	$prefixed = false;
+	if ( false !== strpos($field, 'post_') ) {
+		$prefixed = true;
+		$field_no_prefix = str_replace('post_', '', $field);
+	}
+
+	if ( 'edit' == $context ) {
+		$format_to_edit = array('post_content', 'post_excerpt', 'post_title', 'post_password');
+
+		if ( $prefixed ) {
+			$value = apply_filters("edit_$field", $value, $post_id);
+			// Old school
+			$value = apply_filters("${field_no_prefix}_edit_pre", $value, $post_id);
+		} else {
+			$value = apply_filters("edit_post_$field", $value, $post_id);
+		}
+
+		if ( in_array($field, $format_to_edit) ) {
+			if ( 'post_content' == $field )
+				$value = format_to_edit($value, user_can_richedit());
+			else
+				$value = format_to_edit($value);
+		} else {
+			$value = attribute_escape($value);
+		}
+	} else if ( 'db' == $context ) {
+		if ( $prefixed ) {
+			$value = apply_filters("pre_$field", $value);
+			$value = apply_filters("${field_no_prefix}_save_pre", $value);
+		} else {
+			$value = apply_filters("pre_post_$field", $value);
+			$value = apply_filters("${field}_pre", $value);
+		}
+	} else {
+		// Use display filters by default.
+		if ( $prefixed )
+			$value = apply_filters($field, $value, $post_id, $context);
+		else
+			$value = apply_filters("post_$field", $value, $post_id, $context);
+	}
+
+	if ( 'attribute' == $context )
+		$value = attribute_escape($value);
+	else if ( 'js' == $context )
+		$value = js_escape($value);
+
+	return $value;
+}
+
+/**
+ * wp_count_posts() - Count number of posts with a given type
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.5
+ *
+ * @param string $type Post type
+ * @return array Number of posts for each status
+ */
+function wp_count_posts( $type = 'post', $perm = '' ) {
+	global $wpdb;
+
+	$user = wp_get_current_user();
+
+	$query = "SELECT post_status, COUNT( * ) AS num_posts FROM {$wpdb->posts} WHERE post_type = %s";
+	if ( 'readable' == $perm && is_user_logged_in() ) {
+		if ( !current_user_can("read_private_{$type}s") )
+			$query .= " AND (post_status != 'private' OR ( post_author = '$user->ID' AND post_status = 'private' ))";
+	}
+	$query .= ' GROUP BY post_status';
+	$count = $wpdb->get_results( $wpdb->prepare( $query, $type ), ARRAY_A );
+
+	$stats = array( );
+	foreach( (array) $count as $row_num => $row ) {
+		$stats[$row['post_status']] = $row['num_posts'];
+	}
+
+	return (object) $stats;
+}
+
+/**
+ * wp_count_attachments() - Count number of attachments
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.5
+ *
+ * @param string|array $post_mime_type Array or comma-separated list of MIME patterns
+ * @return array Number of posts for each post_mime_type
+ */
+
+function wp_count_attachments( $mime_type = '' ) {
+	global $wpdb;
+
+	$and = wp_post_mime_type_where( $mime_type );
+	$count = $wpdb->get_results( "SELECT post_mime_type, COUNT( * ) AS num_posts FROM $wpdb->posts WHERE post_type = 'attachment' $and GROUP BY post_mime_type", ARRAY_A );
+
+	$stats = array( );
+	foreach( (array) $count as $row ) {
+		$stats[$row['post_mime_type']] = $row['num_posts'];
+	}
+
+	return (object) $stats;
+}
+
+/**
+ * wp_match_mime_type() - Check a MIME-Type against a list
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.5
+ *
+ * @param string|array $wildcard_mime_types e.g. audio/mpeg or image (same as image/*) or flash (same as *flash*)
+ * @param string|array $real_mime_types post_mime_type values
+ * @return array array(wildcard=>array(real types))
+ */
+function wp_match_mime_types($wildcard_mime_types, $real_mime_types) {
+	$matches = array();
+	if ( is_string($wildcard_mime_types) )
+		$wildcard_mime_types = array_map('trim', explode(',', $wildcard_mime_types));
+	if ( is_string($real_mime_types) )
+		$real_mime_types = array_map('trim', explode(',', $real_mime_types));
+	$wild = '[-._a-z0-9]*';
+	foreach ( (array) $wildcard_mime_types as $type ) {
+		$type = str_replace('*', $wild, $type);
+		$patternses[1][$type] = "^$type$";
+		if ( false === strpos($type, '/') ) {
+			$patternses[2][$type] = "^$type/";
+			$patternses[3][$type] = $type;
+		}
+	}
+	asort($patternses);
+	foreach ( $patternses as $patterns )
+		foreach ( $patterns as $type => $pattern )
+			foreach ( (array) $real_mime_types as $real )
+				if ( preg_match("#$pattern#", $real) && ( empty($matches[$type]) || false === array_search($real, $matches[$type]) ) )
+					$matches[$type][] = $real;
+	return $matches;
+}
+
+/**
+ * wp_get_post_mime_type_where() - Convert MIME types into SQL
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.5
+ *
+ * @param string|array $mime_types MIME types
+ * @return string SQL AND clause
+ */
+function wp_post_mime_type_where($post_mime_types) {
+	$where = '';
+	$wildcards = array('', '%', '%/%');
+	if ( is_string($post_mime_types) )
+		$post_mime_types = array_map('trim', explode(',', $post_mime_types));
+	foreach ( (array) $post_mime_types as $mime_type ) {
+		$mime_type = preg_replace('/\s/', '', $mime_type);
+		$slashpos = strpos($mime_type, '/');
+		if ( false !== $slashpos ) {
+			$mime_group = preg_replace('/[^-*.a-zA-Z0-9]/', '', substr($mime_type, 0, $slashpos));
+			$mime_subgroup = preg_replace('/[^-*.a-zA-Z0-9]/', '', substr($mime_type, $slashpos + 1));
+			if ( empty($mime_subgroup) )
+				$mime_subgroup = '*';
+			else
+				$mime_subgroup = str_replace('/', '', $mime_subgroup);
+			$mime_pattern = "$mime_group/$mime_subgroup";
+		} else {
+			$mime_pattern = preg_replace('/[^-*.a-zA-Z0-9]/', '', $mime_type);
+			if ( false === strpos($mime_pattern, '*') )
+				$mime_pattern .= '/*';
+		}
+
+		$mime_pattern = preg_replace('/\*+/', '%', $mime_pattern);
+
+		if ( in_array( $mime_type, $wildcards ) )
+			return '';
+
+		if ( false !== strpos($mime_pattern, '%') )
+			$wheres[] = "post_mime_type LIKE '$mime_pattern'";
+		else
+			$wheres[] = "post_mime_type = '$mime_pattern'";
+	}
+	if ( !empty($wheres) )
+		$where = ' AND (' . join(' OR ', $wheres) . ') ';
+	return $where;
+}
+
+/**
+ * wp_delete_post() - Deletes a Post
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 1.0.1
+ *
+ * @param int $postid post ID
+ * @return mixed {@internal Missing Description}}
+ */
 function wp_delete_post($postid = 0) {
 	global $wpdb, $wp_rewrite;
-	$postid = (int) $postid;
 
-	if ( !$post = $wpdb->get_row("SELECT * FROM $wpdb->posts WHERE ID = $postid") )
+	if ( !$post = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->posts WHERE ID = %d", $postid)) )
 		return $post;
 
 	if ( 'attachment' == $post->post_type )
@@ -406,50 +974,117 @@
 
 	do_action('delete_post', $postid);
 
-	if ( 'publish' == $post->post_status && 'post' == $post->post_type ) {
-		$categories = wp_get_post_categories($post->ID);
-		if( is_array( $categories ) ) {
-			foreach ( $categories as $cat_id ) {
-				$wpdb->query("UPDATE $wpdb->categories SET category_count = category_count - 1 WHERE cat_ID = '$cat_id'");
-				wp_cache_delete($cat_id, 'category');
-				do_action('edit_category', $cat_id);
-			}
+	/** @todo delete for pluggable post taxonomies too */
+	wp_delete_object_term_relationships($postid, array('category', 'post_tag'));
+
+	$parent_data = array( 'post_parent' => $post->post_parent );
+	$parent_where = array( 'post_parent' => $postid );
+
+	if ( 'page' == $post->post_type) {
+	 	// if the page is defined in option page_on_front or post_for_posts,
+		// adjust the corresponding options
+		if ( get_option('page_on_front') == $postid ) {
+			update_option('show_on_front', 'posts');
+			delete_option('page_on_front');
+		}
+		if ( get_option('page_for_posts') == $postid ) {
+			delete_option('page_for_posts');
 		}
-	}
 
-	if ( 'page' == $post->post_type )
-		$wpdb->query("UPDATE $wpdb->posts SET post_parent = $post->post_parent WHERE post_parent = $postid AND post_type = 'page'");
+		// Point children of this page to its parent, also clean the cache of affected children
+		$children_query = $wpdb->prepare("SELECT * FROM $wpdb->posts WHERE post_parent = %d AND post_type='page'", $postid);
+		$children = $wpdb->get_results($children_query);
 
-	$wpdb->query("UPDATE $wpdb->posts SET post_parent = $post->post_parent WHERE post_parent = $postid AND post_type = 'attachment'");
+		$wpdb->update( $wpdb->posts, $parent_data, $parent_where + array( 'post_type' => 'page' ) );
+	}
 
-	$wpdb->query("DELETE FROM $wpdb->posts WHERE ID = $postid");
+	// Point all attachments to this post up one level
+	$wpdb->update( $wpdb->posts, $parent_data, $parent_where + array( 'post_type' => 'attachment' ) );
 
-	$wpdb->query("DELETE FROM $wpdb->comments WHERE comment_post_ID = $postid");
+	$wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->posts WHERE ID = %d", $postid ));
 
-	$wpdb->query("DELETE FROM $wpdb->post2cat WHERE post_id = $postid");
+	$wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->comments WHERE comment_post_ID = %d", $postid ));
 
-	$wpdb->query("DELETE FROM $wpdb->postmeta WHERE post_id = $postid");
+	$wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->postmeta WHERE post_id = %d", $postid ));
 
 	if ( 'page' == $post->post_type ) {
 		clean_page_cache($postid);
+
+		foreach ( (array) $children as $child )
+			clean_page_cache($child->ID);
+
 		$wp_rewrite->flush_rules();
+	} else {
+		clean_post_cache($postid);
 	}
 
 	do_action('deleted_post', $postid);
-	
+
 	return $post;
 }
 
-function wp_get_post_categories($post_id = 0) {
+/**
+ * wp_get_post_categories() - Retrieve the list of categories for a post
+ *
+ * Compatibility layer for themes and plugins. Also an easy layer of abstraction
+ * away from the complexity of the taxonomy layer.
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.1
+ *
+ * @uses wp_get_object_terms() Retrieves the categories. Args details can be found here
+ *
+ * @param int $post_id Optional. The Post ID
+ * @param array $args Optional. Overwrite the defaults
+ * @return array {@internal Missing Description}}
+ */
+function wp_get_post_categories( $post_id = 0, $args = array() ) {
+	$post_id = (int) $post_id;
+
+	$defaults = array('fields' => 'ids');
+	$args = wp_parse_args( $args, $defaults );
+
+	$cats = wp_get_object_terms($post_id, 'category', $args);
+	return $cats;
+}
+
+/**
+ * wp_get_post_tags() - Retrieve the post tags
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.3
+ *
+ * @uses wp_get_object_terms() Gets the tags for returning. Args can be found here
+ *
+ * @param int $post_id Optional. The Post ID
+ * @param array $args Optional. Overwrite the defaults
+ * @return mixed The tags the post has currently
+ */
+function wp_get_post_tags( $post_id = 0, $args = array() ) {
 	$post_id = (int) $post_id;
 
-	$cats = &get_the_category($post_id);
-	$cat_ids = array();
-	foreach ( $cats as $cat )
-		$cat_ids[] = (int) $cat->cat_ID;
-	return array_unique($cat_ids);
+	$defaults = array('fields' => 'all');
+	$args = wp_parse_args( $args, $defaults );
+
+	$tags = wp_get_object_terms($post_id, 'post_tag', $args);
+
+	return $tags;
 }
 
+/**
+ * wp_get_recent_posts() - Get the $num most recent posts
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 1.0.1
+ *
+ * @param int $num number of posts to get
+ * @return array {@internal Missing Description}}
+ */
 function wp_get_recent_posts($num = 10) {
 	global $wpdb;
 
@@ -465,29 +1100,65 @@
 	return $result?$result:array();
 }
 
+/**
+ * wp_get_single_post() - Get one post
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 1.0.1
+ * @uses $wpdb
+ *
+ * @param int $postid post ID
+ * @param string $mode How to return result, either OBJECT, ARRAY_N, or ARRAY_A
+ * @return object|array Post object or array holding post contents and information
+ */
 function wp_get_single_post($postid = 0, $mode = OBJECT) {
-	global $wpdb;
-
 	$postid = (int) $postid;
 
 	$post = get_post($postid, $mode);
 
-	// Set categories
+	// Set categories and tags
 	if($mode == OBJECT) {
 		$post->post_category = wp_get_post_categories($postid);
+		$post->tags_input = wp_get_post_tags($postid, array('fields' => 'names'));
 	}
 	else {
 		$post['post_category'] = wp_get_post_categories($postid);
+		$post['tags_input'] = wp_get_post_tags($postid, array('fields' => 'names'));
 	}
 
 	return $post;
 }
 
+/**
+ * wp_insert_post() - Insert a post
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 1.0.1
+ *
+ * @uses $wpdb
+ * @uses $wp_rewrite
+ * @uses $user_ID
+ * @uses $allowedtags
+ *
+ * @param array $postarr post contents
+ * @return int post ID or 0 on error
+ */
 function wp_insert_post($postarr = array()) {
-	global $wpdb, $wp_rewrite, $allowedtags, $user_ID;
+	global $wpdb, $wp_rewrite, $user_ID;
 
-	if ( is_object($postarr) )
-		$postarr = get_object_vars($postarr);
+	$defaults = array('post_status' => 'draft', 'post_type' => 'post', 'post_author' => $user_ID,
+		'ping_status' => get_option('default_ping_status'), 'post_parent' => 0,
+		'menu_order' => 0, 'to_ping' =>  '', 'pinged' => '', 'post_password' => '',
+		'guid' => '', 'post_content_filtered' => '', 'post_excerpt' => '');
+
+	$postarr = wp_parse_args($postarr, $defaults);
+	$postarr = sanitize_post($postarr, 'db');
 
 	// export array as variables
 	extract($postarr, EXTR_SKIP);
@@ -496,21 +1167,9 @@
 	$update = false;
 	if ( !empty($ID) ) {
 		$update = true;
-		$post = & get_post($ID);
-		$previous_status = $post->post_status;
-	}
-
-	// Get the basics.
-	if ( empty($no_filter) ) {
-		$post_content    = apply_filters('content_save_pre',   $post_content);
-		$post_content_filtered = apply_filters('content_filtered_save_pre',   $post_content_filtered);
-		$post_excerpt    = apply_filters('excerpt_save_pre',   $post_excerpt);
-		$post_title      = apply_filters('title_save_pre',     $post_title);
-		$post_category   = apply_filters('category_save_pre',  $post_category);
-		$post_status     = apply_filters('status_save_pre',    $post_status);
-		$post_name       = apply_filters('name_save_pre',      $post_name);
-		$comment_status  = apply_filters('comment_status_pre', $comment_status);
-		$ping_status     = apply_filters('ping_status_pre',    $ping_status);
+		$previous_status = get_post_field('post_status', $ID);
+	} else {
+		$previous_status = 'new';
 	}
 
 	if ( ('' == $post_content) && ('' == $post_title) && ('' == $post_excerpt) )
@@ -520,7 +1179,6 @@
 	if (0 == count($post_category) || !is_array($post_category)) {
 		$post_category = array(get_option('default_category'));
 	}
-	$post_cat = $post_category[0];
 
 	if ( empty($post_author) )
 		$post_author = $user_ID;
@@ -531,9 +1189,11 @@
 	if ( empty($post_type) )
 		$post_type = 'post';
 
-	// Get the post ID.
-	if ( $update )
+	// Get the post ID and GUID
+	if ( $update ) {
 		$post_ID = (int) $ID;
+		$guid = get_post_field( 'guid', $post_ID );
+	}
 
 	// Create a valid post name.  Drafts are allowed to have an empty
 	// post name.
@@ -544,16 +1204,27 @@
 		$post_name = sanitize_title($post_name);
 	}
 
-
 	// If the post date is empty (due to having been new or a draft) and status is not 'draft', set date to now
 	if (empty($post_date)) {
-		if ( 'draft' != $post_status )
+		if ( !in_array($post_status, array('draft', 'pending')) )
 			$post_date = current_time('mysql');
+		else
+			$post_date = '0000-00-00 00:00:00';
 	}
 
 	if (empty($post_date_gmt)) {
-		if ( 'draft' != $post_status )
+		if ( !in_array($post_status, array('draft', 'pending')) )
 			$post_date_gmt = get_gmt_from_date($post_date);
+		else
+			$post_date_gmt = '0000-00-00 00:00:00';
+	}
+
+	if ( $update || '0000-00-00 00:00:00' == $post_date ) {
+		$post_modified     = current_time( 'mysql' );
+		$post_modified_gmt = current_time( 'mysql', 1 );
+	} else {
+		$post_modified     = $post_date;
+		$post_modified_gmt = $post_date_gmt;
 	}
 
 	if ( 'publish' == $post_status ) {
@@ -570,8 +1241,6 @@
 	}
 	if ( empty($ping_status) )
 		$ping_status = get_option('default_ping_status');
-	if ( empty($post_pingback) )
-		$post_pingback = get_option('default_pingback_flag');
 
 	if ( isset($to_ping) )
 		$to_ping = preg_replace('|\s+|', "\n", $to_ping);
@@ -595,125 +1264,86 @@
 		$post_password = '';
 
 	if ( 'draft' != $post_status ) {
-		$post_name_check = $wpdb->get_var("SELECT post_name FROM $wpdb->posts WHERE post_name = '$post_name' AND post_type = '$post_type' AND ID != '$post_ID' AND post_parent = '$post_parent' LIMIT 1");
+		$post_name_check = $wpdb->get_var($wpdb->prepare("SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type = %s AND ID != %d AND post_parent = %d LIMIT 1", $post_name, $post_type, $post_ID, $post_parent));
 
 		if ($post_name_check || in_array($post_name, $wp_rewrite->feeds) ) {
 			$suffix = 2;
 			do {
-				$alt_post_name = $post_name . "-$suffix";
-				$post_name_check = $wpdb->get_var("SELECT post_name FROM $wpdb->posts WHERE post_name = '$alt_post_name' AND post_type = '$post_type' AND ID != '$post_ID' AND post_parent = '$post_parent' LIMIT 1");
+				$alt_post_name = substr($post_name, 0, 200-(strlen($suffix)+1)). "-$suffix";
+				// expected_slashed ($alt_post_name, $post_name, $post_type)
+				$post_name_check = $wpdb->get_var($wpdb->prepare("SELECT post_name FROM $wpdb->posts WHERE post_name = '$alt_post_name' AND post_type = '$post_type' AND ID != %d AND post_parent = %d LIMIT 1", $post_ID, $post_parent));
 				$suffix++;
 			} while ($post_name_check);
 			$post_name = $alt_post_name;
 		}
 	}
 
+	// expected_slashed (everything!)
+	$data = compact( array( 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_content_filtered', 'post_title', 'post_excerpt', 'post_status', 'post_type', 'comment_status', 'ping_status', 'post_password', 'post_name', 'to_ping', 'pinged', 'post_modified', 'post_modified_gmt', 'post_parent', 'menu_order', 'guid' ) );
+	$data = stripslashes_deep( $data );
+	$where = array( 'ID' => $post_ID );
+
 	if ($update) {
-		$wpdb->query(
-			"UPDATE IGNORE $wpdb->posts SET
-			post_author = '$post_author',
-			post_date = '$post_date',
-			post_date_gmt = '$post_date_gmt',
-			post_content = '$post_content',
-			post_content_filtered = '$post_content_filtered',
-			post_title = '$post_title',
-			post_excerpt = '$post_excerpt',
-			post_status = '$post_status',
-			post_type = '$post_type',
-			comment_status = '$comment_status',
-			ping_status = '$ping_status',
-			post_password = '$post_password',
-			post_name = '$post_name',
-			to_ping = '$to_ping',
-			pinged = '$pinged',
-			post_modified = '".current_time('mysql')."',
-			post_modified_gmt = '".current_time('mysql',1)."',
-			post_parent = '$post_parent',
-			menu_order = '$menu_order'
-			WHERE ID = $post_ID");
+		do_action( 'pre_post_update', $post_ID );
+		$wpdb->update( $wpdb->posts, $data, $where );
 	} else {
-		$wpdb->query(
-			"INSERT IGNORE INTO $wpdb->posts
-			(post_author, post_date, post_date_gmt, post_content, post_content_filtered, post_title, post_excerpt,  post_status, post_type, comment_status, ping_status, post_password, post_name, to_ping, pinged, post_modified, post_modified_gmt, post_parent, menu_order, post_mime_type)
-			VALUES
-			('$post_author', '$post_date', '$post_date_gmt', '$post_content', '$post_content_filtered', '$post_title', '$post_excerpt', '$post_status', '$post_type', '$comment_status', '$ping_status', '$post_password', '$post_name', '$to_ping', '$pinged', '$post_date', '$post_date_gmt', '$post_parent', '$menu_order', '$post_mime_type')");
-			$post_ID = (int) $wpdb->insert_id;
+		$data['post_mime_type'] = stripslashes( $post_mime_type ); // This isn't in the update
+		$wpdb->insert( $wpdb->posts, $data );
+		$post_ID = (int) $wpdb->insert_id;
+
+		// use the newly generated $post_ID
+		$where = array( 'ID' => $post_ID );
 	}
 
 	if ( empty($post_name) && 'draft' != $post_status ) {
 		$post_name = sanitize_title($post_title, $post_ID);
-		$wpdb->query( "UPDATE $wpdb->posts SET post_name = '$post_name' WHERE ID = '$post_ID'" );
+		$wpdb->update( $wpdb->posts, compact( 'post_name' ), $where );
 	}
 
-	wp_set_post_categories($post_ID, $post_category);
+	wp_set_post_categories( $post_ID, $post_category );
+	wp_set_post_tags( $post_ID, $tags_input );
+
+	$current_guid = get_post_field( 'guid', $post_ID );
 
 	if ( 'page' == $post_type ) {
 		clean_page_cache($post_ID);
-		$wp_rewrite->flush_rules();
 	} else {
 		clean_post_cache($post_ID);
 	}
 
 	// Set GUID
-	if ( ! $update )
-		$wpdb->query("UPDATE $wpdb->posts SET guid = '" . get_permalink($post_ID) . "' WHERE ID = '$post_ID'");
-
-	if ( $update) {
-		if ($previous_status != 'publish' && $post_status == 'publish') {
-			// Reset GUID if transitioning to publish.
-			$wpdb->query("UPDATE $wpdb->posts SET guid = '" . get_permalink($post_ID) . "' WHERE ID = '$post_ID'");
-			do_action('private_to_published', $post_ID);
-		}
-
-		do_action('edit_post', $post_ID);
-	}
-
-	if ($post_status == 'publish' && $post_type == 'post') {
-		do_action('publish_post', $post_ID);
-		if ( defined('XMLRPC_REQUEST') )
-			do_action('xmlrpc_publish_post', $post_ID);
-		if ( defined('APP_REQUEST') )
-			do_action('app_publish_post', $post_ID);
-
-		if ( !defined('WP_IMPORTING') ) {
-			if ( $post_pingback )
-				$result = $wpdb->query("
-					INSERT INTO $wpdb->postmeta
-					(post_id,meta_key,meta_value)
-					VALUES ('$post_ID','_pingme','1')
-				");
-			$result = $wpdb->query("
-				INSERT INTO $wpdb->postmeta
-				(post_id,meta_key,meta_value)
-				VALUES ('$post_ID','_encloseme','1')
-			");
-			wp_schedule_single_event(time(), 'do_pings');
-		}
-	} else if ($post_type == 'page') {
-		if ( !empty($page_template) )
-			if ( ! update_post_meta($post_ID, '_wp_page_template',  $page_template))
-				add_post_meta($post_ID, '_wp_page_template',  $page_template, true);
+	if ( !$update && '' == $current_guid )
+		$wpdb->update( $wpdb->posts, array( 'guid' => get_permalink( $post_ID ) ), $where );
 
-		if ( $post_status == 'publish' )
-			do_action('publish_page', $post_ID);
-	}
+	$post = get_post($post_ID);
+	if ( !empty($page_template) )
+		$post->page_template = $page_template;
 
-	// Always clears the hook in case the post status bounced from future to draft.
-	wp_clear_scheduled_hook('publish_future_post', $post_ID);
+	wp_transition_post_status($post_status, $previous_status, $post);
 
-	// Schedule publication.
-	if ( 'future' == $post_status )
-		wp_schedule_single_event(strtotime($post_date_gmt. ' GMT'), 'publish_future_post', array($post_ID));
+	if ( $update)
+		do_action('edit_post', $post_ID, $post);
 
-	do_action('save_post', $post_ID);
-	do_action('wp_insert_post', $post_ID);
+	do_action('save_post', $post_ID, $post);
+	do_action('wp_insert_post', $post_ID, $post);
 
 	return $post_ID;
 }
 
+/**
+ * wp_update_post() - Update a post
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 1.0.1
+ * @uses $wpdb
+ *
+ * @param array $postarr post data
+ * @return int {@internal Missing Description}}
+ */
 function wp_update_post($postarr = array()) {
-	global $wpdb;
-
 	if ( is_object($postarr) )
 		$postarr = get_object_vars($postarr);
 
@@ -731,7 +1361,7 @@
 		$post_cats = $post['post_category'];
 
 	// Drafts shouldn't be assigned a date unless explicitly done so by the user
-	if ( 'draft' == $post['post_status'] && empty($postarr['edit_date']) && empty($postarr['post_date']) &&
+	if ( in_array($post['post_status'], array('draft', 'pending')) && empty($postarr['edit_date']) && empty($postarr['post_date']) &&
 			 ('0000-00-00 00:00:00' == $post['post_date']) )
 		$clear_date = true;
 	else
@@ -751,93 +1381,174 @@
 	return wp_insert_post($postarr);
 }
 
+/**
+ * wp_publish_post() - Mark a post as "published"
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.1
+ * @uses $wpdb
+ *
+ * @param int $post_id Post ID
+ * @return int|null {@internal Missing Description}}
+ */
 function wp_publish_post($post_id) {
+	global $wpdb;
+
+	$post = get_post($post_id);
+
+	if ( empty($post) )
+		return;
+
+	if ( 'publish' == $post->post_status )
+		return;
+
+	$wpdb->update( $wpdb->posts, array( 'post_status' => 'publish' ), array( 'ID' => $post_id ) );
+
+	$old_status = $post->post_status;
+	$post->post_status = 'publish';
+	wp_transition_post_status('publish', $old_status, $post);
+
+	// Update counts for the post's terms.
+	foreach ( get_object_taxonomies('post') as $taxonomy ) {
+		$terms = wp_get_object_terms($post_id, $taxonomy, 'fields=tt_ids');
+		wp_update_term_count($terms, $taxonomy);
+	}
+
+	do_action('edit_post', $post_id, $post);
+	do_action('save_post', $post_id, $post);
+	do_action('wp_insert_post', $post_id, $post);
+}
+
+/**
+ * check_and_publish_future_post() - check to make sure post has correct status before
+ * passing it on to be published. Invoked by cron 'publish_future_post' event
+ * This safeguard prevents cron from publishing drafts, etc.
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.5
+ * @uses $wpdb
+ *
+ * @param int $post_id Post ID
+ * @return int|null {@internal Missing Description}}
+ */
+function check_and_publish_future_post($post_id) {
+
 	$post = get_post($post_id);
 
-	if ( empty($post) )
-		return;
+	if ( empty($post) )
+		return;
+
+	if ( 'future' != $post->post_status )
+		return;
+
+	return wp_publish_post($post_id);
+}
+
+function wp_add_post_tags($post_id = 0, $tags = '') {
+	return wp_set_post_tags($post_id, $tags, true);
+}
+
+function wp_set_post_tags( $post_id = 0, $tags = '', $append = false ) {
+	/* $append - true = don't delete existing tags, just add on, false = replace the tags with the new tags */
+
+	$post_id = (int) $post_id;
 
-	if ( 'publish' == $post->post_status )
-		return;
+	if ( !$post_id )
+		return false;
 
-	return wp_update_post(array('post_status' => 'publish', 'ID' => $post_id, 'no_filter' => true));
+	if ( empty($tags) )
+		$tags = array();
+	$tags = (is_array($tags)) ? $tags : explode( ',', trim($tags, " \n\t\r\0\x0B,") );
+	wp_set_object_terms($post_id, $tags, 'post_tag', $append);
 }
 
+/**
+ * wp_set_post_categories() - Set categories for a post
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.1
+ * @uses $wpdb
+ *
+ * @param int $post_ID post ID
+ * @param array $post_categories
+ * @return bool|mixed {@internal Missing Description}}
+ */
 function wp_set_post_categories($post_ID = 0, $post_categories = array()) {
-	global $wpdb;
-
 	$post_ID = (int) $post_ID;
 	// If $post_categories isn't already an array, make it one:
 	if (!is_array($post_categories) || 0 == count($post_categories) || empty($post_categories))
 		$post_categories = array(get_option('default_category'));
+	else if ( 1 == count($post_categories) && '' == $post_categories[0] )
+		return true;
 
+	$post_categories = array_map('intval', $post_categories);
 	$post_categories = array_unique($post_categories);
 
-	// First the old categories
-	$old_categories = $wpdb->get_col("
-		SELECT category_id
-		FROM $wpdb->post2cat
-		WHERE post_id = '$post_ID'");
-
-	if (!$old_categories) {
-		$old_categories = array();
-	} else {
-		$old_categories = array_unique($old_categories);
-	}
-
-	// Delete any?
-	$delete_cats = array_diff($old_categories,$post_categories);
-
-	if ($delete_cats) {
-		foreach ($delete_cats as $del) {
-			$wpdb->query("
-				DELETE FROM $wpdb->post2cat
-				WHERE category_id = '$del'
-					AND post_id = '$post_ID'
-				");
-		}
-	}
-
-	// Add any?
-	$add_cats = array_diff($post_categories, $old_categories);
-
-	if ($add_cats) {
-		foreach ($add_cats as $new_cat) {
-			$new_cat = (int) $new_cat;
-			if ( !empty($new_cat) )
-				$wpdb->query("
-					INSERT INTO $wpdb->post2cat (post_id, category_id) 
-					VALUES ('$post_ID', '$new_cat')");
-		}
-	}
+	return wp_set_object_terms($post_ID, $post_categories, 'category');
+}	// wp_set_post_categories()
 
-	// Update category counts.
-	$all_affected_cats = array_unique(array_merge($post_categories, $old_categories));
-	foreach ( $all_affected_cats as $cat_id ) {
-		$count = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->post2cat, $wpdb->posts WHERE $wpdb->posts.ID=$wpdb->post2cat.post_id AND post_status = 'publish' AND post_type = 'post' AND category_id = '$cat_id'");
-		$wpdb->query("UPDATE $wpdb->categories SET category_count = '$count' WHERE cat_ID = '$cat_id'");
-		clean_category_cache($cat_id);
-		do_action('edit_category', $cat_id);
+/**
+ * wp_transition_post_status() - Change the post transition status
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.3
+ *
+ * @param string $new_status {@internal Missing Description}}
+ * @param string $old_status {@internal Missing Description}}
+ * @param int $post {@internal Missing Description}}
+ */
+function wp_transition_post_status($new_status, $old_status, $post) {
+	if ( $new_status != $old_status ) {
+		do_action('transition_post_status', $new_status, $old_status, $post);
+		do_action("${old_status}_to_$new_status", $post);
 	}
-}	// wp_set_post_categories()
+	do_action("${new_status}_$post->post_type", $post->ID, $post);
+}
 
 //
 // Trackback and ping functions
 //
 
-function add_ping($post_id, $uri) { // Add a URL to those already pung
+/**
+ * add_ping() - Add a URL to those already pung
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 1.5
+ * @uses $wpdb
+ *
+ * @param int $post_id post ID
+ * @param string $uri {@internal Missing Description}}
+ * @return mixed {@internal Missing Description}}
+ */
+function add_ping($post_id, $uri) {
 	global $wpdb;
-	$pung = $wpdb->get_var("SELECT pinged FROM $wpdb->posts WHERE ID = $post_id");
+	$pung = $wpdb->get_var( $wpdb->prepare( "SELECT pinged FROM $wpdb->posts WHERE ID = %d", $post_id ));
 	$pung = trim($pung);
 	$pung = preg_split('/\s/', $pung);
 	$pung[] = $uri;
 	$new = implode("\n", $pung);
 	$new = apply_filters('add_ping', $new);
-	return $wpdb->query("UPDATE $wpdb->posts SET pinged = '$new' WHERE ID = $post_id");
+	// expected_slashed ($new)
+	$new = stripslashes($new);
+	return $wpdb->update( $wpdb->posts, array( 'pinged' => $new ), array( 'ID' => $post_id ) );
 }
 
 function get_enclosed($post_id) { // Get enclosures already enclosed for a post
-	global $wpdb;
 	$custom_fields = get_post_custom( $post_id );
 	$pung = array();
 	if ( !is_array( $custom_fields ) )
@@ -855,26 +1566,62 @@
 	return $pung;
 }
 
-function get_pung($post_id) { // Get URLs already pung for a post
+/**
+ * get_pung() - Get URLs already pinged for a post
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 1.5
+ * @uses $wpdb
+ *
+ * @param int $post_id post ID
+ * @return array {@internal Missing Description}}
+ */
+function get_pung($post_id) {
 	global $wpdb;
-	$pung = $wpdb->get_var("SELECT pinged FROM $wpdb->posts WHERE ID = $post_id");
+	$pung = $wpdb->get_var( $wpdb->prepare( "SELECT pinged FROM $wpdb->posts WHERE ID = %d", $post_id ));
 	$pung = trim($pung);
 	$pung = preg_split('/\s/', $pung);
 	$pung = apply_filters('get_pung', $pung);
 	return $pung;
 }
 
-function get_to_ping($post_id) { // Get any URLs in the todo list
+/**
+ * get_to_ping() - Get any URLs in the todo list
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 1.5
+ * @uses $wpdb
+ *
+ * @param int $post_id post ID
+ * @return array {@internal Missing Description}}
+ */
+function get_to_ping($post_id) {
 	global $wpdb;
-	$to_ping = $wpdb->get_var("SELECT to_ping FROM $wpdb->posts WHERE ID = $post_id");
+	$to_ping = $wpdb->get_var( $wpdb->prepare( "SELECT to_ping FROM $wpdb->posts WHERE ID = %d", $post_id ));
 	$to_ping = trim($to_ping);
 	$to_ping = preg_split('/\s/', $to_ping, -1, PREG_SPLIT_NO_EMPTY);
 	$to_ping = apply_filters('get_to_ping',  $to_ping);
 	return $to_ping;
 }
 
-// do trackbacks for a list of urls
-// accepts a comma-separated list of trackback urls and a post id
+/**
+ * trackback_url_list() - Do trackbacks for a list of urls
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 1.0.1
+ *
+ * @param string $tb_list comma separated list of URLs
+ * @param int $post_id post ID
+ */
 function trackback_url_list($tb_list, $post_id) {
 	if (!empty($tb_list)) {
 		// get post data
@@ -902,72 +1649,68 @@
 // Page functions
 //
 
+/**
+ * get_all_page_ids() - Get a list of page IDs
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.0
+ * @uses $wpdb
+ *
+ * @return array {@internal Missing Description}}
+ */
 function get_all_page_ids() {
 	global $wpdb;
 
-	if ( ! $page_ids = wp_cache_get('all_page_ids', 'pages') ) {
+	if ( ! $page_ids = wp_cache_get('all_page_ids', 'posts') ) {
 		$page_ids = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE post_type = 'page'");
-		wp_cache_add('all_page_ids', $page_ids, 'pages');
+		wp_cache_add('all_page_ids', $page_ids, 'posts');
 	}
 
 	return $page_ids;
 }
 
-
-// Retrieves page data given a page ID or page object.
-// Handles page caching.
-function &get_page(&$page, $output = OBJECT) {
-	global $wpdb, $blog_id;
-
+/**
+ * get_page() - Retrieves page data given a page ID or page object
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 1.5.1
+ *
+ * @param mixed &$page page object or page ID
+ * @param string $output what to output
+ * @param string $filter How the return value should be filtered.
+ * @return mixed {@internal Missing Description}}
+ */
+function &get_page(&$page, $output = OBJECT, $filter = 'raw') {
 	if ( empty($page) ) {
-		if ( isset($GLOBALS['page']) ) {
-			$_page = & $GLOBALS['page'];
-			wp_cache_add($_page->ID, $_page, 'pages');
-		} else {
-			// shouldn't we just return NULL at this point? ~ Mark
-			$_page = null;
-		}
-	} elseif ( is_object($page) ) {
-		if ( 'post' == $page->post_type )
-			return get_post($page, $output);
-		wp_cache_add($page->ID, $page, 'pages');
-		$_page = $page;
-	} else {
-		$page = (int) $page;
-		// first, check the cache
-		if ( ! ( $_page = wp_cache_get($page, 'pages') ) ) {
-			// not in the page cache?
-			if ( isset($GLOBALS['page']->ID) && ($page == $GLOBALS['page']->ID) ) { // for is_page() views
-				// I don't think this code ever gets executed ~ Mark
-				$_page = & $GLOBALS['page'];
-				wp_cache_add($_page->ID, $_page, 'pages');
-			} elseif ( isset($GLOBALS['post_cache'][$blog_id][$page]) ) { // it's actually a page, and is cached
-				return get_post($page, $output);
-			} else { // it's not in any caches, so off to the DB we go
-				// Why are we using assignment for this query?
-				$_page = & $wpdb->get_row("SELECT * FROM $wpdb->posts WHERE ID= '$page' LIMIT 1");
-				if ( 'post' == $_page->post_type )
-					return get_post($_page, $output);
-				// Potential issue: we're not checking to see if the post_type = 'page'
-				// So all non-'post' posts will get cached as pages.
-				wp_cache_add($_page->ID, $_page, 'pages');
-			}
-		}
+		if ( isset( $GLOBALS['page'] ) && isset( $GLOBALS['page']->ID ) )
+			return get_post($GLOBALS['page'], $output, $filter);
+		else
+			return null;
 	}
 
-	// at this point, one way or another, $_post contains the page object
-
-	if ( $output == OBJECT ) {
-		return $_page;
-	} elseif ( $output == ARRAY_A ) {
-		return get_object_vars($_page);
-	} elseif ( $output == ARRAY_N ) {
-		return array_values(get_object_vars($_page));
-	} else {
-		return $_page;
-	}
+	return get_post($page, $output, $filter);
 }
 
+/**
+ * get_page_by_path() - Retrieves a page given its path
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.1
+ * @uses $wpdb
+ *
+ * @param string $page_path page path
+ * @param string $output output type
+ * @return mixed {@internal Missing Description}}
+ */
 function get_page_by_path($page_path, $output = OBJECT) {
 	global $wpdb;
 	$page_path = rawurlencode(urldecode($page_path));
@@ -979,7 +1722,7 @@
 	foreach($page_paths as $pathdir)
 		$full_path .= ($pathdir!=''?'/':'') . sanitize_title($pathdir);
 
-	$pages = $wpdb->get_results("SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE post_name = '$leaf_path' AND post_type='page'");
+	$pages = $wpdb->get_results( $wpdb->prepare( "SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE post_name = %s AND (post_type = 'page' OR post_type = 'attachment')", $leaf_path ));
 
 	if ( empty($pages) )
 		return NULL;
@@ -988,7 +1731,7 @@
 		$path = '/' . $leaf_path;
 		$curpage = $page;
 		while ($curpage->post_parent != 0) {
-			$curpage = $wpdb->get_row("SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE ID = '$curpage->post_parent' and post_type='page'");
+			$curpage = $wpdb->get_row( $wpdb->prepare( "SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE ID = %d and post_type='page'", $curpage->post_parent ));
 			$path = '/' . $curpage->post_name . $path;
 		}
 
@@ -999,22 +1742,43 @@
 	return NULL;
 }
 
+/**
+ * get_page_by_title() - Retrieve a page given its title
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.1
+ * @uses $wpdb
+ *
+ * @param string $page_title page title
+ * @param string $output output type
+ * @return mixed {@internal Missing Description}}
+ */
 function get_page_by_title($page_title, $output = OBJECT) {
 	global $wpdb;
-	$page_title = $wpdb->escape($page_title);
-	$page = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_title = '$page_title' AND post_type='page'");
+	$page = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_title = %s AND post_type='page'", $page_title ));
 	if ( $page )
 		return get_page($page, $output);
 
 	return NULL;
 }
 
+/**
+ * get_page_children() - Retrieve child pages
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 1.5.1
+ *
+ * @param int $page_id page ID
+ * @param array $pages list of pages
+ * @return array {@internal Missing Description}}
+ */
 function &get_page_children($page_id, $pages) {
-	global $page_cache, $blog_id;
-
-	if ( empty($pages) )
-		$pages = &$page_cache[$blog_id];
-
 	$page_list = array();
 	foreach ( $pages as $page ) {
 		if ( $page->post_parent == $page_id ) {
@@ -1026,8 +1790,20 @@
 	return $page_list;
 }
 
-//fetches the pages returned as a FLAT list, but arranged in order of their hierarchy, i.e., child parents
-//immediately follow their parents
+/**
+ * get_page_hierarchy() - {@internal Missing Short Description}}
+ *
+ * Fetches the pages returned as a FLAT list, but arranged in order of their hierarchy,
+ * i.e., child parents immediately follow their parents.
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.0
+ *
+ * @param array $posts posts array
+ * @param int $parent parent page ID
+ * @return array {@internal Missing Description}}
+ */
 function get_page_hierarchy($posts, $parent = 0) {
 	$result = array ( );
 	if ($posts) { foreach ($posts as $post) {
@@ -1040,6 +1816,18 @@
 	return $result;
 }
 
+/**
+ * get_page_uri() - Builds a page URI
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 1.5
+ *
+ * @param int $page_id page ID
+ * @return string {@internal Missing Description}}
+ */
 function get_page_uri($page_id) {
 	$page = get_page($page_id);
 	$uri = urldecode($page->post_name);
@@ -1056,37 +1844,52 @@
 	return $uri;
 }
 
+/**
+ * get_pages() - Retrieve a list of pages
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 1.5
+ * @uses $wpdb
+ *
+ * @param mixed $args Optional. Array or string of options
+ * @return array List of pages matching defaults or $args
+ */
 function &get_pages($args = '') {
 	global $wpdb;
 
-	if ( is_array($args) )
-		$r = &$args;
-	else
-		parse_str($args, $r);
+	$defaults = array(
+		'child_of' => 0, 'sort_order' => 'ASC',
+		'sort_column' => 'post_title', 'hierarchical' => 1,
+		'exclude' => '', 'include' => '',
+		'meta_key' => '', 'meta_value' => '',
+		'authors' => ''
+	);
 
-	$defaults = array('child_of' => 0, 'sort_order' => 'ASC', 'sort_column' => 'post_title',
-				'hierarchical' => 1, 'exclude' => '', 'include' => '', 'meta_key' => '', 'meta_value' => '', 'authors' => '');
-	$r = array_merge($defaults, $r);
-	extract($r, EXTR_SKIP);
+	$r = wp_parse_args( $args, $defaults );
+	extract( $r, EXTR_SKIP );
 
 	$key = md5( serialize( $r ) );
-	if ( $cache = wp_cache_get( 'get_pages', 'page' ) )
+	if ( $cache = wp_cache_get( 'get_pages', 'posts' ) )
 		if ( isset( $cache[ $key ] ) )
 			return apply_filters('get_pages', $cache[ $key ], $r );
 
 	$inclusions = '';
 	if ( !empty($include) ) {
-		$child_of = 0; //ignore child_of, exclude, meta_key, and meta_value params if using include 
+		$child_of = 0; //ignore child_of, exclude, meta_key, and meta_value params if using include
 		$exclude = '';
 		$meta_key = '';
 		$meta_value = '';
+		$hierarchical = false;
 		$incpages = preg_split('/[\s,]+/',$include);
 		if ( count($incpages) ) {
 			foreach ( $incpages as $incpage ) {
 				if (empty($inclusions))
-					$inclusions = ' AND ( ID = ' . intval($incpage) . ' ';
+					$inclusions = $wpdb->prepare(' AND ( ID = %d ', $incpage);
 				else
-					$inclusions .= ' OR ID = ' . intval($incpage) . ' ';
+					$inclusions .= $wpdb->prepare(' OR ID = %d ', $incpage);
 			}
 		}
 	}
@@ -1099,13 +1902,13 @@
 		if ( count($expages) ) {
 			foreach ( $expages as $expage ) {
 				if (empty($exclusions))
-					$exclusions = ' AND ( ID <> ' . intval($expage) . ' ';
+					$exclusions = $wpdb->prepare(' AND ( ID <> %d ', $expage);
 				else
-					$exclusions .= ' AND ID <> ' . intval($expage) . ' ';
+					$exclusions .= $wpdb->prepare(' AND ID <> %d ', $expage);
 			}
 		}
 	}
-	if (!empty($exclusions)) 
+	if (!empty($exclusions))
 		$exclusions .= ')';
 
 	$author_query = '';
@@ -1125,9 +1928,9 @@
 				}
 
 				if ( '' == $author_query )
-					$author_query = ' post_author = ' . intval($post_author) . ' ';
+					$author_query = $wpdb->prepare(' post_author = %d ', $post_author);
 				else
-					$author_query .= ' OR post_author = ' . intval($post_author) . ' ';
+					$author_query .= $wpdb->prepare(' OR post_author = %d ', $post_author);
 			}
 			if ( '' != $author_query )
 				$author_query = " AND ($author_query)";
@@ -1135,17 +1938,17 @@
 	}
 
 	$query = "SELECT * FROM $wpdb->posts " ;
-	$query .= ( empty( $meta_key ) ? "" : ", $wpdb->postmeta " ) ; 
+	$query .= ( empty( $meta_key ) ? "" : ", $wpdb->postmeta " ) ;
 	$query .= " WHERE (post_type = 'page' AND post_status = 'publish') $exclusions $inclusions " ;
+	// expected_slashed ($meta_key, $meta_value) -- also, it looks funky
 	$query .= ( empty( $meta_key ) | empty($meta_value)  ? "" : " AND ($wpdb->posts.ID = $wpdb->postmeta.post_id AND $wpdb->postmeta.meta_key = '$meta_key' AND $wpdb->postmeta.meta_value = '$meta_value' )" ) ;
 	$query .= $author_query;
 	$query .= " ORDER BY " . $sort_column . " " . $sort_order ;
 
 	$pages = $wpdb->get_results($query);
-	$pages = apply_filters('get_pages', $pages, $r);
 
 	if ( empty($pages) )
-		return array();
+		return apply_filters('get_pages', array(), $r);
 
 	// Update cache.
 	update_page_cache($pages);
@@ -1154,53 +1957,29 @@
 		$pages = & get_page_children($child_of, $pages);
 
 	$cache[ $key ] = $pages;
-	wp_cache_set( 'get_pages', $cache, 'page' );
-
-	return $pages;
-}
-
-function generate_page_uri_index() {
-	global $wpdb;
-
-	//get pages in order of hierarchy, i.e. children after parents
-	$posts = get_page_hierarchy($wpdb->get_results("SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE post_type = 'page'"));
-	//now reverse it, because we need parents after children for rewrite rules to work properly
-	$posts = array_reverse($posts, true);
+	wp_cache_set( 'get_pages', $cache, 'posts' );
 
-	$page_uris = array();
-	$page_attachment_uris = array();
-
-	if ($posts) {
-
-		foreach ($posts as $id => $post) {
-
-			// URL => page name
-			$uri = get_page_uri($id);
-			$attachments = $wpdb->get_results("SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE post_type = 'attachment' AND post_parent = '$id'");
-			if ( $attachments ) {
-				foreach ( $attachments as $attachment ) {
-					$attach_uri = get_page_uri($attachment->ID);
-					$page_attachment_uris[$attach_uri] = $attachment->ID;
-				}
-			}
-
-			$page_uris[$uri] = $id;
-		}
-
-		delete_option('page_uris');
-		update_option('page_uris', $page_uris);
+	$pages = apply_filters('get_pages', $pages, $r);
 
-		if ( $page_attachment_uris ) {
-			delete_option('page_attachment_uris');
-			update_option('page_attachment_uris', $page_attachment_uris);
-		}
-	}
+	return $pages;
 }
 
 //
 // Attachment functions
 //
 
+/**
+ * is_local_attachment() - Check if the attachment URI is local one and is really an attachment.
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.0
+ *
+ * @param string $url URL to check
+ * @return bool {@internal Missing Description}}
+ */
 function is_local_attachment($url) {
 	if (strpos($url, get_bloginfo('url')) === false)
 		return false;
@@ -1214,31 +1993,44 @@
 	return false;
 }
 
-function wp_insert_attachment($object, $file = false, $post_parent = 0) {
+/**
+ * wp_insert_attachment() - Insert an attachment
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.0
+ *
+ * @uses $wpdb
+ * @uses $user_ID
+ *
+ * @param object $object attachment object
+ * @param string $file filename
+ * @param int $post_parent parent post ID
+ * @return int {@internal Missing Description}}
+ */
+function wp_insert_attachment($object, $file = false, $parent = 0) {
 	global $wpdb, $user_ID;
 
-	if ( is_object($object) )
-		$object = get_object_vars($object);
+	$defaults = array('post_status' => 'draft', 'post_type' => 'post', 'post_author' => $user_ID,
+		'ping_status' => get_option('default_ping_status'), 'post_parent' => 0,
+		'menu_order' => 0, 'to_ping' =>  '', 'pinged' => '', 'post_password' => '',
+		'guid' => '', 'post_content_filtered' => '', 'post_excerpt' => '');
+
+	$object = wp_parse_args($object, $defaults);
+	if ( !empty($parent) )
+		$object['post_parent'] = $parent;
 
-	// Export array as variables
-	extract($object, EXTR_SKIP);
+	$object = sanitize_post($object, 'db');
 
-	// Get the basics.
-	$post_content    = apply_filters('content_save_pre',   $post_content);
-	$post_content_filtered = apply_filters('content_filtered_save_pre',   $post_content_filtered);
-	$post_excerpt    = apply_filters('excerpt_save_pre',   $post_excerpt);
-	$post_title      = apply_filters('title_save_pre',     $post_title);
-	$post_category   = apply_filters('category_save_pre',  $post_category);
-	$post_name       = apply_filters('name_save_pre',      $post_name);
-	$comment_status  = apply_filters('comment_status_pre', $comment_status);
-	$ping_status     = apply_filters('ping_status_pre',    $ping_status);
-	$post_mime_type  = apply_filters('post_mime_type_pre', $post_mime_type);
+	// export array as variables
+	extract($object, EXTR_SKIP);
 
 	// Make sure we set a valid category
 	if (0 == count($post_category) || !is_array($post_category)) {
 		$post_category = array(get_option('default_category'));
 	}
-	$post_cat = $post_category[0];
 
 	if ( empty($post_author) )
 		$post_author = $user_ID;
@@ -1259,24 +2051,30 @@
 	else
 		$post_name = sanitize_title($post_name);
 
-	$post_name_check =
-		$wpdb->get_var("SELECT post_name FROM $wpdb->posts WHERE post_name = '$post_name' AND post_status = 'inherit' AND ID != '$post_ID' LIMIT 1");
+	// expected_slashed ($post_name)
+	$post_name_check = $wpdb->get_var( $wpdb->prepare( "SELECT post_name FROM $wpdb->posts WHERE post_name = '$post_name' AND post_status = 'inherit' AND ID != %d LIMIT 1", $post_ID));
 
 	if ($post_name_check) {
 		$suffix = 2;
 		while ($post_name_check) {
 			$alt_post_name = $post_name . "-$suffix";
-			$post_name_check = $wpdb->get_var("SELECT post_name FROM $wpdb->posts WHERE post_name = '$alt_post_name' AND post_status = 'inherit' AND ID != '$post_ID' AND post_parent = '$post_parent' LIMIT 1");
+			// expected_slashed ($alt_post_name, $post_name)
+			$post_name_check = $wpdb->get_var( $wpdb->prepare( "SELECT post_name FROM $wpdb->posts WHERE post_name = '$alt_post_name' AND post_status = 'inherit' AND ID != %d AND post_parent = %d LIMIT 1", $post_ID, $post_parent));
 			$suffix++;
 		}
 		$post_name = $alt_post_name;
 	}
 
-	if (empty($post_date))
+	if ( empty($post_date) )
 		$post_date = current_time('mysql');
-	if (empty($post_date_gmt))
+	if ( empty($post_date_gmt) )
 		$post_date_gmt = current_time('mysql', 1);
 
+	if ( empty($post_modified) )
+                $post_modified = $post_date;
+	if ( empty($post_modified_gmt) )
+                $post_modified_gmt = $post_date_gmt;
+
 	if ( empty($comment_status) ) {
 		if ( $update )
 			$comment_status = 'closed';
@@ -1285,8 +2083,6 @@
 	}
 	if ( empty($ping_status) )
 		$ping_status = get_option('default_ping_status');
-	if ( empty($post_pingback) )
-		$post_pingback = get_option('default_pingback_flag');
 
 	if ( isset($to_ping) )
 		$to_ping = preg_replace('|\s+|', "\n", $to_ping);
@@ -1306,58 +2102,30 @@
 	if ( !isset($post_password) )
 		$post_password = '';
 
-	if ( isset($to_ping) )
-		$to_ping = preg_replace('|\s+|', "\n", $to_ping);
-	else
-		$to_ping = '';
-
 	if ( ! isset($pinged) )
 		$pinged = '';
 
-	if ($update) {
-		$wpdb->query(
-			"UPDATE $wpdb->posts SET
-			post_author = '$post_author',
-			post_date = '$post_date',
-			post_date_gmt = '$post_date_gmt',
-			post_content = '$post_content',
-			post_content_filtered = '$post_content_filtered',
-			post_title = '$post_title',
-			post_excerpt = '$post_excerpt',
-			post_status = '$post_status',
-			post_type = '$post_type',
-			comment_status = '$comment_status',
-			ping_status = '$ping_status',
-			post_password = '$post_password',
-			post_name = '$post_name',
-			to_ping = '$to_ping',
-			pinged = '$pinged',
-			post_modified = '".current_time('mysql')."',
-			post_modified_gmt = '".current_time('mysql',1)."',
-			post_parent = '$post_parent',
-			menu_order = '$menu_order',
-			post_mime_type = '$post_mime_type',
-			guid = '$guid'
-			WHERE ID = $post_ID");
+	// expected_slashed (everything!)
+	$data = compact( array( 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_content_filtered', 'post_title', 'post_excerpt', 'post_status', 'post_type', 'comment_status', 'ping_status', 'post_password', 'post_name', 'to_ping', 'pinged', 'post_modified', 'post_modified_gmt', 'post_parent', 'menu_order', 'post_mime_type', 'guid' ) );
+	$data = stripslashes_deep( $data );
+
+	if ( $update ) {
+		$wpdb->update( $wpdb->posts, $data, array( 'ID' => $post_ID ) );
 	} else {
-		$wpdb->query(
-			"INSERT INTO $wpdb->posts
-			(post_author, post_date, post_date_gmt, post_content, post_content_filtered, post_title, post_excerpt,  post_status, post_type, comment_status, ping_status, post_password, post_name, to_ping, pinged, post_modified, post_modified_gmt, post_parent, menu_order, post_mime_type, guid)
-			VALUES
-			('$post_author', '$post_date', '$post_date_gmt', '$post_content', '$post_content_filtered', '$post_title', '$post_excerpt', '$post_status', '$post_type', '$comment_status', '$ping_status', '$post_password', '$post_name', '$to_ping', '$pinged', '$post_date', '$post_date_gmt', '$post_parent', '$menu_order', '$post_mime_type', '$guid')");
-			$post_ID = (int) $wpdb->insert_id;
+		$wpdb->insert( $wpdb->posts, $data );
+		$post_ID = (int) $wpdb->insert_id;
 	}
 
 	if ( empty($post_name) ) {
 		$post_name = sanitize_title($post_title, $post_ID);
-		$wpdb->query( "UPDATE $wpdb->posts SET post_name = '$post_name' WHERE ID = '$post_ID'" );
+		$wpdb->update( $wpdb->posts, compact("post_name"), array( 'ID' => $post_ID ) );
 	}
 
 	wp_set_post_categories($post_ID, $post_category);
 
 	if ( $file )
 		update_attached_file( $post_ID, $file );
-
+		
 	clean_post_cache($post_ID);
 
 	if ( $update) {
@@ -1369,11 +2137,23 @@
 	return $post_ID;
 }
 
+/**
+ * wp_delete_attachment() - Delete an attachment
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.0
+ * @uses $wpdb
+ *
+ * @param int $postid attachment Id
+ * @return mixed {@internal Missing Description}}
+ */
 function wp_delete_attachment($postid) {
 	global $wpdb;
-	$postid = (int) $postid;
 
-	if ( !$post = $wpdb->get_row("SELECT * FROM $wpdb->posts WHERE ID = '$postid'") )
+	if ( !$post = $wpdb->get_row(  $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE ID = %d", $postid)) )
 		return $post;
 
 	if ( 'attachment' != $post->post_type )
@@ -1382,33 +2162,58 @@
 	$meta = wp_get_attachment_metadata( $postid );
 	$file = get_attached_file( $postid );
 
-	$wpdb->query("DELETE FROM $wpdb->posts WHERE ID = '$postid'");
+	/** @todo Delete for pluggable post taxonomies too */
+	wp_delete_object_term_relationships($postid, array('category', 'post_tag'));
 
-	$wpdb->query("DELETE FROM $wpdb->comments WHERE comment_post_ID = '$postid'");
+	$wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->posts WHERE ID = %d", $postid ));
 
-	$wpdb->query("DELETE FROM $wpdb->post2cat WHERE post_id = '$postid'");
+	$wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->comments WHERE comment_post_ID = %d", $postid ));
 
-	$wpdb->query("DELETE FROM $wpdb->postmeta WHERE post_id = '$postid'");
+	$wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->postmeta WHERE post_id = %d ", $postid ));
 
 	if ( ! empty($meta['thumb']) ) {
 		// Don't delete the thumb if another attachment uses it
-		if (! $wpdb->get_row("SELECT meta_id FROM $wpdb->postmeta WHERE meta_key = '_wp_attachment_metadata' AND meta_value LIKE '%".$wpdb->escape($meta['thumb'])."%' AND post_id <> $postid")) {
+		if (! $wpdb->get_row( $wpdb->prepare( "SELECT meta_id FROM $wpdb->postmeta WHERE meta_key = '_wp_attachment_metadata' AND meta_value LIKE %s AND post_id <> %d", '%'.$meta['thumb'].'%', $postid)) ) {
 			$thumbfile = str_replace(basename($file), $meta['thumb'], $file);
 			$thumbfile = apply_filters('wp_delete_file', $thumbfile);
 			@ unlink($thumbfile);
 		}
 	}
 
+	// remove intermediate images if there are any
+	$sizes = apply_filters('intermediate_image_sizes', array('thumbnail', 'medium'));
+	foreach ( $sizes as $size ) {
+		if ( $intermediate = image_get_intermediate_size($postid, $size) ) {
+			$intermediate_file = apply_filters('wp_delete_file', $intermediate['path']);
+			@ unlink($intermediate_file);
+		}
+	}
+
 	$file = apply_filters('wp_delete_file', $file);
 
 	if ( ! empty($file) )
 		@ unlink($file);
 
+	clean_post_cache($postid);
+
 	do_action('delete_attachment', $postid);
 
 	return $post;
 }
 
+/**
+ * wp_get_attachment_metadata() - Retrieve metadata for an attachment
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.1
+ *
+ * @param int $post_id attachment ID
+ * @param bool $unfiltered Optional, default is false. If true, filters are not run
+ * @return array {@internal Missing Description}}
+ */
 function wp_get_attachment_metadata( $post_id, $unfiltered = false ) {
 	$post_id = (int) $post_id;
 	if ( !$post =& get_post( $post_id ) )
@@ -1420,6 +2225,19 @@
 	return apply_filters( 'wp_get_attachment_metadata', $data, $post->ID );
 }
 
+/**
+ * wp_update_attachment_metadata() - Update metadata for an attachment
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.1
+ *
+ * @param int $post_id attachment ID
+ * @param array $data attachment data
+ * @return int {@internal Missing Description}}
+ */
 function wp_update_attachment_metadata( $post_id, $data ) {
 	$post_id = (int) $post_id;
 	if ( !$post =& get_post( $post_id ) )
@@ -1435,6 +2253,18 @@
 		return add_post_meta( $post->ID, '_wp_attachment_metadata', $data );
 }
 
+/**
+ * wp_get_attachment_url() - Retrieve the URL for an attachment
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.1
+ *
+ * @param int $post_id attachment ID
+ * @return string {@internal Missing Description}}
+ */
 function wp_get_attachment_url( $post_id = 0 ) {
 	$post_id = (int) $post_id;
 	if ( !$post =& get_post( $post_id ) )
@@ -1448,6 +2278,18 @@
 	return apply_filters( 'wp_get_attachment_url', $url, $post->ID );
 }
 
+/**
+ * wp_get_attachment_thumb_file() - Retrieve thumbnail for an attachment
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.1
+ *
+ * @param int $post_id attachment ID
+ * @return mixed {@internal Missing Description}}
+ */
 function wp_get_attachment_thumb_file( $post_id = 0 ) {
 	$post_id = (int) $post_id;
 	if ( !$post =& get_post( $post_id ) )
@@ -1462,12 +2304,28 @@
 	return false;
 }
 
+/**
+ * wp_get_attachment_thumb_url() - Retrieve URL for an attachment thumbnail
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.1
+ *
+ * @param int $post_id attachment ID
+ * @return string {@internal Missing Description}}
+ */
 function wp_get_attachment_thumb_url( $post_id = 0 ) {
 	$post_id = (int) $post_id;
 	if ( !$post =& get_post( $post_id ) )
 		return false;
 	if ( !$url = wp_get_attachment_url( $post->ID ) )
 		return false;
+		
+	$sized = image_downsize( $post_id, 'thumbnail' );
+	if ( $sized )
+		return $sized[0];
 
 	if ( !$thumb = wp_get_attachment_thumb_file( $post->ID ) )
 		return false;
@@ -1477,6 +2335,18 @@
 	return apply_filters( 'wp_get_attachment_thumb_url', $url, $post->ID );
 }
 
+/**
+ * wp_attachment_is_image() - Check if the attachment is an image
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.1
+ *
+ * @param int $post_id attachment ID
+ * @return bool {@internal Missing Description}}
+ */
 function wp_attachment_is_image( $post_id = 0 ) {
 	$post_id = (int) $post_id;
 	if ( !$post =& get_post( $post_id ) )
@@ -1494,47 +2364,110 @@
 	return false;
 }
 
+/**
+ * wp_mime_type_icon() - Retrieve the icon for a MIME type
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.1
+ *
+ * @param string $mime MIME type
+ * @return string|bool {@internal Missing Description}}
+ */
 function wp_mime_type_icon( $mime = 0 ) {
-	$post_id = 0;
-	if ( is_numeric($mime) ) {
-		$mime = (int) $mime;
-		if ( !$post =& get_post( $mime ) )
-			return false;
-		$post_id = (int) $post->ID;
-		$mime = $post->post_mime_type;
-	}
+	if ( !is_numeric($mime) )
+		$icon = wp_cache_get("mime_type_icon_$mime");
+	if ( empty($icon) ) {
+		$post_id = 0;
+		$post_mimes = array();
+		if ( is_numeric($mime) ) {
+			$mime = (int) $mime;
+			if ( $post =& get_post( $mime ) ) {
+				$post_id = (int) $post->ID;
+				$ext = preg_replace('/^.+?\.([^.]+)$/', '$1', $post->guid);
+				if ( !empty($ext) ) {
+					$post_mimes[] = $ext;
+					if ( $ext_type = wp_ext2type( $ext ) )
+						$post_mimes[] = $ext_type;
+				}
+				$mime = $post->post_mime_type;
+			} else {
+				$mime = 0;
+			}
+		} else {
+			$post_mimes[] = $mime;
+		}
 
-	if ( empty($mime) )
-		return false;
+		$icon_files = wp_cache_get('icon_files');
 
-	$icon_dir = apply_filters( 'icon_dir', get_template_directory() . '/images' );
-	$icon_dir_uri = apply_filters( 'icon_dir_uri', get_template_directory_uri() . '/images' );
+		if ( !is_array($icon_files) ) {
+			$icon_dir = apply_filters( 'icon_dir', ABSPATH . WPINC . '/images/crystal' );
+			$icon_dir_uri = apply_filters( 'icon_dir_uri', trailingslashit(get_option('siteurl')) . WPINC . '/images/crystal' );
+			$dirs = apply_filters( 'icon_dirs', array($icon_dir => $icon_dir_uri) );
+			$icon_files = array();
+			while ( $dirs ) {
+				$dir = array_shift(array_keys($dirs));
+				$uri = array_shift($dirs);
+				if ( $dh = opendir($dir) ) {
+					while ( false !== $file = readdir($dh) ) {
+						$file = basename($file);
+						if ( substr($file, 0, 1) == '.' )
+							continue;
+						if ( !in_array(strtolower(substr($file, -4)), array('.png', '.gif', '.jpg') ) ) {
+							if ( is_dir("$dir/$file") )
+								$dirs["$dir/$file"] = "$uri/$file";
+							continue;
+						}
+						$icon_files["$dir/$file"] = "$uri/$file";
+					}
+					closedir($dh);
+				}
+			}
+			wp_cache_set('icon_files', $icon_files, 600);
+		}
 
-	$types = array(
-		substr($mime, 0, strpos($mime, '/')),
-		substr($mime, strpos($mime, '/') + 1),
-		str_replace('/', '_', $mime)
-	);
+		// Icon basename - extension = MIME wildcard
+		foreach ( $icon_files as $file => $uri )
+			$types[ preg_replace('/^([^.]*).*$/', '$1', basename($file)) ] =& $icon_files[$file];
 
-	$exts = array('jpg', 'gif', 'png');
+		if ( ! empty($mime) ) {
+			$post_mimes[] = substr($mime, 0, strpos($mime, '/'));
+			$post_mimes[] = substr($mime, strpos($mime, '/') + 1);
+			$post_mimes[] = str_replace('/', '_', $mime);
+		}
 
-	$src = false;
+		$matches = wp_match_mime_types(array_keys($types), $post_mimes);
+		$matches['default'] = array('default');
 
-	foreach ( $types as $type ) {
-		foreach ( $exts as $ext ) {
-			$src_file = "$icon_dir/$type.$ext";
-			if ( file_exists($src_file) ) {
-				$src = "$icon_dir_uri/$type.$ext";
-				break 2;
+		foreach ( $matches as $match => $wilds ) {
+			if ( isset($types[$wilds[0]])) {
+				$icon = $types[$wilds[0]];
+				if ( !is_numeric($mime) )
+					wp_cache_set("mime_type_icon_$mime", $icon);
+				break;
 			}
 		}
 	}
 
-	return apply_filters( 'wp_mime_type_icon', $src, $mime, $post_id ); // Last arg is 0 if function pass mime type.
+	return apply_filters( 'wp_mime_type_icon', $icon, $mime, $post_id ); // Last arg is 0 if function pass mime type.
 }
 
+/**
+ * wp_check_for_changed_slugs() - {@internal Missing Short Description}}
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.1
+ *
+ * @param int $post_id The Post ID
+ * @return int Same as $post_id
+ */
 function wp_check_for_changed_slugs($post_id) {
-	if ( !strlen($_POST['wp-old-slug']) )
+	if ( !isset($_POST['wp-old-slug']) || !strlen($_POST['wp-old-slug']) )
 		return $post_id;
 
 	$post = &get_post($post_id);
@@ -1561,12 +2494,21 @@
 }
 
 /**
+ * get_private_posts_cap_sql() - {@internal Missing Short Description}}
+ *
  * This function provides a standardized way to appropriately select on
  * the post_status of posts/pages. The function will return a piece of
  * SQL code that can be added to a WHERE clause; this SQL is constructed
  * to allow all published posts, and all private posts to which the user
  * has access.
- * 
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.2
+ *
+ * @uses $user_ID
+ * @uses apply_filters() Call 'pub_priv_sql_capability' filter for plugins with different post types
+ *
  * @param string $post_type currently only supports 'post' or 'page'.
  * @return string SQL code that can be added to a where clause.
  */
@@ -1606,4 +2548,411 @@
 	return $sql;
 }
 
-?>
\ No newline at end of file
+/**
+ * get_lastpostdate() - {@internal Missing Short Description}}
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 0.71
+ *
+ * @uses $wpdb
+ * @uses $blog_id
+ * @uses apply_filters() Calls 'get_lastpostdate' filter
+ *
+ * @global mixed $cache_lastpostdate Stores the last post date
+ * @global mixed $pagenow The current page being viewed
+ *
+ * @param string $timezone The location to get the time. Can be 'gmt', 'blog', or 'server'.
+ * @return string The date of the last post.
+ */
+function get_lastpostdate($timezone = 'server') {
+	global $cache_lastpostdate, $wpdb, $blog_id;
+	$add_seconds_server = date('Z');
+	if ( !isset($cache_lastpostdate[$blog_id][$timezone]) ) {
+		switch(strtolower($timezone)) {
+			case 'gmt':
+				$lastpostdate = $wpdb->get_var("SELECT post_date_gmt FROM $wpdb->posts WHERE post_status = 'publish' ORDER BY post_date_gmt DESC LIMIT 1");
+				break;
+			case 'blog':
+				$lastpostdate = $wpdb->get_var("SELECT post_date FROM $wpdb->posts WHERE post_status = 'publish' ORDER BY post_date_gmt DESC LIMIT 1");
+				break;
+			case 'server':
+				$lastpostdate = $wpdb->get_var("SELECT DATE_ADD(post_date_gmt, INTERVAL '$add_seconds_server' SECOND) FROM $wpdb->posts WHERE post_status = 'publish' ORDER BY post_date_gmt DESC LIMIT 1");
+				break;
+		}
+		$cache_lastpostdate[$blog_id][$timezone] = $lastpostdate;
+	} else {
+		$lastpostdate = $cache_lastpostdate[$blog_id][$timezone];
+	}
+	return apply_filters( 'get_lastpostdate', $lastpostdate, $timezone );
+}
+
+/**
+ * get_lastpostmodified() - {@internal Missing Short Description}}
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 1.2
+ *
+ * @uses $wpdb
+ * @uses $blog_id
+ * @uses apply_filters() Calls 'get_lastpostmodified' filter
+ *
+ * @global mixed $cache_lastpostmodified Stores the date the last post was modified
+ * @global mixed $pagenow The current page being viewed
+ *
+ * @param string $timezone The location to get the time. Can be 'gmt', 'blog', or 'server'.
+ * @return string The date the post was last modified.
+ */
+function get_lastpostmodified($timezone = 'server') {
+	global $cache_lastpostmodified, $wpdb, $blog_id;
+	$add_seconds_server = date('Z');
+	if ( !isset($cache_lastpostmodified[$blog_id][$timezone]) ) {
+		switch(strtolower($timezone)) {
+			case 'gmt':
+				$lastpostmodified = $wpdb->get_var("SELECT post_modified_gmt FROM $wpdb->posts WHERE post_status = 'publish' ORDER BY post_modified_gmt DESC LIMIT 1");
+				break;
+			case 'blog':
+				$lastpostmodified = $wpdb->get_var("SELECT post_modified FROM $wpdb->posts WHERE post_status = 'publish' ORDER BY post_modified_gmt DESC LIMIT 1");
+				break;
+			case 'server':
+				$lastpostmodified = $wpdb->get_var("SELECT DATE_ADD(post_modified_gmt, INTERVAL '$add_seconds_server' SECOND) FROM $wpdb->posts WHERE post_status = 'publish' ORDER BY post_modified_gmt DESC LIMIT 1");
+				break;
+		}
+		$lastpostdate = get_lastpostdate($timezone);
+		if ( $lastpostdate > $lastpostmodified ) {
+			$lastpostmodified = $lastpostdate;
+		}
+		$cache_lastpostmodified[$blog_id][$timezone] = $lastpostmodified;
+	} else {
+		$lastpostmodified = $cache_lastpostmodified[$blog_id][$timezone];
+	}
+	return apply_filters( 'get_lastpostmodified', $lastpostmodified, $timezone );
+}
+
+/**
+ * update_post_cache() - Updates posts in cache
+ *
+ * @usedby update_page_cache() update_page_cache() aliased by this function.
+ *
+ * @package WordPress
+ * @subpackage Cache
+ * @since 1.5.1
+ *
+ * @param array $posts Array of post objects
+ */
+function update_post_cache(&$posts) {
+	if ( !$posts )
+		return;
+
+	foreach ( $posts as $post )
+		wp_cache_add($post->ID, $post, 'posts');
+}
+
+/**
+ * clean_post_cache() - Will clean the post in the cache
+ *
+ * Cleaning means delete from the cache of the post. Will call to clean
+ * the term object cache associated with the post ID.
+ *
+ * @package WordPress
+ * @subpackage Cache
+ * @since 2.0
+ *
+ * @uses do_action() Will call the 'clean_post_cache' hook action.
+ *
+ * @param int $id The Post ID in the cache to clean
+ */
+function clean_post_cache($id) {
+	wp_cache_delete($id, 'posts');
+	wp_cache_delete($id, 'post_meta');
+
+	clean_object_term_cache($id, 'post');
+
+	wp_cache_delete( 'wp_get_archives', 'general' );
+
+	do_action('clean_post_cache', $id);
+}
+
+/**
+ * update_page_cache() - Alias of update_post_cache()
+ *
+ * @see update_post_cache() Posts and pages are the same, alias is intentional
+ *
+ * @package WordPress
+ * @subpackage Cache
+ * @since 1.5.1
+ *
+ * @param array $pages list of page objects
+ */
+function update_page_cache(&$pages) {
+	update_post_cache($pages);
+}
+
+/**
+ * clean_page_cache() - Will clean the page in the cache
+ *
+ * Clean (read: delete) page from cache that matches $id. Will also clean
+ * cache associated with 'all_page_ids' and 'get_pages'.
+ *
+ * @package WordPress
+ * @subpackage Cache
+ * @since 2.0
+ *
+ * @uses do_action() Will call the 'clean_page_cache' hook action.
+ *
+ * @param int $id Page ID to clean
+ */
+function clean_page_cache($id) {
+	clean_post_cache($id);
+
+	wp_cache_delete( 'all_page_ids', 'posts' );
+	wp_cache_delete( 'get_pages', 'posts' );
+
+	do_action('clean_page_cache', $id);
+}
+
+/**
+ * update_post_caches() - Call major cache updating functions for list of Post objects.
+ *
+ * @package WordPress
+ * @subpackage Cache
+ * @since 1.5
+ *
+ * @uses $wpdb
+ * @uses update_post_cache()
+ * @uses update_object_term_cache()
+ * @uses update_postmeta_cache()
+ *
+ * @param array $posts Array of Post objects
+ */
+function update_post_caches(&$posts) {
+	// No point in doing all this work if we didn't match any posts.
+	if ( !$posts )
+		return;
+
+	update_post_cache($posts);
+
+	$post_ids = array();
+
+	for ($i = 0; $i < count($posts); $i++)
+		$post_ids[] = $posts[$i]->ID;
+
+	update_object_term_cache($post_ids, 'post');
+
+	update_postmeta_cache($post_ids);
+}
+
+/**
+ * update_postmeta_cache() - {@internal Missing Short Description}}
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Cache
+ * @since 2.1
+ *
+ * @uses $wpdb
+ *
+ * @param array $post_ids {@internal Missing Description}}
+ * @return bool|array Returns false if there is nothing to update or an array of metadata
+ */
+function update_postmeta_cache($post_ids) {
+	global $wpdb;
+
+	if ( empty( $post_ids ) )
+		return false;
+
+	if ( !is_array($post_ids) ) {
+		$post_ids = preg_replace('|[^0-9,]|', '', $post_ids);
+		$post_ids = explode(',', $post_ids);
+	}
+
+	$post_ids = array_map('intval', $post_ids);
+
+	$ids = array();
+	foreach ( (array) $post_ids as $id ) {
+		if ( false === wp_cache_get($id, 'post_meta') )
+			$ids[] = $id;
+	}
+
+	if ( empty( $ids ) )
+		return false;
+
+	// Get post-meta info
+	$id_list = join(',', $ids);
+	$cache = array();
+	if ( $meta_list = $wpdb->get_results("SELECT post_id, meta_key, meta_value FROM $wpdb->postmeta WHERE post_id IN ($id_list) ORDER BY post_id, meta_key", ARRAY_A) ) {
+		foreach ( (array) $meta_list as $metarow) {
+			$mpid = (int) $metarow['post_id'];
+			$mkey = $metarow['meta_key'];
+			$mval = $metarow['meta_value'];
+
+			// Force subkeys to be array type:
+			if ( !isset($cache[$mpid]) || !is_array($cache[$mpid]) )
+				$cache[$mpid] = array();
+			if ( !isset($cache[$mpid][$mkey]) || !is_array($cache[$mpid][$mkey]) )
+				$cache[$mpid][$mkey] = array();
+
+			// Add a value to the current pid/key:
+			$cache[$mpid][$mkey][] = $mval;
+		}
+	}
+
+	foreach ( (array) $ids as $id ) {
+		if ( ! isset($cache[$id]) )
+			$cache[$id] = array();
+	}
+
+	foreach ( array_keys($cache) as $post)
+		wp_cache_set($post, $cache[$post], 'post_meta');
+
+	return $cache;
+}
+
+//
+// Hooks
+//
+
+/**
+ * _transition_post_status() - Hook {@internal Missing Short Description}}
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.3
+ *
+ * @uses $wpdb
+ *
+ * @param string $new_status {@internal Missing Description}}
+ * @param string $old_status {@internal Missing Description}}
+ * @param object $post Object type containing the post information
+ */
+function _transition_post_status($new_status, $old_status, $post) {
+	global $wpdb;
+
+	if ( $old_status != 'publish' && $new_status == 'publish' ) {
+		// Reset GUID if transitioning to publish and it is empty
+		if ( '' == get_the_guid($post->ID) )
+			$wpdb->update( $wpdb->posts, array( 'guid' => get_permalink( $post->ID ) ), array( 'ID' => $post->ID ) );
+		do_action('private_to_published', $post->ID);  // Deprecated, use private_to_publish
+	}
+
+	// Always clears the hook in case the post status bounced from future to draft.
+	wp_clear_scheduled_hook('publish_future_post', $post->ID);
+}
+
+/**
+ * _future_post_hook() - Hook used to schedule publication for a post marked for the future.
+ *
+ * The $post properties used and must exist are 'ID' and 'post_date_gmt'.
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.3
+ *
+ * @param int $post_id Not Used. Can be set to null.
+ * @param object $post Object type containing the post information
+ */
+function _future_post_hook($deprecated = '', $post) {
+	wp_clear_scheduled_hook( 'publish_future_post', $post->ID );
+	wp_schedule_single_event(strtotime($post->post_date_gmt. ' GMT'), 'publish_future_post', array($post->ID));
+}
+
+/**
+ * _publish_post_hook() - Hook {@internal Missing Short Description}}
+ *
+ * {@internal Missing Long Description}}
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.3
+ *
+ * @uses $wpdb
+ * @uses XMLRPC_REQUEST
+ * @uses APP_REQUEST
+ * @uses do_action Calls 'xmlprc_publish_post' action if XMLRPC_REQUEST is defined. Calls 'app_publish_post'
+ *	action if APP_REQUEST is defined.
+ *
+ * @param int $post_id The ID in the database table of the post being published
+ */
+function _publish_post_hook($post_id) {
+	global $wpdb;
+
+	if ( defined('XMLRPC_REQUEST') )
+		do_action('xmlrpc_publish_post', $post_id);
+	if ( defined('APP_REQUEST') )
+		do_action('app_publish_post', $post_id);
+
+	if ( defined('WP_IMPORTING') )
+		return;
+
+	$data = array( 'post_id' => $post_id, 'meta_value' => '1' );
+	if ( get_option('default_pingback_flag') )
+		$wpdb->insert( $wpdb->postmeta, $data + array( 'meta_key' => '_pingme' ) );
+	$wpdb->insert( $wpdb->postmeta, $data + array( 'meta_key' => '_encloseme' ) );
+	wp_schedule_single_event(time(), 'do_pings');
+}
+
+/**
+ * _save_post_hook() - Hook used to prevent page/post cache and rewrite rules from staying dirty
+ *
+ * Does two things. If the post is a page and has a template then it will update/add that
+ * template to the meta. For both pages and posts, it will clean the post cache to make sure
+ * that the cache updates to the changes done recently. For pages, the rewrite rules of
+ * WordPress are flushed to allow for any changes.
+ *
+ * The $post parameter, only uses 'post_type' property and 'page_template' property.
+ *
+ * @package WordPress
+ * @subpackage Post
+ * @since 2.3
+ *
+ * @uses $wp_rewrite Flushes Rewrite Rules.
+ *
+ * @param int $post_id The ID in the database table for the $post
+ * @param object $post Object type containing the post information
+ */
+function _save_post_hook($post_id, $post) {
+	if ( $post->post_type == 'page' ) {
+		if ( !empty($post->page_template) )
+			if ( ! update_post_meta($post_id, '_wp_page_template',  $post->page_template))
+				add_post_meta($post_id, '_wp_page_template',  $post->page_template, true);
+
+		clean_page_cache($post_id);
+		global $wp_rewrite;
+		$wp_rewrite->flush_rules();
+	} else {
+		clean_post_cache($post_id);
+	}
+}
+
+//
+// Private
+//
+
+function _get_post_ancestors(&$_post) {
+    global $wpdb;
+
+    if ( !empty($_post->ancestors) )
+    	return;
+
+    $_post->ancestors = array();
+
+    if ( empty($_post->post_parent) || $_post->ID == $_post->post_parent )
+    	return;
+
+    $id = $_post->ancestors[] = $_post->post_parent;
+    while ( $ancestor = $wpdb->get_var("SELECT `post_parent` FROM $wpdb->posts WHERE ID= '{$id}' LIMIT 1") ) {
+    	if ( $id == $ancestor )
+    		break;
+    	$id = $_post->ancestors[] = $ancestor;
+    }
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-includes/query.php 2.5.src/wp-includes/query.php
--- 2.2.2.src/wp-includes/query.php	2007-04-25 13:54:29.000000000 -0500
+++ 2.5.src/wp-includes/query.php	2008-03-26 15:17:31.000000000 -0500
@@ -22,14 +22,24 @@
 	return $GLOBALS['wp_query']->query($query);
 }
 
+function wp_reset_query() {
+	unset($GLOBALS['wp_query']);
+	$GLOBALS['wp_query'] =& $GLOBALS['wp_the_query'];
+	global $wp_query;
+	if ( !empty($wp_query->post) ) {
+		$GLOBALS['post'] = $wp_query->post;
+		setup_postdata($wp_query->post);
+	}
+}
+
 /*
  * Query type checks.
  */
 
 function is_admin () {
-	global $wp_query;
-
-	return ($wp_query->is_admin || (strpos($_SERVER['REQUEST_URI'], 'wp-admin/') !== false));
+	if ( defined('WP_ADMIN') )
+		return WP_ADMIN;
+	return false;
 }
 
 function is_archive () {
@@ -55,11 +65,13 @@
 
 	$author_obj = $wp_query->get_queried_object();
 
-	if ( $author == $author_obj->ID )
+	$author = (array) $author;
+
+	if ( in_array( $author_obj->ID, $author ) )
 		return true;
-	elseif ( $author == $author_obj->nickname )
+	elseif ( in_array( $author_obj->nickname, $author ) )
 		return true;
-	elseif ( $author == $author_obj->user_nicename )
+	elseif ( in_array( $author_obj->user_nicename, $author ) )
 		return true;
 
 	return false;
@@ -76,11 +88,51 @@
 
 	$cat_obj = $wp_query->get_queried_object();
 
-	if ( $category == $cat_obj->cat_ID )
+	$category = (array) $category;
+
+	if ( in_array( $cat_obj->term_id, $category ) )
+		return true;
+	elseif ( in_array( $cat_obj->name, $category ) )
+		return true;
+	elseif ( in_array( $cat_obj->slug, $category ) )
+		return true;
+
+	return false;
+}
+
+function is_tag( $slug = '' ) {
+	global $wp_query;
+
+	if ( !$wp_query->is_tag )
+		return false;
+
+	if ( empty( $slug ) )
+		return true;
+
+	$tag_obj = $wp_query->get_queried_object();
+
+	$slug = (array) $slug;
+
+	if ( in_array( $tag_obj->slug, $slug ) )
 		return true;
-	else if ( $category == $cat_obj->cat_name )
+
+	return false;
+}
+
+function is_tax( $slug = '' ) {
+	global $wp_query;
+	
+	if ( !$wp_query->is_tax )
+		return false;
+
+	if ( empty($slug) )
 		return true;
-	elseif ( $category == $cat_obj->category_nicename )
+
+	$term = $wp_query->get_queried_object();
+
+	$slug = (array) $slug;
+
+	if ( in_array( $term->slug, $slug ) )
 		return true;
 
 	return false;
@@ -110,6 +162,33 @@
 	return $wp_query->is_feed;
 }
 
+/**
+ * is_front_page() - Is it the front of the site, whether blog view or a WP Page?
+ *
+ * @since 2.5
+ * @uses is_home
+ * @uses get_option
+ *
+ * @return bool True if front of site
+ */
+function is_front_page () {
+	// most likely case
+	if ( 'posts' == get_option('show_on_front') && is_home() )
+		return true;
+	elseif ( 'page' == get_option('show_on_front') && get_option('page_on_front') && is_page(get_option('page_on_front')) )
+		return true;
+	else
+		return false;
+}
+
+/**
+ * is_home() - Is it the blog view homepage?
+ *
+ * @since 2.1
+ * @global object $wp_query
+ *
+ * @return bool True if blog view homepage
+ */
 function is_home () {
 	global $wp_query;
 
@@ -133,11 +212,13 @@
 
 	$page_obj = $wp_query->get_queried_object();
 
-	if ( $page == $page_obj->ID )
+	$page = (array) $page;
+
+    if ( in_array( $page_obj->ID, $page ) )
 		return true;
-	elseif ( $page == $page_obj->post_title )
+	elseif ( in_array( $page_obj->post_title, $page ) )
 		return true;
-	else if ( $page == $page_obj->post_name )
+	else if ( in_array( $page_obj->post_name, $page ) )
 		return true;
 
 	return false;
@@ -187,11 +268,13 @@
 
 	$post_obj = $wp_query->get_queried_object();
 
-	if ( $post == $post_obj->ID )
+	$post = (array) $post;
+
+	if ( in_array( $post_obj->ID, $post ) )
 		return true;
-	elseif ( $post == $post_obj->post_title )
+	elseif ( in_array( $post_obj->post_title, $post ) )
 		return true;
-	elseif ( $post == $post_obj->post_name )
+	elseif ( in_array( $post_obj->post_name, $post ) )
 		return true;
 
 	return false;
@@ -256,18 +339,18 @@
 }
 
 /*
- * Comments loop. 
- */ 
+ * Comments loop.
+ */
+
+function have_comments() {
+	global $wp_query;
+	return $wp_query->have_comments();
+}
 
-function have_comments() { 
-	global $wp_query; 
-	return $wp_query->have_comments(); 
-} 
-
-function the_comment() { 
-	global $wp_query; 
-	return $wp_query->the_comment(); 
-}  
+function the_comment() {
+	global $wp_query;
+	return $wp_query->the_comment();
+}
 
 /*
  * WP_Query
@@ -305,6 +388,8 @@
 	var $is_time = false;
 	var $is_author = false;
 	var $is_category = false;
+	var $is_tag = false;
+	var $is_tax = false;
 	var $is_search = false;
 	var $is_feed = false;
 	var $is_comment_feed = false;
@@ -329,6 +414,8 @@
 		$this->is_time = false;
 		$this->is_author = false;
 		$this->is_category = false;
+		$this->is_tag = false;
+		$this->is_tax = false;
 		$this->is_search = false;
 		$this->is_feed = false;
 		$this->is_comment_feed = false;
@@ -383,6 +470,8 @@
 			, 'year'
 			, 'w'
 			, 'category_name'
+			, 'tag'
+			, 'tag_id'
 			, 'author_name'
 			, 'feed'
 			, 'tb'
@@ -396,6 +485,13 @@
 				$array[$key] = '';
 		}
 
+		$array_keys = array('category__in', 'category__not_in', 'category__and',
+			'tag__in', 'tag__not_in', 'tag__and', 'tag_slug__in', 'tag_slug__and');
+
+		foreach ( $array_keys as $key ) {
+			if ( !isset($array[$key]))
+				$array[$key] = array();
+		}
 		return $array;
 	}
 
@@ -413,18 +509,8 @@
 		$this->query_vars = $this->fill_query_vars($this->query_vars);
 		$qv = &$this->query_vars;
 
-		if ( ! empty($qv['robots']) ) {
+		if ( ! empty($qv['robots']) )
 			$this->is_robots = true;
-			return;
-		}
-
-		if ('404' == $qv['error']) {
-			$this->is_404 = true;
-			if ( !empty($query) ) {
-				do_action_ref_array('parse_query', array(&$this));
-			}
-			return;
-		}
 
 		$qv['p'] =  (int) $qv['p'];
 		$qv['page_id'] =  (int) $qv['page_id'];
@@ -433,9 +519,9 @@
 		$qv['day'] = (int) $qv['day'];
 		$qv['w'] = (int) $qv['w'];
 		$qv['m'] =  (int) $qv['m'];
-		if ( '' != $qv['hour'] ) $qv['hour'] = (int) $qv['hour'];
-		if ( '' != $qv['minute'] ) $qv['minute'] = (int) $qv['minute'];
-		if ( '' != $qv['second'] ) $qv['second'] = (int) $qv['second'];
+		if ( '' !== $qv['hour'] ) $qv['hour'] = (int) $qv['hour'];
+		if ( '' !== $qv['minute'] ) $qv['minute'] = (int) $qv['minute'];
+		if ( '' !== $qv['second'] ) $qv['second'] = (int) $qv['second'];
 
 		// Compat.  Map subpost to attachment.
 		if ( '' != $qv['subpost'] )
@@ -444,7 +530,7 @@
 			$qv['attachment_id'] = $qv['subpost_id'];
 
 		$qv['attachment_id'] = (int) $qv['attachment_id'];
-		
+
 		if ( ('' != $qv['attachment']) || !empty($qv['attachment_id']) ) {
 			$this->is_single = true;
 			$this->is_attachment = true;
@@ -452,7 +538,7 @@
 			$this->is_single = true;
 		} elseif ( $qv['p'] ) {
 			$this->is_single = true;
-		} elseif ( ('' != $qv['hour']) && ('' != $qv['minute']) &&('' != $qv['second']) && ('' != $qv['year']) && ('' != $qv['monthnum']) && ('' != $qv['day']) ) {
+		} elseif ( ('' !== $qv['hour']) && ('' !== $qv['minute']) &&('' !== $qv['second']) && ('' != $qv['year']) && ('' != $qv['monthnum']) && ('' != $qv['day']) ) {
 			// If year, month, day, hour, minute, and second are set, a single
 			// post is being queried.
 			$this->is_single = true;
@@ -464,17 +550,17 @@
 		} else {
 		// Look for archive queries.  Dates, categories, authors.
 
-			if ( '' != $qv['second'] ) {
+			if ( '' !== $qv['second'] ) {
 				$this->is_time = true;
 				$this->is_date = true;
 			}
 
-			if ( '' != $qv['minute'] ) {
+			if ( '' !== $qv['minute'] ) {
 				$this->is_time = true;
 				$this->is_date = true;
 			}
 
-			if ( '' != $qv['hour'] ) {
+			if ( '' !== $qv['hour'] ) {
 				$this->is_time = true;
 				$this->is_date = true;
 			}
@@ -531,6 +617,79 @@
 				$this->is_category = true;
 			}
 
+			if ( !is_array($qv['category__in']) || empty($qv['category__in']) ) {
+				$qv['category__in'] = array();
+			} else {
+				$qv['category__in'] = array_map('intval', $qv['category__in']);
+				$this->is_category = true;
+			}
+
+			if ( !is_array($qv['category__not_in']) || empty($qv['category__not_in']) ) {
+				$qv['category__not_in'] = array();
+			} else {
+				$qv['category__not_in'] = array_map('intval', $qv['category__not_in']);
+			}
+
+			if ( !is_array($qv['category__and']) || empty($qv['category__and']) ) {
+				$qv['category__and'] = array();
+			} else {
+				$qv['category__and'] = array_map('intval', $qv['category__and']);
+				$this->is_category = true;
+			}
+
+			if (  '' != $qv['tag'] )
+				$this->is_tag = true;
+
+			$qv['tag_id'] = (int) $qv['tag_id'];
+			if (  !empty($qv['tag_id']) )
+				$this->is_tag = true;
+
+			if ( !is_array($qv['tag__in']) || empty($qv['tag__in']) ) {
+				$qv['tag__in'] = array();
+			} else {
+				$qv['tag__in'] = array_map('intval', $qv['tag__in']);
+				$this->is_tag = true;
+			}
+
+			if ( !is_array($qv['tag__not_in']) || empty($qv['tag__not_in']) ) {
+				$qv['tag__not_in'] = array();
+			} else {
+				$qv['tag__not_in'] = array_map('intval', $qv['tag__not_in']);
+			}
+
+			if ( !is_array($qv['tag__and']) || empty($qv['tag__and']) ) {
+				$qv['tag__and'] = array();
+			} else {
+				$qv['tag__and'] = array_map('intval', $qv['tag__and']);
+				$this->is_category = true;
+			}
+
+			if ( !is_array($qv['tag_slug__in']) || empty($qv['tag_slug__in']) ) {
+				$qv['tag_slug__in'] = array();
+			} else {
+				$qv['tag_slug__in'] = array_map('sanitize_title', $qv['tag_slug__in']);
+				$this->is_tag = true;
+			}
+
+			if ( !is_array($qv['tag_slug__and']) || empty($qv['tag_slug__and']) ) {
+				$qv['tag_slug__and'] = array();
+			} else {
+				$qv['tag_slug__and'] = array_map('sanitize_title', $qv['tag_slug__and']);
+				$this->is_tag = true;
+			}
+
+			if ( empty($qv['taxonomy']) || empty($qv['term']) ) {
+				$this->is_tax = false;
+				foreach ( $GLOBALS['wp_taxonomies'] as $t ) {
+					if ( isset($t->query_var) && '' != $qv[$t->query_var] ) {
+						$this->is_tax = true;
+						break;
+					}
+				}
+			} else {
+				$this->is_tax = true;
+			}
+
 			if ( empty($qv['author']) || ($qv['author'] == '0') ) {
 				$this->is_author = false;
 			} else {
@@ -541,7 +700,7 @@
 				$this->is_author = true;
 			}
 
-			if ( ($this->is_date || $this->is_author || $this->is_category) )
+			if ( ($this->is_date || $this->is_author || $this->is_category || $this->is_tag ) )
 				$this->is_archive = true;
 		}
 
@@ -561,7 +720,7 @@
 		if ('' != $qv['preview'])
 			$this->is_preview = true;
 
-		if ( strpos($_SERVER['PHP_SELF'], 'wp-admin/') !== false )
+		if ( is_admin() )
 			$this->is_admin = true;
 
 		if ( false !== strpos($qv['feed'], 'comments-') ) {
@@ -606,12 +765,21 @@
 			}
 		}
 
+		if ( !empty($qv['post_type']) )
+			$qv['post_type'] = sanitize_user($qv['post_type'], true);
+
+		if ( !empty($qv['post_status']) )
+			$qv['post_status'] = sanitize_user($qv['post_status'], true);
+
 		if ( $this->is_posts_page && !$qv['withcomments'] )
 			$this->is_comment_feed = false;
 
 		$this->is_singular = $this->is_single || $this->is_page || $this->is_attachment;
 		// Done correcting is_* for page_on_front and page_for_posts
 
+		if ('404' == $qv['error'])
+			$this->set_404();
+
 		if ( !empty($query) )
 			do_action_ref_array('parse_query', array(&$this));
 	}
@@ -638,7 +806,7 @@
 	}
 
 	function &get_posts() {
-		global $wpdb, $pagenow, $user_ID;
+		global $wpdb, $user_ID;
 
 		do_action_ref_array('pre_get_posts', array(&$this));
 
@@ -651,16 +819,20 @@
 		$distinct = '';
 		$whichcat = '';
 		$whichauthor = '';
-		$whichpage = '';
-		$result = '';
+		$whichmimetype = '';
 		$where = '';
 		$limits = '';
 		$join = '';
 		$search = '';
 		$groupby = '';
+		$post_status_join = false;
 
-		if ( !isset($q['post_type']) )
-			$q['post_type'] = 'post';
+		if ( !isset($q['post_type']) ) {
+			if ( $this->is_search )
+				$q['post_type'] = 'any';
+			else
+				$q['post_type'] = 'post';
+		}
 		$post_type = $q['post_type'];
 		if ( !isset($q['posts_per_page']) || $q['posts_per_page'] == 0 )
 			$q['posts_per_page'] = get_option('posts_per_page');
@@ -699,47 +871,43 @@
 			$q['page'] = abs($q['page']);
 		}
 
-		$add_hours = intval(get_option('gmt_offset'));
-		$add_minutes = intval(60 * (get_option('gmt_offset') - $add_hours));
-		$wp_posts_post_date_field = "post_date"; // "DATE_ADD(post_date, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)";
-
 		// If a month is specified in the querystring, load that month
 		if ( $q['m'] ) {
 			$q['m'] = '' . preg_replace('|[^0-9]|', '', $q['m']);
-			$where .= ' AND YEAR(post_date)=' . substr($q['m'], 0, 4);
+			$where .= " AND YEAR($wpdb->posts.post_date)=" . substr($q['m'], 0, 4);
 			if (strlen($q['m'])>5)
-				$where .= ' AND MONTH(post_date)=' . substr($q['m'], 4, 2);
+				$where .= " AND MONTH($wpdb->posts.post_date)=" . substr($q['m'], 4, 2);
 			if (strlen($q['m'])>7)
-				$where .= ' AND DAYOFMONTH(post_date)=' . substr($q['m'], 6, 2);
+				$where .= " AND DAYOFMONTH($wpdb->posts.post_date)=" . substr($q['m'], 6, 2);
 			if (strlen($q['m'])>9)
-				$where .= ' AND HOUR(post_date)=' . substr($q['m'], 8, 2);
+				$where .= " AND HOUR($wpdb->posts.post_date)=" . substr($q['m'], 8, 2);
 			if (strlen($q['m'])>11)
-				$where .= ' AND MINUTE(post_date)=' . substr($q['m'], 10, 2);
+				$where .= " AND MINUTE($wpdb->posts.post_date)=" . substr($q['m'], 10, 2);
 			if (strlen($q['m'])>13)
-				$where .= ' AND SECOND(post_date)=' . substr($q['m'], 12, 2);
+				$where .= " AND SECOND($wpdb->posts.post_date)=" . substr($q['m'], 12, 2);
 		}
 
-		if ( '' != $q['hour'] )
-			$where .= " AND HOUR(post_date)='" . $q['hour'] . "'";
+		if ( '' !== $q['hour'] )
+			$where .= " AND HOUR($wpdb->posts.post_date)='" . $q['hour'] . "'";
 
-		if ( '' != $q['minute'] )
-			$where .= " AND MINUTE(post_date)='" . $q['minute'] . "'";
+		if ( '' !== $q['minute'] )
+			$where .= " AND MINUTE($wpdb->posts.post_date)='" . $q['minute'] . "'";
 
-		if ( '' != $q['second'] )
-			$where .= " AND SECOND(post_date)='" . $q['second'] . "'";
+		if ( '' !== $q['second'] )
+			$where .= " AND SECOND($wpdb->posts.post_date)='" . $q['second'] . "'";
 
 		if ( $q['year'] )
-			$where .= " AND YEAR(post_date)='" . $q['year'] . "'";
+			$where .= " AND YEAR($wpdb->posts.post_date)='" . $q['year'] . "'";
 
 		if ( $q['monthnum'] )
-			$where .= " AND MONTH(post_date)='" . $q['monthnum'] . "'";
+			$where .= " AND MONTH($wpdb->posts.post_date)='" . $q['monthnum'] . "'";
 
 		if ( $q['day'] )
-			$where .= " AND DAYOFMONTH(post_date)='" . $q['day'] . "'";
+			$where .= " AND DAYOFMONTH($wpdb->posts.post_date)='" . $q['day'] . "'";
 
 		if ('' != $q['name']) {
 			$q['name'] = sanitize_title($q['name']);
-			$where .= " AND post_name = '" . $q['name'] . "'";
+			$where .= " AND $wpdb->posts.post_name = '" . $q['name'] . "'";
 		} else if ('' != $q['pagename']) {
 			if ( isset($this->queried_object_id) )
 				$reqpage = $this->queried_object_id;
@@ -757,17 +925,23 @@
 				$q['pagename'] = sanitize_title(basename($page_paths));
 				$q['name'] = $q['pagename'];
 				$where .= " AND (ID = '$reqpage')";
+				$reqpage_obj = get_page($reqpage);
+				if ( 'attachment' == $reqpage_obj->post_type ) {
+					$this->is_attachment = true;
+					$this->is_page = true;
+					$q['attachment_id'] = $reqpage;
+				}
 			}
 		} elseif ('' != $q['attachment']) {
 			$q['attachment'] = str_replace('%2F', '/', urlencode(urldecode($q['attachment'])));
 			$attach_paths = '/' . trim($q['attachment'], '/');
 			$q['attachment'] = sanitize_title(basename($attach_paths));
 			$q['name'] = $q['attachment'];
-			$where .= " AND post_name = '" . $q['attachment'] . "'";
+			$where .= " AND $wpdb->posts.post_name = '" . $q['attachment'] . "'";
 		}
 
 		if ( $q['w'] )
-			$where .= " AND WEEK(post_date, 1)='" . $q['w'] . "'";
+			$where .= " AND WEEK($wpdb->posts.post_date, 1)='" . $q['w'] . "'";
 
 		if ( intval($q['comments_popup']) )
 			$q['p'] = intval($q['comments_popup']);
@@ -778,12 +952,12 @@
 
 		// If a post number is specified, load that post
 		if ( $q['p'] )
-			$where = ' AND ID = ' . $q['p'];
+			$where = " AND {$wpdb->posts}.ID = " . $q['p'];
 
 		if ( $q['page_id'] ) {
 			if  ( ('page' != get_option('show_on_front') ) || ( $q['page_id'] != get_option('page_for_posts') ) ) {
 				$q['p'] = $q['page_id'];
-				$where = ' AND ID = ' . $q['page_id'];
+				$where = " AND {$wpdb->posts}.ID = " . $q['page_id'];
 			}
 		}
 
@@ -793,8 +967,7 @@
 			$q['s'] = stripslashes($q['s']);
 			if ($q['sentence']) {
 				$q['search_terms'] = array($q['s']);
-			}
-			else {
+			} else {
 				preg_match_all('/".*?("|$)|((?<=[\\s",+])|^)[^\\s",+]+/', $q[s], $matches);
 				$q['search_terms'] = array_map(create_function('$a', 'return trim($a, "\\"\'\\n\\r ");'), $matches[0]);
 			}
@@ -802,12 +975,12 @@
 			$searchand = '';
 			foreach((array)$q['search_terms'] as $term) {
 				$term = addslashes_gpc($term);
-				$search .= "{$searchand}((post_title LIKE '{$n}{$term}{$n}') OR (post_content LIKE '{$n}{$term}{$n}'))";
+				$search .= "{$searchand}(($wpdb->posts.post_title LIKE '{$n}{$term}{$n}') OR ($wpdb->posts.post_content LIKE '{$n}{$term}{$n}'))";
 				$searchand = ' AND ';
 			}
-			$term = addslashes_gpc($q['s']); 
+			$term = $wpdb->escape($q['s']);
 			if (!$q['sentence'] && count($q['search_terms']) > 1 && $q['search_terms'][0] != $q['s'] )
-				$search .= " OR (post_title LIKE '{$n}{$term}{$n}') OR (post_content LIKE '{$n}{$term}{$n}')";
+				$search .= " OR ($wpdb->posts.post_title LIKE '{$n}{$term}{$n}') OR ($wpdb->posts.post_content LIKE '{$n}{$term}{$n}')";
 
 			if ( !empty($search) )
 				$search = " AND ({$search}) ";
@@ -822,40 +995,48 @@
 		} else {
 			$q['cat'] = ''.urldecode($q['cat']).'';
 			$q['cat'] = addslashes_gpc($q['cat']);
-			$join = " LEFT JOIN $wpdb->post2cat ON ($wpdb->posts.ID = $wpdb->post2cat.post_id) ";
 			$cat_array = preg_split('/[,\s]+/', $q['cat']);
-			$in_cats = $out_cats = $out_posts = '';
+			$q['cat'] = '';
+			$req_cats = array();
 			foreach ( $cat_array as $cat ) {
 				$cat = intval($cat);
-				$in = (strpos($cat, '-') !== false) ? false : true;
-				$cat = trim($cat, '-');
-				if ( $in )
-					$in_cats .= "$cat, " . get_category_children($cat, '', ', ');
-				else
-					$out_cats .= "$cat, " . get_category_children($cat, '', ', ');
-			}
-			$in_cats = substr($in_cats, 0, -2);
-			$out_cats = substr($out_cats, 0, -2);
-			if ( strlen($in_cats) > 0 )
-				$in_cats = " AND $wpdb->post2cat.category_id IN ($in_cats)";
-			if ( strlen($out_cats) > 0 ) {
-				$ids = $wpdb->get_col("SELECT post_id FROM $wpdb->post2cat WHERE $wpdb->post2cat.category_id IN ($out_cats)");
-				if ( is_array($ids) && count($ids > 0) ) {
-					foreach ( $ids as $id )
-						$out_posts .= "$id, ";
-					$out_posts = substr($out_posts, 0, -2);
+				$req_cats[] = $cat;
+				$in = ($cat > 0);
+				$cat = abs($cat);
+				if ( $in ) {
+					$q['category__in'][] = $cat;
+					$q['category__in'] = array_merge($q['category__in'], get_term_children($cat, 'category'));
+				} else {
+					$q['category__not_in'][] = $cat;
+					$q['category__not_in'] = array_merge($q['category__not_in'], get_term_children($cat, 'category'));
 				}
-				if ( strlen($out_posts) > 0 )
-					$out_cats = " AND $wpdb->posts.ID NOT IN ($out_posts)";
-				else
-					$out_cats = '';
 			}
-			$whichcat = $in_cats . $out_cats;
+			$q['cat'] = implode(',', $req_cats);
+		}
+
+		if ( !empty($q['category__in']) || !empty($q['category__not_in']) || !empty($q['category__and']) ) {
 			$groupby = "{$wpdb->posts}.ID";
 		}
 
+		if ( !empty($q['category__in']) ) {
+			$join = " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) ";
+			$whichcat .= " AND $wpdb->term_taxonomy.taxonomy = 'category' ";
+			$include_cats = "'" . implode("', '", $q['category__in']) . "'";
+			$whichcat .= " AND $wpdb->term_taxonomy.term_id IN ($include_cats) ";
+		}
+
+		if ( !empty($q['category__not_in']) ) {
+			$ids = get_objects_in_term($q['category__not_in'], 'category');
+			if ( is_wp_error( $ids ) )
+				return $ids;
+			if ( is_array($ids) && count($ids > 0) ) {
+				$out_posts = "'" . implode("', '", $ids) . "'";
+				$whichcat .= " AND $wpdb->posts.ID NOT IN ($out_posts)";
+			}
+		}
+
 		// Category stuff for nice URLs
-		if ( '' != $q['category_name'] ) {
+		if ( '' != $q['category_name'] && !$this->is_singular ) {
 			$reqcat = get_category_by_path($q['category_name']);
 			$q['category_name'] = str_replace('%2F', '/', urlencode(urldecode($q['category_name'])));
 			$cat_paths = '/' . trim($q['category_name'], '/');
@@ -873,22 +1054,133 @@
 				$reqcat = get_category_by_path($q['category_name'], false);
 
 			if ( !empty($reqcat) )
-				$reqcat = $reqcat->cat_ID;
+				$reqcat = $reqcat->term_id;
 			else
 				$reqcat = 0;
 
 			$q['cat'] = $reqcat;
 
-			$tables = ", $wpdb->post2cat, $wpdb->categories";
-			$join = " LEFT JOIN $wpdb->post2cat ON ($wpdb->posts.ID = $wpdb->post2cat.post_id) LEFT JOIN $wpdb->categories ON ($wpdb->post2cat.category_id = $wpdb->categories.cat_ID) ";
-			$whichcat = " AND category_id IN ({$q['cat']}, ";
-			$whichcat .= get_category_children($q['cat'], '', ', ');
-			$whichcat = substr($whichcat, 0, -2);
-			$whichcat .= ")";
+			$join = " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) ";
+			$whichcat = " AND $wpdb->term_taxonomy.taxonomy = 'category' ";
+			$in_cats = array($q['cat']);
+			$in_cats = array_merge($in_cats, get_term_children($q['cat'], 'category'));
+			$in_cats = "'" . implode("', '", $in_cats) . "'";
+			$whichcat .= "AND $wpdb->term_taxonomy.term_id IN ($in_cats)";
 			$groupby = "{$wpdb->posts}.ID";
 		}
 
+		// Tags
+		if ( '' != $q['tag'] ) {
+			if ( strpos($q['tag'], ',') !== false ) {
+				$tags = preg_split('/[,\s]+/', $q['tag']);
+				foreach ( (array) $tags as $tag ) {
+					$tag = sanitize_term_field('slug', $tag, 0, 'post_tag', 'db');
+					$q['tag_slug__in'][] = $tag;
+				}
+			} else if ( preg_match('/[+\s]+/', $q['tag']) ) {
+				$tags = preg_split('/[+\s]+/', $q['tag']);
+				foreach ( (array) $tags as $tag ) {
+					$tag = sanitize_term_field('slug', $tag, 0, 'post_tag', 'db');
+					$q['tag_slug__and'][] = $tag;
+				}
+			} else {
+				$q['tag'] = sanitize_term_field('slug', $q['tag'], 0, 'post_tag', 'db');
+				$q['tag_slug__in'][] = $q['tag'];
+			}
+		}
+
+		if ( !empty($q['tag__in']) || !empty($q['tag__not_in']) || !empty($q['tag__and']) ||
+			!empty($q['tag_slug__in']) || !empty($q['tag_slug__and']) ) {
+			$groupby = "{$wpdb->posts}.ID";
+		}
+
+		if ( !empty($q['tag__in']) ) {
+			$join = " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) ";
+			$whichcat .= " AND $wpdb->term_taxonomy.taxonomy = 'post_tag' ";
+			$include_tags = "'" . implode("', '", $q['tag__in']) . "'";
+			$whichcat .= " AND $wpdb->term_taxonomy.term_id IN ($include_tags) ";
+			$reqtag = is_term( $q['tag__in'][0], 'post_tag' );
+			if ( !empty($reqtag) )
+				$q['tag_id'] = $reqtag['term_id'];
+		}
+
+		if ( !empty($q['tag_slug__in']) ) {
+			$join = " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) INNER JOIN $wpdb->terms ON ($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id) ";
+			$whichcat .= " AND $wpdb->term_taxonomy.taxonomy = 'post_tag' ";
+			$include_tags = "'" . implode("', '", $q['tag_slug__in']) . "'";
+			$whichcat .= " AND $wpdb->terms.slug IN ($include_tags) ";
+			$reqtag = is_term( $q['tag_slug__in'][0], 'post_tag' );
+			if ( !empty($reqtag) )
+				$q['tag_id'] = $reqtag['term_id'];
+		}
+
+		if ( !empty($q['tag__not_in']) ) {
+			$ids = get_objects_in_term($q['tag__not_in'], 'post_tag');
+			if ( is_array($ids) && count($ids > 0) ) {
+				$out_posts = "'" . implode("', '", $ids) . "'";
+				$whichcat .= " AND $wpdb->posts.ID NOT IN ($out_posts)";
+			}
+		}
+
+		// Tag and slug intersections.
+		$intersections = array('category__and' => 'category', 'tag__and' => 'post_tag', 'tag_slug__and' => 'post_tag');
+		foreach ($intersections as $item => $taxonomy) {
+			if ( empty($q[$item]) ) continue;
+
+			if ( $item != 'category__and' ) {
+				$reqtag = is_term( $q[$item][0], 'post_tag' );
+				if ( !empty($reqtag) )
+					$q['tag_id'] = $reqtag['term_id'];
+			}
+
+			$taxonomy_field = $item == 'tag_slug__and' ? 'slug' : 'term_id';
 
+			$q[$item] = array_unique($q[$item]);
+			$tsql = "SELECT p.ID FROM $wpdb->posts p INNER JOIN $wpdb->term_relationships tr ON (p.ID = tr.object_id) INNER JOIN $wpdb->term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id) INNER JOIN $wpdb->terms t ON (tt.term_id = t.term_id)";
+			$tsql .= " WHERE tt.taxonomy = '$taxonomy' AND t.$taxonomy_field IN ('" . implode("', '", $q[$item]) . "')";
+			$tsql .= " GROUP BY p.ID HAVING count(p.ID) = " . count($q[$item]);
+
+			$post_ids = $wpdb->get_col($tsql);
+
+			if ( count($post_ids) )
+				$whichcat .= " AND $wpdb->posts.ID IN (" . implode(', ', $post_ids) . ") ";
+			else {
+				$whichcat = " AND 0 = 1";
+				break;
+			}
+		}
+
+		// Taxonomies
+		if ( $this->is_tax ) {
+			if ( '' != $q['taxonomy'] ) {
+				$taxonomy = $q['taxonomy'];
+				$tt[$taxonomy] = $q['term'];
+				$terms = get_terms($q['taxonomy'], array('slug'=>$q['term']));
+			} else {
+				foreach ( $GLOBALS['wp_taxonomies'] as $taxonomy => $t ) {
+					if ( isset($t->query_var) && '' != $q[$t->query_var] ) {
+						$terms = get_terms($taxonomy, array('slug'=>$q[$t->query_var]));
+						if ( !is_wp_error($terms) )
+							break;
+					}
+				}
+			}
+			if ( is_wp_error($terms) || empty($terms) ) {
+				$whichcat = " AND 0 ";
+			} else {
+				foreach ( $terms as $term )
+					$term_ids[] = $term->term_id;
+				$post_ids = get_objects_in_term($term_ids, $taxonomy);
+				if ( !is_wp_error($post_ids) && count($post_ids) ) {
+					$whichcat .= " AND $wpdb->posts.ID IN (" . implode(', ', $post_ids) . ") ";
+					$post_type = 'any';
+					$q['post_status'] = 'publish';
+					$post_status_join = true;
+				} else {
+					$whichcat = " AND 0 ";
+				}
+			}
+		}
 
 		// Author/user stuff
 
@@ -907,9 +1199,9 @@
 				$andor = 'OR';
 			}
 			$author_array = preg_split('/[,\s]+/', $q['author']);
-			$whichauthor .= ' AND (post_author '.$eq.' '.intval($author_array[0]);
+			$whichauthor .= " AND ($wpdb->posts.post_author ".$eq.' '.intval($author_array[0]);
 			for ($i = 1; $i < (count($author_array)); $i = $i + 1) {
-				$whichauthor .= ' '.$andor.' post_author '.$eq.' '.intval($author_array[$i]);
+				$whichauthor .= ' '.$andor." $wpdb->posts.post_author ".$eq.' '.intval($author_array[$i]);
 			}
 			$whichauthor .= ')';
 		}
@@ -927,20 +1219,25 @@
 			}
 			$q['author_name'] = sanitize_title($q['author_name']);
 			$q['author'] = $wpdb->get_var("SELECT ID FROM $wpdb->users WHERE user_nicename='".$q['author_name']."'");
-			$whichauthor .= ' AND (post_author = '.intval($q['author']).')';
+			$whichauthor .= " AND ($wpdb->posts.post_author = ".intval($q['author']).')';
 		}
 
-		$where .= $search.$whichcat.$whichauthor;
+		// MIME-Type stuff for attachment browsing
+
+		if ( isset($q['post_mime_type']) && '' != $q['post_mime_type'] )
+			$whichmimetype = wp_post_mime_type_where($q['post_mime_type']);
+
+		$where .= $search.$whichcat.$whichauthor.$whichmimetype;
 
 		if ( empty($q['order']) || ((strtoupper($q['order']) != 'ASC') && (strtoupper($q['order']) != 'DESC')) )
 			$q['order'] = 'DESC';
 
 		// Order by
 		if ( empty($q['orderby']) ) {
-			$q['orderby'] = 'post_date '.$q['order'];
+			$q['orderby'] = "$wpdb->posts.post_date ".$q['order'];
 		} else {
 			// Used to filter values
-			$allowed_keys = array('author', 'date', 'category', 'title', 'modified', 'menu_order');
+			$allowed_keys = array('author', 'date', 'category', 'title', 'modified', 'menu_order', 'parent', 'ID', 'rand');
 			$q['orderby'] = urldecode($q['orderby']);
 			$q['orderby'] = addslashes_gpc($q['orderby']);
 			$orderby_array = explode(' ',$q['orderby']);
@@ -950,40 +1247,93 @@
 			for ($i = 0; $i < count($orderby_array); $i++) {
 				// Only allow certain values for safety
 				$orderby = $orderby_array[$i];
-				if ( 'menu_order' != $orderby )
-					$orderby = 'post_' . $orderby;
+				switch ($orderby) {
+					case 'menu_order':
+					case 'ID':
+						$orderby = "$wpdb->posts.ID";
+						break;
+					case 'rand':
+						$orderby = 'RAND()';
+						break;
+					default:
+						$orderby = "$wpdb->posts.post_" . $orderby;
+				}
 				if ( in_array($orderby_array[$i], $allowed_keys) )
-					$q['orderby'] .= (($i == 0) ? '' : ',') . "$orderby {$q['order']}";
+					$q['orderby'] .= (($i == 0) ? '' : ',') . $orderby;
 			}
+			// append ASC or DESC at the end
+			if ( !empty($q['orderby']))
+				$q['orderby'] .= " {$q['order']}";
+
 			if ( empty($q['orderby']) )
-				$q['orderby'] = 'post_date '.$q['order'];
+				$q['orderby'] = "$wpdb->posts.post_date ".$q['order'];
 		}
 
 		if ( $this->is_attachment ) {
-			$where .= " AND (post_type = 'attachment')";
+			$where .= " AND $wpdb->posts.post_type = 'attachment'";
 		} elseif ($this->is_page) {
-			$where .= " AND (post_type = 'page')";
+			$where .= " AND $wpdb->posts.post_type = 'page'";
 		} elseif ($this->is_single) {
-			$where .= " AND (post_type = 'post')";
+			$where .= " AND $wpdb->posts.post_type = 'post'";
+		} elseif ( 'any' == $post_type ) {
+			$where .= '';
 		} else {
-			$where .= " AND (post_type = '$post_type' AND (post_status = 'publish'";
+			$where .= " AND $wpdb->posts.post_type = '$post_type'";
+		}
+
+		if ( isset($q['post_status']) && '' != $q['post_status'] ) {
+			$statuswheres = array();
+			$q_status = explode(',', $q['post_status']);
+			$r_status = array();
+			$p_status = array();
+			if ( in_array( 'draft'  , $q_status ) )
+				$r_status[] = "$wpdb->posts.post_status = 'draft'";
+			if ( in_array( 'pending', $q_status ) )
+				$r_status[] = "$wpdb->posts.post_status = 'pending'";
+			if ( in_array( 'future' , $q_status ) )
+				$r_status[] = "$wpdb->posts.post_status = 'future'";
+			if ( in_array( 'inherit' , $q_status ) )
+				$r_status[] = "$wpdb->posts.post_status = 'inherit'";
+			if ( in_array( 'private', $q_status ) )
+				$p_status[] = "$wpdb->posts.post_status = 'private'";
+			if ( in_array( 'publish', $q_status ) )
+				$r_status[] = "$wpdb->posts.post_status = 'publish'";
+
+			if ( empty($q['perm'] ) || 'readable' != $q['perm'] ) {
+				$r_status = array_merge($r_status, $p_status);
+				unset($p_status);
+			}
+
+			if ( !empty($r_status) ) {
+				if ( !empty($q['perm'] ) && 'editable' == $q['perm'] && !current_user_can("edit_others_{$post_type}s") )
+					$statuswheres[] = "($wpdb->posts.post_author = $user_ID " .  "AND (" . join( ' OR ', $r_status ) . "))";
+				else
+					$statuswheres[] = "(" . join( ' OR ', $r_status ) . ")";
+			}
+			if ( !empty($p_status) ) {
+				if ( !empty($q['perm'] ) && 'readable' == $q['perm'] && !current_user_can("read_private_{$post_type}s") )
+					$statuswheres[] = "($wpdb->posts.post_author = $user_ID " .  "AND (" . join( ' OR ', $p_status ) . "))";
+				else
+					$statuswheres[] = "(" . join( ' OR ', $p_status ) . ")";
+			}
+			if ( $post_status_join ) {
+				$join .= " LEFT JOIN $wpdb->posts AS p2 ON ($wpdb->posts.post_parent = p2.ID) ";
+				foreach ( $statuswheres as $index => $statuswhere )
+					$statuswheres[$index] = "($statuswhere OR ($wpdb->posts.post_status = 'inherit' AND " . str_replace($wpdb->posts, 'p2', $statuswhere) . "))";
+			}
+			foreach ( $statuswheres as $statuswhere )
+				$where .= " AND $statuswhere";
+		} elseif ( !$this->is_singular ) {
+			$where .= " AND ($wpdb->posts.post_status = 'publish'";
 
 			if ( is_admin() )
-				$where .= " OR post_status = 'future' OR post_status = 'draft'";
+				$where .= " OR $wpdb->posts.post_status = 'future' OR $wpdb->posts.post_status = 'draft' OR $wpdb->posts.post_status = 'pending'";
 
 			if ( is_user_logged_in() ) {
-				if ( 'post' == $post_type )
-					$cap = 'read_private_posts';
-				else
-					$cap = 'read_private_pages';
-
-				if ( current_user_can($cap) )
-					$where .= " OR post_status = 'private'";
-				else
-				$where .= " OR post_author = $user_ID AND post_status = 'private'";
+				$where .= current_user_can( "read_private_{$post_type}s" ) ? " OR $wpdb->posts.post_status = 'private'" : " OR $wpdb->posts.post_author = $user_ID AND $wpdb->posts.post_status = 'private'";
 			}
 
-			$where .= '))';
+			$where .= ')';
 		}
 
 		// Apply filters on where and join prior to paging so that any
@@ -993,7 +1343,7 @@
 
 		// Paging
 		if ( empty($q['nopaging']) && !$this->is_singular ) {
-			$page = abs(intval($q['paged']));
+			$page = absint($q['paged']);
 			if (empty($page)) {
 				$page = 1;
 			}
@@ -1003,7 +1353,7 @@
 				$pgstrt = (intval($page) -1) * $q['posts_per_page'] . ', ';
 				$limits = 'LIMIT '.$pgstrt.$q['posts_per_page'];
 			} else { // we're ignoring $page and using 'offset'
-				$q['offset'] = abs(intval($q['offset']));
+				$q['offset'] = absint($q['offset']);
 				$pgstrt = $q['offset'] . ', ';
 				$limits = 'LIMIT ' . $pgstrt . $q['posts_per_page'];
 			}
@@ -1043,27 +1393,45 @@
 
 		// Apply post-paging filters on where and join.  Only plugins that
 		// manipulate paging queries should use these hooks.
+
 		$where = apply_filters('posts_where_paged', $where);
 		$groupby = apply_filters('posts_groupby', $groupby);
-		if ( ! empty($groupby) )
-			$groupby = 'GROUP BY ' . $groupby;
 		$join = apply_filters('posts_join_paged', $join);
 		$orderby = apply_filters('posts_orderby', $q['orderby']);
 		$distinct = apply_filters('posts_distinct', $distinct);
 		$fields = apply_filters('posts_fields', "$wpdb->posts.*");
 		$limits = apply_filters( 'post_limits', $limits );
+
+		// Announce current selection parameters.  For use by caching plugins.
+		do_action( 'posts_selection', $where . $groupby . $orderby . $limits . $join );
+
+		// Filter again for the benefit of caching plugins.  Regular plugins should use the hooks above.
+		$where = apply_filters('posts_where_request', $where);
+		$groupby = apply_filters('posts_groupby_request', $groupby);
+		$join = apply_filters('posts_join_request', $join);
+		$orderby = apply_filters('posts_orderby_request', $orderby);
+		$distinct = apply_filters('posts_distinct_request', $distinct);
+		$fields = apply_filters('posts_fields_request', $fields);
+		$limits = apply_filters( 'post_limits_request', $limits );
+
+		if ( ! empty($groupby) )
+			$groupby = 'GROUP BY ' . $groupby;
+		if ( !empty( $orderby ) )
+			$orderby = 'ORDER BY ' . $orderby;
 		$found_rows = '';
 		if ( !empty($limits) )
 			$found_rows = 'SQL_CALC_FOUND_ROWS';
 
-		$request = " SELECT $found_rows $distinct $fields FROM $wpdb->posts $join WHERE 1=1 $where $groupby ORDER BY $orderby $limits";
+		$request = " SELECT $found_rows $distinct $fields FROM $wpdb->posts $join WHERE 1=1 $where $groupby $orderby $limits";
 		$this->request = apply_filters('posts_request', $request);
 
 		$this->posts = $wpdb->get_results($this->request);
+		// Raw results filter.  Prior to status checks.
+		$this->posts = apply_filters('posts_results', $this->posts);
 
-		if ( $this->is_comment_feed && $this->is_singular ) {
+		if ( !empty($this->posts) && $this->is_comment_feed && $this->is_singular ) {
 			$cjoin = apply_filters('comment_feed_join', '');
-			$cwhere = apply_filters('comment_feed_where', "WHERE comment_post_ID = {$this->posts[0]->ID} AND comment_approved = '1'");
+			$cwhere = apply_filters('comment_feed_where', "WHERE comment_post_ID = '{$this->posts[0]->ID}' AND comment_approved = '1'");
 			$comments_request = "SELECT $wpdb->comments.* FROM $wpdb->comments $cjoin $cwhere ORDER BY comment_date_gmt DESC LIMIT " . get_option('posts_per_rss');
 			$this->comments = $wpdb->get_results($comments_request);
 			$this->comment_count = count($this->comments);
@@ -1085,7 +1453,7 @@
 					// User must be logged in to view unpublished posts.
 					$this->posts = array();
 				} else {
-					if ('draft' == $status) {
+					if  (in_array($status, array('draft', 'pending')) ) {
 						// User must have edit permissions on the draft to preview.
 						if (! current_user_can('edit_post', $this->posts[0]->ID)) {
 							$this->posts = array();
@@ -1208,6 +1576,21 @@
 			$category = &get_category($cat);
 			$this->queried_object = &$category;
 			$this->queried_object_id = (int) $cat;
+		} else if ($this->is_tag) {
+			$tag_id = $this->get('tag_id');
+			$tag = &get_term($tag_id, 'post_tag');
+			if ( is_wp_error( $tag ) )
+				return $tag;
+			$this->queried_object = &$tag;
+			$this->queried_object_id = (int) $tag_id;
+		} else if ($this->is_tax) {
+			$tax = $this->get('taxonomy');
+			$slug = $this->get('term');
+			$term = &get_terms($tax, array('slug'=>$slug));
+			if ( is_wp_error($term) )
+				return $term;
+			$this->queried_object = $term;
+			$this->queried_object_id = $term->term_id;
 		} else if ($this->is_posts_page) {
 			$this->queried_object = & get_page(get_option('page_for_posts'));
 			$this->queried_object_id = (int) $this->queried_object->ID;
@@ -1284,8 +1667,7 @@
 
 // Setup global post data.
 function setup_postdata($post) {
-	global $id, $postdata, $authordata, $day, $page, $pages, $multipage, $more, $numpages, $wp_query;
-	global $pagenow;
+	global $id, $authordata, $day, $currentmonth, $page, $pages, $multipage, $more, $numpages;
 
 	$id = (int) $post->ID;
 
@@ -1297,7 +1679,7 @@
 	$page = get_query_var('page');
 	if ( !$page )
 		$page = 1;
-	if ( is_single() || is_page() )
+	if ( is_single() || is_page() || is_feed() )
 		$more = 1;
 	$content = $post->post_content;
 	if ( preg_match('/<!--nextpage-->/', $content) ) {
diff -x .svn -aruN 2.2.2.src/wp-includes/registration-functions.php 2.5.src/wp-includes/registration-functions.php
--- 2.2.2.src/wp-includes/registration-functions.php	2007-05-04 16:48:43.000000000 -0500
+++ 2.5.src/wp-includes/registration-functions.php	2008-01-04 14:05:07.000000000 -0600
@@ -1,4 +1,9 @@
 <?php
-// Deprecated.  Use registration.php.
+/**
+ * Deprecated. Use registration.php.
+ *
+ * @package WordPress
+ */
+_deprecated_file( basename(__FILE__), '0.0', 'registration.php' );
 require_once(ABSPATH . WPINC .  '/registration.php');
 ?>
diff -x .svn -aruN 2.2.2.src/wp-includes/registration.php 2.5.src/wp-includes/registration.php
--- 2.2.2.src/wp-includes/registration.php	2007-06-15 12:45:21.000000000 -0500
+++ 2.5.src/wp-includes/registration.php	2008-03-15 12:02:16.000000000 -0500
@@ -1,34 +1,106 @@
 <?php
-
+/**
+ * User Registration API
+ *
+ * @package WordPress
+ */
+
+/**
+ * username_exists() - Checks whether the given username exists.
+ *
+ * @since 2.0.0
+ *
+ * @param string $username Username.
+ * @return null|int The user's ID on success, and null on failure.
+ */
 function username_exists( $username ) {
-	global $wpdb;
-	$username = sanitize_user( $username );
-	$user = get_userdatabylogin($username);
-	if ( $user )
+	if ( $user = get_userdatabylogin( $username ) ) {
 		return $user->ID;
-
-	return null;
+	} else {
+		return null;
+	}
 }
 
-
+/**
+ * email_exists() - Checks whether the given email exists.
+ *
+ * @since 2.1.0
+ * @uses $wpdb
+ *
+ * @param string $email Email.
+ * @return bool|int The user's ID on success, and false on failure.
+ */
 function email_exists( $email ) {
-	global $wpdb;
-	$email = addslashes( $email );
-	return $wpdb->get_var("SELECT ID FROM $wpdb->users WHERE user_email = '$email'");
-}
+	if ( $user = get_user_by_email($email) )
+		return $user->ID;
 
+	return false;
+}
 
+/**
+ * validate_username() - Checks whether an username is valid.
+ *
+ * @since 2.0.1
+ * @uses apply_filters() Calls 'validate_username' hook on $valid check and $username as parameters
+ *
+ * @param string $username Username.
+ * @return bool Whether username given is valid
+ */
 function validate_username( $username ) {
-	$name = sanitize_user($username, true);
-	$valid = true;
-
-	if ( $name != $username )
-		$valid = false;
-
-	return apply_filters('validate_username', $valid, $username);
+	$sanitized = sanitize_user( $username, true );
+	$valid = ( $sanitized == $username );
+	return apply_filters( 'validate_username', $valid, $username );
 }
 
-
+/**
+ * wp_insert_user() - Insert an user into the database.
+ *
+ * Can update a current user or insert a new user based on whether
+ * the user's ID is present.
+ *
+ * Can be used to update the user's info (see below), set the user's
+ * role, and set the user's preference on whether they want the rich
+ * editor on.
+ *
+ * Most of the $userdata array fields have filters associated with
+ * the values. The exceptions are 'rich_editing', 'role', 'jabber',
+ * 'aim', 'yim', 'user_registered', and 'ID'. The filters have the
+ * prefix 'pre_user_' followed by the field name. An example using
+ * 'description' would have the filter called, 'pre_user_description'
+ * that can be hooked into.
+ *
+ * The $userdata array can contain the following fields:
+ * 'ID' - An integer that will be used for updating an existing user.
+ * 'user_pass' - A string that contains the plain text password for the user.
+ * 'user_login' - A string that contains the user's username for logging in.
+ * 'user_nicename' - A string that contains a nicer looking name for the user.
+ *		The default is the user's username.
+ * 'user_url' - A string containing the user's URL for the user's web site.
+ * 'user_email' - A string containing the user's email address.
+ * 'display_name' - A string that will be shown on the site. Defaults to user's username.
+ *		It is likely that you will want to change this, for both appearance and security
+ *		through obscurity (that is if you don't use and delete the default 'admin' user).
+ * 'nickname' - The user's nickname, defaults to the user's username.
+ * 'first_name' - The user's first name.
+ * 'last_name' - The user's last name.
+ * 'description' - A string containing content about the user.
+ * 'rich_editing' - A string for whether to enable the rich editor or not. False if not
+ *		empty.
+ * 'user_registered' - The date the user registered. Format is 'Y-m-d H:i:s'.
+ * 'role' - A string used to set the user's role.
+ * 'jabber' - User's Jabber account.
+ * 'aim' - User's AOL IM account.
+ * 'yim' - User's Yahoo IM account.
+ *
+ * @since 2.0.0
+ * @uses $wpdb WordPress database layer.
+ * @uses apply_filters() Calls filters for most of the $userdata fields with the prefix 'pre_user'. See note above.
+ * @uses do_action() Calls 'profile_update' hook when updating giving the user's ID
+ * @uses do_action() Calls 'user_register' hook when creating a new user giving the user's ID
+ *
+ * @param array $userdata An array of user data.
+ * @return int The newly created user's ID.
+ */
 function wp_insert_user($userdata) {
 	global $wpdb;
 
@@ -40,8 +112,8 @@
 		$update = true;
 	} else {
 		$update = false;
-		// Password is not hashed when creating new user.
-		$user_pass = md5($user_pass);
+		// Hash the password
+		$user_pass = wp_hash_password($user_pass);
 	}
 
 	$user_login = sanitize_user($user_login, true);
@@ -82,21 +154,21 @@
 	if ( empty($rich_editing) )
 		$rich_editing = 'true';
 
+	if ( empty($admin_color) )
+		$admin_color = 'fresh';
+	$admin_color = preg_replace('|[^a-z0-9 _.\-@]|i', '', $admin_color);
+
 	if ( empty($user_registered) )
 		$user_registered = gmdate('Y-m-d H:i:s');
 
+	$data = compact( 'user_pass', 'user_email', 'user_url', 'user_nicename', 'display_name', 'user_registered' );
+	$data = stripslashes_deep( $data );
+
 	if ( $update ) {
-		$query = "UPDATE $wpdb->users SET user_pass='$user_pass', user_email='$user_email', user_url='$user_url', user_nicename = '$user_nicename', display_name = '$display_name' WHERE ID = '$ID'";
-		$query = apply_filters('update_user_query', $query);
-		$wpdb->query( $query );
+		$wpdb->update( $wpdb->users, $data, compact( 'ID' ) );
 		$user_id = (int) $ID;
 	} else {
-		$query = "INSERT INTO $wpdb->users
-		(user_login, user_pass, user_email, user_url, user_registered, user_nicename, display_name)
-	VALUES
-		('$user_login', '$user_pass', '$user_email', '$user_url', '$user_registered', '$user_nicename', '$display_name')";
-		$query = apply_filters('create_user_query', $query);
-		$wpdb->query( $query );
+		$wpdb->insert( $wpdb->users, $data + compact( 'user_login' ) );
 		$user_id = (int) $wpdb->insert_id;
 	}
 
@@ -108,6 +180,7 @@
 	update_usermeta( $user_id, 'aim', $aim );
 	update_usermeta( $user_id, 'yim', $yim );
 	update_usermeta( $user_id, 'rich_editing', $rich_editing);
+	update_usermeta( $user_id, 'admin_color', $admin_color);
 
 	if ( $update && isset($role) ) {
 		$user = new WP_User($user_id);
@@ -130,10 +203,26 @@
 	return $user_id;
 }
 
-
+/**
+ * wp_update_user() - Update an user in the database
+ *
+ * It is possible to update a user's password by specifying the
+ * 'user_pass' value in the $userdata parameter array.
+ *
+ * If $userdata does not contain an 'ID' key, then a new user
+ * will be created and the new user's ID will be returned.
+ *
+ * If current user's password is being updated, then the cookies
+ * will be cleared.
+ *
+ * @since 2.0.0
+ * @see wp_insert_user() For what fields can be set in $userdata
+ * @uses wp_insert_user() Used to update existing user or add new one if user doesn't exist already
+ *
+ * @param array $userdata An array of user data.
+ * @return int The updated user's ID.
+ */
 function wp_update_user($userdata) {
-	global $wpdb;
-
 	$ID = (int) $userdata['ID'];
 
 	// First, get all of the original fields
@@ -145,7 +234,7 @@
 	// If password is changing, hash it now.
 	if ( ! empty($userdata['user_pass']) ) {
 		$plaintext_pass = $userdata['user_pass'];
-		$userdata['user_pass'] = md5($userdata['user_pass']);
+		$userdata['user_pass'] = wp_hash_password($userdata['user_pass']);
 	}
 
 	// Merge old and new fields with new fields overwriting old ones.
@@ -156,15 +245,29 @@
 	$current_user = wp_get_current_user();
 	if ( $current_user->id == $ID ) {
 		if ( isset($plaintext_pass) ) {
-			wp_clearcookie();
-			wp_setcookie($userdata['user_login'], $plaintext_pass);
+			wp_clear_auth_cookie();
+			wp_set_auth_cookie($ID);
 		}
 	}
 
 	return $user_id;
 }
 
-
+/**
+ * wp_create_user() - A simpler way of inserting an user into the database.
+ *
+ * Creates a new user with just the username, password, and email. For a more
+ * detail creation of a user, use wp_insert_user() to specify more infomation.
+ *
+ * @since 2.0.0
+ * @see wp_insert_user() More complete way to create a new user
+ * @uses $wpdb Escapes $username and $email parameters
+ *
+ * @param string $username The user's username.
+ * @param string $password The user's password.
+ * @param string $email The user's email (optional).
+ * @return int The new user's ID.
+ */
 function wp_create_user($username, $password, $email = '') {
 	global $wpdb;
 
@@ -176,9 +279,4 @@
 	return wp_insert_user($userdata);
 }
 
-
-function create_user($username, $password, $email) {
-	return wp_create_user($username, $password, $email);
-}
-
-?>
\ No newline at end of file
+?>
diff -x .svn -aruN 2.2.2.src/wp-includes/rewrite.php 2.5.src/wp-includes/rewrite.php
--- 2.2.2.src/wp-includes/rewrite.php	2007-04-19 17:26:52.000000000 -0500
+++ 2.5.src/wp-includes/rewrite.php	2008-03-28 23:03:09.000000000 -0500
@@ -4,9 +4,9 @@
 *******************************************************************************/
 
 //Add a straight rewrite rule
-function add_rewrite_rule($regex, $redirect) {
+function add_rewrite_rule($regex, $redirect, $after = 'bottom') {
 	global $wp_rewrite;
-	$wp_rewrite->add_rule($regex, $redirect);
+	$wp_rewrite->add_rule($regex, $redirect, $after);
 }
 
 //Add a new tag (like %postname%)
@@ -46,11 +46,12 @@
 define('EP_COMMENTS',   128 );
 define('EP_SEARCH',     256 );
 define('EP_CATEGORIES', 512 );
-define('EP_AUTHORS',    1024);
-define('EP_PAGES',      2048);
+define('EP_TAGS', 1024 );
+define('EP_AUTHORS',    2048);
+define('EP_PAGES',      4096);
 //pseudo-places
 define('EP_NONE',       0  );
-define('EP_ALL',        4095);
+define('EP_ALL',        8191);
 
 //and an endpoint, like /trackback/
 function add_rewrite_endpoint($name, $places) {
@@ -62,13 +63,15 @@
 // determine the post ID it represents.
 function url_to_postid($url) {
 	global $wp_rewrite;
-	
+
 	$url = apply_filters('url_to_postid', $url);
 
 	// First, check to see if there is a 'p=N' or 'page_id=N' to match against
-	preg_match('#[?&](p|page_id)=(\d+)#', $url, $values);
-	$id = intval($values[2]);
-	if ( $id ) return $id;
+	if ( preg_match('#[?&](p|page_id|attachment_id)=(\d+)#', $url, $values) )	{
+		$id = absint($values[2]);
+		if ($id)
+			return $id;
+	}
 
 	// Check to see if we are using rewrite rules
 	$rewrite = $wp_rewrite->wp_rewrite_rules();
@@ -124,7 +127,7 @@
 	foreach ($rewrite as $match => $query) {
 		// If the requesting file is the anchor of the match, prepend it
 		// to the path info.
-		if ( (! empty($url)) && (strpos($match, $url) === 0) ) {
+		if ( (! empty($url)) && (strpos($match, $url) === 0) && ($url != $request)) {
 			$request_match = $url . '/' . $request;
 		}
 
@@ -135,6 +138,15 @@
 
 			// Substitute the substring matches into the query.
 			eval("\$query = \"$query\";");
+			// Filter out non-public query vars
+			global $wp;
+			parse_str($query, $query_vars);
+			$query = array();
+			foreach ( $query_vars as $key => $value ) {
+				if ( in_array($key, $wp->public_query_vars) )
+					$query[$key] = $value;
+			}
+			// Do the query
 			$query = new WP_Query($query);
 			if ( $query->is_single || $query->is_page )
 				return $query->post->ID;
@@ -152,7 +164,9 @@
 	var $permalink_structure;
 	var $use_trailing_slashes;
 	var $category_base;
+	var $tag_base;
 	var $category_structure;
+	var $tag_structure;
 	var $author_base = 'author';
 	var $author_structure;
 	var $date_structure;
@@ -168,10 +182,13 @@
 	var $index = 'index.php';
 	var $matches = '';
 	var $rules;
-	var $extra_rules; //those not generated by the class, see add_rewrite_rule()
-	var $non_wp_rules; //rules that don't redirect to WP's index.php
+	var $extra_rules = array(); //those not generated by the class, see add_rewrite_rule()
+	var $extra_rules_top = array(); //those not generated by the class, see add_rewrite_rule()
+	var $non_wp_rules = array(); //rules that don't redirect to WP's index.php
+	var $extra_permastructs = array();
 	var $endpoints;
 	var $use_verbose_rules = false;
+	var $use_verbose_page_rules = true;
 	var $rewritecode =
 		array(
 					'%year%',
@@ -183,6 +200,7 @@
 					'%postname%',
 					'%post_id%',
 					'%category%',
+					'%tag%',
 					'%author%',
 					'%pagename%',
 					'%search%'
@@ -199,8 +217,9 @@
 					'([^/]+)',
 					'([0-9]+)',
 					'(.+?)',
+					'(.+?)',
 					'([^/]+)',
-					'([^/]+)',
+					'([^/]+?)',
 					'(.+)'
 					);
 
@@ -215,6 +234,7 @@
 					'name=',
 					'p=',
 					'category_name=',
+					'tag=',
 					'author_name=',
 					'pagename=',
 					's='
@@ -261,12 +281,53 @@
 		return "$match_prefix$number$match_suffix";
 	}
 
-	function page_rewrite_rules() {
-		$uris = get_option('page_uris');
-		$attachment_uris = get_option('page_attachment_uris');
+	function page_uri_index() {
+		global $wpdb;
 
+		//get pages in order of hierarchy, i.e. children after parents
+		$posts = get_page_hierarchy($wpdb->get_results("SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE post_type = 'page'"));
+		//now reverse it, because we need parents after children for rewrite rules to work properly
+		$posts = array_reverse($posts, true);
+
+		$page_uris = array();
+		$page_attachment_uris = array();
+
+		if ( !$posts )
+			return array( array(), array() );
+
+
+		foreach ($posts as $id => $post) {
+			// URL => page name
+			$uri = get_page_uri($id);
+			$attachments = $wpdb->get_results( $wpdb->prepare( "SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE post_type = 'attachment' AND post_parent = %d", $id ));
+			if ( $attachments ) {
+				foreach ( $attachments as $attachment ) {
+					$attach_uri = get_page_uri($attachment->ID);
+					$page_attachment_uris[$attach_uri] = $attachment->ID;
+				}
+			}
+
+			$page_uris[$uri] = $id;
+		}
+
+		return array( $page_uris, $page_attachment_uris );
+	}
+
+	function page_rewrite_rules() {
 		$rewrite_rules = array();
 		$page_structure = $this->get_page_permastruct();
+
+		if ( ! $this->use_verbose_page_rules ) {
+			$this->add_rewrite_tag('%pagename%', "(.+?)", 'pagename=');
+			$rewrite_rules = array_merge($rewrite_rules, $this->generate_rewrite_rules($page_structure, EP_PAGES));
+			return $rewrite_rules;
+		}
+
+		$page_uris = $this->page_uri_index();
+		$uris = $page_uris[0];
+		$attachment_uris = $page_uris[1];
+
+
 		if( is_array( $attachment_uris ) ) {
 			foreach ($attachment_uris as $uri => $pagename) {
 				$this->add_rewrite_tag('%pagename%', "($uri)", 'attachment=');
@@ -380,6 +441,32 @@
 		return $this->category_structure;
 	}
 
+	function get_tag_permastruct() {
+		if (isset($this->tag_structure)) {
+			return $this->tag_structure;
+		}
+
+		if (empty($this->permalink_structure)) {
+			$this->tag_structure = '';
+			return false;
+		}
+
+		if (empty($this->tag_base))
+			$this->tag_structure = $this->front . 'tag/';
+		else
+			$this->tag_structure = $this->tag_base . '/';
+
+		$this->tag_structure .= '%tag%';
+
+		return $this->tag_structure;
+	}
+
+	function get_extra_permastruct($name) {
+		if ( isset($this->extra_permastructs[$name]) )
+			return $this->extra_permastructs[$name];
+		return false;
+	}
+
 	function get_author_permastruct() {
 		if (isset($this->author_structure)) {
 			return $this->author_structure;
@@ -513,6 +600,8 @@
 		for ($i = 0; $i < $num_tokens; ++$i) {
 			if (0 < $i) {
 				$queries[$i] = $queries[$i - 1] . '&';
+			} else {
+				$queries[$i] = '';
 			}
 
 			$query_token = str_replace($this->rewritecode, $this->queryreplace, $tokens[0][$i]) . $this->preg_index($i+1);
@@ -550,7 +639,7 @@
 			//make a list of tags, and store how many there are in $num_toks
 			$num_toks = preg_match_all('/%.+?%/', $struct, $toks);
 			//get the 'tagname=$matches[i]'
-			$query = $queries[$num_toks - 1];
+			$query = ( isset($queries) && is_array($queries) ) ? $queries[$num_toks - 1] : '';
 
 			//set up $ep_mask_specific which is used to match more specific URL types
 			switch ($dirs[$j]) {
@@ -643,7 +732,7 @@
 					$subfeedquery = $subquery . '&feed=' . $this->preg_index(2);
 
 					//do endpoints for attachments
-					if ($endpoint) { foreach ($ep_query_append as $regex => $ep) {
+					if (! empty($endpoint) ) { foreach ($ep_query_append as $regex => $ep) {
 						if ($ep[0] & EP_ATTACHMENT) {
 							$rewrite[$sub1 . $regex] = $subquery . '?' . $ep[1] . $this->preg_index(2);
 							$rewrite[$sub2 . $regex] = $subquery . '?' . $ep[1] . $this->preg_index(2);
@@ -676,7 +765,7 @@
 					//add regexes/queries for attachments, attachment trackbacks and so on
 					if ( ! $page ) //require <permalink>/attachment/stuff form for pages because of confusion with subpages
 						$rewrite = array_merge($rewrite, array($sub1 => $subquery, $sub1tb => $subtbquery, $sub1feed => $subfeedquery, $sub1feed2 => $subfeedquery));
-					$rewrite = array_merge($rewrite, array($sub2 => $subquery, $sub2tb => $subtbquery, $sub2feed => $subfeedquery, $sub2feed2 => $subfeedquery));
+					$rewrite = array_merge(array($sub2 => $subquery, $sub2tb => $subtbquery, $sub2feed => $subfeedquery, $sub2feed2 => $subfeedquery), $rewrite);
 				}
 			} //if($num_toks)
 			//add the rules for this dir to the accumulating $post_rewrite
@@ -736,6 +825,10 @@
 		$category_rewrite = $this->generate_rewrite_rules($this->get_category_permastruct(), EP_CATEGORIES);
 		$category_rewrite = apply_filters('category_rewrite_rules', $category_rewrite);
 
+		// Tags
+		$tag_rewrite = $this->generate_rewrite_rules($this->get_tag_permastruct(), EP_TAGS);
+		$tag_rewrite = apply_filters('tag_rewrite_rules', $tag_rewrite);
+
 		// Authors
 		$author_rewrite = $this->generate_rewrite_rules($this->get_author_permastruct(), EP_AUTHORS);
 		$author_rewrite = apply_filters('author_rewrite_rules', $author_rewrite);
@@ -744,8 +837,15 @@
 		$page_rewrite = $this->page_rewrite_rules();
 		$page_rewrite = apply_filters('page_rewrite_rules', $page_rewrite);
 
+		// Extra permastructs
+		foreach ( $this->extra_permastructs as $permastruct )
+			$this->extra_rules_top = array_merge($this->extra_rules_top, $this->generate_rewrite_rules($permastruct, EP_NONE));
+
 		// Put them together.
-		$this->rules = array_merge($robots_rewrite, $default_feeds, $page_rewrite, $root_rewrite, $comments_rewrite, $search_rewrite, $category_rewrite, $author_rewrite, $date_rewrite, $post_rewrite, $this->extra_rules);
+		if ( $this->use_verbose_page_rules )
+			$this->rules = array_merge($this->extra_rules_top, $robots_rewrite, $default_feeds, $page_rewrite, $root_rewrite, $comments_rewrite, $search_rewrite, $category_rewrite, $tag_rewrite, $author_rewrite, $date_rewrite, $post_rewrite, $this->extra_rules);
+		else
+			$this->rules = array_merge($this->extra_rules_top, $robots_rewrite, $default_feeds, $root_rewrite, $comments_rewrite, $search_rewrite, $category_rewrite, $tag_rewrite, $author_rewrite, $date_rewrite, $post_rewrite, $page_rewrite, $this->extra_rules);
 
 		do_action_ref_array('generate_rewrite_rules', array(&$this));
 		$this->rules = apply_filters('rewrite_rules_array', $this->rules);
@@ -832,14 +932,18 @@
 	}
 
 	//Add a straight rewrite rule
-	function add_rule($regex, $redirect) {
+	function add_rule($regex, $redirect, $after = 'bottom') {
 		//get everything up to the first ?
 		$index = (strpos($redirect, '?') == false ? strlen($redirect) : strpos($redirect, '?'));
 		$front = substr($redirect, 0, $index);
 		if ($front != $this->index) { //it doesn't redirect to WP's index.php
 			$this->add_external_rule($regex, $redirect);
 		} else {
-			$this->extra_rules[$regex] = $redirect;
+			if ( 'bottom' == $after)
+				$this->extra_rules = array_merge($this->extra_rules, array($regex => $redirect));
+			else
+				$this->extra_rules_top = array_merge($this->extra_rules_top, array($regex => $redirect));
+			//$this->extra_rules[$regex] = $redirect;
 		}
 	}
 
@@ -855,8 +959,13 @@
 		$wp->add_query_var($name);
 	}
 
+	function add_permastruct($name, $struct, $with_front = true) {
+		if ( $with_front )
+			$struct = $this->front . $struct;
+		$this->extra_permastructs[$name] = $struct;
+	}
+
 	function flush_rules() {
-		generate_page_uri_index();
 		delete_option('rewrite_rules');
 		$this->wp_rewrite_rules();
 		if ( function_exists('save_mod_rewrite_rules') )
@@ -871,7 +980,8 @@
 		if ($this->using_index_permalinks()) {
 			$this->root = $this->index . '/';
 		}
-		$this->category_base = get_option('category_base');
+		$this->category_base = get_option( 'category_base' );
+		$this->tag_base = get_option( 'tag_base' );
 		unset($this->category_structure);
 		unset($this->author_structure);
 		unset($this->date_structure);
@@ -880,6 +990,16 @@
 		unset($this->feed_structure);
 		unset($this->comment_feed_structure);
 		$this->use_trailing_slashes = ( substr($this->permalink_structure, -1, 1) == '/' ) ? true : false;
+
+		// Enable generic rules for pages if permalink structure doesn't begin with a wildcard.
+		$structure = ltrim($this->permalink_structure, '/');
+		if ( 0 === strpos($structure, '%postname%') ||
+			 0 === strpos($structure, '%category%') ||
+			 0 === strpos($structure, '%tag%') ||
+			 0 === strpos($structure, '%author%') )
+			 $this->use_verbose_page_rules = true;
+		else
+			$this->use_verbose_page_rules = false;
 	}
 
 	function set_permalink_structure($permalink_structure) {
@@ -896,9 +1016,16 @@
 		}
 	}
 
+	function set_tag_base( $tag_base ) {
+		if ( $tag_base != $this->tag_base ) {
+			update_option( 'tag_base', $tag_base );
+			$this->init();
+		}
+	}
+
 	function WP_Rewrite() {
 		$this->init();
 	}
 }
 
-?>
\ No newline at end of file
+?>
diff -x .svn -aruN 2.2.2.src/wp-includes/rss-functions.php 2.5.src/wp-includes/rss-functions.php
--- 2.2.2.src/wp-includes/rss-functions.php	2007-05-04 16:48:43.000000000 -0500
+++ 2.5.src/wp-includes/rss-functions.php	2008-01-04 14:05:07.000000000 -0600
@@ -1,4 +1,10 @@
 <?php
-// Deprecated.  Use rss.php instead.
+/**
+ * Deprecated.  Use rss.php instead.
+ *
+ * @package WordPress
+ */
+
+_deprecated_file( basename(__FILE__), '0.0', 'rss.php' );
 require_once (ABSPATH . WPINC . '/rss.php');
 ?>
diff -x .svn -aruN 2.2.2.src/wp-includes/rss.php 2.5.src/wp-includes/rss.php
--- 2.2.2.src/wp-includes/rss.php	2007-03-07 11:04:03.000000000 -0600
+++ 2.5.src/wp-includes/rss.php	2008-01-09 11:48:00.000000000 -0600
@@ -1,15 +1,26 @@
 <?php
+/**
+ * MagpieRSS: a simple RSS integration tool
+ *
+ * A compiled file for RSS syndication
+ *
+ * @author Kellan Elliott-McCrea <kellan@protest.net>
+ * @version 0.51
+ * @license GPL
+ *
+ * @package External
+ * @subpackage MagpieRSS
+ */
+
 /*
- * Project:     MagpieRSS: a simple RSS integration tool
- * File:        A compiled file for RSS syndication
- * Author:      Kellan Elliott-McCrea <kellan@protest.net>
- * Version:		0.51
- * License:		GPL
+ * Hook to use another RSS object instead of MagpieRSS
  */
+do_action('load_feed_engine');
+
 
 define('RSS', 'RSS');
 define('ATOM', 'Atom');
-define('MAGPIE_USER_AGENT', 'WordPress/' . $wp_version);
+define('MAGPIE_USER_AGENT', 'WordPress/' . $GLOBALS['wp_version']);
 
 class MagpieRSS {
 	var $parser;
@@ -375,6 +386,7 @@
 }
 require_once( dirname(__FILE__) . '/class-snoopy.php');
 
+if ( !function_exists('fetch_rss') ) :
 function fetch_rss ($url) {
 	// initialize constants
 	init();
@@ -501,6 +513,7 @@
 
 	} // end if ( !MAGPIE_CACHE_ON ) {
 } // end fetch_rss()
+endif;
 
 function _fetch_remote_file ($url, $headers = "" ) {
 	// Snoopy is an HTTP client in PHP
@@ -591,7 +604,7 @@
 	}
 
 	if ( !defined('MAGPIE_USER_AGENT') ) {
-		$ua = 'WordPress/' . $wp_version;
+		$ua = 'WordPress/' . $GLOBALS['wp_version'];
 
 		if ( MAGPIE_CACHE_ON ) {
 			$ua = $ua . ')';
@@ -663,9 +676,10 @@
 		$cache_option = 'rss_' . $this->file_name( $url );
 		$cache_timestamp = 'rss_' . $this->file_name( $url ) . '_ts';
 
-		if ( !$wpdb->get_var("SELECT option_name FROM $wpdb->options WHERE option_name = '$cache_option'") )
+		// shouldn't these be using get_option() ?
+		if ( !$wpdb->get_var( $wpdb->prepare( "SELECT option_name FROM $wpdb->options WHERE option_name = %s", $cache_option ) ) )
 			add_option($cache_option, '', '', 'no');
-		if ( !$wpdb->get_var("SELECT option_name FROM $wpdb->options WHERE option_name = '$cache_timestamp'") )
+		if ( !$wpdb->get_var( $wpdb->prepare( "SELECT option_name FROM $wpdb->options WHERE option_name = %s", $cache_timestamp ) ) )
 			add_option($cache_timestamp, '', '', 'no');
 
 		update_option($cache_option, $rss);
@@ -775,6 +789,7 @@
 	}
 }
 
+if ( !function_exists('parse_w3cdtf') ) :
 function parse_w3cdtf ( $date_str ) {
 
 	# regex to match wc3dtf
@@ -815,27 +830,35 @@
 	else {
 		return -1;
 	}
-	}
-function wp_rss ($url, $num_items) {
-	//ini_set("display_errors", false); uncomment to suppress php errors thrown if the feed is not returned.
-	$rss = fetch_rss($url);
-		if ( $rss ) {
-			echo "<ul>";
-			$rss->items = array_slice($rss->items, 0, $num_items);
-				foreach ($rss->items as $item ) {
-					echo "<li>\n";
-					echo "<a href='$item[link]' title='$item[description]'>";
-					echo htmlentities($item['title']);
-					echo "</a><br />\n";
-					echo "</li>\n";
-				}
-			echo "</ul>";
-	}
-		else {
-			echo "an error has occured the feed is probably down, try again later.";
+}
+endif;
+
+if ( !function_exists('wp_rss') ) :
+function wp_rss( $url, $num_items = -1 ) {
+	if ( $rss = fetch_rss( $url ) ) {
+		echo '<ul>';
+
+		if ( $num_items !== -1 ) {
+			$rss->items = array_slice( $rss->items, 0, $num_items );
+		}
+
+		foreach ( $rss->items as $item ) {
+			printf(
+				'<li><a href="%1$s" title="%2$s">%3$s</a></li>',
+				clean_url( $item['link'] ),
+				attribute_escape( strip_tags( $item['description'] ) ),
+				htmlentities( $item['title'] )
+			);
+		}
+
+		echo '</ul>';
+	} else {
+		_e( 'An error has occurred, which probably means the feed is down. Try again later.' );
 	}
 }
+endif;
 
+if ( !function_exists('get_rss') ) :
 function get_rss ($url, $num_items = 5) { // Like get posts, but for RSS
 	$rss = fetch_rss($url);
 	if ( $rss ) {
@@ -851,4 +874,6 @@
 		return false;
 	}
 }
+endif;
+
 ?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/script-loader.php 2.5.src/wp-includes/script-loader.php
--- 2.2.2.src/wp-includes/script-loader.php	2007-04-17 15:56:41.000000000 -0500
+++ 2.5.src/wp-includes/script-loader.php	2008-03-27 22:49:35.000000000 -0500
@@ -2,6 +2,7 @@
 class WP_Scripts {
 	var $scripts = array();
 	var $queue = array();
+	var $to_print = array();
 	var $printed = array();
 	var $args = array();
 
@@ -10,9 +11,9 @@
 	}
 
 	function default_scripts() {
-		$this->add( 'dbx', '/wp-includes/js/dbx.js', false, '2.05' );
-		$this->add( 'fat', '/wp-includes/js/fat.js', false, '1.0-RC1_3660' );
+		$this->add( 'common', '/wp-admin/js/common.js', array('jquery'), '20080318' );
 		$this->add( 'sack', '/wp-includes/js/tw-sack.js', false, '1.6.1' );
+
 		$this->add( 'quicktags', '/wp-includes/js/quicktags.js', false, '3958' );
 		$this->localize( 'quicktags', 'quicktagsL10n', array(
 			'quickLinks' => __('(Quick Links)'),
@@ -25,81 +26,145 @@
 			'enterImageURL' => __('Enter the URL of the image'),
 			'enterImageDescription' => __('Enter a description of the image')
 		) );
+
 		$this->add( 'colorpicker', '/wp-includes/js/colorpicker.js', false, '3517' );
-		$this->add( 'tiny_mce', '/wp-includes/js/tinymce/tiny_mce_gzip.php', false, '20070326' );
-		$mce_config = apply_filters('tiny_mce_config_url', '/wp-includes/js/tinymce/tiny_mce_config.php');
-		$this->add( 'wp_tiny_mce', $mce_config, array('tiny_mce'), '20070225' );
-		$this->add( 'prototype', '/wp-includes/js/prototype.js', false, '1.5.0-0');
-		$this->add( 'autosave', '/wp-includes/js/autosave.js', array('prototype', 'sack'), '20070306');
-		$this->localize( 'autosave', 'autosaveL10n', array(
-			'autosaveInterval' => apply_filters('autosave_interval', '120'),
-			'errorText' => __('Error: %response%'),
-			'saveText' => __('Saved at %time%.'),
-			'requestFile' => get_option( 'siteurl' ) . '/wp-admin/admin-ajax.php',
-			'savingText' => __('Saving Draft...')
+
+		// Let a plugin replace the visual editor
+		$visual_editor = apply_filters('visual_editor', array('tiny_mce'));
+		$this->add( 'editor', false, $visual_editor, '20080321' );
+
+		$this->add( 'editor_functions', '/wp-admin/js/editor.js', false, '20080325' );
+
+		// Modify this version when tinyMCE plugins are changed.
+		$mce_version = apply_filters('tiny_mce_version', '20080327');
+		$this->add( 'tiny_mce', '/wp-includes/js/tinymce/tiny_mce_config.php', array('editor_functions'), $mce_version );
+
+		$this->add( 'prototype', '/wp-includes/js/prototype.js', false, '1.6');
+
+		$this->add( 'wp-ajax-response', '/wp-includes/js/wp-ajax-response.js', array('jquery'), '20080316' );
+		$this->localize( 'wp-ajax-response', 'wpAjax', array(
+			'noPerm' => __('You do not have permission to do that.'),
+			'broken' => __('An unidentified error has occurred.')
 		) );
+
+		$this->add( 'autosave', '/wp-includes/js/autosave.js', array('schedule', 'wp-ajax-response'), '20080326b' );
+
 		$this->add( 'wp-ajax', '/wp-includes/js/wp-ajax.js', array('prototype'), '20070306');
 		$this->localize( 'wp-ajax', 'WPAjaxL10n', array(
 			'defaultUrl' => get_option( 'siteurl' ) . '/wp-admin/admin-ajax.php',
-			'permText' => __("You don't have permission to do that."),
+			'permText' => __("You do not have permission to do that."),
 			'strangeText' => __("Something strange happened.  Try refreshing the page."),
 			'whoaText' => __("Slow down, I'm still sending your data!")
 		) );
-		$this->add( 'listman', '/wp-includes/js/list-manipulation.js', array('wp-ajax', 'fat'), '20070306' );
-		$this->localize( 'listman', 'listManL10n', array(
-			'jumpText' => __('Jump to new item'),
-			'delText' => __('Are you sure you want to delete this %thing%?')
+
+		$this->add( 'wp-lists', '/wp-includes/js/wp-lists.js', array('wp-ajax-response'), '20080322' );
+		$this->localize( 'wp-lists', 'wpListL10n', array(
+			'url' => get_option( 'siteurl' ) . '/wp-admin/admin-ajax.php'
 		) );
-		$this->add( 'scriptaculous-root', '/wp-includes/js/scriptaculous/wp-scriptaculous.js', array('prototype'), '1.7.0');
-		$this->add( 'scriptaculous-builder', '/wp-includes/js/scriptaculous/builder.js', array('scriptaculous-root'), '1.7.0');
-		$this->add( 'scriptaculous-dragdrop', '/wp-includes/js/scriptaculous/dragdrop.js', array('scriptaculous-builder', 'scriptaculous-effects'), '1.7.0');
-		$this->add( 'scriptaculous-effects', '/wp-includes/js/scriptaculous/effects.js', array('scriptaculous-root'), '1.7.0');
-		$this->add( 'scriptaculous-slider', '/wp-includes/js/scriptaculous/slider.js', array('scriptaculous-effects'), '1.7.0');
-		$this->add( 'scriptaculous-controls', '/wp-includes/js/scriptaculous/controls.js', array('scriptaculous-root'), '1.7.0');
-		$this->add( 'scriptaculous', '', array('scriptaculous-dragdrop', 'scriptaculous-slider', 'scriptaculous-controls'), '1.7.0');
+
+		$this->add( 'scriptaculous-root', '/wp-includes/js/scriptaculous/scriptaculous.js', array('prototype'), '1.8.0');
+		$this->add( 'scriptaculous-builder', '/wp-includes/js/scriptaculous/builder.js', array('scriptaculous-root'), '1.8.0');
+		$this->add( 'scriptaculous-dragdrop', '/wp-includes/js/scriptaculous/dragdrop.js', array('scriptaculous-builder', 'scriptaculous-effects'), '1.8.0');
+		$this->add( 'scriptaculous-effects', '/wp-includes/js/scriptaculous/effects.js', array('scriptaculous-root'), '1.8.0');
+		$this->add( 'scriptaculous-slider', '/wp-includes/js/scriptaculous/slider.js', array('scriptaculous-effects'), '1.8.0');
+		$this->add( 'scriptaculous-sound', '/wp-includes/js/scriptaculous/sound.js', array( 'scriptaculous-root' ), '1.8.0' );
+		$this->add( 'scriptaculous-controls', '/wp-includes/js/scriptaculous/controls.js', array('scriptaculous-root'), '1.8.0');
+		$this->add( 'scriptaculous', '', array('scriptaculous-dragdrop', 'scriptaculous-slider', 'scriptaculous-controls'), '1.8.0');
+
 		$this->add( 'cropper', '/wp-includes/js/crop/cropper.js', array('scriptaculous-dragdrop'), '20070118');
-		$this->add( 'jquery', '/wp-includes/js/jquery/jquery.js', false, '1.1.2');
-		$this->add( 'interface', '/wp-includes/js/jquery/interface.js', array('jquery'), '1.2');
+
+		$this->add( 'jquery', '/wp-includes/js/jquery/jquery.js', false, '1.2.3');
+		$this->add( 'jquery-form', '/wp-includes/js/jquery/jquery.form.js', array('jquery'), '2.02');
+		$this->add( 'jquery-color', '/wp-includes/js/jquery/jquery.color.js', array('jquery'), '2.0-4561');
+		$this->add( 'interface', '/wp-includes/js/jquery/interface.js', array('jquery'), '1.2' );
+		$this->add( 'dimensions', '/wp-includes/js/jquery/jquery.dimensions.min.js', array('jquery'), '1.1.2');
+		$this->add( 'suggest', '/wp-includes/js/jquery/suggest.js', array('dimensions'), '1.1');
+		$this->add( 'schedule', '/wp-includes/js/jquery/jquery.schedule.js', array('jquery'), '20');
+		$this->add( 'thickbox', '/wp-includes/js/thickbox/thickbox.js', array('jquery'), '3.1');
+		$this->add( 'swfupload', '/wp-includes/js/swfupload/swfupload.js', false, '2.0.2');
+		$this->add( 'swfupload-degrade', '/wp-includes/js/swfupload/plugins/swfupload.graceful_degradation.js', array('swfupload'), '2.0.2');
+		$this->localize( 'swfupload-degrade', 'uploadDegradeOptions', array(
+			'is_lighttpd_before_150' => is_lighttpd_before_150(),
+		) );
+		$this->add( 'swfupload-queue', '/wp-includes/js/swfupload/plugins/swfupload.queue.js', array('swfupload'), '2.0.2');
+		$this->add( 'swfupload-handlers', '/wp-includes/js/swfupload/handlers.js', array('swfupload'), '2.0.2-20080301');
+		// these error messages came from the sample swfupload js, they might need changing.
+		$this->localize( 'swfupload-handlers', 'swfuploadL10n', array(
+				'queue_limit_exceeded' => __('You have attempted to queue too many files.'),
+				'file_exceeds_size_limit' => sprintf(__('This file is too big. Your php.ini upload_max_filesize is %s.'), ini_get('upload_max_filesize')),
+				'zero_byte_file' => __('This file is empty. Please try another.'),
+				'invalid_filetype' => __('This file type is not allowed. Please try another.'),
+				'default_error' => __('An error occurred in the upload. Please try again later.'),
+				'missing_upload_url' => __('There was a configuration error. Please contact the server administrator.'),
+				'upload_limit_exceeded' => __('You may only upload 1 file.'),
+				'http_error' => __('HTTP error.'),
+				'upload_failed' => __('Upload failed.'),
+				'io_error' => __('IO error.'),
+				'security_error' => __('Security error.'),
+				'file_cancelled' => __('File cancelled.'),
+				'upload_stopped' => __('Upload stopped.'),
+				'dismiss' => __('Dismiss'),
+				'crunching' => __('Crunching&hellip;'),
+				'deleted' => __('Deleted'),
+		) );
+
+		$this->add( 'jquery-ui-tabs', '/wp-includes/js/jquery/ui.tabs.js', array('jquery'), '3' );
+
 		if ( is_admin() ) {
-			global $pagenow;
-			$man = false;
-			switch ( $pagenow ) :
-			case 'post.php' :
-			case 'post-new.php' :
-				$man = 'postmeta';
-				break;
-			case 'page.php' :
-			case 'page-new.php' :
-				$man = 'pagemeta';
-				break;
-			case 'link-add.php' :
-			case 'link.php' :
-				$man = 'linkmeta';
-				break;
-			endswitch;
-			if ( $man ) {
-				$this->add( 'dbx-admin-key', '/wp-admin/dbx-admin-key.js', array('dbx'), '20070417' );
-				$this->localize( 'dbx-admin-key', 'dbxL10n', array(
-					'manager' => $man,
-					'open' => __('open'),
-					'close' => __('close'),
-					'moveMouse' => __('click-down and drag to move this box'),
-					'toggleMouse' => __('click to %toggle% this box'),
-					'moveKey' => __('use the arrow keys to move this box'),
-					'toggleKey' => __(', or press the enter key to %toggle% it'),
-				) );
-			}
-			$this->add( 'ajaxcat', '/wp-admin/cat.js', array('listman'), '20070417' );
+			$this->add( 'ajaxcat', '/wp-admin/js/cat.js', array( 'wp-lists' ), '20071101' );
 			$this->localize( 'ajaxcat', 'catL10n', array(
 				'add' => attribute_escape(__('Add')),
 				'how' => __('Separate multiple categories with commas.')
 			) );
-			$this->add( 'admin-categories', '/wp-admin/categories.js', array('listman'), '3684' );
-			$this->add( 'admin-custom-fields', '/wp-admin/custom-fields.js', array('listman'), '3733' );
-			$this->add( 'admin-comments', '/wp-admin/edit-comments.js', array('listman'), '20070327' );
-			$this->add( 'admin-users', '/wp-admin/users.js', array('listman'), '4583' );
-			$this->add( 'xfn', '/wp-admin/xfn.js', false, '3517' );
-			$this->add( 'upload', '/wp-admin/upload.js', array('prototype'), '20070306' );
+			$this->add( 'admin-categories', '/wp-admin/js/categories.js', array('wp-lists'), '20071031' );
+			$this->add( 'admin-tags', '/wp-admin/js/tags.js', array('wp-lists'), '20071031' );
+			$this->add( 'admin-custom-fields', '/wp-admin/js/custom-fields.js', array('wp-lists'), '20070823' );
+			$this->add( 'password-strength-meter', '/wp-admin/js/password-strength-meter.js', array('jquery'), '20070405' );
+			$this->localize( 'password-strength-meter', 'pwsL10n', array(
+				'short' => __('Too short'),
+				'bad' => __('Bad'),
+				'good' => __('Good'),
+				'strong' => __('Strong')
+			) );
+			$this->add( 'admin-comments', '/wp-admin/js/edit-comments.js', array('wp-lists'), '20080311' );
+			$this->localize( 'admin-comments', 'adminCommentsL10n', array(
+				'pending' => __('%i% pending') // must look like: "# blah blah"
+			) );
+			$this->add( 'admin-users', '/wp-admin/js/users.js', array('wp-lists'), '20070823' );
+			$this->add( 'admin-forms', '/wp-admin/js/forms.js', false, '20080317' );
+			$this->add( 'xfn', '/wp-admin/js/xfn.js', false, '3517' );
+			$this->add( 'upload', '/wp-admin/js/upload.js', array('jquery'), '20070518' );
+			$this->add( 'postbox', '/wp-admin/js/postbox.js', array('jquery'), '20080128' );
+			$this->localize( 'postbox', 'postboxL10n', array(
+				'requestFile' => get_option( 'siteurl' ) . '/wp-admin/admin-ajax.php',
+			) );
+			$this->add( 'slug', '/wp-admin/js/slug.js', array('jquery'), '20080208' );
+			$this->localize( 'slug', 'slugL10n', array(
+				'requestFile' => get_option( 'siteurl' ) . '/wp-admin/admin-ajax.php',
+				'save' => __('Save'),
+				'cancel' => __('Cancel'),
+			) );
+			$this->add( 'post', '/wp-admin/js/post.js', array('suggest', 'jquery-ui-tabs', 'wp-lists', 'postbox', 'slug'), '20080322' );
+			$this->localize( 'post', 'postL10n', array(
+				'tagsUsed' =>  __('Tags used on this post:'),
+				'add' => attribute_escape(__('Add')),
+				'addTag' => attribute_escape(__('Add new tag')),
+				'separate' => __('Separate tags with commas'),
+				'cancel' => __('Cancel'),
+				'edit' => __('Edit'),
+			) );
+			$this->add( 'page', '/wp-admin/js/page.js', array('jquery', 'slug', 'postbox'), '20080318' );
+			$this->localize( 'page', 'postL10n', array(
+				'cancel' => __('Cancel'),
+				'edit' => __('Edit'),
+			) );
+			$this->add( 'link', '/wp-admin/js/link.js', array('jquery-ui-tabs', 'wp-lists', 'postbox'), '20080131' );
+			$this->add( 'comment', '/wp-admin/js/comment.js', array('postbox'), '20080219' );
+			$this->localize( 'comment', 'commentL10n', array(
+					'cancel' => __('Cancel'),
+					'edit' => __('Edit'),
+				) );
+			$this->add( 'media-upload', '/wp-admin/js/media-upload.js', false, '20080109' );
 			$this->localize( 'upload', 'uploadL10n', array(
 				'browseTitle' => attribute_escape(__('Browse your files')),
 				'back' => __('&laquo; Back'),
@@ -122,6 +187,13 @@
 				'saveText' => attribute_escape(__('Save &raquo;')),
 				'confirmText' => __("Are you sure you want to delete the file '%title%'?\nClick ok to delete or cancel to go back.")
 			) );
+			$this->add( 'admin-widgets', '/wp-admin/js/widgets.js', array( 'interface' ), '20080319' );
+			$this->localize( 'admin-widgets', 'widgetsL10n', array(
+				'add' => __('Add'),
+				'edit' => __('Edit'),
+				'cancel' => __('Cancel'),
+			));
+			$this->add( 'editor', '/wp-admin/js/editor.js', array('tiny_mce'), '20080221' );
 		}
 	}
 
@@ -134,27 +206,15 @@
 	 * @return array Scripts that have been printed
 	 */
 	function print_scripts( $handles = false ) {
+		global $wp_db_version;
+
 		// Print the queue if nothing is passed.  If a string is passed, print that script.  If an array is passed, print those scripts.
 		$handles = false === $handles ? $this->queue : (array) $handles;
-		$handles = $this->all_deps( $handles );
-		$this->_print_scripts( $handles );
-		return $this->printed;
-	}
+		$this->all_deps( $handles );
 
-	/**
-	 * Internally used helper function for printing script tags
-	 *
-	 * @param array handles Hierarchical array of scripts to be printed
-	 * @see WP_Scripts::all_deps()
-	 */
-	function _print_scripts( $handles ) {
-		global $wp_db_version;
+		$to_print = apply_filters( 'print_scripts_array', array_keys($this->to_print) );
 
-		foreach( array_keys($handles) as $handle ) {
-			if ( !$handles[$handle] )
-				return;
-			elseif ( is_array($handles[$handle]) )
-				$this->_print_scripts( $handles[$handle] );
+		foreach( $to_print as $handle ) {
 			if ( !in_array($handle, $this->printed) && isset($this->scripts[$handle]) ) {
 				if ( $this->scripts[$handle]->src ) { // Else it defines a group.
 					$ver = $this->scripts[$handle]->ver ? $this->scripts[$handle]->ver : $wp_db_version;
@@ -162,19 +222,22 @@
 						$ver .= '&amp;' . $this->args[$handle];
 					$src = 0 === strpos($this->scripts[$handle]->src, 'http://') ? $this->scripts[$handle]->src : get_option( 'siteurl' ) . $this->scripts[$handle]->src;
 					$src = $this->scripts[$handle]->src;
-					
+
 					if (!preg_match('|^https?://|', $src)) {
 						$src = get_option('siteurl') . $src;
 					}
-					
+
 					$src = add_query_arg('ver', $ver, $src);
 					$src = clean_url(apply_filters( 'script_loader_src', $src ));
-					echo "<script type='text/javascript' src='$src'></script>\n";
 					$this->print_scripts_l10n( $handle );
+					echo "<script type='text/javascript' src='$src'></script>\n";
 				}
 				$this->printed[] = $handle;
 			}
 		}
+
+		$this->to_print = array();
+		return $this->printed;
 	}
 
 	function print_scripts_l10n( $handle ) {
@@ -199,33 +262,43 @@
 	/**
 	 * Determines dependencies of scripts
 	 *
-	 * Recursively builds hierarchical array of script dependencies.  Does NOT catch infinite loops.
+	 * Recursively builds array of scripts to print taking dependencies into account.  Does NOT catch infinite loops.
 	 *
 	 * @param mixed handles Accepts (string) script name or (array of strings) script names
 	 * @param bool recursion Used internally when function calls itself
-	 * @return array Hierarchical array of dependencies
 	 */
 	function all_deps( $handles, $recursion = false ) {
-		if ( ! $handles = (array) $handles )
-			return array();
-		$return = array();
+		if ( !$handles = (array) $handles )
+			return false;
+
 		foreach ( $handles as $handle ) {
 			$handle = explode('?', $handle);
 			if ( isset($handle[1]) )
 				$this->args[$handle[0]] = $handle[1];
 			$handle = $handle[0];
-			if ( is_null($return[$handle]) ) // Prime the return array with $handles
-				$return[$handle] = true;
-			if ( $this->scripts[$handle]->deps ) {
-				if ( false !== $return[$handle] && array_diff($this->scripts[$handle]->deps, array_keys($this->scripts)) )
-					$return[$handle] = false; // Script required deps which don't exist
+
+			if ( isset($this->to_print[$handle]) ) // Already grobbed it and its deps
+				continue;
+
+			$keep_going = true;
+			if ( !isset($this->scripts[$handle]) )
+				$keep_going = false; // Script doesn't exist
+			elseif ( $this->scripts[$handle]->deps && array_diff($this->scripts[$handle]->deps, array_keys($this->scripts)) )
+				$keep_going = false; // Script requires deps which don't exist (not a necessary check.  efficiency?)
+			elseif ( $this->scripts[$handle]->deps && !$this->all_deps( $this->scripts[$handle]->deps, true ) )
+				$keep_going = false; // Script requires deps which don't exist
+
+			if ( !$keep_going ) { // Either script or its deps don't exist.
+				if ( $recursion )
+					return false; // Abort this branch.
 				else
-					$return[$handle] = $this->all_deps( $this->scripts[$handle]->deps, true ); // Build the hierarchy
+					continue; // We're at the top level.  Move on to the next one.
 			}
-			if ( $recursion && false === $return[$handle] )
-				return false; // Cut the branch
+
+			$this->to_print[$handle] = true;
 		}
-		return $return;
+
+		return true;
 	}
 
 	/**
@@ -399,4 +472,37 @@
 	}
 	$wp_scripts->enqueue( $handle );
 }
+
+function wp_prototype_before_jquery( $js_array ) {
+	if ( false === $jquery = array_search( 'jquery', $js_array ) )
+		return $js_array;
+
+	if ( false === $prototype = array_search( 'prototype', $js_array ) )
+		return $js_array;
+
+	if ( $prototype < $jquery )
+		return $js_array;
+
+	unset($js_array[$prototype]);
+
+	array_splice( $js_array, $jquery, 0, 'prototype' );
+
+	return $js_array;
+}
+
+// These localizations require information that may not be loaded even by init
+function wp_just_in_time_script_localization() {
+	wp_localize_script( 'tiny_mce', 'wpTinyMCEConfig', array( 'defaultEditor' => wp_default_editor() ) );
+	wp_localize_script( 'autosave', 'autosaveL10n', array(
+		'autosaveInterval' => AUTOSAVE_INTERVAL,
+		'previewPageText' => __('Preview this Page'),
+		'previewPostText' => __('Preview this Post'),
+		'requestFile' => get_option( 'siteurl' ) . '/wp-admin/admin-ajax.php',
+		'savingText' => __('Saving Draft&#8230;')
+	) );
+}
+
+add_filter( 'wp_print_scripts', 'wp_just_in_time_script_localization' );
+add_filter( 'print_scripts_array', 'wp_prototype_before_jquery' );
+
 ?>
diff -x .svn -aruN 2.2.2.src/wp-includes/shortcodes.php 2.5.src/wp-includes/shortcodes.php
--- 2.2.2.src/wp-includes/shortcodes.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/shortcodes.php	2008-03-28 10:23:09.000000000 -0500
@@ -0,0 +1,134 @@
+<?php
+
+/*
+
+An API for creating shortcode tags that support attributes and enclosed content, such as:
+
+[shortcode /]
+[shortcode foo="bar" baz="bing" /]
+[shortcode foo="bar"]content[/shortcode]
+
+tag and attrbute parsing regexp code based on the Textpattern tag parser.
+
+To apply shortcode tags to content:
+
+$out = do_shortcode($content);
+
+Simplest example of a shortcode tag using the API:
+
+// [footag foo="bar"]
+function footag_func($atts) {
+	return "foo = {$atts[foo]}";
+}
+add_shortcode('footag', 'footag_func');
+
+Example with nice attribute defaults:
+
+// [bartag foo="bar"]
+function bartag_func($atts) {
+	extract(shortcode_atts(array(
+		'foo' => 'no foo',
+		'baz' => 'default baz',
+	), $atts));
+
+	return "foo = {$foo}";
+}
+add_shortcode('bartag', 'bartag_func');
+
+Example with enclosed content:
+
+// [baztag]content[/baztag]
+function baztag_func($atts, $content='') {
+	return "content = $content";
+}
+add_shortcode('baztag', 'baztag_func');
+
+*/
+
+$shortcode_tags = array();
+
+function add_shortcode($tag, $func) {
+	global $shortcode_tags;
+
+	if ( is_callable($func) )
+		$shortcode_tags[$tag] = $func;
+}
+
+function remove_shortcode($tag) {
+	global $shortcode_tags;
+
+	unset($shortcode_tags[$tag]);
+}
+
+function remove_all_shortcodes() {
+	global $shortcode_tags;
+
+	$shortcode_tags = array();
+}
+
+function do_shortcode($content) {
+	global $shortcode_tags;
+
+	if (empty($shortcode_tags) || !is_array($shortcode_tags))
+		return $content;
+
+	$tagnames = array_keys($shortcode_tags);
+	$tagregexp = join( '|', array_map('preg_quote', $tagnames) );
+
+	$pattern = '/\[('.$tagregexp.')\b(.*?)(?:(\/))?\](?:(.+?)\[\/\1\])?/s';
+
+	return preg_replace_callback($pattern, 'do_shortcode_tag', $content);
+}
+
+function do_shortcode_tag($m) {
+	global $shortcode_tags;
+
+	$tag = $m[1];
+	$attr = shortcode_parse_atts($m[2]);
+
+	if ( isset($m[4]) ) {
+		// enclosing tag - extra parameter
+		return call_user_func($shortcode_tags[$tag], $attr, $m[4]);
+	} else {
+		// self-closing tag
+		return call_user_func($shortcode_tags[$tag], $attr);
+	}
+}
+
+function shortcode_parse_atts($text) {
+	$atts = array();
+	$pattern = '/(\w+)\s*=\s*"([^"]*)"(?:\s|$)|(\w+)\s*=\s*\'([^\']*)\'(?:\s|$)|(\w+)\s*=\s*([^\s\'"]+)(?:\s|$)|"([^"]*)"(?:\s|$)|(\S+)(?:\s|$)/';
+	if ( preg_match_all($pattern, $text, $match, PREG_SET_ORDER) ) {
+		foreach ($match as $m) {
+			if (!empty($m[1]))
+				$atts[strtolower($m[1])] = stripcslashes($m[2]);
+			elseif (!empty($m[3]))
+				$atts[strtolower($m[3])] = stripcslashes($m[4]);
+			elseif (!empty($m[5]))
+				$atts[strtolower($m[5])] = stripcslashes($m[6]);
+			elseif (isset($m[7]) and strlen($m[7]))
+				$atts[] = stripcslashes($m[7]);
+			elseif (isset($m[8]))
+				$atts[] = stripcslashes($m[8]);
+		}
+	} else {
+		$atts = ltrim($text);
+	}
+	return $atts;
+}
+
+function shortcode_atts($pairs, $atts) {
+	$atts = (array)$atts;
+	$out = array();
+	foreach($pairs as $name => $default) {
+		if ( array_key_exists($name, $atts) )
+			$out[$name] = $atts[$name];
+		else
+			$out[$name] = $default;
+	}
+	return $out;
+}
+
+add_filter( 'the_content', 'do_shortcode', 9 );
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-includes/streams.php 2.5.src/wp-includes/streams.php
--- 2.2.2.src/wp-includes/streams.php	2006-07-06 17:35:59.000000000 -0500
+++ 2.5.src/wp-includes/streams.php	2008-02-05 00:47:27.000000000 -0600
@@ -1,5 +1,11 @@
 <?php
-/*
+/**
+ * PHP-Gettext External Library: StreamReader classes
+ *
+ * @package External
+ * @subpackage PHP-gettext
+ *
+ * @internal
    Copyright (c) 2003, 2005 Danilo Segan <danilo@kvota.net>.
 
    This file is part of PHP-gettext.
@@ -18,7 +24,7 @@
    along with PHP-gettext; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
-*/
+ */
 
 
 // Simple class to wrap file streams, string streams, etc.
@@ -28,17 +34,17 @@
   function read($bytes) {
     return false;
   }
-  
+
   // should return new position
   function seekto($position) {
     return false;
   }
-  
+
   // returns current position
   function currentpos() {
     return false;
   }
-  
+
   // returns length of entire stream (limit for seekto()s)
   function length() {
     return false;
@@ -114,7 +120,7 @@
         $bytes -= strlen($chunk);
       }
       $this->_pos = ftell($this->_fd);
-      
+
       return $data;
     } else return '';
   }
@@ -139,7 +145,7 @@
 
 }
 
-// Preloads entire file in memory first, then creates a StringReader 
+// Preloads entire file in memory first, then creates a StringReader
 // over it (it assumes knowledge of StringReader internals)
 class CachedFileReader extends StringReader {
   function CachedFileReader($filename) {
diff -x .svn -aruN 2.2.2.src/wp-includes/taxonomy.php 2.5.src/wp-includes/taxonomy.php
--- 2.2.2.src/wp-includes/taxonomy.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/taxonomy.php	2008-03-27 01:30:20.000000000 -0500
@@ -0,0 +1,2034 @@
+<?php
+/**
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ */
+
+//
+// Taxonomy Registration
+//
+
+/**
+ * Default Taxonomy Objects
+ * @since 2.3
+ * @global array $wp_taxonomies
+ */
+$wp_taxonomies = array();
+$wp_taxonomies['category'] = (object) array('name' => 'category', 'object_type' => 'post', 'hierarchical' => true, 'update_count_callback' => '_update_post_term_count');
+$wp_taxonomies['post_tag'] = (object) array('name' => 'post_tag', 'object_type' => 'post', 'hierarchical' => false, 'update_count_callback' => '_update_post_term_count');
+$wp_taxonomies['link_category'] = (object) array('name' => 'link_category', 'object_type' => 'link', 'hierarchical' => false);
+
+/**
+ * get_object_taxonomies() - Return all of the taxonomy names that are of $object_type
+ *
+ * It appears that this function can be used to find all of the names inside of
+ * $wp_taxonomies global variable.
+ *
+ * <code><?php $taxonomies = get_object_taxonomies('post'); ?></code>
+ * Should result in <code>Array('category', 'post_tag')</code>
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ *
+ * @uses $wp_taxonomies
+ *
+ * @param array|string|object $object Name of the type of taxonomy object, or an object (row from posts)
+ * @return array The names of all taxonomy of $object_type.
+ */
+function get_object_taxonomies($object) {
+	global $wp_taxonomies;
+
+	if ( is_object($object) ) {
+		if ( $object->post_type == 'attachment' )
+			return get_attachment_taxonomies($object);
+		$object = $object->post_type;
+	}
+
+	$object = (array) $object;
+
+	$taxonomies = array();
+	foreach ( $wp_taxonomies as $taxonomy ) {
+		if ( array_intersect($object, (array) $taxonomy->object_type) )
+			$taxonomies[] = $taxonomy->name;
+	}
+
+	return $taxonomies;
+}
+
+/**
+ * get_taxonomy() - Returns the taxonomy object of $taxonomy.
+ *
+ * The get_taxonomy function will first check that the parameter string given
+ * is a taxonomy object and if it is, it will return it.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ *
+ * @uses $wp_taxonomies
+ * @uses is_taxonomy() Checks whether taxonomy exists
+ *
+ * @param string $taxonomy Name of taxonomy object to return
+ * @return object|bool The Taxonomy Object or false if $taxonomy doesn't exist
+ */
+function get_taxonomy( $taxonomy ) {
+	global $wp_taxonomies;
+
+	if ( ! is_taxonomy($taxonomy) )
+		return false;
+
+	return $wp_taxonomies[$taxonomy];
+}
+
+/**
+ * is_taxonomy() - Checks that the taxonomy name exists
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ *
+ * @uses $wp_taxonomies
+ *
+ * @param string $taxonomy Name of taxonomy object
+ * @return bool Whether the taxonomy exists or not.
+ */
+function is_taxonomy( $taxonomy ) {
+	global $wp_taxonomies;
+
+	return isset($wp_taxonomies[$taxonomy]);
+}
+
+/**
+ * is_taxonomy_hierarchical() - Whether the taxonomy object is hierarchical
+ *
+ * Checks to make sure that the taxonomy is an object first. Then Gets the object, and finally
+ * returns the hierarchical value in the object.
+ *
+ * A false return value might also mean that the taxonomy does not exist.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ *
+ * @uses is_taxonomy() Checks whether taxonomy exists
+ * @uses get_taxonomy() Used to get the taxonomy object
+ *
+ * @param string $taxonomy Name of taxonomy object
+ * @return bool Whether the taxonomy is hierarchical
+ */
+function is_taxonomy_hierarchical($taxonomy) {
+	if ( ! is_taxonomy($taxonomy) )
+		return false;
+
+	$taxonomy = get_taxonomy($taxonomy);
+	return $taxonomy->hierarchical;
+}
+
+/**
+ * register_taxonomy() - Create or modify a taxonomy object. Do not use before init.
+ *
+ * A simple function for creating or modifying a taxonomy object based on the parameters given.
+ * The function will accept an array (third optional parameter), along with strings for the
+ * taxonomy name and another string for the object type.
+ *
+ * Nothing is returned, so expect error maybe or use is_taxonomy() to check whether taxonomy exists.
+ *
+ * Optional $args contents:
+ * hierarachical - has some defined purpose at other parts of the API and is a boolean value.
+ * update_count_callback - works much like a hook, in that it will be called when the count is updated.
+ * rewrite - false to prevent rewrite, or array('slug'=>$slug) to customize permastruct; default will use $taxonomy as slug
+ * query_var - false to prevent queries, or string to customize query var (?$query_var=$term); default will use $taxonomy as query var
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ * @uses $wp_taxonomies Inserts new taxonomy object into the list
+ * @uses $wp_rewrite Adds rewrite tags and permastructs
+ * @uses $wp Adds query vars
+ *
+ * @param string $taxonomy Name of taxonomy object
+ * @param array|string $object_type Name of the object type for the taxonomy object.
+ * @param array|string $args See above description for the two keys values.
+ */
+function register_taxonomy( $taxonomy, $object_type, $args = array() ) {
+	global $wp_taxonomies, $wp_rewrite, $wp;
+
+	$defaults = array('hierarchical' => false, 'update_count_callback' => '', 'rewrite' => true, 'query_var' => true);
+	$args = wp_parse_args($args, $defaults);
+
+	if ( false !== $args['query_var'] && !empty($wp) ) {
+		if ( empty($args['query_var']) )
+			$args['query_var'] = $taxonomy;
+		$args['query_var'] = sanitize_title_with_dashes($args['query_var']);
+		$wp->add_query_var($args['query_var']);
+	}
+
+	if ( false !== $args['rewrite'] && !empty($wp_rewrite) ) {
+		if ( !is_array($args['rewrite']) )
+			$args['rewrite'] = array();
+		if ( !isset($args['rewrite']['slug']) )
+			$args['rewrite']['slug'] = sanitize_title_with_dashes($taxonomy);
+		$wp_rewrite->add_rewrite_tag("%$taxonomy%", '([^/]+)', $args['query_var'] ? "{$args['query_var']}=" : "taxonomy=$taxonomy&term=$term");
+		$wp_rewrite->add_permastruct($taxonomy, "{$args['rewrite']['slug']}/%$taxonomy%");
+	}
+
+	$args['name'] = $taxonomy;
+	$args['object_type'] = $object_type;
+	$wp_taxonomies[$taxonomy] = (object) $args;
+}
+
+//
+// Term API
+//
+
+/**
+ * get_objects_in_term() - Return object_ids of valid taxonomy and term
+ *
+ * The strings of $taxonomies must exist before this function will continue. On failure of finding
+ * a valid taxonomy, it will return an WP_Error class, kind of like Exceptions in PHP 5, except you
+ * can't catch them. Even so, you can still test for the WP_Error class and get the error message.
+ *
+ * The $terms aren't checked the same as $taxonomies, but still need to exist for $object_ids to
+ * be returned.
+ *
+ * It is possible to change the order that object_ids is returned by either using PHP sort family
+ * functions or using the database by using $args with either ASC or DESC array. The value should
+ * be in the key named 'order'.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ *
+ * @uses $wpdb
+ * @uses wp_parse_args() Creates an array from string $args.
+ *
+ * @param string|array $terms String of term or array of string values of terms that will be used
+ * @param string|array $taxonomies String of taxonomy name or Array of string values of taxonomy names
+ * @param array|string $args Change the order of the object_ids, either ASC or DESC
+ * @return WP_Error|array If the taxonomy does not exist, then WP_Error will be returned. On success
+ *	the array can be empty meaning that there are no $object_ids found or it will return the $object_ids found.
+ */
+function get_objects_in_term( $terms, $taxonomies, $args = array() ) {
+	global $wpdb;
+
+	if ( !is_array( $terms) )
+		$terms = array($terms);
+
+	if ( !is_array($taxonomies) )
+		$taxonomies = array($taxonomies);
+
+	foreach ( $taxonomies as $taxonomy ) {
+		if ( ! is_taxonomy($taxonomy) )
+			return new WP_Error('invalid_taxonomy', __('Invalid Taxonomy'));
+	}
+
+	$defaults = array('order' => 'ASC');
+	$args = wp_parse_args( $args, $defaults );
+	extract($args, EXTR_SKIP);
+
+	$order = ( 'desc' == strtolower($order) ) ? 'DESC' : 'ASC';
+
+	$terms = array_map('intval', $terms);
+
+	$taxonomies = "'" . implode("', '", $taxonomies) . "'";
+	$terms = "'" . implode("', '", $terms) . "'";
+
+	$object_ids = $wpdb->get_col("SELECT tr.object_id FROM $wpdb->term_relationships AS tr INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ($taxonomies) AND tt.term_id IN ($terms) ORDER BY tr.object_id $order");
+
+	if ( ! $object_ids )
+		return array();
+
+	return $object_ids;
+}
+
+/**
+ * get_term() - Get all Term data from database by Term ID.
+ *
+ * The usage of the get_term function is to apply filters to a term object.
+ * It is possible to get a term object from the database before applying the
+ * filters.
+ *
+ * $term ID must be part of $taxonomy, to get from the database. Failure, might be
+ * able to be captured by the hooks. Failure would be the same value as $wpdb returns for the
+ * get_row method.
+ *
+ * There are two hooks, one is specifically for each term, named 'get_term', and the second is
+ * for the taxonomy name, 'term_$taxonomy'. Both hooks gets the term object, and the taxonomy
+ * name as parameters. Both hooks are expected to return a Term object.
+ *
+ * 'get_term' hook - Takes two parameters the term Object and the taxonomy name. Must return
+ * term object. Used in get_term() as a catch-all filter for every $term.
+ *
+ * 'get_$taxonomy' hook - Takes two parameters the term Object and the taxonomy name. Must return
+ * term object. $taxonomy will be the taxonomy name, so for example, if 'category', it would be
+ * 'get_category' as the filter name. Useful for custom taxonomies or plugging into default taxonomies.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ *
+ * @uses $wpdb
+ * @uses sanitize_term() Cleanses the term based on $filter context before returning.
+ * @see sanitize_term_field() The $context param lists the available values for get_term_by() $filter param.
+ *
+ * @param int|object $term If integer, will get from database. If object will apply filters and return $term.
+ * @param string $taxonomy Taxonomy name that $term is part of.
+ * @param string $output Constant OBJECT, ARRAY_A, or ARRAY_N
+ * @param string $filter Optional, default is raw or no WordPress defined filter will applied.
+ * @return mixed|null|WP_Error Term Row from database. Will return null if $term is empty. If taxonomy does not
+ * exist then WP_Error will be returned.
+ */
+function &get_term($term, $taxonomy, $output = OBJECT, $filter = 'raw') {
+	global $wpdb;
+
+	if ( empty($term) )
+		return null;
+
+	if ( ! is_taxonomy($taxonomy) )
+		return new WP_Error('invalid_taxonomy', __('Invalid Taxonomy'));
+
+	if ( is_object($term) ) {
+		wp_cache_add($term->term_id, $term, $taxonomy);
+		$_term = $term;
+	} else {
+		$term = (int) $term;
+		if ( ! $_term = wp_cache_get($term, $taxonomy) ) {
+			$_term = $wpdb->get_row( $wpdb->prepare( "SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy = %s AND t.term_id = %s LIMIT 1", $taxonomy, $term) );
+			wp_cache_add($term, $_term, $taxonomy);
+		}
+	}
+
+	$_term = apply_filters('get_term', $_term, $taxonomy);
+	$_term = apply_filters("get_$taxonomy", $_term, $taxonomy);
+	$_term = sanitize_term($_term, $taxonomy, $filter);
+
+	if ( $output == OBJECT ) {
+		return $_term;
+	} elseif ( $output == ARRAY_A ) {
+		return get_object_vars($_term);
+	} elseif ( $output == ARRAY_N ) {
+		return array_values(get_object_vars($_term));
+	} else {
+		return $_term;
+	}
+}
+
+/**
+ * get_term_by() - Get all Term data from database by Term field and data.
+ *
+ * Warning: $value is not escaped for 'name' $field. You must do it yourself, if required.
+ *
+ * The default $field is 'id', therefore it is possible to also use null for field, but not
+ * recommended that you do so.
+ *
+ * If $value does not exist, the return value will be false. If $taxonomy exists and $field
+ * and $value combinations exist, the Term will be returned.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ *
+ * @uses $wpdb
+ * @uses sanitize_term() Cleanses the term based on $filter context before returning.
+ * @see sanitize_term_field() The $context param lists the available values for get_term_by() $filter param.
+ *
+ * @param string $field Either 'slug', 'name', or 'id'
+ * @param string|int $value Search for this term value
+ * @param string $taxonomy Taxonomy Name
+ * @param string $output Constant OBJECT, ARRAY_A, or ARRAY_N
+ * @param string $filter Optional, default is raw or no WordPress defined filter will applied.
+ * @return mixed Term Row from database. Will return false if $taxonomy does not exist or $term was not found.
+ */
+function get_term_by($field, $value, $taxonomy, $output = OBJECT, $filter = 'raw') {
+	global $wpdb;
+
+	if ( ! is_taxonomy($taxonomy) )
+		return false;
+
+	if ( 'slug' == $field ) {
+		$field = 't.slug';
+		$value = sanitize_title($value);
+		if ( empty($value) )
+			return false;
+	} else if ( 'name' == $field ) {
+		// Assume already escaped
+		$field = 't.name';
+	} else {
+		$field = 't.term_id';
+		$value = (int) $value;
+	}
+
+	$term = $wpdb->get_row( $wpdb->prepare( "SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy = %s AND $field = %s LIMIT 1", $taxonomy, $value) );
+	if ( !$term )
+		return false;
+
+	wp_cache_add($term->term_id, $term, $taxonomy);
+
+	$term = sanitize_term($term, $taxonomy, $filter);
+
+	if ( $output == OBJECT ) {
+		return $term;
+	} elseif ( $output == ARRAY_A ) {
+		return get_object_vars($term);
+	} elseif ( $output == ARRAY_N ) {
+		return array_values(get_object_vars($term));
+	} else {
+		return $term;
+	}
+}
+
+/**
+ * get_term_children() - Merge all term children into a single array.
+ *
+ * This recursive function will merge all of the children of $term into
+ * the same array. Only useful for taxonomies which are hierarchical.
+ *
+ * Will return an empty array if $term does not exist in $taxonomy.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ *
+ * @uses $wpdb
+ * @uses _get_term_hierarchy()
+ * @uses get_term_children() Used to get the children of both $taxonomy and the parent $term
+ *
+ * @param string $term Name of Term to get children
+ * @param string $taxonomy Taxonomy Name
+ * @return array|WP_Error List of Term Objects. WP_Error returned if $taxonomy does not exist
+ */
+function get_term_children( $term, $taxonomy ) {
+	if ( ! is_taxonomy($taxonomy) )
+		return new WP_Error('invalid_taxonomy', __('Invalid Taxonomy'));
+
+	$terms = _get_term_hierarchy($taxonomy);
+
+	if ( ! isset($terms[$term]) )
+		return array();
+
+	$children = $terms[$term];
+
+	foreach ( $terms[$term] as $child ) {
+		if ( isset($terms[$child]) )
+			$children = array_merge($children, get_term_children($child, $taxonomy));
+	}
+
+	return $children;
+}
+
+/**
+ * get_term_field() - Get sanitized Term field
+ *
+ * Does checks for $term, based on the $taxonomy. The function is for
+ * contextual reasons and for simplicity of usage. See sanitize_term_field() for
+ * more information.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ *
+ * @uses sanitize_term_field() Passes the return value in sanitize_term_field on success.
+ *
+ * @param string $field Term field to fetch
+ * @param int $term Term ID
+ * @param string $taxonomy Taxonomy Name
+ * @param string $context Optional, default is display. Look at sanitize_term_field() for available options.
+ * @return mixed Will return an empty string if $term is not an object or if $field is not set in $term.
+ */
+function get_term_field( $field, $term, $taxonomy, $context = 'display' ) {
+	$term = (int) $term;
+	$term = get_term( $term, $taxonomy );
+	if ( is_wp_error($term) )
+		return $term;
+
+	if ( !is_object($term) )
+		return '';
+
+	if ( !isset($term->$field) )
+		return '';
+
+	return sanitize_term_field($field, $term->$field, $term->term_id, $taxonomy, $context);
+}
+
+/**
+ * get_term_to_edit() - Sanitizes Term for editing
+ *
+ * Return value is sanitize_term() and usage is for sanitizing the term
+ * for editing. Function is for contextual and simplicity.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ *
+ * @uses sanitize_term() Passes the return value on success
+ *
+ * @param int|object $id Term ID or Object
+ * @param string $taxonomy Taxonomy Name
+ * @return mixed|null|WP_Error Will return empty string if $term is not an object.
+ */
+function get_term_to_edit( $id, $taxonomy ) {
+	$term = get_term( $id, $taxonomy );
+
+	if ( is_wp_error($term) )
+		return $term;
+
+	if ( !is_object($term) )
+		return '';
+
+	return sanitize_term($term, $taxonomy, 'edit');
+}
+
+/**
+ * get_terms() - Retrieve the terms in taxonomy or list of taxonomies.
+ *
+ * You can fully inject any customizations to the query before it is sent, as well as control
+ * the output with a filter.
+ *
+ * The 'get_terms' filter will be called when the cache has the term and will pass the found
+ * term along with the array of $taxonomies and array of $args. This filter is also called
+ * before the array of terms is passed and will pass the array of terms, along with the $taxonomies
+ * and $args.
+ *
+ * The 'list_terms_exclusions' filter passes the compiled exclusions along with the $args.
+ *
+ * The list that $args can contain, which will overwrite the defaults.
+ * orderby - Default is 'name'. Can be name, count, or nothing (will use term_id).
+ * order - Default is ASC. Can use DESC.
+ * hide_empty - Default is true. Will not return empty $terms.
+ * fields - Default is all.
+ * slug - Any terms that has this value. Default is empty string.
+ * hierarchical - Whether to return hierarchical taxonomy. Default is true.
+ * name__like - Default is empty string.
+ *
+ * The argument 'pad_counts' will count all of the children along with the $terms.
+ *
+ * The 'get' argument allows for overwriting 'hide_empty' and 'child_of', which can be done by
+ * setting the value to 'all', instead of its default empty string value.
+ *
+ * The 'child_of' argument will be used if you use multiple taxonomy or the first $taxonomy
+ * isn't hierarchical or 'parent' isn't used. The default is 0, which will be translated to
+ * a false value. If 'child_of' is set, then 'child_of' value will be tested against
+ * $taxonomy to see if 'child_of' is contained within. Will return an empty array if test
+ * fails.
+ *
+ * If 'parent' is set, then it will be used to test against the first taxonomy. Much like
+ * 'child_of'. Will return an empty array if the test fails.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ *
+ * @uses $wpdb
+ * @uses wp_parse_args() Merges the defaults with those defined by $args and allows for strings.
+ *
+ *
+ * @param string|array Taxonomy name or list of Taxonomy names
+ * @param string|array $args The values of what to search for when returning terms
+ * @return array|WP_Error List of Term Objects and their children. Will return WP_Error, if any of $taxonomies do not exist.
+ */
+function &get_terms($taxonomies, $args = '') {
+	global $wpdb;
+	$empty_array = array();
+
+	$single_taxonomy = false;
+	if ( !is_array($taxonomies) ) {
+		$single_taxonomy = true;
+		$taxonomies = array($taxonomies);
+	}
+
+	foreach ( $taxonomies as $taxonomy ) {
+		if ( ! is_taxonomy($taxonomy) )
+			return new WP_Error('invalid_taxonomy', __('Invalid Taxonomy'));
+	}
+
+	$in_taxonomies = "'" . implode("', '", $taxonomies) . "'";
+
+	$defaults = array('orderby' => 'name', 'order' => 'ASC',
+		'hide_empty' => true, 'exclude' => '', 'include' => '',
+		'number' => '', 'fields' => 'all', 'slug' => '', 'parent' => '',
+		'hierarchical' => true, 'child_of' => 0, 'get' => '', 'name__like' => '',
+		'pad_counts' => false, 'offset' => '', 'search' => '');
+	$args = wp_parse_args( $args, $defaults );
+	$args['number'] = absint( $args['number'] );
+	$args['offset'] = absint( $args['offset'] );
+	if ( !$single_taxonomy || !is_taxonomy_hierarchical($taxonomies[0]) ||
+		'' != $args['parent'] ) {
+		$args['child_of'] = 0;
+		$args['hierarchical'] = false;
+		$args['pad_counts'] = false;
+	}
+
+	if ( 'all' == $args['get'] ) {
+		$args['child_of'] = 0;
+		$args['hide_empty'] = 0;
+		$args['hierarchical'] = false;
+		$args['pad_counts'] = false;
+	}
+	extract($args, EXTR_SKIP);
+
+	if ( $child_of ) {
+		$hierarchy = _get_term_hierarchy($taxonomies[0]);
+		if ( !isset($hierarchy[$child_of]) )
+			return $empty_array;
+	}
+
+	if ( $parent ) {
+		$hierarchy = _get_term_hierarchy($taxonomies[0]);
+		if ( !isset($hierarchy[$parent]) )
+			return $empty_array;
+	}
+
+	$key = md5( serialize( $args ) . serialize( $taxonomies ) );
+	if ( $cache = wp_cache_get( 'get_terms', 'terms' ) ) {
+		if ( isset( $cache[ $key ] ) )
+			return apply_filters('get_terms', $cache[$key], $taxonomies, $args);
+	}
+
+	if ( 'count' == $orderby )
+		$orderby = 'tt.count';
+	else if ( 'name' == $orderby )
+		$orderby = 't.name';
+	else if ( 'slug' == $orderby )
+		$orderby = 't.slug';
+	else if ( 'term_group' == $orderby )
+		$orderby = 't.term_group';
+	else
+		$orderby = 't.term_id';
+
+	$where = '';
+	$inclusions = '';
+	if ( !empty($include) ) {
+		$exclude = '';
+		$interms = preg_split('/[\s,]+/',$include);
+		if ( count($interms) ) {
+			foreach ( $interms as $interm ) {
+				if (empty($inclusions))
+					$inclusions = ' AND ( t.term_id = ' . intval($interm) . ' ';
+				else
+					$inclusions .= ' OR t.term_id = ' . intval($interm) . ' ';
+			}
+		}
+	}
+
+	if ( !empty($inclusions) )
+		$inclusions .= ')';
+	$where .= $inclusions;
+
+	$exclusions = '';
+	if ( !empty($exclude) ) {
+		$exterms = preg_split('/[\s,]+/',$exclude);
+		if ( count($exterms) ) {
+			foreach ( $exterms as $exterm ) {
+				if (empty($exclusions))
+					$exclusions = ' AND ( t.term_id <> ' . intval($exterm) . ' ';
+				else
+					$exclusions .= ' AND t.term_id <> ' . intval($exterm) . ' ';
+			}
+		}
+	}
+
+	if ( !empty($exclusions) )
+		$exclusions .= ')';
+	$exclusions = apply_filters('list_terms_exclusions', $exclusions, $args );
+	$where .= $exclusions;
+
+	if ( !empty($slug) ) {
+		$slug = sanitize_title($slug);
+		$where .= " AND t.slug = '$slug'";
+	}
+
+	if ( !empty($name__like) )
+		$where .= " AND t.name LIKE '{$name__like}%'";
+
+	if ( '' != $parent ) {
+		$parent = (int) $parent;
+		$where .= " AND tt.parent = '$parent'";
+	}
+
+	if ( $hide_empty && !$hierarchical )
+		$where .= ' AND tt.count > 0';
+
+	if ( !empty($number) ) {
+		if( $offset )
+			$number = 'LIMIT ' . $offset . ',' . $number;
+		else
+			$number = 'LIMIT ' . $number;
+
+	} else
+		$number = '';
+
+	if ( !empty($search) ) {
+		$search = like_escape($search);
+		$where .= " AND (t.name LIKE '%$search%')";
+	}
+
+	$select_this = '';
+	if ( 'all' == $fields )
+		$select_this = 't.*, tt.*';
+	else if ( 'ids' == $fields )
+		$select_this = 't.term_id';
+	else if ( 'names' == $fields )
+		$select_this = 't.name';
+
+	$query = "SELECT $select_this FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy IN ($in_taxonomies) $where ORDER BY $orderby $order $number";
+
+	if ( 'all' == $fields ) {
+		$terms = $wpdb->get_results($query);
+		update_term_cache($terms);
+	} else if ( ('ids' == $fields) || ('names' == $fields) ) {
+		$terms = $wpdb->get_col($query);
+	}
+
+	if ( empty($terms) ) {
+		$cache[ $key ] = array();
+		wp_cache_set( 'get_terms', $cache, 'terms' );
+		return apply_filters('get_terms', array(), $taxonomies, $args);
+	}
+
+	if ( $child_of || $hierarchical ) {
+		$children = _get_term_hierarchy($taxonomies[0]);
+		if ( ! empty($children) )
+			$terms = & _get_term_children($child_of, $terms, $taxonomies[0]);
+	}
+
+	// Update term counts to include children.
+	if ( $pad_counts )
+		_pad_term_counts($terms, $taxonomies[0]);
+
+	// Make sure we show empty categories that have children.
+	if ( $hierarchical && $hide_empty ) {
+		foreach ( $terms as $k => $term ) {
+			if ( ! $term->count ) {
+				$children = _get_term_children($term->term_id, $terms, $taxonomies[0]);
+				foreach ( $children as $child )
+					if ( $child->count )
+						continue 2;
+
+				// It really is empty
+				unset($terms[$k]);
+			}
+		}
+	}
+	reset ( $terms );
+
+	$cache[ $key ] = $terms;
+	wp_cache_set( 'get_terms', $cache, 'terms' );
+
+	$terms = apply_filters('get_terms', $terms, $taxonomies, $args);
+	return $terms;
+}
+
+/**
+ * is_term() - Check if Term exists
+ *
+ * Returns the index of a defined term, or 0 (false) if the term doesn't exist.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ *
+ * @uses $wpdb
+ *
+ * @param int|string $term The term to check
+ * @param string $taxonomy The taxonomy name to use
+ * @return mixed Get the term id or Term Object, if exists.
+ */
+function is_term($term, $taxonomy = '') {
+	global $wpdb;
+
+	if ( is_int($term) ) {
+		if ( 0 == $term )
+			return 0;
+		$where = $wpdb->prepare( "t.term_id = %d", $term );
+	} else {
+		if ( '' === $term = sanitize_title($term) )
+			return 0;
+		$where = $wpdb->prepare( "t.slug = %s", $term );
+	}
+
+	if ( !empty($taxonomy) )
+		return $wpdb->get_row("SELECT tt.term_id, tt.term_taxonomy_id FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy as tt ON tt.term_id = t.term_id WHERE $where AND tt.taxonomy = '$taxonomy'", ARRAY_A);
+
+	return $wpdb->get_var("SELECT term_id FROM $wpdb->terms as t WHERE $where");
+}
+
+/**
+ * sanitize_term() - Sanitize Term all fields
+ *
+ * Relys on sanitize_term_field() to sanitize the term. The difference
+ * is that this function will sanitize <strong>all</strong> fields. The context
+ * is based on sanitize_term_field().
+ *
+ * The $term is expected to be either an array or an object.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ *
+ * @uses sanitize_term_field Used to sanitize all fields in a term
+ *
+ * @param array|object $term The term to check
+ * @param string $taxonomy The taxonomy name to use
+ * @param string $context Default is 'display'.
+ * @return array|object Term with all fields sanitized
+ */
+function sanitize_term($term, $taxonomy, $context = 'display') {
+
+	if ( 'raw' == $context )
+		return $term;
+
+	$fields = array('term_id', 'name', 'description', 'slug', 'count', 'parent', 'term_group');
+
+	$do_object = false;
+	if ( is_object($term) )
+		$do_object = true;
+
+	foreach ( $fields as $field ) {
+		if ( $do_object )
+			$term->$field = sanitize_term_field($field, $term->$field, $term->term_id, $taxonomy, $context);
+		else
+			$term[$field] = sanitize_term_field($field, $term[$field], $term['term_id'], $taxonomy, $context);
+	}
+
+	return $term;
+}
+
+/**
+ * sanitize_term_field() - Cleanse the field value in the term based on the context
+ *
+ * Passing a term field value through the function should be assumed to have cleansed
+ * the value for whatever context the term field is going to be used.
+ *
+ * If no context or an unsupported context is given, then default filters will be applied.
+ *
+ * There are enough filters for each context to support a custom filtering without creating
+ * your own filter function. Simply create a function that hooks into the filter you need.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ *
+ * @uses $wpdb
+ *
+ * @param string $field Term field to sanitize
+ * @param string $value Search for this term value
+ * @param int $term_id Term ID
+ * @param string $taxonomy Taxonomy Name
+ * @param string $context Either edit, db, display, attribute, or js.
+ * @return mixed sanitized field
+ */
+function sanitize_term_field($field, $value, $term_id, $taxonomy, $context) {
+	if ( 'parent' == $field  || 'term_id' == $field || 'count' == $field || 'term_group' == $field ) {
+		$value = (int) $value;
+		if ( $value < 0 )
+			$value = 0;
+	}
+
+	if ( 'raw' == $context )
+		return $value;
+
+	if ( 'edit' == $context ) {
+		$value = apply_filters("edit_term_$field", $value, $term_id, $taxonomy);
+		$value = apply_filters("edit_${taxonomy}_$field", $value, $term_id);
+		if ( 'description' == $field )
+			$value = format_to_edit($value);
+		else
+			$value = attribute_escape($value);
+	} else if ( 'db' == $context ) {
+		$value = apply_filters("pre_term_$field", $value, $taxonomy);
+		$value = apply_filters("pre_${taxonomy}_$field", $value);
+		// Back compat filters
+		if ( 'slug' == $field )
+			$value = apply_filters('pre_category_nicename', $value);
+
+	} else if ( 'rss' == $context ) {
+		$value = apply_filters("term_${field}_rss", $value, $taxonomy);
+		$value = apply_filters("${taxonomy}_${field}_rss", $value);
+	} else {
+		// Use display filters by default.
+		$value = apply_filters("term_$field", $value, $term_id, $taxonomy, $context);
+		$value = apply_filters("${taxonomy}_$field", $value, $term_id, $context);
+	}
+
+	if ( 'attribute' == $context )
+		$value = attribute_escape($value);
+	else if ( 'js' == $context )
+		$value = js_escape($value);
+
+	return $value;
+}
+
+/**
+ * wp_count_terms() - Count how many terms are in Taxonomy
+ *
+ * Default $args is 'ignore_empty' which can be <code>'ignore_empty=true'</code> or
+ * <code>array('ignore_empty' => true);</code>.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ *
+ * @uses $wpdb
+ * @uses wp_parse_args() Turns strings into arrays and merges defaults into an array.
+ *
+ * @param string $taxonomy Taxonomy name
+ * @param array|string $args Overwrite defaults
+ * @return int How many terms are in $taxonomy
+ */
+function wp_count_terms( $taxonomy, $args = array() ) {
+	global $wpdb;
+
+	$defaults = array('ignore_empty' => false);
+	$args = wp_parse_args($args, $defaults);
+	extract($args, EXTR_SKIP);
+
+	$where = '';
+	if ( $ignore_empty )
+		$where = 'AND count > 0';
+
+	$taxonomy = $wpdb->escape( $taxonomy );
+	return $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->term_taxonomy WHERE taxonomy = '$taxonomy' $where");
+}
+
+/**
+ * wp_delete_object_term_relationships() - Will unlink the term from the taxonomy
+ *
+ * Will remove the term's relationship to the taxonomy, not the term or taxonomy itself.
+ * The term and taxonomy will still exist. Will require the term's object ID to perform
+ * the operation.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ * @uses $wpdb
+ *
+ * @param int $object_id The term Object Id that refers to the term
+ * @param string|array $taxonomy List of Taxonomy Names or single Taxonomy name.
+ */
+function wp_delete_object_term_relationships( $object_id, $taxonomies ) {
+	global $wpdb;
+
+	$object_id = (int) $object_id;
+
+	if ( !is_array($taxonomies) )
+		$taxonomies = array($taxonomies);
+
+	foreach ( $taxonomies as $taxonomy ) {
+		$terms = wp_get_object_terms($object_id, $taxonomy, 'fields=tt_ids');
+		$in_terms = "'" . implode("', '", $terms) . "'";
+		$wpdb->query("DELETE FROM $wpdb->term_relationships WHERE object_id = '$object_id' AND term_taxonomy_id IN ($in_terms)");
+		wp_update_term_count($terms, $taxonomy);
+	}
+}
+
+/**
+ * wp_delete_term() - Removes a term from the database.
+ *
+ * If the term is a parent of other terms, then the children will be updated
+ * to that term's parent.
+ *
+ * The $args 'default' will only override the terms found, if there is only one
+ * term found. Any other and the found terms are used.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ *
+ * @uses $wpdb
+ * @uses do_action() Calls both 'delete_term' and 'delete_$taxonomy' action hooks,
+ *	passing term object, term id. 'delete_term' gets an additional parameter with
+ *	the $taxonomy parameter.
+ *
+ * @param int $term Term ID
+ * @param string $taxonomy Taxonomy Name
+ * @param array|string $args Optional. Change 'default' term id and override found term ids.
+ * @return bool|WP_Error Returns false if not term; true if completes delete action.
+ */
+function wp_delete_term( $term, $taxonomy, $args = array() ) {
+	global $wpdb;
+
+	$term = (int) $term;
+
+	if ( ! $ids = is_term($term, $taxonomy) )
+		return false;
+	if ( is_wp_error( $ids ) )
+		return $ids;
+
+	$tt_id = $ids['term_taxonomy_id'];
+
+	$defaults = array();
+	$args = wp_parse_args($args, $defaults);
+	extract($args, EXTR_SKIP);
+
+	if ( isset($default) ) {
+		$default = (int) $default;
+		if ( ! is_term($default, $taxonomy) )
+			unset($default);
+	}
+
+	// Update children to point to new parent
+	if ( is_taxonomy_hierarchical($taxonomy) ) {
+		$term_obj = get_term($term, $taxonomy);
+		if ( is_wp_error( $term_obj ) )
+			return $term_obj;
+		$parent = $term_obj->parent;
+
+		$wpdb->update( $wpdb->term_taxonomy, compact( 'parent' ), array( 'parent' => $term_obj->term_id) + compact( 'taxonomy' ) );
+	}
+
+	$objects = $wpdb->get_col( $wpdb->prepare( "SELECT object_id FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d", $tt_id ) );
+
+	foreach ( (array) $objects as $object ) {
+		$terms = wp_get_object_terms($object, $taxonomy, 'fields=ids');
+		if ( 1 == count($terms) && isset($default) )
+			$terms = array($default);
+		else
+			$terms = array_diff($terms, array($term));
+		$terms = array_map('intval', $terms);
+		wp_set_object_terms($object, $terms, $taxonomy);
+	}
+
+	$wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->term_taxonomy WHERE term_taxonomy_id = %d", $tt_id ) );
+
+	// Delete the term if no taxonomies use it.
+	if ( !$wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_taxonomy WHERE term_id = %d", $term) ) )
+		$wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->terms WHERE term_id = %d", $term) );
+
+	clean_term_cache($term, $taxonomy);
+
+	do_action('delete_term', $term, $tt_id, $taxonomy);
+	do_action("delete_$taxonomy", $term, $tt_id);
+
+	return true;
+}
+
+/**
+ * wp_get_object_terms() - Retrieves the terms associated with the given object(s), in the supplied taxonomies.
+ *
+ * The following information has to do the $args parameter and for what can be contained in the string
+ * or array of that parameter, if it exists.
+ *
+ * The first argument is called, 'orderby' and has the default value of 'name'. The other value that is
+ * supported is 'count'.
+ *
+ * The second argument is called, 'order' and has the default value of 'ASC'. The only other value that
+ * will be acceptable is 'DESC'.
+ *
+ * The final argument supported is called, 'fields' and has the default value of 'all'. There are
+ * multiple other options that can be used instead. Supported values are as follows: 'all', 'ids',
+ * 'names', and finally 'all_with_object_id'.
+ *
+ * The fields argument also decides what will be returned. If 'all' or 'all_with_object_id' is choosen or
+ * the default kept intact, then all matching terms objects will be returned. If either 'ids' or 'names'
+ * is used, then an array of all matching term ids or term names will be returned respectively.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ * @uses $wpdb
+ *
+ * @param int|array $object_id The id of the object(s) to retrieve.
+ * @param string|array $taxonomies The taxonomies to retrieve terms from.
+ * @param array|string $args Change what is returned
+ * @return array|WP_Error The requested term data or empty array if no terms found. WP_Error if $taxonomy does not exist.
+ */
+function wp_get_object_terms($object_ids, $taxonomies, $args = array()) {
+	global $wpdb;
+
+	if ( !is_array($taxonomies) )
+		$taxonomies = array($taxonomies);
+
+	foreach ( $taxonomies as $taxonomy ) {
+		if ( ! is_taxonomy($taxonomy) )
+			return new WP_Error('invalid_taxonomy', __('Invalid Taxonomy'));
+	}
+
+	if ( !is_array($object_ids) )
+		$object_ids = array($object_ids);
+	$object_ids = array_map('intval', $object_ids);
+
+	$defaults = array('orderby' => 'name', 'order' => 'ASC', 'fields' => 'all');
+	$args = wp_parse_args( $args, $defaults );
+
+	$terms = array();
+	if ( count($taxonomies) > 1 ) {
+		foreach ( $taxonomies as $index => $taxonomy ) {
+			$t = get_taxonomy($taxonomy);
+			if ( is_array($t->args) && $args != array_merge($args, $t->args) ) {
+				unset($taxonomies[$index]);
+				$terms = array_merge($terms, wp_get_object_terms($object_ids, $taxonomy, array_merge($args, $t->args)));
+			}
+		}
+	} else {
+		$t = get_taxonomy($taxonomies[0]);
+		if ( is_array($t->args) )
+			$args = array_merge($args, $t->args);
+	}
+
+	extract($args, EXTR_SKIP);
+
+	if ( 'count' == $orderby )
+		$orderby = 'tt.count';
+	else if ( 'name' == $orderby )
+		$orderby = 't.name';
+	else if ( 'slug' == $orderby )
+		$orderby = 't.slug';
+	else if ( 'term_group' == $orderby )
+		$orderby = 't.term_group';
+	else if ( 'term_order' == $orderby )
+		$orderby = 'tr.term_order';
+	else
+		$orderby = 't.term_id';
+
+	$taxonomies = "'" . implode("', '", $taxonomies) . "'";
+	$object_ids = implode(', ', $object_ids);
+
+	$select_this = '';
+	if ( 'all' == $fields )
+		$select_this = 't.*, tt.*';
+	else if ( 'ids' == $fields )
+		$select_this = 't.term_id';
+	else if ( 'names' == $fields )
+		$select_this = 't.name';
+	else if ( 'all_with_object_id' == $fields )
+		$select_this = 't.*, tt.*, tr.object_id';
+
+	$query = "SELECT $select_this FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON tt.term_id = t.term_id INNER JOIN $wpdb->term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ($taxonomies) AND tr.object_id IN ($object_ids) ORDER BY $orderby $order";
+
+	if ( 'all' == $fields || 'all_with_object_id' == $fields ) {
+		$terms = array_merge($terms, $wpdb->get_results($query));
+		update_term_cache($terms);
+	} else if ( 'ids' == $fields || 'names' == $fields ) {
+		$terms = array_merge($terms, $wpdb->get_col($query));
+	} else if ( 'tt_ids' == $fields ) {
+		$terms = $wpdb->get_col("SELECT tr.term_taxonomy_id FROM $wpdb->term_relationships AS tr INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tr.object_id IN ($object_ids) AND tt.taxonomy IN ($taxonomies) ORDER BY tr.term_taxonomy_id $order");
+	}
+
+	if ( ! $terms )
+		return array();
+
+	return $terms;
+}
+
+/**
+ * wp_insert_term() - Adds a new term to the database. Optionally marks it as an alias of an existing term.
+ *
+ * Error handling is assigned for the nonexistance of the $taxonomy and $term parameters before inserting.
+ * If both the term id and taxonomy exist previously, then an array will be returned that contains the term
+ * id and the contents of what is returned. The keys of the array are 'term_id' and 'term_taxonomy_id' containing
+ * numeric values.
+ *
+ * It is assumed that the term does not yet exist or the above will apply. The term will be first added to the term
+ * table and then related to the taxonomy if everything is well. If everything is correct, then several actions
+ * will be run prior to a filter and then several actions will be run after the filter is run.
+ *
+ * The arguments decide how the term is handled based on the $args parameter. The following
+ * is a list of the available overrides and the defaults.
+ *
+ * 'alias_of'. There is no default, but if added, expected is the slug that the term will be an alias of.
+ * Expected to be a string.
+ *
+ * 'description'. There is no default. If exists, will be added to the database along with the term. Expected
+ * to be a string.
+ *
+ * 'parent'. Expected to be numeric and default is 0 (zero). Will assign value of 'parent' to the term.
+ *
+ * 'slug'. Expected to be a string. There is no default.
+ *
+ * If 'slug' argument exists then the slug will be checked to see if it is not a valid term. If that check
+ * succeeds (it is not a valid term), then it is added and the term id is given. If it fails, then a check
+ * is made to whether the taxonomy is hierarchical and the parent argument is not empty. If the second check
+ * succeeds, the term will be inserted and the term id will be given.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ * @uses $wpdb
+ *
+ * @uses do_action() Calls 'create_term' hook with the term id and taxonomy id as parameters.
+ * @uses do_action() Calls 'create_$taxonomy' hook with term id and taxonomy id as parameters.
+ * @uses apply_filters() Calls 'term_id_filter' hook with term id and taxonomy id as parameters.
+ * @uses do_action() Calls 'created_term' hook with the term id and taxonomy id as parameters.
+ * @uses do_action() Calls 'created_$taxonomy' hook with term id and taxonomy id as parameters.
+ *
+ * @param int|string $term The term to add or update.
+ * @param string $taxonomy The taxonomy to which to add the term
+ * @param array|string $args Change the values of the inserted term
+ * @return array|WP_Error The Term ID and Term Taxonomy ID
+ */
+function wp_insert_term( $term, $taxonomy, $args = array() ) {
+	global $wpdb;
+
+	if ( ! is_taxonomy($taxonomy) )
+		return new WP_Error('invalid_taxonomy', __('Invalid taxonomy'));
+
+	if ( is_int($term) && 0 == $term )
+		return new WP_Error('invalid_term_id', __('Invalid term ID'));
+
+	$defaults = array( 'alias_of' => '', 'description' => '', 'parent' => 0, 'slug' => '');
+	$args = wp_parse_args($args, $defaults);
+	$args['name'] = $term;
+	$args['taxonomy'] = $taxonomy;
+	$args = sanitize_term($args, $taxonomy, 'db');
+	extract($args, EXTR_SKIP);
+
+	// expected_slashed ($name)
+	$name = stripslashes($name);
+	$description = stripslashes($description);
+
+	if ( empty($slug) )
+		$slug = sanitize_title($name);
+
+	$term_group = 0;
+	if ( $alias_of ) {
+		$alias = $wpdb->get_row( $wpdb->prepare( "SELECT term_id, term_group FROM $wpdb->terms WHERE slug = %s", $alias_of) );
+		if ( $alias->term_group ) {
+			// The alias we want is already in a group, so let's use that one.
+			$term_group = $alias->term_group;
+		} else {
+			// The alias isn't in a group, so let's create a new one and firstly add the alias term to it.
+			$term_group = $wpdb->get_var("SELECT MAX(term_group) FROM $wpdb->terms") + 1;
+			$wpdb->query( $wpdb->prepare( "UPDATE $wpdb->terms SET term_group = %d WHERE term_id = %d", $term_group, $alias->term_id ) );
+		}
+	}
+
+	if ( ! $term_id = is_term($slug) ) {
+		if ( false === $wpdb->insert( $wpdb->terms, compact( 'name', 'slug', 'term_group' ) ) )
+			return new WP_Error('db_insert_error', __('Could not insert term into the database'), $wpdb->last_error);
+		$term_id = (int) $wpdb->insert_id;
+	} else if ( is_taxonomy_hierarchical($taxonomy) && !empty($parent) ) {
+		// If the taxonomy supports hierarchy and the term has a parent, make the slug unique
+		// by incorporating parent slugs.
+		$slug = wp_unique_term_slug($slug, (object) $args);
+		if ( false === $wpdb->insert( $wpdb->terms, compact( 'name', 'slug', 'term_group' ) ) )
+			return new WP_Error('db_insert_error', __('Could not insert term into the database'), $wpdb->last_error);
+		$term_id = (int) $wpdb->insert_id;
+	}
+
+	if ( empty($slug) ) {
+		$slug = sanitize_title($slug, $term_id);
+		$wpdb->update( $wpdb->terms, compact( 'slug' ), compact( 'term_id' ) );
+	}
+
+	$tt_id = $wpdb->get_var( $wpdb->prepare( "SELECT tt.term_taxonomy_id FROM $wpdb->term_taxonomy AS tt INNER JOIN $wpdb->terms AS t ON tt.term_id = t.term_id WHERE tt.taxonomy = %s AND t.term_id = %d", $taxonomy, $term_id ) );
+
+	if ( !empty($tt_id) )
+		return array('term_id' => $term_id, 'term_taxonomy_id' => $tt_id);
+
+	$wpdb->insert( $wpdb->term_taxonomy, compact( 'term_id', 'taxonomy', 'description', 'parent') + array( 'count' => 0 ) );
+	$tt_id = (int) $wpdb->insert_id;
+
+	do_action("create_term", $term_id, $tt_id);
+	do_action("create_$taxonomy", $term_id, $tt_id);
+
+	$term_id = apply_filters('term_id_filter', $term_id, $tt_id);
+
+	clean_term_cache($term_id, $taxonomy);
+
+	do_action("created_term", $term_id, $tt_id);
+	do_action("created_$taxonomy", $term_id, $tt_id);
+
+	return array('term_id' => $term_id, 'term_taxonomy_id' => $tt_id);
+}
+
+/**
+ * wp_set_object_terms() - Create Term and Taxonomy Relationships
+ *
+ * Relates an object (post, link etc) to a term and taxonomy type. Creates the term and taxonomy
+ * relationship if it doesn't already exist. Creates a term if it doesn't exist (using the slug).
+ *
+ * A relationship means that the term is grouped in or belongs to the taxonomy. A term has no
+ * meaning until it is given context by defining which taxonomy it exists under.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ * @uses $wpdb
+ *
+ * @param int $object_id The object to relate to.
+ * @param array|int|string $term The slug or id of the term.
+ * @param array|string $taxonomy The context in which to relate the term to the object.
+ * @param bool $append If false will delete difference of terms.
+ * @return array|WP_Error Affected Term IDs
+ */
+function wp_set_object_terms($object_id, $terms, $taxonomy, $append = false) {
+	global $wpdb;
+
+	$object_id = (int) $object_id;
+
+	if ( ! is_taxonomy($taxonomy) )
+		return new WP_Error('invalid_taxonomy', __('Invalid Taxonomy'));
+
+	if ( !is_array($terms) )
+		$terms = array($terms);
+
+	if ( ! $append )
+		$old_terms =  wp_get_object_terms($object_id, $taxonomy, 'fields=tt_ids');
+
+	$tt_ids = array();
+	$term_ids = array();
+
+	foreach ($terms as $term) {
+		if ( !strlen(trim($term)) )
+			continue;
+
+		if ( !$id = is_term($term, $taxonomy) )
+			$id = wp_insert_term($term, $taxonomy);
+		if ( is_wp_error($id) )
+			return $id;
+		$term_ids[] = $id['term_id'];
+		$id = $id['term_taxonomy_id'];
+		$tt_ids[] = $id;
+
+		if ( $wpdb->get_var( $wpdb->prepare( "SELECT term_taxonomy_id FROM $wpdb->term_relationships WHERE object_id = %d AND term_taxonomy_id = %d", $object_id, $id ) ) )
+			continue;
+		$wpdb->insert( $wpdb->term_relationships, array( 'object_id' => $object_id, 'term_taxonomy_id' => $id ) );
+	}
+
+	wp_update_term_count($tt_ids, $taxonomy);
+
+	if ( ! $append ) {
+		$delete_terms = array_diff($old_terms, $tt_ids);
+		if ( $delete_terms ) {
+			$in_delete_terms = "'" . implode("', '", $delete_terms) . "'";
+			$wpdb->query("DELETE FROM $wpdb->term_relationships WHERE object_id = '$object_id' AND term_taxonomy_id IN ($in_delete_terms)");
+			wp_update_term_count($delete_terms, $taxonomy);
+		}
+	}
+
+	$t = get_taxonomy($taxonomy);
+	if ( ! $append && isset($t->sort) && $t->sort ) {
+		$values = array();
+		$term_order = 0;
+		$final_term_ids = wp_get_object_terms($object_id, $taxonomy, 'fields=tt_ids');
+		foreach ( $term_ids as $term_id )
+			if ( in_array($term_id, $final_term_ids) )
+				$values[] = $wpdb->prepare( "(%d, %d, %d)", $object_id, $term_id, ++$term_order);
+		if ( $values )
+			$wpdb->query("INSERT INTO $wpdb->term_relationships (object_id, term_taxonomy_id, term_order) VALUES " . join(',', $values) . " ON DUPLICATE KEY UPDATE term_order = VALUES(term_order)");
+	}
+
+	return $tt_ids;
+}
+
+/**
+ * wp_unique_term_slug() - Will make slug unique, if it isn't already
+ *
+ * The $slug has to be unique global to every taxonomy, meaning that one taxonomy
+ * term can't have a matching slug with another taxonomy term. Each slug has to be
+ * globally unique for every taxonomy.
+ *
+ * The way this works is that if the taxonomy that the term belongs to is heirarchical
+ * and has a parent, it will append that parent to the $slug.
+ *
+ * If that still doesn't return an unique slug, then it try to append a number until
+ * it finds a number that is truely unique.
+ *
+ * The only purpose for $term is for appending a parent, if one exists.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ * @uses $wpdb
+ *
+ * @param string $slug The string that will be tried for a unique slug
+ * @param object $term The term object that the $slug will belong too
+ * @return string Will return a true unique slug.
+ */
+function wp_unique_term_slug($slug, $term) {
+	global $wpdb;
+
+	// If the taxonomy supports hierarchy and the term has a parent, make the slug unique
+	// by incorporating parent slugs.
+	if ( is_taxonomy_hierarchical($term->taxonomy) && !empty($term->parent) ) {
+		$the_parent = $term->parent;
+		while ( ! empty($the_parent) ) {
+			$parent_term = get_term($the_parent, $term->taxonomy);
+			if ( is_wp_error($parent_term) || empty($parent_term) )
+				break;
+				$slug .= '-' . $parent_term->slug;
+			if ( empty($parent_term->parent) )
+				break;
+			$the_parent = $parent_term->parent;
+		}
+	}
+
+	// If we didn't get a unique slug, try appending a number to make it unique.
+	if ( !empty($args['term_id']) )
+		$query = $wpdb->prepare( "SELECT slug FROM $wpdb->terms WHERE slug = %s AND term_id != %d", $slug, $args['term_id'] );
+	else
+		$query = $wpdb->prepare( "SELECT slug FROM $wpdb->terms WHERE slug = %s", $slug );
+
+	if ( $wpdb->get_var( $query ) ) {
+		$num = 2;
+		do {
+			$alt_slug = $slug . "-$num";
+			$num++;
+			$slug_check = $wpdb->get_var( $wpdb->prepare( "SELECT slug FROM $wpdb->terms WHERE slug = %s", $alt_slug ) );
+		} while ( $slug_check );
+		$slug = $alt_slug;
+	}
+
+	return $slug;
+}
+
+/**
+ * wp_update_term() - Update term based on arguments provided
+ *
+ * The $args will indiscriminately override all values with the same field name. Care
+ * must be taken to not override important information need to update or update will
+ * fail (or perhaps create a new term, neither would be acceptable).
+ *
+ * Defaults will set 'alias_of', 'description', 'parent', and 'slug' if not defined
+ * in $args already.
+ *
+ * 'alias_of' will create a term group, if it doesn't already exist, and update it for
+ * the $term.
+ *
+ * If the 'slug' argument in $args is missing, then the 'name' in $args will be used.
+ * It should also be noted that if you set 'slug' and it isn't unique then a WP_Error
+ * will be passed back. If you don't pass any slug, then a unique one will be created
+ * for you.
+ *
+ * For what can be overrode in $args, check the term scheme can contain and stay away
+ * from the term keys.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ *
+ * @uses $wpdb
+ * @uses do_action() Will call both 'edit_term' and 'edit_$taxonomy' twice.
+ * @uses apply_filters() Will call the 'term_id_filter' filter and pass the term id and
+ *	taxonomy id.
+ *
+ * @param int $term The ID of the term
+ * @param string $taxonomy The context in which to relate the term to the object.
+ * @param array|string $args Overwrite term field values
+ * @return array|WP_Error Returns Term ID and Taxonomy Term ID
+ */
+function wp_update_term( $term, $taxonomy, $args = array() ) {
+	global $wpdb;
+
+	if ( ! is_taxonomy($taxonomy) )
+		return new WP_Error('invalid_taxonomy', __('Invalid taxonomy'));
+
+	$term_id = (int) $term;
+
+	// First, get all of the original args
+	$term = get_term ($term_id, $taxonomy, ARRAY_A);
+
+	// Escape data pulled from DB.
+	$term = add_magic_quotes($term);
+
+	// Merge old and new args with new args overwriting old ones.
+	$args = array_merge($term, $args);
+
+	$defaults = array( 'alias_of' => '', 'description' => '', 'parent' => 0, 'slug' => '');
+	$args = wp_parse_args($args, $defaults);
+	$args = sanitize_term($args, $taxonomy, 'db');
+	extract($args, EXTR_SKIP);
+
+	// expected_slashed ($name)
+	$name = stripslashes($name);
+	$description = stripslashes($description);
+
+	$empty_slug = false;
+	if ( empty($slug) ) {
+		$empty_slug = true;
+		$slug = sanitize_title($name);
+	}
+
+	if ( $alias_of ) {
+		$alias = $wpdb->get_row( $wpdb->prepare( "SELECT term_id, term_group FROM $wpdb->terms WHERE slug = %s", $alias_of) );
+		if ( $alias->term_group ) {
+			// The alias we want is already in a group, so let's use that one.
+			$term_group = $alias->term_group;
+		} else {
+			// The alias isn't in a group, so let's create a new one and firstly add the alias term to it.
+			$term_group = $wpdb->get_var("SELECT MAX(term_group) FROM $wpdb->terms") + 1;
+			$wpdb->update( $wpdb->terms, compact('term_group'), array( 'term_id' => $alias->term_id ) );
+		}
+	}
+
+	// Check for duplicate slug
+	$id = $wpdb->get_var( $wpdb->prepare( "SELECT term_id FROM $wpdb->terms WHERE slug = %s", $slug ) );
+	if ( $id && ($id != $term_id) ) {
+		// If an empty slug was passed or the parent changed, reset the slug to something unique.
+		// Otherwise, bail.
+		if ( $empty_slug || ( $parent != $term->parent) )
+			$slug = wp_unique_term_slug($slug, (object) $args);
+		else
+			return new WP_Error('duplicate_term_slug', sprintf(__('The slug "%s" is already in use by another term'), $slug));
+	}
+
+	$wpdb->update($wpdb->terms, compact( 'name', 'slug', 'term_group' ), compact( 'term_id' ) );
+
+	if ( empty($slug) ) {
+		$slug = sanitize_title($name, $term_id);
+		$wpdb->update( $wpdb->terms, compact( 'slug' ), compact( 'term_id' ) );
+	}
+
+	$tt_id = $wpdb->get_var( $wpdb->prepare( "SELECT tt.term_taxonomy_id FROM $wpdb->term_taxonomy AS tt INNER JOIN $wpdb->terms AS t ON tt.term_id = t.term_id WHERE tt.taxonomy = %s AND t.term_id = %d", $taxonomy, $term_id) );
+
+	$wpdb->update( $wpdb->term_taxonomy, compact( 'term_id', 'taxonomy', 'description', 'parent' ), array( 'term_taxonomy_id' => $tt_id ) );
+
+	do_action("edit_term", $term_id, $tt_id);
+	do_action("edit_$taxonomy", $term_id, $tt_id);
+
+	$term_id = apply_filters('term_id_filter', $term_id, $tt_id);
+
+	clean_term_cache($term_id, $taxonomy);
+
+	do_action("edited_term", $term_id, $tt_id);
+	do_action("edited_$taxonomy", $term_id, $tt_id);
+
+	return array('term_id' => $term_id, 'term_taxonomy_id' => $tt_id);
+}
+
+// enable or disable term count deferring
+// if no value is supplied, the current value of the defer setting is returned
+function wp_defer_term_counting($defer=NULL) {
+	static $_defer = false;
+
+	if ( is_bool($defer) ) {
+		$_defer = $defer;
+		// flush any deferred counts
+		if ( !$defer )
+			wp_update_term_count( NULL, NULL, true );
+	}
+
+	return $_defer;
+}
+
+/**
+ * wp_update_term_count() - Updates the amount of terms in taxonomy
+ *
+ * If there is a taxonomy callback applyed, then it will be called for updating the count.
+ *
+ * The default action is to count what the amount of terms have the relationship of term ID.
+ * Once that is done, then update the database.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ * @uses $wpdb
+ *
+ * @param int|array $terms The ID of the terms
+ * @param string $taxonomy The context of the term.
+ * @return bool If no terms will return false, and if successful will return true.
+ */
+function wp_update_term_count( $terms, $taxonomy, $do_deferred=false ) {
+	static $_deferred = array();
+
+	if ( $do_deferred ) {
+		foreach ( array_keys($_deferred) as $tax ) {
+			wp_update_term_count_now( $_deferred[$tax], $tax );
+			unset( $_deferred[$tax] );
+		}
+	}
+
+	if ( empty($terms) )
+		return false;
+
+	if ( !is_array($terms) )
+		$terms = array($terms);
+
+	if ( wp_defer_term_counting() ) {
+		if ( !isset($_deferred[$taxonomy]) )
+			$_deferred[$taxonomy] = array();
+		$_deferred[$taxonomy] = array_unique( array_merge($_deferred[$taxonomy], $terms) );
+		return true;
+	}
+
+	return wp_update_term_count_now( $terms, $taxonomy );
+}
+
+function wp_update_term_count_now( $terms, $taxonomy ) {
+	global $wpdb;
+
+	$terms = array_map('intval', $terms);
+
+	$taxonomy = get_taxonomy($taxonomy);
+	if ( !empty($taxonomy->update_count_callback) ) {
+		call_user_func($taxonomy->update_count_callback, $terms);
+	} else {
+		// Default count updater
+		foreach ($terms as $term) {
+			$count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d", $term) );
+			$wpdb->update( $wpdb->term_taxonomy, compact( 'count' ), array( 'term_taxonomy_id' => $term ) );
+		}
+
+	}
+
+	clean_term_cache($terms);
+
+	return true;
+}
+
+//
+// Cache
+//
+
+/**
+ * clean_object_term_cache() - Removes the taxonomy relationship to terms from the cache.
+ *
+ * Will remove the entire taxonomy relationship containing term $object_id. The term IDs
+ * have to exist within the taxonomy $object_type for the deletion to take place.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ *
+ * @see get_object_taxonomies() for more on $object_type
+ * @uses do_action() Will call action hook named, 'clean_object_term_cache' after completion.
+ *	Passes, function params in same order.
+ *
+ * @param int|array $object_ids Single or list of term object ID(s)
+ * @param array|string $object_type The taxonomy object type
+ */
+function clean_object_term_cache($object_ids, $object_type) {
+	if ( !is_array($object_ids) )
+		$object_ids = array($object_ids);
+
+	foreach ( $object_ids as $id )
+		foreach ( get_object_taxonomies($object_type) as $taxonomy )
+			wp_cache_delete($id, "{$taxonomy}_relationships");
+
+	do_action('clean_object_term_cache', $object_ids, $object_type);
+}
+
+/**
+ * clean_term_cache() - Will remove all of the term ids from the cache
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ * @uses $wpdb
+ *
+ * @param int|array $ids Single or list of Term IDs
+ * @param string $taxonomy Can be empty and will assume tt_ids, else will use for context.
+ */
+function clean_term_cache($ids, $taxonomy = '') {
+	global $wpdb;
+
+	if ( !is_array($ids) )
+		$ids = array($ids);
+
+	$taxonomies = array();
+	// If no taxonomy, assume tt_ids.
+	if ( empty($taxonomy) ) {
+		$tt_ids = implode(', ', $ids);
+		$terms = $wpdb->get_results("SELECT term_id, taxonomy FROM $wpdb->term_taxonomy WHERE term_taxonomy_id IN ($tt_ids)");
+		foreach ( (array) $terms as $term ) {
+			$taxonomies[] = $term->taxonomy;
+			wp_cache_delete($term->term_id, $term->taxonomy);
+		}
+		$taxonomies = array_unique($taxonomies);
+	} else {
+		foreach ( $ids as $id ) {
+			wp_cache_delete($id, $taxonomy);
+		}
+		$taxonomies = array($taxonomy);
+	}
+
+	foreach ( $taxonomies as $taxonomy ) {
+		wp_cache_delete('all_ids', $taxonomy);
+		wp_cache_delete('get', $taxonomy);
+		delete_option("{$taxonomy}_children");
+	}
+
+	wp_cache_delete('get_terms', 'terms');
+
+	do_action('clean_term_cache', $ids, $taxonomy);
+}
+
+/**
+ * get_object_term_cache() - Retrieves the taxonomy relationship to the term object id.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ *
+ * @uses wp_cache_get() Retrieves taxonomy relationship from cache
+ *
+ * @param int|array $id Term object ID
+ * @param string $taxonomy Taxonomy Name
+ * @return bool|array Empty array if $terms found, but not $taxonomy. False if nothing is in cache for $taxonomy and $id.
+ */
+function &get_object_term_cache($id, $taxonomy) {
+	$cache = wp_cache_get($id, "{$taxonomy}_relationships");
+	return $cache;
+}
+
+/**
+ * update_object_term_cache() - Updates the cache for Term ID(s)
+ *
+ * Will only update the cache for terms not already cached.
+ *
+ * The $object_ids expects that the ids be separated by commas, if it is
+ * a string.
+ *
+ * It should be noted that update_object_term_cache() is very time extensive.
+ * It is advised that the function is not called very often or at least not
+ * for a lot of terms that exist in a lot of taxonomies. The amount of time
+ * increases for each term and it also increases for each taxonomy the term
+ * belongs to.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ * @uses wp_get_object_terms() Used to get terms from the database to update
+ *
+ * @param string|array $object_ids Single or list of term object ID(s)
+ * @param array|string $object_type The taxonomy object type
+ * @return null|bool Null value is given with empty $object_ids. False if
+ */
+function update_object_term_cache($object_ids, $object_type) {
+	if ( empty($object_ids) )
+		return;
+
+	if ( !is_array($object_ids) )
+		$object_ids = explode(',', $object_ids);
+
+	$object_ids = array_map('intval', $object_ids);
+
+	$taxonomies = get_object_taxonomies($object_type);
+
+	$ids = array();
+	foreach ( (array) $object_ids as $id ) {
+		foreach ( $taxonomies as $taxonomy ) {
+			if ( false === wp_cache_get($id, "{$taxonomy}_relationships") ) {
+				$ids[] = $id;
+				break;
+			}
+		}
+	}
+
+	if ( empty( $ids ) )
+		return false;
+
+	$terms = wp_get_object_terms($ids, $taxonomies, 'fields=all_with_object_id');
+
+	$object_terms = array();
+	foreach ( (array) $terms as $term )
+		$object_terms[$term->object_id][$term->taxonomy][$term->term_id] = $term;
+
+	foreach ( $ids as $id ) {
+		foreach ( $taxonomies  as $taxonomy ) {
+			if ( ! isset($object_terms[$id][$taxonomy]) ) {
+				if ( !isset($object_terms[$id]) )
+					$object_terms[$id] = array();
+				$object_terms[$id][$taxonomy] = array();
+			}
+		}
+	}
+
+	foreach ( $object_terms as $id => $value ) {
+		foreach ( $value as $taxonomy => $terms ) {
+			wp_cache_set($id, $terms, "{$taxonomy}_relationships");
+		}
+	}
+}
+
+/**
+ * update_term_cache() - Updates Terms to Taxonomy in cache.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @since 2.3
+ *
+ * @param array $terms List of Term objects to change
+ * @param string $taxonomy Optional. Update Term to this taxonomy in cache
+ */
+function update_term_cache($terms, $taxonomy = '') {
+	foreach ( $terms as $term ) {
+		$term_taxonomy = $taxonomy;
+		if ( empty($term_taxonomy) )
+			$term_taxonomy = $term->taxonomy;
+
+		wp_cache_add($term->term_id, $term, $term_taxonomy);
+	}
+}
+
+//
+// Private
+//
+
+/**
+ * _get_term_hierarchy() - Retrieves children of taxonomy
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @access private
+ * @since 2.3
+ *
+ * @uses update_option() Stores all of the children in "$taxonomy_children" option.
+ *	That is the name of the taxonomy, immediately followed by '_children'.
+ *
+ * @param string $taxonomy Taxonomy Name
+ * @return array Empty if $taxonomy isn't hierarachical or returns children.
+ */
+function _get_term_hierarchy($taxonomy) {
+	if ( !is_taxonomy_hierarchical($taxonomy) )
+		return array();
+	$children = get_option("{$taxonomy}_children");
+	if ( is_array($children) )
+		return $children;
+
+	$children = array();
+	$terms = get_terms($taxonomy, 'get=all');
+	foreach ( $terms as $term ) {
+		if ( $term->parent > 0 )
+			$children[$term->parent][] = $term->term_id;
+	}
+	update_option("{$taxonomy}_children", $children);
+
+	return $children;
+}
+
+/**
+ * _get_term_children() - Get array of child terms
+ *
+ * If $terms is an array of objects, then objects will returned from the function.
+ * If $terms is an array of IDs, then an array of ids of children will be returned.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @access private
+ * @since 2.3
+ *
+ * @param int $term_id Look for this Term ID in $terms
+ * @param array $terms List of Term IDs
+ * @param string $taxonomy Term Context
+ * @return array Empty if $terms is empty else returns full list of child terms.
+ */
+function &_get_term_children($term_id, $terms, $taxonomy) {
+	$empty_array = array();
+	if ( empty($terms) )
+		return $empty_array;
+
+	$term_list = array();
+	$has_children = _get_term_hierarchy($taxonomy);
+
+	if  ( ( 0 != $term_id ) && ! isset($has_children[$term_id]) )
+		return $empty_array;
+
+	foreach ( $terms as $term ) {
+		$use_id = false;
+		if ( !is_object($term) ) {
+			$term = get_term($term, $taxonomy);
+			if ( is_wp_error( $term ) )
+				return $term;
+			$use_id = true;
+		}
+
+		if ( $term->term_id == $term_id )
+			continue;
+
+		if ( $term->parent == $term_id ) {
+			if ( $use_id )
+				$term_list[] = $term->term_id;
+			else
+				$term_list[] = $term;
+
+			if ( !isset($has_children[$term->term_id]) )
+				continue;
+
+			if ( $children = _get_term_children($term->term_id, $terms, $taxonomy) )
+				$term_list = array_merge($term_list, $children);
+		}
+	}
+
+	return $term_list;
+}
+
+/**
+ * _pad_term_counts() - Add count of children to parent count
+ *
+ * Recalculates term counts by including items from child terms.
+ * Assumes all relevant children are already in the $terms argument
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @access private
+ * @since 2.3
+ * @uses $wpdb
+ *
+ * @param array $terms List of Term IDs
+ * @param string $taxonomy Term Context
+ * @return null Will break from function if conditions are not met.
+ */
+function _pad_term_counts(&$terms, $taxonomy) {
+	global $wpdb;
+
+	// This function only works for post categories.
+	if ( 'category' != $taxonomy )
+		return;
+
+	$term_hier = _get_term_hierarchy($taxonomy);
+
+	if ( empty($term_hier) )
+		return;
+
+	$term_items = array();
+
+	foreach ( $terms as $key => $term ) {
+		$terms_by_id[$term->term_id] = & $terms[$key];
+		$term_ids[$term->term_taxonomy_id] = $term->term_id;
+	}
+
+	// Get the object and term ids and stick them in a lookup table
+	$results = $wpdb->get_results("SELECT object_id, term_taxonomy_id FROM $wpdb->term_relationships INNER JOIN $wpdb->posts ON object_id = ID WHERE term_taxonomy_id IN (".join(',', array_keys($term_ids)).") AND post_type = 'post' AND post_status = 'publish'");
+	foreach ( $results as $row ) {
+		$id = $term_ids[$row->term_taxonomy_id];
+		++$term_items[$id][$row->object_id];
+	}
+
+	// Touch every ancestor's lookup row for each post in each term
+	foreach ( $term_ids as $term_id ) {
+		$child = $term_id;
+		while ( $parent = $terms_by_id[$child]->parent ) {
+			if ( !empty($term_items[$term_id]) )
+				foreach ( $term_items[$term_id] as $item_id => $touches )
+					++$term_items[$parent][$item_id];
+			$child = $parent;
+		}
+	}
+
+	// Transfer the touched cells
+	foreach ( (array) $term_items as $id => $items )
+		if ( isset($terms_by_id[$id]) )
+			$terms_by_id[$id]->count = count($items);
+}
+
+//
+// Default callbacks
+//
+
+/**
+ * _update_post_term_count() - Will update term count based on posts
+ *
+ * Private function for the default callback for post_tag and category taxonomies.
+ *
+ * @package WordPress
+ * @subpackage Taxonomy
+ * @access private
+ * @since 2.3
+ * @uses $wpdb
+ *
+ * @param array $terms List of Term IDs
+ */
+function _update_post_term_count( $terms ) {
+	global $wpdb;
+
+	foreach ( $terms as $term ) {
+		$count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts WHERE $wpdb->posts.ID = $wpdb->term_relationships.object_id AND post_status = 'publish' AND post_type = 'post' AND term_taxonomy_id = %d", $term ) );
+		$wpdb->update( $wpdb->term_taxonomy, compact( 'count' ), array( 'term_taxonomy_id' => $term ) );
+	}
+}
+
+/**
+ * get_term_link() - Generates a permalink for a taxonomy term archive
+ *
+ * @param object|int|string $term
+ * @param string $taxonomy
+ * @return string HTML link to taxonomy term archive
+ */
+function get_term_link( $term, $taxonomy ) {
+	global $wp_rewrite;
+
+	// use legacy functions for core taxonomies until they are fully plugged in
+	if ( $taxonomy == 'category' )
+		return get_category_link($term);
+	if ( $taxonomy == 'post_tag' )
+		return get_tag_link($term);
+
+	$termlink = $wp_rewrite->get_extra_permastruct($taxonomy);
+
+	if ( !is_object($term) ) {
+		if ( is_int($term) ) {
+			$term = &get_term($term, $taxonomy);
+		} else {
+			$term = &get_term_by('slug', $term, $taxonomy);
+		}
+	}
+	if ( is_wp_error( $term ) )
+		return $term;
+
+	$slug = $term->slug;
+
+	if ( empty($termlink) ) {
+		$file = get_option('home') . '/';
+		$t = get_taxonomy($taxonomy);
+		if ( $t->query_var )
+			$termlink = "$file?$t->query_var=$slug";
+		else
+			$termlink = "$file?taxonomy=$taxonomy&term=$slug";
+	} else {
+		$termlink = str_replace("%$taxonomy%", $slug, $termlink);
+		$termlink = get_option('home') . user_trailingslashit($termlink, 'category');
+	}
+	return apply_filters('term_link', $termlink, $term, $taxonomy);
+}
+
+function the_taxonomies($args = array()) {
+	$defaults = array(
+		'post' => 0,
+		'before' => '',
+		'sep' => ' ',
+		'after' => '',
+	);
+
+	$r = wp_parse_args( $args, $defaults );
+	extract( $r, EXTR_SKIP );
+
+	echo $before . join($sep, get_the_taxonomies($post)) . $after;
+}
+
+function get_the_taxonomies($post = 0) {
+	if ( is_int($post) )
+		$post =& get_post($post);
+	elseif ( !is_object($post) )
+		$post =& $GLOBALS['post'];
+
+	$taxonomies = array();
+
+	if ( !$post )
+		return $taxonomies;
+
+	$template = apply_filters('taxonomy_template', '%s: %l.');
+
+	foreach ( get_object_taxonomies($post) as $taxonomy ) {
+		$t = (array) get_taxonomy($taxonomy);
+		if ( empty($t['label']) )
+			$t['label'] = $taxonomy;
+		if ( empty($t['args']) )
+			$t['args'] = array();
+		if ( empty($t['template']) )
+			$t['template'] = $template;
+
+		$terms = get_object_term_cache($post->ID, $taxonomy);
+		if ( empty($terms) )
+			$terms = wp_get_object_terms($post->ID, $taxonomy, $t['args']);
+
+		$links = array();
+
+		foreach ( $terms as $term )
+			$links[] = "<a href='" . attribute_escape(get_term_link($term, $taxonomy)) . "'>$term->name</a>";
+
+		if ( $links )
+			$taxonomies[$taxonomy] = wp_sprintf($t['template'], $t['label'], $links, $terms);
+	}
+	return $taxonomies;
+}
+
+function get_post_taxonomies($post = 0) {
+	$post =& get_post($post);
+
+	return get_object_taxonomies($post);
+}
+
+?>
diff -x .svn -aruN 2.2.2.src/wp-includes/template-loader.php 2.5.src/wp-includes/template-loader.php
--- 2.2.2.src/wp-includes/template-loader.php	2007-04-19 17:26:52.000000000 -0500
+++ 2.5.src/wp-includes/template-loader.php	2008-03-23 12:02:11.000000000 -0500
@@ -1,4 +1,8 @@
 <?php
+/**
+ * Loads the correct template based on the visitor's url
+ * @package WordPress
+ */
 if ( defined('WP_USE_THEMES') && constant('WP_USE_THEMES') ) {
 	do_action('template_redirect');
 	if ( is_robots() ) {
@@ -8,7 +12,7 @@
 		do_feed();
 		return;
 	} else if ( is_trackback() ) {
-		include(ABSPATH . '/wp-trackback.php');
+		include(ABSPATH . 'wp-trackback.php');
 		return;
 	} else if ( is_404() && $template = get_404_template() ) {
 		include($template);
@@ -20,21 +24,24 @@
 		include($template);
 		return;
 	} else if ( is_attachment() && $template = get_attachment_template() ) {
+		remove_filter('the_content', 'prepend_attachment');
 		include($template);
 		return;
 	} else if ( is_single() && $template = get_single_template() ) {
-		if ( is_attachment() )
-			add_filter('the_content', 'prepend_attachment');
 		include($template);
 		return;
 	} else if ( is_page() && $template = get_page_template() ) {
-		if ( is_attachment() )
-			add_filter('the_content', 'prepend_attachment');
 		include($template);
 		return;
 	} else if ( is_category() && $template = get_category_template()) {
 		include($template);
 		return;
+	} else if ( is_tag() && $template = get_tag_template()) {
+		include($template);
+		return;
+	} else if ( is_tax() && $template = get_taxonomy_template()) {
+		include($template);
+		return;
 	} else if ( is_author() && $template = get_author_template() ) {
 		include($template);
 		return;
@@ -51,8 +58,6 @@
 		include($template);
 		return;
 	} else if ( file_exists(TEMPLATEPATH . "/index.php") ) {
-		if ( is_attachment() )
-			add_filter('the_content', 'prepend_attachment');
 		include(TEMPLATEPATH . "/index.php");
 		return;
 	}
@@ -65,7 +70,7 @@
 		do_feed();
 		return;
 	} else if ( is_trackback() ) {
-		include(ABSPATH . '/wp-trackback.php');
+		include(ABSPATH . 'wp-trackback.php');
 		return;
 	}
 }
diff -x .svn -aruN 2.2.2.src/wp-includes/theme.php 2.5.src/wp-includes/theme.php
--- 2.2.2.src/wp-includes/theme.php	2007-06-27 17:45:52.000000000 -0500
+++ 2.5.src/wp-includes/theme.php	2008-03-23 12:02:11.000000000 -0500
@@ -56,38 +56,67 @@
 }
 
 function get_theme_data( $theme_file ) {
+	$themes_allowed_tags = array(
+		'a' => array(
+			'href' => array(),'title' => array()
+			),
+		'abbr' => array(
+			'title' => array()
+			),
+		'acronym' => array(
+			'title' => array()
+			),
+		'code' => array(),
+		'em' => array(),
+		'strong' => array()
+	);
+
 	$theme_data = implode( '', file( $theme_file ) );
-	$theme_data = str_replace ( '\r', '\n', $theme_data ); 
-	preg_match( '|Theme Name:(.*)|i', $theme_data, $theme_name );
-	preg_match( '|Theme URI:(.*)|i', $theme_data, $theme_uri );
-	preg_match( '|Description:(.*)|i', $theme_data, $description );
-	preg_match( '|Author:(.*)|i', $theme_data, $author_name );
-	preg_match( '|Author URI:(.*)|i', $theme_data, $author_uri );
-	preg_match( '|Template:(.*)|i', $theme_data, $template );
+	$theme_data = str_replace ( '\r', '\n', $theme_data );
+	preg_match( '|Theme Name:(.*)$|mi', $theme_data, $theme_name );
+	preg_match( '|Theme URI:(.*)$|mi', $theme_data, $theme_uri );
+	preg_match( '|Description:(.*)$|mi', $theme_data, $description );
+
+	if ( preg_match( '|Author URI:(.*)$|mi', $theme_data, $author_uri ) )
+		$author_uri = clean_url( trim( $author_uri[1]) );
+	else
+		$author_uti = '';
+
+	if ( preg_match( '|Template:(.*)$|mi', $theme_data, $template ) )
+		$template = wp_kses( trim( $template[1] ), $themes_allowed_tags );
+	else
+		$template = '';
+
 	if ( preg_match( '|Version:(.*)|i', $theme_data, $version ) )
-		$version = trim( $version[1] );
+		$version = wp_kses( trim( $version[1] ), $themes_allowed_tags );
 	else
-		$version ='';
+		$version = '';
+
 	if ( preg_match('|Status:(.*)|i', $theme_data, $status) )
-		$status = trim($status[1]);
+		$status = wp_kses( trim( $status[1] ), $themes_allowed_tags );
 	else
 		$status = 'publish';
 
-	$description = wptexturize( trim( $description[1] ) );
-
-	$name = $theme_name[1];
-	$name = trim( $name );
-	$theme = $name;
-	$theme_uri = trim( $theme_uri[1] );
-	$template = trim( $template[1] );
+	if ( preg_match('|Tags:(.*)|i', $theme_data, $tags) )
+		$tags = array_map( 'trim', explode( ',', wp_kses( trim( $tags[1] ), array() ) ) );
+	else
+		$tags = array();
 
-	if ( '' == $author_uri[1] ) {
-		$author = trim( $author_name[1] );
+	$name = $theme = wp_kses( trim( $theme_name[1] ), $themes_allowed_tags );
+	$theme_uri = clean_url( trim( $theme_uri[1] ) );
+	$description = wptexturize( wp_kses( trim( $description[1] ), $themes_allowed_tags ) );
+
+	if ( preg_match( '|Author:(.*)$|mi', $theme_data, $author_name ) ) {
+		if ( empty( $author_uri ) ) {
+			$author = wp_kses( trim( $author_name[1] ), $themes_allowed_tags );
+		} else {
+			$author = sprintf( '<a href="%1$s" title="%2$s">%3$s</a>', $author_uri, __( 'Visit author homepage' ), wp_kses( trim( $author_name[1] ), $themes_allowed_tags ) );
+		}
 	} else {
-		$author = '<a href="' . trim( $author_uri[1] ) . '" title="' . __('Visit author homepage') . '">' . trim( $author_name[1] ) . '</a>';
+		$author = __('Anonymous');
 	}
 
-	return array( 'Name' => $name, 'Title' => $theme, 'URI' => $theme_uri, 'Description' => $description, 'Author' => $author, 'Version' => $version, 'Template' => $template, 'Status' => $status );
+	return array( 'Name' => $name, 'Title' => $theme, 'URI' => $theme_uri, 'Description' => $description, 'Author' => $author, 'Version' => $version, 'Template' => $template, 'Status' => $status, 'Tags' => $tags );
 }
 
 function get_themes() {
@@ -98,50 +127,56 @@
 
 	$themes = array();
 	$wp_broken_themes = array();
-	$theme_root = get_theme_root();
-	$theme_loc = str_replace(ABSPATH, '', $theme_root);
+	$theme_loc = $theme_root = get_theme_root();
+	if ( '/' != ABSPATH ) // don't want to replace all forward slashes, see Trac #4541
+		$theme_loc = str_replace(ABSPATH, '', $theme_root);
 
 	// Files in wp-content/themes directory and one subdir down
-	$themes_dir = @ dir($theme_root);
+	$themes_dir = @ opendir($theme_root);
 	if ( !$themes_dir )
 		return false;
 
-	while ( ($theme_dir = $themes_dir->read()) !== false ) {
+	while ( ($theme_dir = readdir($themes_dir)) !== false ) {
 		if ( is_dir($theme_root . '/' . $theme_dir) && is_readable($theme_root . '/' . $theme_dir) ) {
 			if ( $theme_dir{0} == '.' || $theme_dir == '..' || $theme_dir == 'CVS' )
 				continue;
-			$stylish_dir = @ dir($theme_root . '/' . $theme_dir);
+			$stylish_dir = @ opendir($theme_root . '/' . $theme_dir);
 			$found_stylesheet = false;
-			while ( ($theme_file = $stylish_dir->read()) !== false ) {
+			while ( ($theme_file = readdir($stylish_dir)) !== false ) {
 				if ( $theme_file == 'style.css' ) {
 					$theme_files[] = $theme_dir . '/' . $theme_file;
 					$found_stylesheet = true;
 					break;
 				}
 			}
+			@closedir($stylish_dir);
 			if ( !$found_stylesheet ) { // look for themes in that dir
 				$subdir = "$theme_root/$theme_dir";
 				$subdir_name = $theme_dir;
-				$theme_subdir = @dir( $subdir );
-				while ( ($theme_dir = $theme_subdir->read()) !== false ) {
+				$theme_subdir = @ opendir( $subdir );
+				while ( ($theme_dir = readdir($theme_subdir)) !== false ) {
 					if ( is_dir( $subdir . '/' . $theme_dir) && is_readable($subdir . '/' . $theme_dir) ) {
 						if ( $theme_dir{0} == '.' || $theme_dir == '..' || $theme_dir == 'CVS' )
 							continue;
-						$stylish_dir = @ dir($subdir . '/' . $theme_dir);
+						$stylish_dir = @ opendir($subdir . '/' . $theme_dir);
 						$found_stylesheet = false;
-						while ( ($theme_file = $stylish_dir->read()) !== false ) {
+						while ( ($theme_file = readdir($stylish_dir)) !== false ) {
 							if ( $theme_file == 'style.css' ) {
 								$theme_files[] = $subdir_name . '/' . $theme_dir . '/' . $theme_file;
 								$found_stylesheet = true;
 								break;
 							}
 						}
+						@closedir($stylish_dir);
 					}
 				}
+				@closedir($theme_subdir);
 				$wp_broken_themes[$theme_dir] = array('Name' => $theme_dir, 'Title' => $theme_dir, 'Description' => __('Stylesheet is missing.'));
 			}
 		}
 	}
+	if ( is_dir( $theme_dir ) )
+		@closedir( $theme_dir );
 
 	if ( !$themes_dir || !$theme_files )
 		return $themes;
@@ -189,7 +224,7 @@
 		if ( !file_exists("$theme_root/$template/index.php") ) {
 			$parent_dir = dirname(dirname($theme_file));
 			if ( file_exists("$theme_root/$parent_dir/$template/index.php") ) {
-				$template = "$parent_dir/$template"; 
+				$template = "$parent_dir/$template";
 			} else {
 				$wp_broken_themes[$name] = array('Name' => $name, 'Title' => $title, 'Description' => __('Template is missing.'));
 				continue;
@@ -240,7 +275,7 @@
 			}
 		}
 
-		$themes[$name] = array('Name' => $name, 'Title' => $title, 'Description' => $description, 'Author' => $author, 'Version' => $version, 'Template' => $template, 'Stylesheet' => $stylesheet, 'Template Files' => $template_files, 'Stylesheet Files' => $stylesheet_files, 'Template Dir' => $template_dir, 'Stylesheet Dir' => $stylesheet_dir, 'Status' => $theme_data['Status'], 'Screenshot' => $screenshot);
+		$themes[$name] = array('Name' => $name, 'Title' => $title, 'Description' => $description, 'Author' => $author, 'Version' => $version, 'Template' => $template, 'Stylesheet' => $stylesheet, 'Template Files' => $template_files, 'Stylesheet Files' => $stylesheet_files, 'Template Dir' => $template_dir, 'Stylesheet Dir' => $stylesheet_dir, 'Status' => $theme_data['Status'], 'Screenshot' => $screenshot, 'Tags' => $theme_data['Tags']);
 	}
 
 	// Resolve theme dependencies.
@@ -273,6 +308,9 @@
 }
 
 function get_current_theme() {
+	if ( $theme = get_option('current_theme') )
+		return $theme;
+
 	$themes = get_themes();
 	$theme_names = array_keys($themes);
 	$current_template = get_option('template');
@@ -289,6 +327,8 @@
 		}
 	}
 
+	update_option('current_theme', $current_theme);
+
 	return $current_theme;
 }
 
@@ -302,6 +342,7 @@
 
 function get_query_template($type) {
 	$template = '';
+	$type = preg_replace( '|[^a-z0-9-]+|', '', $type );
 	if ( file_exists(TEMPLATEPATH . "/{$type}.php") )
 		$template = TEMPLATEPATH . "/{$type}.php";
 
@@ -330,6 +371,30 @@
 	return apply_filters('category_template', $template);
 }
 
+function get_tag_template() {
+	$template = '';
+	if ( file_exists(TEMPLATEPATH . "/tag-" . get_query_var('tag') . '.php') )
+		$template = TEMPLATEPATH . "/tag-" . get_query_var('tag') . '.php';
+	elseif ( file_exists(TEMPLATEPATH . "/tag.php") )
+		$template = TEMPLATEPATH . "/tag.php";
+
+	return apply_filters('tag_template', $template);
+}
+
+function get_taxonomy_template() {
+	$template = '';
+	$taxonomy = get_query_var('taxonomy');
+	$term = get_query_var('term');
+	if ( $taxonomy && $term && file_exists(TEMPLATEPATH . "/taxonomy-$taxonomy-$term.php") )
+		$template = TEMPLATEPATH . "/taxonomy-$taxonomy-$term.php";
+	elseif ( $taxonomy && file_exists(TEMPLATEPATH . "/taxonomy-$taxonomy.php") )
+		$template = TEMPLATEPATH . "/taxonomy-$taxonomy.php";
+	elseif ( file_exists(TEMPLATEPATH . "/taxonomy.php") )
+		$template = TEMPLATEPATH . "/taxonomy.php";
+
+	return apply_filters('taxonomy_template', $template);
+}
+
 function get_date_template() {
 	return get_query_template('date');
 }
@@ -399,8 +464,7 @@
 }
 
 function load_template($_template_file) {
-	global $posts, $post, $wp_did_header, $wp_did_template_redirect, $wp_query,
-		$wp_rewrite, $wpdb, $wp_version, $wp, $id, $comment;
+	global $posts, $post, $wp_did_header, $wp_did_template_redirect, $wp_query, $wp_rewrite, $wpdb, $wp_version, $wp, $id, $comment, $user_ID;
 
 	if ( is_array($wp_query->query_vars) )
 		extract($wp_query->query_vars, EXTR_SKIP);
@@ -415,22 +479,26 @@
 	echo '<link rel="stylesheet" href="' . $stylesheet . '" type="text/css" media="screen" />';
 }
 
+function switch_theme($template, $stylesheet) {
+	update_option('template', $template);
+	update_option('stylesheet', $stylesheet);
+	delete_option('current_theme');
+	$theme = get_current_theme();
+	do_action('switch_theme', $theme);
+}
+
 function validate_current_theme() {
 	// Don't validate during an install/upgrade.
 	if ( defined('WP_INSTALLING') )
 		return true;
 
 	if ( get_template() != 'default' && !file_exists(get_template_directory() . '/index.php') ) {
-		update_option('template', 'default');
-		update_option('stylesheet', 'default');
-		do_action('switch_theme', 'Default');
+		switch_theme('default', 'default');
 		return false;
 	}
 
 	if ( get_stylesheet() != 'default' && !file_exists(get_template_directory() . '/style.css') ) {
-		update_option('template', 'default');
-		update_option('stylesheet', 'default');
-		do_action('switch_theme', 'Default');
+		switch_theme('default', 'default');
 		return false;
 	}
 
@@ -445,7 +513,7 @@
 	if ( isset($mods[$name]) )
 		return apply_filters( "theme_mod_$name", $mods[$name] );
 
-	return apply_filters( "theme_mod_$name", sprintf($default, get_template_directory_uri()) );
+	return apply_filters( "theme_mod_$name", sprintf($default, get_template_directory_uri(), get_stylesheet_directory_uri()) );
 }
 
 function set_theme_mod($name, $value) {
diff -x .svn -aruN 2.2.2.src/wp-includes/update.php 2.5.src/wp-includes/update.php
--- 2.2.2.src/wp-includes/update.php	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/update.php	2008-03-11 11:13:07.000000000 -0500
@@ -0,0 +1,75 @@
+<?php
+/**
+ * A simple set of functions to check our version 1.0 update service
+ *
+ * @package WordPress
+ * @since 2.3
+ */
+
+/**
+ * wp_version_check() - Check WordPress version against the newest version.
+ *
+ * The WordPress version, PHP version, and Locale is sent. Checks against the WordPress server at
+ * api.wordpress.org server. Will only check if PHP has fsockopen enabled and WordPress isn't installing.
+ *
+ * @package WordPress
+ * @since 2.3
+ * @uses $wp_version Used to check against the newest WordPress version.
+ *
+ * @return mixed Returns null if update is unsupported. Returns false if check is too soon.
+ */
+function wp_version_check() {
+	if ( !function_exists('fsockopen') || strpos($_SERVER['PHP_SELF'], 'install.php') !== false || defined('WP_INSTALLING') )
+		return;
+
+	global $wp_version;
+	$php_version = phpversion();
+
+	$current = get_option( 'update_core' );
+	$locale = get_locale();
+
+	if (
+		isset( $current->last_checked ) &&
+		43200 > ( time() - $current->last_checked ) &&
+		$current->version_checked == $wp_version
+	)
+		return false;
+
+	$new_option = '';
+	$new_option->last_checked = time(); // this gets set whether we get a response or not, so if something is down or misconfigured it won't delay the page load for more than 3 seconds, twice a day
+	$new_option->version_checked = $wp_version;
+
+	$http_request  = "GET /core/version-check/1.1/?version=$wp_version&php=$php_version&locale=$locale HTTP/1.0\r\n";
+	$http_request .= "Host: api.wordpress.org\r\n";
+	$http_request .= 'Content-Type: application/x-www-form-urlencoded; charset=' . get_option('blog_charset') . "\r\n";
+	$http_request .= 'User-Agent: WordPress/' . $wp_version . '; ' . get_bloginfo('url') . "\r\n";
+	$http_request .= "\r\n";
+
+	$response = '';
+	if ( false !== ( $fs = @fsockopen( 'api.wordpress.org', 80, $errno, $errstr, 3 ) ) && is_resource($fs) ) {
+		fwrite( $fs, $http_request );
+		while ( !feof( $fs ) )
+			$response .= fgets( $fs, 1160 ); // One TCP-IP packet
+		fclose( $fs );
+
+		$response = explode("\r\n\r\n", $response, 2);
+		if ( !preg_match( '|HTTP/.*? 200|', $response[0] ) )
+			return false;
+
+		$body = trim( $response[1] );
+		$body = str_replace(array("\r\n", "\r"), "\n", $body);
+
+		$returns = explode("\n", $body);
+
+		$new_option->response = attribute_escape( $returns[0] );
+		if ( isset( $returns[1] ) )
+			$new_option->url = clean_url( $returns[1] );
+		if ( isset( $returns[2] ) )
+			$new_option->current = attribute_escape( $returns[2] );
+	}
+	update_option( 'update_core', $new_option );
+}
+
+add_action( 'init', 'wp_version_check' );
+
+?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/user.php 2.5.src/wp-includes/user.php
--- 2.2.2.src/wp-includes/user.php	2007-04-06 09:53:46.000000000 -0500
+++ 2.5.src/wp-includes/user.php	2008-03-12 17:21:14.000000000 -0500
@@ -1,5 +1,58 @@
 <?php
 
+function wp_signon( $credentials = '' ) {
+	if ( empty($credentials) ) {
+		if ( ! empty($_POST['log']) )
+			$credentials['user_login'] = $_POST['log'];
+		if ( ! empty($_POST['pwd']) )
+			$credentials['user_password'] = $_POST['pwd'];
+		if ( ! empty($_POST['rememberme']) )
+			$credentials['remember'] = $_POST['rememberme'];
+	}
+
+	if ( !empty($credentials['user_login']) )
+		$credentials['user_login'] = sanitize_user($credentials['user_login']);
+	if ( !empty($credentials['user_password']) )
+		$credentials['user_password'] = trim($credentials['user_password']);
+	if ( !empty($credentials['remember']) )
+		$credentials['remember'] = true;
+	else
+		$credentials['remember'] = false;
+
+	// If no credential info provided, check cookie.
+	if ( empty($credentials['user_login']) && empty($credentials['user_password']) ) {
+			$user = wp_validate_auth_cookie();
+			if ( $user )
+				return new WP_User($user);
+
+			if ( !empty($_COOKIE[AUTH_COOKIE]) )
+				return new WP_Error('expired_session', __('Please log in again.'));
+
+			// If the cookie is not set, be silent.
+			return new WP_Error();
+	}
+
+	if ( empty($credentials['user_login']) || empty($credentials['user_password']) ) {
+		$error = new WP_Error();
+
+		if ( empty($credentials['user_login']) )
+			$error->add('empty_username', __('<strong>ERROR</strong>: The username field is empty.'));
+		if ( empty($credentials['user_password']) )
+			$error->add('empty_password', __('<strong>ERROR</strong>: The password field is empty.'));
+		return $error;
+	}
+
+	do_action_ref_array('wp_authenticate', array(&$credentials['user_login'], &$credentials['user_password']));
+
+	$user = wp_authenticate($credentials['user_login'], $credentials['user_password']);
+	if ( is_wp_error($user) )
+		return $user;
+
+	wp_set_auth_cookie($user->ID, $credentials['remember']);
+	do_action('wp_login', $credentials['user_login']);
+	return $user;
+}
+
 function get_profile($field, $user = false) {
 	global $wpdb;
 	if ( !$user )
@@ -15,13 +68,11 @@
 
 // TODO: xmlrpc only.  Maybe move to xmlrpc.php.
 function user_pass_ok($user_login,$user_pass) {
-	global $cache_userdata;
-	if ( empty($cache_userdata[$user_login]) ) {
-		$userdata = get_userdatabylogin($user_login);
-	} else {
-		$userdata = $cache_userdata[$user_login];
-	}
-	return (md5($user_pass) == $userdata->user_pass);
+	$user = wp_authenticate($user_login, $user_pass);
+	if ( is_wp_error($user) )
+		return false;
+
+	return true;
 }
 
 //
@@ -31,17 +82,20 @@
 function get_user_option( $option, $user = 0 ) {
 	global $wpdb;
 
+	$option = preg_replace('|[^a-z0-9_]|i', '', $option);
 	if ( empty($user) )
 		$user = wp_get_current_user();
 	else
 		$user = get_userdata($user);
 
 	if ( isset( $user->{$wpdb->prefix . $option} ) ) // Blog specific
-		return $user->{$wpdb->prefix . $option};
+		$result = $user->{$wpdb->prefix . $option};
 	elseif ( isset( $user->{$option} ) ) // User specific and cross-blog
-		return $user->{$option};
+		$result = $user->{$option};
 	else // Blog global
-		return get_option( $option );
+		$result = get_option( $option );
+	
+	return apply_filters("get_user_option_{$option}", $result, $option, $user);
 }
 
 function update_user_option( $user_id, $option_name, $newvalue, $global = false ) {
@@ -80,9 +134,7 @@
 	else
 		$wpdb->query("DELETE FROM $wpdb->usermeta WHERE user_id = '$user_id' AND meta_key = '$meta_key'");
 
-	$user = get_userdata($user_id);
 	wp_cache_delete($user_id, 'users');
-	wp_cache_delete($user->user_login, 'userlogins');
 
 	return true;
 }
@@ -91,6 +143,9 @@
 	global $wpdb;
 	$user_id = (int) $user_id;
 
+	if ( !$user_id )
+		return false;
+
 	if ( !empty($meta_key) ) {
 		$meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key);
 		$metas = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->usermeta WHERE user_id = '$user_id' AND meta_key = '$meta_key'");
@@ -105,13 +160,8 @@
 			return '';
 	}
 
-	foreach ($metas as $index => $meta) {
-		@ $value = unserialize($meta->meta_value);
-		if ( $value === FALSE )
-			$value = $meta->meta_value;
-
-		$values[] = $value;
-	}
+	foreach ($metas as $meta)
+		$values[] = maybe_unserialize($meta->meta_value);
 
 	if ( count($values) == 1 )
 		return $values[0];
@@ -146,9 +196,7 @@
 		return false;
 	}
 
-	$user = get_userdata($user_id);
 	wp_cache_delete($user_id, 'users');
-	wp_cache_delete($user->user_login, 'userlogins');
 
 	return true;
 }
@@ -171,7 +219,7 @@
 
 	$userdata = $user->data;
 	$user_login	= $user->user_login;
-	$user_level	= (int) $user->user_level;
+	$user_level	= (int) isset($user->user_level) ? $user->user_level : 0;
 	$user_ID	= (int) $user->ID;
 	$user_email	= $user->user_email;
 	$user_url	= $user->user_url;
@@ -179,4 +227,100 @@
 	$user_identity	= $user->display_name;
 }
 
+function wp_dropdown_users( $args = '' ) {
+	global $wpdb;
+	$defaults = array(
+		'show_option_all' => '', 'show_option_none' => '',
+		'orderby' => 'display_name', 'order' => 'ASC',
+		'include' => '', 'exclude' => '',
+		'show' => 'display_name', 'echo' => 1,
+		'selected' => 0, 'name' => 'user', 'class' => ''
+	);
+
+	$defaults['selected'] = is_author() ? get_query_var( 'author' ) : 0;
+
+	$r = wp_parse_args( $args, $defaults );
+	extract( $r, EXTR_SKIP );
+
+	$query = "SELECT * FROM $wpdb->users";
+
+	$query_where = array();
+
+	if ( is_array($include) )
+		$include = join(',', $include);
+	$include = preg_replace('/[^0-9,]/', '', $include); // (int)
+	if ( $include )
+		$query_where[] = "ID IN ($include)";
+
+	if ( is_array($exclude) )
+		$exclude = join(',', $exclude);
+	$exclude = preg_replace('/[^0-9,]/', '', $exclude); // (int)
+	if ( $exclude )
+		$query_where[] = "ID NOT IN ($exclude)";
+
+	if ( $query_where )
+		$query .= " WHERE " . join(' AND', $query_where);
+
+	$query .= " ORDER BY $orderby $order";
+
+	$users = $wpdb->get_results( $query );
+
+	$output = '';
+	if ( !empty($users) ) {
+		$output = "<select name='$name' id='$name' class='$class'>\n";
+
+		if ( $show_option_all )
+			$output .= "\t<option value='0'>$show_option_all</option>\n";
+
+		if ( $show_option_none )
+			$output .= "\t<option value='-1'>$show_option_none</option>\n";
+
+		foreach ( $users as $user ) {
+			$user->ID = (int) $user->ID;
+			$_selected = $user->ID == $selected ? " selected='selected'" : '';
+			$output .= "\t<option value='$user->ID'$_selected>" . wp_specialchars($user->$show) . "</option>\n";
+		}
+
+		$output .= "</select>";
+	}
+
+	$output = apply_filters('wp_dropdown_users', $output);
+
+	if ( $echo )
+		echo $output;
+
+	return $output;
+}
+
+function _fill_user( &$user ) {
+	global $wpdb;
+
+	$show = $wpdb->hide_errors();
+	$metavalues = $wpdb->get_results($wpdb->prepare("SELECT meta_key, meta_value FROM $wpdb->usermeta WHERE user_id = %d", $user->ID));
+	$wpdb->show_errors($show);
+
+	if ( $metavalues ) {
+		foreach ( $metavalues as $meta ) {
+			$value = maybe_unserialize($meta->meta_value);
+			$user->{$meta->meta_key} = $value;
+		}
+	}
+
+	$level = $wpdb->prefix . 'user_level';
+	if ( isset( $user->{$level} ) )
+		$user->user_level = $user->{$level};
+
+	// For backwards compat.
+	if ( isset($user->first_name) )
+		$user->user_firstname = $user->first_name;
+	if ( isset($user->last_name) )
+		$user->user_lastname = $user->last_name;
+	if ( isset($user->description) )
+		$user->user_description = $user->description;
+
+	wp_cache_add($user->ID, $user, 'users');
+	wp_cache_add($user->user_login, $user->ID, 'userlogins');
+	wp_cache_add($user->user_email, $user->ID, 'useremail');
+}
+
 ?>
diff -x .svn -aruN 2.2.2.src/wp-includes/vars.php 2.5.src/wp-includes/vars.php
--- 2.2.2.src/wp-includes/vars.php	2007-03-19 22:18:44.000000000 -0500
+++ 2.5.src/wp-includes/vars.php	2008-01-04 14:05:07.000000000 -0600
@@ -1,15 +1,36 @@
 <?php
+/**
+ * Creates common globals for the rest of WordPress
+ *
+ * Sets $pagenow global which is the current page. Checks
+ * for the browser to set which one is currently being used.
+ *
+ * Detects which user environment WordPress is being used on.
+ * Only attempts to check for Apache and IIS. Two web servers
+ * with known permalink capability.
+ *
+ * @package WordPress
+ */
 
 // On which page are we ?
-if ( preg_match('#([^/]+\.php)$#', $PHP_SELF, $self_matches) ) {
+if ( is_admin() ) {
+	// wp-admin pages are checked more carefully
+	preg_match('#/wp-admin/?(.*?)$#i', $PHP_SELF, $self_matches);
 	$pagenow = $self_matches[1];
-} elseif ( strpos($PHP_SELF, '?') !== false ) {
-	$pagenow = explode('/', $PHP_SELF);
-	$pagenow = trim($pagenow[(sizeof($pagenow)-1)]);
-	$pagenow = explode('?', $pagenow);
-	$pagenow = $pagenow[0];
+	$pagenow = preg_replace('#\?.*?$#', '', $pagenow);
+	if ( '' === $pagenow || 'index' === $pagenow || 'index.php' === $pagenow ) {
+		$pagenow = 'index.php';
+	} else {
+		preg_match('#(.*?)(/|$)#', $pagenow, $self_matches);
+		$pagenow = strtolower($self_matches[1]);
+		if ( '.php' !== substr($pagenow, -4, 4) )
+			$pagenow .= '.php'; // for Options +Multiviews: /wp-admin/themes/index.php (themes.php is queried)
+	}
 } else {
-	$pagenow = 'index.php';
+	if ( preg_match('#([^/]+\.php)([?/].*?)?$#i', $PHP_SELF, $self_matches) )
+		$pagenow = strtolower($self_matches[1]);
+	else
+		$pagenow = 'index.php';
 }
 
 // Simple browser detection
@@ -32,7 +53,17 @@
 $is_IE = ( $is_macIE || $is_winIE );
 
 // Server detection
+
+/**
+ * Whether the server software is Apache or something else
+ * @global bool $is_apache
+ */
 $is_apache = ((strpos($_SERVER['SERVER_SOFTWARE'], 'Apache') !== false) || (strpos($_SERVER['SERVER_SOFTWARE'], 'LiteSpeed') !== false)) ? true : false;
+
+/**
+ * Whether the server software is IIS or something else
+ * @global bool $is_IIS
+ */
 $is_IIS = (strpos($_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS') !== false) ? true : false;
 
 ?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-includes/version.php 2.5.src/wp-includes/version.php
--- 2.2.2.src/wp-includes/version.php	2007-08-05 00:39:35.000000000 -0500
+++ 2.5.src/wp-includes/version.php	2008-03-29 09:39:28.000000000 -0500
@@ -1,8 +1,21 @@
 <?php
+/**
+ * This holds the version number in a separate file so we can bump it without cluttering the SVN
+ */
 
-// This holds the version number in a separate file so we can bump it without cluttering the SVN
+/**
+ * The WordPress version string
+ *
+ * @global string $wp_version
+ */
+$wp_version = '2.5';
 
-$wp_version = '2.2.2';
-$wp_db_version = 5183;
+/**
+ * Holds the WordPress DB revision, increments when changes are made to the WordPress DB scheme
+ * changes.
+ *
+ * @global int $wp_db_version
+ */
+$wp_db_version = 7558;
 
 ?>
diff -x .svn -aruN 2.2.2.src/wp-includes/widgets.php 2.5.src/wp-includes/widgets.php
--- 2.2.2.src/wp-includes/widgets.php	2007-07-30 11:23:45.000000000 -0500
+++ 2.5.src/wp-includes/widgets.php	2008-03-27 03:09:06.000000000 -0500
@@ -2,34 +2,41 @@
 
 /* Global Variables */
 
-global $wp_registered_sidebars, $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_widget_styles, $wp_registered_widget_defaults;
+global $wp_registered_sidebars, $wp_registered_widgets, $wp_registered_widget_controls;
 
 $wp_registered_sidebars = array();
 $wp_registered_widgets = array();
 $wp_registered_widget_controls = array();
-$wp_registered_widget_styles = array();
-$wp_register_widget_defaults = false;
 
 /* Template tags & API functions */
 
 function register_sidebars($number = 1, $args = array()) {
+	global $wp_registered_sidebars;
 	$number = (int) $number;
 
 	if ( is_string($args) )
 		parse_str($args, $args);
 
-	$i = 1;
-
-	while ( $i <= $number ) {
+	for ( $i=1; $i <= $number; $i++ ) {
 		$_args = $args;
+
 		if ( $number > 1 ) {
-			$_args['name'] = isset($args['name']) ? $args['name'] : sprintf(__('Sidebar %d'), $i);
+			$_args['name'] = isset($args['name']) ? sprintf($args['name'], $i) : sprintf(__('Sidebar %d'), $i);
 		} else {
 			$_args['name'] = isset($args['name']) ? $args['name'] : __('Sidebar');
 		}
-		$_args['id'] = isset($args['id']) ? $args['id'] : "sidebar-$i";
+
+		if (isset($args['id'])) {
+			$_args['id'] = $args['id'];
+		} else {
+			$n = count($wp_registered_sidebars);
+			do {
+				$n++;
+				$_args['id'] = "sidebar-$n";
+			} while (isset($wp_registered_sidebars[$_args['id']]));
+		}
+
 		register_sidebar($_args);
-		++$i;
 	}
 }
 
@@ -59,7 +66,7 @@
 
 function unregister_sidebar( $name ) {
 	global $wp_registered_sidebars;
-		
+
 	if ( isset( $wp_registered_sidebars[$name] ) )
 		unset( $wp_registered_sidebars[$name] );
 }
@@ -86,10 +93,7 @@
 }
 
 function wp_register_sidebar_widget($id, $name, $output_callback, $options = array()) {
-
-	global $wp_registered_widgets, $wp_register_widget_defaults;
-
-	$id = sanitize_title($id);
+	global $wp_registered_widgets;
 
 	if ( empty($output_callback) ) {
 		unset($wp_registered_widgets[$id]);
@@ -106,10 +110,20 @@
 	);
 	$widget = array_merge($widget, $options);
 
-	if ( is_callable($output_callback) && ( !isset($wp_registered_widgets[$id]) || !$wp_register_widget_defaults) )
+	if ( is_callable($output_callback) && ( !isset($wp_registered_widgets[$id]) || did_action( 'widgets_init' ) ) )
 		$wp_registered_widgets[$id] = $widget;
 }
 
+function wp_widget_description( $id ) {
+	if ( !is_scalar($id) )
+		return;
+
+	global $wp_registered_widgets;
+
+	if ( isset($wp_registered_widgets[$id]['description']) )
+		return wp_specialchars( $wp_registered_widgets[$id]['description'] );
+}
+
 function unregister_sidebar_widget($id) {
 	return wp_unregister_sidebar_widget($id);
 }
@@ -142,25 +156,27 @@
 	call_user_func_array('wp_register_widget_control', $args);
 }
 
+/* $options: height, width, id_base
+ *   height: never used
+ *   width:  width of fully expanded control form.  Try hard to use the default width.
+ *   id_base: for multi-widgets (widgets which allow multiple instances such as the text widget), an id_base must be provided.
+ *            the widget id will ennd up looking like {$id_base}-{$unique_number}
+ */
 function wp_register_widget_control($id, $name, $control_callback, $options = array()) {
-	global $wp_registered_widget_controls, $wp_register_widget_defaults;
-
-	$id = sanitize_title($id);
+	global $wp_registered_widget_controls;
 
 	if ( empty($control_callback) ) {
 		unset($wp_registered_widget_controls[$id]);
 		return;
 	}
 
-	if ( isset($wp_registered_widget_controls[$id]) && $wp_register_widget_defaults )
+	if ( isset($wp_registered_widget_controls[$id]) && !did_action( 'widgets_init' ) )
 		return;
 
-	$defaults = array('width' => 300, 'height' => 200);
+	$defaults = array('width' => 250, 'height' => 200 ); // height is never used
 	$options = wp_parse_args($options, $defaults);
 	$options['width'] = (int) $options['width'];
 	$options['height'] = (int) $options['height'];
-	$options['width'] = $options['width'] > 90 ? $options['width'] + 60 : 360;
-	$options['height'] = $options['height'] > 60 ? $options['height'] + 40 : 240;
 
 	$widget = array(
 		'name' => $name,
@@ -198,19 +214,32 @@
 
 	$sidebars_widgets = wp_get_sidebars_widgets();
 
-	if ( empty($wp_registered_sidebars[$index]) || !is_array($sidebars_widgets[$index]) || empty($sidebars_widgets[$index]) )
+	if ( empty($wp_registered_sidebars[$index]) || !array_key_exists($index, $sidebars_widgets) || !is_array($sidebars_widgets[$index]) || empty($sidebars_widgets[$index]) )
 		return false;
 
 	$sidebar = $wp_registered_sidebars[$index];
 
 	$did_one = false;
 	foreach ( $sidebars_widgets[$index] as $id ) {
-		$callback = $wp_registered_widgets[$id]['callback'];
-
-		$params = array_merge(array($sidebar), (array) $wp_registered_widgets[$id]['params']);
+		$params = array_merge(
+			array( array_merge( $sidebar, array('widget_id' => $id, 'widget_name' => $wp_registered_widgets[$id]['name']) ) ),
+			(array) $wp_registered_widgets[$id]['params']
+		);
 
 		// Substitute HTML id and class attributes into before_widget
-		$params[0]['before_widget'] = sprintf($params[0]['before_widget'], $id, $wp_registered_widgets[$id]['classname']);
+		$classname_ = '';
+		foreach ( (array) $wp_registered_widgets[$id]['classname'] as $cn ) {
+			if ( is_string($cn) )
+				$classname_ .= '_' . $cn;
+			elseif ( is_object($cn) )
+				$classname_ .= '_' . get_class($cn);
+		}
+		$classname_ = ltrim($classname_, '_');
+		$params[0]['before_widget'] = sprintf($params[0]['before_widget'], $id, $classname_);
+
+		$params = apply_filters( 'dynamic_sidebar_params', $params );
+
+		$callback = $wp_registered_widgets[$id]['callback'];
 
 		if ( is_callable($callback) ) {
 			call_user_func_array($callback, $params);
@@ -221,15 +250,19 @@
 	return $did_one;
 }
 
-function is_active_widget($callback) {
+/* @return mixed false if widget is not active or id of sidebar in which the widget is active
+ */
+function is_active_widget($callback, $widget_id = false) {
 	global $wp_registered_widgets;
 
 	$sidebars_widgets = wp_get_sidebars_widgets(false);
 
 	if ( is_array($sidebars_widgets) ) foreach ( $sidebars_widgets as $sidebar => $widgets )
 		if ( is_array($widgets) ) foreach ( $widgets as $widget )
-			if ( $wp_registered_widgets[$widget]['callback'] == $callback )
-				return true;
+			if ( isset($wp_registered_widgets[$widget]['callback']) && $wp_registered_widgets[$widget]['callback'] == $callback )
+				if ( !$widget_id || $widget_id == $wp_registered_widgets[$widget]['id'] )
+					return $sidebar;
+
 
 	return false;
 }
@@ -329,17 +362,17 @@
 function wp_widget_pages( $args ) {
 	extract( $args );
 	$options = get_option( 'widget_pages' );
-	
+
 	$title = empty( $options['title'] ) ? __( 'Pages' ) : $options['title'];
 	$sortby = empty( $options['sortby'] ) ? 'menu_order' : $options['sortby'];
-	$exclude = empty( $options['exclude'] ) ? '' : '&exclude=' . $options['exclude'];
-	
+	$exclude = empty( $options['exclude'] ) ? '' : $options['exclude'];
+
 	if ( $sortby == 'menu_order' ) {
 		$sortby = 'menu_order, post_title';
 	}
-	
-	$out = wp_list_pages( 'title_li=&echo=0&sort_column=' . $sortby . $exclude );
-	
+
+	$out = wp_list_pages( array('title_li' => '', 'echo' => 0, 'sort_column' => $sortby, 'exclude' => $exclude) );
+
 	if ( !empty( $out ) ) {
 ?>
 	<?php echo $before_widget; ?>
@@ -356,15 +389,15 @@
 	$options = $newoptions = get_option('widget_pages');
 	if ( $_POST['pages-submit'] ) {
 		$newoptions['title'] = strip_tags(stripslashes($_POST['pages-title']));
-		
+
 		$sortby = stripslashes( $_POST['pages-sortby'] );
-		
+
 		if ( in_array( $sortby, array( 'post_title', 'menu_order', 'ID' ) ) ) {
 			$newoptions['sortby'] = $sortby;
 		} else {
 			$newoptions['sortby'] = 'menu_order';
 		}
-		
+
 		$newoptions['exclude'] = strip_tags( stripslashes( $_POST['pages-exclude'] ) );
 	}
 	if ( $options != $newoptions ) {
@@ -374,32 +407,32 @@
 	$title = attribute_escape($options['title']);
 	$exclude = attribute_escape( $options['exclude'] );
 ?>
-			<p><label for="pages-title"><?php _e('Title:'); ?> <input style="width: 250px;" id="pages-title" name="pages-title" type="text" value="<?php echo $title; ?>" /></label></p>
-			<p><label for="pages-sortby"><?php _e( 'Sort by:' ); ?> 
-				<select name="pages-sortby" id="pages-sortby">
+		<p><label for="pages-title"><?php _e('Title:'); ?> <input class="widefat" id="pages-title" name="pages-title" type="text" value="<?php echo $title; ?>" /></label></p>
+		<p>
+			<label for="pages-sortby"><?php _e( 'Sort by:' ); ?>
+				<select name="pages-sortby" id="pages-sortby" class="widefat">
 					<option value="post_title"<?php selected( $options['sortby'], 'post_title' ); ?>><?php _e('Page title'); ?></option>
 					<option value="menu_order"<?php selected( $options['sortby'], 'menu_order' ); ?>><?php _e('Page order'); ?></option>
 					<option value="ID"<?php selected( $options['sortby'], 'ID' ); ?>><?php _e( 'Page ID' ); ?></option>
-				</select></label></p>
-			<p><label for="pages-exclude"><?php _e( 'Exclude:' ); ?> <input type="text" value="<?php echo $exclude; ?>" name="pages-exclude" id="pages-exclude" style="width: 180px;" /></label><br />
-			<small><?php _e( 'Page IDs, separated by commas.' ); ?></small></p>
-			<input type="hidden" id="pages-submit" name="pages-submit" value="1" />
+				</select>
+			</label>
+		</p>
+		<p>
+			<label for="pages-exclude"><?php _e( 'Exclude:' ); ?> <input type="text" value="<?php echo $exclude; ?>" name="pages-exclude" id="pages-exclude" class="widefat" /></label>
+			<br />
+			<small><?php _e( 'Page IDs, separated by commas.' ); ?></small>
+		</p>
+		<input type="hidden" id="pages-submit" name="pages-submit" value="1" />
 <?php
 }
 
 function wp_widget_links($args) {
-	global $wp_db_version;
 	extract($args, EXTR_SKIP);
-	if ( $wp_db_version < 3582 ) {
-		// This ONLY works with li/h2 sidebars.
-		get_links_list();
-	} else {
-		wp_list_bookmarks(array(
-			'title_before' => $before_title, 'title_after' => $after_title, 
-			'category_before' => $before_widget, 'category_after' => $after_widget, 
-			'show_images' => true, 'class' => 'linkcat widget'
-		));
-	}
+	wp_list_bookmarks(array(
+		'title_before' => $before_title, 'title_after' => $after_title,
+		'category_before' => $before_widget, 'category_after' => $after_widget,
+		'show_images' => true, 'class' => 'linkcat widget'
+	));
 }
 
 function wp_widget_search($args) {
@@ -423,14 +456,14 @@
 	$d = $options['dropdown'] ? '1' : '0';
 	$title = empty($options['title']) ? __('Archives') : $options['title'];
 
-	echo $before_widget; 
+	echo $before_widget;
 	echo $before_title . $title . $after_title;
 
-	if($d) { 
+	if($d) {
 ?>
-		<select name="archive-dropdown" onChange='document.location.href=this.options[this.selectedIndex].value;'> <option value=""><?php echo attribute_escape(__('Select Month')); ?></option> <?php wp_get_archives("type=monthly&format=option&show_post_count=$c"); ?> </select>
-<?php	
-	} else { 
+		<select name="archive-dropdown" onchange='document.location.href=this.options[this.selectedIndex].value;'> <option value=""><?php echo attribute_escape(__('Select Month')); ?></option> <?php wp_get_archives("type=monthly&format=option&show_post_count=$c"); ?> </select>
+<?php
+	} else {
 ?>
 		<ul>
 		<?php wp_get_archives("type=monthly&show_post_count=$c"); ?>
@@ -438,7 +471,7 @@
 <?php
 	}
 
-	echo $after_widget; 
+	echo $after_widget;
 }
 
 function wp_widget_archives_control() {
@@ -456,9 +489,12 @@
 	$dropdown = $options['dropdown'] ? 'checked="checked"' : '';
 	$title = attribute_escape($options['title']);
 ?>
-			<p><label for="archives-title"><?php _e('Title:'); ?> <input style="width: 250px;" id="archives-title" name="archives-title" type="text" value="<?php echo $title; ?>" /></label></p>
-			<p style="text-align:right;margin-right:40px;"><label for="archives-count"><?php _e('Show post counts'); ?> <input class="checkbox" type="checkbox" <?php echo $count; ?> id="archives-count" name="archives-count" /></label></p>
-			<p style="text-align:right;margin-right:40px;"><label for="archives-dropdown"><?php _e('Display as a drop down'); ?> <input class="checkbox" type="checkbox" <?php echo $dropdown; ?> id="archives-dropdown" name="archives-dropdown" /></label></p>
+			<p><label for="archives-title"><?php _e('Title:'); ?> <input class="widefat" id="archives-title" name="archives-title" type="text" value="<?php echo $title; ?>" /></label></p>
+			<p>
+				<label for="archives-count"><input class="checkbox" type="checkbox" <?php echo $count; ?> id="archives-count" name="archives-count" /> <?php _e('Show post counts'); ?></label>
+				<br />
+				<label for="archives-dropdown"><input class="checkbox" type="checkbox" <?php echo $dropdown; ?> id="archives-dropdown" name="archives-dropdown" /> <?php _e('Display as a drop down'); ?></label>
+			</p>
 			<input type="hidden" id="archives-submit" name="archives-submit" value="1" />
 <?php
 }
@@ -492,7 +528,7 @@
 	}
 	$title = attribute_escape($options['title']);
 ?>
-			<p><label for="meta-title"><?php _e('Title:'); ?> <input style="width: 250px;" id="meta-title" name="meta-title" type="text" value="<?php echo $title; ?>" /></label></p>
+			<p><label for="meta-title"><?php _e('Title:'); ?> <input class="widefat" id="meta-title" name="meta-title" type="text" value="<?php echo $title; ?>" /></label></p>
 			<input type="hidden" id="meta-submit" name="meta-submit" value="1" />
 <?php
 }
@@ -520,14 +556,23 @@
 	}
 	$title = attribute_escape($options['title']);
 ?>
-			<p><label for="calendar-title"><?php _e('Title:'); ?> <input style="width: 250px;" id="calendar-title" name="calendar-title" type="text" value="<?php echo $title; ?>" /></label></p>
+			<p><label for="calendar-title"><?php _e('Title:'); ?> <input class="widefat" id="calendar-title" name="calendar-title" type="text" value="<?php echo $title; ?>" /></label></p>
 			<input type="hidden" id="calendar-submit" name="calendar-submit" value="1" />
 <?php
 }
 
-function wp_widget_text($args, $number = 1) {
-	extract($args);
+// See large comment section at end of this file
+function wp_widget_text($args, $widget_args = 1) {
+	extract( $args, EXTR_SKIP );
+	if ( is_numeric($widget_args) )
+		$widget_args = array( 'number' => $widget_args );
+	$widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) );
+	extract( $widget_args, EXTR_SKIP );
+
 	$options = get_option('widget_text');
+	if ( !isset($options[$number]) )
+		return;
+
 	$title = $options[$number]['title'];
 	$text = apply_filters( 'widget_text', $options[$number]['text'] );
 ?>
@@ -538,95 +583,119 @@
 <?php
 }
 
-function wp_widget_text_control($number) {
-	$options = $newoptions = get_option('widget_text');
+function wp_widget_text_control($widget_args) {
+	global $wp_registered_widgets;
+	static $updated = false;
+
+	if ( is_numeric($widget_args) )
+		$widget_args = array( 'number' => $widget_args );
+	$widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) );
+	extract( $widget_args, EXTR_SKIP );
+
+	$options = get_option('widget_text');
 	if ( !is_array($options) )
-		$options = $newoptions = array();
-	if ( $_POST["text-submit-$number"] ) {
-		$newoptions[$number]['title'] = strip_tags(stripslashes($_POST["text-title-$number"]));
-		$newoptions[$number]['text'] = stripslashes($_POST["text-text-$number"]);
-		if ( !current_user_can('unfiltered_html') )
-			$newoptions[$number]['text'] = stripslashes(wp_filter_post_kses($newoptions[$number]['text']));
-	}
-	if ( $options != $newoptions ) {
-		$options = $newoptions;
-		update_option('widget_text', $options);
-	}
-	$title = attribute_escape($options[$number]['title']);
-	$text = format_to_edit($options[$number]['text']);
-?>
-			<input style="width: 450px;" id="text-title-<?php echo $number; ?>" name="text-title-<?php echo $number; ?>" type="text" value="<?php echo $title; ?>" />
-			<textarea style="width: 450px; height: 280px;" id="text-text-<?php echo $number; ?>" name="text-text-<?php echo $number; ?>"><?php echo $text; ?></textarea>
-			<input type="hidden" id="text-submit-<?php echo "$number"; ?>" name="text-submit-<?php echo "$number"; ?>" value="1" />
-<?php
-}
+		$options = array();
+
+	if ( !$updated && !empty($_POST['sidebar']) ) {
+		$sidebar = (string) $_POST['sidebar'];
+
+		$sidebars_widgets = wp_get_sidebars_widgets();
+		if ( isset($sidebars_widgets[$sidebar]) )
+			$this_sidebar =& $sidebars_widgets[$sidebar];
+		else
+			$this_sidebar = array();
+
+		foreach ( $this_sidebar as $_widget_id ) {
+			if ( 'wp_widget_text' == $wp_registered_widgets[$_widget_id]['callback'] && isset($wp_registered_widgets[$_widget_id]['params'][0]['number']) ) {
+				$widget_number = $wp_registered_widgets[$_widget_id]['params'][0]['number'];
+				if ( !in_array( "text-$widget_number", $_POST['widget-id'] ) ) // the widget has been removed.
+					unset($options[$widget_number]);
+			}
+		}
+
+		foreach ( (array) $_POST['widget-text'] as $widget_number => $widget_text ) {
+			$title = strip_tags(stripslashes($widget_text['title']));
+			if ( current_user_can('unfiltered_html') )
+				$text = stripslashes( $widget_text['text'] );
+			else
+				$text = stripslashes(wp_filter_post_kses( $widget_text['text'] ));
+			$options[$widget_number] = compact( 'title', 'text' );
+		}
 
-function wp_widget_text_setup() {
-	$options = $newoptions = get_option('widget_text');
-	if ( isset($_POST['text-number-submit']) ) {
-		$number = (int) $_POST['text-number'];
-		if ( $number > 9 ) $number = 9;
-		if ( $number < 1 ) $number = 1;
-		$newoptions['number'] = $number;
-	}
-	if ( $options != $newoptions ) {
-		$options = $newoptions;
 		update_option('widget_text', $options);
-		wp_widget_text_register($options['number']);
+		$updated = true;
 	}
-}
 
-function wp_widget_text_page() {
-	$options = $newoptions = get_option('widget_text');
+	if ( -1 == $number ) {
+		$title = '';
+		$text = '';
+		$number = '%i%';
+	} else {
+		$title = attribute_escape($options[$number]['title']);
+		$text = format_to_edit($options[$number]['text']);
+	}
 ?>
-	<div class="wrap">
-		<form method="POST">
-			<h2><?php _e('Text Widgets'); ?></h2>
-			<p style="line-height: 30px;"><?php _e('How many text widgets would you like?'); ?>
-			<select id="text-number" name="text-number" value="<?php echo $options['number']; ?>">
-<?php for ( $i = 1; $i < 10; ++$i ) echo "<option value='$i' ".($options['number']==$i ? "selected='selected'" : '').">$i</option>"; ?>
-			</select>
-			<span class="submit"><input type="submit" name="text-number-submit" id="text-number-submit" value="<?php echo attribute_escape(__('Save')); ?>" /></span></p>
-		</form>
-	</div>
+		<p>
+			<input class="widefat" id="text-title-<?php echo $number; ?>" name="widget-text[<?php echo $number; ?>][title]" type="text" value="<?php echo $title; ?>" />
+			<textarea class="widefat" rows="16" cols="20" id="text-text-<?php echo $number; ?>" name="widget-text[<?php echo $number; ?>][text]"><?php echo $text; ?></textarea>
+			<input type="hidden" name="widget-text[<?php echo $number; ?>][submit]" value="1" />
+		</p>
 <?php
 }
 
 function wp_widget_text_register() {
-	$options = get_option('widget_text');
-	$number = $options['number'];
-	if ( $number < 1 ) $number = 1;
-	if ( $number > 9 ) $number = 9;
-	$dims = array('width' => 460, 'height' => 350);
-	$class = array('classname' => 'widget_text');
-	for ($i = 1; $i <= 9; $i++) {
-		$name = sprintf(__('Text %d'), $i);
-		$id = "text-$i"; // Never never never translate an id
-		wp_register_sidebar_widget($id, $name, $i <= $number ? 'wp_widget_text' : /* unregister */ '', $class, $i);
-		wp_register_widget_control($id, $name, $i <= $number ? 'wp_widget_text_control' : /* unregister */ '', $dims, $i);
+	if ( !$options = get_option('widget_text') )
+		$options = array();
+	$widget_ops = array('classname' => 'widget_text', 'description' => __('Arbitrary text or HTML'));
+	$control_ops = array('width' => 400, 'height' => 350, 'id_base' => 'text');
+	$name = __('Text');
+
+	$id = false;
+	foreach ( array_keys($options) as $o ) {
+		// Old widgets can have null values for some reason
+		if ( !isset($options[$o]['title']) || !isset($options[$o]['text']) )
+			continue;
+		$id = "text-$o"; // Never never never translate an id
+		wp_register_sidebar_widget($id, $name, 'wp_widget_text', $widget_ops, array( 'number' => $o ));
+		wp_register_widget_control($id, $name, 'wp_widget_text_control', $control_ops, array( 'number' => $o ));
+	}
+
+	// If there are none, we register the widget's existance with a generic template
+	if ( !$id ) {
+		wp_register_sidebar_widget( 'text-1', $name, 'wp_widget_text', $widget_ops, array( 'number' => -1 ) );
+		wp_register_widget_control( 'text-1', $name, 'wp_widget_text_control', $control_ops, array( 'number' => -1 ) );
 	}
-	add_action('sidebar_admin_setup', 'wp_widget_text_setup');
-	add_action('sidebar_admin_page', 'wp_widget_text_page');
 }
 
-function wp_widget_categories($args) {
-	extract($args);
+// See large comment section at end of this file
+function wp_widget_categories($args, $widget_args = 1) {
+	extract($args, EXTR_SKIP);
+	if ( is_numeric($widget_args) )
+		$widget_args = array( 'number' => $widget_args );
+	$widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) );
+	extract($widget_args, EXTR_SKIP);
+
 	$options = get_option('widget_categories');
-	$c = $options['count'] ? '1' : '0';
-	$h = $options['hierarchical'] ? '1' : '0';
-	$d = $options['dropdown'] ? '1' : '0';
-	$title = empty($options['title']) ? __('Categories') : $options['title'];
+	if ( !isset($options[$number]) )
+		return;
+
+	$c = $options[$number]['count'] ? '1' : '0';
+	$h = $options[$number]['hierarchical'] ? '1' : '0';
+	$d = $options[$number]['dropdown'] ? '1' : '0';
+
+	$title = empty($options[$number]['title']) ? __('Categories') : $options[$number]['title'];
 
 	echo $before_widget;
-	echo $before_title . $title . $after_title; 
+	echo $before_title . $title . $after_title;
 
 	$cat_args = "orderby=name&show_count={$c}&hierarchical={$h}";
 
-	if($d) {
+	if ( $d ) {
 		wp_dropdown_categories($cat_args . '&show_option_none= ' . __('Select Category'));
 ?>
 
-<script lang='javascript'><!--
+<script type='text/javascript'>
+/* <![CDATA[ */
     var dropdown = document.getElementById("cat");
     function onCatChange() {
 		if ( dropdown.options[dropdown.selectedIndex].value > 0 ) {
@@ -634,7 +703,8 @@
 		}
     }
     dropdown.onchange = onCatChange;
---></script>
+/* ]]> */
+</script>
 
 <?php
 	} else {
@@ -648,33 +718,147 @@
 	echo $after_widget;
 }
 
-function wp_widget_categories_control() {
-	$options = $newoptions = get_option('widget_categories');
-	if ( $_POST['categories-submit'] ) {
-		$newoptions['count'] = isset($_POST['categories-count']);
-		$newoptions['hierarchical'] = isset($_POST['categories-hierarchical']);
-		$newoptions['dropdown'] = isset($_POST['categories-dropdown']);
-		$newoptions['title'] = strip_tags(stripslashes($_POST['categories-title']));
-	}
-	if ( $options != $newoptions ) {
-		$options = $newoptions;
+function wp_widget_categories_control( $widget_args ) {
+	global $wp_registered_widgets;
+	static $updated = false;
+
+	if ( is_numeric($widget_args) )
+		$widget_args = array( 'number' => $widget_args );
+	$widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) );
+	extract($widget_args, EXTR_SKIP);
+
+	$options = get_option('widget_categories');
+
+	if ( !is_array( $options ) )
+		$options = array();
+
+	if ( !$updated && !empty($_POST['sidebar']) ) {
+		$sidebar = (string) $_POST['sidebar'];
+
+		$sidebars_widgets = wp_get_sidebars_widgets();
+		if ( isset($sidebars_widgets[$sidebar]) )
+			$this_sidebar =& $sidebars_widgets[$sidebar];
+		else
+			$this_sidebar = array();
+
+		foreach ( $this_sidebar as $_widget_id ) {
+			if ( 'wp_widget_categories' == $wp_registered_widgets[$_widget_id]['callback'] && isset($wp_registered_widgets[$_widget_id]['params'][0]['number']) ) {
+				$widget_number = $wp_registered_widgets[$_widget_id]['params'][0]['number'];
+				if ( !in_array( "categories-$widget_number", $_POST['widget-id'] ) ) // the widget has been removed.
+					unset($options[$widget_number]);
+			}
+		}
+
+		foreach ( (array) $_POST['widget-categories'] as $widget_number => $widget_cat ) {
+			$title = trim(strip_tags(stripslashes($widget_cat['title'])));
+			$count = isset($widget_cat['count']);
+			$hierarchical = isset($widget_cat['hierarchical']);
+			$dropdown = isset($widget_cat['dropdown']);
+			$options[$widget_number] = compact( 'title', 'count', 'hierarchical', 'dropdown' );
+		}
+
 		update_option('widget_categories', $options);
+		$updated = true;
+	}
+
+	if ( -1 == $number ) {
+		$title = '';
+		$count = false;
+		$hierarchical = false;
+		$dropdown = false;
+		$number = '%i%';
+	} else {
+		$title = attribute_escape( $options[$number]['title'] );
+		$count = (bool) $options[$number]['count'];
+		$hierarchical = (bool) $options[$number]['hierarchical'];
+		$dropdown = (bool) $options[$number]['dropdown'];
 	}
-	$count = $options['count'] ? 'checked="checked"' : '';
-	$hierarchical = $options['hierarchical'] ? 'checked="checked"' : '';
-	$dropdown = $options['dropdown'] ? 'checked="checked"' : '';
-	$title = attribute_escape($options['title']);
 ?>
-			<p><label for="categories-title"><?php _e('Title:'); ?> <input style="width: 250px;" id="categories-title" name="categories-title" type="text" value="<?php echo $title; ?>" /></label></p>
-			<p style="text-align:right;margin-right:40px;"><label for="categories-count"><?php _e('Show post counts'); ?> <input class="checkbox" type="checkbox" <?php echo $count; ?> id="categories-count" name="categories-count" /></label></p>
-			<p style="text-align:right;margin-right:40px;"><label for="categories-hierarchical" style="text-align:right;"><?php _e('Show hierarchy'); ?> <input class="checkbox" type="checkbox" <?php echo $hierarchical; ?> id="categories-hierarchical" name="categories-hierarchical" /></label></p>
-			<p style="text-align:right;margin-right:40px;"><label for="categories-dropdown" style="text-align:right;"><?php _e('Display as a drop down'); ?> <input class="checkbox" type="checkbox" <?php echo $dropdown; ?> id="categories-dropdown" name="categories-dropdown" /></label></p>
-			<input type="hidden" id="categories-submit" name="categories-submit" value="1" />
+			<p>
+				<label for="categories-title-<?php echo $number; ?>">
+					<?php _e( 'Title:' ); ?>
+					<input class="widefat" id="categories-title-<?php echo $number; ?>" name="widget-categories[<?php echo $number; ?>][title]" type="text" value="<?php echo $title; ?>" />
+				</label>
+			</p>
+
+			<p>
+				<label for="categories-dropdown-<?php echo $number; ?>">
+					<input type="checkbox" class="checkbox" id="categories-dropdown-<?php echo $number; ?>" name="widget-categories[<?php echo $number; ?>][dropdown]"<?php checked( $dropdown, true ); ?> />
+					<?php _e( 'Show as dropdown' ); ?>
+				</label>
+				<br />
+				<label for="categories-count-<?php echo $number; ?>">
+					<input type="checkbox" class="checkbox" id="categories-count-<?php echo $number; ?>" name="widget-categories[<?php echo $number; ?>][count]"<?php checked( $count, true ); ?> />
+					<?php _e( 'Show post counts' ); ?>
+				</label>
+				<br />
+				<label for="categories-hierarchical-<?php echo $number; ?>">
+					<input type="checkbox" class="checkbox" id="categories-hierarchical-<?php echo $number; ?>" name="widget-categories[<?php echo $number; ?>][hierarchical]"<?php checked( $hierarchical, true ); ?> />
+					<?php _e( 'Show hierarchy' ); ?>
+				</label>
+			</p>
+
+			<input type="hidden" name="widget-categories[<?php echo $number; ?>][submit]" value="1" />
 <?php
 }
 
+function wp_widget_categories_register() {
+	if ( !$options = get_option( 'widget_categories' ) )
+		$options = array();
+
+	if ( isset($options['title']) )
+		$options = wp_widget_categories_upgrade();
+
+	$widget_ops = array( 'classname' => 'widget_categories', 'description' => __( "A list or dropdown of categories" ) );
+
+	$name = __( 'Categories' );
+
+	$id = false;
+	foreach ( array_keys($options) as $o ) {
+		// Old widgets can have null values for some reason
+		if ( !isset($options[$o]['title']) )
+			continue;
+		$id = "categories-$o";
+		wp_register_sidebar_widget( $id, $name, 'wp_widget_categories', $widget_ops, array( 'number' => $o ) );
+		wp_register_widget_control( $id, $name, 'wp_widget_categories_control', array( 'id_base' => 'categories' ), array( 'number' => $o ) );
+	}
+
+	// If there are none, we register the widget's existance with a generic template
+	if ( !$id ) {
+		wp_register_sidebar_widget( 'categories-1', $name, 'wp_widget_categories', $widget_ops, array( 'number' => -1 ) );
+		wp_register_widget_control( 'categories-1', $name, 'wp_widget_categories_control', array( 'id_base' => 'categories' ), array( 'number' => -1 ) );
+	}
+}
+
+function wp_widget_categories_upgrade() {
+	$options = get_option( 'widget_categories' );
+
+	if ( !isset( $options['title'] ) )
+		return $options;
+
+	$newoptions = array( 1 => $options );
+
+	update_option( 'widget_categories', $newoptions );
+
+	$sidebars_widgets = get_option( 'sidebars_widgets' );
+	if ( is_array( $sidebars_widgets ) ) {
+		foreach ( $sidebars_widgets as $sidebar => $widgets ) {
+			if ( is_array( $widgets ) ) {
+				foreach ( $widgets as $widget )
+					$new_widgets[$sidebar][] = ( $widget == 'categories' ) ? 'categories-1' : $widget;
+			} else {
+				$new_widgets[$sidebar] = $widgets;
+			}
+		}
+		if ( $new_widgets != $sidebars_widgets )
+			update_option( 'sidebars_widgets', $new_widgets );
+	}
+
+	return $newoptions;
+}
+
 function wp_widget_recent_entries($args) {
-	if ( $output = wp_cache_get('widget_recent_entries') )
+	if ( $output = wp_cache_get('widget_recent_entries', 'widget') )
 		return print($output);
 
 	ob_start();
@@ -688,7 +872,7 @@
 	else if ( $number > 15 )
 		$number = 15;
 
-	$r = new WP_Query("showposts=$number&what_to_show=posts&nopaging=0");
+	$r = new WP_Query("showposts=$number&what_to_show=posts&nopaging=0&post_status=publish");
 	if ($r->have_posts()) :
 ?>
 		<?php echo $before_widget; ?>
@@ -700,16 +884,18 @@
 			</ul>
 		<?php echo $after_widget; ?>
 <?php
+		wp_reset_query();  // Restore global post data stomped by the_post().
 	endif;
-	wp_cache_add('widget_recent_entries', ob_get_flush());
+	wp_cache_add('widget_recent_entries', ob_get_flush(), 'widget');
 }
 
 function wp_flush_widget_recent_entries() {
-	wp_cache_delete('widget_recent_entries');
+	wp_cache_delete('widget_recent_entries', 'widget');
 }
 
 add_action('save_post', 'wp_flush_widget_recent_entries');
-add_action('post_deleted', 'wp_flush_widget_recent_entries');
+add_action('deleted_post', 'wp_flush_widget_recent_entries');
+add_action('switch_theme', 'wp_flush_widget_recent_entries');
 
 function wp_widget_recent_entries_control() {
 	$options = $newoptions = get_option('widget_recent_entries');
@@ -726,8 +912,13 @@
 	if ( !$number = (int) $options['number'] )
 		$number = 5;
 ?>
-			<p><label for="recent-entries-title"><?php _e('Title:'); ?> <input style="width: 250px;" id="recent-entries-title" name="recent-entries-title" type="text" value="<?php echo $title; ?>" /></label></p>
-			<p><label for="recent-entries-number"><?php _e('Number of posts to show:'); ?> <input style="width: 25px; text-align: center;" id="recent-entries-number" name="recent-entries-number" type="text" value="<?php echo $number; ?>" /></label> <?php _e('(at most 15)'); ?></p>
+
+			<p><label for="recent-entries-title"><?php _e('Title:'); ?> <input class="widefat" id="recent-entries-title" name="recent-entries-title" type="text" value="<?php echo $title; ?>" /></label></p>
+			<p>
+				<label for="recent-entries-number"><?php _e('Number of posts to show:'); ?> <input style="width: 25px; text-align: center;" id="recent-entries-number" name="recent-entries-number" type="text" value="<?php echo $number; ?>" /></label>
+				<br />
+				<small><?php _e('(at most 15)'); ?></small>
+			</p>
 			<input type="hidden" id="recent-entries-submit" name="recent-entries-submit" value="1" />
 <?php
 }
@@ -781,8 +972,12 @@
 	if ( !$number = (int) $options['number'] )
 		$number = 5;
 ?>
-			<p><label for="recent-comments-title"><?php _e('Title:'); ?> <input style="width: 250px;" id="recent-comments-title" name="recent-comments-title" type="text" value="<?php echo $title; ?>" /></label></p>
-			<p><label for="recent-comments-number"><?php _e('Number of comments to show:'); ?> <input style="width: 25px; text-align: center;" id="recent-comments-number" name="recent-comments-number" type="text" value="<?php echo $number; ?>" /></label> <?php _e('(at most 15)'); ?></p>
+			<p><label for="recent-comments-title"><?php _e('Title:'); ?> <input class="widefat" id="recent-comments-title" name="recent-comments-title" type="text" value="<?php echo $title; ?>" /></label></p>
+			<p>
+				<label for="recent-comments-number"><?php _e('Number of comments to show:'); ?> <input style="width: 25px; text-align: center;" id="recent-comments-number" name="recent-comments-number" type="text" value="<?php echo $number; ?>" /></label>
+				<br />
+				<small><?php _e('(at most 15)'); ?></small>
+			</p>
 			<input type="hidden" id="recent-comments-submit" name="recent-comments-submit" value="1" />
 <?php
 }
@@ -794,29 +989,38 @@
 }
 
 function wp_widget_recent_comments_register() {
-	$dims = array('width' => 320, 'height' => 90);
-	$class = array('classname' => 'widget_recent_comments');
-	wp_register_sidebar_widget('recent-comments', __('Recent Comments'), 'wp_widget_recent_comments', $class);
-	wp_register_widget_control('recent-comments', __('Recent Comments'), 'wp_widget_recent_comments_control', $dims);
-	
+	$widget_ops = array('classname' => 'widget_recent_comments', 'description' => __( 'The most recent comments' ) );
+	wp_register_sidebar_widget('recent-comments', __('Recent Comments'), 'wp_widget_recent_comments', $widget_ops);
+	wp_register_widget_control('recent-comments', __('Recent Comments'), 'wp_widget_recent_comments_control');
+
 	if ( is_active_widget('wp_widget_recent_comments') )
 		add_action('wp_head', 'wp_widget_recent_comments_style');
 }
 
-function wp_widget_rss($args, $number = 1) {
-	require_once(ABSPATH . WPINC . '/rss.php');
+// See large comment section at end of this file
+function wp_widget_rss($args, $widget_args = 1) {
 	extract($args, EXTR_SKIP);
+	if ( is_numeric($widget_args) )
+		$widget_args = array( 'number' => $widegt_args );
+	$widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) );
+	extract($widget_args, EXTR_SKIP);
+
 	$options = get_option('widget_rss');
-	if ( isset($options['error']) && $options['error'] )
+
+	if ( !isset($options[$number]) )
+		return;
+
+	if ( isset($options[$number]['error']) && $options[$number]['error'] )
 		return;
-	$num_items = (int) $options[$number]['items'];
-	$show_summary = $options[$number]['show_summary'];
-	if ( empty($num_items) || $num_items < 1 || $num_items > 10 ) $num_items = 10;
+
 	$url = $options[$number]['url'];
 	while ( strstr($url, 'http') != $url )
 		$url = substr($url, 1);
 	if ( empty($url) )
 		return;
+
+	require_once(ABSPATH . WPINC . '/rss.php');
+
 	$rss = fetch_rss($url);
 	$link = clean_url(strip_tags($rss->channel['link']));
 	while ( strstr($link, 'http') != $link )
@@ -835,13 +1039,41 @@
 	else
 		$icon = get_option('siteurl').'/wp-includes/images/rss.png';
 	$title = "<a class='rsswidget' href='$url' title='" . attribute_escape(__('Syndicate this content')) ."'><img style='background:orange;color:white;border:none;' width='14' height='14' src='$icon' alt='RSS' /></a> <a class='rsswidget' href='$link' title='$desc'>$title</a>";
-?>
-		<?php echo $before_widget; ?>
-			<?php $title ? print($before_title . $title . $after_title) : null; ?>
-			<ul>
-<?php
-	if ( is_array( $rss->items ) ) {
-		$rss->items = array_slice($rss->items, 0, $num_items);
+
+	echo $before_widget;
+	echo $before_title . $title . $after_title;
+
+	wp_widget_rss_output( $rss, $options[$number] );
+
+	echo $after_widget;
+}
+
+function wp_widget_rss_output( $rss, $args = array() ) {
+	if ( is_string( $rss ) ) {
+		require_once(ABSPATH . WPINC . '/rss.php');
+		if ( !$rss = fetch_rss($rss) )
+			return;
+	} elseif ( is_array($rss) && isset($rss['url']) ) {
+		require_once(ABSPATH . WPINC . '/rss.php');
+		$args = $rss;
+		if ( !$rss = fetch_rss($rss['url']) )
+			return;
+	} elseif ( !is_object($rss) ) {
+		return;
+	}
+
+	extract( $args, EXTR_SKIP );
+
+	$items = (int) $items;
+	if ( $items < 1 || 20 < $items )
+		$items = 10;
+	$show_summary  = (int) $show_summary;
+	$show_author   = (int) $show_author;
+	$show_date     = (int) $show_date;
+
+	if ( is_array( $rss->items ) && !empty( $rss->items ) ) {
+		$rss->items = array_slice($rss->items, 0, $items);
+		echo '<ul>';
 		foreach ($rss->items as $item ) {
 			while ( strstr($item['link'], 'http') != $item['link'] )
 				$item['link'] = substr($item['link'], 1);
@@ -850,147 +1082,444 @@
 			if ( empty($title) )
 				$title = __('Untitled');
 			$desc = '';
-			if ( $show_summary ) {
-				$summary = '<div class="rssSummary">' . $item['description'] . '</div>';
-			} else {
 				if ( isset( $item['description'] ) && is_string( $item['description'] ) )
 					$desc = str_replace(array("\n", "\r"), ' ', attribute_escape(strip_tags(html_entity_decode($item['description'], ENT_QUOTES))));
+				elseif ( isset( $item['summary'] ) && is_string( $item['summary'] ) )
+					$desc = str_replace(array("\n", "\r"), ' ', attribute_escape(strip_tags(html_entity_decode($item['summary'], ENT_QUOTES))));
+
+			$summary = '';
+			if ( isset( $item['description'] ) && is_string( $item['description'] ) )
+				$summary = $item['description'];
+			elseif ( isset( $item['summary'] ) && is_string( $item['summary'] ) )
+				$summary = $item['summary'];
+
+			$desc = str_replace(array("\n", "\r"), ' ', attribute_escape(strip_tags(html_entity_decode($summary, ENT_QUOTES))));
+
+			if ( $show_summary ) {
+				$desc = '';
+				$summary = wp_specialchars( $summary );
+				$summary = "<div class='rssSummary'>$summary</div>";
+			} else {
 				$summary = '';
 			}
-			echo "<li><a class='rsswidget' href='$link' title='$desc'>$title</a>$summary</li>";
+
+			$date = '';
+			if ( $show_date ) {
+				if ( isset($item['pubdate']) )
+					$date = $item['pubdate'];
+				elseif ( isset($item['published']) )
+					$date = $item['published'];
+
+				if ( $date ) {
+					if ( $date_stamp = strtotime( $date ) )
+						$date = '<span class="rss-date">' . date_i18n( get_option( 'date_format' ), $date_stamp ) . '</span>';
+					else
+						$date = '';
+				}
+			}
+
+			$author = '';
+			if ( $show_author ) {
+				if ( isset($item['dc']['creator']) )
+					$author = ' <cite>' . wp_specialchars( strip_tags( $item['dc']['creator'] ) ) . '</cite>';
+				elseif ( isset($item['author_name']) )
+					$author = ' <cite>' . wp_specialchars( strip_tags( $item['author_name'] ) ) . '</cite>';
+			}
+
+			echo "<li><a class='rsswidget' href='$link' title='$desc'>$title</a>{$date}{$summary}{$author}</li>";
 		}
+		echo '</ul>';
 	} else {
-		echo '<li>' . __( 'An error has occurred; the feed is probably down. Try again later.' ) . '</li>';
+		echo '<ul><li>' . __( 'An error has occurred; the feed is probably down. Try again later.' ) . '</li></ul>';
 	}
-?>
-			</ul>
-		<?php echo $after_widget; ?>
-<?php
 }
 
-function wp_widget_rss_control($number) {
-	$options = $newoptions = get_option('widget_rss');
-	if ( $_POST["rss-submit-$number"] ) {
-		$newoptions[$number]['items'] = (int) $_POST["rss-items-$number"];
-		$url = clean_url(strip_tags(stripslashes($_POST["rss-url-$number"])));
-		$newoptions[$number]['title'] = trim(strip_tags(stripslashes($_POST["rss-title-$number"])));
-		if ( $url !== $options[$number]['url'] ) {
-			require_once(ABSPATH . WPINC . '/rss.php');
-			$rss = fetch_rss($url);
-			if ( is_object($rss) ) {
-				$newoptions[$number]['url'] = $url;
-				$newoptions[$number]['error'] = false;
-			} else {
-				$newoptions[$number]['error'] = true;
-				$newoptions[$number]['url'] = wp_specialchars(__('Error: could not find an RSS or ATOM feed at that URL.'), 1);
-				$error = sprintf(__('Error in RSS %1$d: %2$s'), $number, $newoptions[$number]['error']);
+function wp_widget_rss_control($widget_args) {
+	global $wp_registered_widgets;
+	static $updated = false;
+
+	if ( is_numeric($widget_args) )
+		$widget_args = array( 'number' => $widget_args );
+	$widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) );
+	extract($widget_args, EXTR_SKIP);
+
+	$options = get_option('widget_rss');
+	if ( !is_array($options) )
+		$options = array();
+
+	$urls = array();
+	foreach ( $options as $option )
+		if ( isset($option['url']) )
+			$urls[$option['url']] = true;
+
+	if ( !$updated && 'POST' == $_SERVER['REQUEST_METHOD'] && !empty($_POST['sidebar']) ) {
+		$sidebar = (string) $_POST['sidebar'];
+
+		$sidebars_widgets = wp_get_sidebars_widgets();
+		if ( isset($sidebars_widgets[$sidebar]) )
+			$this_sidebar =& $sidebars_widgets[$sidebar];
+		else
+			$this_sidebar = array();
+
+		foreach ( $this_sidebar as $_widget_id ) {
+			if ( 'wp_widget_rss' == $wp_registered_widgets[$_widget_id]['callback'] && isset($wp_registered_widgets[$_widget_id]['params'][0]['number']) ) {
+				$widget_number = $wp_registered_widgets[$_widget_id]['params'][0]['number'];
+				if ( !in_array( "rss-$widget_number", $_POST['widget-id'] ) ) // the widget has been removed.
+					unset($options[$widget_number]);
 			}
 		}
-	}
-	if ( $options != $newoptions ) {
-		$options = $newoptions;
+
+		foreach( (array) $_POST['widget-rss'] as $widget_number => $widget_rss ) {
+			$widget_rss = stripslashes_deep( $widget_rss );
+			$url = sanitize_url(strip_tags($widget_rss['url']));
+			$options[$widget_number] = wp_widget_rss_process( $widget_rss, !isset($urls[$url]) );
+		}
+
 		update_option('widget_rss', $options);
+		$updated = true;
 	}
-	$url = attribute_escape($options[$number]['url']);
-	$items = (int) $options[$number]['items'];
-	$title = attribute_escape($options[$number]['title']);
-	if ( empty($items) || $items < 1 ) $items = 10;
-?>
-			<p style="text-align:center;"><?php _e('Enter the RSS feed URL here:'); ?></p>
-			<input style="width: 400px;" id="rss-url-<?php echo "$number"; ?>" name="rss-url-<?php echo "$number"; ?>" type="text" value="<?php echo $url; ?>" />
-			<p style="text-align:center;"><?php _e('Give the feed a title (optional):'); ?></p>
-			<input style="width: 400px;" id="rss-title-<?php echo "$number"; ?>" name="rss-title-<?php echo "$number"; ?>" type="text" value="<?php echo $title; ?>" />
-			<p style="text-align:center; line-height: 30px;"><?php _e('How many items would you like to display?'); ?> <select id="rss-items-<?php echo $number; ?>" name="rss-items-<?php echo $number; ?>"><?php for ( $i = 1; $i <= 10; ++$i ) echo "<option value='$i' ".($items==$i ? "selected='selected'" : '').">$i</option>"; ?></select></p>
-			<input type="hidden" id="rss-submit-<?php echo "$number"; ?>" name="rss-submit-<?php echo "$number"; ?>" value="1" />
-<?php
-}
 
-function wp_widget_rss_setup() {
-	$options = $newoptions = get_option('widget_rss');
-	if ( isset($_POST['rss-number-submit']) ) {
-		$number = (int) $_POST['rss-number'];
-		if ( $number > 9 ) $number = 9;
-		if ( $number < 1 ) $number = 1;
-		$newoptions['number'] = $number;
-	}
-	if ( $options != $newoptions ) {
-		$options = $newoptions;
-		update_option('widget_rss', $options);
-		wp_widget_rss_register($options['number']);
+	if ( -1 == $number ) {
+		$title = '';
+		$url = '';
+		$items = 10;
+		$error = false;
+		$number = '%i%';
+		$show_summary = 0;
+		$show_author = 0;
+		$show_date = 0;
+	} else {
+		extract( (array) $options[$number] );
 	}
+
+	wp_widget_rss_form( compact( 'number', 'title', 'url', 'items', 'error', 'show_summary', 'show_author', 'show_date' ) );
 }
 
-function wp_widget_rss_page() {
-	$options = $newoptions = get_option('widget_rss');
-?>
-	<div class="wrap">
-		<form method="POST">
-			<h2><?php _e('RSS Feed Widgets'); ?></h2>
-			<p style="line-height: 30px;"><?php _e('How many RSS widgets would you like?'); ?>
-			<select id="rss-number" name="rss-number" value="<?php echo $options['number']; ?>">
-<?php for ( $i = 1; $i < 10; ++$i ) echo "<option value='$i' ".($options['number']==$i ? "selected='selected'" : '').">$i</option>"; ?>
+function wp_widget_rss_form( $args, $inputs = null ) {
+	$default_inputs = array( 'url' => true, 'title' => true, 'items' => true, 'show_summary' => true, 'show_author' => true, 'show_date' => true );
+	$inputs = wp_parse_args( $inputs, $default_inputs );
+	extract( $args );
+	$number = attribute_escape( $number );
+	$title  = attribute_escape( $title );
+	$url    = attribute_escape( $url );
+	$items  = (int) $items;
+	if ( $items < 1 || 20 < $items )
+		$items  = 10;
+	$show_summary   = (int) $show_summary;
+	$show_author    = (int) $show_author;
+	$show_date      = (int) $show_date;
+
+	if ( $inputs['url'] ) :
+?>
+	<p>
+		<label for="rss-url-<?php echo $number; ?>"><?php _e('Enter the RSS feed URL here:'); ?>
+			<input class="widefat" id="rss-url-<?php echo $number; ?>" name="widget-rss[<?php echo $number; ?>][url]" type="text" value="<?php echo $url; ?>" />
+		</label>
+	</p>
+<?php endif; if ( $inputs['title'] ) : ?>
+	<p>
+		<label for="rss-title-<?php echo $number; ?>"><?php _e('Give the feed a title (optional):'); ?>
+			<input class="widefat" id="rss-title-<?php echo $number; ?>" name="widget-rss[<?php echo $number; ?>][title]" type="text" value="<?php echo $title; ?>" />
+		</label>
+	</p>
+<?php endif; if ( $inputs['items'] ) : ?>
+	<p>
+		<label for="rss-items-<?php echo $number; ?>"><?php _e('How many items would you like to display?'); ?>
+			<select id="rss-items-<?php echo $number; ?>" name="widget-rss[<?php echo $number; ?>][items]">
+				<?php
+					for ( $i = 1; $i <= 20; ++$i )
+						echo "<option value='$i' " . ( $items == $i ? "selected='selected'" : '' ) . ">$i</option>";
+				?>
 			</select>
-			<span class="submit"><input type="submit" name="rss-number-submit" id="rss-number-submit" value="<?php echo attribute_escape(__('Save')); ?>" /></span></p>
-		</form>
-	</div>
+		</label>
+	</p>
+<?php endif; if ( $inputs['show_summary'] ) : ?>
+	<p>
+		<label for="rss-show-summary-<?php echo $number; ?>">
+			<input id="rss-show-summary-<?php echo $number; ?>" name="widget-rss[<?php echo $number; ?>][show_summary]" type="checkbox" value="1" <?php if ( $show_summary ) echo 'checked="checked"'; ?>/>
+			<?php _e('Display item content?'); ?>
+		</label>
+	</p>
+<?php endif; if ( $inputs['show_author'] ) : ?>
+	<p>
+		<label for="rss-show-author-<?php echo $number; ?>">
+			<input id="rss-show-author-<?php echo $number; ?>" name="widget-rss[<?php echo $number; ?>][show_author]" type="checkbox" value="1" <?php if ( $show_author ) echo 'checked="checked"'; ?>/>
+			<?php _e('Display item author if available?'); ?>
+		</label>
+	</p>
+<?php endif; if ( $inputs['show_date'] ) : ?>
+	<p>
+		<label for="rss-show-date-<?php echo $number; ?>">
+			<input id="rss-show-date-<?php echo $number; ?>" name="widget-rss[<?php echo $number; ?>][show_date]" type="checkbox" value="1" <?php if ( $show_date ) echo 'checked="checked"'; ?>/>
+			<?php _e('Display item date?'); ?>
+		</label>
+	</p>
+	<input type="hidden" name="widget-rss[<?php echo $number; ?>][submit]" value="1" />
 <?php
+	endif;
+	foreach ( array_keys($default_inputs) as $input ) :
+		if ( 'hidden' === $inputs[$input] ) :
+			$id = str_replace( '_', '-', $input );
+?>
+	<input type="hidden" id="rss-<?php echo $id; ?>-<?php echo $number; ?>" name="widget-rss[<?php echo $number; ?>][<?php echo $input; ?>]" value="<?php echo $$input; ?>" />
+<?php
+		endif;
+	endforeach;
+}
+
+// Expects unescaped data
+function wp_widget_rss_process( $widget_rss, $check_feed = true ) {
+	$items = (int) $widget_rss['items'];
+	if ( $items < 1 || 20 < $items )
+		$items = 10;
+	$url           = sanitize_url(strip_tags( $widget_rss['url'] ));
+	$title         = trim(strip_tags( $widget_rss['title'] ));
+	$show_summary  = (int) $widget_rss['show_summary'];
+	$show_author   = (int) $widget_rss['show_author'];
+	$show_date     = (int) $widget_rss['show_date'];
+
+	if ( $check_feed ) {
+		require_once(ABSPATH . WPINC . '/rss.php');
+		$rss = fetch_rss($url);
+		$error = false;
+		$link = '';
+		if ( !is_object($rss) ) {
+			$url = wp_specialchars(__('Error: could not find an RSS or ATOM feed at that URL.'), 1);
+			$error = sprintf(__('Error in RSS %1$d'), $widget_number );
+		} else {
+			$link = clean_url(strip_tags($rss->channel['link']));
+			while ( strstr($link, 'http') != $link )
+				$link = substr($link, 1);
+		}
+	}
+
+	return compact( 'title', 'url', 'link', 'items', 'error', 'show_summary', 'show_author', 'show_date' );
 }
 
 function wp_widget_rss_register() {
-	$options = get_option('widget_rss');
-	$number = $options['number'];
-	if ( $number < 1 ) $number = 1;
-	if ( $number > 9 ) $number = 9;
-	$dims = array('width' => 410, 'height' => 200);
-	$class = array('classname' => 'widget_rss');
-	for ($i = 1; $i <= 9; $i++) {
-		$name = sprintf(__('RSS %d'), $i);
-		$id = "rss-$i"; // Never never never translate an id
-		wp_register_sidebar_widget($id, $name, $i <= $number ? 'wp_widget_rss' : /* unregister */ '', $class, $i);
-		wp_register_widget_control($id, $name, $i <= $number ? 'wp_widget_rss_control' : /* unregister */ '', $dims, $i);
+	if ( !$options = get_option('widget_rss') )
+		$options = array();
+	$widget_ops = array('classname' => 'widget_rss', 'description' => __( 'Entries from any RSS or Atom feed' ));
+	$control_ops = array('width' => 400, 'height' => 200, 'id_base' => 'rss');
+	$name = __('RSS');
+
+	$id = false;
+	foreach ( array_keys($options) as $o ) {
+		// Old widgets can have null values for some reason
+		if ( !isset($options[$o]['url']) || !isset($options[$o]['title']) || !isset($options[$o]['items']) )
+			continue;
+		$id = "rss-$o"; // Never never never translate an id
+		wp_register_sidebar_widget($id, $name, 'wp_widget_rss', $widget_ops, array( 'number' => $o ));
+		wp_register_widget_control($id, $name, 'wp_widget_rss_control', $control_ops, array( 'number' => $o ));
+	}
+
+	// If there are none, we register the widget's existance with a generic template
+	if ( !$id ) {
+		wp_register_sidebar_widget( 'rss-1', $name, 'wp_widget_rss', $widget_ops, array( 'number' => -1 ) );
+		wp_register_widget_control( 'rss-1', $name, 'wp_widget_rss_control', $control_ops, array( 'number' => -1 ) );
+	}
+}
+
+function wp_widget_tag_cloud($args) {
+	extract($args);
+	$options = get_option('widget_tag_cloud');
+	$title = empty($options['title']) ? __('Tags') : $options['title'];
+
+	echo $before_widget;
+	echo $before_title . $title . $after_title;
+	wp_tag_cloud();
+	echo $after_widget;
+}
+
+function wp_widget_tag_cloud_control() {
+	$options = $newoptions = get_option('widget_tag_cloud');
+
+	if ( $_POST['tag-cloud-submit'] ) {
+		$newoptions['title'] = strip_tags(stripslashes($_POST['tag-cloud-title']));
 	}
-	add_action('sidebar_admin_setup', 'wp_widget_rss_setup');
-	add_action('sidebar_admin_page', 'wp_widget_rss_page');
+
+	if ( $options != $newoptions ) {
+		$options = $newoptions;
+		update_option('widget_tag_cloud', $options);
+	}
+
+	$title = attribute_escape( $options['title'] );
+?>
+	<p><label for="tag-cloud-title">
+	<?php _e('Title:') ?> <input type="text" class="widefat" id="tag-cloud-title" name="tag-cloud-title" value="<?php echo $title ?>" /></label>
+	</p>
+	<input type="hidden" name="tag-cloud-submit" id="tag-cloud-submit" value="1" />
+<?php
 }
 
 function wp_widgets_init() {
-	global $wp_register_widget_defaults;
+	if ( !is_blog_installed() )
+		return;
+
+	$widget_ops = array('classname' => 'widget_pages', 'description' => __( "Your blog's WordPress Pages") );
+	wp_register_sidebar_widget('pages', __('Pages'), 'wp_widget_pages', $widget_ops);
+	wp_register_widget_control('pages', __('Pages'), 'wp_widget_pages_control' );
 
-	$wp_register_widget_defaults = true;
-	$dims90 = array('height' => 90, 'width' => 300);
-	$dims100 = array('height' => 100, 'width' => 300);
-	$dims150 = array('height' => 150, 'width' => 300);
-	$class = array('classname' => 'widget_pages');
-	wp_register_sidebar_widget('pages', __('Pages'), 'wp_widget_pages', $class);
-	wp_register_widget_control('pages', __('Pages'), 'wp_widget_pages_control', $dims150);
-	$class['classname'] = 'widget_calendar';
-	wp_register_sidebar_widget('calendar', __('Calendar'), 'wp_widget_calendar', $class);
-	wp_register_widget_control('calendar', __('Calendar'), 'wp_widget_calendar_control', $dims90);
-	$class['classname'] = 'widget_archives';
-	wp_register_sidebar_widget('archives', __('Archives'), 'wp_widget_archives', $class);
-	wp_register_widget_control('archives', __('Archives'), 'wp_widget_archives_control', $dims100);
-	$class['classname'] = 'widget_links';
-	wp_register_sidebar_widget('links', __('Links'), 'wp_widget_links', $class);
-	$class['classname'] = 'widget_meta';
-	wp_register_sidebar_widget('meta', __('Meta'), 'wp_widget_meta', $class);
-	wp_register_widget_control('meta', __('Meta'), 'wp_widget_meta_control', $dims90);
-	$class['classname'] = 'widget_search';
-	wp_register_sidebar_widget('search', __('Search'), 'wp_widget_search', $class);
-	$class['classname'] = 'widget_categories';
-	wp_register_sidebar_widget('categories', __('Categories'), 'wp_widget_categories', $class);
-	wp_register_widget_control('categories', __('Categories'), 'wp_widget_categories_control', $dims150);
-	$class['classname'] = 'widget_recent_entries';
-	wp_register_sidebar_widget('recent-posts', __('Recent Posts'), 'wp_widget_recent_entries', $class);
-	wp_register_widget_control('recent-posts', __('Recent Posts'), 'wp_widget_recent_entries_control', $dims90);
+	$widget_ops = array('classname' => 'widget_calendar', 'description' => __( "A calendar of your blog's posts") );
+	wp_register_sidebar_widget('calendar', __('Calendar'), 'wp_widget_calendar', $widget_ops);
+	wp_register_widget_control('calendar', __('Calendar'), 'wp_widget_calendar_control' );
+
+	$widget_ops = array('classname' => 'widget_archive', 'description' => __( "A monthly archive of your blog's posts") );
+	wp_register_sidebar_widget('archives', __('Archives'), 'wp_widget_archives', $widget_ops);
+	wp_register_widget_control('archives', __('Archives'), 'wp_widget_archives_control' );
+
+	$widget_ops = array('classname' => 'widget_links', 'description' => __( "Your blogroll") );
+	wp_register_sidebar_widget('links', __('Links'), 'wp_widget_links', $widget_ops);
+
+	$widget_ops = array('classname' => 'widget_meta', 'description' => __( "Log in/out, admin, feed and WordPress links") );
+	wp_register_sidebar_widget('meta', __('Meta'), 'wp_widget_meta', $widget_ops);
+	wp_register_widget_control('meta', __('Meta'), 'wp_widget_meta_control' );
+
+	$widget_ops = array('classname' => 'widget_search', 'description' => __( "A search form for your blog") );
+	wp_register_sidebar_widget('search', __('Search'), 'wp_widget_search', $widget_ops);
+
+	$widget_ops = array('classname' => 'widget_recent_entries', 'description' => __( "The most recent posts on your blog") );
+	wp_register_sidebar_widget('recent-posts', __('Recent Posts'), 'wp_widget_recent_entries', $widget_ops);
+	wp_register_widget_control('recent-posts', __('Recent Posts'), 'wp_widget_recent_entries_control' );
+
+	$widget_ops = array('classname' => 'widget_tag_cloud', 'description' => __( "Your most used tags in cloud format") );
+	wp_register_sidebar_widget('tag_cloud', __('Tag Cloud'), 'wp_widget_tag_cloud', $widget_ops);
+	wp_register_widget_control('tag_cloud', __('Tag Cloud'), 'wp_widget_tag_cloud_control' );
+
+	wp_widget_categories_register();
 	wp_widget_text_register();
 	wp_widget_rss_register();
 	wp_widget_recent_comments_register();
 
-	$wp_register_widget_defaults = false;
-
 	do_action('widgets_init');
 }
 
 add_action('init', 'wp_widgets_init', 1);
 
+/* Pattern for multi-widget (allows multiple instances such as the text widget).
+
+// Displays widget on blag
+// $widget_args: number
+//    number: which of the several widgets of this type do we mean
+function widget_many( $args, $widget_args = 1 ) {
+	extract( $args, EXTR_SKIP );
+	if ( is_numeric($widget_args) )
+		$widget_args = array( 'number' => $widget_args );
+	$widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) );
+	extract( $widget_args, EXTR_SKIP );
+
+	// Data should be stored as array:  array( number => data for that instance of the widget, ... )
+	$options = get_option('widget_many');
+	if ( !isset($options[$number]) )
+		return;
+
+	echo $before_widget;
+
+	// Do stuff for this widget, drawing data from $options[$number]
+
+	echo $after_widget;
+}
+
+// Displays form for a particular instance of the widget.  Also updates the data after a POST submit
+// $widget_args: number
+//    number: which of the several widgets of this type do we mean
+function widget_many_control( $widget_args = 1 ) {
+	global $wp_registered_widgets;
+	static $updated = false; // Whether or not we have already updated the data after a POST submit
+
+	if ( is_numeric($widget_args) )
+		$widget_args = array( 'number' => $widget_args );
+	$widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) );
+	extract( $widget_args, EXTR_SKIP );
+
+	// Data should be stored as array:  array( number => data for that instance of the widget, ... )
+	$options = get_option('widget_many');
+	if ( !is_array($options) )
+		$options = array();
+
+	// We need to update the data
+	if ( !$updated && !empty($_POST['sidebar']) ) {
+		// Tells us what sidebar to put the data in
+		$sidebar = (string) $_POST['sidebar'];
+
+		$sidebars_widgets = wp_get_sidebars_widgets();
+		if ( isset($sidebars_widgets[$sidebar]) )
+			$this_sidebar =& $sidebars_widgets[$sidebar];
+		else
+			$this_sidebar = array();
+
+		foreach ( $this_sidebar as $_widget_id ) {
+			// Remove all widgets of this type from the sidebar.  We'll add the new data in a second.  This makes sure we don't get any duplicate data
+			// since widget ids aren't necessarily persistent across multiple updates
+			if ( 'widget_many' == $wp_registered_widgets[$_widget_id]['callback'] && isset($wp_registered_widgets[$_widget_id]['params'][0]['number']) ) {
+				$widget_number = $wp_registered_widgets[$_widget_id]['params'][0]['number'];
+				if ( !in_array( "many-$widget_number", $_POST['widget-id'] ) ) // the widget has been removed. "many-$widget_number" is "{id_base}-{widget_number}
+					unset($options[$widget_number]);
+			}
+		}
+
+		foreach ( (array) $_POST['widget-many'] as $widget_number => $widget_many_instance ) {
+			// compile data from $widget_many_instance
+			$something = wp_specialchars( $widget_many_instance['something'] );
+			$options[$widget_number] = array( 'something' => $something );  // Even simple widgets should store stuff in array, rather than in scalar
+		}
+
+		update_option('widget_text', $options);
+
+		$updated = true; // So that we don't go through this more than once
+	}
+
+
+	// Here we echo out the form
+	if ( -1 == $number ) { // We echo out a template for a form which can be converted to a specific form later via JS
+		$something = '';
+		$number = '%i%';
+	} else {
+		$something = attribute_escape($options[$number]['something']);
+	}
+
+	// The form has inputs with names like widget-many[$number][something] so that all data for that instance of
+	// the widget are stored in one $_POST variable: $_POST['widget-many'][$number]
+?>
+		<p>
+			<input class="widefat" id="widget-many-something-<?php echo $number; ?>" name="widget-many[<?php echo $number; ?>][something]" type="text" value="<?php echo $data; ?>" />
+			<input type="hidden" id="widget-many-submit-<?php echo $number; ?>" name="widget-many[<?php echo $number; ?>][submit]" value="1" />
+		</p>
+<?php
+}
+
+// Registers each instance of our widget on startup
+function widget_many_register() {
+	if ( !$options = get_option('widget_many') )
+		$options = array();
+
+	$widget_ops = array('classname' => 'widget_many', 'description' => __('Widget which allows multiple instances'));
+	$control_ops = array('width' => 400, 'height' => 350, 'id_base' => 'many');
+	$name = __('Many');
+
+	$registered = false;
+	foreach ( array_keys($options) as $o ) {
+		// Old widgets can have null values for some reason
+		if ( !isset($options[$o]['something']) ) // we used 'something' above in our exampple.  Replace with with whatever your real data are.
+			continue;
+
+		// $id should look like {$id_base}-{$o}
+		$id = "many-$o"; // Never never never translate an id
+		$registered = true;
+		wp_register_sidebar_widget( $id, $name, 'wp_widget_text', $widget_ops, array( 'number' => $o ) );
+		wp_register_widget_control( $id, $name, 'wp_widget_text_control', $control_ops, array( 'number' => $o ) );
+	}
+
+	// If there are none, we register the widget's existance with a generic template
+	if ( !$registered ) {
+		wp_register_sidebar_widget( 'many-1', $name, 'widget_many', $widget_ops, array( 'number' => -1 ) );
+		wp_register_widget_control( 'many-1', $name, 'widget_many_control', $control_ops, array( 'number' => -1 ) );
+	}
+}
+
+// This is important
+add_action( 'widgets_init', 'widget_many_register' )
+
+*/
+
 ?>
diff -x .svn -aruN 2.2.2.src/wp-includes/wlwmanifest.xml 2.5.src/wp-includes/wlwmanifest.xml
--- 2.2.2.src/wp-includes/wlwmanifest.xml	1969-12-31 18:00:00.000000000 -0600
+++ 2.5.src/wp-includes/wlwmanifest.xml	2007-10-08 15:21:29.000000000 -0500
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" ?>
+
+<manifest xmlns="http://schemas.microsoft.com/wlw/manifest/weblog">
+
+  <options>
+    <clientType>WordPress</clientType>
+	<supportsKeywords>Yes</supportsKeywords>
+  </options>
+  
+  <weblog>
+    <serviceName>WordPress</serviceName>
+    <imageUrl>images/wlw/wp-icon.png</imageUrl>
+    <watermarkImageUrl>images/wlw/wp-watermark.png</watermarkImageUrl>
+    <homepageLinkText>View site</homepageLinkText>
+    <adminLinkText>Dashboard</adminLinkText>
+    <adminUrl>
+      <![CDATA[ 
+			{blog-postapi-url}/../wp-admin/ 
+		]]>
+    </adminUrl>
+    <postEditingUrl>
+      <![CDATA[ 
+			{blog-postapi-url}/../wp-admin/post.php?action=edit&post={post-id} 
+		]]>
+    </postEditingUrl>
+  </weblog>
+
+  <buttons>
+    <button>
+      <id>0</id>
+      <text>Manage Comments</text>
+      <imageUrl>images/wlw/wp-comments.png</imageUrl>
+      <clickUrl>
+        <![CDATA[ 
+				{blog-postapi-url}/../wp-admin/edit-comments.php
+			]]>
+      </clickUrl>
+    </button>
+
+  </buttons>
+
+</manifest>
+
diff -x .svn -aruN 2.2.2.src/wp-includes/wp-db.php 2.5.src/wp-includes/wp-db.php
--- 2.2.2.src/wp-includes/wp-db.php	2007-04-06 12:22:53.000000000 -0500
+++ 2.5.src/wp-includes/wp-db.php	2008-03-20 18:34:32.000000000 -0500
@@ -7,6 +7,7 @@
 
 define('EZSQL_VERSION', 'WP1.25');
 define('OBJECT', 'OBJECT', true);
+define('OBJECT_K', 'OBJECT_K', false);
 define('ARRAY_A', 'ARRAY_A', false);
 define('ARRAY_N', 'ARRAY_N', false);
 
@@ -15,11 +16,15 @@
 
 class wpdb {
 
-	var $show_errors = true;
+	var $show_errors = false;
+	var $suppress_errors = false;
+	var $last_error = '';
 	var $num_queries = 0;
 	var $last_query;
 	var $col_info;
 	var $queries;
+	var $prefix = '';
+	var $ready = false;
 
 	// Our tables
 	var $posts;
@@ -29,12 +34,13 @@
 	var $comments;
 	var $links;
 	var $options;
-	var $optiontypes;
-	var $optionvalues;
-	var $optiongroups;
-	var $optiongroup_options;
 	var $postmeta;
-
+	var $usermeta;
+	var $terms;
+	var $term_taxonomy;
+	var $term_relationships;
+	var $tables = array('users', 'usermeta', 'posts', 'categories', 'post2cat', 'comments', 'links', 'link2cat', 'options',
+			'postmeta', 'terms', 'term_taxonomy', 'term_relationships');
 	var $charset;
 	var $collate;
 
@@ -52,13 +58,16 @@
 	function __construct($dbuser, $dbpassword, $dbname, $dbhost) {
 		register_shutdown_function(array(&$this, "__destruct"));
 
+		if ( defined('WP_DEBUG') and WP_DEBUG == true )
+			$this->show_errors();
+
 		if ( defined('DB_CHARSET') )
 			$this->charset = DB_CHARSET;
 
 		if ( defined('DB_COLLATE') )
 			$this->collate = DB_COLLATE;
 
-		$this->dbh = @mysql_connect($dbhost, $dbuser, $dbpassword);
+		$this->dbh = @mysql_connect($dbhost, $dbuser, $dbpassword, true);
 		if (!$this->dbh) {
 			$this->bail("
 <h1>Error establishing a database connection</h1>
@@ -70,16 +79,39 @@
 </ul>
 <p>If you're unsure what these terms mean you should probably contact your host. If you still need help you can always visit the <a href='http://wordpress.org/support/'>WordPress Support Forums</a>.</p>
 ");
+			return;
 		}
 
-		if ( !empty($this->charset) && version_compare(mysql_get_server_info(), '4.1.0', '>=') )
+		$this->ready = true;
+
+		if ( !empty($this->charset) && version_compare(mysql_get_server_info($this->dbh), '4.1.0', '>=') )
  			$this->query("SET NAMES '$this->charset'");
 
 		$this->select($dbname);
 	}
 
 	function __destruct() {
-		return true;	
+		return true;
+	}
+
+	function set_prefix($prefix) {
+
+		if ( preg_match('|[^a-z0-9_]|i', $prefix) )
+			return new WP_Error('invalid_db_prefix', 'Invalid database prefix'); // No gettext here
+
+		$old_prefix = $this->prefix;
+		$this->prefix = $prefix;
+
+		foreach ( $this->tables as $table )
+			$this->$table = $this->prefix . $table;
+
+		if ( defined('CUSTOM_USER_TABLE') )
+			$this->users = CUSTOM_USER_TABLE;
+
+		if ( defined('CUSTOM_USER_META_TABLE') )
+			$this->usermeta = CUSTOM_USER_META_TABLE;
+
+		return $old_prefix;
 	}
 
 	/**
@@ -88,14 +120,17 @@
 	 */
 	function select($db) {
 		if (!@mysql_select_db($db, $this->dbh)) {
+			$this->ready = false;
 			$this->bail("
 <h1>Can&#8217;t select database</h1>
 <p>We were able to connect to the database server (which means your username and password is okay) but not able to select the <code>$db</code> database.</p>
 <ul>
 <li>Are you sure it exists?</li>
+<li>Does the user <code>".DB_USER."</code> have permission to use the <code>$db</code> database?</li>
 <li>On some systems the name of your database is prefixed with your username, so it would be like username_wordpress. Could that be the problem?</li>
 </ul>
 <p>If you don't know how to setup a database you should <strong>contact your host</strong>. If all else fails you may find help at the <a href='http://wordpress.org/support/'>WordPress Support Forums</a>.</p>");
+			return;
 		}
 	}
 
@@ -106,11 +141,37 @@
 	 * @return string query safe string
 	 */
 	function escape($string) {
-		return addslashes( $string ); // Disable rest for now, causing problems
+		return addslashes( $string );
+		// Disable rest for now, causing problems
+		/*
 		if( !$this->dbh || version_compare( phpversion(), '4.3.0' ) == '-1' )
 			return mysql_escape_string( $string );
 		else
 			return mysql_real_escape_string( $string, $this->dbh );
+		*/
+	}
+
+	/**
+	 * Escapes content by reference for insertion into the database, for security
+	 * @param string $s
+	 */
+	function escape_by_ref(&$s) {
+		$s = $this->escape($s);
+	}
+
+	/**
+	 * Prepares a SQL query for safe use, using sprintf() syntax
+	 */
+	function prepare($args=NULL) {
+		if ( NULL === $args )
+			return;
+		$args = func_get_args();
+		$query = array_shift($args);
+		$query = str_replace("'%s'", '%s', $query); // in case someone mistakenly already singlequoted it
+		$query = str_replace('"%s"', '%s', $query); // doublequote unquoting
+		$query = str_replace('%s', "'%s'", $query); // quote the strings
+		array_walk($args, array(&$this, 'escape_by_ref'));
+		return @vsprintf($query, $args);
 	}
 
 	// ==================================================================
@@ -118,33 +179,62 @@
 
 	function print_error($str = '') {
 		global $EZSQL_ERROR;
+
 		if (!$str) $str = mysql_error($this->dbh);
 		$EZSQL_ERROR[] =
 		array ('query' => $this->last_query, 'error_str' => $str);
 
-		$str = htmlspecialchars($str, ENT_QUOTES);
-		$query = htmlspecialchars($this->last_query, ENT_QUOTES);
+		if ( $this->suppress_errors )
+			return false;
+
+		$error_str = "WordPress database error $str for query $this->last_query";
+		if ( $caller = $this->get_caller() )
+			$error_str .= " made by $caller";
+
+		$log_error = true;
+		if ( ! function_exists('error_log') )
+			$log_error = false;
+
+		$log_file = @ini_get('error_log');
+		if ( !empty($log_file) && ('syslog' != $log_file) && !is_writable($log_file) )
+			$log_error = false;
+
+		if ( $log_error )
+			@error_log($error_str, 0);
+
 		// Is error output turned on or not..
-		if ( $this->show_errors ) {
-			// If there is an error then take note of it
-			print "<div id='error'>
-			<p class='wpdberror'><strong>WordPress database error:</strong> [$str]<br />
-			<code>$query</code></p>
-			</div>";
-		} else {
+		if ( !$this->show_errors )
 			return false;
-		}
+
+		$str = htmlspecialchars($str, ENT_QUOTES);
+		$query = htmlspecialchars($this->last_query, ENT_QUOTES);
+
+		// If there is an error then take note of it
+		print "<div id='error'>
+		<p class='wpdberror'><strong>WordPress database error:</strong> [$str]<br />
+		<code>$query</code></p>
+		</div>";
 	}
 
 	// ==================================================================
 	//	Turn error handling on or off..
 
-	function show_errors() {
-		$this->show_errors = true;
+	function show_errors( $show = true ) {
+		$errors = $this->show_errors;
+		$this->show_errors = $show;
+		return $errors;
 	}
 
 	function hide_errors() {
+		$show = $this->show_errors;
 		$this->show_errors = false;
+		return $show;
+	}
+
+	function suppress_errors( $suppress = true ) {
+		$errors = $this->suppress_errors;
+		$this->suppress_errors = $suppress;
+		return $errors;
 	}
 
 	// ==================================================================
@@ -160,6 +250,9 @@
 	//	Basic Query	- see docs for more detail
 
 	function query($query) {
+		if ( ! $this->ready )
+			return false;
+
 		// filter the query, if filters are available
 		// NOTE: some queries are made before the plugins have been loaded, and thus cannot be filtered with this method
 		if ( function_exists('apply_filters') )
@@ -183,10 +276,10 @@
 		++$this->num_queries;
 
 		if (SAVEQUERIES)
-			$this->queries[] = array( $query, $this->timer_stop() );
+			$this->queries[] = array( $query, $this->timer_stop(), $this->get_caller() );
 
 		// If there is an error then take note of it..
-		if ( mysql_error($this->dbh) ) {
+		if ( $this->last_error = mysql_error($this->dbh) ) {
 			$this->print_error();
 			return false;
 		}
@@ -224,6 +317,39 @@
 	}
 
 	/**
+	 * Insert an array of data into a table
+	 * @param string $table WARNING: not sanitized!
+	 * @param array $data should not already be SQL-escaped
+	 * @return mixed results of $this->query()
+	 */
+	function insert($table, $data) {
+		$data = add_magic_quotes($data);
+		$fields = array_keys($data);
+		return $this->query("INSERT INTO $table (`" . implode('`,`',$fields) . "`) VALUES ('".implode("','",$data)."')");
+	}
+
+	/**
+	 * Update a row in the table with an array of data
+	 * @param string $table WARNING: not sanitized!
+	 * @param array $data should not already be SQL-escaped
+	 * @param array $where a named array of WHERE column => value relationships.  Multiple member pairs will be joined with ANDs.  WARNING: the column names are not currently sanitized!
+	 * @return mixed results of $this->query()
+	 */
+	function update($table, $data, $where){
+		$data = add_magic_quotes($data);
+		$bits = $wheres = array();
+		foreach ( array_keys($data) as $k )
+			$bits[] = "`$k` = '$data[$k]'";
+
+		if ( is_array( $where ) )
+			foreach ( $where as $c => $v )
+				$wheres[] = "$c = '" . $this->escape( $v ) . "'";
+		else
+			return false;
+		return $this->query( "UPDATE $table SET " . implode( ', ', $bits ) . ' WHERE ' . implode( ' AND ', $wheres ) . ' LIMIT 1' );
+	}
+
+	/**
 	 * Get one variable from the database
 	 * @param string $query (can be null as well, for caching, see codex)
 	 * @param int $x = 0 row num to return
@@ -236,7 +362,7 @@
 			$this->query($query);
 
 		// Extract var out of cached results based x,y vals
-		if ( $this->last_result[$y] ) {
+		if ( !empty( $this->last_result[$y] ) ) {
 			$values = array_values(get_object_vars($this->last_result[$y]));
 		}
 
@@ -255,7 +381,9 @@
 		$this->func_call = "\$db->get_row(\"$query\",$output,$y)";
 		if ( $query )
 			$this->query($query);
-	
+		else
+			return null;
+
 		if ( !isset($this->last_result[$y]) )
 			return null;
 
@@ -280,6 +408,7 @@
 		if ( $query )
 			$this->query($query);
 
+		$new_array = array();
 		// Extract the column values
 		for ( $i=0; $i < count($this->last_result); $i++ ) {
 			$new_array[$i] = $this->get_var(null, $x, $i);
@@ -290,7 +419,7 @@
 	/**
 	 * Return an entire result set from the database
 	 * @param string $query (can also be null to pull from the cache)
-	 * @param string $output ARRAY_A | ARRAY_N | OBJECT
+	 * @param string $output ARRAY_A | ARRAY_N | OBJECT_K | OBJECT
 	 * @return mixed results
 	 */
 	function get_results($query = null, $output = OBJECT) {
@@ -298,23 +427,36 @@
 
 		if ( $query )
 			$this->query($query);
+		else
+			return null;
 
-		// Send back array of objects. Each row is an object
 		if ( $output == OBJECT ) {
+			// Return an integer-keyed array of row objects
 			return $this->last_result;
+		} elseif ( $output == OBJECT_K ) {
+			// Return an array of row objects with keys from column 1
+			// (Duplicates are discarded)
+			foreach ( $this->last_result as $row ) {
+				$key = array_shift( get_object_vars( $row ) );
+				if ( !isset( $new_array[ $key ] ) )
+					$new_array[ $key ] = $row;
+			}
+			return $new_array;
 		} elseif ( $output == ARRAY_A || $output == ARRAY_N ) {
+			// Return an integer-keyed array of...
 			if ( $this->last_result ) {
 				$i = 0;
 				foreach( $this->last_result as $row ) {
-					$new_array[$i] = (array) $row;
 					if ( $output == ARRAY_N ) {
-						$new_array[$i] = array_values($new_array[$i]);
+						// ...integer-keyed row arrays
+						$new_array[$i] = array_values( get_object_vars( $row ) );
+					} else {
+						// ...column name-keyed row arrays
+						$new_array[$i] = get_object_vars( $row );
 					}
-					$i++;
+					++$i;
 				}
 				return $new_array;
-			} else {
-				return null;
 			}
 		}
 	}
@@ -367,34 +509,68 @@
 	 * @param string $message
 	 */
 	function bail($message) { // Just wraps errors in a nice header and footer
-		if ( !$this->show_errors )
+		if ( !$this->show_errors ) {
+			if ( class_exists('WP_Error') )
+				$this->error = new WP_Error('500', $message);
+			else
+				$this->error = $message;
 			return false;
+		}
+		wp_die($message);
+	}
 
-		header('Content-Type: text/html; charset=utf-8');
+	/**
+	 * Checks wether of not the database version is high enough to support the features WordPress uses
+	 * @global $wp_version
+	 */
+	function check_database_version()
+	{
+		global $wp_version;
+		// Make sure the server has MySQL 4.0
+		$mysql_version = preg_replace('|[^0-9\.]|', '', @mysql_get_server_info($this->dbh));
+		if ( version_compare($mysql_version, '4.0.0', '<') )
+			return new WP_Error('database_version',sprintf(__('<strong>ERROR</strong>: WordPress %s requires MySQL 4.0.0 or higher'), $wp_version));
+	}
 
-		if (strpos($_SERVER['PHP_SELF'], 'wp-admin') !== false)
-			$admin_dir = '';
-		else
-			$admin_dir = 'wp-admin/';
+	/**
+	 * This function is called when WordPress is generating the table schema to determine wether or not the current database
+	 * supports or needs the collation statements.
+	 */
+	function supports_collation()
+	{
+		return ( version_compare(mysql_get_server_info($this->dbh), '4.1.0', '>=') );
+	}
 
-?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-	<title>WordPress &rsaquo; Error</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-	<link rel="stylesheet" href="<?php echo $admin_dir; ?>install.css" type="text/css" />
-</head>
-<body>
-	<h1 id="logo"><img alt="WordPress" src="<?php echo $admin_dir; ?>images/wordpress-logo.png" /></h1>
-	<p><?php echo $message; ?></p>
-</body>
-</html>
-<?php
-		die();
+	/**
+	 * Get the name of the function that called wpdb.
+	 * @return string the name of the calling function
+	 */
+	function get_caller() {
+		// requires PHP 4.3+
+		if ( !is_callable('debug_backtrace') )
+			return '';
+
+		$bt = debug_backtrace();
+		$caller = '';
+
+		foreach ( $bt as $trace ) {
+			if ( @$trace['class'] == __CLASS__ )
+				continue;
+			elseif ( strtolower(@$trace['function']) == 'call_user_func_array' )
+				continue;
+			elseif ( strtolower(@$trace['function']) == 'apply_filters' )
+				continue;
+			elseif ( strtolower(@$trace['function']) == 'do_action' )
+				continue;
+
+			$caller = $trace['function'];
+			break;
+		}
+		return $caller;
 	}
+
 }
 
 if ( ! isset($wpdb) )
 	$wpdb = new wpdb(DB_USER, DB_PASSWORD, DB_NAME, DB_HOST);
-?>
\ No newline at end of file
+?>
diff -x .svn -aruN 2.2.2.src/wp-links-opml.php 2.5.src/wp-links-opml.php
--- 2.2.2.src/wp-links-opml.php	2007-03-31 15:15:10.000000000 -0500
+++ 2.5.src/wp-links-opml.php	2007-11-03 11:09:30.000000000 -0500
@@ -5,7 +5,7 @@
 	wp();
 }
 
-header('Content-type: text/xml; charset=' . get_option('blog_charset'), true);
+header('Content-Type: text/xml; charset=' . get_option('blog_charset'), true);
 $link_cat = $_GET['link_cat'];
 if ((empty ($link_cat)) || ($link_cat == 'all') || ($link_cat == '0')) {
 	$link_cat = '';
@@ -14,10 +14,10 @@
 	$link_cat = intval($link_cat);
 }
 ?><?php echo '<?xml version="1.0"?'.">\n"; ?>
-<!-- generator="wordpress/<?php bloginfo_rss('version') ?>" -->
+<?php the_generator( 'comment' ); ?>
 <opml version="1.0">
 	<head>
-		<title>Links for <?php echo attribute_escape(get_bloginfo('name').$cat_name); ?></title>
+		<title>Links for <?php echo attribute_escape(get_bloginfo('name', 'display').$cat_name); ?></title>
 		<dateCreated><?php echo gmdate("D, d M Y H:i:s"); ?> GMT</dateCreated>
 	</head>
 	<body>
@@ -26,16 +26,16 @@
 if (empty ($link_cat))
 	$cats = get_categories("type=link&hierarchical=0");
 else
-	$cats = array (get_category($link_cat));
+	$cats = get_categories('type=link&hierarchical=0&include='.$link_cat);
 
 foreach ((array) $cats as $cat) {
-	$catname = apply_filters('link_category', $cat->cat_name);
+	$catname = apply_filters('link_category', $cat->name);
 
 ?>
 <outline type="category" title="<?php echo attribute_escape($catname); ?>">
 <?php
 
-	$bookmarks = get_bookmarks("category={$cat->cat_ID}");
+	$bookmarks = get_bookmarks("category={$cat->term_id}");
 	foreach ((array) $bookmarks as $bookmark) {
 		$title = attribute_escape(apply_filters('link_title', $bookmark->link_name));
 ?>
@@ -50,4 +50,4 @@
 }
 ?>
 </body>
-</opml>
\ No newline at end of file
+</opml>
diff -x .svn -aruN 2.2.2.src/wp-login.php 2.5.src/wp-login.php
--- 2.2.2.src/wp-login.php	2007-04-18 21:53:19.000000000 -0500
+++ 2.5.src/wp-login.php	2008-03-26 02:43:52.000000000 -0500
@@ -1,41 +1,22 @@
 <?php
 require( dirname(__FILE__) . '/wp-config.php' );
 
-$action = $_REQUEST['action'];
-$errors = array();
-
-if ( isset($_GET['key']) )
-	$action = 'resetpass';
-
-nocache_headers();
-
-header('Content-Type: '.get_bloginfo('html_type').'; charset='.get_bloginfo('charset'));
-
-if ( defined('RELOCATE') ) { // Move flag is set
-	if ( isset( $_SERVER['PATH_INFO'] ) && ($_SERVER['PATH_INFO'] != $_SERVER['PHP_SELF']) )
-		$_SERVER['PHP_SELF'] = str_replace( $_SERVER['PATH_INFO'], '', $_SERVER['PHP_SELF'] );
-
-	$schema = ( isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on' ) ? 'https://' : 'http://';
-	if ( dirname($schema . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']) != get_option('siteurl') )
-		update_option('siteurl', dirname($schema . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']) );
-}
-
-
 // Rather than duplicating this HTML all over the place, we'll stick it in function
-function login_header($title = 'Login', $message = '') {
-	global $errors, $error, $wp_locale;
+function login_header($title = 'Login', $message = '', $wp_error = '') {
+	global $error;
 
+	if ( empty($wp_error) )
+		$wp_error = new WP_Error();
 	?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>>
 <head>
 	<title><?php bloginfo('name'); ?> &rsaquo; <?php echo $title; ?></title>
 	<meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php bloginfo('charset'); ?>" />
-	<link rel="stylesheet" href="<?php bloginfo('wpurl'); ?>/wp-admin/wp-admin.css?version=<?php bloginfo('version'); ?>" type="text/css" />
-<?php if ( ('rtl' == $wp_locale->text_direction) ) : ?>
-	<link rel="stylesheet" href="<?php bloginfo('wpurl'); ?>/wp-admin/rtl.css?version=<?php bloginfo('version'); ?>" type="text/css" />
-<?php endif; ?>
-	<!--[if IE]><style type="text/css">#login h1 a { margin-top: 35px; } #login #login_error { margin-bottom: 10px; }</style><![endif]--><!-- Curse you, IE! -->
+	<?php
+	wp_admin_css( 'css/login' );
+	wp_admin_css( 'css/colors-fresh' );
+	?>
 	<script type="text/javascript">
 		function focusit() {
 			document.getElementById('user_login').focus();
@@ -50,115 +31,243 @@
 <?php
 	if ( !empty( $message ) ) echo apply_filters('login_message', $message) . "\n";
 
-	// Incase a plugin uses $error rather than the $errors array
+	// Incase a plugin uses $error rather than the $errors object
 	if ( !empty( $error ) ) {
-		$errors['error'] = $error;
+		$wp_error->add('error', $error);
 		unset($error);
 	}
 
-	if ( !empty( $errors ) ) {
-		if ( is_array( $errors ) ) {
-			$newerrors = "\n";
-			foreach ( $errors as $error ) $newerrors .= '	' . $error . "<br />\n";
-			$errors = $newerrors;
+	if ( $wp_error->get_error_code() ) {
+		$errors = '';
+		$messages = '';
+		foreach ( $wp_error->get_error_codes() as $code ) {
+			$severity = $wp_error->get_error_data($code);
+			foreach ( $wp_error->get_error_messages($code) as $error ) {
+				if ( 'message' == $severity )
+					$messages .= '	' . $error . "<br />\n";
+				else
+					$errors .= '	' . $error . "<br />\n";
+			}
 		}
-
-		echo '<div id="login_error">' . apply_filters('login_errors', $errors) . "</div>\n";
+		if ( !empty($errors) )
+			echo '<div id="login_error">' . apply_filters('login_errors', $errors) . "</div>\n";
+		if ( !empty($messages) )
+			echo '<p class="message">' . apply_filters('login_messages', $messages) . "</p>\n";
 	}
 } // End of login_header()
 
+function retrieve_password() {
+	global $wpdb;
+
+	$errors = new WP_Error();
+
+	if ( empty( $_POST['user_login'] ) && empty( $_POST['user_email'] ) )
+		$errors->add('empty_username', __('<strong>ERROR</strong>: Enter a username or e-mail address.'));
+
+	if ( strstr($_POST['user_login'], '@') ) {
+		$user_data = get_user_by_email(trim($_POST['user_login']));
+		if ( empty($user_data) )
+			$errors->add('invalid_email', __('<strong>ERROR</strong>: There is no user registered with that email address.'));
+	} else {
+		$login = trim($_POST['user_login']);
+		$user_data = get_userdatabylogin($login);
+	}
+
+	do_action('lostpassword_post');
+
+	if ( $errors->get_error_code() )
+		return $errors;
+
+	if ( !$user_data ) {
+		$errors->add('invalidcombo', __('<strong>ERROR</strong>: Invalid username or e-mail.'));
+		return $errors;
+	}
+
+	// redefining user_login ensures we return the right case in the email
+	$user_login = $user_data->user_login;
+	$user_email = $user_data->user_email;
+
+	do_action('retreive_password', $user_login);  // Misspelled and deprecated
+	do_action('retrieve_password', $user_login);
+
+	$key = $wpdb->get_var("SELECT user_activation_key FROM $wpdb->users WHERE user_login = '$user_login'");
+	if ( empty($key) ) {
+		// Generate something random for a key...
+		$key = wp_generate_password();
+		do_action('retrieve_password_key', $user_login, $key);
+		// Now insert the new md5 key into the db
+		$wpdb->query("UPDATE $wpdb->users SET user_activation_key = '$key' WHERE user_login = '$user_login'");
+	}
+	$message = __('Someone has asked to reset the password for the following site and username.') . "\r\n\r\n";
+	$message .= get_option('siteurl') . "\r\n\r\n";
+	$message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n";
+	$message .= __('To reset your password visit the following address, otherwise just ignore this email and nothing will happen.') . "\r\n\r\n";
+	$message .= get_option('siteurl') . "/wp-login.php?action=rp&key=$key\r\n";
+
+	if ( !wp_mail($user_email, sprintf(__('[%s] Password Reset'), get_option('blogname')), $message) )
+		die('<p>' . __('The e-mail could not be sent.') . "<br />\n" . __('Possible reason: your host may have disabled the mail() function...') . '</p>');
+
+	return true;
+}
+
+function reset_password($key) {
+	global $wpdb;
+
+	$key = preg_replace('/[^a-z0-9]/i', '', $key);
+
+	if ( empty( $key ) )
+		return new WP_Error('invalid_key', __('Invalid key'));
+
+	$user = $wpdb->get_row("SELECT * FROM $wpdb->users WHERE user_activation_key = '$key'");
+	if ( empty( $user ) )
+		return new WP_Error('invalid_key', __('Invalid key'));
+
+	do_action('password_reset', $user);
+
+	// Generate something random for a password...
+	$new_pass = wp_generate_password();
+	wp_set_password($new_pass, $user->ID);
+	$message  = sprintf(__('Username: %s'), $user->user_login) . "\r\n";
+	$message .= sprintf(__('Password: %s'), $new_pass) . "\r\n";
+	$message .= get_option('siteurl') . "/wp-login.php\r\n";
+
+	if (  !wp_mail($user->user_email, sprintf(__('[%s] Your new password'), get_option('blogname')), $message) )
+		die('<p>' . __('The e-mail could not be sent.') . "<br />\n" . __('Possible reason: your host may have disabled the mail() function...') . '</p>');
+
+	// send a copy of password change notification to the admin
+	// but check to see if it's the admin whose password we're changing, and skip this
+	if ( $user->user_email != get_option('admin_email') ) {
+		$message = sprintf(__('Password Lost and Changed for user: %s'), $user->user_login) . "\r\n";
+		wp_mail(get_option('admin_email'), sprintf(__('[%s] Password Lost/Changed'), get_option('blogname')), $message);
+	}
+
+	return true;
+}
+
+function register_new_user($user_login, $user_email) {
+	$errors = new WP_Error();
+
+	$user_login = sanitize_user( $user_login );
+	$user_email = apply_filters( 'user_registration_email', $user_email );
+
+	// Check the username
+	if ( $user_login == '' )
+		$errors->add('empty_username', __('<strong>ERROR</strong>: Please enter a username.'));
+	elseif ( !validate_username( $user_login ) ) {
+		$errors->add('invalid_username', __('<strong>ERROR</strong>: This username is invalid.  Please enter a valid username.'));
+		$user_login = '';
+	} elseif ( username_exists( $user_login ) )
+		$errors->add('username_exists', __('<strong>ERROR</strong>: This username is already registered, please choose another one.'));
+
+	// Check the e-mail address
+	if ($user_email == '') {
+		$errors->add('empty_email', __('<strong>ERROR</strong>: Please type your e-mail address.'));
+	} elseif ( !is_email( $user_email ) ) {
+		$errors->add('invalid_email', __('<strong>ERROR</strong>: The email address isn&#8217;t correct.'));
+		$user_email = '';
+	} elseif ( email_exists( $user_email ) )
+		$errors->add('email_exists', __('<strong>ERROR</strong>: This email is already registered, please choose another one.'));
+
+	do_action('register_post', $user_login, $user_email, $errors);
+
+	$errors = apply_filters( 'registration_errors', $errors );
+
+	if ( $errors->get_error_code() )
+		return $errors;
+
+	$user_pass = wp_generate_password();
+	$user_id = wp_create_user( $user_login, $user_pass, $user_email );
+	if ( !$user_id ) {
+		$errors->add('registerfail', sprintf(__('<strong>ERROR</strong>: Couldn&#8217;t register you... please contact the <a href="mailto:%s">webmaster</a> !'), get_option('admin_email')));
+		return $errors;
+	}
+
+	wp_new_user_notification($user_id, $user_pass);
+
+	return $user_id;
+}
+
+//
+// Main
+//
+
+$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : '';
+$errors = new WP_Error();
+
+if ( isset($_GET['key']) )
+	$action = 'resetpass';
+
+nocache_headers();
+
+header('Content-Type: '.get_bloginfo('html_type').'; charset='.get_bloginfo('charset'));
 
+if ( defined('RELOCATE') ) { // Move flag is set
+	if ( isset( $_SERVER['PATH_INFO'] ) && ($_SERVER['PATH_INFO'] != $_SERVER['PHP_SELF']) )
+		$_SERVER['PHP_SELF'] = str_replace( $_SERVER['PATH_INFO'], '', $_SERVER['PHP_SELF'] );
+
+	$schema = ( isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on' ) ? 'https://' : 'http://';
+	if ( dirname($schema . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']) != get_option('siteurl') )
+		update_option('siteurl', dirname($schema . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']) );
+}
+
+//Set a cookie now to see if they are supported by the browser.
+setcookie(TEST_COOKIE, 'WP Cookie check', 0, COOKIEPATH, COOKIE_DOMAIN);
+if ( SITECOOKIEPATH != COOKIEPATH )
+	setcookie(TEST_COOKIE, 'WP Cookie check', 0, SITECOOKIEPATH, COOKIE_DOMAIN);
+
+$http_post = ('POST' == $_SERVER['REQUEST_METHOD']);
 switch ($action) {
 
 case 'logout' :
 
-	wp_clearcookie();
-	do_action('wp_logout');
+	wp_logout();
 
 	$redirect_to = 'wp-login.php?loggedout=true';
 	if ( isset( $_REQUEST['redirect_to'] ) )
 		$redirect_to = $_REQUEST['redirect_to'];
 
-	wp_redirect($redirect_to);
+	wp_safe_redirect($redirect_to);
 	exit();
 
 break;
 
 case 'lostpassword' :
 case 'retrievepassword' :
-	$user_login = '';
-	$user_pass = '';
-
-	if ( $_POST ) {
-		if ( empty( $_POST['user_login'] ) )
-			$errors['user_login'] = __('<strong>ERROR</strong>: The username field is empty.');
-		if ( empty( $_POST['user_email'] ) )
-			$errors['user_email'] = __('<strong>ERROR</strong>: The e-mail field is empty.');
-
-		do_action('lostpassword_post');
-
-		if ( empty( $errors ) ) {
-			$user_data = get_userdatabylogin(trim($_POST['user_login']));
-			// redefining user_login ensures we return the right case in the email
-			$user_login = $user_data->user_login;
-			$user_email = $user_data->user_email;
-
-			if (!$user_email || $user_email != $_POST['user_email']) {
-				$errors['invalidcombo'] = __('<strong>ERROR</strong>: Invalid username / e-mail combination.');
-			} else {
-				do_action('retreive_password', $user_login);  // Misspelled and deprecated
-				do_action('retrieve_password', $user_login);
-
-				// Generate something random for a password... md5'ing current time with a rand salt
-				$key = substr( md5( uniqid( microtime() ) ), 0, 8);
-				// Now insert the new pass md5'd into the db
-				$wpdb->query("UPDATE $wpdb->users SET user_activation_key = '$key' WHERE user_login = '$user_login'");
-				$message = __('Someone has asked to reset the password for the following site and username.') . "\r\n\r\n";
-				$message .= get_option('siteurl') . "\r\n\r\n";
-				$message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n";
-				$message .= __('To reset your password visit the following address, otherwise just ignore this email and nothing will happen.') . "\r\n\r\n";
-				$message .= get_option('siteurl') . "/wp-login.php?action=rp&key=$key\r\n";
-
-				if (FALSE == wp_mail($user_email, sprintf(__('[%s] Password Reset'), get_option('blogname')), $message)) {
-					die('<p>' . __('The e-mail could not be sent.') . "<br />\n" . __('Possible reason: your host may have disabled the mail() function...') . '</p>');
-				} else {
-					wp_redirect('wp-login.php?checkemail=confirm');
-					exit();
-				}
-			}
+	if ( $http_post ) {
+		$errors = retrieve_password();
+		if ( !is_wp_error($errors) ) {
+			wp_redirect('wp-login.php?checkemail=confirm');
+			exit();
 		}
 	}
 
-	if ( 'invalidkey' == $_GET['error'] ) $errors['invalidkey'] = __('Sorry, that key does not appear to be valid.');
+	if ( 'invalidkey' == $_GET['error'] ) $errors->add('invalidkey', __('Sorry, that key does not appear to be valid.'));
 
 	do_action('lost_password');
-	login_header(__('Lost Password'), '<p class="message">' . __('Please enter your username and e-mail address. You will receive a new password via e-mail.') . '</p>');
+	login_header(__('Lost Password'), '<p class="message">' . __('Please enter your username or e-mail address. You will receive a new password via e-mail.') . '</p>', $errors);
 ?>
 
 <form name="lostpasswordform" id="lostpasswordform" action="wp-login.php?action=lostpassword" method="post">
 	<p>
-		<label><?php _e('Username:') ?><br />
+		<label><?php _e('Username or E-mail:') ?><br />
 		<input type="text" name="user_login" id="user_login" class="input" value="<?php echo attribute_escape(stripslashes($_POST['user_login'])); ?>" size="20" tabindex="10" /></label>
 	</p>
-	<p>
-		<label><?php _e('E-mail:') ?><br />
-		<input type="text" name="user_email" id="user_email" class="input" value="<?php echo attribute_escape(stripslashes($_POST['user_email'])); ?>" size="25" tabindex="20" /></label>
-	</p>
 <?php do_action('lostpassword_form'); ?>
-	<p class="submit"><input type="submit" name="wp-submit" id="wp-submit" value="<?php _e('Get New Password &raquo;'); ?>" tabindex="100" /></p>
+	<p class="submit"><input type="submit" name="wp-submit" id="wp-submit" value="<?php _e('Get New Password'); ?>" tabindex="100" /></p>
 </form>
-</div>
 
-<ul>
+<p id="nav">
 <?php if (get_option('users_can_register')) : ?>
-	<li><a href="<?php bloginfo('wpurl'); ?>/wp-login.php"><?php _e('Login') ?></a></li>
-	<li><a href="<?php bloginfo('wpurl'); ?>/wp-login.php?action=register"><?php _e('Register') ?></a></li>
-	<li><a href="<?php bloginfo('url'); ?>/" title="<?php _e('Are you lost?') ?>"><?php printf(__('Back to %s'), get_bloginfo('title')); ?></a></li>
+<a href="<?php bloginfo('wpurl'); ?>/wp-login.php"><?php _e('Log in') ?></a> |
+<a href="<?php bloginfo('wpurl'); ?>/wp-login.php?action=register"><?php _e('Register') ?></a>
 <?php else : ?>
-	<li><a href="<?php bloginfo('url'); ?>/" title="<?php _e('Are you lost?') ?>"><?php printf(__('Back to %s'), get_bloginfo('title')); ?></a></li>
-	<li><a href="<?php bloginfo('wpurl'); ?>/wp-login.php"><?php _e('Login') ?></a></li>
+<a href="<?php bloginfo('wpurl'); ?>/wp-login.php"><?php _e('Log in') ?></a>
 <?php endif; ?>
-</ul>
+</p>
+
+</div>
+
+<p id="backtoblog"><a href="<?php bloginfo('url'); ?>/" title="<?php _e('Are you lost?') ?>"><?php printf(__('&laquo; Back to %s'), get_bloginfo('title', 'display' )); ?></a></p>
 
 </body>
 </html>
@@ -167,116 +276,63 @@
 
 case 'resetpass' :
 case 'rp' :
-	$key = preg_replace('/[^a-z0-9]/i', '', $_GET['key']);
-	if ( empty( $key ) ) {
-		wp_redirect('wp-login.php?action=lostpassword&error=invalidkey');
-		exit();
-	}
+	$errors = reset_password($_GET['key']);
 
-	$user = $wpdb->get_row("SELECT * FROM $wpdb->users WHERE user_activation_key = '$key'");
-	if ( empty( $user ) ) {
-		wp_redirect('wp-login.php?action=lostpassword&error=invalidkey');
+	if ( ! is_wp_error($errors) ) {
+		wp_redirect('wp-login.php?checkemail=newpass');
 		exit();
 	}
 
-	do_action('password_reset');
-
-	// Generate something random for a password... md5'ing current time with a rand salt
-	$new_pass = substr( md5( uniqid( microtime() ) ), 0, 7);
-	$wpdb->query("UPDATE $wpdb->users SET user_pass = MD5('$new_pass'), user_activation_key = '' WHERE user_login = '$user->user_login'");
-	wp_cache_delete($user->ID, 'users');
-	wp_cache_delete($user->user_login, 'userlogins');
-	$message  = sprintf(__('Username: %s'), $user->user_login) . "\r\n";
-	$message .= sprintf(__('Password: %s'), $new_pass) . "\r\n";
-	$message .= get_option('siteurl') . "/wp-login.php\r\n";
-
-	if (FALSE == wp_mail($user->user_email, sprintf(__('[%s] Your new password'), get_option('blogname')), $message)) {
-		die('<p>' . __('The e-mail could not be sent.') . "<br />\n" . __('Possible reason: your host may have disabled the mail() function...') . '</p>');
-	} else {
-		// send a copy of password change notification to the admin
-		// but check to see if it's the admin whose password we're changing, and skip this
-		if ($user->user_email != get_option('admin_email')) {
-			$message = sprintf(__('Password Lost and Changed for user: %s'), $user->user_login) . "\r\n";
-			wp_mail(get_option('admin_email'), sprintf(__('[%s] Password Lost/Changed'), get_option('blogname')), $message);
-		}
+	wp_redirect('wp-login.php?action=lostpassword&error=invalidkey');
+	exit();
 
-		wp_redirect('wp-login.php?checkemail=newpass');
-		exit();
-	}
 break;
 
 case 'register' :
-	if ( FALSE == get_option('users_can_register') ) {
+	if ( !get_option('users_can_register') ) {
 		wp_redirect('wp-login.php?registration=disabled');
 		exit();
 	}
 
-	if ( $_POST ) {
+	$user_login = '';
+	$user_email = '';
+	if ( $http_post ) {
 		require_once( ABSPATH . WPINC . '/registration.php');
 
-		$user_login = sanitize_user( $_POST['user_login'] );
-		$user_email = apply_filters( 'user_registration_email', $_POST['user_email'] ); 
-
-		// Check the username
-		if ( $user_login == '' )
-			$errors['user_login'] = __('<strong>ERROR</strong>: Please enter a username.');
-		elseif ( !validate_username( $user_login ) ) {
-			$errors['user_login'] = __('<strong>ERROR</strong>: This username is invalid.  Please enter a valid username.');
-			$user_login = '';
-		} elseif ( username_exists( $user_login ) )
-			$errors['user_login'] = __('<strong>ERROR</strong>: This username is already registered, please choose another one.');
-
-		// Check the e-mail address
-		if ($user_email == '') {
-			$errors['user_email'] = __('<strong>ERROR</strong>: Please type your e-mail address.');
-		} elseif ( !is_email( $user_email ) ) {
-			$errors['user_email'] = __('<strong>ERROR</strong>: The email address isn&#8217;t correct.');
-			$user_email = '';
-		} elseif ( email_exists( $user_email ) )
-			$errors['user_email'] = __('<strong>ERROR</strong>: This email is already registered, please choose another one.');
-
-		do_action('register_post');
-
-		$errors = apply_filters( 'registration_errors', $errors );
-
-		if ( empty( $errors ) ) {
-			$user_pass = substr( md5( uniqid( microtime() ) ), 0, 7);
-
-			$user_id = wp_create_user( $user_login, $user_pass, $user_email );
-			if ( !$user_id )
-				$errors['registerfail'] = sprintf(__('<strong>ERROR</strong>: Couldn&#8217;t register you... please contact the <a href="mailto:%s">webmaster</a> !'), get_option('admin_email'));
-			else {
-				wp_new_user_notification($user_id, $user_pass);
-
-				wp_redirect('wp-login.php?checkemail=registered');
-				exit();
-			}
+		$user_login = $_POST['user_login'];
+		$user_email = $_POST['user_email'];
+		$errors = register_new_user($user_login, $user_email);
+		if ( !is_wp_error($errors) ) {
+			wp_redirect('wp-login.php?checkemail=registered');
+			exit();
 		}
 	}
 
-	login_header(__('Registration Form'), '<p class="message register">' . __('Register For This Site') . '</p>');
+	login_header(__('Registration Form'), '<p class="message register">' . __('Register For This Site') . '</p>', $errors);
 ?>
 
 <form name="registerform" id="registerform" action="wp-login.php?action=register" method="post">
 	<p>
-		<label><?php _e('Username:') ?><br />
+		<label><?php _e('Username') ?><br />
 		<input type="text" name="user_login" id="user_login" class="input" value="<?php echo attribute_escape(stripslashes($user_login)); ?>" size="20" tabindex="10" /></label>
 	</p>
 	<p>
-		<label><?php _e('E-mail:') ?><br />
+		<label><?php _e('E-mail') ?><br />
 		<input type="text" name="user_email" id="user_email" class="input" value="<?php echo attribute_escape(stripslashes($user_email)); ?>" size="25" tabindex="20" /></label>
 	</p>
 <?php do_action('register_form'); ?>
 	<p id="reg_passmail"><?php _e('A password will be e-mailed to you.') ?></p>
-	<p class="submit"><input type="submit" name="wp-submit" id="wp-submit" value="<?php _e('Register &raquo;'); ?>" tabindex="100" /></p>
+	<p class="submit"><input type="submit" name="wp-submit" id="wp-submit" value="<?php _e('Register'); ?>" tabindex="100" /></p>
 </form>
+
+<p id="nav">
+<a href="<?php bloginfo('wpurl'); ?>/wp-login.php"><?php _e('Log in') ?></a> |
+<a href="<?php bloginfo('wpurl'); ?>/wp-login.php?action=lostpassword" title="<?php _e('Password Lost and Found') ?>"><?php _e('Lost your password?') ?></a>
+</p>
+
 </div>
 
-<ul>
-	<li><a href="<?php bloginfo('wpurl'); ?>/wp-login.php"><?php _e('Login') ?></a></li>
-	<li><a href="<?php bloginfo('wpurl'); ?>/wp-login.php?action=lostpassword" title="<?php _e('Password Lost and Found') ?>"><?php _e('Lost your password?') ?></a></li>
-	<li><a href="<?php bloginfo('url'); ?>/" title="<?php _e('Are you lost?') ?>"><?php printf(__('Back to %s'), get_bloginfo('title')); ?></a></li>
-</ul>
+<p id="backtoblog"><a href="<?php bloginfo('url'); ?>/" title="<?php _e('Are you lost?') ?>"><?php printf(__('&laquo; Back to %s'), get_bloginfo('title', 'display' )); ?></a></p>
 
 </body>
 </html>
@@ -285,94 +341,75 @@
 
 case 'login' :
 default:
-	$user_login = '';
-	$user_pass = '';
-	$using_cookie = FALSE;
-
-	if ( !isset( $_REQUEST['redirect_to'] ) || is_user_logged_in() )
-		$redirect_to = 'wp-admin/';
-	else
+	if ( isset( $_REQUEST['redirect_to'] ) )
 		$redirect_to = $_REQUEST['redirect_to'];
+	else
+		$redirect_to = 'wp-admin/';
 
-	if ( $_POST ) {
-		$user_login = $_POST['log'];
-		$user_login = sanitize_user( $user_login );
-		$user_pass  = $_POST['pwd'];
-		$rememberme = $_POST['rememberme'];
-	} else {
-		$cookie_login = wp_get_cookie_login();
-		if ( ! empty($cookie_login) ) {
-			$using_cookie = true;
-			$user_login = $cookie_login['login'];
-			$user_pass = $cookie_login['password'];
-		}
-	}
-
-	do_action_ref_array('wp_authenticate', array(&$user_login, &$user_pass));
-
-	if ( $user_login && $user_pass && empty( $errors ) ) {
-		$user = new WP_User(0, $user_login);
+	$user = wp_signon();
 
+	if ( !is_wp_error($user) ) {
 		// If the user can't edit posts, send them to their profile.
 		if ( !$user->has_cap('edit_posts') && ( empty( $redirect_to ) || $redirect_to == 'wp-admin/' ) )
 			$redirect_to = get_option('siteurl') . '/wp-admin/profile.php';
-
-		if ( wp_login($user_login, $user_pass, $using_cookie) ) {
-			if ( !$using_cookie )
-				wp_setcookie($user_login, $user_pass, false, '', '', $rememberme);
-			do_action('wp_login', $user_login);
-			wp_redirect($redirect_to);
-			exit();
-		} else {
-			if ( $using_cookie )
-				$errors['expiredsession'] = __('Your session has expired.');
-		}
+		wp_safe_redirect($redirect_to);
+		exit();
 	}
 
-	if ( $_POST && empty( $user_login ) )
-		$errors['user_login'] = __('<strong>ERROR</strong>: The username field is empty.');
-	if ( $_POST && empty( $user_pass ) )
-		$errors['user_pass'] = __('<strong>ERROR</strong>: The password field is empty.');
+	$errors = $user;
+	// Clear errors if loggedout is set.
+	if ( !empty($_GET['loggedout']) )
+		$errors = new WP_Error();
+
+	// If cookies are disabled we can't log in even with a valid user+pass
+	if ( isset($_POST['testcookie']) && empty($_COOKIE[TEST_COOKIE]) )
+		$errors->add('test_cookie', __("<strong>ERROR</strong>: Cookies are blocked or not supported by your browser. You must <a href='http://www.google.com/cookies.html'>enable cookies</a> to use WordPress."));
 
 	// Some parts of this script use the main login form to display a message
-	if		( TRUE == $_GET['loggedout'] )			$errors['loggedout']		= __('Successfully logged you out.');
-	elseif	( 'disabled' == $_GET['registration'] )	$errors['registerdiabled']	= __('User registration is currently not allowed.');
-	elseif	( 'confirm' == $_GET['checkemail'] )	$errors['confirm']			= __('Check your e-mail for the confirmation link.');
-	elseif	( 'newpass' == $_GET['checkemail'] )	$errors['newpass']			= __('Check your e-mail for your new password.');
-	elseif	( 'registered' == $_GET['checkemail'] )	$errors['registered']		= __('Registration complete. Please check your e-mail.');
+	if		( isset($_GET['loggedout']) && TRUE == $_GET['loggedout'] )			$errors->add('loggedout', __('You are now logged out.'), 'message');
+	elseif	( isset($_GET['registration']) && 'disabled' == $_GET['registration'] )	$errors->add('registerdiabled', __('User registration is currently not allowed.'));
+	elseif	( isset($_GET['checkemail']) && 'confirm' == $_GET['checkemail'] )	$errors->add('confirm', __('Check your e-mail for the confirmation link.'), 'message');
+	elseif	( isset($_GET['checkemail']) && 'newpass' == $_GET['checkemail'] )	$errors->add('newpass', __('Check your e-mail for your new password.'), 'message');
+	elseif	( isset($_GET['checkemail']) && 'registered' == $_GET['checkemail'] )	$errors->add('registered', __('Registration complete. Please check your e-mail.'), 'message');
 
-	login_header(__('Login'));
+	login_header(__('Login'), '', $errors);
 ?>
 
 <form name="loginform" id="loginform" action="wp-login.php" method="post">
+<?php if ( !isset($_GET['checkemail']) || !in_array( $_GET['checkemail'], array('confirm', 'newpass') ) ) : ?>
 	<p>
-		<label><?php _e('Username:') ?><br />
+		<label><?php _e('Username') ?><br />
 		<input type="text" name="log" id="user_login" class="input" value="<?php echo attribute_escape(stripslashes($user_login)); ?>" size="20" tabindex="10" /></label>
 	</p>
 	<p>
-		<label><?php _e('Password:') ?><br />
+		<label><?php _e('Password') ?><br />
 		<input type="password" name="pwd" id="user_pass" class="input" value="" size="20" tabindex="20" /></label>
 	</p>
 <?php do_action('login_form'); ?>
-	<p><label><input name="rememberme" type="checkbox" id="rememberme" value="forever" tabindex="90" /> <?php _e('Remember me'); ?></label></p>
+	<p class="forgetmenot"><label><input name="rememberme" type="checkbox" id="rememberme" value="forever" tabindex="90" /> <?php _e('Remember Me'); ?></label></p>
 	<p class="submit">
-		<input type="submit" name="wp-submit" id="wp-submit" value="<?php _e('Login'); ?> &raquo;" tabindex="100" />
+		<input type="submit" name="wp-submit" id="wp-submit" value="<?php _e('Log In'); ?>" tabindex="100" />
 		<input type="hidden" name="redirect_to" value="<?php echo attribute_escape($redirect_to); ?>" />
+		<input type="hidden" name="testcookie" value="1" />
 	</p>
+<?php else : ?>
+	<p>&nbsp;</p>
+<?php endif; ?>
 </form>
-</div>
 
-<ul>
-<?php if (get_option('users_can_register')) : ?>
-	<li><a href="<?php bloginfo('wpurl'); ?>/wp-login.php?action=register"><?php _e('Register') ?></a></li>
-	<li><a href="<?php bloginfo('wpurl'); ?>/wp-login.php?action=lostpassword" title="<?php _e('Password Lost and Found') ?>"><?php _e('Lost your password?') ?></a></li>
-	<li><a href="<?php bloginfo('url'); ?>/" title="<?php _e('Are you lost?') ?>"><?php printf(__('Back to %s'), get_bloginfo('title')); ?></a></li>
+<p id="nav">
+<?php if ( isset($_GET['checkemail']) && in_array( $_GET['checkemail'], array('confirm', 'newpass') ) ) : ?>
+<?php elseif (get_option('users_can_register')) : ?>
+<a href="<?php bloginfo('wpurl'); ?>/wp-login.php?action=register"><?php _e('Register') ?></a> |
+<a href="<?php bloginfo('wpurl'); ?>/wp-login.php?action=lostpassword" title="<?php _e('Password Lost and Found') ?>"><?php _e('Lost your password?') ?></a>
 <?php else : ?>
-	<li><a href="<?php bloginfo('url'); ?>/" title="<?php _e('Are you lost?') ?>"><?php printf(__('Back to %s'), get_bloginfo('title')); ?></a></li>
-	<li><a href="<?php bloginfo('wpurl'); ?>/wp-login.php?action=lostpassword" title="<?php _e('Password Lost and Found') ?>"><?php _e('Lost your password?') ?></a></li>
+<a href="<?php bloginfo('wpurl'); ?>/wp-login.php?action=lostpassword" title="<?php _e('Password Lost and Found') ?>"><?php _e('Lost your password?') ?></a>
 <?php endif; ?>
-</ul>
+</p>
+
+</div>
 
+<p id="backtoblog"><a href="<?php bloginfo('url'); ?>/" title="<?php _e('Are you lost?') ?>"><?php printf(__('&laquo; Back to %s'), get_bloginfo('title', 'display' )); ?></a></p>
 
 </body>
 </html>
diff -x .svn -aruN 2.2.2.src/wp-mail.php 2.5.src/wp-mail.php
--- 2.2.2.src/wp-mail.php	2007-05-04 21:51:20.000000000 -0500
+++ 2.5.src/wp-mail.php	2007-12-29 13:38:33.000000000 -0600
@@ -12,11 +12,16 @@
 $pop3 = new POP3();
 
 if (!$pop3->connect(get_option('mailserver_url'), get_option('mailserver_port')))
-	wp_die($pop3->ERROR);
+	wp_die(wp_specialchars($pop3->ERROR));
 
-$count = $pop3->login(get_option('mailserver_login'), get_option('mailserver_pass'));
-if (0 == $count) wp_die(__('There doesn&#8217;t seem to be any new mail.'));
+if (!$pop3->user(get_option('mailserver_login')))
+	wp_die(wp_specialchars($pop3->ERROR));
 
+$count = $pop3->pass(get_option('mailserver_pass'));
+if (false === $count)
+	wp_die(wp_specialchars($pop3->ERROR));
+if (0 == $count)
+	echo "<p>There doesn't seem to be any new mail.</p>\n"; // will fall-through to end of for loop
 
 for ($i=1; $i <= $count; $i++) :
 
@@ -27,6 +32,8 @@
 	$content_transfer_encoding = '';
 	$boundary = '';
 	$bodysignal = 0;
+	$post_author = 1;
+	$author_found = false;
 	$dmonths = array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
 	foreach ($message as $line) :
 		if (strlen($line) < 3) $bodysignal = 1;
@@ -60,21 +67,28 @@
 				$subject = $subject[0];
 			}
 
-			// Set the author using the email address (To or Reply-To, the last used)
+			// Set the author using the email address (From or Reply-To, the last used)
 			// otherwise use the site admin
-			if (preg_match('/From: /', $line) | preg_match('/Reply-To: /', $line))  {
-				$author=trim($line);
-			if ( ereg("([a-zA-Z0-9\_\-\.]+@[\a-zA-z0-9\_\-\.]+)", $author , $regs) ) {
-				$author = $regs[1];
-				echo "Author = {$author} <p>";
-				$author = $wpdb->escape($author);
-				$result = $wpdb->get_row("SELECT ID FROM $wpdb->users WHERE user_email='$author' LIMIT 1");
-				if (!$result)
-					$post_author = 1;
+			if ( preg_match('/(From|Reply-To): /', $line) )  {
+				if ( preg_match('|[a-z0-9_.-]+@[a-z0-9_.-]+(?!.*<)|i', $line, $matches) )
+					$author = $matches[0];
 				else
-					$post_author = $result->ID;
-			} else
-				$post_author = 1;
+					$author = trim($line);
+				$author = sanitize_email($author);
+				if ( is_email($author) ) {
+					echo "Author = {$author} <p>";
+					$userdata = get_user_by_email($author);
+					if (!$userdata) {
+						$post_author = 1;
+						$author_found = false;
+					} else {
+						$post_author = $userdata->ID;
+						$author_found = true;
+					}
+				} else {
+					$post_author = 1;
+					$author_found = false;
+				}
 			}
 
 			if (preg_match('/Date: /i', $line)) { // of the form '20 Mar 2002 20:32:37'
@@ -108,7 +122,19 @@
 		}
 	endforeach;
 
-	$subject = trim(str_replace(get_option('subjectprefix'), '', $subject));
+	// Set $post_status based on $author_found and on author's publish_posts capability
+	if ($author_found) {
+		$user = new WP_User($post_author);
+		if ($user->has_cap('publish_posts'))
+			$post_status = 'publish';
+		else
+			$post_status = 'pending';
+	} else {
+		// Author not found in DB, set status to pending.  Author already set to admin.
+		$post_status = 'pending';
+	}
+
+	$subject = trim($subject);
 
 	if ($content_type == 'multipart/alternative') {
 		$content = explode('--'.$boundary, $content);
@@ -117,7 +143,7 @@
 		$content = strip_tags($content[1], '<img><p><br><i><b><u><em><strong><strike><font><span><div>');
 	}
 	$content = trim($content);
-	
+
 	if (stripos($content_transfer_encoding, "quoted-printable") !== false) {
 		$content = quoted_printable_decode($content);
 	}
@@ -126,9 +152,6 @@
 	$content = explode($phone_delim, $content);
 	$content[1] ? $content = $content[1] : $content = $content[0];
 
-	echo "<p><b>Content-type:</b> $content_type, <b>Content-Transfer-Encoding:</b> $content_transfer_encoding, <b>boundary:</b> $boundary</p>\n";
-	echo "<p><b>Raw content:</b><br /><pre>".$content.'</pre></p>';
-
 	$content = trim($content);
 
 	$post_content = apply_filters('phone_content', $content);
@@ -141,13 +164,12 @@
 
 	$post_category = $post_categories;
 
-	// or maybe we should leave the choice to email drafts? propose a way
-	$post_status = 'publish';
-
 	$post_data = compact('post_content','post_title','post_date','post_date_gmt','post_author','post_category', 'post_status');
 	$post_data = add_magic_quotes($post_data);
 
 	$post_ID = wp_insert_post($post_data);
+	if ( is_wp_error( $post_ID ) )
+		echo "\n" . $post_ID->get_error_message();
 
 	if (!$post_ID) {
 		// we couldn't post, for whatever reason. better move forward to the next email
@@ -156,12 +178,11 @@
 
 	do_action('publish_phone', $post_ID);
 
-	echo "\n<p><b>Author:</b> $post_author</p>";
-	echo "\n<p><b>Posted title:</b> $post_title<br />";
-	echo "\n<b>Posted content:</b><br /><pre>".$content.'</pre></p>';
+	echo "\n<p><b>Author:</b> " . wp_specialchars($post_author) . "</p>";
+	echo "\n<p><b>Posted title:</b> " . wp_specialchars($post_title) . "<br />";
 
 	if(!$pop3->delete($i)) {
-		echo '<p>Oops '.$pop3->ERROR.'</p></div>';
+		echo '<p>Oops '.wp_specialchars($pop3->ERROR).'</p></div>';
 		$pop3->reset();
 		exit;
 	} else {
diff -x .svn -aruN 2.2.2.src/wp-pass.php 2.5.src/wp-pass.php
--- 2.2.2.src/wp-pass.php	2006-06-24 16:14:58.000000000 -0500
+++ 2.5.src/wp-pass.php	2007-09-18 17:23:16.000000000 -0500
@@ -7,5 +7,5 @@
 // 10 days
 setcookie('wp-postpass_' . COOKIEHASH, $_POST['post_password'], time() + 864000, COOKIEPATH);
 
-wp_redirect(wp_get_referer());
+wp_safe_redirect(wp_get_referer());
 ?>
\ No newline at end of file
diff -x .svn -aruN 2.2.2.src/wp-rdf.php 2.5.src/wp-rdf.php
--- 2.2.2.src/wp-rdf.php	2007-02-22 20:50:05.000000000 -0600
+++ 2.5.src/wp-rdf.php	2007-08-02 19:45:06.000000000 -0500
@@ -1,7 +1,7 @@
 <?php /* RDF 1.0 generator, original version by garym@teledyn.com */
 
 if (empty($wp)) {
-	require_once('wp-config.php');
+	require_once('./wp-config.php');
 	wp('feed=rdf');
 }
 
diff -x .svn -aruN 2.2.2.src/wp-rss.php 2.5.src/wp-rss.php
--- 2.2.2.src/wp-rss.php	2007-02-22 20:50:05.000000000 -0600
+++ 2.5.src/wp-rss.php	2007-08-02 19:45:06.000000000 -0500
@@ -1,7 +1,7 @@
 <?php
 
 if (empty($wp)) {
-	require_once('wp-config.php');
+	require_once('./wp-config.php');
 	wp('feed=rss');
 }
 
diff -x .svn -aruN 2.2.2.src/wp-rss2.php 2.5.src/wp-rss2.php
--- 2.2.2.src/wp-rss2.php	2007-02-22 20:50:05.000000000 -0600
+++ 2.5.src/wp-rss2.php	2007-08-02 19:45:06.000000000 -0500
@@ -1,7 +1,7 @@
 <?php
 
 if (empty($wp)) {
-	require_once('wp-config.php');
+	require_once('./wp-config.php');
 	wp('feed=rss2');
 }
 
diff -x .svn -aruN 2.2.2.src/wp-settings.php 2.5.src/wp-settings.php
--- 2.2.2.src/wp-settings.php	2007-06-22 17:14:17.000000000 -0500
+++ 2.5.src/wp-settings.php	2008-03-11 03:44:59.000000000 -0500
@@ -1,5 +1,28 @@
 <?php
-// Turn register globals off
+/**
+ * Used to setup and fix common variables and include
+ * the WordPress procedural and class library.
+ *
+ * You should not have to change this file and allows
+ * for some configuration in wp-config.php.
+ *
+ * @package WordPress
+ */
+
+if ( !defined('WP_MEMORY_LIMIT') )
+	define('WP_MEMORY_LIMIT', '32M');
+
+if ( function_exists('memory_get_usage') && ( (int) @ini_get('memory_limit') < abs(intval(WP_MEMORY_LIMIT)) ) )
+	@ini_set('memory_limit', WP_MEMORY_LIMIT);
+
+
+/**
+ * wp_unregister_GLOBALS() - Turn register globals off
+ *
+ * @access private
+ * @since 2.1.0
+ * @return null Will return null if register_globals PHP directive was disabled
+ */
 function wp_unregister_GLOBALS() {
 	if ( !ini_get('register_globals') )
 		return;
@@ -11,27 +34,50 @@
 	$noUnset = array('GLOBALS', '_GET', '_POST', '_COOKIE', '_REQUEST', '_SERVER', '_ENV', '_FILES', 'table_prefix');
 
 	$input = array_merge($_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_FILES, isset($_SESSION) && is_array($_SESSION) ? $_SESSION : array());
-	foreach ( $input as $k => $v ) 
+	foreach ( $input as $k => $v )
 		if ( !in_array($k, $noUnset) && isset($GLOBALS[$k]) ) {
 			$GLOBALS[$k] = NULL;
 			unset($GLOBALS[$k]);
 		}
 }
 
-wp_unregister_GLOBALS(); 
+wp_unregister_GLOBALS();
 
-unset( $wp_filter, $cache_userdata, $cache_lastcommentmodified, $cache_lastpostdate, $cache_settings, $category_cache, $cache_categories );
+unset( $wp_filter, $cache_lastcommentmodified, $cache_lastpostdate );
 
+/**
+ * The $blog_id global, which you can change in the config allows you to create a simple
+ * multiple blog installation using just one WordPress and changing $blog_id around.
+ *
+ * @global int $blog_id
+ * @since 2.0.0
+ */
 if ( ! isset($blog_id) )
 	$blog_id = 1;
 
 // Fix for IIS, which doesn't set REQUEST_URI
 if ( empty( $_SERVER['REQUEST_URI'] ) ) {
-	$_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME']; // Does this work under CGI?
 
-	// Append the query string if it exists and isn't null
-	if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])) {
-		$_SERVER['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];
+	// IIS Mod-Rewrite
+	if (isset($_SERVER['HTTP_X_ORIGINAL_URL'])) {
+		$_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_ORIGINAL_URL'];
+	}
+	// IIS Isapi_Rewrite
+	else if (isset($_SERVER['HTTP_X_REWRITE_URL'])) {
+		$_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_REWRITE_URL'];
+	}
+	else
+	{
+		// Some IIS + PHP configurations puts the script-name in the path-info (No need to append it twice)
+		if ( $_SERVER['PATH_INFO'] == $_SERVER['SCRIPT_NAME'] )
+			$_SERVER['REQUEST_URI'] = $_SERVER['PATH_INFO'];
+		else
+			$_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'] . $_SERVER['PATH_INFO'];
+
+		// Append the query string if it exists and isn't null
+		if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])) {
+			$_SERVER['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];
+		}
 	}
 }
 
@@ -48,12 +94,21 @@
 if ( empty($PHP_SELF) )
 	$_SERVER['PHP_SELF'] = $PHP_SELF = preg_replace("/(\?.*)?$/",'',$_SERVER["REQUEST_URI"]);
 
-if ( !(phpversion() >= '4.2') )
-	die( 'Your server is running PHP version ' . phpversion() . ' but WordPress requires at least 4.2.' );
+if ( version_compare( '4.3', phpversion(), '>' ) ) {
+	die( 'Your server is running PHP version ' . phpversion() . ' but WordPress requires at least 4.3.' );
+}
 
 if ( !extension_loaded('mysql') && !file_exists(ABSPATH . 'wp-content/db.php') )
-	die( 'Your PHP installation appears to be missing the MySQL which is required for WordPress.' );
+	die( 'Your PHP installation appears to be missing the MySQL extension which is required by WordPress.' );
 
+/**
+ * timer_start() - PHP 4 standard microtime start capture
+ *
+ * @access private
+ * @since 0.71
+ * @global int $timestart Seconds and Microseconds added together from when function is called
+ * @return bool Always returns true
+ */
 function timer_start() {
 	global $timestart;
 	$mtime = explode(' ', microtime() );
@@ -62,6 +117,30 @@
 	return true;
 }
 
+/**
+ * timer_stop() - Return and/or display the time from the page start to when function is called.
+ *
+ * You can get the results and print them by doing:
+ * <code>
+ * $nTimePageTookToExecute = timer_stop();
+ * echo $nTimePageTookToExecute;
+ * </code>
+ *
+ * Or instead, you can do:
+ * <code>
+ * timer_stop(1);
+ * </code>
+ * which will do what the above does. If you need the result, you can assign it to a variable, but
+ * most cases, you only need to echo it.
+ *
+ * @since 0.71
+ * @global int $timestart Seconds and Microseconds added together from when timer_start() is called
+ * @global int $timeend  Seconds and Microseconds added together from when function is called
+ *
+ * @param int $display Use '0' or null to not echo anything and 1 to echo the total time
+ * @param int $precision The amount of digits from the right of the decimal to display. Default is 3.
+ * @return float The "second.microsecond" finished time calculation
+ */
 function timer_stop($display = 0, $precision = 3) { //if called like timer_stop(1), will echo $timetotal
 	global $timestart, $timeend;
 	$mtime = microtime();
@@ -69,68 +148,76 @@
 	$mtime = $mtime[1] + $mtime[0];
 	$timeend = $mtime;
 	$timetotal = $timeend-$timestart;
-	$r = number_format($timetotal, $precision);
+	$r = ( function_exists('number_format_i18n') ) ? number_format_i18n($timetotal, $precision) : number_format($timetotal, $precision);
 	if ( $display )
 		echo $r;
 	return $r;
 }
 timer_start();
 
-// Change to E_ALL for development/debugging
-error_reporting(E_ALL ^ E_NOTICE);
+// Add define('WP_DEBUG',true); to wp-config.php to enable display of notices during development.
+if (defined('WP_DEBUG') and WP_DEBUG == true) {
+	error_reporting(E_ALL);
+} else {
+	error_reporting(E_ALL ^ E_NOTICE ^ E_USER_NOTICE);
+}
 
 // For an advanced caching plugin to use, static because you would only want one
 if ( defined('WP_CACHE') )
 	@include ABSPATH . 'wp-content/advanced-cache.php';
 
+/**
+ * Stores the location of the WordPress directory of functions, classes, and core content.
+ *
+ * @since 1.0.0
+ */
 define('WPINC', 'wp-includes');
 
 if ( !defined('LANGDIR') ) {
+	/**
+	 * Stores the location of the language directory. First looks for language folder in wp-content
+	 * and uses that folder if it exists. Or it uses the "languages" folder in WPINC.
+	 *
+	 * @since 2.1.0
+	 */
 	if ( file_exists(ABSPATH . 'wp-content/languages') && @is_dir(ABSPATH . 'wp-content/languages') )
 		define('LANGDIR', 'wp-content/languages'); // no leading slash, no trailing slash
 	else
 		define('LANGDIR', WPINC . '/languages'); // no leading slash, no trailing slash
 }
 
+/**
+ * Allows for the plugins directory to be moved from the default location.
+ *
+ * This isn't used everywhere. Constant is not used in plugin_basename()
+ * which might cause conflicts with changing this.
+ *
+ * @since 2.1
+ */
 if ( !defined('PLUGINDIR') )
 	define('PLUGINDIR', 'wp-content/plugins'); // no leading slash, no trailing slash
-if ( file_exists(ABSPATH . 'wp-content/db.php') )
-	require (ABSPATH . 'wp-content/db.php');
-else
-	require_once (ABSPATH . WPINC . '/wp-db.php');
 
-// $table_prefix is deprecated as of 2.1
-$wpdb->prefix = $table_prefix;
+require (ABSPATH . WPINC . '/compat.php');
+require (ABSPATH . WPINC . '/functions.php');
+require (ABSPATH . WPINC . '/classes.php');
+
+require_wp_db();
+
+if ( !empty($wpdb->error) )
+	dead_db();
 
-if ( preg_match('|[^a-z0-9_]|i', $wpdb->prefix) && !file_exists(ABSPATH . 'wp-content/db.php') )
-	die("<strong>ERROR</strong>: <code>$table_prefix</code> in <code>wp-config.php</code> can only contain numbers, letters, and underscores.");
+$prefix = $wpdb->set_prefix($table_prefix);
 
-// Table names
-$wpdb->posts          = $wpdb->prefix . 'posts';
-$wpdb->users          = $wpdb->prefix . 'users';
-$wpdb->categories     = $wpdb->prefix . 'categories';
-$wpdb->post2cat       = $wpdb->prefix . 'post2cat';
-$wpdb->comments       = $wpdb->prefix . 'comments';
-$wpdb->link2cat       = $wpdb->prefix . 'link2cat';
-$wpdb->links          = $wpdb->prefix . 'links';
-$wpdb->options        = $wpdb->prefix . 'options';
-$wpdb->postmeta       = $wpdb->prefix . 'postmeta';
-$wpdb->usermeta       = $wpdb->prefix . 'usermeta';
-
-if ( defined('CUSTOM_USER_TABLE') )
-	$wpdb->users = CUSTOM_USER_TABLE;
-if ( defined('CUSTOM_USER_META_TABLE') )
-	$wpdb->usermeta = CUSTOM_USER_META_TABLE;
+if ( is_wp_error($prefix) )
+	wp_die('<strong>ERROR</strong>: <code>$table_prefix</code> in <code>wp-config.php</code> can only contain numbers, letters, and underscores.');
 
 if ( file_exists(ABSPATH . 'wp-content/object-cache.php') )
-	require (ABSPATH . 'wp-content/object-cache.php');
+	require_once (ABSPATH . 'wp-content/object-cache.php');
 else
-	require (ABSPATH . WPINC . '/cache.php');
+	require_once (ABSPATH . WPINC . '/cache.php');
 
 wp_cache_init();
 
-require (ABSPATH . WPINC . '/functions.php');
-require (ABSPATH . WPINC . '/classes.php');
 require (ABSPATH . WPINC . '/plugin.php');
 require (ABSPATH . WPINC . '/default-filters.php');
 include_once(ABSPATH . WPINC . '/streams.php');
@@ -138,11 +225,16 @@
 require_once (ABSPATH . WPINC . '/l10n.php');
 
 if ( !is_blog_installed() && (strpos($_SERVER['PHP_SELF'], 'install.php') === false && !defined('WP_INSTALLING')) ) {
-	if (strpos($_SERVER['PHP_SELF'], 'wp-admin') !== false)
-		$link = 'install.php';
+	if ( defined('WP_SITEURL') )
+		$link = WP_SITEURL . '/wp-admin/install.php';
+	elseif (strpos($_SERVER['PHP_SELF'], 'wp-admin') !== false)
+		$link = preg_replace('|/wp-admin/?.*?$|', '/', $_SERVER['PHP_SELF']) . 'wp-admin/install.php';
 	else
-		$link = 'wp-admin/install.php';
-	wp_die(sprintf("It doesn't look like you've installed WP yet. Try running <a href='%s'>install.php</a>.", $link));
+		$link = preg_replace('|/[^/]+?$|', '/', $_SERVER['PHP_SELF']) . 'wp-admin/install.php';
+	require_once(ABSPATH . WPINC . '/kses.php');
+	require_once(ABSPATH . WPINC . '/pluggable.php');
+	wp_redirect($link);
+	die(); // have to die here ~ Mark
 }
 
 require (ABSPATH . WPINC . '/formatting.php');
@@ -168,21 +260,74 @@
 require (ABSPATH . WPINC . '/version.php');
 require (ABSPATH . WPINC . '/deprecated.php');
 require (ABSPATH . WPINC . '/script-loader.php');
+require (ABSPATH . WPINC . '/taxonomy.php');
+require (ABSPATH . WPINC . '/update.php');
+require (ABSPATH . WPINC . '/canonical.php');
+require (ABSPATH . WPINC . '/shortcodes.php');
+require (ABSPATH . WPINC . '/media.php');
 
 if (strpos($_SERVER['PHP_SELF'], 'install.php') === false) {
-    // Used to guarantee unique hash cookies
-    $cookiehash = md5(get_option('siteurl'));
-	define('COOKIEHASH', $cookiehash); 
-}
-
+	// Used to guarantee unique hash cookies
+	$cookiehash = md5(get_option('siteurl'));
+	/**
+	 * Used to guarantee unique hash cookies
+	 * @since 1.5
+	 */
+	define('COOKIEHASH', $cookiehash);
+}
+
+/**
+ * Should be exactly the same as the default value of SECRET_KEY in wp-config-sample.php
+ * @since 2.5
+ */
+$wp_default_secret_key = 'put your unique phrase here';
+
+/**
+ * It is possible to define this in wp-config.php
+ * @since 2.0.0
+ */
 if ( !defined('USER_COOKIE') )
-	define('USER_COOKIE', 'wordpressuser_'. COOKIEHASH);
+	define('USER_COOKIE', 'wordpressuser_' . COOKIEHASH);
+
+/**
+ * It is possible to define this in wp-config.php
+ * @since 2.0.0
+ */
 if ( !defined('PASS_COOKIE') )
-	define('PASS_COOKIE', 'wordpresspass_'. COOKIEHASH);
+	define('PASS_COOKIE', 'wordpresspass_' . COOKIEHASH);
+
+/**
+ * It is possible to define this in wp-config.php
+ * @since 2.5
+ */
+if ( !defined('AUTH_COOKIE') )
+	define('AUTH_COOKIE', 'wordpress_' . COOKIEHASH);
+
+/**
+ * It is possible to define this in wp-config.php
+ * @since 2.3.0
+ */
+if ( !defined('TEST_COOKIE') )
+	define('TEST_COOKIE', 'wordpress_test_cookie');
+
+/**
+ * It is possible to define this in wp-config.php
+ * @since 1.2.0
+ */
 if ( !defined('COOKIEPATH') )
 	define('COOKIEPATH', preg_replace('|https?://[^/]+|i', '', get_option('home') . '/' ) );
+
+/**
+ * It is possible to define this in wp-config.php
+ * @since 1.5.0
+ */
 if ( !defined('SITECOOKIEPATH') )
 	define('SITECOOKIEPATH', preg_replace('|https?://[^/]+|i', '', get_option('siteurl') . '/' ) );
+
+/**
+ * It is possible to define this in wp-config.php
+ * @since 2.0.0
+ */
 if ( !defined('COOKIE_DOMAIN') )
 	define('COOKIE_DOMAIN', false);
 
@@ -190,8 +335,8 @@
 
 // Check for hacks file if the option is enabled
 if (get_option('hack_file')) {
-	if (file_exists(ABSPATH . '/my-hacks.php'))
-		require(ABSPATH . '/my-hacks.php');
+	if (file_exists(ABSPATH . 'my-hacks.php'))
+		require(ABSPATH . 'my-hacks.php');
 }
 
 if ( get_option('active_plugins') ) {
@@ -206,6 +351,16 @@
 
 require (ABSPATH . WPINC . '/pluggable.php');
 
+/*
+ * In most cases the default internal encoding is latin1, which is of no use,
+ * since we want to use the mb_ functions for utf-8 strings
+ */
+if (function_exists('mb_internal_encoding')) {
+	if (!@mb_internal_encoding(get_option('blog_charset')))
+		mb_internal_encoding('UTF-8');
+}
+
+
 if ( defined('WP_CACHE') && function_exists('wp_cache_postload') )
 	wp_cache_postload();
 
@@ -226,18 +381,55 @@
 
 do_action('sanitize_comment_cookies');
 
+/**
+ * WordPress Query object
+ * @global object $wp_the_query
+ * @since 2.0.0
+ */
 $wp_the_query =& new WP_Query();
+
+/**
+ * Holds the reference to @see $wp_the_query
+ * Use this global for WordPress queries
+ * @global object $wp_query
+ * @since 1.5.0
+ */
 $wp_query     =& $wp_the_query;
+
+/**
+ * Holds the WordPress Rewrite object for creating pretty URLs
+ * @global object $wp_rewrite
+ * @since 1.5.0
+ */
 $wp_rewrite   =& new WP_Rewrite();
+
+/**
+ * WordPress Object
+ * @global object $wp
+ * @since 2.0.0
+ */
 $wp           =& new WP();
 
-validate_current_theme();
+
+/**
+ * Web Path to the current active template directory
+ * @since 1.5
+ */
 define('TEMPLATEPATH', get_template_directory());
+
+/**
+ * Web Path to the current active template stylesheet directory
+ * @since 2.1
+ */
 define('STYLESHEETPATH', get_stylesheet_directory());
 
 // Load the default text localization domain.
 load_default_textdomain();
 
+/**
+ * The locale of the blog
+ * @since 1.5.0
+ */
 $locale = get_locale();
 $locale_file = ABSPATH . LANGDIR . "/$locale.php";
 if ( is_readable($locale_file) )
@@ -246,6 +438,11 @@
 // Pull in locale data after loading text domain.
 require_once(ABSPATH . WPINC . '/locale.php');
 
+/**
+ * WordPress Locale object for loading locale domain date and various strings.
+ * @global object $wp_locale
+ * @since 2.1.0
+ */
 $wp_locale =& new WP_Locale();
 
 // Load functions for active theme.
@@ -254,12 +451,20 @@
 if ( file_exists(TEMPLATEPATH . '/functions.php') )
 	include(TEMPLATEPATH . '/functions.php');
 
+/**
+ * shutdown_action_hook() - Runs just before PHP shuts down execution.
+ *
+ * @access private
+ * @since 1.2
+ */
 function shutdown_action_hook() {
 	do_action('shutdown');
 	wp_cache_close();
 }
 register_shutdown_function('shutdown_action_hook');
 
+$wp->init();  // Sets up current user.
+
 // Everything is loaded and initialized.
 do_action('init');
 
diff -x .svn -aruN 2.2.2.src/wp-trackback.php 2.5.src/wp-trackback.php
--- 2.2.2.src/wp-trackback.php	2007-03-22 19:59:21.000000000 -0500
+++ 2.5.src/wp-trackback.php	2008-03-28 01:51:19.000000000 -0500
@@ -1,7 +1,7 @@
 <?php
 
 if (empty($wp)) {
-	require_once('wp-config.php');
+	require_once('./wp-config.php');
 	wp('tb=1');
 }
 
@@ -43,6 +43,10 @@
 else
 	$charset = 'ASCII, UTF-8, ISO-8859-1, JIS, EUC-JP, SJIS';
 
+// No valid uses for UTF-7
+if ( false !== strpos($charset, 'UTF-7') )
+	die;
+
 if ( function_exists('mb_convert_encoding') ) { // For international trackbacks
 	$title     = mb_convert_encoding($title, get_option('blog_charset'), $charset);
 	$excerpt   = mb_convert_encoding($excerpt, get_option('blog_charset'), $charset);
@@ -69,20 +73,11 @@
 if ( !empty($tb_url) && !empty($title) ) {
 	header('Content-Type: text/xml; charset=' . get_option('blog_charset') );
 
-	$pingstatus = $wpdb->get_var("SELECT ping_status FROM $wpdb->posts WHERE ID = $tb_id");
-
-	if ( 'open' != $pingstatus )
+	if ( !pings_open($tb_id) )
 		trackback_response(1, 'Sorry, trackbacks are closed for this item.');
 
-	$title =  wp_specialchars( strip_tags( $title ) );
-	$excerpt = strip_tags($excerpt);
-	if ( function_exists('mb_strcut') ) { // For international trackbacks
-		$excerpt = mb_strcut($excerpt, 0, 252, get_option('blog_charset')) . '...';
-		$title = mb_strcut($title, 0, 250, get_option('blog_charset')) . '...';
-	} else {
-		$excerpt = (strlen($excerpt) > 255) ? substr($excerpt, 0, 252) . '...' : $excerpt;
-		$title = (strlen($title) > 250) ? substr($title, 0, 250) . '...' : $title;
-	}
+	$title =  wp_html_excerpt( $title, 250 ).'...';
+	$excerpt = wp_html_excerpt( $excerpt, 252 ).'...';
 
 	$comment_post_ID = (int) $tb_id;
 	$comment_author = $blog_name;
@@ -102,4 +97,4 @@
 	do_action('trackback_post', $wpdb->insert_id);
 	trackback_response(0);
 }
-?>
\ No newline at end of file
+?>
diff -x .svn -aruN 2.2.2.src/xmlrpc.php 2.5.src/xmlrpc.php
--- 2.2.2.src/xmlrpc.php	2007-06-19 14:37:05.000000000 -0500
+++ 2.5.src/xmlrpc.php	2008-03-14 14:08:09.000000000 -0500
@@ -5,7 +5,7 @@
 // Some browser-embedded clients send cookies. We don't want them.
 $_COOKIE = array();
 
-// A bug in PHP < 5.2.2 makes $HTTP_RAW_POST_DATA not set by default, 
+// A bug in PHP < 5.2.2 makes $HTTP_RAW_POST_DATA not set by default,
 // but we can do it ourself.
 if ( !isset( $HTTP_RAW_POST_DATA ) ) {
 	$HTTP_RAW_POST_DATA = file_get_contents( 'php://input' );
@@ -17,9 +17,8 @@
 
 include('./wp-config.php');
 
-if ( isset( $_GET['rsd'] ) ) { // http://archipelago.phrasewise.com/rsd 
-header('Content-type: text/xml; charset=' . get_option('blog_charset'), true);
-
+if ( isset( $_GET['rsd'] ) ) { // http://archipelago.phrasewise.com/rsd
+header('Content-Type: text/xml; charset=' . get_option('blog_charset'), true);
 ?>
 <?php echo '<?xml version="1.0" encoding="'.get_option('blog_charset').'"?'.'>'; ?>
 <rsd version="1.0" xmlns="http://archipelago.phrasewise.com/rsd">
@@ -28,10 +27,11 @@
     <engineLink>http://wordpress.org/</engineLink>
     <homePageLink><?php bloginfo_rss('url') ?></homePageLink>
     <apis>
-      <api name="WordPress" blogID="1" preferred="false" apiLink="<?php bloginfo_rss('wpurl') ?>/xmlrpc.php" />
-      <api name="Movable Type" blogID="1" preferred="true" apiLink="<?php bloginfo_rss('wpurl') ?>/xmlrpc.php" />
+      <api name="WordPress" blogID="1" preferred="true" apiLink="<?php bloginfo_rss('wpurl') ?>/xmlrpc.php" />
+      <api name="Movable Type" blogID="1" preferred="false" apiLink="<?php bloginfo_rss('wpurl') ?>/xmlrpc.php" />
       <api name="MetaWeblog" blogID="1" preferred="false" apiLink="<?php bloginfo_rss('wpurl') ?>/xmlrpc.php" />
       <api name="Blogger" blogID="1" preferred="false" apiLink="<?php bloginfo_rss('wpurl') ?>/xmlrpc.php" />
+      <api name="Atom" blogID="" preferred="false" apiLink="<?php echo apply_filters('atom_service_url', (get_bloginfo('url')."/wp-app.php/service"))?>" />
     </apis>
   </service>
 </rsd>
@@ -39,7 +39,7 @@
 exit;
 }
 
-include_once(ABSPATH . 'wp-admin/admin-functions.php');
+include_once(ABSPATH . 'wp-admin/includes/admin.php');
 include_once(ABSPATH . WPINC . '/class-IXR.php');
 
 // Turn off all warnings and errors.
@@ -69,7 +69,6 @@
 if ( isset($HTTP_RAW_POST_DATA) )
   logIO("I", $HTTP_RAW_POST_DATA);
 
-
 class wp_xmlrpc_server extends IXR_Server {
 
 	function wp_xmlrpc_server() {
@@ -84,8 +83,12 @@
 			'wp.getAuthors'			=> 'this:wp_getAuthors',
 			'wp.getCategories'		=> 'this:mw_getCategories',		// Alias
 			'wp.newCategory'		=> 'this:wp_newCategory',
+			'wp.deleteCategory'		=> 'this:wp_deleteCategory',
 			'wp.suggestCategories'	=> 'this:wp_suggestCategories',
 			'wp.uploadFile'			=> 'this:mw_newMediaObject',	// Alias
+			'wp.getCommentCount'	=> 'this:wp_getCommentCount',
+			'wp.getPostStatusList'	=> 'this:wp_getPostStatusList',
+			'wp.getPageStatusList'	=> 'this:wp_getPageStatusList',
 
 			// Blogger API
 			'blogger.getUsersBlogs' => 'this:blogger_getUsersBlogs',
@@ -171,6 +174,49 @@
 		}
 	}
 
+	function get_custom_fields($post_id) {
+		$post_id = (int) $post_id;
+
+		$custom_fields = array();
+
+		foreach ( (array) has_meta($post_id) as $meta ) {
+			// Don't expose protected fields.
+			if ( strpos($meta['meta_key'], '_wp_') === 0 ) {
+				continue;
+			}
+
+			$custom_fields[] = array(
+				"id"    => $meta['meta_id'],
+				"key"   => $meta['meta_key'],
+				"value" => $meta['meta_value']
+			);
+		}
+
+		return $custom_fields;
+	}
+
+	function set_custom_fields($post_id, $fields) {
+		$post_id = (int) $post_id;
+
+		foreach ( (array) $fields as $meta ) {
+			if ( isset($meta['id']) ) {
+				$meta['id'] = (int) $meta['id'];
+
+				if ( isset($meta['key']) ) {
+					update_meta($meta['id'], $meta['key'], $meta['value']);
+				}
+				else {
+					delete_meta($meta['id']);
+				}
+			}
+			else {
+				$_POST['metakeyinput'] = $meta['key'];
+				$_POST['metavalue'] = $meta['value'];
+				add_meta($post_id);
+			}
+		}
+	}
+
 	/**
 	 * WordPress XML-RPC API
 	 * wp_getPage
@@ -187,6 +233,12 @@
 			return($this->error);
 		}
 
+		set_current_user( 0, $username );
+		if( !current_user_can( 'edit_page', $page_id ) )
+			return new IXR_Error( 401, __( 'Sorry, you can not edit this page.' ) );
+
+		do_action('xmlrpc_call', 'wp.getPage');
+
 		// Lookup page info.
 		$page = get_page($page_id);
 
@@ -208,7 +260,8 @@
 			$allow_pings = ("open" == $page->ping_status) ? 1 : 0;
 
 			// Format page date.
-			$page_date = mysql2date("Ymd\TH:i:s\Z", $page->post_date_gmt);
+			$page_date = mysql2date("Ymd\TH:i:s", $page->post_date);
+			$page_date_gmt = mysql2date("Ymd\TH:i:s", $page->post_date_gmt);
 
 			// Pull the categories info together.
 			$categories = array();
@@ -240,7 +293,9 @@
 				"wp_page_parent_title"	=> $parent_title,
 				"wp_page_order"			=> $page->menu_order,
 				"wp_author_id"			=> $author->ID,
-				"wp_author_display_name"	=> $author->display_name
+				"wp_author_display_name"	=> $author->display_name,
+				"date_created_gmt"		=> new IXR_Date($page_date_gmt),
+				"custom_fields"			=> $this->get_custom_fields($page_id)
 			);
 
 			return($page_struct);
@@ -266,6 +321,12 @@
 			return($this->error);
 		}
 
+		set_current_user( 0, $username );
+		if( !current_user_can( 'edit_pages' ) )
+			return new IXR_Error( 401, __( 'Sorry, you can not edit pages.' ) );
+
+		do_action('xmlrpc_call', 'wp.getPages');
+
 		// Lookup info on pages.
 		$pages = get_pages();
 		$num_pages = count($pages);
@@ -304,6 +365,8 @@
 			return($this->error);
 		}
 
+		do_action('xmlrpc_call', 'wp.newPage');
+
 		// Set the user context and check if they are allowed
 		// to add new pages.
 		$user = set_current_user(0, $username);
@@ -334,6 +397,8 @@
 			return($this->error);
 		}
 
+		do_action('xmlrpc_call', 'wp.deletePage');
+
 		// Get the current page based on the page_id and
 		// make sure it is a page and not a post.
 		$actual_page = wp_get_single_post($page_id, ARRAY_A);
@@ -376,6 +441,8 @@
 			return($this->error);
 		}
 
+		do_action('xmlrpc_call', 'wp.editPage');
+
 		// Get the page data and make sure it is a page.
 		$actual_page = wp_get_single_post($page_id, ARRAY_A);
 		if(
@@ -424,12 +491,19 @@
 			return($this->error);
 		}
 
+		set_current_user( 0, $username );
+		if( !current_user_can( 'edit_pages' ) )
+			return new IXR_Error( 401, __( 'Sorry, you can not edit pages.' ) );
+
+		do_action('xmlrpc_call', 'wp.getPageList');
+
 		// Get list of pages ids and titles
 		$page_list = $wpdb->get_results("
 			SELECT ID page_id,
 				post_title page_title,
 				post_parent page_parent_id,
-				post_date_gmt
+				post_date_gmt,
+				post_date
 			FROM {$wpdb->posts}
 			WHERE post_type = 'page'
 			ORDER BY ID
@@ -438,10 +512,14 @@
 		// The date needs to be formated properly.
 		$num_pages = count($page_list);
 		for($i = 0; $i < $num_pages; $i++) {
-			$post_date = mysql2date("Ymd\TH:i:s\Z", $page_list[$i]->post_date_gmt);
+			$post_date = mysql2date("Ymd\TH:i:s", $page_list[$i]->post_date);
+			$post_date_gmt = mysql2date("Ymd\TH:i:s", $page_list[$i]->post_date_gmt);
+
 			$page_list[$i]->dateCreated = new IXR_Date($post_date);
+			$page_list[$i]->date_created_gmt = new IXR_Date($post_date_gmt);
 
 			unset($page_list[$i]->post_date_gmt);
+			unset($page_list[$i]->post_date);
 		}
 
 		return($page_list);
@@ -452,7 +530,6 @@
 	 * wp_getAuthors
 	 */
 	function wp_getAuthors($args) {
-		global $wpdb;
 
 		$this->escape($args);
 
@@ -464,7 +541,23 @@
 			return($this->error);
 		}
 
-		return(get_users_of_blog());
+		set_current_user(0, $username);
+		if(!current_user_can("edit_posts")) {
+			return(new IXR_Error(401, __("Sorry, you can not edit posts on this blog.")));
+        }
+
+		do_action('xmlrpc_call', 'wp.getAuthors');
+
+		$authors = array();
+		foreach( (array) get_users_of_blog() as $row ) {
+			$authors[] = array(
+				"user_id"       => $row->user_id,
+				"user_login"    => $row->user_login,
+				"display_name"  => $row->display_name
+			);
+		}
+
+		return($authors);
 	}
 
 	/**
@@ -483,17 +576,15 @@
 			return($this->error);
 		}
 
+		do_action('xmlrpc_call', 'wp.newCategory');
+
 		// Set the user context and make sure they are
 		// allowed to add a category.
 		set_current_user(0, $username);
-		if(!current_user_can("manage_categories", $page_id)) {
+		if(!current_user_can("manage_categories")) {
 			return(new IXR_Error(401, __("Sorry, you do not have the right to add a category.")));
 		}
 
-		// We need this to make use of the wp_insert_category()
-		// funciton.
-		require_once(ABSPATH . "wp-admin/admin-db.php");
-
 		// If no slug was provided make it empty so that
 		// WordPress will generate one.
 		if(empty($category["slug"])) {
@@ -509,7 +600,7 @@
 		if(empty($category["description"])) {
 			$category["description"] = "";
 		}
-	
+
 		$new_category = array(
 			"cat_name"				=> $category["name"],
 			"category_nicename"		=> $category["slug"],
@@ -527,11 +618,36 @@
 
 	/**
 	 * WordPress XML-RPC API
+	 * wp_deleteCategory
+	 */
+	function wp_deleteCategory($args) {
+		$this->escape($args);
+
+		$blog_id		= (int) $args[0];
+		$username		= $args[1];
+		$password		= $args[2];
+		$category_id	= (int) $args[3];
+
+		if( !$this->login_pass_ok( $username, $password ) ) {
+			return $this->error;
+		}
+
+		do_action('xmlrpc_call', 'wp.deleteCategory');
+
+		set_current_user(0, $username);
+		if( !current_user_can("manage_categories") ) {
+			return new IXR_Error( 401, __( "Sorry, you do not have the right to delete a category." ) );
+		}
+
+		return wp_delete_category( $category_id );
+	}
+
+
+	/**
+	 * WordPress XML-RPC API
 	 * wp_suggestCategories
 	 */
 	function wp_suggestCategories($args) {
-		global $wpdb;
-
 		$this->escape($args);
 
 		$blog_id				= (int) $args[0];
@@ -544,23 +660,90 @@
 			return($this->error);
 		}
 
-		// Only set a limit if one was provided.
-		$limit = "";
-		if(!empty($max_results)) {
-			$limit = "LIMIT {$max_results}";
-		}
+		set_current_user(0, $username);
+		if( !current_user_can( 'edit_posts' ) )
+			return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts to this blog in order to view categories.' ) );
 
-		$category_suggestions = $wpdb->get_results("
-			SELECT cat_ID category_id,
-				cat_name category_name
-			FROM {$wpdb->categories}
-			WHERE cat_name LIKE '{$category}%'
-			{$limit}
-		");
+		do_action('xmlrpc_call', 'wp.suggestCategories');
+
+		$category_suggestions = array();
+		$args = array('get' => 'all', 'number' => $max_results, 'name__like' => $category);
+		foreach ( (array) get_categories($args) as $cat ) {
+			$category_suggestions[] = array(
+				"category_id"	=> $cat->cat_ID,
+				"category_name"	=> $cat->cat_name
+			);
+		}
 
 		return($category_suggestions);
 	}
 
+	function wp_getCommentCount( $args ) {
+		$this->escape($args);
+
+		$blog_id	= (int) $args[0];
+		$username	= $args[1];
+		$password	= $args[2];
+		$post_id	= (int) $args[3];
+
+		if( !$this->login_pass_ok( $username, $password ) ) {
+			return new IXR_Error( 403, __( 'Bad login/pass combination.' ) );
+		}
+
+		set_current_user( 0, $username );
+		if( !current_user_can( 'edit_posts' ) ) {
+			return new IXR_Error( 403, __( 'You are not allowed access to details about comments.' ) );
+		}
+
+		do_action('xmlrpc_call', 'wp.getCommentCount');
+
+		return get_comment_count( $post_id );
+	}
+
+
+	function wp_getPostStatusList( $args ) {
+		$this->escape( $args );
+
+		$blog_id	= (int) $args[0];
+		$username	= $args[1];
+		$password	= $args[2];
+
+		if( !$this->login_pass_ok( $username, $password ) ) {
+			return new IXR_Error( 403, __( 'Bad login/pass combination.' ) );
+		}
+
+		set_current_user( 0, $username );
+		if( !current_user_can( 'edit_posts' ) ) {
+			return new IXR_Error( 403, __( 'You are not allowed access to details about this blog.' ) );
+		}
+
+		do_action('xmlrpc_call', 'wp.getPostStatusList');
+
+		return get_post_statuses( );
+	}
+
+
+	function wp_getPageStatusList( $args ) {
+		$this->escape( $args );
+
+		$blog_id	= (int) $args[0];
+		$username	= $args[1];
+		$password	= $args[2];
+
+		if( !$this->login_pass_ok( $username, $password ) ) {
+			return new IXR_Error( 403, __( 'Bad login/pass combination.' ) );
+		}
+
+		set_current_user( 0, $username );
+		if( !current_user_can( 'edit_posts' ) ) {
+			return new IXR_Error( 403, __( 'You are not allowed access to details about this blog.' ) );
+		}
+
+		do_action('xmlrpc_call', 'wp.getPageStatusList');
+
+		return get_page_statuses( );
+	}
+
 
 	/* Blogger API functions
 	 * specs on http://plant.blogger.com/api and http://groups.yahoo.com/group/bloggerDev/
@@ -579,6 +762,8 @@
 			return $this->error;
 		}
 
+		do_action('xmlrpc_call', 'blogger.getUsersBlogs');
+
 		set_current_user(0, $user_login);
 		$is_admin = current_user_can('level_8');
 
@@ -605,13 +790,18 @@
 			return $this->error;
 		}
 
+		set_current_user( 0, $user_login );
+		if( !current_user_can( 'edit_posts' ) )
+			return new IXR_Error( 401, __( 'Sorry, you do not have access to user data on this blog.' ) );
+
+		do_action('xmlrpc_call', 'blogger.getUserInfo');
+
 		$user_data = get_userdatabylogin($user_login);
 
 		$struct = array(
 			'nickname'  => $user_data->nickname,
 			'userid'    => $user_data->ID,
 			'url'       => $user_data->user_url,
-			'email'     => $user_data->user_email,
 			'lastname'  => $user_data->last_name,
 			'firstname' => $user_data->first_name
 		);
@@ -633,7 +823,12 @@
 			return $this->error;
 		}
 
-		$user_data = get_userdatabylogin($user_login);
+		set_current_user( 0, $user_login );
+		if( !current_user_can( 'edit_post', $post_ID ) )
+			return new IXR_Error( 401, __( 'Sorry, you can not edit this post.' ) );
+
+		do_action('xmlrpc_call', 'blogger.getPost');
+
 		$post_data = wp_get_single_post($post_ID, ARRAY_A);
 
 		$categories = implode(',', wp_get_post_categories($post_ID));
@@ -656,8 +851,6 @@
 	/* blogger.getRecentPosts ...gets recent posts */
 	function blogger_getRecentPosts($args) {
 
-		global $wpdb;
-
 		$this->escape($args);
 
 		$blog_ID    = (int) $args[1]; /* though we don't use it yet */
@@ -669,14 +862,20 @@
 			return $this->error;
 		}
 
+		do_action('xmlrpc_call', 'blogger.getRecentPosts');
+
 		$posts_list = wp_get_recent_posts($num_posts);
 
+		set_current_user( 0, $user_login );
+
 		if (!$posts_list) {
 			$this->error = new IXR_Error(500, __('Either there are no posts, or something went wrong.'));
 			return $this->error;
 		}
 
 		foreach ($posts_list as $entry) {
+			if( !current_user_can( 'edit_post', $entry['ID'] ) )
+				continue;
 
 			$post_date = mysql2date('Ymd\TH:i:s', $entry['post_date']);
 			$categories = implode(',', wp_get_post_categories($entry['ID']));
@@ -717,12 +916,14 @@
 	    return $this->error;
 	  }
 
+	  do_action('xmlrpc_call', 'blogger.getTemplate');
+
 	  set_current_user(0, $user_login);
 	  if ( !current_user_can('edit_themes') ) {
 	    return new IXR_Error(401, __('Sorry, this user can not edit the template.'));
 	  }
 
-	  /* warning: here we make the assumption that the weblog's URL is on the same server */
+	  /* warning: here we make the assumption that the blog's URL is on the same server */
 	  $filename = get_option('home') . '/';
 	  $filename = preg_replace('#https?://.+?/#', $_SERVER['DOCUMENT_ROOT'].'/', $filename);
 
@@ -731,7 +932,7 @@
 	  fclose($f);
 
 	  /* so it is actually editable with a windows/mac client */
-	  // FIXME: (or delete me) do we really want to cater to bad clients at the expense of good ones by BEEPing up their line breaks? commented.     $content = str_replace("\n", "\r\n", $content); 
+	  // FIXME: (or delete me) do we really want to cater to bad clients at the expense of good ones by BEEPing up their line breaks? commented.     $content = str_replace("\n", "\r\n", $content);
 
 	  return $content;
 	}
@@ -742,168 +943,170 @@
 
 		$this->escape($args);
 
-	  $blog_ID    = (int) $args[1];
-	  $user_login = $args[2];
-	  $user_pass  = $args[3];
-	  $content    = $args[4];
-	  $template   = $args[5]; /* could be 'main' or 'archiveIndex', but we don't use it */
+		$blog_ID    = (int) $args[1];
+		$user_login = $args[2];
+		$user_pass  = $args[3];
+		$content    = $args[4];
+		$template   = $args[5]; /* could be 'main' or 'archiveIndex', but we don't use it */
 
-	  if (!$this->login_pass_ok($user_login, $user_pass)) {
-	    return $this->error;
-	  }
+		if (!$this->login_pass_ok($user_login, $user_pass)) {
+			return $this->error;
+		}
 
-	  set_current_user(0, $user_login);
-	  if ( !current_user_can('edit_themes') ) {
-	    return new IXR_Error(401, __('Sorry, this user can not edit the template.'));
-	  }
+		do_action('xmlrpc_call', 'blogger.setTemplate');
 
-	  /* warning: here we make the assumption that the weblog's URL is on the same server */
-	  $filename = get_option('home') . '/';
-	  $filename = preg_replace('#https?://.+?/#', $_SERVER['DOCUMENT_ROOT'].'/', $filename);
+		set_current_user(0, $user_login);
+		if ( !current_user_can('edit_themes') ) {
+			return new IXR_Error(401, __('Sorry, this user can not edit the template.'));
+		}
 
-	  if ($f = fopen($filename, 'w+')) {
-	    fwrite($f, $content);
-	    fclose($f);
-	  } else {
-	    return new IXR_Error(500, __('Either the file is not writable, or something wrong happened. The file has not been updated.'));
-	  }
+		/* warning: here we make the assumption that the blog's URL is on the same server */
+		$filename = get_option('home') . '/';
+		$filename = preg_replace('#https?://.+?/#', $_SERVER['DOCUMENT_ROOT'].'/', $filename);
 
-	  return true;
+		if ($f = fopen($filename, 'w+')) {
+			fwrite($f, $content);
+			fclose($f);
+		} else {
+			return new IXR_Error(500, __('Either the file is not writable, or something wrong happened. The file has not been updated.'));
+		}
+
+		return true;
 	}
 
 
 	/* blogger.newPost ...creates a new post */
 	function blogger_newPost($args) {
 
-	  global $wpdb;
-
 		$this->escape($args);
 
-	  $blog_ID    = (int) $args[1]; /* though we don't use it yet */
-	  $user_login = $args[2];
-	  $user_pass  = $args[3];
-	  $content    = $args[4];
-	  $publish    = $args[5];
+		$blog_ID    = (int) $args[1]; /* though we don't use it yet */
+		$user_login = $args[2];
+		$user_pass  = $args[3];
+		$content    = $args[4];
+		$publish    = $args[5];
 
-	  if (!$this->login_pass_ok($user_login, $user_pass)) {
-	    return $this->error;
-	  }
-	  
-	  $cap = ($publish) ? 'publish_posts' : 'edit_posts';
-	  $user = set_current_user(0, $user_login);
-	  if ( !current_user_can($cap) )
-	    return new IXR_Error(401, __('Sorry, you can not post on this weblog or category.'));
+		if (!$this->login_pass_ok($user_login, $user_pass)) {
+			return $this->error;
+		}
 
-	  $post_status = ($publish) ? 'publish' : 'draft';
+		do_action('xmlrpc_call', 'blogger.newPost');
 
-	  $post_author = $user->ID;
+		$cap = ($publish) ? 'publish_posts' : 'edit_posts';
+		$user = set_current_user(0, $user_login);
+		if ( !current_user_can($cap) )
+			return new IXR_Error(401, __('Sorry, you are not allowed to post on this blog.'));
 
-	  $post_title = xmlrpc_getposttitle($content);
-	  $post_category = xmlrpc_getpostcategory($content);
-	  $post_content = xmlrpc_removepostdata($content);
+		$post_status = ($publish) ? 'publish' : 'draft';
 
-	  $post_date = current_time('mysql');
-	  $post_date_gmt = current_time('mysql', 1);
+		$post_author = $user->ID;
 
-	  $post_data = compact('blog_ID', 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_category', 'post_status');
+		$post_title = xmlrpc_getposttitle($content);
+		$post_category = xmlrpc_getpostcategory($content);
+		$post_content = xmlrpc_removepostdata($content);
 
-	  $post_ID = wp_insert_post($post_data);
+		$post_date = current_time('mysql');
+		$post_date_gmt = current_time('mysql', 1);
 
-	  if (!$post_ID) {
-	    return new IXR_Error(500, __('Sorry, your entry could not be posted. Something wrong happened.'));
-	  }
-	  $this->attach_uploads( $post_ID, $post_content );
+		$post_data = compact('blog_ID', 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_category', 'post_status');
 
-	  logIO('O', "Posted ! ID: $post_ID");
+		$post_ID = wp_insert_post($post_data);
+		if ( is_wp_error( $post_ID ) )
+			return new IXR_Error(500, $post_ID->get_error_message());
 
-	  return $post_ID;
-	}
+		if (!$post_ID)
+			return new IXR_Error(500, __('Sorry, your entry could not be posted. Something wrong happened.'));
+
+		$this->attach_uploads( $post_ID, $post_content );
 
+		logIO('O', "Posted ! ID: $post_ID");
+
+		return $post_ID;
+	}
 
 	/* blogger.editPost ...edits a post */
 	function blogger_editPost($args) {
 
-	  global $wpdb;
-
 		$this->escape($args);
 
-	  $post_ID     = (int) $args[1];
-	  $user_login  = $args[2];
-	  $user_pass   = $args[3];
-	  $content     = $args[4];
-	  $publish     = $args[5];
+		$post_ID     = (int) $args[1];
+		$user_login  = $args[2];
+		$user_pass   = $args[3];
+		$content     = $args[4];
+		$publish     = $args[5];
 
-	  if (!$this->login_pass_ok($user_login, $user_pass)) {
-	    return $this->error;
-	  }
+		if (!$this->login_pass_ok($user_login, $user_pass)) {
+			return $this->error;
+		}
 
-	  $actual_post = wp_get_single_post($post_ID,ARRAY_A);
+		do_action('xmlrpc_call', 'blogger.editPost');
 
-	  if (!$actual_post) {
-	  	return new IXR_Error(404, __('Sorry, no such post.'));
-	  }
+		$actual_post = wp_get_single_post($post_ID,ARRAY_A);
+
+		if (!$actual_post) {
+			return new IXR_Error(404, __('Sorry, no such post.'));
+		}
 
 		$this->escape($actual_post);
 
-	  set_current_user(0, $user_login);
-	  if ( !current_user_can('edit_post', $post_ID) )
-	    return new IXR_Error(401, __('Sorry, you do not have the right to edit this post.'));
+		set_current_user(0, $user_login);
+		if ( !current_user_can('edit_post', $post_ID) )
+			return new IXR_Error(401, __('Sorry, you do not have the right to edit this post.'));
 
-	  extract($actual_post, EXTR_SKIP);
+		extract($actual_post, EXTR_SKIP);
 
-	  if ( ('publish' == $post_status) && !current_user_can('publish_posts') )
-	  	return new IXR_Error(401, __('Sorry, you do not have the right to publish this post.'));
+		if ( ('publish' == $post_status) && !current_user_can('publish_posts') )
+			return new IXR_Error(401, __('Sorry, you do not have the right to publish this post.'));
 
-	  $post_title = xmlrpc_getposttitle($content);
-	  $post_category = xmlrpc_getpostcategory($content);
-	  $post_content = xmlrpc_removepostdata($content);
+		$post_title = xmlrpc_getposttitle($content);
+		$post_category = xmlrpc_getpostcategory($content);
+		$post_content = xmlrpc_removepostdata($content);
 
-	  $postdata = compact('ID', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt');
+		$postdata = compact('ID', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt');
 
-	  $result = wp_update_post($postdata);
+		$result = wp_update_post($postdata);
 
-	  if (!$result) {
-	  	return new IXR_Error(500, __('For some strange yet very annoying reason, this post could not be edited.'));
-	  }
-	  $this->attach_uploads( $ID, $post_content );
+		if (!$result) {
+			return new IXR_Error(500, __('For some strange yet very annoying reason, this post could not be edited.'));
+		}
+		$this->attach_uploads( $ID, $post_content );
 
-	  return true;
+		return true;
 	}
 
 
 	/* blogger.deletePost ...deletes a post */
 	function blogger_deletePost($args) {
-
-	  global $wpdb;
-
 		$this->escape($args);
 
-	  $post_ID     = (int) $args[1];
-	  $user_login  = $args[2];
-	  $user_pass   = $args[3];
-	  $publish     = $args[4];
+		$post_ID     = (int) $args[1];
+		$user_login  = $args[2];
+		$user_pass   = $args[3];
+		$publish     = $args[4];
 
-	  if (!$this->login_pass_ok($user_login, $user_pass)) {
-	    return $this->error;
-	  }
+		if (!$this->login_pass_ok($user_login, $user_pass)) {
+			return $this->error;
+		}
 
-	  $actual_post = wp_get_single_post($post_ID,ARRAY_A);
+		do_action('xmlrpc_call', 'blogger.deletePost');
 
-	  if (!$actual_post) {
-	  	return new IXR_Error(404, __('Sorry, no such post.'));
-	  }
+		$actual_post = wp_get_single_post($post_ID,ARRAY_A);
 
-	  set_current_user(0, $user_login);
-	  if ( !current_user_can('edit_post', $post_ID) )
-	    return new IXR_Error(401, __('Sorry, you do not have the right to delete this post.'));
+		if (!$actual_post) {
+			return new IXR_Error(404, __('Sorry, no such post.'));
+		}
 
-	  $result = wp_delete_post($post_ID);
+		set_current_user(0, $user_login);
+		if ( !current_user_can('edit_post', $post_ID) )
+			return new IXR_Error(401, __('Sorry, you do not have the right to delete this post.'));
 
-	  if (!$result) {
-	  	return new IXR_Error(500, __('For some strange yet very annoying reason, this post could not be deleted.'));
-	  }
+		$result = wp_delete_post($post_ID);
 
-	  return true;
+		if (!$result) {
+			return new IXR_Error(500, __('For some strange yet very annoying reason, this post could not be deleted.'));
+		}
+
+		return true;
 	}
 
 
@@ -914,33 +1117,41 @@
 
 	/* metaweblog.newPost creates a post */
 	function mw_newPost($args) {
-
-	  global $wpdb, $post_default_category;
-
 		$this->escape($args);
 
-	  $blog_ID     = (int) $args[0]; // we will support this in the near future
-	  $user_login  = $args[1];
-	  $user_pass   = $args[2];
-	  $content_struct = $args[3];
-	  $publish     = $args[4];
+		$blog_ID     = (int) $args[0]; // we will support this in the near future
+		$user_login  = $args[1];
+		$user_pass   = $args[2];
+		$content_struct = $args[3];
+		$publish     = $args[4];
 
-	  if (!$this->login_pass_ok($user_login, $user_pass)) {
-	    return $this->error;
-	  }
+		if (!$this->login_pass_ok($user_login, $user_pass)) {
+			return $this->error;
+		}
+		$user = set_current_user(0, $user_login);
 
-      $cap = ($publish) ? 'publish_posts' : 'edit_posts';
-	  $user = set_current_user(0, $user_login);
-	  if ( !current_user_can($cap) )
-	    return new IXR_Error(401, __('Sorry, you can not post on this weblog or category.'));
+		do_action('xmlrpc_call', 'metaWeblog.newPost');
 
-		// The post_type defaults to post, but could also be page.
-		$post_type = "post";
-		if(
-			!empty($content_struct["post_type"])
-			&& ($content_struct["post_type"] == "page")
-		) {
-			$post_type = "page";
+		$cap = ( $publish ) ? 'publish_posts' : 'edit_posts';
+		$error_message = __( 'Sorry, you are not allowed to publish posts on this blog.' );
+		$post_type = 'post';
+		if( !empty( $content_struct['post_type'] ) ) {
+			if( $content_struct['post_type'] == 'page' ) {
+				$cap = ( $publish ) ? 'publish_pages' : 'edit_pages';
+				$error_message = __( 'Sorry, you are not allowed to publish pages on this blog.' );
+				$post_type = 'page';
+			}
+			elseif( $content_struct['post_type'] == 'post' ) {
+				// This is the default, no changes needed
+			}
+			else {
+				// No other post_type values are allowed here
+				return new IXR_Error( 401, __( 'Invalid post type.' ) );
+			}
+		}
+
+		if( !current_user_can( $cap ) ) {
+			return new IXR_Error( 401, $error_message );
 		}
 
 		// Let WordPress generate the post_name (slug) unless
@@ -965,7 +1176,7 @@
 			$menu_order = $content_struct["wp_page_order"];
 		}
 
-	  $post_author = $user->ID;
+		$post_author = $user->ID;
 
 		// If an author id was provided then use it instead.
 		if(
@@ -975,14 +1186,12 @@
 			switch($post_type) {
 				case "post":
 					if(!current_user_can("edit_others_posts")) {
-						return(new IXR_Error(401, "You are not allowed to " .
-							"post as this user"));
+						return(new IXR_Error(401, __("You are not allowed to post as this user")));
 					}
 					break;
 				case "page":
 					if(!current_user_can("edit_others_pages")) {
-						return(new IXR_Error(401, "You are not allowed to " .
-							"create pages as this user"));
+						return(new IXR_Error(401, __("You are not allowed to create pages as this user")));
 					}
 					break;
 				default:
@@ -992,12 +1201,34 @@
 			$post_author = $content_struct["wp_author_id"];
 		}
 
-	  $post_title = $content_struct['title'];
-	  $post_content = apply_filters( 'content_save_pre', $content_struct['description'] );
-	  $post_status = $publish ? 'publish' : 'draft';
+		$post_title = $content_struct['title'];
+		$post_content = apply_filters( 'content_save_pre', $content_struct['description'] );
 
-	  $post_excerpt = $content_struct['mt_excerpt'];
-	  $post_more = $content_struct['mt_text_more'];
+		$post_status = $publish ? 'publish' : 'draft';
+
+		if( isset( $content_struct["{$post_type}_status"] ) ) {
+			switch( $content_struct["{$post_type}_status"] ) {
+				case 'draft':
+				case 'private':
+				case 'publish':
+					$post_status = $content_struct["{$post_type}_status"];
+					break;
+				case 'pending':
+					// Pending is only valid for posts, not pages.
+					if( $post_type === 'post' ) {
+						$post_status = $content_struct["{$post_type}_status"];
+					}
+					break;
+				default:
+					$post_status = $publish ? 'publish' : 'draft';
+					break;
+			}
+		}
+
+		$post_excerpt = $content_struct['mt_excerpt'];
+		$post_more = $content_struct['mt_text_more'];
+
+		$tags_input = $content_struct['mt_keywords'];
 
 		if(isset($content_struct["mt_allow_comments"])) {
 			if(!is_numeric($content_struct["mt_allow_comments"])) {
@@ -1016,6 +1247,7 @@
 			else {
 				switch((int) $content_struct["mt_allow_comments"]) {
 					case 0:
+					case 2:
 						$comment_status = "closed";
 						break;
 					case 1:
@@ -1033,7 +1265,7 @@
 
 		if(isset($content_struct["mt_allow_pings"])) {
 			if(!is_numeric($content_struct["mt_allow_pings"])) {
-				switch($content["mt_allow_pings"]) {
+				switch($content_struct['mt_allow_pings']) {
 					case "closed":
 						$ping_status = "closed";
 						break;
@@ -1063,49 +1295,58 @@
 			$ping_status = get_option("default_ping_status");
 		}
 
-	  if ($post_more) {
-	    $post_content = $post_content . "\n<!--more-->\n" . $post_more;
-	  }
+		if ($post_more) {
+			$post_content = $post_content . "\n<!--more-->\n" . $post_more;
+		}
 
-	  $to_ping = $content_struct['mt_tb_ping_urls'];
-	  if ( is_array($to_ping) )
-	  	$to_ping = implode(' ', $to_ping);
-
-	  // Do some timestamp voodoo
-	  $dateCreatedd = $content_struct['dateCreated'];
-	  if (!empty($dateCreatedd)) {
-	    $dateCreated = $dateCreatedd->getIso();
-	    $post_date     = get_date_from_gmt(iso8601_to_datetime($dateCreated));
-	    $post_date_gmt = iso8601_to_datetime($dateCreated. "Z", GMT);
-	  } else {
-	    $post_date     = current_time('mysql');
-	    $post_date_gmt = current_time('mysql', 1);
-	  }
+		$to_ping = $content_struct['mt_tb_ping_urls'];
+		if ( is_array($to_ping) )
+			$to_ping = implode(' ', $to_ping);
+
+		// Do some timestamp voodoo
+		if ( !empty( $content_struct['date_created_gmt'] ) )
+			$dateCreated = str_replace( 'Z', '', $content_struct['date_created_gmt']->getIso() ) . 'Z'; // We know this is supposed to be GMT, so we're going to slap that Z on there by force
+		elseif ( !empty( $content_struct['dateCreated']) )
+			$dateCreated = $content_struct['dateCreated']->getIso();
+
+		if ( !empty( $dateCreated ) ) {
+			$post_date = get_date_from_gmt(iso8601_to_datetime($dateCreated));
+			$post_date_gmt = iso8601_to_datetime($dateCreated, GMT);
+		} else {
+			$post_date = current_time('mysql');
+			$post_date_gmt = current_time('mysql', 1);
+		}
 
-	  $catnames = $content_struct['categories'];
-	  logIO('O', 'Post cats: ' . printr($catnames,true));
-	  $post_category = array();
-
-	  if (is_array($catnames)) {
-	    foreach ($catnames as $cat) {
-	      $post_category[] = get_cat_ID($cat);
-	    }
-	  }
+		$catnames = $content_struct['categories'];
+		logIO('O', 'Post cats: ' . var_export($catnames,true));
+		$post_category = array();
 
-	  // We've got all the data -- post it:
-	  $postdata = compact('post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'comment_status', 'ping_status', 'to_ping', 'post_type', 'post_name', 'post_password', 'post_parent', 'menu_order');
+		if (is_array($catnames)) {
+			foreach ($catnames as $cat) {
+				$post_category[] = get_cat_ID($cat);
+			}
+		}
 
-	  $post_ID = wp_insert_post($postdata);
+		// We've got all the data -- post it:
+		$postdata = compact('post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'comment_status', 'ping_status', 'to_ping', 'post_type', 'post_name', 'post_password', 'post_parent', 'menu_order', 'tags_input');
 
-	  if (!$post_ID) {
-	    return new IXR_Error(500, __('Sorry, your entry could not be posted. Something wrong happened.'));
-	  }
+		$post_ID = wp_insert_post($postdata);
+		if ( is_wp_error( $post_ID ) )
+			return new IXR_Error(500, $post_ID->get_error_message());
+
+		if (!$post_ID) {
+			return new IXR_Error(500, __('Sorry, your entry could not be posted. Something wrong happened.'));
+		}
 
-	  $this->attach_uploads( $post_ID, $post_content );
+		if ( isset($content_struct['custom_fields']) ) {
+			$this->set_custom_fields($post_ID, $content_struct['custom_fields']);
+		}
+
+		$this->attach_uploads( $post_ID, $post_content );
 
-	  logIO('O', "Posted ! ID: $post_ID");
+		logIO('O', "Posted ! ID: $post_ID");
 
-	  return strval($post_ID);
+		return strval($post_ID);
 	}
 
 	function attach_uploads( $post_ID, $post_content ) {
@@ -1125,36 +1366,44 @@
 	/* metaweblog.editPost ...edits a post */
 	function mw_editPost($args) {
 
-	  global $wpdb, $post_default_category;
-
 		$this->escape($args);
 
-	  $post_ID     = (int) $args[0];
-	  $user_login  = $args[1];
-	  $user_pass   = $args[2];
-	  $content_struct = $args[3];
-	  $publish     = $args[4];
-
-	  if (!$this->login_pass_ok($user_login, $user_pass)) {
-	    return $this->error;
-	  }
+		$post_ID     = (int) $args[0];
+		$user_login  = $args[1];
+		$user_pass   = $args[2];
+		$content_struct = $args[3];
+		$publish     = $args[4];
 
+		if (!$this->login_pass_ok($user_login, $user_pass)) {
+			return $this->error;
+		}
 		$user = set_current_user(0, $user_login);
 
-		// The post_type defaults to post, but could also be page.
-		$post_type = "post";
-		if(
-			!empty($content_struct["post_type"])
-			&& ($content_struct["post_type"] == "page")
-		) {
-			$post_type = "page";
+		do_action('xmlrpc_call', 'metaWeblog.editPost');
+
+		$cap = ( $publish ) ? 'publish_posts' : 'edit_posts';
+		$error_message = __( 'Sorry, you are not allowed to publish posts on this blog.' );
+		$post_type = 'post';
+		if( !empty( $content_struct['post_type'] ) ) {
+			if( $content_struct['post_type'] == 'page' ) {
+				$cap = ( $publish ) ? 'publish_pages' : 'edit_pages';
+				$error_message = __( 'Sorry, you are not allowed to publish pages on this blog.' );
+				$post_type = 'page';
+			}
+			elseif( $content_struct['post_type'] == 'post' ) {
+				// This is the default, no changes needed
+			}
+			else {
+				// No other post_type values are allowed here
+				return new IXR_Error( 401, __( 'Invalid post type.' ) );
+			}
 		}
 
-	  // Edit page caps are checked in editPage.  Just check post here.
-	  if ( ( 'post' == $post_type ) && !current_user_can('edit_post', $post_ID) )
-	    return new IXR_Error(401, __('Sorry, you can not edit this post.'));
+		if( !current_user_can( $cap ) ) {
+			return new IXR_Error( 401, $error_message );
+		}
 
-	  $postdata = wp_get_single_post($post_ID, ARRAY_A);
+		$postdata = wp_get_single_post($post_ID, ARRAY_A);
 
 		// If there is no post data for the give post id, stop
 		// now and return an error.  Other wise a new post will be
@@ -1197,14 +1446,12 @@
 			switch($post_type) {
 				case "post":
 					if(!current_user_can("edit_others_posts")) {
-						return(new IXR_Error(401, "You are not allowed to " .
-							"change the post author as this user."));
+						return(new IXR_Error(401, __("You are not allowed to change the post author as this user.")));
 					}
 					break;
 				case "page":
 					if(!current_user_can("edit_others_pages")) {
-						return(new IXR_Error(401, "You are not allowed to " .
-							"change the page author as this user."));
+						return(new IXR_Error(401, __("You are not allowed to change the page author as this user.")));
 					}
 					break;
 				default:
@@ -1231,6 +1478,7 @@
 			else {
 				switch((int) $content_struct["mt_allow_comments"]) {
 					case 0:
+					case 2:
 						$comment_status = "closed";
 						break;
 					case 1:
@@ -1245,7 +1493,7 @@
 
 		if(isset($content_struct["mt_allow_pings"])) {
 			if(!is_numeric($content_struct["mt_allow_pings"])) {
-				switch($content["mt_allow_pings"]) {
+				switch($content_struct["mt_allow_pings"]) {
 					case "closed":
 						$ping_status = "closed";
 						break;
@@ -1272,124 +1520,175 @@
 			}
 		}
 
-	  $post_title = $content_struct['title'];
-	  $post_content = apply_filters( 'content_save_pre', $content_struct['description'] );
-	  $catnames = $content_struct['categories'];
-
-	  $post_category = array();
-
-	  if (is_array($catnames)) {
-	    foreach ($catnames as $cat) {
-	      $post_category[] = get_cat_ID($cat);
-	    }
-	  }
+		$post_title = $content_struct['title'];
+		$post_content = apply_filters( 'content_save_pre', $content_struct['description'] );
+		$catnames = $content_struct['categories'];
+
+		$post_category = array();
+
+		if (is_array($catnames)) {
+			foreach ($catnames as $cat) {
+		 		$post_category[] = get_cat_ID($cat);
+			}
+		}
 
-	  $post_excerpt = $content_struct['mt_excerpt'];
-	  $post_more = $content_struct['mt_text_more'];
-	  $post_status = $publish ? 'publish' : 'draft';
-
-	  if ( ('publish' == $post_status) ) {
-	  	if ( ( 'page' == $post_type ) && !current_user_can('publish_pages') )
-	  		return new IXR_Error(401, __('Sorry, you do not have the right to publish this page.'));
-	  	else if ( !current_user_can('publish_posts') )
-		  	return new IXR_Error(401, __('Sorry, you do not have the right to publish this post.'));
-	  }
+		$post_excerpt = $content_struct['mt_excerpt'];
+		$post_more = $content_struct['mt_text_more'];
 
-	  if ($post_more) {
-	    $post_content = $post_content . "\n<!--more-->\n" . $post_more;
-	  }
+		$post_status = $publish ? 'publish' : 'draft';
+		if( isset( $content_struct["{$post_type}_status"] ) ) {
+			switch( $content_struct["{$post_type}_status"] ) {
+				case 'draft':
+				case 'private':
+				case 'publish':
+					$post_status = $content_struct["{$post_type}_status"];
+					break;
+				case 'pending':
+					// Pending is only valid for posts, not pages.
+					if( $post_type === 'post' ) {
+						$post_status = $content_struct["{$post_type}_status"];
+					}
+					break;
+				default:
+					$post_status = $publish ? 'publish' : 'draft';
+					break;
+			}
+		}
 
-	  $to_ping = $content_struct['mt_tb_ping_urls'];
-	  if ( is_array($to_ping) )
-	  	$to_ping = implode(' ', $to_ping);
-
-	  // Do some timestamp voodoo
-	  $dateCreatedd = $content_struct['dateCreated'];
-	  if (!empty($dateCreatedd)) {
-	    $dateCreated = $dateCreatedd->getIso();
-	    $post_date     = get_date_from_gmt(iso8601_to_datetime($dateCreated));
-	    $post_date_gmt = iso8601_to_datetime($dateCreated . "Z", GMT);
-	  } else {
-	    $post_date     = $postdata['post_date'];
-	    $post_date_gmt = $postdata['post_date_gmt'];
-	  }
+		$tags_input = $content_struct['mt_keywords'];
 
-	  // We've got all the data -- post it:
-	  $newpost = compact('ID', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'comment_status', 'ping_status', 'post_date', 'post_date_gmt', 'to_ping', 'post_name', 'post_password', 'post_parent', 'menu_order', 'post_author');
+		if ( ('publish' == $post_status) ) {
+			if ( ( 'page' == $post_type ) && !current_user_can('publish_pages') )
+				return new IXR_Error(401, __('Sorry, you do not have the right to publish this page.'));
+			else if ( !current_user_can('publish_posts') )
+				return new IXR_Error(401, __('Sorry, you do not have the right to publish this post.'));
+		}
 
-	  $result = wp_update_post($newpost);
-	  if (!$result) {
-	    return new IXR_Error(500, __('Sorry, your entry could not be edited. Something wrong happened.'));
-	  }
-	  $this->attach_uploads( $ID, $post_content );
+		if ($post_more) {
+			$post_content = $post_content . "\n<!--more-->\n" . $post_more;
+		}
+
+		$to_ping = $content_struct['mt_tb_ping_urls'];
+		if ( is_array($to_ping) )
+			$to_ping = implode(' ', $to_ping);
+
+		// Do some timestamp voodoo
+		if ( !empty( $content_struct['date_created_gmt'] ) )
+			$dateCreated = str_replace( 'Z', '', $content_struct['date_created_gmt']->getIso() ) . 'Z'; // We know this is supposed to be GMT, so we're going to slap that Z on there by force
+		elseif ( !empty( $content_struct['dateCreated']) )
+			$dateCreated = $content_struct['dateCreated']->getIso();
+
+		if ( !empty( $dateCreated ) ) {
+			$post_date = get_date_from_gmt(iso8601_to_datetime($dateCreated));
+			$post_date_gmt = iso8601_to_datetime($dateCreated, GMT);
+		} else {
+			$post_date     = $postdata['post_date'];
+			$post_date_gmt = $postdata['post_date_gmt'];
+		}
+
+		// We've got all the data -- post it:
+		$newpost = compact('ID', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'comment_status', 'ping_status', 'post_date', 'post_date_gmt', 'to_ping', 'post_name', 'post_password', 'post_parent', 'menu_order', 'post_author', 'tags_input');
+
+		$result = wp_update_post($newpost);
+		if (!$result) {
+			return new IXR_Error(500, __('Sorry, your entry could not be edited. Something wrong happened.'));
+		}
+
+		if ( isset($content_struct['custom_fields']) ) {
+			$this->set_custom_fields($post_ID, $content_struct['custom_fields']);
+		}
 
-	  logIO('O',"(MW) Edited ! ID: $post_ID");
+		$this->attach_uploads( $ID, $post_content );
 
-	  return true;
+		logIO('O',"(MW) Edited ! ID: $post_ID");
+
+		return true;
 	}
 
 
 	/* metaweblog.getPost ...returns a post */
 	function mw_getPost($args) {
 
-	  global $wpdb;
-
 		$this->escape($args);
 
-	  $post_ID     = (int) $args[0];
-	  $user_login  = $args[1];
-	  $user_pass   = $args[2];
+		$post_ID     = (int) $args[0];
+		$user_login  = $args[1];
+		$user_pass   = $args[2];
 
-	  if (!$this->login_pass_ok($user_login, $user_pass)) {
-	    return $this->error;
-	  }
+		if (!$this->login_pass_ok($user_login, $user_pass)) {
+			return $this->error;
+		}
 
-	  $postdata = wp_get_single_post($post_ID, ARRAY_A);
+		set_current_user( 0, $user_login );
+		if( !current_user_can( 'edit_post', $post_ID ) )
+			return new IXR_Error( 401, __( 'Sorry, you can not edit this post.' ) );
 
-	  if ($postdata['post_date'] != '') {
+		do_action('xmlrpc_call', 'metaWeblog.getPost');
 
-	    $post_date = mysql2date('Ymd\TH:i:s\Z', $postdata['post_date_gmt']);
+		$postdata = wp_get_single_post($post_ID, ARRAY_A);
 
-	    $categories = array();
-	    $catids = wp_get_post_categories($post_ID);
-	    foreach($catids as $catid) {
-	      $categories[] = get_cat_name($catid);
-	    }
-
-	    $post = get_extended($postdata['post_content']);
-	    $link = post_permalink($postdata['ID']);
-
-		// Get the author info.
-		$author = get_userdata($postdata['post_author']);
-
-	    $allow_comments = ('open' == $postdata['comment_status']) ? 1 : 0;
-	    $allow_pings = ('open' == $postdata['ping_status']) ? 1 : 0;
-
-	    $resp = array(
-	      'dateCreated' => new IXR_Date($post_date),
-	      'userid' => $postdata['post_author'],
-	      'postid' => $postdata['ID'],
-	      'description' => $post['main'],
-	      'title' => $postdata['post_title'],
-	      'link' => $link,
-	      'permaLink' => $link,
-// commented out because no other tool seems to use this
-//	      'content' => $entry['post_content'],
-	      'categories' => $categories,
-	      'mt_excerpt' => $postdata['post_excerpt'],
-	      'mt_text_more' => $post['extended'],
-	      'mt_allow_comments' => $allow_comments,
-	      'mt_allow_pings' => $allow_pings,
-          'wp_slug' => $postdata['post_name'],
-          'wp_password' => $postdata['post_password'],
-          'wp_author_id' => $author->ID,
-          'wp_author_display_name'	=> $author->display_name
-	    );
-
-	    return $resp;
-	  } else {
-	  	return new IXR_Error(404, __('Sorry, no such post.'));
-	  }
+		if ($postdata['post_date'] != '') {
+			$post_date = mysql2date('Ymd\TH:i:s', $postdata['post_date']);
+			$post_date_gmt = mysql2date('Ymd\TH:i:s', $postdata['post_date_gmt']);
+
+			$categories = array();
+			$catids = wp_get_post_categories($post_ID);
+			foreach($catids as $catid)
+				$categories[] = get_cat_name($catid);
+
+			$tagnames = array();
+			$tags = wp_get_post_tags( $post_ID );
+			if ( !empty( $tags ) ) {
+				foreach ( $tags as $tag )
+					$tagnames[] = $tag->name;
+				$tagnames = implode( ', ', $tagnames );
+			} else {
+				$tagnames = '';
+			}
+
+			$post = get_extended($postdata['post_content']);
+			$link = post_permalink($postdata['ID']);
+
+			// Get the author info.
+			$author = get_userdata($postdata['post_author']);
+
+			$allow_comments = ('open' == $postdata['comment_status']) ? 1 : 0;
+			$allow_pings = ('open' == $postdata['ping_status']) ? 1 : 0;
+
+			// Consider future posts as published
+			if( $postdata['post_status'] === 'future' ) {
+				$postdata['post_status'] = 'publish';
+			}
+
+			$resp = array(
+				'dateCreated' => new IXR_Date($post_date),
+				'userid' => $postdata['post_author'],
+				'postid' => $postdata['ID'],
+				'description' => $post['main'],
+				'title' => $postdata['post_title'],
+				'link' => $link,
+				'permaLink' => $link,
+				// commented out because no other tool seems to use this
+				//	      'content' => $entry['post_content'],
+				'categories' => $categories,
+				'mt_excerpt' => $postdata['post_excerpt'],
+				'mt_text_more' => $post['extended'],
+				'mt_allow_comments' => $allow_comments,
+				'mt_allow_pings' => $allow_pings,
+				'mt_keywords' => $tagnames,
+				'wp_slug' => $postdata['post_name'],
+				'wp_password' => $postdata['post_password'],
+				'wp_author_id' => $author->ID,
+				'wp_author_display_name'	=> $author->display_name,
+				'date_created_gmt' => new IXR_Date($post_date_gmt),
+				'post_status' => $postdata['post_status'],
+				'custom_fields' => $this->get_custom_fields($post_ID)
+			);
+
+			return $resp;
+		} else {
+			return new IXR_Error(404, __('Sorry, no such post.'));
+		}
 	}
 
 
@@ -1407,6 +1706,8 @@
 			return $this->error;
 		}
 
+		do_action('xmlrpc_call', 'metaWeblog.getRecentPosts');
+
 		$posts_list = wp_get_recent_posts($num_posts);
 
 		if (!$posts_list) {
@@ -1414,15 +1715,32 @@
 			return $this->error;
 		}
 
+		set_current_user( 0, $user_login );
+
 		foreach ($posts_list as $entry) {
+			if( !current_user_can( 'edit_post', $entry['ID'] ) )
+				continue;
+
+			$post_date = mysql2date('Ymd\TH:i:s', $entry['post_date']);
+			$post_date_gmt = mysql2date('Ymd\TH:i:s', $entry['post_date_gmt']);
 
-			$post_date = mysql2date('Ymd\TH:i:s\Z', $entry['post_date_gmt']);
 			$categories = array();
 			$catids = wp_get_post_categories($entry['ID']);
 			foreach($catids as $catid) {
 				$categories[] = get_cat_name($catid);
 			}
 
+			$tagnames = array();
+			$tags = wp_get_post_tags( $entry['ID'] );
+			if ( !empty( $tags ) ) {
+				foreach ( $tags as $tag ) {
+					$tagnames[] = $tag->name;
+				}
+				$tagnames = implode( ', ', $tagnames );
+			} else {
+				$tagnames = '';
+			}
+
 			$post = get_extended($entry['post_content']);
 			$link = post_permalink($entry['ID']);
 
@@ -1432,6 +1750,11 @@
 			$allow_comments = ('open' == $entry['comment_status']) ? 1 : 0;
 			$allow_pings = ('open' == $entry['ping_status']) ? 1 : 0;
 
+			// Consider future posts as published
+			if( $entry['post_status'] === 'future' ) {
+				$entry['post_status'] = 'publish';
+			}
+
 			$struct[] = array(
 				'dateCreated' => new IXR_Date($post_date),
 				'userid' => $entry['post_author'],
@@ -1447,10 +1770,14 @@
 				'mt_text_more' => $post['extended'],
 				'mt_allow_comments' => $allow_comments,
 				'mt_allow_pings' => $allow_pings,
+				'mt_keywords' => $tagnames,
 				'wp_slug' => $entry['post_name'],
 				'wp_password' => $entry['post_password'],
 				'wp_author_id' => $author->ID,
-				'wp_author_display_name' => $author->display_name
+				'wp_author_display_name' => $author->display_name,
+				'date_created_gmt' => new IXR_Date($post_date_gmt),
+				'post_status' => $entry['post_status'],
+				'custom_fields' => $this->get_custom_fields($entry['ID'])
 			);
 
 		}
@@ -1464,11 +1791,9 @@
 	}
 
 
-	/* metaweblog.getCategories ...returns the list of categories on a given weblog */
+	/* metaweblog.getCategories ...returns the list of categories on a given blog */
 	function mw_getCategories($args) {
 
-		global $wpdb;
-
 		$this->escape($args);
 
 		$blog_ID     = (int) $args[0];
@@ -1479,17 +1804,22 @@
 			return $this->error;
 		}
 
+		set_current_user( 0, $user_login );
+		if( !current_user_can( 'edit_posts' ) )
+			return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this blog in order to view categories.' ) );
+
+		do_action('xmlrpc_call', 'metaWeblog.getCategories');
+
 		$categories_struct = array();
 
-		// FIXME: can we avoid using direct SQL there?
-		if ($cats = $wpdb->get_results("SELECT cat_ID,cat_name,category_parent FROM $wpdb->categories", ARRAY_A)) {
-			foreach ($cats as $cat) {
-				$struct['categoryId'] = $cat['cat_ID'];
-				$struct['parentId'] = $cat['category_parent'];
-				$struct['description'] = $cat['cat_name'];
-				$struct['categoryName'] = $cat['cat_name'];
-				$struct['htmlUrl'] = wp_specialchars(get_category_link($cat['cat_ID']));
-				$struct['rssUrl'] = wp_specialchars(get_category_rss_link(false, $cat['cat_ID'], $cat['cat_name']));
+		if ( $cats = get_categories('get=all') ) {
+			foreach ( $cats as $cat ) {
+				$struct['categoryId'] = $cat->term_id;
+				$struct['parentId'] = $cat->parent;
+				$struct['description'] = $cat->name;
+				$struct['categoryName'] = $cat->name;
+				$struct['htmlUrl'] = wp_specialchars(get_category_link($cat->term_id));
+				$struct['rssUrl'] = wp_specialchars(get_category_rss_link(false, $cat->term_id, $cat->name));
 
 				$categories_struct[] = $struct;
 			}
@@ -1520,6 +1850,8 @@
 		if ( !$this->login_pass_ok($user_login, $user_pass) )
 			return $this->error;
 
+		do_action('xmlrpc_call', 'metaWeblog.newMediaObject');
+
 		set_current_user(0, $user_login);
 		if ( !current_user_can('upload_files') ) {
 			logIO('O', '(MW) User does not have upload_files capability');
@@ -1548,9 +1880,9 @@
 			$name = "wpid{$old_file->ID}-{$filename}";
 		}
 
-		$upload = wp_upload_bits($name, $type, $bits, $overwrite);
+		$upload = wp_upload_bits($name, $type, $bits);
 		if ( ! empty($upload['error']) ) {
-			$errorString = 'Could not write file ' . $name . ' (' . $upload['error'] . ')';
+			$errorString = sprintf(__('Could not write file %1$s (%2$s)'), $name, $upload['error']);
 			logIO('O', '(MW) ' . $errorString);
 			return new IXR_Error(500, $errorString);
 		}
@@ -1592,6 +1924,8 @@
 			return $this->error;
 		}
 
+		do_action('xmlrpc_call', 'mt.getRecentPostTitles');
+
 		$posts_list = wp_get_recent_posts($num_posts);
 
 		if (!$posts_list) {
@@ -1599,15 +1933,21 @@
 			return $this->error;
 		}
 
+		set_current_user( 0, $user_login );
+
 		foreach ($posts_list as $entry) {
+			if( !current_user_can( 'edit_post', $entry['ID'] ) )
+				continue;
 
-			$post_date = mysql2date('Ymd\TH:i:s\Z', $entry['post_date_gmt']);
+			$post_date = mysql2date('Ymd\TH:i:s', $entry['post_date']);
+			$post_date_gmt = mysql2date('Ymd\TH:i:s', $entry['post_date_gmt']);
 
 			$struct[] = array(
 				'dateCreated' => new IXR_Date($post_date),
 				'userid' => $entry['post_author'],
 				'postid' => $entry['ID'],
 				'title' => $entry['post_title'],
+				'date_created_gmt' => new IXR_Date($post_date_gmt)
 			);
 
 		}
@@ -1621,11 +1961,9 @@
 	}
 
 
-	/* mt.getCategoryList ...returns the list of categories on a given weblog */
+	/* mt.getCategoryList ...returns the list of categories on a given blog */
 	function mt_getCategoryList($args) {
 
-		global $wpdb;
-
 		$this->escape($args);
 
 		$blog_ID     = (int) $args[0];
@@ -1636,13 +1974,18 @@
 			return $this->error;
 		}
 
+		set_current_user( 0, $user_login );
+		if( !current_user_can( 'edit_posts' ) )
+			return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this blog in order to view categories.' ) );
+
+		do_action('xmlrpc_call', 'mt.getCategoryList');
+
 		$categories_struct = array();
 
-		// FIXME: can we avoid using direct SQL there?
-		if ($cats = $wpdb->get_results("SELECT cat_ID, cat_name FROM $wpdb->categories", ARRAY_A)) {
+		if ( $cats = get_categories('hide_empty=0&hierarchical=0') ) {
 			foreach ($cats as $cat) {
-				$struct['categoryId'] = $cat['cat_ID'];
-				$struct['categoryName'] = $cat['cat_name'];
+				$struct['categoryId'] = $cat->term_id;
+				$struct['categoryName'] = $cat->name;
 
 				$categories_struct[] = $struct;
 			}
@@ -1665,6 +2008,12 @@
 			return $this->error;
 		}
 
+		set_current_user( 0, $user_login );
+		if( !current_user_can( 'edit_post', $post_ID ) )
+			return new IXR_Error( 401, __( 'Sorry, you can not edit this post.' ) );
+
+		do_action('xmlrpc_call', 'mt.getPostCategories');
+
 		$categories = array();
 		$catids = wp_get_post_categories(intval($post_ID));
 		// first listed category will be the primary category
@@ -1696,6 +2045,8 @@
 			return $this->error;
 		}
 
+		do_action('xmlrpc_call', 'mt.setPostCategories');
+
 		set_current_user(0, $user_login);
 		if ( !current_user_can('edit_post', $post_ID) )
 			return new IXR_Error(401, __('Sorry, you can not edit this post.'));
@@ -1713,6 +2064,8 @@
 	/* mt.supportedMethods ...returns an array of methods supported by this server */
 	function mt_supportedMethods($args) {
 
+		do_action('xmlrpc_call', 'mt.supportedMethods');
+
 		$supported_methods = array();
 		foreach($this->methods as $key=>$value) {
 			$supported_methods[] = $key;
@@ -1725,6 +2078,7 @@
 	/* mt.supportedTextFilters ...returns an empty array because we don't
 		 support per-post text filters yet */
 	function mt_supportedTextFilters($args) {
+		do_action('xmlrpc_call', 'mt.supportedTextFilters');
 		return apply_filters('xmlrpc_text_filters', array());
 	}
 
@@ -1736,6 +2090,8 @@
 
 		$post_ID = intval($args);
 
+		do_action('xmlrpc_call', 'mt.getTrackbackPings');
+
 		$actual_post = wp_get_single_post($post_ID, ARRAY_A);
 
 		if (!$actual_post) {
@@ -1778,6 +2134,8 @@
 			return $this->error;
 		}
 
+		do_action('xmlrpc_call', 'mt.publishPost');
+
 		set_current_user(0, $user_login);
 		if ( !current_user_can('edit_post', $post_ID) )
 			return new IXR_Error(401, __('Sorry, you can not edit this post.'));
@@ -1804,7 +2162,9 @@
 
 	/* pingback.ping gets a pingback and registers it */
 	function pingback_ping($args) {
-		global $wpdb, $wp_version;
+		global $wpdb;
+
+		do_action('xmlrpc_call', 'pingback.ping');
 
 		$this->escape($args);
 
@@ -1814,14 +2174,13 @@
 		$title = '';
 
 		$pagelinkedfrom = str_replace('&amp;', '&', $pagelinkedfrom);
-		$pagelinkedto   = preg_replace('#&([^amp\;])#is', '&amp;$1', $pagelinkedto);
-
-		$error_code = -1;
+		$pagelinkedto = str_replace('&amp;', '&', $pagelinkedto);
+		$pagelinkedto = str_replace('&', '&amp;', $pagelinkedto);
 
 		// Check if the page linked to is in our site
 		$pos1 = strpos($pagelinkedto, str_replace(array('http://www.','http://','https://www.','https://'), '', get_option('home')));
 		if( !$pos1 )
-				return new IXR_Error(0, __('Is there no link to us?'));
+			return new IXR_Error(0, __('Is there no link to us?'));
 
 		// let's find which post is linked to
 		// FIXME: does url_to_postid() cover all these cases already?
@@ -1861,7 +2220,7 @@
 			}
 		} else {
 			// TODO: Attempt to extract a post ID from the given URL
-	  		return new IXR_Error(33, 'The specified target URL cannot be used as a target. It either doesn\'t exist, or it is not a pingback-enabled resource.');
+	  		return new IXR_Error(33, __('The specified target URL cannot be used as a target. It either doesn\'t exist, or it is not a pingback-enabled resource.'));
 		}
 		$post_ID = (int) $post_ID;
 
@@ -1871,17 +2230,17 @@
 		$post = get_post($post_ID);
 
 		if ( !$post ) // Post_ID not found
-	  		return new IXR_Error(33, 'The specified target URL cannot be used as a target. It either doesn\'t exist, or it is not a pingback-enabled resource.');
+	  		return new IXR_Error(33, __('The specified target URL cannot be used as a target. It either doesn\'t exist, or it is not a pingback-enabled resource.'));
 
 		if ( $post_ID == url_to_postid($pagelinkedfrom) )
 			return new IXR_Error(0, __('The source URL and the target URL cannot both point to the same resource.'));
 
 		// Check if pings are on
 		if ( 'closed' == $post->ping_status )
-	  		return new IXR_Error(33, 'The specified target URL cannot be used as a target. It either doesn\'t exist, or it is not a pingback-enabled resource.');
+	  		return new IXR_Error(33, __('The specified target URL cannot be used as a target. It either doesn\'t exist, or it is not a pingback-enabled resource.'));
 
 		// Let's check that the remote site didn't already pingback this entry
-		$result = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_post_ID = '$post_ID' AND comment_author_url = '$pagelinkedfrom'");
+		$wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_post_ID = '$post_ID' AND comment_author_url = '$pagelinkedfrom'");
 
 		if ( $wpdb->num_rows ) // We already have a Pingback from this URL
 	  		return new IXR_Error(48, __('The pingback has already been registered.'));
@@ -1894,6 +2253,8 @@
 		if ( !$linea )
 	  		return new IXR_Error(16, __('The source URL does not exist.'));
 
+		$linea = apply_filters('pre_remote_source', $linea, $pagelinkedto);
+
 		// Work around bug in strip_tags():
 		$linea = str_replace('<!DOC', '<DOC', $linea);
 		$linea = preg_replace( '/[\s\r\n\t]+/', ' ', $linea ); // normalize spaces
@@ -1940,12 +2301,10 @@
 		if ( empty($context) ) // Link to target not found
 			return new IXR_Error(17, __('The source URL does not contain a link to the target URL, and so cannot be used as a source.'));
 
-		$pagelinkedfrom = preg_replace('#&([^amp\;])#is', '&amp;$1', $pagelinkedfrom);
+		$pagelinkedfrom = str_replace('&', '&amp;', $pagelinkedfrom);
 
 		$context = '[...] ' . wp_specialchars( $excerpt ) . ' [...]';
-		$original_pagelinkedfrom = $pagelinkedfrom;
 		$pagelinkedfrom = $wpdb->escape( $pagelinkedfrom );
-		$original_title = $title;
 
 		$comment_post_ID = (int) $post_ID;
 		$comment_author = $title;
@@ -1960,7 +2319,7 @@
 		$comment_ID = wp_new_comment($commentdata);
 		do_action('pingback_post', $comment_ID);
 
-		return "Pingback from $pagelinkedfrom to $pagelinkedto registered. Keep the web talking! :-)";
+		return sprintf(__('Pingback from %1$s to %2$s registered. Keep the web talking! :-)'), $pagelinkedfrom, $pagelinkedto);
 	}
 
 
@@ -1971,6 +2330,8 @@
 
 		global $wpdb;
 
+		do_action('xmlrpc_call', 'pingback.extensions.getPingsbacks');
+
 		$this->escape($args);
 
 		$url = $args;
@@ -1978,7 +2339,7 @@
 		$post_ID = url_to_postid($url);
 		if (!$post_ID) {
 			// We aren't sure that the resource is available and/or pingback enabled
-	  		return new IXR_Error(33, 'The specified target URL cannot be used as a target. It either doesn\'t exist, or it is not a pingback-enabled resource.');
+	  		return new IXR_Error(33, __('The specified target URL cannot be used as a target. It either doesn\'t exist, or it is not a pingback-enabled resource.'));
 		}
 
 		$actual_post = wp_get_single_post($post_ID, ARRAY_A);
