+++ /dev/null
-<?php
-/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
-// $Horde: whups/config/conf.xml,v 1.38 2008/06/24 22:49:56 jan Exp $
-$conf['tickets']['params']['driverconfig'] = 'horde';
-$conf['tickets']['driver'] = 'sql';
-$conf['guests']['captcha'] = false;
-$conf['mail']['reply'] = false;
-$conf['mail']['include_headers'] = false;
-$conf['mail']['commenthistory'] = 'new';
-$conf['mail']['incl_resp'] = true;
-$conf['mail']['server_name'] = '127.0.0.1';
-$conf['mail']['server_port'] = 80;
-$conf['prefs']['autolink_terms'] = 'bug|ticket|issue';
-$conf['prefs']['assign_all_groups'] = false;
-$conf['menu']['apps'] = array();
-$conf['states']['1']['name'] = 'Unconfirmed';
-$conf['states']['1']['desc'] = 'A ticket has been reported but not yet analyzed';
-$conf['states']['1']['category'] = 'unconfirmed';
-$conf['states']['1']['active'] = 'active';
-$conf['states']['2']['name'] = 'Accepted';
-$conf['states']['2']['desc'] = 'The ticket has been analyzed and accepted as valid.';
-$conf['states']['2']['category'] = 'new';
-$conf['states']['2']['active'] = 'active';
-$conf['states']['3']['name'] = 'Assigned';
-$conf['states']['3']['desc'] = 'Someone has accepted responsibility for the ticket.';
-$conf['states']['3']['category'] = 'assigned';
-$conf['states']['3']['active'] = 'active';
-$conf['states']['4']['name'] = 'Resolved';
-$conf['states']['4']['desc'] = 'The ticket has been resolved.';
-$conf['states']['4']['category'] = 'resolved';
-$conf['states']['4']['active'] = 'active';
-$conf['states']['5']['name'] = 'Canceled';
-$conf['states']['5']['desc'] = 'The ticket is no longer valid for one reason or another.';
-$conf['states']['5']['category'] = 'resolved';
-$conf['states']['5']['active'] = 'active';
-$conf['states']['6']['active'] = 'inactive';
-$conf['states']['7']['active'] = 'inactive';
-$conf['states']['8']['active'] = 'inactive';
-$conf['priorities']['1']['name'] = '1. Low';
-$conf['priorities']['1']['desc'] = 'This is a very low priority ticket';
-$conf['priorities']['1']['active'] = 'active';
-$conf['priorities']['2']['name'] = '2. Medium';
-$conf['priorities']['2']['desc'] = 'This is an important task, but not urgent.';
-$conf['priorities']['2']['active'] = 'active';
-$conf['priorities']['3']['name'] = '3. High';
-$conf['priorities']['3']['desc'] = 'This ticket is very urgent';
-$conf['priorities']['3']['active'] = 'active';
-$conf['priorities']['4']['active'] = 'inactive';
-$conf['priorities']['5']['active'] = 'inactive';
-$conf['priorities']['6']['active'] = 'inactive';
-$conf['hooks']['update'] = false;
-$conf['hooks']['group_fields'] = false;
-/* CONFIG END. DO NOT CHANGE ANYTHING IN OR BEFORE THIS LINE. */
+++ /dev/null
-@@dont_reply@@@@ticket_url@@
-@@table@@@@comment@@
+++ /dev/null
-<?php
-/**
- * $Horde: whups/config/mime_drivers.php.dist,v 1.4 2005/03/14 13:27:10 jan Exp $
- *
- * Decide which output drivers you want to activate for the Whups application.
- * Settings in this file override settings in horde/config/mime_drivers.php.
- *
- * The available drivers are:
- * --------------------------
- * zip ZIP attachments
- */
-$mime_drivers_map['whups']['registered'] = array('zip');
-
-/**
- * If you want to specifically override any MIME type to be handled by
- * a specific driver, then enter it here. Normally, this is safe to
- * leave, but it's useful when multiple drivers handle the same MIME
- * type, and you want to specify exactly which one should handle it.
- */
-$mime_drivers_map['whups']['overrides'] = array();
-
-/**
- * Driver specific settings. See horde/config/mime_drivers.php for
- * the format.
- */
-
-$mime_drivers['horde']['enscript']['handles'][] = 'text/html';
-
-/**
- * Zip File Attachments settings
- */
-$mime_drivers['whups']['zip']['inline'] = false;
-$mime_drivers['whups']['zip']['handles'] = array(
- 'x-extension/zip',
- 'application/zip',
- 'application/x-compressed',
- 'application/x-zip-compressed');
-$mime_drivers['whups']['zip']['icons'] = array(
- 'default' => 'compressed.png');
+++ /dev/null
-@@dont_reply@@@@ticket_url@@
-@@table@@@@comment@@
+++ /dev/null
-<?php
-/**
- * $Horde: whups/config/prefs.php.dist,v 1.29 2008/06/06 15:09:44 jan Exp $
- *
- * See horde/config/prefs.php for documentation on the structure of this file.
- */
-
-$prefGroups['display'] = array(
- 'column' => _("General Options"),
- 'label' => _("Display Options"),
- 'desc' => _("Change display options such as how search results are sorted."),
- 'members' => array('sortby', 'sortdir', 'comment_sort_dir', 'whups_default_view', 'summary_show_requested', 'summary_show_ticket_numbers', 'report_time_format', 'autolink_tickets')
-);
-
-$prefGroups['notification'] = array(
- 'column' => _("General Options"),
- 'label' => _("Notification Options"),
- 'desc' => _("Change options for email notifications of ticket activity."),
- 'members' => array('email_others_only', 'email_comments_only'));
-
-if ($GLOBALS['registry']->hasMethod('contacts/sources')) {
- $prefGroups['addressbooks'] = array(
- 'column' => _("General Options"),
- 'label' => _("Address Books"),
- 'desc' => _("Select address book sources for adding and searching for addresses."),
- 'members' => array('sourceselect'),
- );
-}
-
-
-// the layout of the bugs portal.
-$_prefs['mybugs_layout'] = array(
- 'value' => 'a:0:{}',
- 'locked' => false,
- 'shared' => false,
- 'type' => 'implicit'
-);
-
-// user preferred sorting column
-$_prefs['sortby'] = array(
- 'value' => 'id',
- 'locked' => false,
- 'shared' => false,
- 'type' => 'enum',
- 'enum' => array('id' => _("Id"),
- 'summary' => _("Summary"),
- 'state_name' => _("State"),
- 'type_name' => _("Type"),
- 'priority_name' => _("Priority"),
- 'queue_name' => _("Queue"),
- 'version_name' => _("Version"),
- 'timestamp' => _("Created"),
- 'date_assigned' => _("Assigned"),
- 'date_resolved' => _("Resolved")),
- 'desc' => _("Default sorting criteria:")
-);
-
-// user preferred sorting direction
-$_prefs['sortdir'] = array(
- 'value' => 0,
- 'locked' => false,
- 'shared' => false,
- 'type' => 'enum',
- 'enum' => array(0 => _("Ascending"),
- 1 => _("Descending")),
- 'desc' => _("Default sorting direction:")
-);
-
-// default view
-$_prefs['whups_default_view'] = array(
- 'value' => 'mybugs',
- 'locked' => false,
- 'shared' => false,
- 'type' => 'enum',
- 'enum' => array('mybugs' => _("My Tickets"),
- 'search' => _("Search Tickets"),
- 'ticket/create' => _("Create Ticket")),
- 'desc' => _("Select the view to display after login:")
-);
-
-// show requested tickets in the horde summary?
-$_prefs['summary_show_requested'] = array(
- 'value' => 1,
- 'locked' => false,
- 'shared' => false,
- 'type' => 'checkbox',
- 'desc' => _("Show tickets you have requested in the summary view?"));
-
-// show ticket ids in the horde summary?
-$_prefs['summary_show_ticket_numbers'] = array(
- 'value' => 1,
- 'locked' => false,
- 'shared' => false,
- 'type' => 'checkbox',
- 'desc' => _("Show ticket IDs in the summary view?")
-);
-
-// Allow custom time/date formats in reports
-$_prefs['report_time_format'] = array(
- 'value' => '%m/%d/%y',
- 'locked' => false,
- 'shared' => false,
- 'type' => 'enum',
- 'enum' => array('%a %d %B' => _("Weekday Day Month"),
- '%c' => _("Weekday Day Month HH:MM:SS TZ"),
- '%m/%d/%y' => _("MM/DD/YY"),
- '%m/%d/%y %H:%M:%S' => _("MM/DD/YY HH:MM:SS")),
- 'desc' => _("Date/Time format for search results")
-);
-
-// Skip notification of changes you added?
-$_prefs['email_others_only'] = array(
- 'value' => 1,
- 'locked' => false,
- 'shared' => false,
- 'type' => 'checkbox',
- 'desc' => _("Only notify me of ticket changes from other users?")
-);
-
-// Skip notification without comments?
-$_prefs['email_comments_only'] = array(
- 'value' => 0,
- 'locked' => false,
- 'shared' => false,
- 'type' => 'checkbox',
- 'desc' => _("Only notify me of ticket changes with comments?")
-);
-
-// AutoLink to tickets references in comments
-$_prefs['autolink_tickets'] = array(
- 'value' => 1,
- 'locked' => false,
- 'shared' => false,
- 'type' => 'checkbox',
- 'desc' => _("Autolink to other tickets in comments?")
-);
-
-// Show ticket comments in ascending or descending order?
-$_prefs['comment_sort_dir'] = array(
- 'value' => 1,
- 'locked' => false,
- 'shared' => false,
- 'type' => 'enum',
- 'desc' => _("Show comments in chronological order, or most recent first?"),
- 'enum' => array(0 => _("Chronological (oldest first)"),
- 1 => _("Most recent first"))
-);
-
-// address book selection widget
-$_prefs['sourceselect'] = array('type' => 'special');
-
-// address book(s) to use when expanding addresses
-// You can provide default values this way (note the \t and the double quotes):
-// 'value' => "source_one\tsource_two"
-// refer to turba/config/sources.php for possible source values
-$_prefs['search_sources'] = array(
- 'value' => "",
- 'locked' => false,
- 'shared' => false,
- 'type' => 'implicit',
-);
-
-// field(s) to use when expanding addresses
-// This depends on the search_sources preference if you want to provide
-// default values:
-// 'value' => "source_one\tfield_one\tfield_two\nsource_two\tfield_three"
-// will search the fields 'field_one' and 'field_two' in source_one and
-// 'field_three' in source_two.
-// refer to turba/config/sources.php for possible source and field values
-$_prefs['search_fields'] = array(
- 'value' => "",
- 'locked' => false,
- 'shared' => false,
- 'type' => 'implicit',
-);
+++ /dev/null
-<?php
-/**
- * $Horde: whups/config/templates.php.dist,v 1.12 2005/04/12 21:17:58 chuck Exp $
- *
- * This file defines the templates used in various parts of Whups.
- *
- * Hopefully this will all migrate to a database in the future, but
- * for now, this is it.
- *
- * More docs coming as this gets fleshed out and used more.
- */
-
-$_templates['html-simple'] = array(
- 'type' => 'searchresults',
- 'filename' => 'report.html',
- 'name' => _("Simple HTML Report"),
- 'sortby' => array('type_name', 'timestamp'),
- 'sortdir' => array(0, 1),
- 'template' => '<table>
-<tr>
- <th>#</th>
- <th>Type</th>
- <th>Owners</th>
- <th>Open Date</th>
- <th>Description</th>
-</tr>
-
-<loop:tickets>
-<tr>
- <td><a href="<tag:tickets.link />"><tag:tickets.id /></a></td>
- <td><tag:tickets.type_name /></td>
- <td><tag:tickets.owner_name /></td>
- <td><tag:tickets.date_created /></td>
- <td><tag:tickets.summary /></td>
-</tr>
-</loop:tickets>
-
-</table>'
-);
-
-$_templates['csv'] = array(
- 'type' => 'searchresults',
- 'name' => _("Comma Separated Values (CSV file)"),
- 'filename' => 'report.csv',
- 'callback' => '_csvQuote',
- 'template' => 'ID,Summary,State,Type,Priority,Queue,Version,Owners,Created,Assigned,Resolved<loop:tickets>
-<tag:tickets.id />,<tag:tickets.summary />,<tag:tickets.state_name />,<tag:tickets.type_name />,<tag:tickets.priority_name />,<tag:tickets.queue_name />,<tag:tickets.version_name />,<tag:tickets.owner_name />,<tag:tickets.date_created />,<tag:tickets.date_assigned />,<tag:tickets.date_resolved />
-</loop:tickets>
-'
-);
-
-if (!function_exists('_csvQuote')) {
- function _csvQuote(&$data, $key)
- {
- if (strpos($data, ',') !== false) {
- $data = '"' . str_replace('"', '\"', $data) . '"';
- }
- }
-}
--- /dev/null
+<IfModule mod_rewrite.c>
+ RewriteEngine On
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteRule ^([A-Za-z0-9].*)$ display.php?page=$1 [QSA]
+</IfModule>
--- /dev/null
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright 1989, 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.
+
+ 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.
+\f
+ 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.)
+\f
+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.
+\f
+ 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.
+\f
+ 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
--- /dev/null
+===================
+Wicked, Version 0.1
+===================
+
+What is Wicked?
+===============
+
+This module is a wiki application for Horde.
+
+Goals
+=====
+
+1. To Facilitate Maintaining a Knowledge Base
+---------------------------------------------
+
+In order to facilitate maintaining a knowledge base, Wicked must make it as
+easy as possible to enter information. If the user encounters impediments
+when entering information, he or she will be less likely to enter information.
+The goal as Wicked evolves, then, is to remove as many impediments to entry as
+possible.
+
+Here are some technological impediments we should be mindful of:
+
+* Requiring complete documents or validatation which prevents saving.
+* Requiring lots of information related to pages (categories, etc.)
+* Complicated markup which has to be learned
+
+We should be mindful that not all impediments are strictly technological--
+there are psychological impediments as well. As a simple example, different
+fonts and ways of rendering a page may make it appear more "professional" or
+"perfect", and this might discourage a user from adding his thoughts somewhere
+near the middle. Another example: a strongly implied organizational structure
+for a wiki might discourage someone from contributing some discussion that
+does not fit into any of the predefined slots.
+
+One of the most important factors that will encourage a person to add
+information to a knowledge base is whether he or she find useful information
+in it. If a user keeps coming back to it to search for useful information,
+that user is more likely to contribute.
+
+2. To Facilitate Inter-connecting Knowledge
+-------------------------------------------
+
+The value of a large knowledge base isn't solely in the amount of information
+it contains. There are many large knowledge bases which are difficult to
+navigate, and seem to prevent you from finding things that you know must be in
+there. One of the ways to avoid this is by facilitating the inter-
+connectedness of knowledge-- if we make linking between pages easy, don't
+prevent (and even encourage) "dangling" and "accidental" links, and provide
+mechanisms so that synonymous terms can refer to the same page, knowledge in
+the knowledge base will be much more accessible.
+
+3. To Facilitate Peer Review and Discussion of Content
+------------------------------------------------------
+
+The openness of a wiki is one of its great strengths; it allows anyone to add
+their opinions or references to facts or whatever. One of the most unique
+goals of Wicked is to find new mechanisms to facilitate this. For example,
+allowing people to subscribe to a page, area, or the entire wiki to receive
+change notifications keeps people coming back to topics that they are
+interested in, and adding their opinions.
+
+Adding an "invite" feature which allows a user to solicit input from a third
+party increases traffic and discussion on a topic and also gives Wicked a sort
+of one-shot single-topic mailing list feature. It also provides a mechanism
+for publishing information, for example to release a memo in an organization.
+
+4. To Facilitate Accuracy Through Accountability
+------------------------------------------------
+
+There are only two ways to know whether information is accurate: 1) to have an
+idea of the accuracy of the source of that information or 2) to test it. In
+most document-management-type solutions, permissions systems are used to
+ensure that only authorized users can modify documents, but in wiki we
+recognize that permissions are an impediment to contribution.
+
+Although Wicked does support setting permissions for pages, accuracy in wiki
+is provided by tracking changes made to pages so that we always know where
+the information came from. This also increases the quality of the content by
+providing accountability.
+
+5. To Facilitate Paper Publishing
+---------------------------------
+
+Once the collaboration on some piece of knowledge is done, Wicked should
+support printing it in a "final form" useful for consumption.
+
+Features
+========
+
+[These features may not be fully implemented just yet; they are the targeted
+featurs for the Wicked 1.0 release. -JMF]
+
+1. Change Tracking and Revision History
+---------------------------------------
+
+2. Full-Text Searching
+----------------------
+
+3. Support for Multiple Content Types
+-------------------------------------
+
+4. Page and Site Subscriptions and Invitations
+----------------------------------------------
+
+5. Typesetting to PDF
+---------------------
+
+$Horde: wicked/README,v 1.3 2004/10/17 16:29:42 eraserhd Exp $
--- /dev/null
+conf.php
+conf.bak.php
+menu.php
+prefs.php
--- /dev/null
+Deny from all
--- /dev/null
+<?xml version="1.0"?>
+<!-- $Horde: wicked/config/conf.xml,v 1.27 2009/10/31 15:57:16 jan Exp $ -->
+<configuration>
+ <configsection name="wicked">
+ <configheader>
+ Application Settings
+ </configheader>
+
+ <configstring name="notify_address" required="false" desc="The email address
+ to which changes on pages should be mailed. Leave empty if you don't want
+ notification messages to be sent."/>
+ <configstring name="guest_address" required="false" desc="The email address
+ that should be used as the sender if guests are making changes."/>
+ <configenum name="diff_format" desc="The diff format that should be used
+ when sending notifications.">unified
+ <values>
+ <value desc="Unified context">unified</value>
+ <value desc="Copied context">context</value>
+ <value desc="Side by side">sidebyside</value>
+ </values>
+ </configenum>
+ <configboolean name="require_change_log" desc="Require users to enter a
+ change description?">false</configboolean>
+ <configswitch name="captcha" quote="false" desc="Require users to enter a
+ verification string with each message to protect against spam? (Requires
+ Horde 3.1)">false
+ <case name="false" desc="No"/>
+ <case name="true" desc="Yes">
+ <configstring name="figlet_font" desc="The path to a Figlet
+ (http://www.figlet.org/) font
+ file">/usr/share/games/figlet/fonts/big.flf</configstring>
+ </case>
+ </configswitch>
+ <configenum name="format" quote="true" desc="Which Wiki format should
+ be used?">Default
+ <values>
+ <value desc="Default">Default</value>
+ <value desc="BBCode">BBCode</value>
+ <value desc="Creole">Creole</value>
+ <value desc="Mediawiki">Mediawiki</value>
+ <value desc="Tiki">Tiki</value>
+ </values>
+ </configenum>
+ <configsection name="lock">
+ <configinteger name="time" desc="How many minutes should pages be locked
+ for editing?">10</configinteger>
+ </configsection>
+ </configsection>
+
+ <configsection name="options" desc="Look and feel">
+ <configheader>Look and feel</configheader>
+ <configboolean name="use_mod_rewrite" desc="Should we use mod_rewrite URL translations for page URLs? If your webserver doesn't have mod_rewrite enabled, enabling this will result in broken links. The default/fallback if this is off is to use GET to pass the page name.">false</configboolean>
+ </configsection>
+
+ <configsection name="menu">
+ <configheader>
+ Menu Settings
+ </configheader>
+
+ <configmultienum name="pages" desc="What standard pages would you like to
+ show up as links in Wicked's menu?">WikiHome
+ <values>
+ <value desc="WikiHome">_WikiHome</value>
+ <value desc="HowToUseWiki">HowTo_UseWiki</value>
+ <value desc="RecentChanges">_RecentChanges</value>
+ <value desc="AllPages">_AllPages</value>
+ </values>
+ </configmultienum>
+
+ <configmultienum name="apps" desc="Select any applications that should be
+ linked in Wicked's menu">
+ <values>
+ <configspecial name="list-horde-apps" />
+ </values>
+ </configmultienum>
+ </configsection>
+
+ <configsection name="storage">
+ <configheader>
+ Storage System Settings
+ </configheader>
+
+ <configenum name="driver" desc="What storage driver should we use?">sql
+ <values>
+ <value desc="SQL">sql</value>
+ </values>
+ </configenum>
+
+ <configsection name="params">
+ <configsql switchname="driverconfig">
+ <configstring name="table" desc="Database table">wicked_pages</configstring>
+ <configstring name="historytable" desc="History database table">wicked_history</configstring>
+ <configstring name="attachmenttable" desc="Attachments table">wicked_attachments</configstring>
+ <configstring name="attachmenthistorytable" desc="Attachments history table">wicked_attachment_history</configstring>
+ </configsql>
+ </configsection>
+ </configsection>
+
+</configuration>
+
--- /dev/null
+<?php
+/*
+ * $Horde: wicked/config/menu.php.dist,v 1.2 2006/05/01 20:15:09 karsten Exp $
+ *
+ * This file lets you extend Wicked's menu with your own items.
+ *
+ * To add a new menu item, simply add a new entry to the $_menu array.
+ * Valid attributes for a new menu item are:
+ *
+ * 'url' The URL value for the menu item.
+ * 'text' The text to accompany the menu item.
+ *
+ * These attributes are optional:
+ *
+ * 'icon' The filename of an icon to use for the menu item.
+ * 'icon_path' The path to the icon if it doesn't exist in the graphics/
+ * directory.
+ * 'target' The "target" of the link (e.g. '_top', '_blank').
+ * 'onclick' Any JavaScript to execute on the "onclick" event.
+ *
+ * Here's an example entry:
+ *
+ * $_menu[] = array(
+ * 'url' => 'http://www.example.com/',
+ * 'text' => 'Example, Inc.',
+ * 'icon' => 'example.gif',
+ * 'icon_path' => 'http://www.example.com/images/',
+ * 'target' => '_blank',
+ * 'onclick' => ''
+ * );
+ *
+ * You can also add a "separator" (a spacer) between menu items. To add a
+ * separator, simply add a new string to the $_menu array set to the text
+ * 'separator'. It should look like this:
+ *
+ * $_menu[] = 'separator';
+ */
+
+$_menu = array();
+
+/* Add your custom entries below this line. */
--- /dev/null
+<?php
+/**
+ * $Horde: wicked/config/prefs.php.dist,v 1.13 2008/08/17 19:41:24 chuck Exp $
+ *
+ * See horde/config/prefs.php for documentation on the structure of this file.
+ */
+
+$_prefs = array();
+
+$_prefs['sync_data'] = array(
+ 'value' => 'a:0:{}',
+ 'locked' => false,
+ 'shared' => false,
+ 'type' => 'implicit'
+);
--- /dev/null
+<?php
+/**
+ * $Horde: wicked/diff.php,v 1.16 2009/06/10 05:25:31 slusarz Exp $
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ */
+
+@define('WICKED_BASE', dirname(__FILE__));
+require_once WICKED_BASE . '/lib/base.php';
+
+$v1 = Horde_Util::getFormData('v1');
+$v2 = Horde_Util::getFormData('v2');
+
+/* Bail out if we didn't get any versions - at least one of these has
+ * to be non-empty. */
+if (!$v1 && !$v2) {
+ $url = Horde::applicationUrl('history.php', true);
+ $url = Horde_Util::addParameter($url, 'page', Horde_Util::getFormData('page'));
+ header('Location: ' . $url);
+ exit;
+}
+
+/* Make sure that $v2 is a higher version than $v1. Empty string is
+ * the current version of the page, so is always highest. Also, '?' is a
+ * wildcard for the previous version, so it's always the lowest. */
+if (!$v1 || ($v2 && version_compare($v1, $v2) > 0) || $v2 == '?') {
+ $tmp = $v1;
+ $v1 = $v2;
+ $v2 = $tmp;
+}
+
+$page = Page::getPage(Horde_Util::getFormData('page'), $v2);
+if (is_a($page, 'PEAR_Error')) {
+ $notification->push(sprintf(_("Internal error viewing requested page: %s"), $page->getMessage()), 'horde.error');
+ header('Location: ' . Wicked::url('WikiHome', true));
+ exit;
+}
+
+if ($v1 == '?') {
+ $v1 = $page->previousVersion();
+}
+
+/* Kick back to the display page if we're not allowed to diff this
+ * page. */
+if (!$page->allows(WICKED_MODE_DIFF)) {
+ $url = Horde_Util::addParameter(Wicked::url($page->pageName(), true), 'actionID', 'diff');
+ header('Location: ' . $url);
+ exit;
+}
+
+$title = sprintf(_("Diff for %s between %s and %s"), $page->pageName(), $v1, $page->version());
+require WICKED_TEMPLATES . '/common-header.inc';
+require WICKED_TEMPLATES . '/menu.inc';
+$page->render(WICKED_MODE_DIFF, $v1);
+require $registry->get('templates', 'horde') . '/common-footer.inc';
--- /dev/null
+<?php
+/**
+ * $Horde: wicked/display.php,v 1.51 2009/09/28 22:16:43 jan Exp $
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Tyler Colbert <tyler@colberts.us>
+ */
+
+require_once dirname(__FILE__) . '/lib/base.php';
+
+$page = Page::getCurrentPage();
+if (is_a($page, 'PEAR_Error')) {
+ $notification->push(_("Internal error viewing requested page"),
+ 'horde.error');
+}
+
+$actionID = Horde_Util::getFormData('actionID');
+switch ($actionID) {
+case 'lock':
+ if (!$page->allows(WICKED_MODE_LOCKING)) {
+ $notification->push(_("You are not allowed to lock this page"),
+ 'horde.error');
+ break;
+ }
+ $result = $page->lock();
+ if (is_a($result, 'PEAR_Error')) {
+ $notification->push(sprintf(_("Page failed to lock: %s"), $result->getMessage()),
+ 'horde.error');
+ }
+ break;
+
+case 'unlock':
+ if (!$page->allows(WICKED_MODE_UNLOCKING)) {
+ $notification->push(_("You are not allowed to unlock this page"),
+ 'horde.error');
+ }
+ $result = $page->unlock();
+ if (is_a($result, 'PEAR_Error')) {
+ $notification->push(
+ sprintf(_("Page failed to unlock: %s"), $result->getMessage()),
+ 'horde.error');
+ } else {
+ $notification->push(_("Page unlocked"), 'horde.success');
+ }
+ break;
+
+case 'history':
+ if ($page->allows(WICKED_MODE_HISTORY)) {
+ /* Redirect to history page. */
+ $url = Horde::applicationUrl('history.php', true);
+ $url = Horde_Util::addParameter($url, 'page', $page->pageName());
+ header('Location: ' . $url);
+ exit;
+ }
+ $notification->push(_("This page does not have a history"), 'horde.error');
+ break;
+
+case 'special':
+ $page->handleAction();
+ break;
+
+case 'export':
+ if (!$page->allows(WICKED_MODE_DISPLAY)) {
+ $notification->push(_("You don't have permission to view this page."),
+ 'horde.error');
+ if ($page->pageName() == 'WikiHome') {
+ Horde::fatal(_("You don't have permission to view this page."), __FILE__, __LINE__);
+ } else {
+ header('Location: ' . Wicked::url('WikiHome', true));
+ }
+ exit;
+ }
+
+ switch (Horde_Util::getGet('format')) {
+ case 'html':
+ $format = 'Xhtml';
+ $ext = '.html';
+ $mime = 'text/html';
+ break;
+
+ case 'tex':
+ $format = 'Latex';
+ $ext = '.tex';
+ $mime = 'text/x-tex';
+ break;
+
+ case 'plain':
+ default:
+ $format = 'Plain';
+ $ext = '.txt';
+ $mime = 'text/text';
+ break;
+ }
+
+ $wiki = &$page->getProcessor($format);
+ $text = $wiki->transform($page->getText(), $format);
+ if (is_a($text, 'PEAR_Error')) {
+ echo $text->getMessage();
+ } else {
+ $browser->downloadHeaders($page->pageTitle() . $ext, $mime, false, strlen($text));
+ echo $text;
+ }
+ exit(0);
+
+default:
+ $wicked->logPageView($page->pageName());
+}
+
+if (!$page->allows(WICKED_MODE_DISPLAY)) {
+ $notification->push(_("You don't have permission to view this page."),
+ 'horde.error');
+ if ($page->pageName() == 'WikiHome') {
+ Horde::fatal(_("You don't have permission to view this page."), __FILE__, __LINE__);
+ } else {
+ header('Location: ' . Wicked::url('WikiHome', true));
+ }
+ exit;
+}
+
+$params = Horde_Util::getFormData('params');
+$page->preDisplay(WICKED_MODE_DISPLAY, $params);
+
+if (!isset($_SESSION['wickedSession']['history'])) {
+ $_SESSION['wickedSession']['history'] = array();
+}
+
+if ($page->isLocked()) {
+ $notification->push(sprintf(_("This page is locked by %s for %d Minutes."), $page->getLockRequestor(), $page->getLockTime()), 'horde.message');
+}
+
+$title = $page->pageTitle();
+require WICKED_TEMPLATES . '/common-header.inc';
+require WICKED_TEMPLATES . '/menu.inc';
+$page->render(WICKED_MODE_DISPLAY, $params);
+require $registry->get('templates', 'horde') . '/common-footer.inc';
+
+if (is_a($page, 'StandardPage') &&
+ (!isset($_SESSION['wickedSession']['history'][0]) ||
+ $_SESSION['wickedSession']['history'][0] != $page->pageName())) {
+ array_unshift($_SESSION['wickedSession']['history'], $page->pageName());
+}
+if (count($_SESSION['wickedSession']['history']) > 10) {
+ array_pop($_SESSION['wickedSession']['history']);
+}
--- /dev/null
+--------
+v1.0-cvs
+--------
+
+[jan] Drop support for coWiki markup.
+[jan] Fix Oracle SQL scripts.
+[jan] Implement pessimistic locking based on Horde_Lock.
+[mjr] Add default lighttpd-style rewrite rules.
+[jan] Add Brazilian Portuguese translation (Luis Felipe Marzagao
+ <duli@fedoraproject.org>).
+[cjh] Support arbitrary charsets for page names (Bug #7805).
+[cjh] Fix saveTemplate API call (Duck <duck@obala.net>, Bug #7620).
+[jan] Add Italian translation (Fabio Pedretti <fabio.pedretti@ing.unibs.it>).
+[jan] Add Precedence and Auto-Submitted headers to notification messages.
+[cjh] Add an API method for fetching recent changes, and allow specifying
+ the number of days to look back in the RecentChanges page
+ (Duck <duck@obala.net>, Request #7230).
+[jan] Add script to convert data to UTF-8 in the backend.
+[cjh] Allow downloading from/uploading to a remote wiki server
+ (Duck <duck@obala.net>, Request #7191).
+[cjh] Add getMultiplePageInfo() and getPageHistory() API calls, along with
+ page checksums (Duck <duck@obala.net>, Request #7189).
+[cjh] Add Download this page as... link (Duck <duck@obala.net>, Request #7168).
+[cjh] Add renderPage() API call (duck@obala.net).
+[cjh] Add list(), getPageInfo(), show(), and pageExists() API calls
+ (Duck <duck@obala.net>, Request #7149).
+[jan] Add display and edit API methods (Duck <duck@obala.net>, Request #6130).
+[jan] Add Japanese translation (Takeshi Taguchi <taguchi@iij.ad.jp>).
+[cjh] Fix permission checks for non-admins when deleting and reverting
+ (Bug #5806).
+[cjh] Fix removing the most recent revision with some databases (Bug #5807).
+[jan] Work around problems with Text_Wiki and PHP 5.2.5+ (Bug #5951).
+[mms] Compress download data.
+[jan] Add OpenSearch interface for page search through browser bars.
+[jan] Add Ukrainian translation (Andriy Kopystyansky <anri@polynet.lviv.ua>).
+[cjh] Support mod_rewrite style URLs with Text_Wiki 1.2 (Bug #4740).
+[jan] Allow to add images from other pages (Request #5448).
+[cjh] Enforce READ permissions for all page modes (Bug #5328).
+[jan] Add Slovenian translation (Duck <duck@obala.net>).
+[jan] Fix searching for non-ascii strings (Bug #4644).
+[mms] Add initial CAPTCHA support.
+[cjh] Fix deletion of the most recent revision.
+[cjh] Table of Contents is now floated to the right and collapses/expands on
+ click.
+[jan] Show similar pages before creating a new one.
+[cjh] Ensure external links attached to images go through Horde::externalUrl()
+ (tasin@fhm.edu, Bug #3151).
+[cjh] Include matching context in PageSearch results (Request #2485).
+[cjh] Encode notification emails correctly (tasin@fhm.edu, Bug #3153).
+[cjh] Don't create pages until they have content (Bug #2534).
+[cjh] Run all revert actions through a non-JavaScript, POST
+ confirmation page.
+[cjh] Run all page/version deletion through a non-JavaScript, POST
+ confirmation page.
+[ben] Better support for MS-SQL.
+[cjh] Add [[link ...]] syntax for calling $registry->link() in pages
+ (Bug #1474).
+[cjh] Fix Wiki Page Block when the page being displayed has attachments
+ (Bug #2258).
+[cjh] Only list standard pages in Wicked's "Back to" history (Bug #2252).
+[cjh] Delete all attachments to a page when that page is deleted.
+[cjh] Attachments can now be deleted (Bug #2246).
+[cjh] Send notification emails when files are attached (Bug #2248).
+[mas] Include changelogs in emails, if available. (Bug #2068)
+[cjh] If there is only one search result, go directly to it.
+[jan] Support type="htmlphp" attribute for code blocks.
+[cjh] Show a summary of any attachments on a page (Bug #1473).
+[cjh] Fix updating of attachments (Bug #1579).
+[cjh] Add a config option to toggle use of pretty URLS with mod_rewrite
+ (Bug #1878).
+[jan] Support arbitrary charsets for page contents (with Text_Wiki > 1.0.0).
+[cjh] Require PERMS_EDIT to attach files to a page (tasin@fhm.edu, Bug #1880).
+[cjh] Send email on MergeOrRename (Bug #916).
+[cjh] Go to the newly merged or renamed page after MergeOrRename (Bug #916).
+[cjh] Display the page that was edited after editing instead of going to
+ WikiHome (Bug #1478).
+[cjh] Require PERMS_EDIT to MergeOrRename a page (Bug #915).
+[cjh] Use bind variables in SQL driver (selsky@columbia.edu, #1746).
+[cjh] Multiple-definition guard for separator() (Bug #1710).
+[jmf] References to special pages in wiki text no longer look deleted.
+[jmf] Ability to set permissions on special pages.
+[jmf] Prevent loosing attachments when renaming pages.
+[jan] Add test page.
+[jan] Add Finnish translation (Leena Heino <liinu@uta.fi>).
+[jmf] Add command-line script to manipulate wiki pages (Vijay Mahrra
+ <vijay.mahrra@es.easynet.net>).
+[jmf] Add "Create" buttons on TitleSearch and PageSearch pages (Vijay Mahrra
+ <vijay.mahrra@es.easynet.net>).
+[jmf] Add quick diff link (show changes from last version) when viewing page.
+[jmf] Add configuration option to require change descriptions.
+[jan] Notify about page deletions.
+[jmf] Add support for displaying attached images.
+[jmf] Add the ability to attach files to pages.
+[jmf] Add the ability to merge and rename pages.
+[jan] Add Spanish translation (Manuel Perez Ayala <mperaya@alcazaba.unex.es>).
+[jmf] Implement templates (templates are pages which begin or end with
+ "Template").
+[jan] Add Traditional Chinese translation (David Chang <david@tmv.gov.tw>).
+[jan] Add history drop down list to jump to the last visited pages.
+[cjh] Add MostPopular and LeastPopular wiki pages.
+[cjh] Log page views.
+[cjh] A parameter of autocreate=1 must now be passed to display.php for pages
+ that don't exist to be created automatically. This is done by default
+ for "?" links, but for external incoming links and results of the top
+ left jump box, users will get a form that allows them to confirm
+ creation of the new page.
+[cjh] Add AllPages Page and Block implementations.
+[cjh] Wicked now provides Horde_Blocks for doing TitleSearches and viewing
+ RecentChanges.
+[cjh] TitleSearch now works and is available as a global menu option.
+[cjh] Add a Preview button in the EditPage screen.
+[cjh] Move BackLinks and LikePages to the toolbar.
+[cjh] Store and display changelogs for page revisions.
+[cjh] In the history view, diffs between page versions work now.
+[jmf] Add jump box.
+[jan] Update to work with Text_Wiki 0.8.
+[cjh] Use Text_Diff for diff generation.
+[jan] Add Page::allows().
+[jan] Add Wicked::mail().
+[jan] Add diff and notification support.
+[jan] Add German translation.
+[jan] Allow keeping guests from editing and creating pages.
+[tjc] Initial version.
--- /dev/null
+=========================
+ Wicked Development Team
+=========================
+
+
+Core Developers
+===============
+
+- Tyler Colbert
+ - Initial codebase
+- Chuck Hagenbuch <chuck@horde.org>
+- Jan Schneider <jan@horde.org>
+
+
+Localization
+============
+
+====================== ===============================================
+Brazilian Portuguese Luis Felipe Marzagao <duli@fedoraproject.org>
+Chinese (Traditional) David Chang <david@tmv.gov.tw>
+Finnish Leena Heino <liinu@uta.fi>
+German Jan Schneider <jan@horde.org>
+Italian Fabio Pedretti <fabio.pedretti@ing.unibs.it>
+Japanese Takeshi Taguchi <taguchi@iij.ad.jp>
+Slovenian Duck <duck@obala.net>
+Spanish Manuel Perez Ayala <mperaya@alcazaba.unex.es>
+Ukrainian Andriy Kopystyansky <anri@polynet.lviv.ua>
+====================== ===============================================
--- /dev/null
+=======================
+ Installing Wicked 0.1
+=======================
+
+:Last update: $Date: 2007/06/19 09:56:39 $
+:Revision: $Revision: 1.13 $
+
+
+This document contains instructions for installing the Wicked web-based Wiki
+application on your system.
+
+For information on the capabilities and features of Wicked, see the file
+README_ in the top-level directory of the Wicked distribution.
+
+
+Obtaining Wicked
+================
+
+Wicked can be obtained from the Horde website and FTP server, at
+
+ http://www.horde.org/wicked/
+
+ ftp://ftp.horde.org/pub/wicked/
+
+Or use the mirror closest to you:
+
+ http://www.horde.org/mirrors.php
+
+Bleeding-edge development versions of Wicked are available via CVS; see the
+file `horde/docs/HACKING`_, or the website http://www.horde.org/source/, for
+information on accessing the Horde CVS repository.
+
+
+Prerequisites
+=============
+
+To function properly, Wicked **requires** the following:
+
+1. A working Horde installation
+
+ Wicked runs within the `Horde Application Framework`_, a set of common
+ tools for Web applications written in PHP. You must install Horde before
+ installing Wicked.
+
+ .. Important:: Wicked requires version 3.2+ of the Horde Framework -
+ earlier versions of Horde will **not** work.
+
+ The Horde Framework can be obtained from the Horde website and FTP server,
+ at
+
+ http://www.horde.org/horde/
+
+ ftp://ftp.horde.org/pub/horde/
+
+ Many of Wicked's prerequisites are also Horde prerequisites.
+
+ .. Important:: Be sure to have completed all of the steps in the
+ `horde/docs/INSTALL`_ file for the Horde Framework before
+ installing Wicked.
+
+ .. _`Horde Application Framework`: http://www.horde.org/horde/
+
+2. SQL support in PHP
+
+ Wicked stores its data in an SQL database. Build PHP with whichever
+ SQL driver you require; see the Horde INSTALL file for details.
+
+3. The Text_Wiki PEAR module (>= 1.2.0)
+
+ This can be installed using the ``pear`` command-line program with the
+ following command::
+
+ pear install Text_Wiki
+
+ Wicked currently requires a version greater than 1.0.0 of Text_Wiki to
+ function correctly with full charset support. Earlier versions might work
+ if you only use pure ascii texts.
+
+
+Installing Wicked
+=================
+
+Wicked is written in PHP, and must be installed in a web-accessible directory.
+The precise location of this directory will differ from system to system.
+Conventionally, Wicked is installed directly underneath Horde in the web
+server's document tree.
+
+Since Wicked is written in PHP, there is no compilation necessary; simply
+expand the distribution where you want it to reside and rename the root
+directory of the distribution to whatever you wish to appear in the URL. For
+example, with the Apache web server's default document root of
+``/usr/local/apache/htdocs``, you would type::
+
+ cd /usr/local/apache/htdocs/horde
+ tar zxvf /path/to/wicked-0.1.tar.gz
+ mv wicked-0.1 wicked
+
+and would then find Wicked at the URL::
+
+ http://your-server/horde/wicked/
+
+
+Configuring Wicked
+==================
+
+1. Configuring Horde for Wicked
+
+ a. Register the application
+
+ In ``horde/config/registry.php``, find the applications['wicked']
+ stanza. The ``status`` parameter must be marked ``=> active``. If you
+ have changed the location of Wicked relative to Horde, either in the URL
+ or in the filesystem or both, you must update the ``fileroot`` and
+ ``webroot`` settings to their correct values.
+
+2. Creating the database table
+
+ The specific steps to create the Wicked database table depend on which
+ database you've chosen to use.
+
+ First, look in ``scripts/sql/`` to see if a script already exists for
+ your database type. If so, you should be able to simply execute that
+ script as superuser in your database. (Note that executing the script as
+ the ``horde`` user will probably fail when granting privileges.)
+
+ If such a script does not exist, you'll need to build your own, using the
+ file wicked.sql as a starting point. If you need assistance in creating
+ databases, you may wish to let us know on the Wicked mailing list.
+
+3. Configuring Wicked
+
+ To configure Wicked, change to the ``config/`` directory of the installed
+ distribution, and make copies of all of the configuration ``dist`` files
+ without the ``dist`` suffix::
+
+ cd config/
+ for foo in *.dist; do cp $foo `basename $foo .dist`; done
+
+ Or on Windows::
+
+ copy *.dist *.
+
+ Documentation on the format and purpose of those files can be found in each
+ file. You may edit these files if you wish to customize Wicked's
+ appearance and behavior. With the exception of the ``conf.*`` files (see
+ below), the defaults will be correct for most sites.
+
+ You must login to Horde as a Horde Administrator to finish the configuring
+ of Wicked. Use the Horde ``Administration`` menu item to get to the
+ administration page, and then click on the ``Configuration`` icon to get
+ the configuration page. Select ``Wiki`` from the selection list of
+ applications. Fill in or change any configuration values as needed. When
+ done click on ``Generate Wiki Configuration`` to generate the ``conf.php``
+ file. If your web server doesn't have write permissions to the Wicked
+ configuration directory or file, it will not be able to write the file. In
+ this case, go back to ``Configuration`` and choose one of the other methods
+ to create the configuration file ``wicked/config/conf.php``.
+
+ Note for international users: Wicked uses GNU gettext to provide local
+ translations of text displayed by applications; the translations are found
+ in the ``po/`` directory. If a translation is not yet available for your
+ locale (and you wish to create one), or if you're having trouble using a
+ provided translation, please see the `horde/docs/TRANSLATIONS`_ file for
+ instructions.
+
+4. Testing Wicked
+
+ Test at least the following:
+
+ - Modify a page
+ - Create a new page via a WikiLink
+ - Delete a page
+
+URL Styles
+==========
+Wicked can use two forms of URL's; mod_rewrite style, or GET style.
+Your web server must have mod_rewrite enabled to use the mod_rewrite
+style. Apache Servers or Apache Proxy Servers may also need to have
+AllowEncodedSlashes and/or AcceptPathInfo enabled to use the mod_rewrite
+style. The GET style URL's should work without any special configuration.
+
+Obtaining Support
+=================
+
+If you encounter problems with Wicked, help is available!
+
+The Horde Frequently Asked Questions List (FAQ), available on the Web at
+
+ http://www.horde.org/faq/
+
+The Horde Project runs a number of mailing lists, for individual applications
+and for issues relating to the project as a whole. Information, archives, and
+subscription information can be found at
+
+ http://www.horde.org/mail/
+
+Lastly, Horde developers, contributors and users may also be found on IRC,
+on the channel #horde on the Freenode Network (irc.freenode.net).
+
+Please keep in mind that Wicked is free software written by volunteers. For
+information on reasonable support expectations, please read
+
+ http://www.horde.org/support.php
+
+Thanks for using Wicked!
+
+The Wicked team
+
+
+.. _README: ?f=README.html
+.. _`horde/docs/INSTALL`: ../../horde/docs/?f=INSTALL.html
+.. _`horde/docs/HACKING`: ../../horde/docs/?f=HACKING.html
+.. _`horde/docs/TRANSLATIONS`: ../../horde/docs/?f=TRANSLATIONS.html
--- /dev/null
+==================================
+|| Wicked Development TODO List ||
+==================================
+
+- When creating a page, take the user directly to the EditPage form.
+
+- Notifications of changed/added content ("commit" messages). Allow
+ for daily summaries, and figure out some way to categorize changes in
+ a structure for sanity with large sites.
+
+- Lots of ideas/references: http://c2.com/cgi/wiki,
+ http://twistedmatrix.com/users/jh.twistd/moin/moin.cgi/FrontPage
+
+- Allow customizations for specific uses like collaborative content,
+ (editing, notes, annotations, etc.), encyclopedias (glossaries, etc.),
+ FAQ, and so on.
+
+- Provide a mechanism to easily annotate (insert a (possibly signed) comment
+ at any point in the page.
+
+- Also, an easy 'Reply' feature, allowing the user to select text and reply
+ to it in thread mode.
+
+- Ability to generate a backup of the whole wiki (zipfile or otherwise).
+
+- Ability to generate a static HTML version of the wiki.
+
+- Ability to purge all page history (just leaving the current version).
+
+- Help pages (any page that starts with Help).
+
+- Find a way to keep old versions of deleted pages?
+
+- Ability to embed Horde_Block instances so that we can show ansel images,
+ kronolith calendars, etc.
+
+- Export pages to PDF.
+
+- Some method to associate users with homepages.
+
+- Horde_Driver_sql::getBackLinks() will incorrectly match a WikiWord in a
+ ((...))-style link.
+
+- Make RecentChanges use page_id to track changes accross renames.
+
+- Make permissions based on page_id, not page_name, so we don't loose
+ permissions when a page is renamed.
+
+- When pages are merged, merge attachments as well.
+
+- Add a page_content_type, which is a MIME type. Editors can be registered
+ and we use the Horde_Mime packages for display. This way we can have wiki
+ images, and we can have other apps register handlers.
+
+- Support for reStructuredText.
+
+- Could start very basic: a new content-type "book" or "areamap", like
+ YaWiki's areamap
+ (http://wiki.ciaweb.net/yawiki/index.php?area=Sandbox&page=AreaMap, thanks
+ to Paul Jones for the reference)
+
+- Ability to export a book to PDF.
+
+
+$Horde: wicked/docs/TODO,v 1.25 2009/04/20 17:08:32 chuck Exp $
--- /dev/null
+## This file should be reviewed prior to inclusion in your lighttpd
+## configuration. Specifically, if you have ansel somewhere other than
+## /horde/wicked you will need to edit the following rules to match your server
+## configuration.
+
+## This file should be included in your lighttpd.conf file with the "include"
+## directive. Example:
+## include "path/to/lighttpd-wicked.conf"
+## The exact path you use will of course depend on your specific configuration.
+
+url.rewrite-once += (
+ "^/horde/wicked/diff\.php.*$" => "$0",
+ "^/horde/wicked/display\.php.*$" => "$0",
+ "^/horde/wicked/history\.php.*$" => "$0",
+ "^/horde/wicked/index.php\.*$" => "$0",
+ "^/horde/wicked/opensearch\.php.*$" => "$0",
+ "^/horde/wicked/preview\.php.*$" => "$0",
+ "^/horde/wicked/test\.php.*$" => "$0",
+ "^/horde/wicked/view\.php.*$" => "$0",
+ "^/horde/wicked/(themes|js)/.*$" => "$0",
+ "^/horde/wicked/([A-Za-z0-9]+)/?(?:\?(.*))?$" => "/horde/wicked/display.php?page=$1&$2",
+ "^/horde/wicked/([A-Za-z0-9].*)$" => "/horde/wicked/display.php?page=$1"
+)
--- /dev/null
+<?php
+/**
+ * $Horde: wicked/history.php,v 1.23 2009/06/10 05:25:31 slusarz Exp $
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Tyler Colbert <tyler@colberts.us>
+ */
+
+@define('WICKED_BASE', dirname(__FILE__));
+require_once WICKED_BASE . '/lib/base.php';
+
+$page = Page::getCurrentPage();
+if (is_a($page, 'PEAR_Error')) {
+ $notification->push(_("Internal error viewing requested page"), 'horde.error');
+ header('Location: ' . Wicked::url('WikiHome', true));
+ exit;
+}
+
+if (!$page->allows(WICKED_MODE_HISTORY)) {
+ /* Redirect to display page and force it to display an error. */
+ $url = Horde_Util::addParameter(Wicked::url($page->pageName(), true), 'actionID', 'history');
+ header('Location: ' . $url);
+ exit;
+}
+
+$title = sprintf(_("History: %s"), $page->pageName());
+require WICKED_TEMPLATES . '/common-header.inc';
+require WICKED_TEMPLATES . '/menu.inc';
+$page->render(WICKED_MODE_HISTORY);
+require $registry->get('templates', 'horde') . '/common-footer.inc';
--- /dev/null
+<?php
+/**
+ * $Horde: wicked/index.php,v 1.14 2009/01/06 18:02:39 jan Exp $
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Tyler Colbert <tyler@colberts.us>
+ */
+
+@define('WICKED_BASE', dirname(__FILE__));
+$wicked_configured = (is_readable(WICKED_BASE . '/config/conf.php') &&
+ is_readable(WICKED_BASE . '/config/prefs.php'));
+
+if (!$wicked_configured) {
+ require WICKED_BASE . '/../lib/Test.php';
+ Horde_Test::configFilesMissing('Wicked', WICKED_BASE,
+ array('conf.php', 'prefs.php'));
+}
+
+require WICKED_BASE . '/display.php';
--- /dev/null
+/**
+ * Javascript code for making the ToC collapsible.
+ *
+ * $Horde: wicked/js/toc.js,v 1.3 2007/01/02 00:42:09 jan Exp $
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ */
+
+addEvent(window, 'load', wicked_toc);
+function wicked_toc()
+{
+ var toc = document.getElementById('toc');
+ var ol, h2;
+ for (var i = 0; i < toc.childNodes.length; ++i) {
+ var tagName = toc.childNodes[i].tagName.toUpperCase();
+ if (tagName == 'OL') {
+ ol = toc.childNodes[i];
+ } else if (tagName == 'H2') {
+ h2 = toc.childNodes[i];
+ }
+ }
+
+ if (!ol) {
+ return;
+ }
+
+ h2.style.cursor = 'pointer';
+
+ addEvent(h2, 'click', function() {
+ if (ol.style.display != 'none') {
+ ol.style.display = 'none';
+ } else {
+ ol.style.display = '';
+ }
+ });
+}
--- /dev/null
+<?php
+
+$block_name = _("Wiki page");
+
+/**
+ * This class extends Horde_Block:: to display a Wiki page.
+ *
+ * $Horde: wicked/lib/Block/page.php,v 1.13 2009/01/06 18:02:40 jan Exp $
+ *
+ * Copyright 2004-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Jason Felice <jason.m.felice@gmail.com>
+ * @package Horde_Block
+ */
+class Horde_Block_Wicked_page extends Horde_Block {
+
+ var $_app = 'wicked';
+
+ function _title()
+ {
+ require_once dirname(__FILE__) . '/../base.php';
+
+ $page = Page::getPage($this->_params['page']);
+ return htmlspecialchars($page->pageName());
+ }
+
+ function _content()
+ {
+ require_once dirname(__FILE__) . '/../base.php';
+
+ $page = Page::getPage($this->_params['page']);
+ return $page->render(WICKED_MODE_BLOCK);
+ }
+
+ function _params()
+ {
+ return array('page' => array('type' => 'text',
+ 'name' => _("Name of wiki page to display"),
+ 'default' => 'WikiHome'));
+ }
+
+}
--- /dev/null
+<?php
+/**
+ * @package Wicked
+ */
+
+/**
+ * VFS
+ */
+require_once 'VFS.php';
+
+define('WICKED_PAGE_MATCH_LEFT', 1);
+define('WICKED_PAGE_MATCH_RIGHT', 2);
+define('WICKED_PAGE_MATCH_ENDS', 3);
+define('WICKED_PAGE_MATCH_ANY', 4);
+
+/**
+ * Wicked_Driver:: defines an API for implementing storage backends for
+ * Wicked.
+ *
+ * $Horde: wicked/lib/Driver.php,v 1.68 2009-11-13 13:08:30 jan Exp $
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Tyler Colbert <tyler@colberts.us>
+ * @package Wicked
+ */
+class Wicked_Driver {
+
+ /**
+ * Hash containing connection parameters.
+ *
+ * @var array
+ */
+ var $_params = array();
+
+ /**
+ * VFS object for storing attachments.
+ *
+ * @var VFS
+ */
+ var $_vfs;
+
+ /**
+ * Constructs a new Wicked driver object.
+ *
+ * @param array $params A hash containing connection parameters.
+ */
+ function Wicked_Driver($params = array())
+ {
+ $this->_params = $params;
+ }
+
+ /**
+ * Accessor to manage a VFS instance.
+ */
+ function &getVFS()
+ {
+ if (!$this->_vfs) {
+ $this->_vfs =& VFS::singleton($GLOBALS['conf']['vfs']['type'],
+ Horde::getDriverConfig('vfs'));
+ }
+
+ return $this->_vfs;
+ }
+
+ /**
+ * Retrieves the page of a particular name from the database.
+ *
+ * @param string $pagename The name of the page to retrieve
+ *
+ * @return boolean True on success, PEAR_Error on failure.
+ */
+ function retrieveByName($pagename)
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ /**
+ * Retrieves a historic version of a page.
+ *
+ * @abstract
+ * @param string $pagename The name of the page to retrieve.
+ * @param string $version The version to retrieve.
+ *
+ * @return array The page hash, or PEAR_Error on failure.
+ */
+ function retrieveHistory($pagename, $version)
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ /**
+ * Logs a hit to $pagename.
+ *
+ * @param string $pagename The page that was viewed.
+ *
+ * @return boolean True or PEAR_Error on failure.
+ */
+ function logPageView($pagename)
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ /**
+ * Creates a new page.
+ *
+ * @abstract
+ *
+ * @param string $pagename The new page's name.
+ * @param string $text The new page's text.
+ *
+ * @return mixed True, or PEAR_Error on failure.
+ */
+ function newPage($pagename, $text)
+ {
+ return PEAR::raiseError(_("Not implemented."));
+ }
+
+ function updateText($pagename, $text, $changelog, $minorchange)
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ function renamePage($pagename, $newname)
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ function getPageId($pagename)
+ {
+ $pages = $this->getPages();
+ if (is_a($pages, 'PEAR_Error')) {
+ return $pages;
+ }
+ $ids = array_flip($pages);
+ return isset($ids[$pagename]) ? $ids[$pagename] : false;
+ }
+
+ function getPage($pagename)
+ {
+ return array();
+ }
+
+ function getPageById($id)
+ {
+ return array();
+ }
+
+ function getSpecialPages()
+ {
+ static $pages;
+ if (isset($pages)) {
+ return $pages;
+ }
+
+ $dh = opendir(WICKED_BASE . '/lib/Page');
+ $pages = array();
+ while (($dent = readdir($dh)) !== false) {
+ if (!preg_match('/(.*)\.php$/', $dent, $matches)) {
+ continue;
+ }
+ $pageName = $matches[1];
+ if ($pageName == 'StandardPage') {
+ continue;
+ }
+ $pages[$pageName] = $pageName;
+ }
+ closedir($dh);
+ return $pages;
+ }
+
+ function getPages($special = true)
+ {
+ return array();
+ }
+
+ function pageExists($pagename)
+ {
+ return in_array($pagename, $this->getPages());
+ }
+
+ function getAllPages()
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ function getHistory($pagename)
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ /**
+ * Returns the most recently changed pages.
+ *
+ * @param integer $days The number of days to look back.
+ *
+ * @return mixed An array of pages, or PEAR_Error on failure.
+ */
+ function getRecentChanges($days = 3)
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ /**
+ * Returns the most popular pages.
+ *
+ * @abstract
+ *
+ * @param integer $limit The number of most popular pages to return.
+ *
+ * @return mixed An array of pages, or PEAR_Error on failure.
+ */
+ function mostPopular($limit = 10)
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ /**
+ * Returns the least popular pages.
+ *
+ * @abstract
+ *
+ * @param integer $limit The number of least popular pages to return.
+ *
+ * @return mixed An array of pages, or PEAR_Error on failure.
+ */
+ function leastPopular($limit = 10)
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ /**
+ * Finds pages with matches in text or title.
+ *
+ * @abstract
+ *
+ * @param string $searchtext The search expression (Google-like).
+ *
+ * @return array A list of pages, or PEAR_Error on failure.
+ */
+ function searchText($searchtext)
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ function getBackLinks($pagename)
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ function getLikePages($pagename)
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ /**
+ * Retrieves data on files attached to a page.
+ *
+ * @abstract
+ *
+ * @param string $pageId This is the Id of the page for which we'd
+ * like to find attached files.
+ * @param boolean $allversions Whether to include all versions. If false
+ * or omitted, only the most recent version
+ * of each attachment is returned.
+ * @return mixed An array of key/value arrays describing the attached
+ * files or a PEAR_Error:: instance on failure.
+ */
+ function getAttachedFiles($pageId, $allversions = false)
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ /**
+ * Attaches a file to a page or update an attachment.
+ *
+ * @param array $file This is a key/value array describing the
+ * attachment:<pre>
+ * 'page_id' => This is the id of the page to which we would
+ * like to attach the file.
+ * 'attachment_name' => This is the filename of the attachment.
+ * 'minor' => This is a boolean which indicates whether this
+ * is a minor version update.
+ * 'change_log' => A change log entry for this attach or update
+ * operation. (Optional)
+ * 'change_author' => The user uploading this file. If not present,
+ * the currently logged-in user is assumed.</pre>
+ * @param string $data This is the contents of the file to be attached.
+ *
+ * @return boolean True or PEAR_Error:: instance on failure.
+ */
+ function attachFile($file, $data)
+ {
+ $vfs =& $this->getVFS();
+ if (is_a($vfs, 'PEAR_Error')) {
+ return $vfs;
+ }
+
+ if (!isset($file['change_author'])) {
+ $file['change_author'] = Horde_Auth::getAuth();
+ }
+
+ $result = $this->_attachFile($file);
+ if (is_a($result, 'PEAR_Error')) {
+ return $result;
+ }
+
+ /* We encode the path quoted printable so we won't get any nasty
+ * characters the filesystem might reject. */
+ $path = WICKED_VFS_ATTACH_PATH . '/' . $file['page_id'];
+ return $vfs->writeData($path, $file['attachment_name'] . ';' . $result, $data, true);
+ }
+
+ /**
+ * Remove a single version or all versions of an attachment to
+ * $pageId from the VFS backend.
+ *
+ * @param integer $pageId The Id of the page the file is attached to.
+ * @param string $attachment The name of the file.
+ * @param string $version If specified, the version to delete. If null,
+ * then all versions of $attachment will be removed.
+ *
+ * @return boolean|PEAR_Error Either true or a PEAR_Error describing failure.
+ */
+ function removeAttachment($pageId, $attachment, $version = null)
+ {
+ $vfs =& $this->getVFS();
+ if (is_a($vfs, 'PEAR_Error')) {
+ return $vfs;
+ }
+
+ $path = WICKED_VFS_ATTACH_PATH . '/' . $pageId;
+
+ $fileList = $this->getAttachedFiles($pageId, true);
+ foreach ($fileList as $file) {
+ $fileversion = $file['attachment_majorversion'] . '.' . $file['attachment_minorversion'];
+ if ($file['attachment_name'] == $attachment &&
+ (is_null($version) || $fileversion == $version)) {
+ /* Skip any attachments that don't exist so they can
+ * be cleared out of the backend. */
+ if (!$vfs->exists($path, $attachment . ';' . $fileversion)) {
+ continue;
+ }
+ $result = $vfs->deleteFile($path, $attachment . ';' . $fileversion);
+ if (is_a($result, 'PEAR_Error')) {
+ return $result;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Removes all attachments to $pageId from the VFS backend.
+ *
+ * @param integer $pageId The Id of the page to remove attachments from.
+ *
+ * @return boolean|PEAR_Error Either true or a PEAR_Error describing failure.
+ */
+ function removeAllAttachments($pageId)
+ {
+ $vfs =& $this->getVFS();
+ if (is_a($vfs, 'PEAR_Error')) {
+ return $vfs;
+ }
+
+ if (!$vfs->isFolder(WICKED_VFS_ATTACH_PATH, $pageId)) {
+ return true;
+ }
+ return $vfs->deleteFolder(WICKED_VFS_ATTACH_PATH, $pageId, true);
+ }
+
+ /**
+ * Handles the driver-specific portion of attaching a file.
+ *
+ * Wicked_Driver::attachFile() calls down to this method for the driver-
+ * specific portion, and then uses VFS to store the attachment.
+ *
+ * @abstract
+ *
+ * @access protected
+ *
+ * @param array $file See Wicked_Driver::attachFile().
+ *
+ * @return boolean The new version of the file attached, or a PEAR_Error::
+ * instance on failure.
+ */
+ function _attachFile($file)
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ /**
+ * Retrieves the contents of an attachment.
+ *
+ * @param string $pageId This is the name of the page to which the file
+ * is attached.
+ * @param string $filename This is the name of the attachment.
+ * @param string $version This is the version of the attachment.
+ *
+ * @return string The file's contents or a PEAR_Error on error.
+ */
+ function getAttachmentContents($pageId, $filename, $version)
+ {
+ $vfs =& $this->getVFS();
+ if (is_a($vfs, 'PEAR_Error')) {
+ return $vfs;
+ }
+
+ $path = WICKED_VFS_ATTACH_PATH . '/' . $pageId;
+ return $vfs->read($path, $filename . ';' . $version);
+ }
+
+ function removeVersion($pagename, $version)
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ function removeAllVersions($pagename)
+ {
+ /* When deleting a page, also delete all its attachments. */
+ $result = $this->removeAllAttachments($this->getPageId($pagename));
+ if (is_a($result, 'PEAR_Error')) {
+ return $result;
+ }
+
+ return true;
+ }
+
+ function searchTitles($searchtext)
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ /**
+ * Returns the charset used by the backend.
+ *
+ * @return string The backend's charset
+ */
+ function getCharset()
+ {
+ return Horde_Nls::getCharset();
+ }
+
+ /**
+ * Attempts to return a concrete Wicked_Driver instance based on $driver.
+ *
+ * @param string $driver The type of the concrete Wicked_Driver subclass
+ * to return.
+ * @param array $params A hash containing any additional configuration or
+ * connection parameters a subclass might need.
+ *
+ * @return mixed The newly created concrete Wicked_Driver instance, or
+ * false on an error.
+ */
+ function factory($driver = null, $params = null)
+ {
+ if ($driver === null) {
+ $driver = $GLOBALS['conf']['storage']['driver'];
+ }
+ $driver = basename($driver);
+
+ if ($params === null) {
+ $params = Horde::getDriverConfig('storage', $driver);
+ }
+
+ $class = 'Wicked_Driver_' . $driver;
+ if (!class_exists($class)) {
+ include_once dirname(__FILE__) . '/Driver/' . $driver . '.php';
+ }
+ if (class_exists($class)) {
+ $wicked = new $class($params);
+ $result = $wicked->connect();
+ if (is_a($result, 'PEAR_Error')) {
+ return $result;
+ }
+ return $wicked;
+ } else {
+ return PEAR::raiseError('Definition of ' . $class . ' not found.');
+ }
+
+ return $wicked;
+ }
+
+}
--- /dev/null
+<?php
+/**
+ * $Horde: wicked/lib/Driver/sql.php,v 1.86 2009-11-13 13:08:30 jan Exp $
+ *
+ * @package Wicked
+ */
+
+/** DB */
+require_once 'DB.php';
+
+/**
+ * Wicked storage implementation for PHP's PEAR database abstraction
+ * layer.
+ *
+ * Required values for $params:<pre>
+ * 'phptype' The database type (e.g. 'pgsql', 'mysql', etc.).
+ * 'hostspec' The hostname of the database server.
+ * 'protocol' The communication protocol ('tcp', 'unix', etc.).
+ * 'username' The username with which to connect to the database.
+ * 'password' The password associated with 'username'.
+ * 'database' The name of the database.
+ * 'table' The name of the tasks table in 'database'.
+ * 'charset' The database's internal charset.</pre>
+ *
+ * Required by some database implementations:<pre>
+ * 'options' Additional options to pass to the database.
+ * 'tty' The TTY on which to connect to the database.
+ * 'port' The port on which to connect to the database.</pre>
+ *
+ * The table structure can be created by the scripts/drivers/wicked_foo.sql
+ * script.
+ *
+ * @author Tyler Colbert <tyler@colberts.us>
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @package Wicked
+ */
+class Wicked_Driver_sql extends Wicked_Driver {
+
+ /**
+ * Handle for the current database connection.
+ *
+ * @var DB
+ */
+ var $_db;
+
+ /**
+ * Constructs a new Wicked SQL driver object.
+ *
+ * @param array $params A hash containing connection parameters.
+ */
+ function Wicked_Driver_sql($params = array())
+ {
+ parent::Wicked_Driver($params);
+ }
+
+ /**
+ * Retrieves the page of a particular name from the database.
+ *
+ * @param string $pagename The name of the page to retrieve.
+ *
+ * @return mixed True on success, PEAR_Error on failure.
+ */
+ function retrieveByName($pagename)
+ {
+ $where = 'page_name = ' . $this->_db->quote($this->_convertToDriver($pagename));
+
+ $pages = $this->_retrieve($this->_params['table'], $where);
+ if (is_a($pages, 'PEAR_Error')) {
+ Horde::logMessage($pages, __FILE__, __LINE__, PEAR_LOG_ERR);
+ return $pages;
+ }
+
+ if (!empty($pages[0])) {
+ return $pages[0];
+ }
+
+ return PEAR::raiseError($pagename . ' not found');
+ }
+
+ /**
+ * Retrieves a historic version of a page.
+ *
+ * @param string $pagename The name of the page to retrieve.
+ * @param string $version The version to retrieve.
+ *
+ * @return array The page hash, or PEAR_Error on failure.
+ */
+ function retrieveHistory($pagename, $version)
+ {
+ if (empty($version) or !preg_match('/^[0-9]+\.[0-9]+$/', $version)) {
+ return PEAR::raiseError('invalid version number');
+ }
+
+ list($major, $minor) = explode('.', $version);
+ $where = sprintf('page_name = %s AND page_majorversion = %s AND ' .
+ 'page_minorversion = %s',
+ $this->_db->quote($this->_convertToDriver($pagename)),
+ (int)$major, (int)$minor);
+
+ return $this->_retrieve($this->_params['historytable'], $where);
+ }
+
+ function getPage($pagename)
+ {
+ $where = 'page_name = ' . $this->_db->quote($this->_convertToDriver($pagename));
+ return $this->_retrieve($this->_params['table'], $where);
+ }
+
+ function getPageById($id)
+ {
+ $where = 'page_id = ' . (int)$id;
+ return $this->_retrieve($this->_params['table'], $where);
+ }
+
+ function getAllPages()
+ {
+ return $this->_retrieve($this->_params['table'], '', 'page_name');
+ }
+
+ function getHistory($pagename)
+ {
+ $where = 'page_name = ' . $this->_db->quote($this->_convertToDriver($pagename)) .
+ ' ORDER BY page_majorversion DESC, page_minorversion DESC';
+
+ return $this->_retrieve($this->_params['historytable'], $where);
+ }
+
+ /**
+ * Returns the most recently changed pages.
+ *
+ * @param integer $days The number of days to look back.
+ *
+ * @return mixed An array of pages, or PEAR_Error on failure.
+ */
+ function getRecentChanges($days = 3)
+ {
+ $where = 'version_created > ' . (time() - (86400 * $days));
+
+ $result = $this->_retrieve($this->_params['table'], $where, 'version_created DESC');
+ if (is_a($result, 'PEAR_Error')) {
+ return $result;
+ }
+
+ $result2 = $this->_retrieve($this->_params['historytable'], $where, 'version_created DESC');
+ if (is_a($result2, 'PEAR_Error')) {
+ return $result2;
+ }
+
+ return array_merge($result, $result2);
+ }
+
+ /**
+ * Returns the most popular pages.
+ *
+ * @param integer $limit The number of most popular pages to return.
+ *
+ * @return mixed An array of pages, or PEAR_Error on failure.
+ */
+ function mostPopular($limit = 10)
+ {
+ return $this->_retrieve($this->_params['table'], '', 'page_hits DESC', $limit);
+ }
+
+ /**
+ * Returns the least popular pages.
+ *
+ * @param integer $limit The number of least popular pages to return.
+ *
+ * @return mixed An array of pages, or PEAR_Error on failure.
+ */
+ function leastPopular($limit = 10)
+ {
+ return $this->_retrieve($this->_params['table'], '', 'page_hits ASC', $limit);
+ }
+
+ function searchTitles($searchtext)
+ {
+ require_once 'Horde/SQL.php';
+ $searchtext = $this->_convertToDriver($searchtext);
+ $where = Horde_SQL::buildClause($this->_db, 'page_name', 'LIKE', $searchtext);
+ return $this->_retrieve($this->_params['table'], $where);
+ }
+
+ /**
+ * Finds pages with matches in text or title.
+ *
+ * @param string $searchtext The search expression (Google-like).
+ * @param boolean $title default true If true, both page title and text
+ * are searched. If false, only page
+ * text is searched.
+ *
+ * @return array A list of pages, or PEAR_Error on failure.
+ */
+ function searchText($searchtext, $title = true)
+ {
+ require_once 'Horde/SQL/Keywords.php';
+ $searchtext = $this->_convertToDriver($searchtext);
+
+ $textClause = Horde_SQL_Keywords::parse('page_text', $searchtext);
+ if (is_a($textClause, 'PEAR_Error')) {
+ return $textClause;
+ }
+
+ if ($title) {
+ $nameClause = Horde_SQL_Keywords::parse('page_name', $searchtext);
+ if (is_a($nameClause, 'PEAR_Error')) {
+ return $nameClause;
+ }
+
+ $where = '(' . $nameClause . ') OR (' . $textClause . ')';
+ } else {
+ $where = $textClause;
+ }
+
+ return $this->_retrieve($this->_params['table'], $where);
+ }
+
+ function getBackLinks($pagename)
+ {
+ $where = 'page_text LIKE ' . $this->_db->quote('%' . $this->_convertToDriver($pagename) . '%');
+ $pages = $this->_retrieve($this->_params['table'], $where);
+ if (is_a($pages, 'PEAR_Error')) {
+ return $pages;
+ }
+
+ /* We've cast a wide net, so now we filter out pages which don't
+ * actually refer to $pagename. */
+
+ $patterns = array('/\(\(' . preg_quote($pagename, '/') . '(?:\|[^)]+)?\)\)/');
+ if (preg_match('/^' . WICKED_REGEXP_WIKIWORD . '$/', $pagename)) {
+ $patterns[] = '/\b' . preg_quote($pagename, '/') . '\b/';
+ }
+
+ foreach ($pages as $key => $page) {
+ $match = false;
+ foreach ($patterns as $pattern) {
+ if (preg_match($pattern, $page['page_text'])) {
+ $match = true;
+ }
+ }
+ if (!$match) {
+ unset($pages[$key]);
+ }
+ }
+
+ return $pages;
+ }
+
+ function getMatchingPages($searchtext, $matchType = WICKED_PAGE_MATCH_ANY)
+ {
+ $searchtext = Horde_String::lower($searchtext);
+
+ /* Short circuit the simple case. */
+ if ($matchType == WICKED_PAGE_MATCH_ANY) {
+ return $this->_retrieve($this->_params['table'],
+ 'LOWER(page_name) LIKE ' . $this->_db->quote('%' . $searchtext . '%'));
+ }
+
+ $clauses = array();
+ if ($matchType & WICKED_PAGE_MATCH_LEFT) {
+ $clauses[] = 'LOWER(page_name) LIKE ' . $this->_db->quote($searchtext . '%');
+ }
+ if ($matchType & WICKED_PAGE_MATCH_RIGHT) {
+ $clauses[] = 'LOWER(page_name) LIKE ' . $this->_db->quote('%' . $searchtext);
+ }
+
+ if (!$clauses) {
+ return array();
+ }
+
+ return $this->_retrieve($this->_params['table'], implode(' OR ', $clauses));
+ }
+
+ function getLikePages($pagename)
+ {
+ if (Horde_String::isUpper($pagename)) {
+ $firstword = $pagename;
+ $lastword = null;
+ } else {
+ /* Get the first and last word of the page name. */
+ $count = preg_match_all('/[A-Z][a-z]*/', $pagename, $matches);
+ if (!$count) {
+ return array();
+ }
+ $matches = $matches[0];
+
+ $firstword = $matches[0];
+ $lastword = $matches[$count - 1];
+
+ if (strlen($firstword) == 1 && strlen($matches[1]) == 1) {
+ for ($i = 1; $i < $count; $i++) {
+ $firstword .= $matches[$i];
+ if (isset($matches[$i + 1]) && strlen($matches[$i + 1]) > 1) {
+ break;
+ }
+ }
+ }
+
+ if (strlen($lastword) == 1 && strlen($matches[$count - 2]) == 1) {
+ for ($i = $count - 2; $i > 0; $i--) {
+ $lastword = $matches[$i] . $lastword;
+ if (isset($matches[$i - 1]) && strlen($matches[$i - 1]) > 1) {
+ break;
+ }
+ }
+ }
+ }
+
+ require_once 'Horde/SQL.php';
+
+ $where = Horde_SQL::buildClause($this->_db, 'page_name', 'LIKE', $firstword);
+ if (!empty($lastword) && $lastword != $firstword) {
+ $where .= ' OR ' . Horde_SQL::buildClause($this->_db, 'page_name', 'LIKE', $lastword);
+ }
+
+ return $this->_retrieve($this->_params['table'], $where);
+ }
+
+ /**
+ * Retrieves data on files attached to a page.
+ *
+ * @param string $pageId This is the Id of the page for which we'd
+ * like to find attached files.
+ * @param boolean $allversions Whether to include all versions. If false
+ * or omitted, only the most recent version
+ * of each attachment is returned.
+ * @return mixed An array of key/value arrays describing the attached
+ * files or a PEAR_Error:: instance on failure.
+ */
+ function getAttachedFiles($pageId, $allversions = false)
+ {
+ $where = 'page_id = ' . (int)$pageId;
+ $data = $this->_retrieve($this->_params['attachmenttable'], $where);
+ if (is_a($data, 'PEAR_Error')) {
+ return $data;
+ }
+
+ if ($allversions) {
+ $more_data = $this->_retrieve($this->_params['attachmenthistorytable'], $where);
+ if (is_a($more_data, 'PEAR_Error')) {
+ return $more_data;
+ }
+ $data = array_merge($data, $more_data);
+ }
+
+ foreach (array_keys($data) as $key) {
+ $data[$key]['attachment_name'] = $this->_convertFromDriver($data[$key]['attachment_name']);
+ }
+
+ usort($data, array($this, '_getAttachedFiles_usort'));
+ return $data;
+ }
+
+ function _getAttachedFiles_usort($a, $b)
+ {
+ $res = strcmp($a['attachment_name'], $b['attachment_name']);
+ if ($res != 0) {
+ return $res;
+ }
+ $res = ($a['attachment_majorversion'] - $b['attachment_minorversion']);
+ if ($res != 0) {
+ return $res;
+ }
+
+ return ($a['attachment_minorversion'] - $b['attachment_minorversion']);
+ }
+
+ /**
+ * Remove a single version or all versions of an attachment from
+ * $pageId. Calls parent::removeAttachment() to delete files from
+ * VFS.
+ *
+ * @param integer $pageId The Id of the page the file is attached to.
+ * @param string $attachment The name of the file.
+ * @param string $version If specified, the version to delete. If null,
+ * then all versions of $attachment will be removed.
+ *
+ * @return boolean|PEAR_Error Either true or a PEAR_Error describing failure.
+ */
+ function removeAttachment($pageId, $attachment, $version = null)
+ {
+ /* Try to delete from the VFS first. */
+ $result = parent::removeAttachment($pageId, $attachment, $version);
+ if (is_a($result, 'PEAR_Error')) {
+ return $result;
+ }
+
+ /* First try against the current attachments table. */
+ $sql = 'DELETE FROM ' . $this->_params['attachmenttable'] .
+ ' WHERE page_id = ? AND attachment_name = ?';
+ $params = array($pageId, $attachment);
+ if (!is_null($version)) {
+ list($major, $minor) = explode('.', $version);
+ $sql .= ' AND attachment_majorversion = ? AND attachment_minorversion = ?';
+ $params[] = (int)$major;
+ $params[] = (int)$minor;
+ }
+
+ Horde::logMessage('Wicked_Driver_sql::removeAttachment: ' . $sql,
+ __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+ $result = $this->_db->query($sql, $params);
+ if (is_a($result, 'PEAR_Error')) {
+ return $result;
+ }
+
+ /* Now try against the attachment history table. $params is
+ * unchanged. */
+ $sql = 'DELETE FROM ' . $this->_params['attachmenthistorytable'] .
+ ' WHERE page_id = ? AND attachment_name = ?';
+ if (!is_null($version)) {
+ $sql .= ' AND attachment_majorversion = ? AND attachment_minorversion = ?';
+ }
+
+ Horde::logMessage('Wicked_Driver_sql::removeAttachment: ' . $sql,
+ __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+ return $this->_db->query($sql, $params);
+ }
+
+ /**
+ * Removes all attachments from $pageId. Calls
+ * parent::removeAllAttachments() to delete files from VFS.
+ *
+ * @param integer $pageId The Id of the page to remove attachments from.
+ *
+ * @return boolean|PEAR_Error Either true or a PEAR_Error describing failure.
+ */
+ function removeAllAttachments($pageId)
+ {
+ /* Try to delete from the VFS first. */
+ $result = parent::removeAllAttachments($pageId);
+ if (is_a($result, 'PEAR_Error')) {
+ return $result;
+ }
+
+ /* First try against the current attachments table. */
+ $sql = 'DELETE FROM ' . $this->_params['attachmenttable'] .
+ ' WHERE page_id = ?';
+ $params = array($pageId);
+
+ Horde::logMessage('Wicked_Driver_sql::removeAllAttachments: ' . $sql,
+ __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+ $result = $this->_db->query($sql, $params);
+ if (is_a($result, 'PEAR_Error')) {
+ return $result;
+ }
+
+ /* Now try against the attachment history table. $params is
+ * unchanged. */
+ $sql = 'DELETE FROM ' . $this->_params['attachmenthistorytable'] .
+ ' WHERE page_id = ?';
+
+ Horde::logMessage('Wicked_Driver_sql::removeAllAttachments: ' . $sql,
+ __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+ return $this->_db->query($sql, $params);
+ }
+
+ /**
+ * Handles the driver-specific portion of attaching a file.
+ *
+ * Wicked_Driver::attachFile() calls down to this method for the driver-
+ * specific portion, and then uses VFS to store the attachment.
+ *
+ * @access protected
+ *
+ * @param array $file See Wicked_Driver::attachFile().
+ *
+ * @return boolean The new version of the file attached, or a PEAR_Error::
+ * instance on failure.
+ */
+ function _attachFile($file)
+ {
+ $where = 'page_id = ' . $this->_db->quote($file['page_id']) .
+ ' AND attachment_name = ' . $this->_db->quote($file['attachment_name']);
+ $attachments = $this->_retrieve($this->_params['attachmenttable'], $where);
+ if (is_a($attachments, 'PEAR_Error')) {
+ Horde::logMessage($attachments, __FILE__, __LINE__, PEAR_LOG_ERR);
+ return $attachments;
+ }
+
+ if ($file['change_author'] === false) {
+ $file['change_author'] = null;
+ }
+
+ if ($attachments) {
+ list($old) = $attachments;
+ $majorversion = $old['attachment_majorversion'];
+ $minorversion = $old['attachment_minorversion'];
+ if ($file['minor']) {
+ $minorversion++;
+ } else {
+ $majorversion++;
+ $minorversion = 0;
+ }
+
+ $sql = sprintf('INSERT INTO %s (page_id, attachment_name, attachment_majorversion, attachment_minorversion, attachment_created, change_author, change_log) SELECT page_id, attachment_name, attachment_majorversion, attachment_minorversion, attachment_created, change_author, change_log FROM %s WHERE page_id = %s AND attachment_name = %s',
+ $this->_params['attachmenthistorytable'],
+ $this->_params['attachmenttable'],
+ intval($file['page_id']),
+ $this->_db->quote($file['attachment_name']));
+ $result = $this->_db->query($sql);
+ if (is_a($result, 'PEAR_Error')) {
+ Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR);
+ return $result;
+ }
+
+ $sql = sprintf('UPDATE %s SET attachment_majorversion = %s, attachment_minorversion = %s, change_log = %s, change_author = %s, attachment_created = %s WHERE page_id = %d AND attachment_name = %s',
+ $this->_params['attachmenttable'],
+ intval($majorversion),
+ intval($minorversion),
+ $this->_db->quote($this->_convertToDriver($file['change_log'])),
+ $this->_db->quote($this->_convertToDriver($file['change_author'])),
+ intval(time()),
+ intval($file['page_id']),
+ $this->_db->quote($this->_convertToDriver($file['attachment_name'])));
+ $result = $this->_db->query($sql);
+ if (is_a($result, 'PEAR_Error')) {
+ Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR);
+ return $result;
+ }
+ } else {
+ $majorversion = 1;
+ $minorversion = 0;
+ $sql = sprintf('INSERT INTO %s (page_id, attachment_majorversion, attachment_minorversion, change_log, change_author, attachment_created, attachment_name) VALUES (%d, 1, 0, %s, %s, %s, %s)',
+ $this->_params['attachmenttable'],
+ intval($file['page_id']),
+ $this->_db->quote($this->_convertToDriver($file['change_log'])),
+ $this->_db->quote($this->_convertToDriver($file['change_author'])),
+ intval(time()),
+ $this->_db->quote($this->_convertToDriver($file['attachment_name'])));
+ $result = $this->_db->query($sql);
+ if (is_a($result, 'PEAR_Error')) {
+ Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR);
+ return $result;
+ }
+ }
+
+ return (int)$majorversion . '.' . (int)$minorversion;
+ }
+
+ /**
+ * Log a hit to $pagename.
+ *
+ * @param string $pagename The page that was viewed.
+ *
+ * @return mixed True or PEAR_Error on failure.
+ */
+ function logPageView($pagename)
+ {
+ $query = 'UPDATE ' . $this->_params['table'] .
+ ' SET page_hits = page_hits + 1 WHERE page_name = ?';
+ $values = array($this->_convertToDriver($pagename));
+
+ Horde::logMessage('Wicked_Driver_sql::logPageView(' . $pagename . '): ' . $query,
+ __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+ return $this->_db->query($query, $values);
+ }
+
+ /**
+ * Creates a new page.
+ *
+ * @param string $pagename The new page's name.
+ * @param string $text The new page's text.
+ *
+ * @return mixed True, or PEAR_Error on failure.
+ */
+ function newPage($pagename, $text)
+ {
+ if (!strlen($pagename)) {
+ return PEAR::raiseError(_("Page name must not be empty"));
+ }
+
+ if ($GLOBALS['browser']->isRobot()) {
+ return PEAR::raiseError(_("Robots are not allowed to create pages"));
+ }
+
+ $author = Horde_Auth::getAuth();
+ if ($author === false) {
+ $author = null;
+ }
+
+ $page_id = $this->_db->nextId($this->_params['table']);
+ if (is_a($page_id, 'PEAR_Error')) {
+ Horde::logMessage($page_id, __FILE__, __LINE__, PEAR_LOG_ERR);
+ return $page_id;
+ }
+
+ $query = 'INSERT INTO ' . $this->_params['table'] . ' ' .
+ '(page_id, page_name, page_text, ' .
+ 'version_created, page_majorversion, ' .
+ 'page_minorversion, page_hits, change_author) ' .
+ 'VALUES (?, ?, ?, ?, 1, 0, 0, ?)';
+ $values = array($page_id,
+ $this->_convertToDriver($pagename),
+ $this->_convertToDriver($text),
+ time(),
+ $author);
+
+ Horde::logMessage('Wicked_Driver_sql::newPage(): ' . $query,
+ __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+ /* Attempt the insertion/update query. */
+ $result = $this->_db->query($query, $values);
+
+ /* Return an error immediately if the query failed. */
+ if (is_a($result, 'PEAR_Error')) {
+ Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR);
+ return $result;
+ }
+
+ /* Send notification. */
+ $url = Wicked::url($pagename, true, -1);
+ Wicked::mail("Created page: $url\n\n$text\n", array(
+ 'Subject' => '[' . $GLOBALS['registry']->get('name') .
+ '] created: ' . $pagename));
+
+ /* Call getPages with no caching so that the new list of pages is
+ * read in. */
+ $this->getPages(true, true);
+ return $page_id;
+ }
+
+ /**
+ * Rename a page (and keep the page's history).
+ *
+ * @param string $pagename The name of the page to rename.
+ * @param string $newname The page's new name.
+ *
+ * @return mixed True or PEAR_Error on failure.
+ */
+ function renamePage($pagename, $newname)
+ {
+ $query = 'UPDATE ' . $this->_params['table'] .
+ ' SET page_name = ? WHERE page_name = ?';
+ $values = array($this->_convertToDriver($newname), $this->_convertToDriver($pagename));
+
+ Horde::logMessage('Wicked_Driver_sql::renamePage(): ' . $query,
+ __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+ $result = $this->_db->query($query, $values);
+ if (is_a($result, 'PEAR_Error')) {
+ Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR);
+ return $result;
+ }
+
+ $query = 'UPDATE ' . $this->_params['historytable'] .
+ ' SET page_name = ? WHERE page_name = ?';
+ $values = array($this->_convertToDriver($newname), $this->_convertToDriver($pagename));
+
+ Horde::logMessage('Wicked_Driver_sql::renamePage(): ' . $query,
+ __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+ $result = $this->_db->query($query, $values);
+ if (is_a($result, 'PEAR_Error')) {
+ Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR);
+ return $result;
+ }
+
+ $changelog = sprintf(_("Renamed page from %s"), $pagename);
+ $newPage = $this->retrieveByName($newname);
+ if (is_a($newPage, 'PEAR_Error')) {
+ return $newPage;
+ }
+
+ /* Call getPages with no caching so that the new list of pages is
+ * read in. */
+ $this->getPages(true, true);
+ return $this->updateText($newname, $newPage['page_text'], $changelog, true);
+ }
+
+ function updateText($pagename, $text, $changelog, $minorchange)
+ {
+ if (!$this->pageExists($pagename)) {
+ return $this->newPage($pagename, $text);
+ }
+
+ /* Copy the old version into the page history. */
+ $query = sprintf(
+ 'INSERT INTO %s (page_id, page_name, page_text, page_majorversion, page_minorversion, version_created, change_author, change_log)' .
+ ' SELECT page_id, page_name, page_text, page_majorversion, page_minorversion, version_created, change_author, change_log FROM %s WHERE page_name = ?',
+ $this->_params['historytable'],
+ $this->_params['table']);
+ $values = array($this->_convertToDriver($pagename));
+
+ Horde::logMessage('Page ' . $pagename . ' saved with user agent ' . $GLOBALS['browser']->getAgentString(),
+ __FILE__, __LINE__, PEAR_LOG_DEBUG);
+ Horde::logMessage('Wicked_Driver_sql::updateText(): ' . $query,
+ __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+ $result = $this->_db->query($query, $values);
+
+ /* Return an error immediately if the query failed. */
+ if (is_a($result, 'PEAR_Error')) {
+ Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR);
+ return $result;
+ }
+
+ /* Now move on to updating the record. */
+ if ($minorchange) {
+ $versionchange = 'page_minorversion = page_minorversion + 1';
+ } else {
+ $versionchange = 'page_majorversion = page_majorversion + 1, page_minorversion = 0';
+ }
+
+ $author = Horde_Auth::getAuth();
+ if ($author === false) {
+ $author = null;
+ }
+
+ $query = 'UPDATE ' . $this->_params['table'] .
+ ' SET change_author = ?, page_text = ?, change_log = ?, version_created = ?, ' . $versionchange .
+ ' WHERE page_name = ?';
+ $values = array($author,
+ $this->_convertToDriver($text),
+ $this->_convertToDriver($changelog),
+ time(),
+ $this->_convertToDriver($pagename));
+
+ Horde::logMessage('Wicked_Driver_sql::updateText(): ' . $query,
+ __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+ /* Attempt the insertion/update query. */
+ $result = $this->_db->query($query, $values);
+
+ /* Return an error immediately if the query failed. */
+ if (is_a($result, 'PEAR_Error')) {
+ Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR);
+ return $result;
+ }
+
+ return true;
+ }
+
+ function getPages($special = true, $no_cache = false)
+ {
+ static $pageNames;
+ if (!isset($pageNames) || $no_cache) {
+ $query = 'SELECT page_id, page_name FROM ' . $this->_params['table'];
+
+ Horde::logMessage('Wicked_Driver_sql::getPages(): ' . $query,
+ __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+ $result = $this->_db->getAssoc($query);
+ if (is_a($result, 'PEAR_Error')) {
+ return $result;
+ }
+ $pageNames = $this->_convertFromDriver($result);
+ }
+
+ if ($special) {
+ return $pageNames + $this->getSpecialPages();
+ }
+
+ return $pageNames;
+ }
+
+ /**
+ */
+ function removeVersion($pagename, $version)
+ {
+ list($major, $minor) = explode('.', $version);
+
+ /* We need to know if we're deleting the current version. */
+ $query = 'SELECT 1 FROM ' . $this->_params['table'] .
+ ' WHERE page_name = ? AND page_majorversion = ? AND page_minorversion = ?';
+ $values = array($this->_convertToDriver($pagename), $major, $minor);
+
+ Horde::logMessage('Wicked_Driver_sql::removeVersion(): ' . $query,
+ __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+ $result = $this->_db->getOne($query, $values);
+ if ($result && !is_a($result, 'PEAR_Error')) {
+ /* We're deleting the current version. Have to promote the
+ * next-most revision from the history table. */
+ $query = 'SELECT * FROM ' . $this->_params['historytable'] .
+ ' WHERE page_name = ? ORDER BY page_majorversion DESC, page_minorversion DESC';
+ $query = $this->_db->modifyLimitQuery($query, 0, 1, array($this->_convertToDriver($pagename)));
+
+ Horde::logMessage('Wicked_Driver_sql::removeVersion(): ' . $query,
+ __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+ $revision = $this->_db->getRow($query, array($this->_convertToDriver($pagename)), DB_FETCHMODE_ASSOC);
+ if (is_a($revision, 'PEAR_Error')) {
+ Horde::logMessage($revision, __FILE__, __LINE__, PEAR_LOG_ERR);
+ return $revision;
+ }
+
+ /* Replace the current version of the page with the
+ * version being promoted. */
+ $query = 'UPDATE ' . $this->_params['table'] . ' SET' .
+ ' page_text = ?, page_majorversion = ?, page_minorversion = ?,' .
+ ' version_created = ?, change_author = ?, change_log = ?' .
+ ' WHERE page_name = ?';
+ $values = array($revision['page_text'],
+ $revision['page_majorversion'],
+ $revision['page_minorversion'],
+ $revision['version_created'],
+ $revision['change_author'],
+ $revision['change_log'],
+ $this->_convertToDriver($pagename));
+
+ Horde::logMessage('Wicked_Driver_sql::removeVersion(): ' . $query,
+ __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+ $result = $this->_db->query($query, $values);
+ if (is_a($result, 'PEAR_Error')) {
+ Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR);
+ return $result;
+ }
+
+ /* Finally, remove the version that we promoted from the
+ * history table. */
+ $query = 'DELETE FROM ' . $this->_params['historytable'] .
+ ' WHERE page_name = ? and page_majorversion = ? and page_minorversion = ?';
+ $values = array($this->_convertToDriver($pagename), $revision['page_majorversion'], $revision['page_minorversion']);
+
+ Horde::logMessage('Wicked_Driver_sql::removeVersion(): ' . $query,
+ __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+ $result = $this->_db->query($query, $values);
+ if (is_a($result, 'PEAR_Error')) {
+ Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR);
+ return $result;
+ }
+ } else {
+ /* Removing a historical revision - we can just slice it
+ * out of the history table. $values is unchanged. */
+ $query = 'DELETE FROM ' . $this->_params['historytable'] .
+ ' WHERE page_name = ? and page_majorversion = ? and page_minorversion = ?';
+
+ Horde::logMessage('Wicked_Driver_sql::removeVersion(): ' . $query,
+ __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+ $result = $this->_db->query($query, $values);
+ if (is_a($result, 'PEAR_Error')) {
+ Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR);
+ return $result;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ */
+ function removeAllVersions($pagename)
+ {
+ $this->_pageNames = null;
+
+ $query = 'DELETE FROM ' . $this->_params['table'] .
+ ' WHERE page_name = ?';
+ $values = array($this->_convertToDriver($pagename));
+
+ Horde::logMessage('Wicked_Driver_sql::removeAllVersions(): ' . $query,
+ __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+ $result = $this->_db->query($query, $values);
+ if (is_a($result, 'PEAR_Error')) {
+ Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR);
+ return $result;
+ }
+
+ $query = 'DELETE FROM ' . $this->_params['historytable'] .
+ ' WHERE page_name = ?';
+ $values = array($this->_convertToDriver($pagename));
+
+ Horde::logMessage('Wicked_Driver_sql::removeAllVersions(): ' . $query,
+ __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+ $result = $this->_db->query($query, $values);
+ if (is_a($result, 'PEAR_Error')) {
+ Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR);
+ return $result;
+ }
+
+ /* Remove attachments and do other cleanup. */
+ return parent::removeAllVersions($pagename);
+ }
+
+ /**
+ * Retrieves a page or set of pages given an SQL WHERE clause.
+ *
+ * @access private
+ *
+ * @param string $table Which table are we retrieving pages from?
+ * @param string $sqlWhere Where clause for sql statement (without the
+ * 'WHERE').
+ * @param string $orderBy What column should we order results by?
+ * @param integer $limit Maximum number of pages to fetch.
+ *
+ * @return array | object Either an array of pages or PEAR::Error.
+ */
+ function _retrieve($table, $sqlWhere, $orderBy = null, $limit = null)
+ {
+ $query = sprintf('SELECT * FROM %s%s%s',
+ $table,
+ !empty($sqlWhere) ? ' WHERE ' . $sqlWhere : '',
+ !empty($orderBy) ? ' ORDER BY ' . $orderBy : '');
+
+ if (!empty($limit)) {
+ $query = $this->_db->modifyLimitQuery($query, 0, $limit);
+ }
+
+ Horde::logMessage('Wicked_Driver_sql::_retrieve(): ' . $query,
+ __FILE__, __LINE__, PEAR_LOG_DEBUG);
+
+ $result = $this->_db->query($query);
+ if (is_a($result, 'PEAR_Error')) {
+ return $result;
+ }
+
+ $row = $result->fetchRow(DB_FETCHMODE_ASSOC);
+ if (is_a($row, 'PEAR_Error')) {
+ return $row;
+ }
+
+ $pages = array();
+ $index = 0;
+ while ($row && !is_a($row, 'PEAR_Error')) {
+ $pages[$index] = $row;
+ if (isset($row['page_name'])) {
+ $pages[$index]['page_name'] = $this->_convertFromDriver($row['page_name']);
+ }
+ if (isset($row['page_text'])) {
+ $pages[$index]['page_text'] = $this->_convertFromDriver($row['page_text']);
+ }
+ if (isset($row['change_log'])) {
+ $pages[$index]['change_log'] = $this->_convertFromDriver($row['change_log']);
+ }
+
+ /* Advance to the new row in the result set. */
+ $row = $result->fetchRow(DB_FETCHMODE_ASSOC);
+ $index++;
+ }
+ $result->free();
+
+ return $pages;
+ }
+
+ /**
+ * Returns the charset used by the backend.
+ *
+ * @return string The backend's charset
+ */
+ function getCharset()
+ {
+ return $this->_params['charset'];
+ }
+
+ /**
+ * Converts a value from the driver's charset to the default charset.
+ *
+ * @param mixed $value A value to convert.
+ *
+ * @return mixed The converted value.
+ */
+ function _convertFromDriver($value)
+ {
+ return Horde_String::convertCharset($value, $this->getCharset());
+ }
+
+ /**
+ * Converts a value from the default charset to the driver's charset.
+ *
+ * @param mixed $value A value to convert.
+ *
+ * @return mixed The converted value.
+ */
+ function _convertToDriver($value)
+ {
+ return Horde_String::convertCharset($value, Horde_Nls::getCharset(), $this->getCharset());
+ }
+
+ /**
+ * Attempts to open a persistent connection to the SQL server.
+ *
+ * @return boolean True on success, PEAR_Error on failure.
+ */
+ function connect()
+ {
+ Horde::assertDriverConfig($this->_params, 'storage',
+ array('phptype', 'charset'));
+
+ if (!isset($this->_params['database'])) {
+ $this->_params['database'] = '';
+ }
+ if (!isset($this->_params['username'])) {
+ $this->_params['username'] = '';
+ }
+ if (!isset($this->_params['hostspec'])) {
+ $this->_params['hostspec'] = '';
+ }
+ if (!isset($this->_params['table'])) {
+ $this->_params['table'] = 'wicked_pages';
+ }
+ if (!isset($this->_params['historytable'])) {
+ $this->_params['historytable'] = 'wicked_history';
+ }
+ if (!isset($this->_params['attachmenttable'])) {
+ $this->_params['attachmenttable'] = 'wicked_attachments';
+ }
+ if (!isset($this->_params['attachmenthistorytable'])) {
+ $this->_params['attachmenthistorytable'] = 'wicked_attachment_history';
+ }
+
+ /* Connect to the SQL server using the supplied parameters. */
+ $this->_db = &DB::connect($this->_params,
+ array('persistent' => !empty($this->_params['persistent'])));
+ if (is_a($this->_db, 'PEAR_Error')) {
+ return $this->_db;
+ }
+
+ // Set DB portability options.
+ switch ($this->_db->phptype) {
+ case 'mssql':
+ $this->_db->setOption('portability', DB_PORTABILITY_LOWERCASE | DB_PORTABILITY_ERRORS | DB_PORTABILITY_RTRIM);
+ break;
+
+ default:
+ $this->_db->setOption('portability', DB_PORTABILITY_LOWERCASE | DB_PORTABILITY_ERRORS);
+ }
+
+ return true;
+ }
+
+}
--- /dev/null
+<?php
+/**
+ * Wicked Abtract Page Class.
+ *
+ * $Horde: wicked/lib/Page.php,v 1.114 2009-11-27 03:01:36 mrubinsk Exp $
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Tyler Colbert <tyler@colberts.us>
+ * @package Wicked
+ */
+class Page {
+
+ /**
+ * Display modes supported by this page. Possible modes:
+ *
+ * WICKED_MODE_CONTENT
+ * WICKED_MODE_DISPLAY
+ * WICKED_MODE_EDIT
+ * WICKED_MODE_REMOVE
+ * WICKED_MODE_HISTORY
+ * WICKED_MODE_DIFF
+ * WICKED_MODE_LOCKING
+ * WICKED_MODE_UNLOCKING
+ * WICKED_MODE_CREATE
+ *
+ * @var array
+ */
+ var $supportedModes = array();
+
+ /**
+ * Instance of a Text_Wiki processor.
+ *
+ * @var Text_Wiki
+ */
+ var $_proc;
+
+ /**
+ * The loaded page info.
+ *
+ * @var array
+ */
+ var $_page;
+
+ /**
+ * Is this a validly loaded page?
+ *
+ * @return boolean True if we've loaded data, false otherwise.
+ */
+ function isValid()
+ {
+ return !empty($this->_page) && !is_a($this->_page, 'PEAR_Error');
+ }
+
+ /**
+ * Retrieve this user's permissions for this page. If a
+ * permissions object does not exist, we assume reasonable
+ * defaults.
+ *
+ * @return integer The permissions bitmask.
+ */
+ function getPermissions($pageName = null)
+ {
+ global $perms, $wicked;
+
+ if (is_null($pageName)) {
+ $pageName = $this->pageName();
+ }
+
+ $pageId = $wicked->getPageId($pageName);
+ $permName = 'wicked:pages:' . $pageId;
+ if ($pageId !== false && $perms->exists($permName)) {
+ return $perms->getPermissions($permName);
+ } elseif ($perms->exists('wicked:pages')) {
+ return $perms->getPermissions('wicked:pages');
+ } else {
+ if (!Horde_Auth::getAuth()) {
+ return Horde_Perms::SHOW | Horde_Perms::READ;
+ } else {
+ return Horde_Perms::SHOW | Horde_Perms::READ | Horde_Perms::EDIT | Horde_Perms::DELETE;
+ }
+ }
+ }
+
+ /**
+ * Returns if the page allows a mode. Access rights and user state
+ * are taken into consideration.
+ *
+ * @see $supportedModes
+ *
+ * @param integer $mode The mode to check for.
+ *
+ * @return boolean True if the mode is allowed.
+ */
+ function allows($mode)
+ {
+ global $browser;
+
+ $pagePerms = $this->getPermissions();
+
+ switch ($mode) {
+ case WICKED_MODE_CREATE:
+ // Special mode for pages that don't exist yet - generic
+ // to all pages.
+ if ($browser->isRobot()) {
+ return false;
+ }
+
+ if (Horde_Auth::isAdmin()) {
+ return true;
+ }
+
+ global $perms;
+ $permName = 'wicked:pages';
+ if ($perms->exists($permName)) {
+ return $perms->getPermissions($permName) & Horde_Perms::EDIT;
+ } else {
+ return Horde_Auth::getAuth();
+ }
+ break;
+
+ case WICKED_MODE_EDIT:
+ if ($browser->isRobot()) {
+ return false;
+ }
+
+ if (Horde_Auth::isAdmin()) {
+ return true;
+ }
+
+ if (($pagePerms & Horde_Perms::EDIT) == 0) {
+ return false;
+ }
+
+ /* Locked page. */
+ if ($this->isLocked()) {
+ return false;
+ }
+ break;
+
+ case WICKED_MODE_REMOVE:
+ if ($browser->isRobot()) {
+ return false;
+ }
+
+ if (Horde_Auth::isAdmin()) {
+ return true;
+ }
+
+ if (($pagePerms & Horde_Perms::DELETE) == 0) {
+ return false;
+ }
+ break;
+
+ case WICKED_MODE_LOCKING:
+ if ($browser->isRobot()) {
+ return false;
+ }
+
+ if (Horde_Auth::isAdmin()) {
+ return true;
+ }
+
+ if (($pagePerms & Horde_Perms::EDIT) == 0) {
+ return false;
+ }
+ break;
+
+ case WICKED_MODE_UNLOCKING:
+ if (Horde_Auth::isAdmin()) {
+ return true;
+ }
+
+ return false;
+
+ // All other modes require READ permissions.
+ default:
+ if (Horde_Auth::isAdmin()) {
+ return true;
+ }
+
+ if (($pagePerms & Horde_Perms::READ) == 0) {
+ return false;
+ }
+ break;
+ }
+
+ return $this->supports($mode);
+ }
+
+ /**
+ * See if the page supports a particular mode.
+ * @see $supportedModes
+ *
+ * @param integer $mode Which mode to check for
+ *
+ * @return boolean True or false
+ */
+ function supports($mode)
+ {
+ return !empty($this->supportedModes[$mode]);
+ }
+
+ /**
+ * Get the page we are currently on.
+ *
+ * @return Returns a Page or PEAR_Error.
+ */
+ function getCurrentPage()
+ {
+ return Page::getPage(preg_replace('|/$|', '', Horde_Util::getFormData('page')),
+ Horde_Util::getFormData('version'),
+ Horde_Util::getFormData('referrer'));
+ }
+
+ /**
+ * Get the page we are currently on.
+ *
+ * @return mixed Returns a Page or PEAR_Error.
+ */
+ function getPage($pagename, $pagever = null, $referrer = null)
+ {
+ global $conf, $notification, $wicked;
+
+ if (empty($pagename)) {
+ $pagename = 'WikiHome';
+ }
+
+ $file = WICKED_BASE . '/lib/Page/' . basename($pagename) . '.php';
+ if ($pagename == basename($pagename) &&
+ file_exists($file)) {
+ require_once $file;
+ return new $pagename($referrer);
+ }
+
+ require_once WICKED_BASE . '/lib/Page/StandardPage.php';
+
+ /* If we have a version, but it is actually the most recent version,
+ * ignore it. */
+ if (!empty($pagever)) {
+ $page = new StandardPage($pagename, false, null);
+ if ($page->isValid() && $page->version() == $pagever) {
+ return $page;
+ }
+ require_once WICKED_BASE . '/lib/Page/StandardPage/StdHistoryPage.php';
+ return new StdHistoryPage($pagename, $pagever);
+ }
+
+ $page = new StandardPage($pagename);
+ if ($page->isValid() || !$page->allows(WICKED_MODE_EDIT)) {
+ return $page;
+ }
+
+ require_once WICKED_BASE . '/lib/Page/AddPage.php';
+ return new AddPage($pagename);
+ }
+
+ function versionCreated()
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ function formatVersionCreated()
+ {
+ global $prefs;
+ $v = $this->versionCreated();
+ if (is_a($v, 'PEAR_Error') || !$v) {
+ return _("Never");
+ } else {
+ return strftime($prefs->getValue('date_format'), $v);
+ }
+ }
+
+ function author()
+ {
+ if (isset($this->_page['change_author'])) {
+ $modify = $this->_page['change_author'];
+ } else {
+ return _("Guest");
+ }
+
+ $identity = &Horde_Prefs_Identity::singleton(null, $modify);
+ $name = $identity->getValue('fullname');
+ if (!empty($name)) {
+ $modify = $name;
+ }
+
+ return $modify;
+ }
+
+ function hits()
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ function version()
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ /**
+ * Retrieve the previous version number for this page
+ *
+ * @return mixed A string containing the previous version or null if this
+ * is the first version.
+ */
+ function previousVersion()
+ {
+ global $wicked;
+
+ $res = $this->version();
+ if (is_a($res, 'PEAR_Error')) {
+ return $res;
+ }
+
+ $history = $wicked->getHistory($this->pageName());
+ if (is_a($history, 'PEAR_Error')) {
+ return $history;
+ }
+
+ if (count($history) == 0) {
+ return null;
+ }
+ if ($this->isOld()) {
+ for ($i = 0; $i < count($history); $i++) {
+ $checkver = sprintf('%d.%d', $history[$i]['page_majorversion'],
+ $history[$i]['page_minorversion']);
+ if ($checkver == $this->version()) {
+ if ($i + 1 < count($history)) {
+ $i++;
+ break;
+ } else {
+ return null;
+ }
+ }
+ }
+
+ if ($i == count($history)) {
+ return null;
+ }
+ } else {
+ $i = 0;
+ }
+
+ return sprintf('%d.%d', $history[$i]['page_majorversion'],
+ $history[$i]['page_minorversion']);
+ }
+
+ function isOld()
+ {
+ return false;
+ }
+
+ /**
+ * Render this page in Display mode. You really must override this
+ * function if your page is to be anything like a real page.
+ *
+ * @return mixed Returns true or PEAR_Error.
+ */
+ function display()
+ {
+ $inner = $this->displayContents(false);
+ if (is_a($inner, 'PEAR_Error')) {
+ return $inner;
+ }
+ require WICKED_TEMPLATES . '/display/title.inc';
+ echo $inner;
+ }
+
+ /**
+ * Perform any pre-display checks for permissions, searches,
+ * etc. Called before any output is sent so the page can do
+ * redirects. If the page wants to take control of flow from here,
+ * it can, and is entirely responsible for handling the user
+ * (should call exit after redirecting, for example).
+ *
+ * $param integer $mode The page render mode.
+ * $param array $params Any page parameters.
+ */
+ function preDisplay($mode, $params)
+ {
+ }
+
+ /**
+ * Render this page for displaying in a block. You really must override
+ * this function if your page is to be anything like a real page.
+ *
+ * @return mixed Returns true or PEAR_Error.
+ */
+ function block()
+ {
+ return $this->displayContents(true);
+ }
+
+ function displayContents($isBlock)
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ /**
+ * Render this page in Remove mode.
+ *
+ * @return mixed Returns true or PEAR_Error.
+ */
+ function remove()
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ /**
+ * Render this page in History mode.
+ *
+ * @return mixed Returns true or PEAR_Error.
+ */
+ function history()
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ /**
+ * Render this page in Diff mode.
+ *
+ * @return mixed Returns true or PEAR_Error.
+ */
+ function diff()
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ function &getProcessor($output_format = 'Xhtml')
+ {
+ if (isset($this->_proc)) {
+ return $this->_proc;
+ }
+
+ global $wicked, $conf;
+
+ $view_url = Horde_Util::addParameter(Wicked::url('%s'), 'referrer', $this->pageName(), false);
+ $view_url = str_replace(array(urlencode('%s'), urlencode('/')), array('%s', '%' . urlencode('/')), $view_url);
+
+ /* Make sure we have a valid wiki format */
+ $format = $conf['wicked']['format'];
+ if (!in_array($format, array('BBCode', 'Cowiki', 'Creole', 'Mediawiki', 'Tiki'))) {
+ $format = 'Default';
+ }
+
+ /* Create format-specific Text_Wiki object */
+ $class = 'Text_Wiki_' . $format;
+ require_once 'Text/Wiki/' . $format . '.php';
+ $this->_proc = new $class();
+
+ /* Use a non-printable delimiter character that is still a valid UTF-8
+ * character. See http://pear.php.net/bugs/bug.php?id=12490. */
+ $this->_proc->delim = chr(1);
+
+ if ($output_format == 'Xhtml') {
+ /* Override rules */
+ $this->_proc->insertRule('Image2', 'Image');
+ $this->_proc->deleteRule('Image');
+ if ($format == 'Default') {
+ $this->_proc->insertRule('Code2', 'Code');
+ $this->_proc->deleteRule('Code');
+
+ $this->_proc->insertRule('Wikilink2', 'Wikilink');
+ $this->_proc->deleteRule('Wikilink');
+
+ $this->_proc->insertRule('Freelink2', 'Freelink');
+ $this->_proc->deleteRule('Freelink');
+
+ $this->_proc->insertRule('RegistryLink', 'Toc');
+ $this->_proc->insertRule('Attribute', 'RegistryLink');
+
+ $this->_proc->deleteRule('Include');
+ $this->_proc->deleteRule('Embed');
+ }
+
+ $this->_proc->setFormatConf('Xhtml', 'charset', Horde_Nls::getCharset());
+ $this->_proc->setFormatConf('Xhtml', 'translate', HTML_SPECIALCHARS);
+ $create = $this->allows(WICKED_MODE_CREATE) ? 1 : 0;
+ $linkConf = array('pages' => $wicked->getPages(),
+ 'view_url' => $view_url,
+ 'new_url' => $create ? $view_url : false,
+ 'new_text_pos' => false,
+ 'css_new' => 'newpage',
+ 'ext_chars' => true);
+
+ $this->_proc->setRenderConf('Xhtml', 'Wikilink', $linkConf);
+ $this->_proc->setRenderConf('Xhtml', 'Freelink', $linkConf);
+ $this->_proc->setRenderConf('Xhtml', 'Wikilink2', $linkConf);
+ $this->_proc->setRenderConf('Xhtml', 'Freelink2', $linkConf);
+ $this->_proc->setRenderConf('Xhtml', 'Toc',
+ array('title' => '<h2>' . _("Table of Contents") . '</h2>'));
+ $this->_proc->setRenderConf('Xhtml', 'Table',
+ array('css_table' => 'table',
+ 'css_td' => 'table-cell',
+ 'css_th' => 'table-cell'));
+
+ Horde_Autoloader::addClassPattern('/^Text_Wiki_Render_Xhtml/', WICKED_BASE . '/lib/Text_Wiki/Render/Xhtml');
+ }
+
+ Horde_Autoloader::addClassPattern('/^Text_Wiki_Parse/', WICKED_BASE . '/lib/Text_Wiki/Parse/' . $format);
+
+ return $this->_proc;
+ }
+
+ function render($mode, $params = null)
+ {
+ switch ($mode) {
+ case WICKED_MODE_CONTENT:
+ return $this->content($params);
+
+ case WICKED_MODE_DISPLAY:
+ return $this->display($params);
+
+ case WICKED_MODE_BLOCK:
+ return $this->block($params);
+
+ case WICKED_MODE_REMOVE:
+ return $this->remove();
+
+ case WICKED_MODE_HISTORY:
+ return $this->history();
+
+ case WICKED_MODE_DIFF:
+ return $this->diff($params);
+
+ default:
+ return PEAR::raiseError(_("Unsupported"));
+ }
+ }
+
+ function isLocked()
+ {
+ return false;
+ }
+
+ function lock()
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ function unlock()
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ function updateText($newtext, $changelog, $minorchange)
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ function getText()
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ function pageName()
+ {
+ return null;
+ }
+
+ function referrer()
+ {
+ return null;
+ }
+
+ function pageUrl($linkpage = null, $actionId = null)
+ {
+ $params = array('page' => $this->pageName());
+ if ($this->referrer()) {
+ $params['referrer'] = $this->referrer();
+ }
+ if ($actionId) {
+ $params['actionID'] = $actionId;
+ }
+
+ if (!$linkpage) {
+ $url = Wicked::url($this->pageName());
+ unset($params['page']);
+ } else {
+ $url = Horde::applicationUrl($linkpage);
+ }
+
+ return Horde_Util::addParameter($url, $params);
+ }
+
+ function pageTitle()
+ {
+ return $this->pageName();
+ }
+
+ function handleAction()
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+}
--- /dev/null
+<?php
+
+require_once WICKED_BASE . '/lib/Page/StandardPage.php';
+
+/**
+ * Wicked AddPage class.
+ *
+ * $Horde: wicked/lib/Page/AddPage.php,v 1.17 2009/01/06 18:02:40 jan Exp $
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Tyler Colbert <tyler@colberts.us>
+ * @package Wicked
+ */
+class AddPage extends Page {
+
+ /**
+ * Display modes supported by this page.
+ *
+ * @var array
+ */
+ var $supportedModes = array(
+ WICKED_MODE_DISPLAY => true);
+
+ /**
+ * The page to confirm creation of.
+ *
+ * @var string
+ */
+ var $_newpage;
+
+ /**
+ * Cached search results.
+ * @var array
+ */
+ var $_results;
+
+ function AddPage($newpage)
+ {
+ $this->_newpage = $newpage;
+ $this->_results = $GLOBALS['wicked']->searchTitles($newpage);
+ }
+
+ /**
+ * Bail out if there's no page name.
+ */
+ function preDisplay()
+ {
+ if (!strlen($this->referrer())) {
+ $GLOBALS['notification']->push(_("Page name must not be empty"));
+ header('Location: ' . Wicked::url('', true));
+ exit;
+ }
+ }
+
+ /**
+ * Render this page in Display mode.
+ *
+ * @return mixed Returns true or PEAR_Error.
+ */
+ function display()
+ {
+ $templates = $GLOBALS['wicked']->getMatchingPages('Template', WICKED_PAGE_MATCH_ENDS);
+ if (is_a($templates, 'PEAR_Error')) {
+ $GLOBALS['notification']->push(sprintf(_("Error retrieving templates: %s"),
+ $templates->getMessage()), 'horde.error');
+ return $templates;
+ }
+
+ $search_results = null;
+ if ($this->_results) {
+ require_once 'Horde/Template.php';
+ $template = new Horde_Template();
+ $pages = array();
+ foreach ($this->_results as $page) {
+ if (!empty($page['page_history'])) {
+ $page = new StdHistoryPage($page);
+ } else {
+ $page = new StandardPage($page);
+ }
+
+ $pages[] = array('author' => $page->author(),
+ 'created' => $page->formatVersionCreated(),
+ 'name' => $page->pageName(),
+ 'context' => false,
+ 'url' => $page->pageUrl(),
+ 'version' => $page->version());
+ }
+ $template->set('pages', $pages, true);
+ $template->set('hits', false, true);
+ $search_results = $template->fetch(WICKED_TEMPLATES . '/pagelist/pagelist.html');
+ }
+
+ require WICKED_TEMPLATES . '/edit/create.inc';
+ return true;
+ }
+
+ function pageName()
+ {
+ return 'AddPage';
+ }
+
+ function pageTitle()
+ {
+ return sprintf(_("AddPage: %s"), $this->referrer());
+ }
+
+ function referrer()
+ {
+ return $this->_newpage;
+ }
+
+}
--- /dev/null
+<?php
+
+require_once WICKED_BASE . '/lib/Page/StandardPage.php';
+
+/**
+ * Wicked AllPages class.
+ *
+ * $Horde: wicked/lib/Page/AllPages.php,v 1.15 2009/01/06 18:02:40 jan Exp $
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Tyler Colbert <tyler@colberts.us>
+ * @package Wicked
+ */
+class AllPages extends Page {
+
+ /**
+ * Display modes supported by this page.
+ */
+ var $supportedModes = array(
+ WICKED_MODE_CONTENT => true,
+ WICKED_MODE_DISPLAY => true);
+
+ /**
+ * Render this page in Content mode.
+ *
+ * @return string The page content, or PEAR_Error.
+ */
+ function content()
+ {
+ global $wicked;
+
+ return $wicked->getAllPages();
+ }
+
+ /**
+ * Render this page in display or block mode.
+ *
+ * @return mixed Returns page contents or PEAR_Error
+ */
+ function displayContents($isBlock)
+ {
+ global $notification;
+
+ $summaries = $this->content();
+ if (is_a($summaries, 'PEAR_Error')) {
+ $notification->push('Error retrieving summaries : ' .
+ $summaries->getMessage(), 'horde.error');
+ return $summaries;
+ }
+
+ require_once 'Horde/Template.php';
+ $template = new Horde_Template();
+ $pages = array();
+ foreach ($summaries as $page) {
+ $page = new StandardPage($page);
+ $pages[] = array('author' => $page->author(),
+ 'created' => $page->formatVersionCreated(),
+ 'name' => $page->pageName(),
+ 'context' => false,
+ 'url' => $page->pageUrl(),
+ 'version' => $page->version(),
+ 'class' => '');
+ }
+ $template->set('pages', $pages, true);
+ $template->set('hits', false, true);
+
+ Horde::addScriptFile('tables.js', 'horde', true);
+
+ // Show search form and page header.
+ ob_start();
+ require WICKED_TEMPLATES . '/pagelist/header.inc';
+ echo $template->fetch(WICKED_TEMPLATES . '/pagelist/pagelist.html');
+ require WICKED_TEMPLATES . '/pagelist/footer.inc';
+ $contents = ob_get_contents();
+ ob_end_clean();
+ return $contents;
+ }
+
+ function pageName()
+ {
+ return 'AllPages';
+ }
+
+ function pageTitle()
+ {
+ return _("AllPages");
+ }
+
+}
--- /dev/null
+<?php
+
+/** StandardPage:: */
+require_once WICKED_BASE . '/lib/Page/StandardPage.php';
+
+/**
+ * Wicked AttachedFiles class.
+ *
+ * $Horde: wicked/lib/Page/AttachedFiles.php,v 1.40 2009/06/15 14:17:14 mrubinsk Exp $
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Jason M. Felice <jason.m.felice@gmail.com>
+ * @package Wicked
+ */
+class AttachedFiles extends Page {
+
+ /**
+ * Display modes supported by this page.
+ *
+ * @var array
+ */
+ var $supportedModes = array(
+ WICKED_MODE_CONTENT => true,
+ WICKED_MODE_EDIT => true,
+ WICKED_MODE_REMOVE => true,
+ WICKED_MODE_DISPLAY => true);
+
+ /**
+ * The page for which we'd like to manipulate attachments.
+ *
+ * @var string
+ */
+ var $_referrer = null;
+
+ /**
+ * Constructor.
+ */
+ function AttachedFiles($referrer)
+ {
+ $this->_referrer = $referrer;
+ }
+
+ /**
+ * Returns the current user's permissions for the referring page.
+ *
+ * @return integer The permissions bitmask.
+ */
+ function getPermissions()
+ {
+ return parent::getPermissions($this->referrer());
+ }
+
+ /**
+ * Returns this page rendered in Content mode.
+ *
+ * @return string The page content, or PEAR_Error.
+ */
+ function content()
+ {
+ global $wicked, $notification;
+
+ if (!$wicked->pageExists($this->referrer())) {
+ $error = sprintf(_("Referrer \"%s\" does not exist."),
+ $this->referrer());
+ $notification->push($error, 'horde.error');
+ return PEAR::raiseError($error);
+ }
+
+ $referrer_id = $wicked->getPageId($this->referrer());
+
+ $attachments = $wicked->getAttachedFiles($referrer_id, true);
+ if (is_a($attachments, 'PEAR_Error')) {
+ return $attachments;
+ }
+
+ foreach ($attachments as $idx => $attach) {
+ $attachments[$idx]['date'] = date('M j, Y g:ia',
+ $attach['attachment_created']);
+
+ $attachments[$idx]['url'] = Horde::downloadUrl(
+ $attach['attachment_name'],
+ array('page' => $referrer_id,
+ 'file' => $attach['attachment_name'],
+ 'version' => $attach['attachment_majorversion'] . '.'
+ . $attach['attachment_minorversion']));
+
+ $attachments[$idx]['delete_form'] = $this->allows(WICKED_MODE_REMOVE);
+
+ $this->_page['change_author'] = $attachments[$idx]['change_author'];
+ $attachments[$idx]['change_author'] = $this->author();
+ }
+
+ return $attachments;
+ }
+
+ /**
+ * Returns this page rendered in Display mode.
+ *
+ * @return mixed Returns true or PEAR_Error.
+ */
+ function display()
+ {
+ global $registry, $wicked, $notification, $conf;
+
+ $attachments = $this->content();
+ if (is_a($attachments, 'PEAR_Error')) {
+ $notification->push(sprintf(_("Error retrieving attachments: %s"),
+ $attachments->getMessage()),
+ 'horde.error');
+ return $attachments;
+ }
+
+ require_once 'Horde/Template.php';
+ $template = new Horde_Template();
+
+ $template->setOption('gettext', true);
+ $template->set('pageName', $this->pageName());
+ $template->set('formAction', Wicked::url('AttachedFiles'));
+ $template->set('deleteButton', $registry->getImageDir('horde')
+ . '/delete.png');
+ $template->set('referrerLink', Wicked::url($this->referrer()));
+
+ $refreshIcon = Horde::link($this->pageUrl())
+ . Horde::img('reload.png',
+ sprintf(_("Reload \"%s\""), $this->pageTitle()),
+ '', $registry->getImageDir('horde'))
+ . '</a>';
+ $template->set('refreshIcon', $refreshIcon);
+ $template->set('attachments', $attachments, true);
+
+ /* Get an array of unique filenames for the update form. */
+ $files = array();
+ foreach ($attachments as $attachment) {
+ $files[$attachment['attachment_name']] = true;
+ }
+ $files = array_keys($files);
+ sort($files);
+ $template->set('files', $files);
+ $template->set('canUpdate',
+ $this->allows(WICKED_MODE_EDIT) && count($files),
+ true);
+ $template->set('canAttach', $this->allows(WICKED_MODE_EDIT), true);
+ if ($conf['wicked']['require_change_log']) {
+ $template->set('requireChangelog', true, true);
+ } else {
+ $template->set('requireChangelog', false, true);
+ }
+
+ $requiredMarker = Horde::img('required.png', '*', '',
+ $registry->getImageDir('horde'));
+ $template->set('requiredMarker', $requiredMarker);
+ $template->set('referrer', $this->referrer());
+ $template->set('formInput', Horde_Util::formInput());
+
+ Horde::addScriptFile('stripe.js', 'horde', true);
+ echo $template->fetch(WICKED_TEMPLATES . '/display/AttachedFiles.html');
+ return true;
+ }
+
+ function pageName()
+ {
+ return 'AttachedFiles';
+ }
+
+ function pageTitle()
+ {
+ return sprintf(_("AttachedFiles: %s"), $this->referrer());
+ }
+
+ function referrer()
+ {
+ return $this->_referrer;
+ }
+
+ /**
+ * Retrieves the form fields and processes the attachment.
+ */
+ function handleAction()
+ {
+ global $notification, $wicked, $registry, $conf;
+
+ // Only allow POST commands.
+ $cmd = Horde_Util::getPost('cmd');
+ $version = Horde_Util::getFormData('version');
+ $is_update = (bool)Horde_Util::getFormData('is_update');
+ $filename = Horde_Util::getFormData('filename');
+ $change_log = Horde_Util::getFormData('change_log');
+
+ // See if we're supposed to delete an attachment.
+ if ($cmd == 'delete' && $filename && $version) {
+ if (!$this->allows(WICKED_MODE_REMOVE)) {
+ $notification->push(_("You do not have permission to delete attachments from this page."), 'horde.error');
+ return;
+ }
+
+ $result = $wicked->removeAttachment(
+ $wicked->getPageId($this->referrer()),
+ $filename, $version);
+ if (is_a($result, 'PEAR_Error')) {
+ $notification->push($result->getMessage(), 'horde.error');
+ } else {
+ $notification->push(
+ sprintf(_("Successfully deleted version %s of \"%s\" from \"%s\""),
+ $version, $filename, $this->referrer()),
+ 'horde.success');
+ }
+ return;
+ }
+
+ if (empty($filename)) {
+ $filename = Horde_Util::dispelMagicQuotes($_FILES['attachment_file']['name']);
+ }
+ $result = Horde_Browser::wasFileUploaded('attachment_file', _("attachment"));
+ if (is_a($result, 'PEAR_Error')) {
+ $notification->push($result, 'horde.error');
+ return;
+ }
+
+ if (strpos($filename, ' ') !== false) {
+ $notification->push(
+ _("Attachments with spaces can't be embedded into a page."),
+ 'horde.warning');
+ }
+
+ $data = file_get_contents($_FILES['attachment_file']['tmp_name']);
+ if ($data === false) {
+ $notification->push(_("Can't read uploaded file."), 'horde.error');
+ return;
+ }
+
+ if (!$this->allows(WICKED_MODE_EDIT)) {
+ $notification->push(
+ sprintf(_("You do not have permission to edit \"%s\""),
+ $this->referrer()),
+ 'horde.error');
+ return;
+ }
+
+ if ($conf['wicked']['require_change_log'] && empty($change_log)) {
+ $notification->push(
+ _("You must enter a change description to attach this file."),
+ 'horde.error');
+ return;
+ }
+
+ $referrer_id = $wicked->getPageId($this->referrer());
+ $attachments = $wicked->getAttachedFiles($referrer_id);
+ if (is_a($attachments, 'PEAR_Error')) {
+ $notification->push(sprintf(_("Error retrieving attachments: %s"),
+ $attachments->getMessage()),
+ 'horde.error');
+ return;
+ }
+
+ $found = false;
+ foreach ($attachments as $attach) {
+ if ($filename == $attach['attachment_name']) {
+ $found = true;
+ break;
+ }
+ }
+
+ $minor_change = false;
+ if ($is_update) {
+ if (!$found) {
+ $notification->push(
+ sprintf(_("Can't update \"%s\": no such attachment."),
+ $filename),
+ 'horde.error');
+ return;
+ }
+ $minor_change = Horde_Util::getFormData('minor_change');
+ } else {
+ if ($found) {
+ $notification->push(
+ sprintf(_("There is already an attachment named \"%s\"."),
+ $filename),
+ 'horde.error');
+ return;
+ }
+ }
+
+ $file = array('page_id' => $referrer_id,
+ 'attachment_name' => $filename,
+ 'minor' => $minor_change,
+ 'change_log' => $change_log);
+
+ $result = $wicked->attachFile($file, $data);
+ if (is_a($result, 'PEAR_Error')) {
+ $notification->push($result, 'horde.error');
+ Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR);
+ return $result;
+ }
+
+ if ($is_update) {
+ $message = sprintf(_("Updated attachment \"%s\" on page \"%s\"."),
+ $filename, $this->referrer());
+ } else {
+ $message = sprintf(_("New attachment \"%s\" to page \"%s\"."),
+ $filename, $this->referrer());
+ }
+ $notification->push($message, 'horde.success');
+
+ $url = Wicked::url($this->referrer(), true, -1);
+ Wicked::mail($message . ' ' . _("View page: ") . $url . "\n",
+ array('Subject' => '[' . $registry->get('name')
+ . '] attachment: ' . $this->referrer() . ', '
+ . $filename));
+ }
+
+}
--- /dev/null
+<?php
+
+require_once WICKED_BASE . '/lib/Page/StandardPage.php';
+
+/**
+ * Wicked BackLinks class.
+ *
+ * $Horde: wicked/lib/Page/BackLinks.php,v 1.22 2009/01/06 18:02:40 jan Exp $
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Tyler Colbert <tyler@colberts.us>
+ * @package Wicked
+ */
+class BackLinks extends Page {
+
+ /**
+ * Display modes supported by this page.
+ *
+ * @var array
+ */
+ var $supportedModes = array(
+ WICKED_MODE_DISPLAY => true);
+
+ /**
+ * The page that we're displaying backlinks to.
+ *
+ * @var string
+ */
+ var $_referrer = null;
+
+ function BackLinks($referrer)
+ {
+ $this->_referrer = $referrer;
+ }
+
+ /**
+ * Render this page in display or block mode.
+ *
+ * @return mixed Returns contents or PEAR_Error.
+ */
+ function displayContents($isBlock)
+ {
+ global $wicked, $notification;
+
+ $summaries = $wicked->getBackLinks($this->_referrer);
+ if (is_a($summaries, 'PEAR_Error')) {
+ $notification->push('Error retrieving summaries: ' .
+ $summaries->getMessage(), 'horde.error');
+ return $summaries;
+ }
+
+ Horde::addScriptFile('tables.js', 'horde', true);
+
+ ob_start();
+ require WICKED_TEMPLATES . '/pagelist/header.inc';
+ foreach ($summaries as $page) {
+ if (!empty($page['page_history'])) {
+ $page = new StdHistoryPage($page);
+ } else {
+ $page = new StandardPage($page);
+ }
+ require WICKED_TEMPLATES . '/pagelist/summary.inc';
+ }
+ require WICKED_TEMPLATES . '/pagelist/footer.inc';
+
+ return ob_get_clean();
+ }
+
+ function pageName()
+ {
+ return 'BackLinks';
+ }
+
+ function pageTitle()
+ {
+ return sprintf(_("BackLinks: %s"), $this->referrer());
+ }
+
+ function referrer()
+ {
+ return $this->_referrer;
+ }
+
+}
--- /dev/null
+<?php
+/**
+ * $Horde: wicked/lib/Page/DeletePage.php,v 1.13 2009/06/10 05:25:32 slusarz Exp $
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @package Wicked
+ */
+
+/**
+ * Page
+ */
+require_once WICKED_BASE . '/lib/Page.php';
+
+/**
+ * Wicked DeletePage class (for confirming deletion).
+ *
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @package Wicked
+ */
+class DeletePage extends Page {
+
+ /**
+ * Display modes supported by this page.
+ *
+ * @var array
+ */
+ var $supportedModes = array(WICKED_MODE_DISPLAY => true);
+
+ /**
+ * The page that we're confirming deletion for.
+ *
+ * @var string
+ */
+ var $_referrer = null;
+
+ function DeletePage($referrer)
+ {
+ $this->_referrer = $referrer;
+ }
+
+ /**
+ * Retrieve this user's permissions for the referring page.
+ *
+ * @return integer The permissions bitmask.
+ */
+ function getPermissions()
+ {
+ return parent::getPermissions($this->referrer());
+ }
+
+ /**
+ * Send them back whence they came if they aren't allowed to
+ * delete this page.
+ */
+ function preDisplay()
+ {
+ $page = Page::getPage($this->referrer());
+ if (!$page->allows(WICKED_MODE_REMOVE)) {
+ header('Location: ' . Wicked::url($this->referrer(), true));
+ exit;
+ }
+ }
+
+ /**
+ * Render this page in Display mode.
+ *
+ * @return mixed True or PEAR_Error.
+ */
+ function display()
+ {
+ $version = Horde_Util::getFormData('version');
+ $page = Page::getPage($this->referrer(), $version);
+ if (!$page->isValid()) {
+ header('Location: ' . Wicked::url('WikiHome', true));
+ exit;
+ }
+
+ if (empty($version)) {
+ $msg = _("Are you sure you want to delete this page? All versions will be permanently removed.");
+ } else {
+ $msg = sprintf(_("Are you sure you want to delete version %s of this page?"),
+ $page->version());
+ }
+?>
+<form method="post" name="deleteform" action="<?php echo Wicked::url('DeletePage') ?>">
+<?php Horde_Util::pformInput() ?>
+<input type="hidden" name="page" value="DeletePage" />
+<input type="hidden" name="actionID" value="special" />
+<input type="hidden" name="version" value="<?php echo htmlspecialchars($version) ?>" />
+<input type="hidden" name="referrer" value="<?php echo htmlspecialchars($page->pageName()) ?>" />
+
+<h1 class="header">
+ <?php echo _("DeletePage") . ': ' . Horde::link($page->pageUrl()) . htmlspecialchars($page->pageName()) . '</a>'; if ($page->isLocked()) echo Horde::img('locked.png', _("Locked")) ?>
+</h1>
+
+<div class="headerbox" style="padding:4px">
+ <p><?php echo $msg ?></p>
+ <p>
+ <input type="submit" value="<?php echo _("Delete") ?>" class="button" />
+ <a class="button" href="<?php echo Wicked::url($page->pageName()) ?>"><?php echo _("Cancel") ?></a>
+ </p>
+</div>
+
+</form>
+<?php
+ return true;
+ }
+
+ function pageName()
+ {
+ return 'DeletePage';
+ }
+
+ function pageTitle()
+ {
+ return _("DeletePage");
+ }
+
+ function referrer()
+ {
+ return $this->_referrer;
+ }
+
+ function handleAction()
+ {
+ $pagename = $this->referrer();
+ $page = Page::getPage($pagename);
+ if ($page->allows(WICKED_MODE_REMOVE)) {
+ $version = Horde_Util::getFormData('version');
+ if (empty($version)) {
+ $GLOBALS['wicked']->removeAllVersions($pagename);
+ $GLOBALS['notification']->push(sprintf(_("Successfully deleted \"%s\"."), $pagename), 'horde.success');
+ Wicked::mail("Deleted page: $pagename\n",
+ array('Subject' => '[' . $GLOBALS['registry']->get('name') . '] deleted: ' . $pagename));
+ header('Location: ' . Wicked::url('WikiHome', true));
+ } else {
+ $GLOBALS['wicked']->removeVersion($pagename, $version);
+ $GLOBALS['notification']->push(sprintf(_("Deleted version %s of \"%s\"."), $version, $pagename), 'horde.success');
+ Wicked::mail("Deleted version: $version of $pagename\n",
+ array('Subject' => '[' . $GLOBALS['registry']->get('name') . '] deleted: ' . $pagename . ' [' . $version . ']'));
+ header('Location: ' . Wicked::url($pagename, true));
+ }
+ exit;
+ }
+
+ $GLOBALS['notification']->push(sprintf(_("You don't have permission to delete \"%s\"."), $pagename), 'horde.warning');
+ header('Location: ' . Wicked::url($this->referrer(), true));
+ exit;
+ }
+
+}
--- /dev/null
+<?php
+/**
+ * $Horde: wicked/lib/Page/EditPage.php,v 1.36 2009/09/28 22:43:59 jan Exp $
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @package Wicked
+ */
+
+/**
+ * Page
+ */
+require_once WICKED_BASE . '/lib/Page.php';
+
+/**
+ * Wicked EditPage class.
+ *
+ * @author Jason M. Felice <jason.m.felice@gmail.com>
+ * @package Wicked
+ */
+class EditPage extends Page {
+
+ /**
+ * Display modes supported by this page.
+ *
+ * @var array
+ */
+ var $supportedModes = array(
+ WICKED_MODE_DISPLAY => true,
+ WICKED_MODE_EDIT => true);
+
+ /**
+ * The page that we're editing.
+ *
+ * @var string
+ */
+ var $_referrer = null;
+
+ function EditPage($referrer)
+ {
+ $this->_referrer = $referrer;
+ if ($GLOBALS['conf']['lock']['driver'] != 'none') {
+ $this->supportedModes[WICKED_MODE_LOCKING] = $this->supportedModes[WICKED_MODE_UNLOCKING] = true;
+ }
+ }
+
+ /**
+ * Returns if the page allows a mode. Access rights and user state
+ * are taken into consideration.
+ *
+ * @see $supportedModes
+ *
+ * @param integer $mode The mode to check for.
+ *
+ * @return boolean True if the mode is allowed.
+ */
+ function allows($mode)
+ {
+ if ($mode == WICKED_MODE_EDIT) {
+ $page = Page::getPage($this->referrer());
+ if ($page->isLocked(Horde_Auth::getAuth() ? Horde_Auth::getAuth() : $GLOBALS['browser']->getIPAddress())) {
+ return false;
+ }
+ }
+ return parent::allows($mode);
+ }
+
+ /**
+ * Retrieve this user's permissions for the referring page.
+ *
+ * @return integer The permissions bitmask.
+ */
+ function getPermissions()
+ {
+ return parent::getPermissions($this->referrer());
+ }
+
+ /**
+ * Send them back whence they came if they aren't allowed to edit
+ * this page.
+ */
+ function preDisplay()
+ {
+ if (!$this->allows(WICKED_MODE_EDIT)) {
+ header('Location: ' . Wicked::url($this->referrer(), true));
+ exit;
+ }
+ if ($this->allows(WICKED_MODE_LOCKING)) {
+ $page = Page::getPage($this->referrer());
+ $result = $page->lock();
+ if (is_a($result, 'PEAR_Error')) {
+ $GLOBALS['notification']->push(sprintf(_("Page failed to lock: %s"), $result->getMessage()), 'horde.error');
+ }
+ }
+ }
+
+ /**
+ * Render this page in Display mode.
+ *
+ * @return mixed Returns true or PEAR_Error.
+ */
+ function display()
+ {
+ $page = Page::getPage($this->referrer());
+ $page_text = Horde_Util::getFormData('page_text');
+ if (is_null($page_text)) {
+ $page_text = $page->getText();
+ }
+
+ require WICKED_TEMPLATES . '/edit/standard.inc';
+ return true;
+ }
+
+ function pageName()
+ {
+ return 'EditPage';
+ }
+
+ function pageTitle()
+ {
+ return _("EditPage");
+ }
+
+ function referrer()
+ {
+ return $this->_referrer;
+ }
+
+ function isLocked()
+ {
+ $page = Page::getPage($this->referrer());
+ return $page->isLocked();
+ }
+
+ function getLockRequestor()
+ {
+ $page = Page::getPage($this->referrer());
+ return $page->getLockRequestor();
+ }
+
+ function getLockTime()
+ {
+ $page = Page::getPage($this->referrer());
+ return $page->getLockTime();
+ }
+
+ function handleAction()
+ {
+ global $notification, $conf;
+
+ $page = Page::getPage($this->referrer());
+ if (!$this->allows(WICKED_MODE_EDIT)) {
+ $notification->push(sprintf(_("You don't have permission to edit \"%s\"."), $page->pageName()));
+ } else {
+ if (!empty($GLOBALS['conf']['wicked']['captcha']) &&
+ !Horde_Auth::getAuth() &&
+ (Horde_String::lower(Horde_Util::getFormData('wicked_captcha')) != Horde_String::lower(Wicked::getCAPTCHA()))) {
+ $notification->push(_("Random string did not match."), 'horde.error');
+ return;
+ }
+ $text = Horde_Util::getFormData('page_text');
+ $changelog = Horde_Util::getFormData('changelog');
+ if ($conf['wicked']['require_change_log'] && empty($changelog)) {
+ $notification->push(_("You must provide a change log."), 'horde.error');
+ $notification->push('if (document.editform && document.editform.changelog) document.editform.changelog.focus();', 'javascript');
+ return;
+ }
+ $minorchange = Horde_Util::getFormData('minor');
+ if (trim($text) == trim($page->getText())) {
+ $notification->push(_("No changes made"), 'horde.warning');
+ } else {
+ $result = $page->updateText($text, $changelog, $minorchange);
+ if (is_a($result, 'PEAR_Error')) {
+ $notification->push(sprintf(_("Save Failed: %s"),
+ $result->getMessage()), 'horde.error');
+ } else {
+ $notification->push(_("Page Saved"), 'horde.success');
+ }
+ }
+
+ if ($this->allows(WICKED_MODE_UNLOCKING)) {
+ $result = $page->unlock();
+ if (is_a($result, 'PEAR_Error')) {
+ $GLOBALS['notification']->push(sprintf(_("Page failed to unlock: %s"), $result->getMessage()), 'horde.error');
+ }
+ }
+ }
+
+ // Show the newly saved page.
+ header('Location: ' . Wicked::url($this->referrer(), true));
+ exit;
+ }
+
+}
--- /dev/null
+<?php
+
+require_once WICKED_BASE . '/lib/Page/StandardPage.php';
+
+/**
+ * Wicked LeastPopular class.
+ *
+ * $Horde: wicked/lib/Page/LeastPopular.php,v 1.14 2009/01/06 18:02:40 jan Exp $
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Tyler Colbert <tyler@colberts.us>
+ * @package Wicked
+ */
+class LeastPopular extends Page {
+
+ /**
+ * Display modes supported by this page.
+ *
+ * @var array
+ */
+ var $supportedModes = array(
+ WICKED_MODE_CONTENT => true,
+ WICKED_MODE_DISPLAY => true);
+
+ /**
+ * Render this page in Content mode.
+ *
+ * @param integer $numPages How many (at most) pages should we return?
+ *
+ * @return string The page content, or PEAR_Error.
+ */
+ function content($numPages = 10)
+ {
+ global $wicked;
+
+ return $wicked->leastPopular($numPages);
+ }
+
+ /**
+ * Render this page in display or block mode.
+ *
+ * @return mixed Returns content or PEAR_Error.
+ */
+ function displayContents($isBlock)
+ {
+ global $notification;
+
+ $summaries = $this->content(10);
+ if (is_a($summaries, 'PEAR_Error')) {
+ $notification->push('Error retrieving LeastPopular: ' . $summaries->getMessage(), 'horde.error');
+ return $summaries;
+ }
+
+ require_once 'Horde/Template.php';
+ $template = new Horde_Template();
+ $pages = array();
+ foreach ($summaries as $page) {
+ $page = new StandardPage($page);
+ $pages[] = array('author' => $page->author(),
+ 'created' => $page->formatVersionCreated(),
+ 'name' => $page->pageName(),
+ 'context' => false,
+ 'hits' => $page->hits(),
+ 'url' => $page->pageUrl(),
+ 'version' => $page->version());
+ }
+ $template->set('pages', $pages, true);
+ $template->set('hits', true, true);
+ $hits = true;
+
+ Horde::addScriptFile('tables.js', 'horde', true);
+
+ ob_start();
+ require WICKED_TEMPLATES . '/pagelist/header.inc';
+ echo $template->fetch(WICKED_TEMPLATES . '/pagelist/pagelist.html');
+ require WICKED_TEMPLATES . '/pagelist/footer.inc';
+ $content = ob_get_contents();
+ ob_end_clean();
+ return $content;
+ }
+
+ function pageName()
+ {
+ return 'LeastPopular';
+ }
+
+ function pageTitle()
+ {
+ return _("LeastPopular");
+ }
+
+}
--- /dev/null
+<?php
+
+require_once WICKED_BASE . '/lib/Page/StandardPage.php';
+
+/**
+ * Wicked LikePages class.
+ *
+ * $Horde: wicked/lib/Page/LikePages.php,v 1.24 2009/01/06 18:02:40 jan Exp $
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Tyler Colbert <tyler@colberts.us>
+ * @package Wicked
+ */
+class LikePages extends Page {
+
+ /**
+ * Display modes supported by this page.
+ *
+ * @var array
+ */
+ var $supportedModes = array(
+ WICKED_MODE_DISPLAY => true);
+
+ /**
+ * The page that we're displaying similar pages to.
+ *
+ * @var string
+ */
+ var $_referrer = null;
+
+ function LikePages($referrer)
+ {
+ $this->_referrer = $referrer;
+ }
+
+ /**
+ * Render this page in display or block mode.
+ *
+ * @return mixed Returns contents or PEAR_Error.
+ */
+ function displayContents($isBlock)
+ {
+ global $wicked, $notification;
+
+ $referrer = $this->referrer();
+
+ $summaries = $wicked->getLikePages($referrer);
+ if (is_a($summaries, 'PEAR_Error')) {
+ $notification->push('Error retrieving summaries: ' .
+ $summaries->getMessage(), 'horde.error');
+ return $summaries;
+ }
+
+ Horde::addScriptFile('tables.js', 'horde', true);
+
+ ob_start();
+ require WICKED_TEMPLATES . '/pagelist/header.inc';
+ foreach ($summaries as $page) {
+ if (!empty($page['page_history'])) {
+ $page = new StdHistoryPage($page);
+ } else {
+ $page = new StandardPage($page);
+ }
+ require WICKED_TEMPLATES . '/pagelist/summary.inc';
+ }
+ require WICKED_TEMPLATES . '/pagelist/footer.inc';
+
+ return ob_get_clean();
+ }
+
+ function pageName()
+ {
+ return 'LikePages';
+ }
+
+ function pageTitle()
+ {
+ return sprintf(_("LikePages: %s"), $this->referrer());
+ }
+
+ function referrer()
+ {
+ return $this->_referrer;
+ }
+
+}
--- /dev/null
+<?php
+
+require_once WICKED_BASE . '/lib/Page/StandardPage.php';
+
+/**
+ * Special page for merging or renaming pages.
+ *
+ * $Horde: wicked/lib/Page/MergeOrRename.php,v 1.31 2009/07/09 08:18:51 slusarz Exp $
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Jason M. Felice <eraserhd@speakeasy.net>
+ * @package Wicked
+ */
+class MergeOrRename extends Page {
+
+ /**
+ * Display modes supported by this page.
+ *
+ * @var array
+ */
+ var $supportedModes = array(
+ WICKED_MODE_EDIT => true,
+ WICKED_MODE_DISPLAY => true);
+
+ /**
+ * The page that we're displaying similar pages to.
+ *
+ * @var string
+ */
+ var $_referrer = null;
+
+ /**
+ * Validation errors.
+ *
+ * @var string
+ */
+ var $_errors = array();
+
+ function MergeOrRename($referrer)
+ {
+ $this->_referrer = $referrer;
+ }
+
+ /**
+ * Retrieve this user's permissions for the referring page.
+ *
+ * @return integer The permissions bitmask.
+ */
+ function getPermissions()
+ {
+ return parent::getPermissions($this->referrer());
+ }
+
+ /**
+ * Render this page in Display mode.
+ *
+ * @return mixed Returns true or PEAR_Error.
+ */
+ function display()
+ {
+ global $wicked, $registry, $notification;
+
+ require_once 'Horde/Template.php';
+ $template = new Horde_Template();
+ $template->setOption('gettext', true);
+
+ $referrer = $this->referrer();
+ $template->set('pageName', 'MergeOrRename');
+ $template->set('formAction', Wicked::url('MergeOrRename'));
+ $template->set('referrer', $referrer);
+
+ $template->set('referrerLink', Wicked::url($referrer));
+
+ $requiredMarker = Horde::img('required.png', '*', '',
+ $registry->getImageDir('horde'));
+ $template->set('requiredMarker', $requiredMarker);
+
+ $references = $wicked->getBackLinks($referrer);
+ if (is_a($references, 'PEAR_Error')) {
+ $notification->push('Error retrieving back links: ' .
+ $references->getMessage(), 'horde.error');
+ return $references;
+ }
+
+ foreach ($references as $key => $page) {
+ $references[$key]['page_url'] = @htmlspecialchars(Wicked::url($page['page_name']), ENT_QUOTES, Horde_Nls::getCharset());
+ $references[$key]['page_name'] = @htmlspecialchars($page['page_name'], ENT_QUOTES, Horde_Nls::getCharset());
+
+ // Since the page name can have [ and ] and other special
+ // characters in it, and we don't want the browser or PHP decoding
+ // it, we encode it in quoted printable for the checkbox names.
+ $references[$key]['checkbox'] = preg_replace('/([^a-zA-Z_0-9 ])/e', '"=" . str_pad(dechex(ord(\'\\1\')), 2, \'0\', STR_PAD_LEFT)', $page['page_name']);
+ }
+
+ $template->set('references', $references);
+ $template->set('referenceCount', sprintf(_("This page is referenced from %d other page(s)."), count($references)));
+ $template->set('formInput', Horde_Util::formInput());
+
+ // Propogate any validation errors.
+ foreach (array('new_name', 'collision') as $elt) {
+ if (!isset($this->_errors[$elt])) {
+ $this->_errors[$elt] = '';
+ }
+ }
+ $template->set('errors', $this->_errors);
+
+ $template->set('new_name', Horde_Util::getFormData('new_name'));
+
+ Horde::addScriptFile('stripe.js', 'horde', true);
+ echo $template->fetch(WICKED_TEMPLATES . '/display/MergeOrRename.html');
+ return true;
+ }
+
+ function pageName()
+ {
+ return 'MergeOrRename';
+ }
+
+ function pageTitle()
+ {
+ return sprintf(_("MergeOrRename: %s"), $this->referrer());
+ }
+
+ function referrer()
+ {
+ return $this->_referrer;
+ }
+
+ /**
+ * Retrieve the form fields and process the merge or rename.
+ */
+ function handleAction()
+ {
+ global $wicked, $notification, $registry;
+
+ if (Horde_Util::getFormData('submit') == _("Cancel")) {
+ header('Location: ' . Wicked::url($this->referrer(), true));
+ exit;
+ }
+
+ $referrer = $this->referrer();
+
+ $new_name = Horde_Util::getFormData('new_name');
+ if (empty($new_name)) {
+ $this->_errors['new_name'] = _("This is a required field.");
+ } elseif ($new_name == $referrer) {
+ $this->_errors['new_name'] = _("New name is the same as old name.");
+ }
+ $collision = Horde_Util::getFormData('collision');
+ if (empty($collision)) {
+ $this->_errors['collision'] = _("This is a required field.");
+ }
+
+ if (count($this->_errors)) {
+ return;
+ }
+
+ $sourcePage = Page::getPage($referrer);
+ if (is_a($sourcePage, 'PEAR_Error')) {
+ $notification->push(sprintf(_("Failed to retrieve \"%s\": %s"),
+ $referrer, $sourcePage->getMessage()),
+ 'horde.error');
+ return;
+ } elseif (!$this->allows(WICKED_MODE_EDIT)) {
+ $notification->push(sprintf(_("You do not have permission to edit \"%s\""),
+ $referrer), 'horde.error');
+ return;
+ }
+
+ $destPage = Page::getPage($new_name);
+ if (!is_a($destPage, 'PEAR_Error') && !is_a($destPage, 'AddPage')) {
+ // Destination page exists.
+ if ($collision != 'merge') {
+ // We don't want to overwrite.
+ $notification->push(sprintf(_("Page \"%s\" already exists."),
+ $new_name), 'horde.error');
+ return;
+ }
+ if (!$destPage->allows(WICKED_MODE_EDIT)) {
+ $notification->push(sprintf(_("You do not have permission to edit \"%s\""),
+ $new_name), 'horde.error');
+ return;
+ }
+
+ // Merge the two pages.
+ $newText = $destPage->getText() . "\n----\n" . $sourcePage->getText();
+ $changelog = sprintf(_("Merged from %s"), $referrer);
+ $result = $wicked->updateText($new_name, $newText, $changelog, true);
+ if (is_a($result, 'PEAR_Error')) {
+ $notification->push(sprintf(_("Error updating %s: %s"),
+ $new_name, $result->getMessage()),
+ 'horde.error');
+ return;
+ }
+
+ $result = $wicked->removeAllVersions($referrer);
+ if (is_a($result, 'PEAR_Error')) {
+ $notification->push(sprintf(_("Error deleting %s: %s"),
+ $referrer, $result->getMessage()),
+ 'horde.error');
+ return;
+ }
+ $notification->push(sprintf(_("Merged \"%s\" into \"%s\"."), $referrer, $new_name), 'horde.success');
+
+ $url = Wicked::url($new_name, true, -1);
+ $message = sprintf(_("Merged \"%s\" into \"%s\". New page: %s\n"), $referrer, $new_name, $url);
+ Wicked::mail($message, array(
+ 'Subject' => '[' . $registry->get('name') . '] merged: ' . $referrer . ', ' . $new_name));
+ } else {
+ // Rename the page.
+ $result = $wicked->renamePage($referrer, $new_name);
+ if (is_a($result, 'PEAR_Error')) {
+ $notification->push(sprintf(_("Error renaming \"%s\": %s"),
+ $referrer, $result->getMessage()),
+ 'horde.error');
+ return;
+ }
+ $notification->push(sprintf(_("Renamed \"%s\" to \"%s\"."), $referrer, $new_name), 'horde.success');
+
+ $url = Wicked::url($new_name, true, -1);
+ $message = sprintf(_("Renamed \"%s\" to \"%s\". New page: %s\n"), $referrer, $new_name, $url);
+ Wicked::mail($message, array(
+ 'Subject' => '[' . $registry->get('name') . '] renamed: ' . $referrer . ', ' . $new_name));
+ }
+
+ $wikiWord = '/^' . WICKED_REGEXP_WIKIWORD . '$/';
+
+ // We don't check permissions on these pages since we want references
+ // to be fixed even if the user doing the editing couldn't fix that
+ // page, and fixing references is likely to never be a destructive
+ // action, and the user can't supply their own data for it.
+ $references = Horde_Util::getFormData('ref', array());
+ foreach ($references as $name => $value) {
+ $page_name = quoted_printable_decode($name);
+
+ // Fix up for self-references.
+ if ($page_name == $referrer) {
+ $page_name = $new_name;
+ }
+
+ $refPage = $wicked->retrieveByName($page_name);
+ if (is_a($refPage, 'PEAR_Error')) {
+ $notification->push(sprintf(_("Error retrieving %s: %s"),
+ $page_name, $refPage->getMessage()),
+ 'horde.error');
+ continue;
+ }
+
+ $changelog = sprintf(_("Changed references from %s to %s"),
+ $referrer, $new_name);
+
+ if (preg_match($wikiWord, $new_name)) {
+ $replaceWith = $new_name;
+ } else {
+ $replaceWith = '((' . $new_name . '))';
+ }
+
+ $from = array('/\(\(' . preg_quote($referrer, '/') . '\)\)/');
+ $to = array($replaceWith);
+
+ // If this works as a bare wiki word, replace that, too.
+ if (preg_match($wikiWord, $referrer)) {
+ $from[] = '/\b' . preg_quote($referrer, '/') . '\b/';
+ $to[] = $replaceWith;
+ }
+
+ $newText = preg_replace($from, $to, $refPage['page_text']);
+ $result = $wicked->updateText($page_name, $newText, $changelog, true);
+ if (is_a($result, 'PEAR_Error')) {
+ $notification->push(sprintf(_("Error updating %s: %s"),
+ $page_name, $result->getMessage()),
+ 'horde.warning');
+ return;
+ }
+ }
+
+ header('Location: ' . Wicked::url($new_name, true));
+ exit;
+ }
+
+}
--- /dev/null
+<?php
+
+require_once WICKED_BASE . '/lib/Page/StandardPage.php';
+
+/**
+ * Wicked MostPopular class.
+ *
+ * $Horde: wicked/lib/Page/MostPopular.php,v 1.14 2009/01/06 18:02:40 jan Exp $
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Tyler Colbert <tyler@colberts.us>
+ * @package Wicked
+ */
+class MostPopular extends Page {
+
+ /**
+ * Display modes supported by this page.
+ *
+ * @var array
+ */
+ var $supportedModes = array(
+ WICKED_MODE_CONTENT => true,
+ WICKED_MODE_DISPLAY => true);
+
+ /**
+ * Render this page in Content mode.
+ *
+ * @param integer $numPages How many (at most) pages should we return?
+ *
+ * @return string The page content, or PEAR_Error.
+ */
+ function content($numPages = 10)
+ {
+ global $wicked;
+
+ return $wicked->mostPopular($numPages);
+ }
+
+ /**
+ * Render this page in Display mode.
+ *
+ * @return mixed Returns true or PEAR_Error.
+ */
+ function displayContents($isBlock)
+ {
+ global $notification;
+
+ $summaries = $this->content(10);
+ if (is_a($summaries, 'PEAR_Error')) {
+ $notification->push('Error retrieving MostPopular: ' . $summaries->getMessage(), 'horde.error');
+ return $summaries;
+ }
+
+ require_once 'Horde/Template.php';
+ $template = new Horde_Template();
+ $pages = array();
+ foreach ($summaries as $page) {
+ $page = new StandardPage($page);
+ $pages[] = array('author' => $page->author(),
+ 'created' => $page->formatVersionCreated(),
+ 'name' => $page->pageName(),
+ 'context' => false,
+ 'hits' => $page->hits(),
+ 'url' => $page->pageUrl(),
+ 'version' => $page->version());
+ }
+ $template->set('pages', $pages, true);
+ $template->set('hits', true, true);
+ $hits = true;
+
+ Horde::addScriptFile('tables.js', 'horde', true);
+
+ ob_start();
+ require WICKED_TEMPLATES . '/pagelist/header.inc';
+ echo $template->fetch(WICKED_TEMPLATES . '/pagelist/pagelist.html');
+ require WICKED_TEMPLATES . '/pagelist/footer.inc';
+ $contents = ob_get_contents();
+ ob_end_clean();
+ return $contents;
+ }
+
+ function pageName()
+ {
+ return 'MostPopular';
+ }
+
+ function pageTitle()
+ {
+ return _("MostPopular");
+ }
+
+}
--- /dev/null
+<?php
+/**
+ * $Horde: wicked/lib/Page/NewPage.php,v 1.8 2009/06/10 05:25:32 slusarz Exp $
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @package Wicked
+ */
+
+/**
+ * StandardPage
+ */
+require_once WICKED_BASE . '/lib/Page/StandardPage.php';
+
+/**
+ * Wicked NewPage class.
+ *
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @package Wicked
+ */
+class NewPage extends Page {
+
+ /**
+ * Display modes supported by this page.
+ *
+ * @var array
+ */
+ var $supportedModes = array(
+ WICKED_MODE_DISPLAY => true,
+ WICKED_MODE_EDIT => true);
+
+ /**
+ * The page that we're creating.
+ *
+ * @var string
+ */
+ var $_referrer = null;
+
+ /**
+ * Page template to use.
+ *
+ * @var string
+ */
+ var $_template = null;
+
+ function NewPage($referrer)
+ {
+ $this->_referrer = $referrer;
+ $this->_template = Horde_Util::getFormData('template');
+ }
+
+ /**
+ * Retrieve this user's permissions for the referring page.
+ *
+ * @return integer The permissions bitmask.
+ */
+ function getPermissions()
+ {
+ return parent::getPermissions($this->referrer());
+ }
+
+ /**
+ * Send them back whence they came if they aren't allowed to edit
+ * this page.
+ */
+ function preDisplay()
+ {
+ if (!strlen($this->referrer())) {
+ $GLOBALS['notification']->push(_("Page name must not be empty"));
+ header('Location: ' . Wicked::url('', true));
+ exit;
+ }
+
+ if (!$this->allows(WICKED_MODE_EDIT)) {
+ header('Location: ' . Wicked::url($this->referrer(), true));
+ exit;
+ }
+ }
+
+ /**
+ * Render this page in Display mode.
+ *
+ * @return mixed Returns true or PEAR_Error.
+ */
+ function display()
+ {
+ global $notification;
+
+ // Load the page template.
+ if ($this->_template) {
+ $page = Page::getPage($this->_template);
+ $page_text = $page->getText();
+ } else {
+ $page_text = '';
+ }
+
+ $notification->push('if (document.editform && document.editform.page_text) document.editform.page_text.focus();', 'javascript');
+ require WICKED_TEMPLATES . '/edit/new.inc';
+ return true;
+ }
+
+ function pageName()
+ {
+ return 'NewPage';
+ }
+
+ function pageTitle()
+ {
+ return _("NewPage");
+ }
+
+ function referrer()
+ {
+ return $this->_referrer;
+ }
+
+ function handleAction()
+ {
+ global $notification, $wicked;
+
+ if (!$this->allows(WICKED_MODE_EDIT)) {
+ $notification->push(sprintf(_("You don't have permission to create \"%s\"."), $this->referrer()));
+ } else {
+ $text = Horde_Util::getPost('page_text');
+ if (empty($text)) {
+ $notification->push(_("Pages cannot be empty."), 'horde.error');
+ return;
+ }
+
+ $result = $wicked->newPage($this->referrer(), $text);
+ if (is_a($result, 'PEAR_Error')) {
+ $notification->push(sprintf(_("Create Failed: %s"),
+ $result->getMessage()), 'horde.error');
+ } else {
+ $notification->push(_("Page Created"), 'horde.success');
+ }
+ }
+
+ // Show the newly created page.
+ header('Location: ' . Wicked::url($this->referrer(), true));
+ exit;
+ }
+
+}
--- /dev/null
+<?php
+
+require_once WICKED_BASE . '/lib/Page/StandardPage.php';
+
+/**
+ * Wicked RecentChanges class.
+ *
+ * $Horde: wicked/lib/Page/RecentChanges.php,v 1.30 2009/06/15 14:17:14 mrubinsk Exp $
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Tyler Colbert <tyler@colberts.us>
+ * @package Wicked
+ */
+class RecentChanges extends Page {
+
+ /**
+ * Display modes supported by this page.
+ *
+ * @var array
+ */
+ var $supportedModes = array(
+ WICKED_MODE_CONTENT => true,
+ WICKED_MODE_DISPLAY => true);
+
+ /**
+ * Render this page in Content mode.
+ *
+ * @return string The page content, or PEAR_Error.
+ */
+ function content()
+ {
+ global $wicked;
+
+ $days = (int)Horde_Util::getGet('days', 3);
+ $summaries = $wicked->getRecentChanges($days);
+
+ $bydate = array();
+ $changes = array();
+ foreach ($summaries as $page) {
+ $page = new StandardPage($page);
+
+ $createDate = $page->versionCreated();
+ $tm = localtime($createDate, true);
+ $createDate = mktime(0, 0, 0, $tm['tm_mon'], $tm['tm_mday'],
+ $tm['tm_year'], $tm['tm_isdst']);
+
+ $version_url = Horde_Util::addParameter($page->pageUrl(), 'version',
+ $page->version());
+ $diff_url = Horde_Util::addParameter(Horde::applicationUrl('diff.php'),
+ array('page' => $page->pageName(),
+ 'v1' => '?',
+ 'v2' => $page->version()));
+ $diff_alt = sprintf(_("Show changes for %s"), $page->version());
+ $diff_img = Horde::img('diff.png', $diff_alt);
+ $pageInfo = array('author' => $page->author(),
+ 'name' => $page->pageName(),
+ 'url' => $page->pageUrl(),
+ 'version' => $page->version(),
+ 'version_url' => $version_url,
+ 'version_alt' => sprintf(_("Show version %s"),
+ $page->version()),
+ 'diff_url' => $diff_url,
+ 'diff_alt' => $diff_alt,
+ 'diff_img' => $diff_img,
+ 'created' => $page->formatVersionCreated(),
+ 'change_log' => $page->changeLog());
+ $bydate[$createDate][$page->versionCreated()] = $pageInfo;
+ }
+ krsort($bydate);
+
+ foreach ($bydate as $pageList) {
+ krsort($pageList);
+ $pageList = array_values($pageList);
+ $changes[] = array('date' => $pageList[0]['created'],
+ 'pages' => $pageList);
+ }
+
+ return $changes;
+ }
+
+ /**
+ * Render this page in display or block mode.
+ *
+ * @return mixed Returns contents or PEAR_Error.
+ */
+ function displayContents($isBlock)
+ {
+ global $notification;
+
+ $changes = $this->content();
+ if (is_a($changes, 'PEAR_Error')) {
+ $notification->push('Error retrieving histories: ' . $summaries->getMessage(), 'horde.error');
+ return $changes;
+ }
+
+ require_once 'Horde/Template.php';
+ $template = new Horde_Template();
+ $template->set('changes', $changes);
+
+ return $template->fetch(WICKED_TEMPLATES . '/display/RecentChanges.html');
+ }
+
+ function pageName()
+ {
+ return 'RecentChanges';
+ }
+
+ function pageTitle()
+ {
+ return _("RecentChanges");
+ }
+
+}
--- /dev/null
+<?php
+
+require_once WICKED_BASE . '/lib/Page/StandardPage.php';
+
+/**
+ * Wicked RevertPage class (for confirming reversions).
+ *
+ * $Horde: wicked/lib/Page/RevertPage.php,v 1.6 2009/06/10 05:25:32 slusarz Exp $
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @package Wicked
+ */
+class RevertPage extends Page {
+
+ /**
+ * Display modes supported by this page.
+ *
+ * @var array
+ */
+ var $supportedModes = array(WICKED_MODE_DISPLAY => true);
+
+ /**
+ * The page that we're confirming reversion for.
+ *
+ * @var string
+ */
+ var $_referrer = null;
+
+ function RevertPage($referrer)
+ {
+ $this->_referrer = $referrer;
+ }
+
+ /**
+ * Retrieve this user's permissions for the referring page.
+ *
+ * @return integer The permissions bitmask.
+ */
+ function getPermissions()
+ {
+ return parent::getPermissions($this->referrer());
+ }
+
+ /**
+ * Send them back whence they came if they aren't allowed to
+ * edit this page.
+ */
+ function preDisplay()
+ {
+ $page = Page::getPage($this->referrer());
+ if (!$page->allows(WICKED_MODE_EDIT)) {
+ header('Location: ' . Wicked::url($this->referrer(), true));
+ exit;
+ }
+ }
+
+ /**
+ * Render this page in Display mode.
+ *
+ * @return mixed True or PEAR_Error.
+ */
+ function display()
+ {
+ $version = Horde_Util::getFormData('version');
+ $page = Page::getPage($this->referrer(), $version);
+ $msg = sprintf(_("Are you sure you want to revert to version %s of this page?"), $version);
+?>
+<form method="post" name="revertform" action="<?php echo Wicked::url('RevertPage') ?>">
+<?php Horde_Util::pformInput() ?>
+<input type="hidden" name="page" value="RevertPage" />
+<input type="hidden" name="actionID" value="special" />
+<input type="hidden" name="version" value="<?php echo htmlspecialchars($version) ?>" />
+<input type="hidden" name="referrer" value="<?php echo htmlspecialchars($page->pageName()) ?>" />
+
+<h1 class="header">
+ <?php echo _("RevertPage") . ': ' . Horde::link($page->pageUrl(), $page->pageName(), 'header') . $page->pageName() . '</a>'; if ($page->isLocked()) echo Horde::img('locked.png', _("Locked")) ?>
+</h1>
+
+<div class="headerbox" style="padding:4px">
+ <p><?php echo $msg ?></p>
+ <p>
+ <input type="submit" value="<?php echo _("Revert") ?>" class="button" />
+ <a class="button" href="<?php echo Wicked::url($page->pageName()) ?>"><?php echo _("Cancel") ?></a>
+ </p>
+</div>
+
+</form>
+<?php
+ return true;
+ }
+
+ function pageName()
+ {
+ return 'RevertPage';
+ }
+
+ function pageTitle()
+ {
+ return _("RevertPage");
+ }
+
+ function referrer()
+ {
+ return $this->_referrer;
+ }
+
+ function handleAction()
+ {
+ global $notification;
+
+ $page = Page::getPage($this->referrer());
+ if ($page->allows(WICKED_MODE_EDIT)) {
+ $version = Horde_Util::getPost('version');
+ if (empty($version)) {
+ $notification->push(sprintf(_("Can't revert to an unknown version.")), 'horde.error');
+ header('Location: ' . Wicked::url($this->referrer(), true));
+ } else {
+ $oldpage = Page::getPage($this->referrer(), $version);
+ $minor = substr($page->version(), 0, strpos($page->version(), '.')) ==
+ substr($oldpage->version(), 0, strpos($oldpage->version(), '.'));
+ $page->updateText($oldpage->getText(), 'Revert', $minor);
+ $notification->push(sprintf(_("Reverted to version %s of \"%s\"."), $version, $page->pageName()));
+ header('Location: ' . Wicked::url($page->pageName(), true));
+ }
+ exit;
+ }
+
+ $notification->push(sprintf(_("You don't have permission to edit \"%s\"."), $page->pageName()), 'horde.warning');
+ header('Location: ' . Wicked::url($this->referrer(), true));
+ exit;
+ }
+
+}
--- /dev/null
+<?php
+
+require_once WICKED_BASE . '/lib/Page/StandardPage.php';
+require_once WICKED_BASE . '/lib/Page/StandardPage/StdHistoryPage.php';
+
+/**
+ * Wicked SearchAll class.
+ *
+ * $Horde: wicked/lib/Page/Search.php,v 1.7 2009/01/06 18:02:40 jan Exp $
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Ben Chavet <ben@horde.org>
+ * @package Wicked
+ */
+class Search extends Page {
+
+ /**
+ * Display modes supported by this page.
+ * @var array
+ */
+ var $supportedModes = array(
+ WICKED_MODE_CONTENT => true,
+ WICKED_MODE_DISPLAY => true);
+
+ /**
+ * Cached search results.
+ * @var array
+ */
+ var $_results;
+
+ /**
+ * Render this page in Content mode.
+ *
+ * @param string $searchtext The title to search for.
+ *
+ * @return string The page content, or PEAR_Error.
+ */
+ function content($searchtext = '')
+ {
+ if (empty($searchtext)) {
+ return array();
+ }
+
+ $titles = $GLOBALS['wicked']->searchTitles($searchtext);
+ $pages = $GLOBALS['wicked']->searchText($searchtext, false);
+
+ return array('titles' => $titles, 'pages' => $pages);
+ }
+
+ /**
+ * Perform any pre-display checks for permissions, searches,
+ * etc. Called before any output is sent so the page can do
+ * redirects. If the page wants to take control of flow from here,
+ * it can, and is entirely responsible for handling the user
+ * (should call exit after redirecting, for example).
+ *
+ * $param integer $mode The page render mode.
+ * $param array $params Any page parameters.
+ */
+ function preDisplay($mode, $params)
+ {
+ $this->_results = $this->content($params);
+ }
+
+ /**
+ * Render this page in Display mode.
+ *
+ * @param string $searchtext The title to search for.
+ *
+ * @return mixed Returns true or PEAR_Error.
+ */
+ function display($searchtext)
+ {
+ global $notification;
+
+ if (is_a($this->_results, 'PEAR_Error')) {
+ $notification->push('Error retrieving search results: ' .
+ $this->_results->getMessage(), 'horde.error');
+ return $this->_results;
+ }
+
+ if (!$searchtext) {
+ require WICKED_TEMPLATES . '/pagelist/search.inc';
+ require WICKED_TEMPLATES . '/pagelist/footer.inc';
+ return true;
+ }
+
+ Horde::addScriptFile('tables.js', 'horde', true);
+
+ require_once 'Horde/Template.php';
+ $template = new Horde_Template();
+
+ /* Prepare exact match section */
+ $exact = array();
+ $page = new StandardPage($searchtext);
+ if ($GLOBALS['wicked']->pageExists($searchtext)) {
+ $exact[] = array('author' => htmlspecialchars($page->author()),
+ 'created' => $page->formatVersionCreated(),
+ 'name' => htmlspecialchars($page->pageName()),
+ 'context' => false,
+ 'url' => $page->pageUrl(),
+ 'version' => $page->version(),
+ 'class' => '');
+ } else {
+ $exact[] = array('author' => '',
+ 'created' => '',
+ 'name' => htmlspecialchars($searchtext),
+ 'context' => sprintf(_("%s does not exist. You can create it now."), '<strong>' . htmlspecialchars($searchtext) . '</strong>'),
+ 'url' => Wicked::url($searchtext, false),
+ 'version' => '',
+ 'class' => 'newpage');
+ }
+
+ /* Prepare page title matches */
+ $titles = array();
+ foreach ($this->_results['titles'] as $page) {
+ if (!empty($page['page_history'])) {
+ $page = new StdHistoryPage($page);
+ } else {
+ $page = new StandardPage($page);
+ }
+
+ $titles[] = array('author' => $page->author(),
+ 'created' => $page->formatVersionCreated(),
+ 'name' => $page->pageName(),
+ 'context' => false,
+ 'url' => $page->pageUrl(),
+ 'version' => $page->version(),
+ 'class' => '');
+ }
+
+ /* Prepare page text matches */
+ $pages = array();
+ foreach ($this->_results['pages'] as $page) {
+ if (!empty($page['page_history'])) {
+ $page = new StdHistoryPage($page);
+ } else {
+ $page = new StandardPage($page);
+ }
+
+ $pages[] = array('author' => $page->author(),
+ 'created' => $page->formatVersionCreated(),
+ 'name' => $page->pageName(),
+ 'context' => $this->getContext($page, $searchtext),
+ 'url' => $page->pageUrl(),
+ 'version' => $page->version(),
+ 'class' => '');
+ }
+
+ $template->set('hits', false, true);
+
+ $template->set('th_page', _("Page"), true);
+ $template->set('th_version', _("Version"), true);
+ $template->set('th_author', _("Author"), true);
+ $template->set('th_created', _("Creation Date"), true);
+
+ // Show search form and page header.
+ require WICKED_TEMPLATES . '/pagelist/search.inc';
+
+ // Show exact match.
+ $template->set('title', _("Exact Match"), true);
+ $template->set('pages', $exact, true);
+ echo $template->fetch(WICKED_TEMPLATES . '/pagelist/results_header.html');
+ echo $template->fetch(WICKED_TEMPLATES . '/pagelist/pagelist.html');
+ require WICKED_TEMPLATES . '/pagelist/results_footer.inc';
+
+ // Show page title matches.
+ $template->set('title', _("Page Title Matches"), true);
+ $template->set('pages', $titles, true);
+ echo $template->fetch(WICKED_TEMPLATES . '/pagelist/results_header.html');
+ echo $template->fetch(WICKED_TEMPLATES . '/pagelist/pagelist.html');
+ require WICKED_TEMPLATES . '/pagelist/results_footer.inc';
+
+ // Show page text matches.
+ $template->set('title', _("Page Text Matches"), true);
+ $template->set('pages', $pages, true);
+ echo $template->fetch(WICKED_TEMPLATES . '/pagelist/results_header.html');
+ echo $template->fetch(WICKED_TEMPLATES . '/pagelist/pagelist.html');
+ require WICKED_TEMPLATES . '/pagelist/results_footer.inc';
+ echo '</div>';
+
+ return true;
+ }
+
+ function getContext($page, $searchtext)
+ {
+ if (preg_match('/.{0,100}' . preg_quote($searchtext, '/') . '.{0,100}/i', $page->getText(), $context)) {
+ return preg_replace('/' . preg_quote($searchtext, '/') . '/i', '<span class="match">' . htmlspecialchars($searchtext) . '</span>', htmlspecialchars($context[0]));
+ }
+ return '';
+ }
+
+ function pageName()
+ {
+ return 'Search';
+ }
+
+ function pageTitle()
+ {
+ return _("Search");
+ }
+
+}
--- /dev/null
+<?php
+/**
+ * Wicked Page class for most pages.
+ *
+ * $Horde: wicked/lib/Page/StandardPage.php,v 1.82 2009-11-27 03:01:36 mrubinsk Exp $
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Tyler Colbert <tyler@colberts.us>
+ * @package Wicked
+ */
+class StandardPage extends Page {
+
+ /**
+ * Display modes supported by this page.
+ *
+ * @var array
+ */
+ var $supportedModes = array(
+ WICKED_MODE_DISPLAY => true,
+ WICKED_MODE_EDIT => true,
+ WICKED_MODE_REMOVE => true,
+ WICKED_MODE_HISTORY => true,
+ WICKED_MODE_DIFF => true);
+
+ /**
+ * A Horde_Locks instance for un-/locking this page.
+ *
+ * @var Horde_Lock
+ */
+ var $_locks = null;
+
+ /**
+ * Lock information if this page is currently locked.
+ *
+ * @var array
+ */
+ var $_lock = null;
+
+ /**
+ * Constructs a standard page class to represent a wiki page.
+ *
+ * @param string $pagename The name of the page to represent.
+ */
+ function StandardPage($pagename)
+ {
+ if (is_array($pagename)) {
+ $this->_page = $pagename;
+ return;
+ }
+
+ global $wicked, $notification, $perms;
+ $page = $wicked->retrieveByName($pagename);
+
+ // Make sure 'wicked' permission exists. Set reasonable defaults if
+ // necessary.
+ if (!$perms->exists('wicked')) {
+ $perm = &$perms->newPermission('wicked');
+ $perm->addGuestPermission(Horde_Perms::SHOW | Horde_Perms::READ, false);
+ $perm->addDefaultPermission(Horde_Perms::SHOW | Horde_Perms::READ | Horde_Perms::EDIT | Horde_Perms::DELETE, false);
+ $perms->addPermission($perm);
+ }
+
+ // Make sure 'wicked:pages' exists. Copy from 'wicked' if it does not
+ // exist.
+ if (!$perms->exists('wicked:pages')) {
+ $perm = &$perms->newPermission('wicked:pages');
+ $copyFrom = &$perms->getPermission('wicked');
+ $perm->addGuestPermission($copyFrom->getGuestPermissions(), false);
+ $perm->addDefaultPermission($copyFrom->getDefaultPermissions(), false);
+ $perm->addCreatorPermission($copyFrom->getCreatorPermissions(), false);
+ foreach ($copyFrom->getUserPermissions() as $user => $uperm) {
+ $perm->addUserPermission($user, $uperm, false);
+ }
+ foreach ($copyFrom->getGroupPermissions() as $group => $gperm) {
+ $perm->addGroupPermission($group, $gperm, false);
+ }
+ $perms->addPermission($perm);
+ }
+
+ // If we can't load $pagename, see if there's default data for it.
+ if (is_a($page, 'PEAR_Error')) {
+ $pagefile = WICKED_BASE . '/scripts/data/' . basename($pagename);
+ if ($pagename == basename($pagename) &&
+ file_exists($pagefile)) {
+ $text = file_get_contents($pagefile);
+ $result = $wicked->newPage($pagename, $text);
+ if (!is_a($result, 'PEAR_Error')) {
+ $page = $wicked->retrieveByName($pagename);
+ if (is_a($page, 'PEAR_Error')) {
+ $notification->push(sprintf(_("Unable to create %s"), $pagename), 'horde.error');
+ }
+ }
+ }
+ }
+
+ if (is_a($page, 'PEAR_Error')) {
+ if ($pagename == 'WikiHome') {
+ $notification->push(_("Unable to create WikiHome. The wiki is not configured."), 'horde.error');
+ }
+ $this->_page = array();
+ } else {
+ $this->_page = $page;
+ }
+
+ if ($GLOBALS['conf']['lock']['driver'] != 'none') {
+ $this->supportedModes[WICKED_MODE_LOCKING] = $this->supportedModes[WICKED_MODE_UNLOCKING] = true;
+ $this->_locks = Horde_Lock::factory($GLOBALS['conf']['lock']['driver']);
+ $locks = $this->_locks->getLocks('wicked', $pagename, Horde_Lock::TYPE_EXCLUSIVE);
+ if ($locks) {
+ $this->_lock = reset($locks);
+ }
+ }
+ }
+
+ /**
+ * Returns if the page allows a mode. Access rights and user state
+ * are taken into consideration.
+ *
+ * @see $supportedModes
+ *
+ * @param integer $mode The mode to check for.
+ *
+ * @return boolean True if the mode is allowed.
+ */
+ function allows($mode)
+ {
+ if ($mode == WICKED_MODE_UNLOCKING && $this->_lock &&
+ (Horde_Auth::getAuth() && Horde_Auth::getAuth() == $this->_lock['lock_owner']) ||
+ (!Horde_Auth::getAuth() && $GLOBALS['browser']->getIPAddress() == $this->_lock['lock_owner'])) {
+ return true;
+ }
+ return parent::allows($mode);
+ }
+
+ function displayContents($isBlock)
+ {
+ global $wicked;
+
+ $wiki = $this->getProcessor();
+ $text = $wiki->transform($this->getText());
+ $attachments = array();
+
+ if (!$isBlock) {
+ $pageId = $wicked->getPageId($this->pageName());
+ if (!is_a($pageId, 'PEAR_Error')) {
+ $attachments = $wicked->getAttachedFiles($wicked->getPageId($this->pageName()));
+ if (is_a($attachments, 'PEAR_Error')) {
+ $attachments = array();
+ }
+ }
+
+ if (count($attachments)) {
+ global $mime_drivers, $mime_drivers_map;
+ $result = Horde::loadConfiguration('mime_drivers.php', array('mime_drivers', 'mime_drivers_map'), 'horde');
+ extract($result);
+ }
+ }
+
+ ob_start();
+ require WICKED_TEMPLATES . '/display/standard.inc';
+ $result = ob_get_contents();
+ ob_end_clean();
+ return $result;
+ }
+
+ /**
+ * Renders this page in History mode.
+ */
+ function history()
+ {
+ global $wicked, $notification;
+ require_once WICKED_BASE . '/lib/Page/StandardPage/StdHistoryPage.php';
+
+ $summaries = $wicked->getHistory($this->pageName());
+ if (is_a($summaries, 'PEAR_Error')) {
+ $notification->push('Error retrieving histories : ' . $summaries->getMessage(), 'horde.error');
+ return $summaries;
+ }
+
+ // Header.
+ $show_restore = !$this->isLocked();
+ $allow_diff = true;
+ $show_edit = true;
+ require WICKED_TEMPLATES . '/history/header.inc';
+ $style = 'text';
+
+ // First item is this page.
+ $show_restore = false;
+ $page = $this;
+ $i = 0;
+ require WICKED_TEMPLATES . '/history/summary.inc';
+
+ // Now the rest of the histories.
+ $show_restore = !$this->isLocked();
+ $show_edit = false;
+ foreach ($summaries as $page) {
+ $i++;
+ $page = new StdHistoryPage($page);
+ require WICKED_TEMPLATES . '/history/summary.inc';
+ }
+
+ // Footer.
+ require WICKED_TEMPLATES . '/history/footer.inc';
+ }
+
+ function isLocked($owner = null)
+ {
+ if (empty($this->_lock)) {
+ return false;
+ }
+ if (is_null($owner)) {
+ return true;
+ }
+ return $owner != $this->_lock['lock_owner'];
+ }
+
+ function lock()
+ {
+ if ($this->_locks) {
+ $owner = Horde_Auth::getAuth() ? Horde_Auth::getAuth() : $GLOBALS['browser']->getIPAddress();
+ $id = $this->_locks->setLock($owner, 'wicked', $this->pageName(), $GLOBALS['conf']['wicked']['lock']['time'] * 60, Horde_Lock::TYPE_EXCLUSIVE);
+ if ($id) {
+ $this->_lock = $this->_locks->getLockInfo($id);
+ } else {
+ return PEAR::raiseError(_("The page is already locked."));
+ }
+ }
+ }
+
+ function unlock()
+ {
+ if ($this->_locks && $this->_lock) {
+ $this->_locks->clearLock($this->_lock['lock_id']);
+ unset($this->_lock);
+ }
+ }
+
+ function getLockRequestor()
+ {
+ $requestor = $this->_lock['lock_owner'];
+ if ($requestor) {
+ $identity = Horde_Prefs_Identity::factory('none', $requestor);
+ $name = $identity->getValue('fullname');
+ if (!strlen($name)) {
+ $name = $requestor;
+ }
+ return $name;
+ }
+ return _("a guest");
+ }
+
+ function getLockTime()
+ {
+ $time = ceil(($this->_lock['lock_expiry_timestamp'] - time()) / 60);
+ return sprintf(ngettext("%d minute", "%d minutes", $time), $time);
+ }
+
+ function updateText($newtext, $changelog, $minorchange)
+ {
+ $version = $this->version();
+ $result = $GLOBALS['wicked']->updateText($this->pageName(), $newtext,
+ $changelog, $minorchange);
+ if (is_a($result, 'PEAR_Error')) {
+ return $result;
+ }
+
+ $url = Wicked::url($this->pageName(), true, -1);
+ $new_page = $this->getPage($this->pageName());
+
+ $message = "Modified page: $url\n"
+ . 'New Revision: ' . $new_page->version() . "\n"
+ . ($changelog ? 'Change log: ' . $changelog . "\n" : '')
+ . "\n"
+ . $new_page->getDiff($version);
+ Wicked::mail($message,
+ array('Subject' => '[' . $GLOBALS['registry']->get('name')
+ . '] changed: ' . $this->pageName()));
+
+ $this->_page['page_text'] = $newtext;
+ }
+
+ function pageID()
+ {
+ return isset($this->_page['page_id']) ? $this->_page['page_id'] : '';
+ }
+
+ function pageName()
+ {
+ return isset($this->_page['page_name'])
+ ? $this->_page['page_name']
+ : '';
+ }
+
+ function getText()
+ {
+ return isset($this->_page['page_text'])
+ ? $this->_page['page_text']
+ : '';
+ }
+
+ function versionCreated()
+ {
+ return isset($this->_page['version_created'])
+ ? $this->_page['version_created']
+ : '';
+ }
+
+ function hits()
+ {
+ return !empty($this->_page['page_hits'])
+ ? $this->_page['page_hits']
+ : 0;
+ }
+
+ function changeLog()
+ {
+ return $this->_page['change_log'];
+ }
+
+ function version()
+ {
+ if (isset($this->_page['page_majorversion']) &&
+ isset($this->_page['page_minorversion'])) {
+ return $this->_page['page_majorversion'] . '.' .
+ $this->_page['page_minorversion'];
+ } else {
+ return '';
+ }
+ }
+
+ function diff($version)
+ {
+ require WICKED_TEMPLATES . '/diff/diff.inc';
+ }
+
+ /**
+ * Produces a diff for this page.
+ *
+ * @param string $version Previous version, or null if diffing with
+ * `before the beginning' (empty).
+ * @param string $renderer The diff renderer.
+ */
+ function getDiff($version, $renderer = 'unified')
+ {
+ if (is_null($version)) {
+ $old_page_text = '';
+ } else {
+ $old_page = $this->getPage($this->pageName(), $version);
+ $old_page_text = $old_page->getText();
+ }
+
+ include_once 'Text/Diff.php';
+ include_once 'Text/Diff/Renderer.php';
+ include_once 'Text/Diff/Renderer/' . $renderer . '.php';
+
+ $diff = new Text_Diff(explode("\n", $old_page_text),
+ explode("\n", $this->getText()));
+
+ $class = 'Text_Diff_Renderer_' . $renderer;
+ $renderer = new $class();
+ return $renderer->render($diff);
+ }
+
+}
--- /dev/null
+<?php
+/**
+ * Wicked Page class for old versions of pages.
+ *
+ * $Horde: wicked/lib/Page/StandardPage/StdHistoryPage.php,v 1.23 2009/09/28 22:16:44 jan Exp $
+ *
+ * @author Tyler Colbert <tyler@colberts.us>
+ * @package Wicked
+ */
+class StdHistoryPage extends StandardPage {
+
+ /**
+ * Display modes supported by this page.
+ *
+ * @var array
+ */
+ var $supportedModes = array(
+ WICKED_MODE_DISPLAY => true,
+ WICKED_MODE_EDIT => false,
+ WICKED_MODE_REMOVE => true,
+ WICKED_MODE_HISTORY => true,
+ WICKED_MODE_DIFF => true,
+ WICKED_MODE_LOCKING => false,
+ WICKED_MODE_UNLOCKING => false);
+
+ /**
+ * Construct a standard history page class to represent an old
+ * version of a wiki page.
+ *
+ * @param string $pagename The name of the page to load.
+ * @param integer $version The version of the page to load.
+ */
+ function StdHistoryPage($pagename, $version = null)
+ {
+ if (empty($version)) {
+ parent::StandardPage($pagename);
+ return;
+ }
+
+ // Retrieve the version.
+ $pages = $GLOBALS['wicked']->retrieveHistory($pagename, $version);
+
+ // If it didnt find one, return an error.
+ if (is_a($pages, 'PEAR_Error')) {
+ $GLOBALS['notification']->push($pages);
+ } elseif (empty($pages[0])) {
+ $GLOBALS['notification']->push(_("History page not found"));
+ } else {
+ $this->_page = $pages[0];
+ }
+ }
+
+ function isOld()
+ {
+ return true;
+ }
+
+ function pageUrl($linkpage = null, $actionId = null)
+ {
+ return Horde_Util::addParameter(parent::pageUrl($linkpage, $actionId), 'version', $this->version());
+ }
+
+}
--- /dev/null
+<?php
+
+require_once WICKED_BASE . '/lib/Page/SyncPages.php';
+
+/**
+ * Wicked SyncDiff class.
+ *
+ * $Horde: wicked/lib/Page/SyncDiff.php,v 1.3 2009/06/10 05:25:32 slusarz Exp $
+ *
+ * Copyright 2008-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Duck <duck@obala.net>
+ * @package Wicked
+ */
+class SyncDiff extends SyncPages {
+
+ /**
+ * Display modes supported by this page.
+ */
+ var $supportedModes = array(
+ WICKED_MODE_CONTENT => true,
+ WICKED_MODE_DISPLAY => true);
+
+ /**
+ * Sync driver
+ */
+ var $_sync;
+
+ /**
+ * Working page
+ */
+ var $_pageName;
+
+ function SyncDiff()
+ {
+ parent::SyncPages();
+
+ $this->_pageName = Horde_Util::getGet('sync_page');
+ }
+
+ /**
+ * Render this page in Content mode.
+ *
+ * @return string The page content, or PEAR_Error.
+ */
+ function content()
+ {
+ if (!$this->_loadSyncDriver()) {
+ return PEAR::raiseError(_("Synchronization is disabled"));
+ }
+
+ $remote = $this->_sync->getPageSource($this->_pageName);
+ if (is_a($remote, 'PEAR_Error')) {
+ return $remote;
+ }
+
+ $page = Page::getPage($this->_pageName);
+ if (is_a($page, 'PEAR_Error')) {
+ return $page;
+ }
+
+ $local = $page->getText();
+ if (is_a($local, 'PEAR_Error')) {
+ return $local;
+ }
+
+ $renderer = 'inline';
+ $inverse = Horde_Util::getGet('inverse', 1);
+
+ include_once 'Text/Diff.php';
+ include_once 'Text/Diff/Renderer.php';
+ include_once 'Text/Diff/Renderer/' . $renderer . '.php';
+
+ if ($inverse) {
+ $diff = new Text_Diff(explode("\n", $local),
+ explode("\n", $remote));
+ $name1 = _("Local");
+ $name2 = _("Remote");
+ } else {
+ $diff = new Text_Diff(explode("\n", $remote),
+ explode("\n", $local));
+ $name1 = _("Remote");
+ $name2 = _("Local");
+ }
+
+ $class = 'Text_Diff_Renderer_' . $renderer;
+ $renderer = new $class();
+
+ Horde::addScriptFile('tables.js', 'horde', true);
+
+ ob_start();
+ require WICKED_TEMPLATES . '/sync/diff.inc';
+ return ob_get_clean();
+ }
+
+ /**
+ * Render this page in display or block mode.
+ *
+ * @return mixed Returns page contents or PEAR_Error
+ */
+ function displayContents($isBlock)
+ {
+ global $notification;
+
+ $content = $this->content();
+ if (is_a($content, 'PEAR_Error')) {
+ $notification->push($content);
+ }
+
+ return $content;
+ }
+
+ /**
+ * Page name
+ */
+ function pageName()
+ {
+ return 'SyncDiff';
+ }
+
+ /**
+ * Page title
+ */
+ function pageTitle()
+ {
+ return _("SyncDiff");
+ }
+
+ /**
+ * Try to find out if any version's content is same on the local and remote
+ * servers.
+ */
+ function _getSameVersion()
+ {
+ $local = $GLOBALS['wicked']->getHistory($this->_pageName);
+ if (is_a($local, 'PEAR_Error')) {
+ return $local;
+ }
+
+ $info = $this->getLocalPageInfo($this->_pageName);
+ if (is_a($info, 'PEAR_Error')) {
+ return $info;
+ }
+ $local[] = $info;
+
+ $remote = $this->_sync->getPageHistory($this->_pageName);
+ if (is_a($remote, 'PEAR_Error')) {
+ return $remote;
+ }
+
+ $info = $this->getRemotePageInfo($this->_pageName);
+ if (is_a($info, 'PEAR_Error')) {
+ return $info;
+ }
+ $remote[] = $info;
+
+ $checksums = array();
+ foreach (array_keys($local) as $i) {
+ if (!isset($local[$i]['page_checksum'])) {
+ $local[$i]['page_checksum'] = md5($local[$i]['page_text']);
+ unset($local[$i]['page_text']);
+ }
+ $checksums[$i] = $local[$i]['page_checksum'];
+ }
+
+ $result = false;
+ foreach ($remote as $history) {
+ $version = array_search($history['page_checksum'], $checksums);
+ if ($version !== false) {
+ $result = array('remote' => $history, 'local' => $local[$version]);
+ break;
+ }
+ }
+
+ return $result;
+ }
+
+}
--- /dev/null
+<?php
+
+require_once WICKED_BASE . '/lib/Page/StandardPage.php';
+require_once WICKED_BASE . '/lib/Sync.php';
+
+/**
+ * Wicked SyncPages class.
+ *
+ * $Horde: wicked/lib/Page/SyncPages.php,v 1.6 2009/06/10 17:33:48 slusarz Exp $
+ *
+ * Copyright 2008-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Duck <duck@obala.net>
+ * @package Wicked
+ */
+class SyncPages extends Page {
+
+ /**
+ * Display modes supported by this page.
+ */
+ var $supportedModes = array(
+ WICKED_MODE_CONTENT => true);
+
+ /**
+ * Sync driver
+ */
+ var $_sync;
+
+ /**
+ * Constructor
+ */
+ function SyncPages()
+ {
+ $this->_loadSyncDriver();
+ if (is_a($this->_sync, 'PEAR_Error')) {
+ return $this->_sync;
+ }
+
+ // Do we need to perform any action?
+ switch (Horde_Util::getGet('actionID')) {
+ case 'sync_download':
+ $page = Horde_Util::getGet('sync_page');
+ return $this->download($page);
+
+ case 'sync_upload':
+ $page = Horde_Util::getGet('sync_page');
+ return $this->upload($page);
+ }
+ }
+
+ /**
+ * Render this page in Content mode.
+ *
+ * @return string The page content, or PEAR_Error.
+ */
+ function content()
+ {
+ global $wicked;
+
+ // Used in all cases.
+ $form = $this->_syncForm();
+
+ // We have no data to check
+ if (empty($_SESSION['wicked']['sync'])) {
+ ob_start();
+ require WICKED_TEMPLATES . '/sync/header.inc';
+ require WICKED_TEMPLATES . '/sync/footer.inc';
+ return ob_get_clean();
+ }
+
+ // New pages on remote server
+ $new_remote = array();
+ foreach ($_SESSION['wicked']['sync']['pages'] as $pageName => $info) {
+ if (!$wicked->pageExists($pageName)) {
+ $new_remote[$pageName] = array(
+ 'page_majorversion' => $info['page_majorversion'],
+ 'page_minorversion' => $info['page_minorversion'],
+ 'page_checksum' => $info['page_checksum'],
+ 'version_created' => $info['version_created'],
+ 'change_author' => $info['change_author'],
+ 'change_log' => $info['change_log']
+ );
+ }
+ }
+
+ // New pages on local server
+ $new_local = array();
+ $local_pages = $wicked->getPages(false);
+ foreach ($local_pages as $pageName) {
+ if (isset($_SESSION['wicked']['sync']['pages'][$pageName])) {
+ continue;
+ }
+ $page = Page::getPage($pageName);
+ if (is_a($page, 'PEAR_Error')) {
+ return $page;
+ }
+ $new_local[$pageName] = array(
+ 'page_majorversion' => $page->_page['page_majorversion'],
+ 'page_minorversion' => $page->_page['page_minorversion'],
+ 'page_checksum' => md5($page->getText()),
+ 'version_created' => $page->_page['version_created'],
+ 'change_author' => $page->_page['change_author'],
+ 'change_log' => $page->_page['change_log']
+ );
+ }
+
+ // Pages with differences
+ $sync_pages = array();
+ foreach ($local_pages as $pageName) {
+ // Is a new page
+ if (isset($new_local[$pageName]) ||
+ isset($new_remote[$pageName])) {
+ continue;
+ }
+
+ // Compare checksum
+ $page = Page::getPage($pageName);
+ if (is_a($page, 'PEAR_Error')) {
+ return $page;
+ } elseif (md5($page->getText()) == $_SESSION['wicked']['sync']['pages'][$pageName]['page_checksum']) {
+ continue;
+ }
+
+ $sync_pages[] = $pageName;
+ }
+
+ // Output
+ Horde::addScriptFile('tables.js', 'horde', true);
+ ob_start();
+ require WICKED_TEMPLATES . '/sync/header.inc';
+ require WICKED_TEMPLATES . '/sync/list.inc';
+ require WICKED_TEMPLATES . '/sync/footer.inc';
+ return ob_get_clean();
+ }
+
+ /**
+ * Render this page in display or block mode.
+ *
+ * @return mixed Returns page contents or PEAR_Error
+ */
+ function displayContents($isBlock)
+ {
+ global $notification;
+
+ $content = $this->content();
+ if (is_a($content, 'PEAR_Error')) {
+ $notification->push($content);
+ }
+
+ return $content;
+ }
+
+ /**
+ * Page name
+ */
+ function pageName()
+ {
+ return 'SyncPages';
+ }
+
+ /**
+ * Page title
+ */
+ function pageTitle()
+ {
+ return _("SyncPages");
+ }
+
+ /**
+ * Prepare page link
+ */
+ function _viewLink($pageName, $local = true)
+ {
+ if ($local) {
+ return '<a href="' . Wicked::url($pageName) . '" target="_blank">' . _("View local") . '</a>';
+ } else {
+ return '<a href="' . $_SESSION['wicked']['sync']['display'] . $pageName . '" target="_blank">' . _("View remote") . '</a>';
+ }
+ }
+
+ /**
+ * Get and process sync info form
+ */
+ function _syncForm()
+ {
+ require_once 'Horde/Form.php';
+
+ $vars = Horde_Variables::getDefaultVariables();
+ $form = new Horde_Form($vars, _("Sync data"), 'syncdata');
+ $form->setButtons(array(_("Fetch page list"), _("Save login info"), _("Remove login info")), _("Reset"));
+ $form->addHidden('', 'page', 'text', true);
+
+ $defaults = array(
+ 'driver' => 'wicked',
+ 'prefix' => 'wiki',
+ 'url' => 'http://wiki.example.org/rpc.php',
+ 'display' => 'http://wiki.example.org/display.php?page=',
+ 'edit' => 'http://wiki.example.org/display.php?page=EditPage&referrer=',
+ 'user' => '',
+ 'password' => '',
+ );
+
+ // Prepare default values
+ $stored = @unserialize($GLOBALS['prefs']->getValue('sync_data'));
+ if (isset($_GET['__old_sync_select'])) {
+ unset($_SESSION['wicked']['sync']);
+ }
+ if ($vars->get('sync_select') && isset($stored[$vars->get('sync_select')])) {
+ $defaults = $stored[$vars->get('sync_select')];
+ foreach ($defaults as $k => $v) {
+ if ($vars->exists('sync_' . $k)) {
+ $vars->set('sync_' . $k, $v);
+ }
+ }
+ }
+ if (!empty($_SESSION['wicked']['sync'])) {
+ $defaults = $_SESSION['wicked']['sync'];
+ }
+
+ // Add stored info selection
+ $enum = array();
+ foreach ($stored as $k => $v) {
+ $enum[$k] = $v['url'] . ' (' . $v['user'] . ')';
+ }
+ if (!empty($enum)) {
+ require_once 'Horde/Form/Action.php';
+ $v = &$form->addVariable(_("Stored"), 'sync_select', 'enum', false, null, false, array($enum, _("Custom")));
+ $v->setAction(Horde_Form_Action::factory('submit'));
+ $v->setOption('trackchange', true);
+ }
+
+ // Add standard form info
+ $v = &$form->addVariable(_("Driver"), 'sync_driver', 'enum', true, null, false, array(array('wicked' => 'Wicked'), false));
+ $v->setDefault($defaults['driver']);
+
+ $v = &$form->addVariable(_("Prefix"), 'sync_prefix', 'text', true);
+ $v->setDefault($defaults['prefix']);
+
+ $v = &$form->addVariable(_("Url"), 'sync_url', 'text', true);
+ $v->setDefault($defaults['url']);
+
+ $v = &$form->addVariable(_("User"), 'sync_user', 'text', false, false, _("By default, your login data will be used"));
+ $v->setDefault($defaults['user']);
+
+ $form->addVariable(_("Password"), 'sync_password', 'password', false, false, _("By default, your login data will be used"));
+
+ $v = &$form->addVariable(_("Display"), 'sync_display', 'text', false);
+ $v->setDefault($defaults['display']);
+
+ $v = &$form->addVariable(_("Edit"), 'sync_edit', 'text', false);
+ $v->setDefault($defaults['edit']);
+
+ // Process
+ if ($form->validate()) {
+ $info = array(
+ 'driver' => $vars->get('sync_driver'),
+ 'prefix' => $vars->get('sync_prefix'),
+ 'url' => $vars->get('sync_url'),
+ 'display' => $vars->get('sync_display'),
+ 'edit' => $vars->get('sync_edit'),
+ 'user' => $vars->get('sync_user'),
+ 'password' => $vars->get('sync_password'),
+ 'pages' => array(),
+ );
+
+ switch (Horde_Util::getFormData('submitbutton')) {
+ case _("Fetch page list"):
+ // Load driver
+ $_SESSION['wicked']['sync'] = $info;
+ $this->_loadSyncDriver();
+ if (is_a($this->_sync, 'PEAR_Error')) {
+ return $this->_sync;
+ }
+
+ // We submitted the form so we should fetch pages
+ $pages = $this->_sync->getMultiplePageInfo();
+ if (is_a($pages, 'PEAR_Error')) {
+ $GLOBALS['notification']->push($pages);
+ } elseif (!empty($pages)) {
+ $_SESSION['wicked']['sync']['pages'] = $pages;
+ }
+ break;
+
+ case _("Save login info"):
+ $data = unserialize($GLOBALS['prefs']->getValue('sync_data'));
+ $key = md5($info['url'] . $info['user']);
+ $data[$key] = $info;
+ unset($data[$key]['password'],
+ $data[$key]['pages']);
+ $GLOBALS['prefs']->setValue('sync_data', serialize($data));
+ $GLOBALS['notification']->push(_("Sync login info was stored"), 'horde.success');
+
+ header('Location: ' . Wicked::url('SyncPages', true));
+ exit;
+
+ case _("Remove login info"):
+ $data = unserialize($GLOBALS['prefs']->getValue('sync_data'));
+ $key = md5($info['url'] . $info['user']);
+ unset($data[$key]);
+ $GLOBALS['prefs']->setValue('sync_data', serialize($data));
+ $GLOBALS['notification']->push(_("Sync login info was removed."), 'horde.success');
+
+ header('Location: ' . Wicked::url('SyncPages', true));
+ exit;
+ }
+ }
+
+ return Horde_Util::bufferOutput(array($form, 'renderActive'), null, null, null, 'get');
+ }
+
+ /**
+ * Get page info
+ *
+ * @param boolean $local Get local or remote info
+ */
+ function getLocalPageInfo($pageName)
+ {
+ $page = Page::getPage($pageName);
+ if (is_a($page, 'PEAR_Error')) {
+ return $page;
+ }
+
+ return array(
+ 'page_majorversion' => $page->_page['page_majorversion'],
+ 'page_minorversion' => $page->_page['page_minorversion'],
+ 'page_checksum' => md5($page->getText()),
+ 'version_created' => $page->_page['version_created'],
+ 'change_author' => $page->_page['change_author'],
+ 'change_log' => $page->_page['change_log'],
+ );
+ }
+
+ /**
+ * Get page info
+ *
+ * @param boolean $local Get local or remote info
+ */
+ function getRemotePageInfo($pageName)
+ {
+ if (isset($_SESSION['wicked']['sync']['pages'][$pageName])) {
+ return $_SESSION['wicked']['sync']['pages'][$pageName];
+ } else {
+ $info = $this->_sync->getPageInfo($pageName);
+ if (!is_a($info, 'PEAR_Error')) {
+ $_SESSION['wicked']['sync']['pages'][$pageName] = $info;
+ }
+ return $info;
+ }
+ }
+
+ /**
+ * Download remote page to local server
+ */
+ function download($pageName)
+ {
+ $text = $this->_sync->getPageSource($pageName);
+ if (is_a($text, 'PEAR_Error')) {
+ return $text;
+ }
+
+ $page = Page::getPage($pageName);
+ if (is_a($page, 'PEAR_Error')) {
+ return $page;
+ }
+
+ if (!$page->allows(WICKED_MODE_EDIT)) {
+ return PEAR::RaiseError(sprintf(_("You don't have permission to edit \"%s\"."), $pageName));
+ }
+
+ $content = $page->getText();
+ if (is_a($content, 'PEAR_Error')) {
+ // Maybe the page does not exists, if not create it
+ if ($GLOBALS['wicked']->pageExists($pageName)) {
+ return $content;
+ } else {
+ $result = $GLOBALS['wicked']->newPage($pageName, $text);
+ if (is_a($result, 'PEAR_Error')) {
+ return $result;
+ }
+ }
+ } else {
+ if (trim($text) == trim($content)) {
+ return PEAR::raiseError(_("No changes made"));
+ }
+ $result = $page->updateText($text, _("Downloded from remote server"), true);
+ if (is_a($result, 'PEAR_Error')) {
+ return $result;
+ }
+ }
+
+ $GLOBALS['notification']->push(sprintf(_("Page \"%s\" was sucessfuly downloaded from remote to local wiki."), $pageName), 'horde.success');
+
+ // Show the newly saved page.
+ header('Location: ' . Wicked::url($pageName, true));
+ exit;
+ }
+
+ /**
+ * Upload local page to remote server
+ */
+ function upload($pageName)
+ {
+ $page = Page::getPage($pageName);
+ if (is_a($page, 'PEAR_Error')) {
+ $GLOBALS['notification']->push($page);
+ return $page;
+ }
+
+ $content = $page->getText();
+ if (is_a($content, 'PEAR_Error')) {
+ $GLOBALS['notification']->push($content);
+ return $content;
+ }
+
+ $result = $this->_sync->editPage($pageName, $content, _("Uploaded from remote server"), true);
+ if (is_a($result, 'PEAR_Error')) {
+ $GLOBALS['notification']->push($result);
+ return $content;
+ }
+
+ $GLOBALS['notification']->push(sprintf(_("Page \"%s\" was sucessfully uploaded from local to remote wiki."), $pageName), 'horde.success');
+
+ // Show the newly updated page.
+ header('Location: ' . Wicked::url($pageName, true));
+ exit;
+ }
+
+ /**
+ * Load sync driver
+ */
+ function _loadSyncDriver()
+ {
+ if ($this->_sync) {
+ return true;
+ } elseif (empty($_SESSION['wicked']['sync']['driver'])) {
+ return false;
+ }
+
+ $this->_sync = Wicked_Sync::factory($_SESSION['wicked']['sync']['driver'],
+ $_SESSION['wicked']['sync']);
+ }
+
+}
--- /dev/null
+<?php
+/**
+ * Wicked_Sync:: defines an API for implementing synchronization backends for
+ * Wicked.
+ *
+ * $Horde: wicked/lib/Sync.php,v 1.3 2009/07/08 18:30:08 slusarz Exp $
+ *
+ * Copyright 2008-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Duck <duck@obala.net>
+ * @package Wicked
+ */
+class Wicked_Sync {
+
+ /**
+ * Hash containing connection parameters.
+ *
+ * @var array
+ */
+ var $_params = array();
+
+ /**
+ * Attempts to return a concrete Wicked_Sync instance based on $driver.
+ *
+ * @param string $driver The type of the concrete Wicked_Sync subclass
+ * to return. The class name is based on the
+ * sync driver ($driver). The code is
+ * dynamically included.
+ *
+ * @param array $params A hash containing any additional configuration
+ * or connection parameters a subclass might need.
+ *
+ * @return Wicked_Sync The newly created concrete Wicked_Sync
+ * instance, or false on an error.
+ */
+ function factory($driver = 'wicked', $params = array())
+ {
+ $class = 'Wicked_Sync_' . $driver;
+ if (!class_exists($class)) {
+ include dirname(__FILE__) . '/Sync/' . $driver . '.php';
+ }
+
+ if (empty($params['user'])) {
+ $params['user'] = Horde_Auth::getAuth();
+ }
+
+ if (empty($params['password'])) {
+ $params['password'] = Horde_Auth::getCredential('password');
+ }
+
+ if (class_exists($class)) {
+ return new $class($params);
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Constructs a new Wicked driver object.
+ *
+ * @param array $params A hash containing connection parameters.
+ */
+ function Wicked_Sync($params = array())
+ {
+ $this->_params = $params;
+ }
+
+ /**
+ * Returns a list of available pages.
+ *
+ * @return array An array of all available pages.
+ */
+ function listPages()
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ /**
+ * Get the wiki source of a page specified by its name.
+ *
+ * @param string $name The name of the page to fetch
+ *
+ * @return mixed Array of page data on success; PEAR_Error on failure
+ */
+ function getPageSource($pageName)
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ /**
+ * Return basic page information.
+ *
+ * @param string $pageName Page name
+ *
+ * @return mixed Array of page data on success; PEAR_Error on failure
+ */
+ function getPageInfo($pageName)
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ /**
+ * Return basic information of .multiple pages
+ *
+ * @param array $pages Page names to get info for
+ *
+ * @return mixed Array of pages data on success; PEAR_Error on failure
+ */
+ function getMultiplePageInfo($pages = array())
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ /**
+ * Return page history.
+ *
+ * @param string $pagename Page name
+ *
+ * @return array An array of page parameters.
+ */
+ function getPageHistory($pagename)
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+ /**
+ * Updates content of a wiki page. If the page does not exist it is
+ * created.
+ *
+ * @param string $pagename Page to edit
+ * @param string $text Page content
+ * @param string $changelog Description of the change
+ * @param boolean $minorchange True if this is a minor change
+ *
+ * @return boolean | PEAR_Error True on success, PEAR_Error on failure.
+ */
+ function editPage($pagename, $text, $changelog = '', $minorchange = false)
+ {
+ return PEAR::raiseError(_("Unsupported"));
+ }
+
+}
--- /dev/null
+<?php
+/**
+ * Copyright 2008-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @package Wicked
+ *
+ * $Horde: wicked/lib/Sync/wicked.php,v 1.2 2009/01/06 18:02:40 jan Exp $
+ */
+
+/** Horde_RPC */
+require_once 'Horde/RPC.php';
+
+/**
+ * Wicked_Driver:: defines an API for implementing storage backends for
+ * Wicked.
+ *
+ * @author Duck <duck@obala.net>
+ * @package Wicked
+ */
+class Wicked_Sync_wicked extends Wicked_Sync {
+
+ /**
+ * Returns a list of available pages.
+ *
+ * @return array An array of all available pages.
+ */
+ var $_client;
+
+ /**
+ * Returns a list of available pages.
+ *
+ * @return array An array of all available pages.
+ */
+ function listPages()
+ {
+ return $this->_getData('list');
+ }
+
+ /**
+ * Get the wiki source of a page specified by its name.
+ *
+ * @param string $name The name of the page to fetch
+ *
+ * @return mixed String of page data on success; PEAR_Error on fail
+ */
+ function getPageSource($pageName)
+ {
+ return $this->_getData('getPageSource', array($pageName));
+ }
+
+ /**
+ * Return basic page information.
+ *
+ * @param string $pageName Page name
+ *
+ * @return mixed Array of page data on success; PEAR_Error on failure
+ */
+ function getPageInfo($pageName)
+ {
+ return $this->_getData('getPageInfo', array($pageName));
+ }
+
+ /**
+ * Return basic pages information.
+ *
+ * @param array $pages Page names to get info for
+ *
+ * @return mixed Array of pages data on success; PEAR_Error on failure
+ */
+ function getMultiplePageInfo($pages = array())
+ {
+ return $this->_getData('getMultiplePageInfo', array($pages));
+ }
+
+ /**
+ * Return page history.
+ *
+ * @param string $pagename Page name
+ *
+ * @return array An array of page parameters.
+ */
+ function getPageHistory($pagename)
+ {
+ return $this->_getData('getPageHistory', array($pagename));
+ }
+
+ /**
+ * Updates content of a wiki page. If the page does not exist it is
+ * created.
+ *
+ * @param string $pagename Page to edit
+ * @param string $text Page content
+ * @param string $changelog Description of the change
+ * @param boolean $minorchange True if this is a minor change
+ *
+ * @return boolean | PEAR_Error True on success, PEAR_Error on failure.
+ */
+ function editPage($pagename, $text, $changelog = '', $minorchange = false)
+ {
+ return $this->_getData('edit', array($pagename, $text, $changelog, $minorchange));
+ }
+
+ /**
+ * Process remote call
+ *
+ * @param string $method Method name to call
+ * @param array $params Array of parameters
+ *
+ * @return mixed Array of pages data on success; PEAR_Error on failure
+ */
+ function _getData($method, $params = array())
+ {
+ return Horde_RPC::request(
+ 'xmlrpc',
+ $this->_params['url'],
+ $this->_params['prefix'] . '.' . $method,
+ $params,
+ array('user' => $this->_params['user'],
+ 'pass' => $this->_params['password']));
+ }
+
+}
--- /dev/null
+<?php
+
+require_once 'Text/Wiki/Parse/BBCode/Image.php';
+
+/**
+ * $Horde: wicked/lib/Text_Wiki/Parse/BBCode/Image2.php,v 1.1 2007/06/01 01:34:47 ben Exp $
+ *
+ * Placeholder class as a complement to the Image2 renderer.
+ *
+ * @package Wicked
+ */
+class Text_Wiki_Parse_Image2 extends Text_Wiki_Parse_Image { }
--- /dev/null
+<?php
+
+require_once 'Text/Wiki/Parse/Cowiki/Image.php';
+
+/**
+ * $Horde: wicked/lib/Text_Wiki/Parse/Cowiki/Image2.php,v 1.1 2007/06/01 01:34:48 ben Exp $
+ *
+ * Placeholder class as a complement to the Image2 renderer.
+ *
+ * @package Wicked
+ */
+class Text_Wiki_Parse_Image2 extends Text_Wiki_Parse_Image { }
--- /dev/null
+<?php
+
+require_once 'Text/Wiki/Parse/Creole/Image.php';
+
+/**
+ * $Horde: wicked/lib/Text_Wiki/Parse/Creole/Image2.php,v 1.1 2007/05/23 21:43:30 ben Exp $
+ *
+ * Placeholder class as a complement to the Image2 renderer.
+ *
+ * @package Wicked
+ */
+class Text_Wiki_Parse_Image2 extends Text_Wiki_Parse_Image { }
--- /dev/null
+<?php
+/**
+ * $Horde: wicked/lib/Text_Wiki/Parse/Default/Attribute.php,v 1.1 2007/05/23 21:43:30 ben Exp $
+ *
+ * This parser parses "attributes," which carry meta-information about the
+ * page. These attributes are in the form [[WikiWord: value]].
+ *
+ * @package Wicked
+ */
+class Text_Wiki_Parse_Attribute extends Text_Wiki_Parse {
+
+ /**
+ * The regular expression used to find source text matching this rule (this
+ * is set in the constructor).
+ *
+ * @var string
+ */
+ var $regex;
+
+ function Text_Wiki_Parse_Attribute(&$obj)
+ {
+ parent::Text_Wiki_Parse($obj);
+
+ $this->regex = '/((?:\[\[' . WICKED_REGEXP_WIKIWORD .
+ ':\s+.*?\]\]\s*)+)/';
+ }
+
+ /**
+ * Generates a token entry for the matched text. Token options are:
+ *
+ * 'src' => The image source, typically a relative path name.
+ * 'opts' => Any macro options following the source.
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return A delimited token number to be used as a placeholder in
+ * the source text.
+ */
+ function process(&$matches)
+ {
+ $options = array('attributes' => array());
+
+ $text = $matches[1];
+ while (preg_match('/^\[\[([A-Za-z0-9]+):\s+(.*?)\]\]\s*(.*)$/s',
+ $text, $sub)) {
+
+ $options['attributes'][] = array('name' => $sub[1],
+ 'value' => $sub[2]);
+ $text = $sub[3];
+ }
+
+ return $this->wiki->addToken($this->rule, $options);
+ }
+
+}
--- /dev/null
+<?php
+
+require_once 'Text/Wiki/Parse/Default/Code.php';
+
+/**
+ * $Horde: wicked/lib/Text_Wiki/Parse/Default/Code2.php,v 1.1 2007/05/23 21:43:30 ben Exp $
+ *
+ * Placeholder class as a complement to the Code2 renderer.
+ *
+ * @package Wicked
+ */
+class Text_Wiki_Parse_Code2 extends Text_Wiki_Parse_Code { }
--- /dev/null
+<?php
+
+require_once 'Text/Wiki/Parse/Default/Freelink.php';
+
+/**
+ * $Horde: wicked/lib/Text_Wiki/Parse/Default/Freelink2.php,v 1.1 2007/06/22 04:40:19 chuck Exp $
+ *
+ * Placeholder class as a complement to the Freelink2 renderer.
+ *
+ * @package Wicked
+ */
+class Text_Wiki_Parse_Freelink2 extends Text_Wiki_Parse_Freelink { }
--- /dev/null
+<?php
+
+require_once 'Text/Wiki/Parse/Default/Image.php';
+
+/**
+ * $Horde: wicked/lib/Text_Wiki/Parse/Default/Image2.php,v 1.1 2007/05/23 21:43:30 ben Exp $
+ *
+ * Placeholder class as a complement to the Image2 renderer.
+ *
+ * @package Wicked
+ */
+class Text_Wiki_Parse_Image2 extends Text_Wiki_Parse_Image { }
--- /dev/null
+<?php
+/**
+ * $Horde: wicked/lib/Text_Wiki/Parse/Default/Registrylink.php,v 1.1 2007/05/23 21:43:30 ben Exp $
+ *
+ * This parser parses Horde Registry links, which allow calling Horde
+ * API "*"/show methods from within the page. Basic syntax is
+ * [[link link title | link-app/link-method argname1=value1 argname2=value2 ...]].
+ *
+ * @package Wicked
+ */
+class Text_Wiki_Parse_Registrylink extends Text_Wiki_Parse {
+
+ /**
+ * The regular expression used to find registry links.
+ *
+ * @access public
+ *
+ * @var string
+ */
+ var $regex = "/\[\[link (.*)\]\]/sU";
+
+ /**
+ * Generates a token entry for the matched text. Token options are:
+ *
+ * 'app' => The application to link to.
+ * 'args' => The parameters passed to the app/show method.
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return A delimited token number to be used as a placeholder in
+ * the source text.
+ */
+ function process(&$matches)
+ {
+ @list($title, $call) = explode('|', $matches[1], 2);
+ $opts = explode(' ', trim($call));
+ $method = trim(array_shift($opts));
+ parse_str(implode('&', $opts), $args);
+
+ return $this->wiki->addToken($this->rule, array('title' => trim($title),
+ 'method' => $method,
+ 'args' => $args));
+ }
+
+}
--- /dev/null
+<?php
+/**
+ * $Horde: wicked/lib/Text_Wiki/Parse/Default/Wickedblock.php,v 1.1 2007/05/23 21:43:30 ben Exp $
+ *
+ * This parser parses Wicked blocks, which add Horde_Blocks to the
+ * page. Basic syntax is [[block block-app/block-name block-args]].
+ *
+ * @package Wicked
+ */
+class Text_Wiki_Parse_Wickedblock extends Text_Wiki_Parse {
+
+ /**
+ * The regular expression used to find blocks.
+ *
+ * @access public
+ *
+ * @var string
+ */
+ var $regex = "/\[\[block (.*)?\]\]/sU";
+
+ /**
+ * Generates a token entry for the matched text. Token options are:
+ *
+ * 'src' => The image source, typically a relative path name.
+ * 'opts' => Any macro options following the source.
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return A delimited token number to be used as a placeholder in
+ * the source text.
+ */
+ function process(&$matches)
+ {
+ }
+
+}
--- /dev/null
+<?php
+
+require_once 'Text/Wiki/Parse/Default/Wikilink.php';
+
+/**
+ * $Horde: wicked/lib/Text_Wiki/Parse/Default/Wikilink2.php,v 1.1 2007/06/22 04:40:19 chuck Exp $
+ *
+ * Placeholder class as a complement to the Wikilink2 renderer.
+ *
+ * @package Wicked
+ */
+class Text_Wiki_Parse_Wikilink2 extends Text_Wiki_Parse_Wikilink { }
--- /dev/null
+<?php
+
+require_once 'Text/Wiki/Parse/Creole/Image.php';
+
+/**
+ * $Horde: wicked/lib/Text_Wiki/Parse/Mediawiki/Image2.php,v 1.1 2007/06/01 01:34:48 ben Exp $
+ *
+ * Placeholder class as a complement to the Image2 renderer.
+ *
+ * @package Wicked
+ */
+class Text_Wiki_Parse_Image2 extends Text_Wiki_Parse_Image { }
--- /dev/null
+<?php
+
+require_once 'Text/Wiki/Parse/Tiki/Image.php';
+
+/**
+ * $Horde: wicked/lib/Text_Wiki/Parse/Tiki/Image2.php,v 1.1 2007/06/01 01:34:48 ben Exp $
+ *
+ * Placeholder class as a complement to the Image2 renderer.
+ *
+ * @package Wicked
+ */
+class Text_Wiki_Parse_Image2 extends Text_Wiki_Parse_Image { }
--- /dev/null
+<?php
+/**
+ * $Horde: wicked/lib/Text_Wiki/Render/Xhtml/Attribute.php,v 1.5 2005/07/03 01:59:04 selsky Exp $
+ *
+ * @package Wicked
+ */
+class Text_Wiki_Render_Xhtml_Attribute extends Text_Wiki_Render {
+
+ /**
+ * Renders a token into text matching the requested format.
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ */
+ function token($options)
+ {
+ $output = '<table width="100%" class="attributes"><tbody>';
+
+ foreach ($options['attributes'] as $attribute) {
+
+ $link = array('page' => $attribute['name'],
+ 'anchor' => '',
+ 'text' => $attribute['name']);
+
+ // We should do full wiki formatting, I guess, but there isn't
+ // a convenient way to do it.
+ if (preg_match('/^(' . WICKED_REGEXP_WIKIWORD . ')$/',
+ $attribute['value'], $matches)) {
+ $vlink = array('page' => $matches[1],
+ 'anchor' => '',
+ 'text' => $matches[1]);
+ $value = $this->wiki->renderObj['Wikilink']->token($vlink);
+ } elseif (preg_match('/^\(\((.*)\)\)$/', $attribute['value'],
+ $matches)) {
+ $vlink = array('page' => $matches[1],
+ 'anchor' => '',
+ 'text' => $matches[1]);
+ $value = $this->wiki->renderObj['Wikilink']->token($vlink);
+ } else {
+ $value = htmlspecialchars($attribute['value']);
+ }
+
+ $output .= '<tr><td width="1%" nowrap="nowrap"><strong><em>' .
+ $this->wiki->renderObj['Wikilink']->token($link) .
+ ' :</em></strong></td><td>' . $value .
+ '</td></tr>';
+ }
+
+ $output .= '</tbody></table>';
+
+ return $output;
+ }
+
+}
--- /dev/null
+<?php
+
+require_once 'Text/Wiki/Render/Xhtml/Code.php';
+
+/**
+ * $Horde: wicked/lib/Text_Wiki/Render/Xhtml/Code2.php,v 1.7 2007/09/17 17:31:03 jan Exp $
+ *
+ * @package Wicked
+ */
+class Text_Wiki_Render_Xhtml_Code2 extends Text_Wiki_Render_Xhtml_Code {
+
+ /**
+ * Renders a token into text matching the requested format.
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ */
+ function token($options)
+ {
+ $type = $options['attr']['type'];
+
+ if ($type == 'php' || $type == 'htmlphp') {
+ $search1 = '|<pre><code><span style="color: ?#000000">\n<span style="color: ?#0000BB"><\?php\n\n?|';
+ $replace1 = '<pre><code><span style="color:#0000BB">';
+ $search2 = '|<span style="color: ?#0000BB">\?></span>\n</span></code></pre>|';
+
+ if ($type == 'htmlphp') {
+ $options['attr']['type'] = 'php';
+ $options['text'] = "\n?>" . $options['text'] . "<?php\n";
+ $search1 = substr($search1, 0, -1) . '\?>\n?</span>|';
+ $replace1 = '<pre><code>';
+ $search2 = '|<span style="color: ?#0000BB"><\?php\n\n\?></span>\n</span></code></pre>|';
+ }
+ } else {
+ $search1 = '|<pre><code>\n|';
+ $replace1 = "<pre><code>";
+ $search2 = '|</code></pre>|';
+ }
+
+ $text = parent::token($options);
+
+ $text = preg_replace(array($search1, $search2),
+ array($replace1, '</span></code></pre>'),
+ $text);
+
+ return $text;
+ }
+
+}
--- /dev/null
+<?php
+
+require_once dirname(__FILE__) . '/Wikilink2.php';
+
+class Text_Wiki_Render_Xhtml_Freelink2 extends Text_Wiki_Render_Xhtml_Wikilink2 {}
--- /dev/null
+<?php
+/**
+ * This class renders an inline image.
+ *
+ * $Horde: wicked/lib/Text_Wiki/Render/Xhtml/Image2.php,v 1.12 2009/06/10 05:25:33 slusarz Exp $
+ *
+ * @package Wicked
+ */
+class Text_Wiki_Render_Xhtml_Image2 extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'base' => '',
+ 'url_base' => null,
+ 'css' => null,
+ 'css_link' => null
+ );
+
+ /**
+ * Renders a token into text matching the requested format.
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ */
+ function token($options)
+ {
+ if (!isset($options['attr']['alt'])) {
+ $options['attr']['alt'] = $options['src'];
+ }
+
+ if (strpos($options['src'], '://') === false) {
+ if ($options['src'][0] != '/') {
+ if (strpos($options['src'], ':')) {
+ list($page, $options['src']) = explode(':', $options['src'], 2);
+ } else {
+ $page = Horde_Util::getFormData('page');
+ if ($page == 'EditPage') {
+ $page = Horde_Util::getFormData('referrer');
+ }
+ if (empty($page)) {
+ $page = 'WikiHome';
+ }
+ }
+ $params = array('page' => $page,
+ 'mime' => '1',
+ 'file' => $options['src']);
+ $options['src'] = Horde_Util::addParameter(Horde::applicationUrl('view.php', true),
+ $params, null, false);
+ }
+ } else {
+ $options['src'] = Horde_Util::addParameter(Horde::externalUrl($options['src']), 'untrusted', 1, false);
+ }
+
+ // Send external links through Horde::externalUrl().
+ if (isset($options['attr']['link']) && strpos($options['attr']['link'], '://')) {
+ $href = htmlspecialchars($options['attr']['link']);
+ unset($options['attr']['link']);
+ return Horde::link(Horde::externalUrl($href), $href) . $this->_token($options) . '</a>';
+ } else {
+ return $this->_token($options);
+ }
+ }
+
+ /**
+ * Render code from Text_Wiki's Image with Horde tweaks (remove
+ * getimagesize call, etc).
+ *
+ * @access private
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ */
+ function _token($options)
+ {
+ // note the image source
+ $src = $options['src'];
+
+ // is the source a local file or URL?
+ if (strpos($src, '://') === false) {
+ // the source refers to a local file.
+ // add the URL base to it.
+ $src = $this->getConf('base', '/') . $src;
+ }
+
+ // stephane@metacites.net
+ // is the image clickable?
+ if (isset($options['attr']['link'])) {
+ // yes, the image is clickable.
+ // are we linked to a URL or a wiki page?
+ if (strpos($options['attr']['link'], '://')) {
+ // it's a URL, prefix the URL base
+ $href = $this->getConf('url_base') . $options['attr']['link'];
+ } else {
+ // it's a WikiPage; assume it exists.
+ /** @todo This needs to honor sprintf wikilinks (pmjones) */
+ /** @todo This needs to honor interwiki (pmjones) */
+ /** @todo This needs to honor freelinks (pmjones) */
+ $href = $this->wiki->getRenderConf('xhtml', 'wikilink', 'view_url') .
+ $options['attr']['link'];
+ }
+ } else {
+ // image is not clickable.
+ $href = null;
+ }
+ // unset so it won't show up as an attribute
+ unset($options['attr']['link']);
+
+ // start the HTML output
+ $output = '<img src="' . htmlspecialchars($src) . '"';
+
+ // get the CSS class but don't add it yet
+ $css = $this->formatConf(' class="%s"', 'css');
+
+ // add the attributes to the output, and be sure to
+ // track whether or not we find an "alt" attribute
+ $alt = false;
+ foreach ($options['attr'] as $key => $val) {
+
+ // track the 'alt' attribute
+ if (strtolower($key) == 'alt') {
+ $alt = true;
+ }
+
+ // the 'class' attribute overrides the CSS class conf
+ if (strtolower($key) == 'class') {
+ $css = null;
+ }
+
+ $key = htmlspecialchars($key);
+ $val = htmlspecialchars($val);
+ $output .= " $key=\"$val\"";
+ }
+
+ // always add an "alt" attribute per Stephane Solliec
+ if (!$alt) {
+ $alt = htmlspecialchars(basename($options['src']));
+ $output .= " alt=\"$alt\"";
+ }
+
+ // end the image tag with the automatic CSS class (if any)
+ $output .= "$css />";
+
+ // was the image clickable?
+ if ($href) {
+ // yes, add the href and return
+ $href = htmlspecialchars($href);
+ $css = $this->formatConf(' class="%s"', 'css_link');
+ $output = "<a$css href=\"$href\">$output</a>";
+ }
+
+ return $output;
+ }
+
+}
--- /dev/null
+<?php
+/**
+ * $Horde: wicked/lib/Text_Wiki/Render/Xhtml/Interwiki.php,v 1.4 2005/07/03 01:59:04 selsky Exp $
+ *
+ * @package Wicked
+ */
+class Text_Wiki_Render_Xhtml_Interwiki extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'sites' => array(
+ 'MeatBall' => 'http://www.usemod.com/cgi-bin/mb.pl?%s',
+ 'Advogato' => 'http://advogato.org/%s',
+ 'Wiki' => 'http://c2.com/cgi/wiki?%s',
+ 'Bookshelved' => 'http://bookshelved.org/cgi-bin/wiki.pl?%s'
+ ),
+ 'target' => '_blank'
+ );
+
+ /**
+ * Renders a token into text matching the requested format.
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ */
+ function token($options)
+ {
+ $site = $options['site'];
+ $page = $options['page'];
+ $text = $options['text'];
+
+ if (isset($this->conf['sites'][$site])) {
+ $href = $this->conf['sites'][$site];
+ } else {
+ return $text;
+ }
+
+ // old form where page is at end,
+ // or new form with %s placeholder for sprintf()?
+ if (strpos($href, '%s') === false) {
+ // use the old form
+ $href = $href . $page;
+ } else {
+ // use the new form
+ $href = sprintf($href, $page);
+ }
+
+ // allow for alternative targets
+ $target = $this->getConf('target', '');
+
+ if ($target && trim($target) != '') {
+ $target = " target=\"$target\"";
+ }
+
+ return '<a' . $target . ' href="' . Horde::externalUrl($href) . '">' . $text . '</a>';
+ }
+
+}
--- /dev/null
+<?php
+/**
+ * $Horde: wicked/lib/Text_Wiki/Render/Xhtml/Registrylink.php,v 1.1 2005/10/14 20:44:04 chuck Exp $
+ *
+ * This class renders Horde Registry links.
+ *
+ * @package Wicked
+ */
+class Text_Wiki_Render_Xhtml_Registrylink extends Text_Wiki_Render {
+
+ /**
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ */
+ function token($options)
+ {
+ $link = $GLOBALS['registry']->link($options['method'], $options['args']);
+ if (is_a($link, 'PEAR_Error')) {
+ return '';
+ }
+
+ return Horde::link($link) . $options['title'] . '</a>';
+ }
+
+}
--- /dev/null
+<?php
+/**
+ * $Horde: wicked/lib/Text_Wiki/Render/Xhtml/Toc.php,v 1.2 2006/12/18 21:47:16 chuck Exp $
+ *
+ * @package Wicked
+ */
+class Text_Wiki_Render_Xhtml_Toc extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'css_list' => null,
+ 'css_item' => null,
+ 'title' => '<strong>Table of Contents</strong>',
+ 'div_id' => 'toc',
+ );
+
+ var $_last_level = null;
+
+ /**
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ */
+ function token($options)
+ {
+ // type, id, level, count, attr.
+ extract($options);
+
+ switch ($type) {
+ case 'list_start':
+ Horde::addScriptFile('toc.js', 'wicked', true);
+
+ // Add the div, class, and id.
+ $html = '<div';
+ $css = $this->getConf('css_list');
+ if ($css) {
+ $html .= " class=\"$css\"";
+ }
+
+ $div_id = $this->getConf('div_id');
+ if ($div_id) {
+ $html .= " id=\"$div_id\"";
+ }
+
+ // Add the title, and done.
+ return $html . '>' . $this->getConf('title') . '<ol>';
+
+ case 'list_end':
+ $html = '';
+ while ($this->_last_level > 1) {
+ $html .= '</ol>';
+ --$this->_last_level;
+ }
+ return $html . "\n</li></ol></div>\n\n";
+
+ case 'item_start':
+ $html = '';
+ if ($this->_last_level !== null) {
+ if ($level > $this->_last_level) {
+ while ($level > $this->_last_level) {
+ $html .= '<ol>';
+ ++$this->_last_level;
+ }
+ $html .= '<li';
+ } elseif ($level < $this->_last_level) {
+ while ($level < $this->_last_level) {
+ $html .= '</ol>';
+ --$this->_last_level;
+ }
+ $html .= '</li><li';
+ } else {
+ $html = '</li><li';
+ }
+ } else {
+ $html = '<li';
+ }
+ $this->_last_level = $level;
+
+ $css = $this->getConf('css_item');
+ if ($css) {
+ $html .= " class=\"$css\"";
+ }
+
+ return $html . "><a href=\"#$id\">";
+
+ case 'item_end':
+ return '</a>';
+ }
+ }
+
+}
--- /dev/null
+<?php
+/**
+ * $Horde: wicked/lib/Text_Wiki/Render/Xhtml/Url.php,v 1.9 2006/03/19 02:38:28 chuck Exp $
+ *
+ * @package Wicked
+ */
+class Text_Wiki_Render_Xhtml_Url extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'target' => '_blank'
+ );
+
+ /**
+ * Renders a token into text matching the requested format.
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ */
+ function token($options)
+ {
+ // Create local variables from the options array (text, href,
+ // type).
+ extract($options);
+
+ // Find the rightmost dot and determine the filename
+ // extension.
+ $pos = strrpos($href, '.');
+ $ext = strtolower(substr($href, $pos + 1));
+ $href = htmlspecialchars($href);
+
+ // Allow for alternative targets on non-anchor HREFs.
+ if ($href[0] == '#') {
+ $target = '';
+ } else {
+ $target = $this->getConf('target', '');
+ }
+
+ $output = Horde::link(Horde::externalUrl($href), $href, 'external', htmlspecialchars($target)) . htmlspecialchars($text) . '</a>';
+
+ // Make numbered references look like footnotes.
+ if ($type == 'footnote') {
+ $output = '<sup>' . $output . '</sup>';
+ }
+
+ return $output;
+ }
+
+}
--- /dev/null
+<?php
+/**
+ * $Horde: wicked/lib/Text_Wiki/Render/Xhtml/Wickedblock.php,v 1.1 2006/03/24 19:52:09 chuck Exp $
+ *
+ * This class renders Wicked blocks.
+ *
+ * @package Wicked
+ */
+class Text_Wiki_Render_Xhtml_Wickedblock extends Text_Wiki_Render {
+
+ /**
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ */
+ function token($options)
+ {
+ }
+
+}
--- /dev/null
+<?php
+
+require_once 'Text/Wiki/Render/Xhtml/Wikilink.php';
+
+/**
+ * $Horde: wicked/lib/Text_Wiki/Render/Xhtml/Wikilink2.php,v 1.1 2007/06/22 04:40:19 chuck Exp $
+ *
+ * @package Wicked
+ */
+class Text_Wiki_Render_Xhtml_Wikilink2 extends Text_Wiki_Render_Xhtml_Wikilink {
+
+ /**
+ * Renders a token into XHTML.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ */
+ function token($options)
+ {
+ // make nice variable names (page, anchor, text)
+ extract($options);
+
+ // is there a "page existence" callback?
+ // we need to access it directly instead of through
+ // getConf() because we'll need a reference (for
+ // object instance method callbacks).
+ if (isset($this->conf['exists_callback'])) {
+ $callback =& $this->conf['exists_callback'];
+ } else {
+ $callback = false;
+ }
+
+ if ($callback) {
+ // use the callback function
+ $exists = call_user_func($callback, $page);
+ } else {
+ // no callback, go to the naive page array.
+ $list = $this->getConf('pages');
+ if (is_array($list)) {
+ // yes, check against the page list
+ $exists = in_array($page, $list);
+ } else {
+ // no, assume it exists
+ $exists = true;
+ }
+ }
+
+ $anchor = '#'.$this->urlEncode(substr($anchor, 1));
+
+ // does the page exist?
+ if ($exists) {
+
+ // PAGE EXISTS.
+
+ $href = sprintf($this->getConf('view_url'), (!empty($GLOBALS['conf']['options']['use_mod_rewrite']) ? htmlspecialchars($page) : $this->urlEncode($page))) . $anchor;
+
+ // get the CSS class and generate output
+ $css = ' class="'.$this->textEncode($this->getConf('css')).'"';
+
+ $start = '<a'.$css.' href="'.$this->textEncode($href).'">';
+ $end = '</a>';
+ } else {
+
+ // PAGE DOES NOT EXIST.
+
+ $new_url = $this->getConf('new_url');
+ if (!$new_url) {
+ return $this->textEncode($text);
+ }
+
+ $href = sprintf($new_url, (!empty($GLOBALS['conf']['options']['use_mod_rewrite']) ? htmlspecialchars($page) : $this->urlEncode($page)));
+
+ // get the appropriate CSS class and new-link text
+ $css = ' class="'.$this->textEncode($this->getConf('css_new')).'"';
+ $new = $this->getConf('new_text');
+
+ // what kind of linking are we doing?
+ $pos = $this->getConf('new_text_pos');
+ if (! $pos || ! $new) {
+ // no position (or no new_text), use css only on the page name
+
+ $start = '<a'.$css.' href="'.$this->textEncode($href).'">';
+ $end = '</a>';
+ } elseif ($pos == 'before') {
+ // use the new_text BEFORE the page name
+ $start = '<a'.$css.' href="'.$this->textEncode($href).'">'.$this->textEncode($new).'</a>';
+ $end = '';
+ } else {
+ // default, use the new_text link AFTER the page name
+ $start = '';
+ $end = '<a'.$css.' href="'.$this->textEncode($href).'">'.$this->textEncode($new).'</a>';
+ }
+ }
+ if (!strlen($text)) {
+ $start .= $this->textEncode($page);
+ }
+ if (isset($type)) {
+ switch ($type) {
+ case 'start':
+ $output = $start;
+ break;
+ case 'end':
+ $output = $end;
+ break;
+ }
+ } else {
+ $output = $start.$this->textEncode($text).$end;
+ }
+ return $output;
+ }
+
+}
--- /dev/null
+<?php
+// Modes we might be displaying a page in.
+/** Display mode. */
+define('WICKED_MODE_DISPLAY', 0);
+
+/** The edit screen. */
+define('WICKED_MODE_EDIT', 1);
+
+/** Page can be removed. */
+define('WICKED_MODE_REMOVE', 2);
+
+/** Display the page history. */
+define('WICKED_MODE_HISTORY', 3);
+
+/** Diff two versions of the page. */
+define('WICKED_MODE_DIFF', 4);
+
+/** Page can be locked. */
+define('WICKED_MODE_LOCKING', 7);
+
+/** Page can be unlocked. */
+define('WICKED_MODE_UNLOCKING', 8);
+
+/** The ability to add a page. */
+define('WICKED_MODE_CREATE', 9);
+
+/** Raw content mode. */
+define('WICKED_MODE_CONTENT', 10);
+
+/** Like display, but for a block. */
+define('WICKED_MODE_BLOCK', 11);
+
+/** Our wiki word regexp (needed many places). */
+define('WICKED_REGEXP_WIKIWORD',
+ "(!?" . // START WikiPage pattern (1)
+ "[A-Z\xc0-\xde]" . // 1 upper
+ "[A-Za-z0-9\xc0-\xfe]*" . // 0+ alpha or digit
+ "[a-z0-9\xdf-\xfe]+" . // 1+ lower or digit
+ "[A-Z\xc0-\xde]" . // 1 upper
+ "[A-Za-z0-9\xc0-\xfe]*" . // 0+ or more alpha or digit
+ ")" . // END WikiPage pattern (/1)
+ "((\#" . // START Anchor pattern (2)(3)
+ "[A-Za-z0-9\xc0-\xfe]" . // 1 alpha
+ "(" . // start sub pattern (4)
+ "[-_A-Za-z0-9\xc0-\xfe:.]*" . // 0+ dash, alpha, digit, underscore,
+ // colon, dot
+ "[-_A-Za-z0-9\xc0-\xfe]" . // 1 dash, alpha, digit, or underscore
+ ")?)?)"); // end subpatterns (/4)(/3)(/2)
+
+/** Where we store our attachments in VFS. */
+define('WICKED_VFS_ATTACH_PATH', '.horde/wicked/attachments');
+
+/**
+ * Wicked Base Class.
+ *
+ * $Horde: wicked/lib/Wicked.php,v 1.55 2009-11-27 02:59:00 mrubinsk Exp $
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Tyler Colbert <tyler@colberts.us>
+ * @package Wicked
+ */
+class Wicked {
+
+ /**
+ * Puts together the URL to a Wicked page. Uses mod_rewrite or GET
+ * style URLs depending on configuration.
+ *
+ * @param string $page The name of the page to target.
+ * @param boolean $full @see Horde::url()
+ * @param integer $append_session @see Horde::url()
+ *
+ * @return string The URL of $page.
+ */
+ function url($page, $full = false, $append_session = 0)
+ {
+ global $conf;
+
+ if (!empty($conf['options']['use_mod_rewrite'])) {
+ $script = str_replace('%2F', '/', urlencode($page));
+ } else {
+ $script = Horde_Util::addParameter('display.php', 'page', $page);
+ }
+
+ return Horde::applicationUrl($script, $full, $append_session);
+ }
+
+ /**
+ * Build Wicked's list of menu items.
+ */
+ function getMenu($returnType = 'object')
+ {
+ global $conf, $page;
+
+ $menu = new Horde_Menu(Horde_Menu::MASK_ALL);
+
+ if (@count($conf['menu']['pages'])) {
+ foreach ($conf['menu']['pages'] as $pagename) {
+ /* Remove access keys. */
+ $rawname = Horde::stripAccessKey($pagename);
+
+ /* Determine who we should say referred us. */
+ $curpage = isset($page) ? $page->pageName() : null;
+ $referrer = Horde_Util::getFormData('referrer', $curpage);
+
+ /* Determine if we should depress the button. We have to do
+ * this on our own because all the buttons go to the same .php
+ * file, just with different args. */
+ if (!strstr($_SERVER['PHP_SELF'], 'prefs.php') &&
+ $curpage === _($rawname)) {
+ $cellclass = 'current';
+ } else {
+ $cellclass = '__noselection';
+ }
+
+ $url = Horde_Util::addParameter(Wicked::url($rawname), 'referrer', $referrer);
+ $menu->add($url, _($pagename), $rawname . '.png', null, null, null, $cellclass);
+ }
+ }
+
+ if ($returnType == 'object') {
+ return $menu;
+ } else {
+ return $menu->render();
+ }
+
+ /* Placeholders to have translateable page names with access keys. */
+ array(_("_WikiHome"), _("HowTo_UseWiki"), _("_RecentChanges"), _("_AllPages"));
+ }
+
+ /**
+ * Mails a notification message after encoding the headers and adding the
+ * standard username/time line.
+ *
+ * @param string $message The message text to send out.
+ * @param array $headers Additional headers to add to the email.
+ */
+ function mail($message, $headers = array())
+ {
+ global $conf, $registry;
+
+ /* Make sure there's a place configured to send the email. */
+ if (empty($conf['wicked']['notify_address'])) {
+ return;
+ }
+
+ if (Horde_Auth::getAuth()) {
+ $prefix = Horde_Auth::getAuth();
+ } else {
+ $prefix = 'guest [' . $_SERVER['REMOTE_ADDR'] . ']';
+ }
+
+ $lc_time = setlocale(LC_TIME, 'C');
+ $message = $prefix . ' ' . date('r') . "\n\n" . $message;
+ setlocale(LC_TIME, $lc_time);
+
+ /* In case we don't get a user's email address to send the
+ * notification from, what should we fall back to for the From:
+ * header? */
+ $default_from_addr = !empty($conf['wicked']['guest_address']) ?
+ $conf['wicked']['guest_address'] :
+ $conf['wicked']['notify_address'];
+ if (Horde_Auth::getAuth()) {
+ $identity = Horde_Prefs_Identity::singleton();
+ $from = $identity->getValue('fullname');
+ if (empty($from)) {
+ $from = $registry->get('name');
+ }
+ $from_addr = $identity->getValue('from_addr');
+ if (empty($from_addr)) {
+ $from_addr = $default_from_addr;
+ }
+ } else {
+ $from = $registry->get('name') . ' Guest';
+ $from_addr = $default_from_addr;
+ }
+
+ $mail = new Horde_Mime_Mail(array('body' => $message,
+ 'to' =>
+ $conf['wicked']['notify_address'],
+ 'from' => $from . '<' . $from_addr
+ . '>',
+ 'charset' => Horde_Nls::getCharset()));
+ $mail->addHeader('User-Agent', 'Wicked ' . $GLOBALS['registry']->getVersion());
+ $mail->addHeader('Precedence', 'bulk');
+ $mail->addHeader('Auto-Submitted', 'auto-replied');
+ foreach (array_keys($headers) as $hkey) {
+ $mail->addHeader($hkey, $headers[$hkey]);
+ }
+ try {
+ $mail->send(Horde::getMailerConfig());
+ } catch (Exception $e) {
+ $GLOBALS['notification']->push($e->getMessage());
+ }
+ }
+
+ /**
+ * Generate a CAPTCHA string.
+ *
+ * @param boolean $new If true, a new CAPTCHA is created and returned.
+ * The current, to-be-confirmed string otherwise.
+ *
+ * @return string A CAPTCHA string.
+ */
+ function getCAPTCHA($new = false)
+ {
+ if ($new || empty($_SESSION['wickedSession']['CAPTCHA'])) {
+ $_SESSION['wickedSession']['CAPTCHA'] = '';
+ for ($i = 0; $i < 5; $i++) {
+ $_SESSION['wickedSession']['CAPTCHA'] .= chr(rand(65, 90));
+ }
+ }
+ return $_SESSION['wickedSession']['CAPTCHA'];
+ }
+
+}
--- /dev/null
+<?php
+/**
+ * Wicked external API interface.
+ *
+ * This file defines Wicked's external API interface. Other applications
+ * can interact with Wicked through this API.
+ *
+ * $Horde: wicked/lib/api.php,v 1.32 2009/01/06 18:02:39 jan Exp $
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @package Wicked
+ */
+
+$_services['perms'] = array(
+ 'args' => array(),
+ 'type' => 'array',
+);
+
+$_services['show'] = array(
+ 'link' => '%application%/display.php?page=|page|&version=|version|#|toc|',
+);
+
+$_services['list'] = array(
+ 'args' => array('special' => 'boolean',
+ 'no_cache' => 'boolean'),
+ 'type' => 'array',
+);
+
+$_services['getPageInfo'] = array(
+ 'args' => array('pagename' => 'string'),
+ 'type' => 'string',
+);
+
+$_services['getMultiplePageInfo'] = array(
+ 'args' => array('pagenames' => '{urn:horde}stringArray'),
+ 'type' => 'string',
+);
+
+$_services['getPageHistory'] = array(
+ 'args' => array('pagename' => 'string'),
+ 'type' => 'string',
+);
+
+$_services['pageExists'] = array(
+ 'args' => array('pagename' => 'string'),
+ 'type' => 'string',
+);
+
+$_services['display'] = array(
+ 'args' => array('pagename' => 'string'),
+ 'type' => 'string',
+);
+
+$_services['renderPage'] = array(
+ 'args' => array('pagename' => 'string',
+ 'format' => 'string'),
+ 'type' => 'string',
+);
+
+$_services['edit'] = array(
+ 'args' => array('pagename' => 'string',
+ 'text' => 'string',
+ 'changelog' => 'string',
+ 'minorchange' => 'boolean'),
+ 'type' => 'boolean',
+);
+
+$_services['listTemplates'] = array(
+ 'args' => array(),
+ 'type' => 'array',
+);
+
+$_services['getTemplate'] = array(
+ 'args' => array('name' => 'string'),
+ 'type' => 'string',
+);
+
+$_services['saveTemplate'] = array(
+ 'args' => array('name' => 'string',
+ 'data' => 'string'),
+ 'type' => 'boolean',
+);
+
+$_services['getPageSource'] = array(
+ 'args' => array('name' => 'string'),
+ 'type' => 'text',
+);
+
+$_services['getRecentChanges'] = array(
+ 'args' => array('days' => 'int'),
+ 'type' => 'array',
+);
+
+/**
+ * Returns a list of available permissions.
+ *
+ * @return array An array describing all available permissions.
+ */
+function _wicked_perms()
+{
+ static $perms = array();
+ if (!empty($perms)) {
+ return $perms;
+ }
+
+ require_once dirname(__FILE__) . '/base.php';
+ global $wicked;
+
+ $perms['tree']['wicked']['pages'] = array();
+ $perms['title']['wicked:pages'] = _("Pages");
+
+ $perms['tree']['wicked']['pages'] = array();
+ $perms['title']['wicked:pages'] = _("Pages");
+
+ $perms['tree']['wicked']['pages']['AllPages'] = false;
+ $perms['title']['wicked:pages:AllPages'] = 'AllPages';
+
+ $perms['tree']['wicked']['pages']['LeastPopular'] = false;
+ $perms['title']['wicked:pages:LeastPopular'] = 'LeastPopular';
+
+ $perms['tree']['wicked']['pages']['MostPopular'] = false;
+ $perms['title']['wicked:pages:MostPopular'] = 'MostPopular';
+
+ $perms['tree']['wicked']['pages']['RecentChanges'] = false;
+ $perms['title']['wicked:pages:RecentChanges'] = 'RecentChanges';
+
+ $pages = $wicked->getPages();
+ if (is_a($pages, 'PEAR_Error')) {
+ return $pages;
+ }
+
+ foreach ($pages as $pagename) {
+ $pageId = $wicked->getPageId($pagename);
+ $perms['tree']['wicked']['pages'][$pageId] = false;
+ $perms['title']['wicked:pages:' . $pageId] = $pagename;
+ }
+
+ ksort($perms['tree']['wicked']['pages']);
+ return $perms;
+}
+
+/**
+ * Returns a list of available pages.
+ *
+ * @param boolean $special Include special pages
+ * @param boolean $no_cache Always retreive pages from backed
+ *
+ * @return array An array of all available pages.
+ */
+function _wicked_list($special = true, $no_cache = false)
+{
+ require_once dirname(__FILE__) . '/base.php';
+ return $GLOBALS['wicked']->getPages($special, $no_cache);
+}
+
+/**
+ * Return basic page information.
+ *
+ * @param string $pagename Page name
+ *
+ * @return array An array of page parameters.
+ */
+function _wicked_getPageInfo($pagename)
+{
+ require_once dirname(__FILE__) . '/base.php';
+
+ $page = Page::getPage($pagename);
+ if (is_a($page, 'PEAR_Error')) {
+ return $page;
+ }
+
+ return array(
+ 'page_majorversion' => $page->_page['page_majorversion'],
+ 'page_minorversion' => $page->_page['page_minorversion'],
+ 'page_checksum' => md5($page->getText()),
+ 'version_created' => $page->_page['version_created'],
+ 'change_author' => $page->_page['change_author'],
+ 'change_log' => $page->_page['change_log'],
+ );
+}
+
+/**
+ * Return basic information for multiple pages.
+ *
+ * @param array $pagenames Page names
+ *
+ * @return array An array of arrays of page parameters.
+ */
+function _wicked_getMultiplePageInfo($pagenames = array())
+{
+ require_once dirname(__FILE__) . '/base.php';
+
+ if (empty($pagenames)) {
+ $pagenames = $GLOBALS['wicked']->getPages(false);
+ if (is_a($pagenames, 'PEAR_Error')) {
+ return $pagenames;
+ }
+ }
+
+ $info = array();
+
+ foreach ($pagenames as $pagename) {
+ $page = Page::getPage($pagename);
+ if (is_a($page, 'PEAR_Error')) {
+ return $page;
+ }
+ $info[$pagename] = array(
+ 'page_majorversion' => $page->_page['page_majorversion'],
+ 'page_minorversion' => $page->_page['page_minorversion'],
+ 'page_checksum' => md5($page->getText()),
+ 'version_created' => $page->_page['version_created'],
+ 'change_author' => $page->_page['change_author'],
+ 'change_log' => $page->_page['change_log']
+ );
+ }
+
+ return $info;
+}
+
+/**
+ * Return page history.
+ *
+ * @param string $pagename Page name
+ *
+ * @return array An array of page parameters.
+ */
+function _wicked_getPageHistory($pagename)
+{
+ require_once dirname(__FILE__) . '/base.php';
+
+ $page = Page::getPage($pagename);
+ if (is_a($page, 'PEAR_Error')) {
+ return $page;
+ }
+
+ $summaries = $GLOBALS['wicked']->getHistory($pagename);
+ if (is_a($summaries, 'PEAR_Error')) {
+ return $summaries;
+ }
+
+ foreach ($summaries as $i => $summary) {
+ $summaries[$i]['page_checksum'] = md5($summary['page_text']);
+ unset($summaries[$i]['page_text']);
+ }
+
+ return $summaries;
+}
+
+/**
+ * Chech if a page exists
+ *
+ * @param string $pagename Page name
+ *
+ * @return boolean
+ */
+function _wicked_pageExists($pagename)
+{
+ require_once dirname(__FILE__) . '/base.php';
+ return $GLOBALS['wicked']->pageExists($pagename);
+}
+
+/**
+ * Returns a rendered wiki page.
+ *
+ * @param string $pagename Page to display
+ *
+ * @return array Page without CSS link
+ */
+function _wicked_display($pagename)
+{
+ require_once dirname(__FILE__) . '/base.php';
+
+ $page = Page::getPage($pagename);
+ if (is_a($page, 'PEAR_Error')) {
+ return $page;
+ }
+
+ $GLOBALS['wicked']->logPageView($page->pageName());
+
+ return $page->displayContents(false);
+}
+
+/**
+ * Returns a rendered wiki page.
+ *
+ * @param string $pagename Page to display
+ * @param string $format Format to render page to (Plain, XHtml)
+ *
+ * @return array Rendered page
+ */
+function _wicked_renderPage($pagename, $format = 'Plain')
+{
+ require_once dirname(__FILE__) . '/base.php';
+
+ $page = Page::getPage($pagename);
+ if (is_a($page, 'PEAR_Error')) {
+ return $page;
+ }
+
+ $wiki = &$page->getProcessor();
+ $content = $wiki->transform($page->getText(), $format);
+ if (is_a($content, 'PEAR_Error')) {
+ return $content;
+ }
+
+ $GLOBALS['wicked']->logPageView($page->pageName());
+ return $content;
+}
+
+/**
+ * Updates content of a wiki page. If the page does not exist it is
+ * created.
+ *
+ * @param string $pagename Page to edit
+ * @param string $text Page content
+ * @param string $changelog Description of the change
+ * @param boolean $minorchange True if this is a minor change
+ *
+ * @return boolean | PEAR_Error True on success, PEAR_Error on failure.
+ */
+function _wicked_edit($pagename, $text, $changelog = '', $minorchange = false)
+{
+ require_once dirname(__FILE__) . '/base.php';
+
+ $page = Page::getPage($pagename);
+ if (is_a($page, 'PEAR_Error')) {
+ return $page;
+ }
+ if (!$page->allows(WICKED_MODE_EDIT)) {
+ return PEAR::RaiseError(sprintf(_("You don't have permission to edit \"%s\"."), $pagename));
+ }
+ if ($GLOBALS['conf']['wicked']['require_change_log'] &&
+ empty($changelog)) {
+ return PEAR::raiseError(_("You must provide a change log."));
+ }
+
+ $content = $page->getText();
+ if (is_a($content, 'PEAR_Error')) {
+ // Maybe the page does not exists, if not create it
+ if ($GLOBALS['wicked']->pageExists($pagename)) {
+ return $content;
+ } else {
+ return $GLOBALS['wicked']->newPage($pagename, $text);
+ }
+ }
+
+ if (trim($text) == trim($content)) {
+ return PEAR::raiseError(_("No changes made"));
+ }
+
+ $result = $page->updateText($text, $changelog, $minorchange);
+ if (is_a($result, 'PEAR_Error')) {
+ return $result;
+ } else {
+ return true;
+ }
+}
+
+/**
+ * Get a list of templates provided by Wicked. A template is any page whose
+ * name begins with "Template"
+ *
+ * @return mixed Array on success; PEAR_Error on failure
+ */
+function _wicked_listTemplates()
+{
+ require_once dirname(__FILE__) . '/base.php';
+ global $wicked;
+ $templates = $wicked->getMatchingPages('Template', WICKED_PAGE_MATCH_ENDS);
+ $list = array(array('category' => _("Wiki Templates"),
+ 'templates' => array()));
+ foreach ($templates as $page) {
+ $list[0]['templates'][] = array('id' => $page['page_name'],
+ 'name' => $page['page_name']);
+ }
+ return $list;
+}
+
+/**
+ * Get a template specified by its name. This is effectively an alias for
+ * getPageSource() since Wicked templates are also normal pages.
+ * Wicked templates are pages that include "Template" at the beginning of the
+ * name.
+ *
+ * @param string $name The name of the template to fetch
+ *
+ * @return mixed String of template data on success; PEAR_Error on fail
+ */
+function _wicked_getTemplate($name)
+{
+ return _wicked_getPageSource($name);
+}
+
+/**
+ * Get the wiki source of a page specified by its name.
+ *
+ * @param string $name The name of the page to fetch
+ * @param string $version Page version
+ *
+ * @return mixed String of page data on success; PEAR_Error on fail
+ */
+function _wicked_getPageSource($pagename, $version = null)
+{
+ require_once dirname(__FILE__) . '/base.php';
+ global $wicked;
+
+ $page = Page::getPage($pagename, $version);
+
+ if (!$page->allows(WICKED_MODE_CONTENT)) {
+ return PEAR::raiseError(_("Permission denied."));
+ }
+
+ if (!$page->isValid()) {
+ return PEAR::raiseError(_("Invalid page requested."));
+ }
+
+ return $page->getText();
+}
+
+/**
+ * Process a completed template to update the named Wiki page. This method is
+ * basically a passthrough to _wicked_edit()
+ *
+ * @param string $name Name of the new or modified page
+ * @param string $data Text content of the populated template
+ *
+ * @return mixed True on success; PEAR_Error on failure
+ */
+function _wicked_saveTemplate($name, $data)
+{
+ return _wicked_edit($name, $data, 'Template Auto-fill', false);
+}
+
+/**
+ * Returns the most recently changed pages.
+ *
+ * @param integer $days The number of days to look back.
+ *
+ * @return mixed An array of pages, or PEAR_Error on failure.
+ */
+function _wicked_getRecentChanges($days = 3)
+{
+ require_once dirname(__FILE__) . '/base.php';
+
+ $summaries = $GLOBALS['wicked']->getRecentChanges($days);
+ if (is_a($summaries, 'PEAR_Error')) {
+ return $summaries;
+ }
+
+ $info = array();
+ foreach ($summaries as $page) {
+ $info[$page['page_name']] = array(
+ 'page_majorversion' => $page['page_majorversion'],
+ 'page_minorversion' => $page['page_minorversion'],
+ 'page_checksum' => md5($page['page_text']),
+ 'version_created' => $page['version_created'],
+ 'change_author' => $page['change_author'],
+ 'change_log' => $page['change_log'],
+ );
+ }
+
+ return $info;
+}
--- /dev/null
+<?php
+/**
+ * Wicked base inclusion file.
+ *
+ * This file brings in all of the dependencies that every Wicked
+ * script will need and sets up objects that all scripts use.
+ *
+ * $Horde: wicked/lib/base.php,v 1.21 2009/07/13 20:05:59 slusarz Exp $
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ */
+
+// Check for a prior definition of HORDE_BASE (perhaps by an
+// auto_prepend_file definition for site customization).
+if (!defined('HORDE_BASE')) {
+ define('HORDE_BASE', dirname(__FILE__) . '/../..');
+}
+
+// Load the Horde Framework core, and set up inclusion paths.
+require_once HORDE_BASE . '/lib/core.php';
+
+// Registry.
+$registry = Horde_Registry::singleton();
+try {
+ $registry->pushApp('wicked', !defined('AUTH_HANDLER'));
+} catch (Horde_Exception $e) {
+ if ($e->getCode() == 'permission_denied') {
+ Horde::authenticationFailureRedirect();
+ }
+ Horde::fatal($e, __FILE__, __LINE__, false);
+}
+$conf = &$GLOBALS['conf'];
+define('WICKED_TEMPLATES', $registry->get('templates'));
+
+// Find the base file path of Wicked.
+if (!defined('WICKED_BASE')) {
+ define('WICKED_BASE', dirname(__FILE__) . '/..');
+}
+
+// Notification system.
+$notification = &Horde_Notification::singleton();
+$notification->attach('status');
+
+// Wicked base libraries.
+require_once WICKED_BASE . '/lib/Wicked.php';
+require_once WICKED_BASE . '/lib/Driver.php';
+require_once WICKED_BASE . '/lib/Page.php';
+$GLOBALS['wicked'] = Wicked_Driver::factory();
+
+// Start compression.
+if (!Horde_Util::nonInputVar('no_compress')) {
+ Horde::compressOutput();
+}
--- /dev/null
+<?php
+
+class Wicked_Driver_TC extends HordeUnitTestCase {
+
+ /**
+ * Driver we are testing
+ * @var object
+ */
+ var $wicked;
+
+ function setUp()
+ {
+ @define('WICKED_BASE', dirname(__FILE__) . '/../..');
+ @define('TEST_PAGE_1', 'driver-pages.phpt Test Page One');
+ @define('TEST_PAGE_2', 'Renamed driver-pages.phpt Test Page (Called "Two")');
+
+ require_once WICKED_BASE . '/lib/Driver.php';
+ require_once WICKED_BASE . '/lib/Wicked.php';
+
+ $this->wicked = Wicked_Driver::factory('sql', $this->getTestDatabaseSQLDriverConfig());
+ $this->assertNotA($this->wicked, 'PEAR_Error');
+ }
+
+ function test_Driver_newPage_should_successfully_create_a_page()
+ {
+ $this->wicked->removeAllVersions(TEST_PAGE_1);
+
+ $this->assertFalse($this->wicked->pageExists(TEST_PAGE_1));
+
+ $res = $this->wicked->newPage(TEST_PAGE_1, 'This is a test.');
+ $this->assertNotA($res, 'PEAR_Error');
+ $this->assertTrue($this->wicked->pageExists(TEST_PAGE_1));
+
+ $page = $this->wicked->retrieveByName(TEST_PAGE_1);
+ $this->assertNotA($page, 'PEAR_Error');
+ $this->assertEqual('This is a test.', $page['page_text']);
+ }
+
+ function test_updateText_should_also_update_history()
+ {
+ $res = $this->wicked->updateText(TEST_PAGE_1, 'Here\'s the new page text.',
+ 'Test change.', true);
+ $this->assertNotA($res, 'PEAR_Error');
+
+ $page = $this->wicked->retrieveByName(TEST_PAGE_1);
+ $this->assertNotA($page, 'PEAR_Error');
+ $this->assertEqual('Here\'s the new page text.', $page['page_text']);
+
+ $last_version = sprintf('%d.%d', $page['page_majorversion'],
+ $page['page_minorversion']);
+
+ $res = $this->wicked->updateText(TEST_PAGE_1, 'Here\'s the second change.',
+ 'Test change 2.', false);
+ $this->assertNotA($res, 'PEAR_Error');
+
+ $page = $this->wicked->retrieveByName(TEST_PAGE_1);
+ $this->assertNotA($page, 'PEAR_Error');
+ $this->assertEqual('Here\'s the second change.', $page['page_text']);
+
+ $res = $this->wicked->retrieveHistory(TEST_PAGE_1, $last_version);
+ $this->assertNotA($res, 'PEAR_Error');
+
+ $this->assertNotEqual(0, count($res),
+ "no results from retrieveHistory()");
+ $page = $res[0];
+ $this->assertEqual('Here\'s the new page text.', $page['page_text']);
+ }
+
+ function testGetHistoryAndRemoveVersion()
+ {
+ $history = $this->wicked->getHistory(TEST_PAGE_1);
+ $this->assertNotA($history, 'PEAR_Error');
+ $this->assertFalse(count($history) < 2, "need more history to test");
+
+ $nvers = count($history);
+ $item_1 = $history[0];
+ $item_1_ver = sprintf('%d.%d', $item_1['page_majorversion'],
+ $item_1['page_minorversion']);
+
+ $res = $this->wicked->removeVersion(TEST_PAGE_1, $item_1_ver);
+ $this->assertNotA($res, 'PEAR_Error');
+
+ $history = $this->wicked->getHistory(TEST_PAGE_1);
+ $this->assertNotA($history, 'PEAR_Error');
+ $this->assertEqual(count($history), ($nvers - 1));
+
+ foreach ($history as $page) {
+ $testver = sprintf('%d.%d', $page['page_majorversion'],
+ $page['page_minorversion']);
+ $this->assertNotEqual($testver, $item_1_ver,
+ "removeVersion() version still there.");
+ }
+ }
+
+ function testLock()
+ {
+ $page = $this->wicked->retrieveByName(TEST_PAGE_1);
+ $this->assertNotA($page, 'PEAR_Error');
+ $this->assertFalse($page['locked']);
+
+ $res = $this->wicked->lock(TEST_PAGE_1, true);
+ $this->assertNotA($res, 'PEAR_Error');
+
+ $page = $this->wicked->retrieveByName(TEST_PAGE_1);
+ $this->assertNotA($page, 'PEAR_Error');
+ $this->assertTrue($page['locked']);
+
+ $res = $this->wicked->lock(TEST_PAGE_1, false);
+ $this->assertNotA($res, 'PEAR_Error');
+
+ $page = $this->wicked->retrieveByName(TEST_PAGE_1);
+ $this->assertNotA($page, 'PEAR_Error');
+ $this->assertFalse($page['locked']);
+ }
+
+ function test_logPageView_should_increment_hit_counter()
+ {
+ $page = $this->wicked->retrieveByName(TEST_PAGE_1);
+ $this->assertNotA($page, 'PEAR_Error');
+
+ $hits = $page['page_hits'];
+
+ $res = $this->wicked->logPageView(TEST_PAGE_1);
+ $this->assertNotA($res, 'PEAR_Error');
+
+ $page = $this->wicked->retrieveByName(TEST_PAGE_1);
+ $this->assertNotA($page, 'PEAR_Error');
+
+ $this->assertEqual($page['page_hits'], $hits + 1);
+ }
+
+ function testRenamePage()
+ {
+ $res = $this->wicked->renamePage(TEST_PAGE_1, TEST_PAGE_2);
+ $this->assertNotA($res, 'PEAR_Error');
+
+ $this->assertFalse($this->wicked->pageExists(TEST_PAGE_1));
+ $this->assertTrue($this->wicked->pageExists(TEST_PAGE_2));
+
+ $res = $this->wicked->renamePage(TEST_PAGE_2, TEST_PAGE_1);
+ $this->assertTrue($this->wicked->pageExists(TEST_PAGE_1));
+ $this->assertFalse($this->wicked->pageExists(TEST_PAGE_2));
+ }
+
+ function testGetPagesAndGetAllPages()
+ {
+ $pages = $this->wicked->getPages(false);
+ $this->assertNotA($pages, 'PEAR_Error');
+
+ $allPages = $this->wicked->getAllPages();
+ $this->assertNotA($allPages, 'PEAR_Error');
+ $this->assertEqual(count($allPages), count($pages));
+
+ $allPageNames = array();
+ foreach ($allPages as $allPage) {
+ $allPageNames[] = $allPage['page_name'];
+ }
+
+ $this->assertFalse(count(array_diff($pages, $allPageNames)) > 0);
+ $this->assertFalse(count(array_diff($allPageNames, $pages)) > 0);
+ }
+
+ function test_mostPopular_call_should_not_fail()
+ {
+ $res = $this->wicked->mostPopular();
+ $this->assertNotA($res, 'PEAR_Error');
+ }
+
+ function test_leastPopular_call_should_not_fail()
+ {
+ $res = $this->wicked->leastPopular();
+ $this->assertNotA($res, 'PEAR_Error');
+ }
+
+ function test_recentChanges_call_should_not_fail()
+ {
+ $res = $this->wicked->getRecentChanges();
+ $this->assertNotA($res, 'PEAR_Error');
+ }
+
+ function testSearches()
+ {
+ $res = $this->wicked->searchTitles('.phpt');
+ $this->assertNotA($res, 'PEAR_Error');
+
+ $this->assertFalse(count($res) < 1, "didn't find all the pages.");
+
+ $res = $this->wicked->searchText('second change');
+ $this->assertNotA($res, 'PEAR_Error');
+ $this->assertFalse(count($res) < 1, "didn't find all the pages.");
+
+ $res = $this->wicked->getLikePages('Wiki');
+ $this->assertNotA($res, 'PEAR_Error');
+ }
+
+ function test_removeAllVersions_should_not_leave_any_versions()
+ {
+ $res = $this->wicked->removeAllVersions(TEST_PAGE_1);
+ $this->assertNotA($res, 'PEAR_Error');
+ $this->assertFalse($this->wicked->pageExists("TEXT_PAGE_1"));
+ }
+
+}
--- /dev/null
+<?php define('WICKED_VERSION', 'H4 (1.0-cvs)') ?>
--- /dev/null
+<?xml version="1.0" ?>
+<!-- $Horde: wicked/locale/en_US/help.xml,v 1.2 2006/02/23 20:21:53 chuck Exp $ -->
+<help>
+
+<entry id="Overview">
+ <title>Overview</title>
+ <heading>Introduction</heading>
+ <para>
+ Wiki is a WikiWikiWeb application integrated with Horde.
+ </para>
+</entry>
+
+<entry id="Templates">
+ <title>Page Templates</title>
+ <heading></heading>
+ <para>
+ Templates are pages that begin or end with "Template"
+ (capitalization counts). They can be used to provide initial content
+ or structure when creating new pages.
+ </para>
+</entry>
+
+</help>
--- /dev/null
+<?xml version="1.0" ?>
+<!-- $Horde: wicked/locale/es_ES/help.xml,v 1.1 2008/03/21 00:28:28 jan Exp $ -->
+<help>
+
+<entry id="Overview">
+ <title>Introducción</title>
+ <heading>Introducción</heading>
+ <para>Wiki es una aplicación WikiWikiWeb integrada en Horde.</para>
+</entry>
+
+<entry id="Templates">
+ <title>Plantillas de página</title>
+ <heading></heading>
+ <para>Las plantillas son páginas que empiezan o terminan por "Template" (Las mayúsculas se tienen en cuenta). Se pueden utilizar para proporcional contenido o estructura de forma inicial al crear páginas.</para>
+</entry>
+
+</help>
--- /dev/null
+<?xml version="1.0"?>
+<!-- $Horde: wicked/locale/fi_FI/help.xml,v 1.3 2008/02/22 13:36:05 jan Exp $ -->
+<help>
+ <entry id="Overview" md5="d1cc1502e3ddeb34b209a5c3f631a586" state="uptodate">
+ <title>Yleiskuva</title>
+ <heading>Esittely</heading>
+ <para>
+ Wiki on Horden WikiWikiWeb ohjelmisto.
+ </para>
+</entry>
+ <entry id="Templates" state="uptodate" md5="0889184f1837cd40dd5c5ed60670fd65">
+ <title>Page Templates</title>
+ <heading/>
+ <para>
+ Templates are pages that begin or end with "Template"
+ (capitalization counts). They can be used to provide initial content
+ or structure when creating new pages.
+ </para>
+</entry>
+</help>
--- /dev/null
+<?php
+/**
+ * $Horde: wicked/opensearch.php,v 1.6 2009/07/13 20:05:59 slusarz Exp $
+ *
+ * Copyright 2007-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Jan Schneider <jan@horde.org>
+ */
+
+// Check for a prior definition of HORDE_BASE (perhaps by an
+// auto_prepend_file definition for site customization).
+if (!defined('HORDE_BASE')) {
+ @define('HORDE_BASE', dirname(__FILE__) . '/..');
+}
+
+// Load the Horde Framework core, and set up inclusion paths.
+require_once HORDE_BASE . '/lib/core.php';
+
+// Registry.
+$registry = Horde_Registry::singleton();
+$registry->pushApp('wicked');
+
+// Url.
+$url = Horde::applicationUrl('', true);
+
+// Name.
+$name = $registry->get('name', 'wicked') . ' (' . $url . ')';
+
+// Icon.
+$icon = base64_encode(file_get_contents($registry->get('themesfs', 'wicked') . '/graphics/wicked.png'));
+
+// Charset.
+$charset = Horde_Nls::getCharset();
+
+header('Content-Type: text/xml; charset=' . $charset);
+echo <<<PAYLOAD
+<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
+ <ShortName>$name</ShortName>
+ <SearchForm>$url</SearchForm>
+ <Url type="text/html"
+ method="get"
+ template="${url}display.php">
+ <Param name="page" value="Search"/>
+ <Param name="params" value="{searchTerms}"/>
+ </Url>
+ <Image height="16" width="16">data:image/png;base64,$icon</Image>
+ <InputEncoding>$charset</InputEncoding>
+
+</OpenSearchDescription>
+PAYLOAD;
--- /dev/null
+see horde/po/README
--- /dev/null
+# German translations for Wicked.
+# Copyright 2003-2009 The Horde Project
+# This file is distributed under the same license as the Wicked package.
+# Jan Schneider <jan@horde.org>, 2003-2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Wicked 1.0-cvs\n"
+"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
+"POT-Creation-Date: 2008-09-18 11:24+0200\n"
+"PO-Revision-Date: 2008-09-18 12:15+0200\n"
+"Last-Translator: Jan Schneider <jan@horde.org>\n"
+"Language-Team: i18n@lists.horde.org\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: templates/edit/create.inc:13
+#, php-format
+msgid ""
+"%s does not exist, but maybe you were looking for one of the following pages?"
+msgstr ""
+"%s existiert nicht, aber vielleicht haben Sie eine der folgenden Seiten "
+"gesucht?"
+
+#: templates/edit/create.inc:30
+#, php-format
+msgid ""
+"%s does not exist. Click on \"Create\" below if you want to create this page "
+"now and start editing."
+msgstr ""
+"%s existiert nicht. Klicken Sie unten auf \"Erstellen\", wenn Sie diese "
+"Seite jetzt anlegen und bearbeiten möchten."
+
+#: lib/Page/Search.php:112
+#, php-format
+msgid "%s does not exist. You can create it now."
+msgstr "%s existiert nicht. Sie können es jetzt anlegen."
+
+#: templates/edit/create.inc:37
+msgid "(None)"
+msgstr "(Keine)"
+
+#: scripts/wicked.php:161
+msgid ""
+"-d, --debug Run in debug mode (displays extra information)"
+msgstr ""
+"-d, --debug Im Debugmodus ausführen (Zeigt zusätzliche\n"
+" Informationen an)"
+
+#: scripts/wicked.php:163
+msgid ""
+"-g, --get[=pagetitle] Return all pages (unless pagetitle specified)"
+msgstr ""
+"-g, --get[=pagetitle] Liefert alle Seiten zurück (außer wenn "
+"spezieller\n"
+" Seitentitel angeben wird)"
+
+#: scripts/wicked.php:160
+msgid "-h, --help Show this help"
+msgstr "-h, --help Diese Hilfe anzeigen"
+
+#: scripts/wicked.php:162
+msgid "-l, --list-pages List pages"
+msgstr "-l, --list-pages Seitenliste anzeigen"
+
+#: scripts/wicked.php:164
+msgid "-o, --out[=type] Output type for results (default:xml)"
+msgstr "-o, --out[=type] Ausgabetyp der Resultate (Standard: xml)"
+
+#: scripts/wicked.php:166
+msgid "-p, --password[=password] Horde login password"
+msgstr "-p, --password[=passwort] Horde-Passwort"
+
+#: scripts/wicked.php:165
+msgid "-u, --username[=username] Horde login username"
+msgstr "-u, --username[=benutzername] Horde-Benutzername"
+
+#: templates/sync/list.inc:25 templates/sync/list.inc:51
+#: templates/sync/list.inc:73
+msgid "Actions"
+msgstr "Aktionen"
+
+#: templates/display/MergeOrRename.html:31
+msgid "Add the text from this page"
+msgstr "den Text von dieser Seite hinzufügen"
+
+#: lib/Page/AddPage.php:108
+#, php-format
+msgid "AddPage: %s"
+msgstr "Seite anlegen: %s"
+
+#: lib/Page/AllPages.php:90
+msgid "AllPages"
+msgstr "AlleSeiten"
+
+#: lib/Page/DeletePage.php:83
+msgid ""
+"Are you sure you want to delete this page? All versions will be permanently "
+"removed."
+msgstr ""
+"Sind Sie sicher, dass Sie diese Seite löschen möchten? Alle alten Versionen "
+"werden dauerhaft gelöscht."
+
+#: lib/Page/DeletePage.php:85
+#, php-format
+msgid "Are you sure you want to delete version %s of this page?"
+msgstr "Sind Sie sicher, dass Sie die Version %s dieser Seite löschen möchten?"
+
+#: lib/Page/RevertPage.php:71
+#, php-format
+msgid "Are you sure you want to revert to version %s of this page?"
+msgstr ""
+"Sind Sie sicher, dass Sie die Version %s dieser Seite wiederherstellen "
+"möchten?"
+
+#: templates/display/AttachedFiles.html:88
+msgid "Attach File"
+msgstr "Datei anhängen"
+
+#: templates/display/AttachedFiles.html:52
+msgid "Attach a New File"
+msgstr "Eine neue Datei anhängen"
+
+#: templates/display/standard.inc:77
+msgid "AttachedFiles"
+msgstr "AngehängteDateien"
+
+#: lib/Page/AttachedFiles.php:171
+#, php-format
+msgid "AttachedFiles: %s"
+msgstr "AngehängteDateien: %s"
+
+#: templates/display/standard.inc:78
+msgid "Attached_Files"
+msgstr "Angehängte_Dateien"
+
+#: templates/display/AttachedFiles.html:7
+msgid "Attachment Name"
+msgstr "Anhangname"
+
+#: templates/display/standard.inc:117
+msgid "Attachments"
+msgstr "Anhänge"
+
+#: lib/Page/AttachedFiles.php:225
+msgid "Attachments with spaces can't be embedded into a page."
+msgstr "Anhänge mit Leerzeichen können nicht in eine Seite eingebettet werden."
+
+#: templates/history/header.inc:23 templates/pagelist/header.inc:7
+#: templates/sync/list.inc:24 templates/sync/list.inc:50
+#: templates/sync/diff.inc:25 templates/sync/diff.inc:61
+#: templates/edit/create.inc:19 lib/Page/Search.php:158
+#: templates/display/AttachedFiles.html:10
+msgid "Author"
+msgstr "Autor"
+
+#: templates/display/standard.inc:104
+msgid "Ba_ck to"
+msgstr "_Zurück zu"
+
+#: templates/display/standard.inc:104
+msgid "Back to"
+msgstr "Zurück zu"
+
+#: templates/display/standard.inc:67
+msgid "BackLinks"
+msgstr "RückVerweise"
+
+#: lib/Page/BackLinks.php:80
+#, php-format
+msgid "BackLinks: %s"
+msgstr "RückVerweise: %s"
+
+#: lib/Page/SyncPages.php:246 lib/Page/SyncPages.php:249
+msgid "By default, your login data will be used"
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:231
+msgid "Can't read uploaded file."
+msgstr "Hochgeladene Datei konnte nicht gelesen werden."
+
+#: lib/Page/RevertPage.php:120
+#, php-format
+msgid "Can't revert to an unknown version."
+msgstr "Wiederherstellung einer unbekannten Version nicht möglich."
+
+#: lib/Page/AttachedFiles.php:271
+#, php-format
+msgid "Can't update \"%s\": no such attachment."
+msgstr "\"%s\" konnte nicht aktualisiert werden: Kein Anhang mit diesem Namen."
+
+#: templates/edit/create.inc:47 templates/edit/standard.inc:27
+#: lib/Page/DeletePage.php:104 lib/Page/RevertPage.php:88
+#: lib/Page/MergeOrRename.php:140 templates/display/MergeOrRename.html:62
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#: templates/history/header.inc:29 templates/display/AttachedFiles.html:12
+msgid "Change Log"
+msgstr "Änderung"
+
+#: templates/sync/diff.inc:26 templates/sync/diff.inc:62
+#: templates/edit/standard.inc:29
+msgid "Change log"
+msgstr "Änderung"
+
+#: templates/display/AttachedFiles.html:80
+#: templates/display/AttachedFiles.html:146
+msgid "Change log entry"
+msgstr "Änderungseintrag"
+
+#: templates/display/MergeOrRename.html:40
+msgid "Change references to this page from:"
+msgstr "Verweise von folgenden Seiten ändern:"
+
+#: lib/Page/MergeOrRename.php:253
+#, php-format
+msgid "Changed references from %s to %s"
+msgstr "Verweise von %s nach %s geändert"
+
+#: templates/edit/standard.inc:28
+msgid "Changelog is required"
+msgstr "Änderungseintrag ist notwendig"
+
+#: templates/sync/diff.inc:27 templates/sync/diff.inc:63
+#, fuzzy
+msgid "Checksum"
+msgstr "Überprüfen"
+
+#: templates/edit/create.inc:26
+msgid ""
+"Click on \"Create\" below if you want to create this page now and start "
+"editing."
+msgstr ""
+"Klicken Sie unten auf \"Erstellen\", wenn Sie diese Seite jetzt anlegen und "
+"bearbeiten möchten."
+
+#: scripts/wicked.php:42
+msgid "Couldn't read command-line options."
+msgstr "Die Kommandozeilenparameter konnten nicht gelesen werden."
+
+#: templates/edit/create.inc:46
+msgid "Create"
+msgstr "Erstellen"
+
+#: lib/Page/NewPage.php:135
+#, php-format
+msgid "Create Failed: %s"
+msgstr "Erstellen fehlgeschlagen: %s"
+
+#: templates/history/header.inc:24 templates/sync/list.inc:23
+#: templates/sync/list.inc:49 templates/sync/diff.inc:24
+#: templates/sync/diff.inc:60
+msgid "Created"
+msgstr "Erstellt"
+
+#: templates/pagelist/header.inc:8 templates/edit/create.inc:20
+#: lib/Page/Search.php:159
+msgid "Creation Date"
+msgstr "Erstelldatum"
+
+#: lib/Page/SyncPages.php:231
+msgid "Custom"
+msgstr "Angepasst"
+
+#: templates/display/AttachedFiles.html:11
+msgid "Date"
+msgstr "Datum"
+
+#: lib/Page/DeletePage.php:103
+msgid "Delete"
+msgstr "Löschen"
+
+#: templates/display/standard.inc:52
+#, php-format
+msgid "Delete %s"
+msgstr "%s löschen"
+
+#: templates/history/header.inc:16
+msgid "Delete Version"
+msgstr "Version löschen"
+
+#: templates/history/summary.inc:6
+#, php-format
+msgid "Delete Version %s"
+msgstr "Version %s löschen"
+
+#: lib/Page/DeletePage.php:97 lib/Page/DeletePage.php:120
+msgid "DeletePage"
+msgstr "SeiteLöschen"
+
+#: lib/Page/DeletePage.php:142
+#, php-format
+msgid "Deleted version %s of \"%s\"."
+msgstr "Version %s von \"%s\" gelöscht."
+
+#: templates/history/header.inc:26
+msgid "Diff From"
+msgstr "Unterschiede von"
+
+#: templates/history/header.inc:27
+msgid "Diff To"
+msgstr "Unterschiede zu"
+
+#: diff.php:56 templates/sync/diff.inc:101 templates/diff/diff.inc:2
+#, php-format
+msgid "Diff for %s between %s and %s"
+msgstr "Unterschiede in %s zwischen %s und %s"
+
+#: lib/Page/SyncPages.php:251
+msgid "Display"
+msgstr "Anzeige"
+
+#: templates/pagelist/summary.inc:3
+#, php-format
+msgid "Display %s"
+msgstr "%s anzeigen"
+
+#: templates/history/summary.inc:2 templates/pagelist/summary.inc:6
+#, php-format
+msgid "Display Version %s"
+msgstr "Version %s anzeigen"
+
+#: templates/sync/list.inc:35 templates/sync/diff.inc:96
+msgid "Download"
+msgstr "Herunterladen"
+
+#: templates/display/standard.inc:136
+#, fuzzy
+msgid "Download this page as:"
+msgstr "Diese Ergebnisse herunterladen als: "
+
+#: templates/display/AttachedFiles.html:13
+msgid "Downloads"
+msgstr "Downloads"
+
+#: lib/Page/SyncPages.php:389
+#, fuzzy
+msgid "Downloded from remote server"
+msgstr "Ihre Server:"
+
+#: lib/Page/SyncPages.php:237
+#, fuzzy
+msgid "Driver"
+msgstr "Auslieferung"
+
+#: lib/Page/SyncPages.php:254
+msgid "Edit"
+msgstr "Bearbeiten"
+
+#: preview.php:24 templates/display/standard.inc:24
+#, php-format
+msgid "Edit %s"
+msgstr "%s Bearbeiten"
+
+#: templates/history/header.inc:18
+msgid "Edit Version"
+msgstr "Version bearbeiten"
+
+#: templates/history/summary.inc:16
+#, php-format
+msgid "Edit Version %s"
+msgstr "Version %s bearbeiten"
+
+#: templates/sync/diff.inc:98
+#, fuzzy
+msgid "Edit local"
+msgstr "Block bearbeiten"
+
+#: templates/sync/diff.inc:99
+#, fuzzy
+msgid "Edit remote"
+msgstr "Notiz bearbeiten"
+
+#: templates/edit/standard.inc:21 lib/Page/EditPage.php:93
+msgid "EditPage"
+msgstr "SeiteBearbeiten"
+
+#: templates/display/AttachedFiles.html:67
+msgid "Enter a name for this file (if blank, will use the file's current name)"
+msgstr ""
+"Geben Sie einen Namen für diese Datei an (Dateiname wird verwendet, falls "
+"nichts anderen angegeben)"
+
+#: scripts/mail-filter.php:127
+#, php-format
+msgid "Error creating new page: %s"
+msgstr "Fehler beim Anlegen einer neuen Seite: %s"
+
+#: lib/Page/MergeOrRename.php:202
+#, php-format
+msgid "Error deleting %s: %s"
+msgstr "Fehler beim Löschen von %s: %s"
+
+#: scripts/mail-filter.php:42
+#, php-format
+msgid "Error parsing MIME message: %s\n"
+msgstr "Fehler beim Einlesen der MIME-Nachricht: %s\n"
+
+#: lib/Page/MergeOrRename.php:217
+#, php-format
+msgid "Error renaming \"%s\": %s"
+msgstr "Fehler beim Umbenennen von \"%s\": %s"
+
+#: lib/Page/MergeOrRename.php:247
+#, php-format
+msgid "Error retrieving %s: %s"
+msgstr "Fehler beim Lesen von %s: %s"
+
+#: lib/Page/AttachedFiles.php:111 lib/Page/AttachedFiles.php:253
+#, php-format
+msgid "Error retrieving attachments: %s"
+msgstr "Fehler beim Lesen der Anhänge: %s"
+
+#: lib/Page/AddPage.php:68
+#, php-format
+msgid "Error retrieving templates: %s"
+msgstr "Fehler beim Laden der Vorlage: %s"
+
+#: lib/Page/MergeOrRename.php:194 lib/Page/MergeOrRename.php:274
+#, php-format
+msgid "Error updating %s: %s"
+msgstr "Fehler beim Aktualisieren von %s: %s"
+
+#: lib/Page/Search.php:165
+msgid "Exact Match"
+msgstr "Genaue Treffer"
+
+#: lib/Page/MergeOrRename.php:164
+#, php-format
+msgid "Failed to retrieve \"%s\": %s"
+msgstr "Fehler beim Anzeigen von \"%s\": %s"
+
+#: lib/Page/SyncPages.php:194 lib/Page/SyncPages.php:271
+#, fuzzy
+msgid "Fetch page list"
+msgstr "Nachrichten sammeln"
+
+#: templates/sync/diff.inc:54
+msgid "Found same content in history"
+msgstr ""
+
+#: lib/Page.php:274
+msgid "Guest"
+msgstr "Gast"
+
+#: templates/display/standard.inc:138
+msgid "HTML"
+msgstr "HTML"
+
+#: templates/display/standard.inc:85
+msgid "Hi_story"
+msgstr "_Geschichte"
+
+#: templates/display/standard.inc:84
+#, php-format
+msgid "History of %s"
+msgstr "Geschichte von %s"
+
+#: lib/Page/StandardPage/StdHistoryPage.php:46
+msgid "History page not found"
+msgstr "Geschichte nicht gefunden"
+
+#: history.php:30 templates/history/header.inc:7
+#, php-format
+msgid "History: %s"
+msgstr "Geschichte: %s"
+
+#: lib/Wicked.php:130
+msgid "HowTo_UseWiki"
+msgstr "Wi_kiAnleitung"
+
+#: templates/display/MergeOrRename.html:26
+msgid "If a page with the new name already exists, then"
+msgstr "Wenn bereits eine Seite mit dem neuen Namen existiert,"
+
+#: history.php:18 display.php:17
+msgid "Internal error viewing requested page"
+msgstr "Interner Fehler beim Anzeigen dieser Seite"
+
+#: diff.php:39
+#, php-format
+msgid "Internal error viewing requested page: %s"
+msgstr "Interner Fehler beim Anzeigen dieser Seite: %s"
+
+#: lib/api.php:418
+msgid "Invalid page requested."
+msgstr "Ungültige Seite angefordert."
+
+#: templates/display/AttachedFiles.html:133
+msgid "Is this a minor update?"
+msgstr "Handelt es sich um eine kleinere Änderung?"
+
+#: templates/display/standard.inc:72
+msgid "L_ikePages"
+msgstr "Ähnl_icheSeiten"
+
+#: templates/display/title.inc:6 templates/edit/standard.inc:20
+#, php-format
+msgid "Last Modified %s by %s"
+msgstr "Letzte Änderung am %s durch %s"
+
+#: templates/display/standard.inc:139
+#, fuzzy
+msgid "Latex"
+msgstr "Datum"
+
+#: lib/Page/LeastPopular.php:93
+msgid "LeastPopular"
+msgstr "Unbeliebteste"
+
+#: templates/display/standard.inc:72
+msgid "LikePages"
+msgstr "ÄhnlicheSeiten"
+
+#: lib/Page/LikePages.php:82
+#, php-format
+msgid "LikePages: %s"
+msgstr "ÄhnlicheSeiten: %s"
+
+#: templates/sync/diff.inc:32 templates/sync/diff.inc:68
+#: lib/Page/SyncDiff.php:80 lib/Page/SyncDiff.php:86
+msgid "Local"
+msgstr "Lokal"
+
+#: templates/sync/diff.inc:22 templates/sync/diff.inc:58
+msgid "Location"
+msgstr "Ort"
+
+#: templates/display/standard.inc:40
+#, php-format
+msgid "Lock %s"
+msgstr "%s sperren"
+
+#: templates/display/title.inc:34 templates/edit/standard.inc:21
+#: lib/Page/DeletePage.php:97 lib/Page/RevertPage.php:81
+msgid "Locked"
+msgstr "Gesperrt"
+
+#: scripts/wicked.php:104
+#, php-format
+msgid "Logged in successfully as \"%s\"."
+msgstr "Erfolgreich als \"%s\" angemeldet."
+
+#: scripts/wicked.php:100
+msgid "Login is incorrect."
+msgstr "Anmeldedaten sind nicht korrekt."
+
+#: scripts/wicked.php:158
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too."
+msgstr ""
+"Pflichtwerte für lange Parameter sind auch für kurze Parameter verpflichtend."
+
+#: templates/display/standard.inc:60
+msgid "MergeOrRename"
+msgstr "Umbenennen"
+
+#: lib/Page/MergeOrRename.php:125
+#, php-format
+msgid "MergeOrRename: %s"
+msgstr "Umbenennen: %s"
+
+#: lib/Page/MergeOrRename.php:207
+#, php-format
+msgid "Merged \"%s\" into \"%s\"."
+msgstr "\"%s\" mit \"%s\" zusammengeführt."
+
+#: lib/Page/MergeOrRename.php:210
+#, php-format
+msgid "Merged \"%s\" into \"%s\". New page: %s\n"
+msgstr "\"%s\" mit \"%s\" zusammengeführt. Neue Seite: %s\n"
+
+#: lib/Page/MergeOrRename.php:191
+#, php-format
+msgid "Merged from %s"
+msgstr "Zusammengeführt von %s:"
+
+#: templates/edit/standard.inc:30
+msgid "Minor Change"
+msgstr "Kleinere Änderung"
+
+#: lib/Page/MostPopular.php:93
+msgid "MostPopular"
+msgstr "Beliebteste"
+
+#: lib/Block/page.php:41
+msgid "Name of wiki page to display"
+msgstr "Name der anzuzeigenden Wikiseite"
+
+#: lib/Page.php:263
+msgid "Never"
+msgstr "Nie"
+
+#: lib/Page/AttachedFiles.php:303
+#, php-format
+msgid "New attachment \"%s\" to page \"%s\"."
+msgstr "Neuer Anhang \"%s\" für Seite \"%s\"."
+
+#: templates/display/MergeOrRename.html:15
+msgid "New name"
+msgstr "Neuer Name"
+
+#: lib/Page/MergeOrRename.php:151
+msgid "New name is the same as old name."
+msgstr "Neuer Name ist der gleiche wie der alte."
+
+#: templates/sync/list.inc:42
+msgid "New pages on local server"
+msgstr ""
+
+#: templates/sync/list.inc:16
+#, fuzzy
+msgid "New pages on remote server"
+msgstr "Ihre Server:"
+
+#: lib/Page/NewPage.php:112
+msgid "NewPage"
+msgstr "NeueSeite"
+
+#: templates/edit/new.inc:20
+#, php-format
+msgid "NewPage: %s"
+msgstr "NeueSeite: %s"
+
+#: lib/api.php:352 lib/Page/SyncPages.php:387 lib/Page/EditPage.php:124
+msgid "No changes made"
+msgstr "Keine Änderungen vorgenommen"
+
+#: templates/sync/list.inc:18 templates/sync/list.inc:44
+#, fuzzy
+msgid "No pages found"
+msgstr "Keine Gesichter gefunden"
+
+#: templates/sync/list.inc:70
+#, fuzzy
+msgid "No pages to sync"
+msgstr "Keine Nachrichten"
+
+#: lib/Driver.php:124
+msgid "Not implemented."
+msgstr "Nicht implementiert."
+
+#: templates/pagelist/header.inc:5 templates/sync/list.inc:21
+#: templates/sync/list.inc:47 templates/sync/list.inc:73
+#: templates/edit/create.inc:17 lib/Page/Search.php:156
+msgid "Page"
+msgstr "Seite"
+
+#: lib/Page/MergeOrRename.php:179
+#, php-format
+msgid "Page \"%s\" already exists."
+msgstr "Die Seite \"%s\" existiert bereits."
+
+#: lib/Page/SyncPages.php:395
+#, php-format
+msgid "Page \"%s\" was sucessfuly downloaded from remote to local wiki."
+msgstr ""
+
+#: lib/Page/SyncPages.php:425
+#, fuzzy, php-format
+msgid "Page \"%s\" was sucessfuly uploaded from local to remote wiki."
+msgstr "Der Eintrag \"%s\" wurde erfolgreich dem Adressbuch hinzugefügt"
+
+#: lib/Page/NewPage.php:138
+msgid "Page Created"
+msgstr "Seite Erstellt"
+
+#: lib/Page/EditPage.php:131
+msgid "Page Saved"
+msgstr "Seite gespeichert"
+
+#: templates/edit/create.inc:35
+msgid "Page Template:"
+msgstr "Seitenvorlage:"
+
+#: lib/Page/Search.php:179
+msgid "Page Text Matches"
+msgstr "Gefundene Texttreffer"
+
+#: lib/Page/Search.php:172
+msgid "Page Title Matches"
+msgstr "Gefundene Titeltreffer"
+
+#: templates/pagelist/header.inc:10
+msgid "Page Views"
+msgstr "Seitenaufrufe"
+
+#: display.php:31
+#, php-format
+msgid "Page failed to lock: %s"
+msgstr "Fehler beim Blockieren der Seite: %s"
+
+#: display.php:46
+#, php-format
+msgid "Page failed to unlock: %s"
+msgstr "Fehler beim Freigeben der Seite: %s"
+
+#: display.php:34
+msgid "Page locked"
+msgstr "Seite blockiert"
+
+#: lib/Driver/sql.php:592 lib/Page/AddPage.php:53 lib/Page/NewPage.php:72
+msgid "Page name must not be empty"
+msgstr "Der Seitenname darf nicht leer sein."
+
+#: display.php:49
+msgid "Page unlocked"
+msgstr "Seite freigegeben"
+
+#: lib/api.php:114 lib/api.php:117
+msgid "Pages"
+msgstr "Seiten"
+
+#: lib/Page/NewPage.php:129
+msgid "Pages cannot be empty."
+msgstr "Seiten dürfen nicht leer sein."
+
+#: templates/sync/list.inc:68
+msgid "Pages to sync"
+msgstr ""
+
+#: lib/Page/SyncPages.php:249
+msgid "Password"
+msgstr "Passwort"
+
+#: templates/display/standard.inc:100
+msgid "Permissio_ns"
+msgstr "_Rechte"
+
+#: lib/api.php:414
+msgid "Permission denied."
+msgstr "Zugriff verweigert."
+
+#: templates/display/standard.inc:137
+msgid "Plain Text"
+msgstr "Einfacher Text"
+
+#: lib/Page/SyncPages.php:240
+msgid "Prefix"
+msgstr "Präfix"
+
+#: templates/edit/new.inc:25 templates/edit/standard.inc:26
+msgid "Preview"
+msgstr "Vorschau"
+
+#: lib/Page/EditPage.php:112
+msgid "Random string did not match."
+msgstr "Die Buchstaben stimmen nicht überein."
+
+#: lib/Page/RecentChanges.php:114
+msgid "RecentChanges"
+msgstr "LetzteÄnderungen"
+
+#: lib/Page/AttachedFiles.php:67
+#, php-format
+msgid "Referrer \"%s\" does not exist."
+msgstr "Der Referrer \"%s\" existiert nicht."
+
+#: lib/Page/AttachedFiles.php:129
+#, php-format
+msgid "Reload \"%s\""
+msgstr "\"%s\" aktualisieren"
+
+#: templates/history/header.inc:8
+msgid "Reload History"
+msgstr "Geschichte aktualisieren"
+
+#: templates/display/title.inc:32 templates/display/title.inc:33
+msgid "Reload Page"
+msgstr "Seite aktualisieren"
+
+#: templates/sync/diff.inc:40 templates/sync/diff.inc:76
+#: lib/Page/SyncDiff.php:81 lib/Page/SyncDiff.php:85
+msgid "Remote"
+msgstr "Extern"
+
+#: lib/Page/SyncPages.php:194 lib/Page/SyncPages.php:300
+msgid "Remove login info"
+msgstr "Anmeldedaten entfernen"
+
+#: lib/Page/MergeOrRename.php:222
+#, php-format
+msgid "Renamed \"%s\" to \"%s\"."
+msgstr "\"%s\" nach \"%s\" umbenannt."
+
+#: lib/Page/MergeOrRename.php:225
+#, php-format
+msgid "Renamed \"%s\" to \"%s\". New page: %s\n"
+msgstr "\"%s\" nach \"%s\" umbenannt. Neue Seite: %s\n"
+
+#: lib/Driver/sql.php:681
+#, php-format
+msgid "Renamed page from %s"
+msgstr "Seite umbenannt von %s"
+
+#: lib/Page/SyncPages.php:194
+msgid "Reset"
+msgstr "Zurücksetzen"
+
+#: templates/history/header.inc:20
+msgid "Restore Version"
+msgstr "Version wiederherstellen"
+
+#: lib/Page/RevertPage.php:87
+msgid "Revert"
+msgstr "Wiederherstellen"
+
+#: templates/history/summary.inc:26
+#, php-format
+msgid "Revert to version %s"
+msgstr "Version %s wiederherstellen"
+
+#: lib/Page/RevertPage.php:81 lib/Page/RevertPage.php:104
+msgid "RevertPage"
+msgstr "SeiteWiederherstellen"
+
+#: lib/Page/RevertPage.php:127
+#, php-format
+msgid "Reverted to version %s of \"%s\"."
+msgstr "Version %s von \"%s\" wiederhergestellt."
+
+#: lib/Driver/sql.php:596
+msgid "Robots are not allowed to create pages"
+msgstr "Roboter dürfen keine Seiten erstellen"
+
+#: templates/edit/new.inc:24 templates/edit/standard.inc:25
+msgid "Save"
+msgstr "Speichern"
+
+#: lib/Page/EditPage.php:128
+#, php-format
+msgid "Save Failed: %s"
+msgstr "Speichern fehlgeschlagen: %s"
+
+#: lib/Page/SyncPages.php:194 lib/Page/SyncPages.php:288
+msgid "Save login info"
+msgstr ""
+
+#: templates/menu.inc:17 lib/Page/Search.php:204
+msgid "Search"
+msgstr "Suche"
+
+#: templates/pagelist/search.inc:1
+msgid "Search Results"
+msgstr "Suchergebnisse"
+
+#: templates/display/AttachedFiles.html:58
+#: templates/display/AttachedFiles.html:110
+msgid "Select file to attach:"
+msgstr "Wählen Sie die Datei aus, die angehängt werden soll:"
+
+#: templates/display/AttachedFiles.html:119
+msgid "Select the file to update"
+msgstr "Wählen Sie die Datei aus, die aktualisiert werden soll"
+
+#: templates/display/standard.inc:99
+#, php-format
+msgid "Set permissions for %s"
+msgstr "Rechte für %s festlegen"
+
+#: templates/sync/list.inc:79
+msgid "Show changes"
+msgstr "Änderungen anzeigen"
+
+#: templates/display/title.inc:16 lib/Page/RecentChanges.php:57
+#, php-format
+msgid "Show changes for %s"
+msgstr "Änderungen für %s anzeigen"
+
+#: lib/Page/RecentChanges.php:64
+#, php-format
+msgid "Show version %s"
+msgstr "Version %s anzeigen"
+
+#: templates/edit/standard.inc:41
+msgid "Spam Protection - Enter the letters below:"
+msgstr "Spamschutz - Geben sie die Buchstaben unten ein:"
+
+#: templates/display/MergeOrRename.html:33
+msgid "Stop and don't do anything"
+msgstr "abbrechen und nichts ändern"
+
+#: lib/Page/SyncPages.php:231
+msgid "Stored"
+msgstr "Gespeichert"
+
+#: templates/display/MergeOrRename.html:61
+msgid "Submit"
+msgstr "Abschicken"
+
+#: lib/Page/DeletePage.php:136
+#, php-format
+msgid "Successfully deleted \"%s\"."
+msgstr "\"%s\" wurde erfolgreich gelöscht."
+
+#: lib/Page/AttachedFiles.php:207
+#, php-format
+msgid "Successfully deleted version %s of \"%s\" from \"%s\""
+msgstr "Version %s von \"%s\" erfolgreich aus \"%s\" gelöscht"
+
+#: lib/Page/SyncPages.php:193
+msgid "Sync data"
+msgstr ""
+
+#: lib/Page/SyncPages.php:305
+msgid "Sync login info was removed."
+msgstr ""
+
+#: lib/Page/SyncPages.php:295
+#, fuzzy
+msgid "Sync login info was stored"
+msgstr "Falscher Benutzername oder Passwort."
+
+#: lib/Page/SyncDiff.php:129
+#, fuzzy
+msgid "SyncDiff"
+msgstr "Unterschiede"
+
+#: lib/Page/SyncPages.php:169
+#, fuzzy
+msgid "SyncPages"
+msgstr "Seiten"
+
+#: lib/Page/SyncDiff.php:52
+#, fuzzy
+msgid "Synchronization is disabled"
+msgstr "Konto ist deaktiviert"
+
+#: lib/Page.php:488
+msgid "Table of Contents"
+msgstr "Inhaltsverzeichnis"
+
+#: lib/Page/AttachedFiles.php:280
+#, php-format
+msgid "There is already an attachment named \"%s\"."
+msgstr "Es existiert bereits ein Anhang mit dem Namen \"%s\"."
+
+#: lib/Page/MergeOrRename.php:149 lib/Page/MergeOrRename.php:155
+msgid "This is a required field."
+msgstr "Dies ist ein Pflichtfeld."
+
+#: display.php:61
+msgid "This page does not have a history"
+msgstr "Diese Seite hat keine Geschichte"
+
+#: lib/Page/MergeOrRename.php:100
+#, php-format
+msgid "This page is referenced from %d other page(s)."
+msgstr "Auf diese Seite wird von %d anderen Seite(n) verwiesen."
+
+#: templates/display/standard.inc:35
+msgid "Un_lock"
+msgstr "_Freigeben"
+
+#: lib/Page/StandardPage.php:81
+#, php-format
+msgid "Unable to create %s"
+msgstr "%s kann nicht erstellt werden"
+
+#: lib/Page/StandardPage.php:89
+msgid "Unable to create WikiHome. The wiki is not configured."
+msgstr ""
+"WikiHome kann nicht erstellt werden. Das Wiki wurde nicht konfiguriert."
+
+#: templates/display/standard.inc:34
+#, php-format
+msgid "Unlock %s"
+msgstr "%s freigeben"
+
+#: lib/Sync.php:78 lib/Sync.php:90 lib/Sync.php:102 lib/Sync.php:114
+#: lib/Sync.php:126 lib/Sync.php:142 lib/Driver.php:78 lib/Driver.php:92
+#: lib/Driver.php:104 lib/Driver.php:109 lib/Driver.php:129 lib/Driver.php:134
+#: lib/Driver.php:192 lib/Driver.php:197 lib/Driver.php:209 lib/Driver.php:223
+#: lib/Driver.php:237 lib/Driver.php:251 lib/Driver.php:256 lib/Driver.php:261
+#: lib/Driver.php:279 lib/Driver.php:399 lib/Driver.php:425 lib/Driver.php:441
+#: lib/Page.php:255 lib/Page.php:289 lib/Page.php:294 lib/Page.php:393
+#: lib/Page.php:403 lib/Page.php:413 lib/Page.php:423 lib/Page.php:523
+#: lib/Page.php:534 lib/Page.php:539 lib/Page.php:544 lib/Page.php:549
+#: lib/Page.php:589
+msgid "Unsupported"
+msgstr "Nicht unterstützt"
+
+#: templates/display/AttachedFiles.html:154
+msgid "Update File"
+msgstr "Datei aktualisieren"
+
+#: templates/display/AttachedFiles.html:104
+msgid "Update an Attachment"
+msgstr "Anhang aktualsieren"
+
+#: lib/Page/AttachedFiles.php:300
+#, php-format
+msgid "Updated attachment \"%s\" on page \"%s\"."
+msgstr "Anhang \"%s\" von Seite \"%s\" aktualisiert."
+
+#: templates/sync/list.inc:61 templates/sync/diff.inc:97
+msgid "Upload"
+msgstr "Hochladen"
+
+#: lib/Page/SyncPages.php:419
+#, fuzzy
+msgid "Uploaded from remote server"
+msgstr "Ihre Server:"
+
+#: lib/Page/SyncPages.php:243
+msgid "Url"
+msgstr ""
+
+#: scripts/wicked.php:156
+#, php-format
+msgid "Usage: %s [OPTIONS]..."
+msgstr "Aufruf: %s [OPTIONEN]..."
+
+#: lib/Page/SyncPages.php:246
+msgid "User"
+msgstr "Benutzer"
+
+#: templates/history/header.inc:13 templates/pagelist/header.inc:6
+#: templates/sync/list.inc:22 templates/sync/list.inc:48
+#: templates/sync/diff.inc:23 templates/sync/diff.inc:59
+#: templates/edit/create.inc:18 lib/Page/Search.php:157
+#: templates/display/AttachedFiles.html:9
+msgid "Version"
+msgstr "Version"
+
+#: lib/Page/SyncPages.php:178
+#, fuzzy
+msgid "View local"
+msgstr "Warenkorb anzeigen"
+
+#: lib/Page/AttachedFiles.php:309
+msgid "View page: "
+msgstr "Seite anzeigen: "
+
+#: lib/Page/SyncPages.php:180
+#, fuzzy
+msgid "View remote"
+msgstr "Kontakt anzeigen"
+
+#: lib/Page/SyncPages.php:237
+#, fuzzy
+msgid "Wicked"
+msgstr "Gesperrt"
+
+#: lib/api.php:374
+msgid "Wiki Templates"
+msgstr "Wiki-Vorlagen"
+
+#: lib/Block/page.php:3
+msgid "Wiki page"
+msgstr "Wikiseite"
+
+#: display.php:25
+msgid "You are not allowed to lock this page"
+msgstr "Sie dürfen diese Seite nicht blockieren."
+
+#: display.php:40
+msgid "You are not allowed to unlock this page"
+msgstr "Sie dürfen diese Seite nicht freigeben."
+
+#: lib/Page/AttachedFiles.php:196
+msgid "You do not have permission to delete attachments from this page."
+msgstr ""
+"Sie haben nicht genügend Rechte, um Anhänge von dieser Seite zu löschen."
+
+#: lib/Page/AttachedFiles.php:237 lib/Page/MergeOrRename.php:169
+#: lib/Page/MergeOrRename.php:184
+#, php-format
+msgid "You do not have permission to edit \"%s\""
+msgstr "Sie haben nicht genügend Rechte, um \"%s\" zu bearbeiten"
+
+#: lib/Page/NewPage.php:125
+#, php-format
+msgid "You don't have permission to create \"%s\"."
+msgstr "Sie haben nicht genügend Rechte, um \"%s\" zu erstellen."
+
+#: lib/Page/DeletePage.php:150
+#, php-format
+msgid "You don't have permission to delete \"%s\"."
+msgstr "Sie haben nicht genügend Rechte, um \"%s\" zu löschen."
+
+#: lib/api.php:334 lib/Page/SyncPages.php:371 lib/Page/EditPage.php:107
+#: lib/Page/RevertPage.php:133
+#, php-format
+msgid "You don't have permission to edit \"%s\"."
+msgstr "Sie haben nicht genügend Rechte, um \"%s\" zu bearbeiten."
+
+#: display.php:70 display.php:73 display.php:116 display.php:119
+msgid "You don't have permission to view this page."
+msgstr "Sie haben nicht die nötigen Rechte um diese Seite anzuzeigen."
+
+#: lib/Page/AttachedFiles.php:245
+msgid "You must enter a change description to attach this file."
+msgstr "Sie müssen einen Änderungseintrag eingeben, um diese Datei anzuhängen."
+
+#: lib/api.php:338 lib/Page/EditPage.php:118
+msgid "You must provide a change log."
+msgstr "Sie müssen einen Änderungseintrag angeben."
+
+#: lib/Wicked.php:130
+msgid "_AllPages"
+msgstr "_AlleSeiten"
+
+#: templates/display/standard.inc:67
+msgid "_BackLinks"
+msgstr "Rück_Verweise"
+
+#: templates/display/standard.inc:53
+msgid "_Delete"
+msgstr "Lös_chen"
+
+#: templates/display/standard.inc:25
+msgid "_EditPage"
+msgstr "Seite_Bearbeiten"
+
+#: templates/display/standard.inc:41
+msgid "_Lock"
+msgstr "S_perren"
+
+#: templates/display/standard.inc:61
+msgid "_MergeOrRename"
+msgstr "_Umbenennen"
+
+#: lib/Wicked.php:130
+msgid "_RecentChanges"
+msgstr "_LetzteÄnderungen"
+
+#: lib/Wicked.php:130
+msgid "_WikiHome"
+msgstr "_WikiHome"
+
+#: lib/Page/AttachedFiles.php:217
+msgid "attachment"
+msgstr "Anhang"
+
+#: scripts/wicked.php:123
+#, php-format
+msgid "page \"%s\" doesn't exist."
+msgstr "Seite \"%s\" existiert nicht."
--- /dev/null
+# Spanish translations for wicked package
+# Traducciones al español para el paquete wicked.
+# Copyright 2008-2009 The Horde Project
+# This file is distributed under the same license as the wicked package.
+# Automatically generated, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Wicked 1.0-cvs\n"
+"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
+"POT-Creation-Date: 2008-03-20 10:33+0100\n"
+"PO-Revision-Date: 2008-03-20 10:33+0100\n"
+"Last-Translator: Manuel P. Ayala <mayala@unex.es>\n"
+"Language-Team: i18n@lists.horde.org\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: lib/Page/Search.php:111
+#, php-format
+msgid "%s Does not exist. You can create it now."
+msgstr "%s no existe. Puede crearlo ahora."
+
+#: templates/edit/create.inc:13
+#, php-format
+msgid ""
+"%s does not exist, but maybe you were looking for one of the following pages?"
+msgstr "%s no existe, pero ¿quizá buscaba alguna de las páginas siguientes?"
+
+#: templates/edit/create.inc:30
+#, php-format
+msgid ""
+"%s does not exist. Click on \"Create\" below if you want to create this page "
+"now and start editing."
+msgstr ""
+"%s no existe. Pulse sobre el vínculo \"Crear\" si desea añadir esta página "
+"ahora y empezar a modificarla."
+
+#: templates/edit/create.inc:37
+msgid "(None)"
+msgstr "(Ninguno)"
+
+#: scripts/wicked.php:161
+msgid ""
+"-d, --debug Run in debug mode (displays extra information)"
+msgstr ""
+"-d, --debug Ejecutar en modo de depuración (muestra "
+"información adicional)"
+
+#: scripts/wicked.php:163
+msgid ""
+"-g, --get[=pagetitle] Return all pages (unless pagetitle specified)"
+msgstr ""
+"-g, --get[=título de la página] Devuelve todas las páginas (si no se indica "
+"un título congreto)"
+
+#: scripts/wicked.php:160
+msgid "-h, --help Show this help"
+msgstr "-h, --help Muestra esta ayuda"
+
+#: scripts/wicked.php:162
+msgid "-l, --list-pages List pages"
+msgstr "-l, --list-pages Lista las páginas"
+
+#: scripts/wicked.php:164
+msgid "-o, --out[=type] Output type for results (default:xml)"
+msgstr ""
+"-o, --out[=formato] Formato de salida de los resultados (por "
+"omisión:xml)"
+
+#: scripts/wicked.php:166
+msgid "-p, --password[=password] Horde login password"
+msgstr "-p, --password[=contraseña] Contraseña de inicio de Horde"
+
+#: scripts/wicked.php:165
+msgid "-u, --username[=username] Horde login username"
+msgstr "-u, --usename[=nombre de usuario] Nombre de usuario de inicio de Horde"
+
+#: templates/display/MergeOrRename.html:31
+msgid "Add the text from this page"
+msgstr "Añadir el texto de esta página"
+
+#: lib/Page/AddPage.php:98
+#, php-format
+msgid "AddPage: %s"
+msgstr "AñadirPágina: %s"
+
+#: lib/Page/AllPages.php:90
+msgid "AllPages"
+msgstr "TodasLasPáginas"
+
+#: lib/Page/DeletePage.php:83
+msgid ""
+"Are you sure you want to delete this page? All versions will be permanently "
+"removed."
+msgstr ""
+"¿Seguro que desea eliminar esta página? Se perderán definitivamente todas "
+"sus versiones."
+
+#: lib/Page/DeletePage.php:85
+#, php-format
+msgid "Are you sure you want to delete version %s of this page?"
+msgstr "¿Seguro que desea eliminar la versión %s de esta página?"
+
+#: lib/Page/RevertPage.php:71
+#, php-format
+msgid "Are you sure you want to revert to version %s of this page?"
+msgstr "¿Seguro que desea volver a la versión %s de esta página?"
+
+#: templates/display/AttachedFiles.html:88
+msgid "Attach File"
+msgstr "Adjuntar archivo"
+
+#: templates/display/AttachedFiles.html:52
+msgid "Attach a New File"
+msgstr "Adjuntar un archivo"
+
+#: templates/display/standard.inc:77
+msgid "AttachedFiles"
+msgstr "ArchivosAdjuntados"
+
+#: lib/Page/AttachedFiles.php:171
+#, php-format
+msgid "AttachedFiles: %s"
+msgstr "ArchivosAdjuntados: %s"
+
+#: templates/display/standard.inc:78
+msgid "Attached_Files"
+msgstr "Archivos_Adjuntados"
+
+#: templates/display/AttachedFiles.html:7
+msgid "Attachment Name"
+msgstr "Nombre del adjunto"
+
+#: templates/display/standard.inc:117
+msgid "Attachments"
+msgstr "Adjuntos"
+
+#: lib/Page/AttachedFiles.php:225
+msgid "Attachments with spaces can't be embedded into a page."
+msgstr "Los adjuntos con espacios no se pueden incluir en una página."
+
+#: templates/edit/create.inc:19 templates/history/header.inc:23
+#: templates/pagelist/header.inc:7 lib/Page/Search.php:157
+#: templates/display/AttachedFiles.html:10
+msgid "Author"
+msgstr "Autor"
+
+#: templates/display/standard.inc:104
+msgid "Ba_ck to"
+msgstr "_Regresar a"
+
+#: templates/display/standard.inc:104
+msgid "Back to"
+msgstr "Regresar a"
+
+#: templates/display/standard.inc:67
+msgid "BackLinks"
+msgstr "VínculosAnteriores"
+
+#: lib/Page/BackLinks.php:80
+#, php-format
+msgid "BackLinks: %s"
+msgstr "VínculosAnteriores: %s"
+
+#: lib/Page/AttachedFiles.php:231
+msgid "Can't read uploaded file."
+msgstr "No se puede leer el archivo cargado."
+
+#: lib/Page/RevertPage.php:120
+#, php-format
+msgid "Can't revert to an unknown version."
+msgstr "No se puede volver a una versión desconocida."
+
+#: lib/Page/AttachedFiles.php:271
+#, php-format
+msgid "Can't update \"%s\": no such attachment."
+msgstr "No se puede actualizar \"%s\": no existe el adjunto."
+
+#: templates/edit/create.inc:47 templates/edit/standard.inc:27
+#: lib/Page/MergeOrRename.php:140 lib/Page/RevertPage.php:88
+#: lib/Page/DeletePage.php:104 templates/display/MergeOrRename.html:62
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: templates/history/header.inc:29 templates/display/AttachedFiles.html:12
+msgid "Change Log"
+msgstr "Registro del cambio"
+
+#: templates/edit/standard.inc:29
+msgid "Change log"
+msgstr "Registro del cambio"
+
+#: templates/display/AttachedFiles.html:80
+#: templates/display/AttachedFiles.html:146
+msgid "Change log entry"
+msgstr "Entrada de registro del cambio"
+
+#: templates/display/MergeOrRename.html:40
+msgid "Change references to this page from:"
+msgstr "Cambiar las referencias a esta página desde:"
+
+#: lib/Page/MergeOrRename.php:253
+#, php-format
+msgid "Changed references from %s to %s"
+msgstr "Se han cambiado las referencias de %s a %s"
+
+#: templates/edit/standard.inc:28
+msgid "Changelog is required"
+msgstr "Hace falta el binario de changelog"
+
+#: templates/edit/create.inc:26
+msgid ""
+"Click on \"Create\" below if you want to create this page now and start "
+"editing."
+msgstr ""
+"Pulse sobre el vínculo \"Crear\" si desea añadir esta página ahora y empezar "
+"a modificarla."
+
+#: scripts/wicked.php:42
+msgid "Couldn't read command-line options."
+msgstr "No se pudieron leer las opciones de la línea de comandos."
+
+#: templates/edit/create.inc:46
+msgid "Create"
+msgstr "Crear"
+
+#: lib/Page/NewPage.php:129
+#, php-format
+msgid "Create Failed: %s"
+msgstr "Fallo al añadir: %s"
+
+#: templates/history/header.inc:24
+msgid "Created"
+msgstr "Creado"
+
+#: templates/edit/create.inc:20 templates/pagelist/header.inc:8
+#: lib/Page/Search.php:158
+msgid "Creation Date"
+msgstr "Fecha de creación"
+
+#: templates/display/AttachedFiles.html:11
+msgid "Date"
+msgstr "Fecha"
+
+#: lib/Page/DeletePage.php:103
+msgid "Delete"
+msgstr "Eliminar"
+
+#: templates/display/standard.inc:52
+#, php-format
+msgid "Delete %s"
+msgstr "Eliminar %s"
+
+#: templates/history/header.inc:16
+msgid "Delete Version"
+msgstr "Eliminar versión"
+
+#: templates/history/summary.inc:6
+#, php-format
+msgid "Delete Version %s"
+msgstr "Eliminar versión %s"
+
+#: lib/Page/DeletePage.php:97 lib/Page/DeletePage.php:120
+msgid "DeletePage"
+msgstr "Eliminar página"
+
+#: lib/Page/DeletePage.php:142
+#, php-format
+msgid "Deleted version %s of \"%s\"."
+msgstr "Se eliminó la versión %s de \"%s\"."
+
+#: templates/history/header.inc:26
+msgid "Diff From"
+msgstr "Diferencias desde"
+
+#: templates/history/header.inc:27
+msgid "Diff To"
+msgstr "Diferencias hasta"
+
+#: diff.php:56 templates/diff/diff.inc:2
+#, php-format
+msgid "Diff for %s between %s and %s"
+msgstr "Diferencias de %s entre %s y %s"
+
+#: templates/pagelist/summary.inc:3
+#, php-format
+msgid "Display %s"
+msgstr "Mostrar %s"
+
+#: templates/history/summary.inc:2 templates/pagelist/summary.inc:6
+#, php-format
+msgid "Display Version %s"
+msgstr "mostrar versión %s"
+
+#: templates/display/AttachedFiles.html:13
+msgid "Downloads"
+msgstr "Descargas"
+
+#: preview.php:24 templates/display/standard.inc:24
+#, php-format
+msgid "Edit %s"
+msgstr "Modificar %s"
+
+#: templates/history/header.inc:18
+msgid "Edit Version"
+msgstr "Modificar versión"
+
+#: templates/history/summary.inc:16
+#, php-format
+msgid "Edit Version %s"
+msgstr "Modificar versión %s"
+
+#: templates/edit/standard.inc:21 lib/Page/EditPage.php:93
+msgid "EditPage"
+msgstr "ModificarPágina"
+
+#: templates/display/AttachedFiles.html:67
+msgid "Enter a name for this file (if blank, will use the file's current name)"
+msgstr ""
+"Introduzca un nombre para el archivo (si se deja en blanco, se utilizará el "
+"nombre actual del archivo)"
+
+#: scripts/mail-filter.php:127
+#, php-format
+msgid "Error creating new page: %s"
+msgstr "Error al crear la página: %s"
+
+#: lib/Page/MergeOrRename.php:202
+#, php-format
+msgid "Error deleting %s: %s"
+msgstr "Error al eliminar la página %s: %s"
+
+#: scripts/mail-filter.php:42
+#, php-format
+msgid "Error parsing MIME message: %s\n"
+msgstr "Error al procesar el mensaje MIME: %s\n"
+
+#: lib/Page/MergeOrRename.php:217
+#, php-format
+msgid "Error renaming \"%s\": %s"
+msgstr "Error al renombrar la página \"%s\": %s"
+
+#: lib/Page/MergeOrRename.php:247
+#, php-format
+msgid "Error retrieving %s: %s"
+msgstr "Error al recuperar %s: %s"
+
+#: lib/Page/AttachedFiles.php:111 lib/Page/AttachedFiles.php:253
+#, php-format
+msgid "Error retrieving attachments: %s"
+msgstr "Error al recuperar los adjuntos: %s"
+
+#: lib/Page/AddPage.php:58
+#, php-format
+msgid "Error retrieving templates: %s"
+msgstr "Error al recuperar las plantillas: %s"
+
+#: lib/Page/MergeOrRename.php:194 lib/Page/MergeOrRename.php:274
+#, php-format
+msgid "Error updating %s: %s"
+msgstr "Error actualizando %s: %s"
+
+#: lib/Page/Search.php:164
+msgid "Exact Match"
+msgstr "Coincidencia exacta"
+
+#: lib/Page/MergeOrRename.php:164
+#, php-format
+msgid "Failed to retrieve \"%s\": %s"
+msgstr "Se produjo un error al recuperar \"%s\": %s"
+
+#: lib/Page.php:274
+msgid "Guest"
+msgstr "Invitado"
+
+#: templates/display/standard.inc:85
+msgid "Hi_story"
+msgstr "_Historial"
+
+#: templates/display/standard.inc:84
+#, php-format
+msgid "History of %s"
+msgstr "Historial de %s"
+
+#: lib/Page/StandardPage/StdHistoryPage.php:46
+msgid "History page not found"
+msgstr "No se ha encontrado la página de historial"
+
+#: history.php:30 templates/history/header.inc:7
+#, php-format
+msgid "History: %s"
+msgstr "Historial de %s"
+
+#: lib/Wicked.php:130
+msgid "HowTo_UseWiki"
+msgstr "WikiCómoSeUsa"
+
+#: templates/display/MergeOrRename.html:26
+msgid "If a page with the new name already exists, then"
+msgstr "Si ya existe una página con ese nombre, "
+
+#: history.php:18 display.php:18
+msgid "Internal error viewing requested page"
+msgstr "Error interno al ver la página solicitada"
+
+#: diff.php:39
+#, php-format
+msgid "Internal error viewing requested page: %s"
+msgstr "Error interno al ver la página solicitada: %s"
+
+#: templates/display/AttachedFiles.html:133
+msgid "Is this a minor update?"
+msgstr "¿Se trata de una actualización mínima?"
+
+#: templates/display/standard.inc:72
+msgid "L_ikePages"
+msgstr "Páginas_Favoritas"
+
+#: templates/display/title.inc:6 templates/edit/standard.inc:20
+#, php-format
+msgid "Last Modified %s by %s"
+msgstr "Última modificación el %s por %s"
+
+#: lib/Page/LeastPopular.php:93
+msgid "LeastPopular"
+msgstr "MenosPopulares"
+
+#: templates/display/standard.inc:72
+msgid "LikePages"
+msgstr "PáginasFavoritas"
+
+#: lib/Page/LikePages.php:82
+#, php-format
+msgid "LikePages: %s"
+msgstr "PáginasFavoritas: %s"
+
+#: templates/display/standard.inc:40
+#, php-format
+msgid "Lock %s"
+msgstr "Bloquear %s"
+
+#: templates/display/title.inc:34 templates/edit/standard.inc:21
+#: lib/Page/RevertPage.php:81 lib/Page/DeletePage.php:97
+msgid "Locked"
+msgstr "Bloqueado"
+
+#: scripts/wicked.php:104
+#, php-format
+msgid "Logged in successfully as \"%s\"."
+msgstr "Se inició sesión correctamente como \"%s\"."
+
+#: scripts/wicked.php:100
+msgid "Login is incorrect."
+msgstr "Inicio de sesión incorrecto."
+
+#: scripts/wicked.php:158
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too."
+msgstr ""
+"Los argumentos requeridos por las opciones completas también son requeridos "
+"en las opciones abreviadas."
+
+#: templates/display/standard.inc:60
+msgid "MergeOrRename"
+msgstr "CombinarORenombrar"
+
+#: lib/Page/MergeOrRename.php:125
+#, php-format
+msgid "MergeOrRename: %s"
+msgstr "CombinarORenombrar: %s"
+
+#: lib/Page/MergeOrRename.php:207
+#, php-format
+msgid "Merged \"%s\" into \"%s\"."
+msgstr "Se combinó \"%s\" en \"%s\"."
+
+#: lib/Page/MergeOrRename.php:210
+#, php-format
+msgid "Merged \"%s\" into \"%s\". New page: %s\n"
+msgstr "Se combinó \"%s\" en \"%s\". Nueva página: %s\n"
+
+#: lib/Page/MergeOrRename.php:191
+#, php-format
+msgid "Merged from %s"
+msgstr "Combinado desde %s"
+
+#: templates/edit/standard.inc:30
+msgid "Minor Change"
+msgstr "Cambio mínimo"
+
+#: lib/Page/MostPopular.php:93
+msgid "MostPopular"
+msgstr "MásPopulares"
+
+#: lib/Block/page.php:41
+msgid "Name of wiki page to display"
+msgstr "Nombre de la página wiki a mostrar"
+
+#: lib/Page.php:263
+msgid "Never"
+msgstr "Nunca"
+
+#: lib/Page/AttachedFiles.php:303
+#, php-format
+msgid "New attachment \"%s\" to page \"%s\"."
+msgstr "Añadir adjunto \"%s\" a la página \"%s\"."
+
+#: templates/display/MergeOrRename.html:15
+msgid "New name"
+msgstr "Nombre nuevo"
+
+#: lib/Page/MergeOrRename.php:151
+msgid "New name is the same as old name."
+msgstr "El nombre nuevo es el mismo que el antiguo."
+
+#: lib/Page/NewPage.php:106
+msgid "NewPage"
+msgstr "Añadir página"
+
+#: templates/edit/new.inc:20
+#, php-format
+msgid "NewPage: %s"
+msgstr "Añadir página: %s"
+
+#: lib/api.php:138 lib/Page/EditPage.php:124
+msgid "No changes made"
+msgstr "No se han hecho cambios"
+
+#: lib/Driver.php:124
+msgid "Not implemented."
+msgstr "Sin desarrollar."
+
+#: templates/edit/create.inc:17 templates/pagelist/header.inc:5
+#: lib/Page/Search.php:155
+msgid "Page"
+msgstr "Página"
+
+#: lib/Page/MergeOrRename.php:179
+#, php-format
+msgid "Page \"%s\" already exists."
+msgstr "La página \"%s\" ya existe."
+
+#: lib/Page/NewPage.php:132
+msgid "Page Created"
+msgstr "Página creada"
+
+#: lib/Page/EditPage.php:131
+msgid "Page Saved"
+msgstr "Se ha guardado la página"
+
+#: templates/edit/create.inc:35
+msgid "Page Template:"
+msgstr "Plantilla de página:"
+
+#: lib/Page/Search.php:178
+msgid "Page Text Matches"
+msgstr "Coincidencias en el texto de la página"
+
+#: lib/Page/Search.php:171
+msgid "Page Title Matches"
+msgstr "Coincidencias en el título de la página"
+
+#: templates/pagelist/header.inc:10
+msgid "Page Views"
+msgstr "Vistas de página"
+
+#: display.php:32
+#, php-format
+msgid "Page failed to lock: %s"
+msgstr "No se puede bloquear la página: %s"
+
+#: display.php:47
+#, php-format
+msgid "Page failed to unlock: %s"
+msgstr "No se puede desbloquear la página: %s"
+
+#: display.php:35
+msgid "Page locked"
+msgstr "Página bloqueada"
+
+#: display.php:50
+msgid "Page unlocked"
+msgstr "Página desbloqueada"
+
+#: lib/api.php:52 lib/api.php:55
+msgid "Pages"
+msgstr "Páginas"
+
+#: lib/Page/NewPage.php:123
+msgid "Pages cannot be empty."
+msgstr "Las páginas no pueden estar vacías."
+
+#: templates/display/standard.inc:100
+msgid "Permissio_ns"
+msgstr "_Permisos"
+
+#: templates/edit/new.inc:25 templates/edit/standard.inc:26
+msgid "Preview"
+msgstr "Vista previa"
+
+#: lib/Page/EditPage.php:112
+msgid "Random string did not match."
+msgstr "Las cadenas aleatorias no coincidían."
+
+#: lib/Page/RecentChanges.php:113
+msgid "RecentChanges"
+msgstr "Últimos cambios"
+
+#: lib/Page/AttachedFiles.php:67
+#, php-format
+msgid "Referrer \"%s\" does not exist."
+msgstr "La referencia \"%s\" no existe."
+
+#: lib/Page/AttachedFiles.php:129
+#, php-format
+msgid "Reload \"%s\""
+msgstr "Actualizar \"%s\""
+
+#: templates/history/header.inc:8
+msgid "Reload History"
+msgstr "Actualizar historial"
+
+#: templates/display/title.inc:32 templates/display/title.inc:33
+msgid "Reload Page"
+msgstr "Actualizar página"
+
+#: lib/Page/MergeOrRename.php:222
+#, php-format
+msgid "Renamed \"%s\" to \"%s\"."
+msgstr "Se ha renombrado \"%s\" como \"%s\""
+
+#: lib/Page/MergeOrRename.php:225
+#, php-format
+msgid "Renamed \"%s\" to \"%s\". New page: %s\n"
+msgstr "Se ha renombrado \"%s\" como \"%s\". Página nueva: %s\n"
+
+#: lib/Driver/sql.php:674
+#, php-format
+msgid "Renamed page from %s"
+msgstr "Se ha renombrado la página de %s"
+
+#: templates/history/header.inc:20
+msgid "Restore Version"
+msgstr "Restaurar versión"
+
+#: lib/Page/RevertPage.php:87
+msgid "Revert"
+msgstr "Restaurar"
+
+#: templates/history/summary.inc:26
+#, php-format
+msgid "Revert to version %s"
+msgstr "Restaurar versión %s"
+
+#: lib/Page/RevertPage.php:81 lib/Page/RevertPage.php:104
+msgid "RevertPage"
+msgstr "Restaurar página"
+
+#: lib/Page/RevertPage.php:127
+#, php-format
+msgid "Reverted to version %s of \"%s\"."
+msgstr "Se ha vuelto a la versión %s de \"%s\"."
+
+#: lib/Driver/sql.php:589
+msgid "Robots are not allowed to create pages."
+msgstr "Los robots carecen de permisos para añadir páginas."
+
+#: templates/edit/new.inc:24 templates/edit/standard.inc:25
+msgid "Save"
+msgstr "Guardar"
+
+#: lib/Page/EditPage.php:128
+#, php-format
+msgid "Save Failed: %s"
+msgstr "Fallo al guardar: %s"
+
+#: templates/menu.inc:19 lib/Page/Search.php:203
+msgid "Search"
+msgstr "Buscar"
+
+#: templates/pagelist/search.inc:1
+msgid "Search Results"
+msgstr "Resultados de la búsqueda"
+
+#: templates/display/AttachedFiles.html:58
+#: templates/display/AttachedFiles.html:110
+msgid "Select file to attach:"
+msgstr "Seleccione el archivo a adjuntar:"
+
+#: templates/display/AttachedFiles.html:119
+msgid "Select the file to update"
+msgstr "Seleccione el archivo a actualizar"
+
+#: templates/display/standard.inc:99
+#, php-format
+msgid "Set permissions for %s"
+msgstr "Definir privilegios para %s"
+
+#: templates/display/title.inc:16 lib/Page/RecentChanges.php:56
+#, php-format
+msgid "Show changes for %s"
+msgstr "Mostrar cambios de %s"
+
+#: lib/Page/RecentChanges.php:63
+#, php-format
+msgid "Show version %s"
+msgstr "Mostrar versión %s"
+
+#: templates/edit/standard.inc:41
+msgid "Spam Protection - Enter the letters below:"
+msgstr "Protección anti spam - Introduzca la letras siguientes:"
+
+#: templates/display/MergeOrRename.html:33
+msgid "Stop and don't do anything"
+msgstr "Detenerse y no hacer nada"
+
+#: templates/display/MergeOrRename.html:61
+msgid "Submit"
+msgstr "Enviar"
+
+#: lib/Page/DeletePage.php:136
+#, php-format
+msgid "Successfully deleted \"%s\"."
+msgstr "Se eliminó correctamente \"%s\"."
+
+#: lib/Page/AttachedFiles.php:207
+#, php-format
+msgid "Successfully deleted version %s of \"%s\" from \"%s\""
+msgstr "Se eliminó correctamente la versión %s de \"%s\" de \"%s\""
+
+#: lib/Page.php:483
+msgid "Table of Contents"
+msgstr "Tabla de contenidos"
+
+#: lib/Page/AttachedFiles.php:280
+#, php-format
+msgid "There is already an attachment named \"%s\"."
+msgstr "Ya existe un adjunto llamado \"%s\"."
+
+#: lib/Page/MergeOrRename.php:149 lib/Page/MergeOrRename.php:155
+msgid "This is a required field."
+msgstr "Este campo es necesario."
+
+#: display.php:62
+msgid "This page does not have a history"
+msgstr "Esta página no tiene un historia"
+
+#: lib/Page/MergeOrRename.php:100
+#, php-format
+msgid "This page is referenced from %d other page(s)."
+msgstr "Esta página tiene referencias en otra(s) %d página(s)."
+
+#: templates/display/standard.inc:35
+msgid "Un_lock"
+msgstr "_Desbloquear"
+
+#: lib/Page/StandardPage.php:79
+#, php-format
+msgid "Unable to create %s"
+msgstr "No se puede crear %s"
+
+#: lib/Page/StandardPage.php:87
+msgid "Unable to create WikiHome. The wiki is not configured."
+msgstr "No se puede crear el Inicio del wiki. El wiki no está configurado."
+
+#: templates/display/standard.inc:34
+#, php-format
+msgid "Unlock %s"
+msgstr "Desbloquear %s"
+
+#: lib/Driver.php:78 lib/Driver.php:92 lib/Driver.php:104 lib/Driver.php:109
+#: lib/Driver.php:129 lib/Driver.php:134 lib/Driver.php:192 lib/Driver.php:197
+#: lib/Driver.php:202 lib/Driver.php:216 lib/Driver.php:230 lib/Driver.php:244
+#: lib/Driver.php:249 lib/Driver.php:254 lib/Driver.php:272 lib/Driver.php:392
+#: lib/Driver.php:418 lib/Driver.php:434 lib/Page.php:255 lib/Page.php:289
+#: lib/Page.php:294 lib/Page.php:393 lib/Page.php:403 lib/Page.php:413
+#: lib/Page.php:423 lib/Page.php:518 lib/Page.php:529 lib/Page.php:534
+#: lib/Page.php:539 lib/Page.php:544 lib/Page.php:584
+msgid "Unsupported"
+msgstr "No está soportado"
+
+#: templates/display/AttachedFiles.html:154
+msgid "Update File"
+msgstr "Actualizar archivo"
+
+#: templates/display/AttachedFiles.html:104
+msgid "Update an Attachment"
+msgstr "Actualizar un adjunto"
+
+#: lib/Page/AttachedFiles.php:300
+#, php-format
+msgid "Updated attachment \"%s\" on page \"%s\"."
+msgstr "Se actualizó el adjunto \"%s\" de la página \"%s\"."
+
+#: scripts/wicked.php:156
+#, php-format
+msgid "Usage: %s [OPTIONS]..."
+msgstr "Uso: %s [OPCIONES]..."
+
+#: templates/edit/create.inc:18 templates/history/header.inc:13
+#: templates/pagelist/header.inc:6 lib/Page/Search.php:156
+#: templates/display/AttachedFiles.html:9
+msgid "Version"
+msgstr "Versión"
+
+#: lib/Page/AttachedFiles.php:309
+msgid "View page: "
+msgstr "Ver página: "
+
+#: lib/Block/page.php:3
+msgid "Wiki page"
+msgstr "Página wiki"
+
+#: display.php:26
+msgid "You are not allowed to lock this page"
+msgstr "No se le permite bloquear esta página."
+
+#: display.php:41
+msgid "You are not allowed to unlock this page"
+msgstr "No se le permite desbloquear esta página."
+
+#: lib/Page/AttachedFiles.php:196
+msgid "You do not have permission to delete attachments from this page."
+msgstr "Carece de permisos para eliminar adjuntos de esta página."
+
+#: lib/Page/MergeOrRename.php:169 lib/Page/MergeOrRename.php:184
+#: lib/Page/AttachedFiles.php:237
+#, php-format
+msgid "You do not have permission to edit \"%s\""
+msgstr "Carece de permisos para modificar \"%s\""
+
+#: lib/Page/NewPage.php:119
+#, php-format
+msgid "You don't have permission to create \"%s\"."
+msgstr "Carece de permisos para añadir \"%s\"."
+
+#: lib/Page/DeletePage.php:150
+#, php-format
+msgid "You don't have permission to delete \"%s\"."
+msgstr "Carece de permisos para eliminar \"%s\"."
+
+#: lib/api.php:120 lib/Page/RevertPage.php:133 lib/Page/EditPage.php:107
+#, php-format
+msgid "You don't have permission to edit \"%s\"."
+msgstr "Carece de permisos para modificar \"%s\"."
+
+#: display.php:74 display.php:77
+msgid "You don't have permission to view this page."
+msgstr "Carece de permisos para ver esta página."
+
+#: lib/Page/AttachedFiles.php:245
+msgid "You must enter a change description to attach this file."
+msgstr ""
+"Tiene que introducir una descripción del cambio para adjuntar este archivo."
+
+#: lib/api.php:124 lib/Page/EditPage.php:118
+msgid "You must provide a change log."
+msgstr "Tiene que indicar un registro del cambio."
+
+#: lib/Wicked.php:130
+msgid "_AllPages"
+msgstr "_TodasLasPáginas"
+
+#: templates/display/standard.inc:67
+msgid "_BackLinks"
+msgstr "_VínculosAnteriores"
+
+#: templates/display/standard.inc:53
+msgid "_Delete"
+msgstr "_Eliminar"
+
+#: templates/display/standard.inc:25
+msgid "_EditPage"
+msgstr "_ModificarPágina"
+
+#: templates/display/standard.inc:41
+msgid "_Lock"
+msgstr "_Bloquear"
+
+#: templates/display/standard.inc:61
+msgid "_MergeOrRename"
+msgstr "_CombinarORenombrar"
+
+#: lib/Wicked.php:130
+msgid "_RecentChanges"
+msgstr "_ÚltimosCambios"
+
+#: lib/Wicked.php:130
+msgid "_WikiHome"
+msgstr "_InicioDelWiki"
+
+#: lib/Page/AttachedFiles.php:217
+msgid "attachment"
+msgstr "adjunto"
+
+#: scripts/wicked.php:123
+#, php-format
+msgid "page \"%s\" doesn't exist."
+msgstr "la página \"%s\" no existe."
--- /dev/null
+# Finnish translation for Wicked.
+# Copyright
+# Leena Heino <liinu@uta.fi>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Wicked 0.1-cvs\n"
+"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
+"POT-Creation-Date: 2005-03-14 11:02+0200\n"
+"PO-Revision-Date: 2004-12-10 12:59+0200\n"
+"Last-Translator: Leena Heino <liinu@uta.fi>\n"
+"Language-Team: Finnish <i18n@lists.horde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8-bit\n"
+
+#: templates/edit/create.inc:13
+#, php-format
+msgid "%s does not exist. Create it?"
+msgstr "%s ei ole olemassa. Luodaanko se?"
+
+#: scripts/wicked.php:163
+msgid ""
+"-d, --debug Run in debug mode (displays extra information)"
+msgstr ""
+"-d, --debug Aja debug-tilassa (Tulostaa enemmän lisätietoja)"
+
+#: scripts/wicked.php:165
+msgid ""
+"-g, --get[=pagetitle] Return all pages (unless pagetitle specified)"
+msgstr ""
+"-g, --get[=sivunotsikko] Palauttaa kaikki sivut (ellei sivun otsikko "
+"ole määritelty)"
+
+#: scripts/wicked.php:162
+msgid "-h, --help Show this help"
+msgstr "-h, --help Näytä tämä ohje"
+
+#: scripts/wicked.php:164
+msgid "-l, --list-pages List pages"
+msgstr "-l, --list-pages Listaa sivut"
+
+#: scripts/wicked.php:166
+msgid "-o, --out[=type] Output type for results (default:xml)"
+msgstr "-o, --out[=type] Tulostetyyppi tuloksille (oletus:xml)"
+
+#: scripts/wicked.php:168
+msgid "-p, --password[=password] Horde login password"
+msgstr "-p, --password[=salasana] Horden salasana"
+
+#: scripts/wicked.php:167
+msgid "-u, --username[=username] Horde login username"
+msgstr "-u, --username[=username] Horden tunnus"
+
+#: templates/display/MergeOrRename.html:31
+msgid "Add the text from this page"
+msgstr "Lisää tekstiä tälle sivulle"
+
+#: lib/Page/AddPage.php:54
+#, php-format
+msgid "AddPage: %s"
+msgstr "Lisää sivu: %s"
+
+#: lib/Page/AllPages.php:75
+msgid "AllPages"
+msgstr "Kaikki sivut"
+
+#: templates/display/standard.inc:46
+msgid "Are you sure you want to delete this page? All versions will be lost."
+msgstr ""
+"Oletko aivan varma että haluat poistaa tämän sivun? Kaikki versiot "
+"poistetaan."
+
+#: templates/history/summary.inc:7 templates/display/standard.inc:48
+#, php-format
+msgid "Are you sure you want to delete version %s of this page?"
+msgstr "Oletko varma että haluat poistaa version %s tästä sivusta?"
+
+#: templates/history/summary.inc:29
+#, php-format
+msgid "Are you sure you want to restore version %s of this page?"
+msgstr "Oletko varma että haluat palauttaa version %s tästä sivusta?"
+
+#: templates/display/AttachedFiles.html:80
+msgid "Attach File"
+msgstr "Liitä tiedosto"
+
+#: templates/display/AttachedFiles.html:49
+msgid "Attach a New File"
+msgstr "Liitä uusi tiedosto"
+
+#: templates/display/standard.inc:82 templates/display/standard.inc:83
+msgid "AttachedFiles"
+msgstr "Liitetyt tiedostot"
+
+#: lib/Page/AttachedFiles.php:137
+#, php-format
+msgid "AttachedFiles: %s"
+msgstr "Liitetyt tiedostot: %s"
+
+#: templates/display/AttachedFiles.html:13
+msgid "Attachment Name"
+msgstr "Liitteen nimi"
+
+#: templates/pagelist/header.inc:7 templates/pagelist/pagesearch.inc:23
+#: templates/pagelist/titlesearch.inc:21 templates/history/header.inc:29
+#: templates/display/AttachedFiles.html:15
+msgid "Author"
+msgstr "Tekijä"
+
+#: templates/display/standard.inc:123
+msgid "Back to"
+msgstr "Palaa"
+
+#: templates/display/standard.inc:70 lib/Page/BackLinks.php:67
+msgid "BackLinks"
+msgstr "Paluulinkit"
+
+#: lib/Page/AttachedFiles.php:170
+msgid "Can't read uploaded file."
+msgstr "Ei voi lukea ladattua tiedostoa."
+
+#: lib/Page/AttachedFiles.php:178
+#, php-format
+msgid "Can't retrieve \"%s\": %s"
+msgstr "Hakeminen epäonnistui: \"%s\": %s"
+
+#: lib/Page/AttachedFiles.php:204
+#, php-format
+msgid "Can't update \"%s\": no such attachment."
+msgstr "Ei voi päivittää \"%s\": ei sellaista liitettä."
+
+#: templates/edit/create.inc:31 templates/edit/standard.inc:37
+#: templates/display/MergeOrRename.html:59
+msgid "Cancel"
+msgstr "Peru"
+
+#: lib/Page/AttachedFiles.php:217
+#, php-format
+msgid "Cannot find \"%s\": %s."
+msgstr "Ei löydy \"%s\": %s."
+
+#: templates/history/header.inc:35 templates/display/AttachedFiles.html:17
+msgid "Change Log"
+msgstr "Muutosloki"
+
+#: templates/edit/standard.inc:38
+msgid "Change log"
+msgstr "Muutosloki"
+
+#: templates/display/AttachedFiles.html:72
+#: templates/display/AttachedFiles.html:141
+msgid "Change log entry"
+msgstr "Muuta lokimerkintää"
+
+#: config/prefs.php.dist:13
+msgid "Change menu preferences."
+msgstr "Muuta valikon asetuksia."
+
+#: templates/display/MergeOrRename.html:39
+msgid "Change references to this page from:"
+msgstr "Muuta viitteitä tälle sivulle lähteestä:"
+
+#: lib/Page/MergeOrRename.php:236
+#, php-format
+msgid "Changed references from %s to %s"
+msgstr "Muuta viitteet %s:stä %s:ään"
+
+#: scripts/wicked.php:44
+msgid "Couldn't read command-line options."
+msgstr "Komentoriviparametreja ei voitu lukea."
+
+#: templates/pagelist/pagesearch.inc:14 templates/pagelist/titlesearch.inc:12
+#: templates/edit/create.inc:30
+msgid "Create"
+msgstr "Luo"
+
+#: templates/history/header.inc:30
+msgid "Created"
+msgstr "Luotu"
+
+#: lib/Driver.php:76
+#, php-format
+msgid "Created \"%s\". Edit this page to set up initial content."
+msgstr "Luotiin \"%s\". Muokkaa tätä sivua alustaaksesi sivun sisällön."
+
+#: templates/pagelist/header.inc:8 templates/pagelist/pagesearch.inc:25
+#: templates/pagelist/titlesearch.inc:23
+msgid "Creation Date"
+msgstr "Luontipäivämäärä"
+
+#: templates/display/AttachedFiles.html:16
+msgid "Date"
+msgstr "Päiväys"
+
+#: templates/display/standard.inc:103
+msgid "Debug"
+msgstr "Debug"
+
+#: templates/display/standard.inc:102
+#, php-format
+msgid "Debug %s"
+msgstr "Debug %s"
+
+#: templates/display/standard.inc:56
+msgid "Delete"
+msgstr "Poista"
+
+#: templates/display/standard.inc:53
+#, php-format
+msgid "Delete %s"
+msgstr "Poista %s"
+
+#: templates/history/header.inc:22
+msgid "Delete Version"
+msgstr "Poista versio"
+
+#: templates/history/summary.inc:6
+#, php-format
+msgid "Delete Version %s"
+msgstr "Poista versio %s"
+
+#: lib/Driver.php:376
+#, php-format
+msgid "Deleted \"%s\"."
+msgstr "Poistettiin \"%s\"."
+
+#: templates/history/header.inc:32
+msgid "Diff From"
+msgstr "Eroavaisuudet lähteeseen"
+
+#: templates/history/header.inc:33
+msgid "Diff To"
+msgstr "Erovaisuudet kohteeseen"
+
+#: diff.php:56 templates/diff/diff.inc:4
+#, php-format
+msgid "Diff for %s between %s and %s"
+msgstr "Eroavaisuudet %s välillä %s ja %s"
+
+#: templates/pagelist/summary.inc:3
+#, php-format
+msgid "Display %s"
+msgstr "Näytä %s"
+
+#: config/prefs.php.dist:11
+msgid "Display Options"
+msgstr "Näkymän asetukset"
+
+#: templates/pagelist/summary.inc:6 templates/history/summary.inc:2
+#, php-format
+msgid "Display Version %s"
+msgstr "Näytä versio %s"
+
+#: templates/display/AttachedFiles.html:18
+msgid "Downloads"
+msgstr "Tallennukset"
+
+#: preview.php:18 templates/display/standard.inc:25
+#, php-format
+msgid "Edit %s"
+msgstr "Muokkaa %s"
+
+#: templates/history/header.inc:24
+msgid "Edit Version"
+msgstr "Muokkaa versiota"
+
+#: templates/history/summary.inc:19
+#, php-format
+msgid "Edit Version %s"
+msgstr "Muokkaa versiota %s"
+
+#: templates/display/standard.inc:26 lib/Page/EditPage.php:75
+msgid "EditPage"
+msgstr "Muokkaa sivua"
+
+#: templates/display/AttachedFiles.html:63
+msgid "Enter a name for this file (if blank, will use the file's current name)"
+msgstr ""
+"Anna nimi tälle tiedostolle (Jos tyhjä, niin käytetään tiedoston nykyistä "
+"nimeä)"
+
+#: lib/Driver.php:72
+#, php-format
+msgid "Error creating \"%s\": %s."
+msgstr "Virhe luotaessa \"%s\": %s."
+
+#: scripts/mail-filter.php:127
+#, php-format
+msgid "Error creating new page: %s"
+msgstr "Virhe luotaessa sivua: %s"
+
+#: lib/Page/MergeOrRename.php:199
+#, php-format
+msgid "Error deleting %s: %s"
+msgstr "Virhe poistettaessa %s: %s"
+
+#: lib/Driver.php:55
+#, php-format
+msgid "Error loading page template: %s"
+msgstr "Virhe ladattaessa sivumallia: %s"
+
+#: scripts/mail-filter.php:42
+#, php-format
+msgid "Error parsing MIME message: %s\n"
+msgstr "Virhe tulkittaessa MIME-viestiä: %s\n"
+
+#: lib/Page/MergeOrRename.php:206
+#, php-format
+msgid "Error renaming %s: %s"
+msgstr "Virhe nimettäessä uudelleen %s: %s"
+
+#: lib/Page/MergeOrRename.php:230
+#, php-format
+msgid "Error retrieving %s: %s"
+msgstr "Virhe haettaessa %s: %s"
+
+#: lib/Page/AttachedFiles.php:96 lib/Page/AttachedFiles.php:187
+#, php-format
+msgid "Error retrieving attachments: %s"
+msgstr "Virhe haettaessa liitteitä: %s"
+
+#: lib/Page/AddPage.php:44
+#, php-format
+msgid "Error retrieving like pages: %s"
+msgstr "Virhe haettaessa samankaltaisia sivuja: %s"
+
+#: lib/Page/MergeOrRename.php:191 lib/Page/MergeOrRename.php:257
+#, php-format
+msgid "Error updating %s: %s"
+msgstr "Virhe päivittäessä %s: %s"
+
+#: lib/Page/MergeOrRename.php:171
+#, php-format
+msgid "Failed to retrieve '%s': %s"
+msgstr "Hakeminen epäonnistui: '%s': %s"
+
+#: templates/menu.inc:31 templates/pagelist/pagesearch.inc:13
+#: templates/pagelist/titlesearch.inc:11 lib/Block/TitleSearch.php:26
+msgid "Go"
+msgstr "Mene"
+
+#: lib/Page/StandardPage.php:219
+msgid "Guest"
+msgstr "Vieras"
+
+#: templates/display/standard.inc:89
+msgid "History"
+msgstr "Historia"
+
+#: history.php:48 templates/history/header.inc:10
+#: templates/display/standard.inc:88
+#, php-format
+msgid "History of %s"
+msgstr "%s:n Historia"
+
+#: templates/display/MergeOrRename.html:26
+msgid "If a page with the new name already exists, then"
+msgstr "Jos sivu uudella nimellä on jo olemassa, niin"
+
+#: templates/display/standard.inc:96
+msgid "Info"
+msgstr "Info"
+
+#: templates/display/standard.inc:95
+#, php-format
+msgid "Info about %s"
+msgstr "Infoa %s:stä"
+
+#: display.php:16 history.php:16
+msgid "Internal error viewing requested page"
+msgstr "Sisäinen virhe näytettäessä pyydettyä sivua"
+
+#: diff.php:37
+#, php-format
+msgid "Internal error viewing requested page: %s"
+msgstr "Sisäinen virhe näytettäessä pyydettyä sivua: %s"
+
+#: templates/display/AttachedFiles.html:132
+msgid "Is this a minor update?"
+msgstr "Onko tämä pieni päivitys?"
+
+#: templates/edit/standard.inc:29 templates/display/title.inc:16
+#, php-format
+msgid "Last Modified %s by %s"
+msgstr "Viimeksi muokannut %s, %s"
+
+#: lib/Page/LeastPopular.php:80
+msgid "LeastPopular"
+msgstr "Vähiten suosittu"
+
+#: templates/display/standard.inc:76
+msgid "LikePages"
+msgstr "Samankaltaisia sivuja"
+
+#: lib/Page/LikePages.php:69
+#, php-format
+msgid "LikePages: %s"
+msgstr "Samankaltaisia sivuja: %s"
+
+#: templates/display/standard.inc:38
+msgid "Lock"
+msgstr "Lukitse"
+
+#: templates/display/standard.inc:37
+#, php-format
+msgid "Lock %s"
+msgstr "Lukitse %s"
+
+#: templates/edit/standard.inc:26 templates/display/title.inc:10
+msgid "Locked"
+msgstr "Lukittu"
+
+#: scripts/wicked.php:106
+#, php-format
+msgid "Logged in successfully as '%s'."
+msgstr "Kirjauduttiin sisään käyttäjänä '%s'."
+
+#: scripts/wicked.php:102
+msgid "Login is incorrect."
+msgstr "Sisäänkirjautuminen epäonnistui."
+
+#: scripts/wicked.php:160
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too."
+msgstr ""
+"Pakolliset optiot pitkille parametreille ovat pakollisia myös lyhyille "
+"parametreille."
+
+#: config/prefs.php.dist:12
+msgid "Menu Preferences"
+msgstr "Valikon asetukset"
+
+#: templates/display/standard.inc:63 templates/display/standard.inc:64
+msgid "MergeOrRename"
+msgstr "Yhdistä tai nimea uudelleen"
+
+#: lib/Page/MergeOrRename.php:130
+#, php-format
+msgid "MergeOrRename: %s"
+msgstr "Yhdistä tai nimea uudelleen: %s"
+
+#: lib/Page/MergeOrRename.php:188
+#, php-format
+msgid "Merged from %s"
+msgstr "Yhdistetty %s:stä"
+
+#: templates/edit/standard.inc:39
+msgid "Minor Change"
+msgstr "Pieni muutos"
+
+#: lib/Page/MostPopular.php:82
+msgid "MostPopular"
+msgstr "Suosituin"
+
+#: lib/Block/page.php:42
+msgid "Name of wiki page to display"
+msgstr "Näytettävän wiki-sivun nimi"
+
+#: lib/Page.php:258
+msgid "Never"
+msgstr "Ei koskaan"
+
+#: templates/display/MergeOrRename.html:16
+msgid "New name"
+msgstr "Uusi nimi"
+
+#: lib/Page/MergeOrRename.php:157
+msgid "New name is the same as old name."
+msgstr "Uusi nimi on sama kuin vanha nimi"
+
+#: lib/Page/EditPage.php:108
+msgid "No changes made"
+msgstr "Ei tehty muutoksia"
+
+#: attachment.php:43
+#, php-format
+msgid "No such attachment '%s'."
+msgstr "Ei sellaista liitettä kuin '%s'."
+
+#: lib/Driver.php:165
+msgid "Not implemented."
+msgstr "Ei ole toteutettu."
+
+#: templates/menu.inc:11 templates/pagelist/header.inc:5
+#: templates/pagelist/pagesearch.inc:22 templates/pagelist/titlesearch.inc:20
+#: config/prefs.php.dist:22
+msgid "Page"
+msgstr "Sivu"
+
+#: lib/Page/MergeOrRename.php:181
+#, php-format
+msgid "Page '%s' already exists."
+msgstr "Sivu '%s' on jo olemassa."
+
+#: lib/Page/EditPage.php:116
+msgid "Page Saved"
+msgstr "Sivu talletettu"
+
+#: templates/pagelist/header.inc:10
+msgid "Page Views"
+msgstr "Sivun katsomiskertoja"
+
+#: display.php:30
+#, php-format
+msgid "Page failed to lock: %s"
+msgstr "Sivua ei voitu lukita: %s"
+
+#: display.php:45
+#, php-format
+msgid "Page failed to unlock: %s"
+msgstr "Sivun lukitusta ei voitu poistaa: %s"
+
+#: display.php:33
+msgid "Page locked"
+msgstr "Sivu lukittu"
+
+#: display.php:48
+msgid "Page unlocked"
+msgstr "Sivu lukitus poistettu"
+
+#: templates/menu.inc:19 lib/Page/PageSearch.php:85 config/prefs.php.dist:24
+msgid "PageSearch"
+msgstr "Haku sivuista"
+
+#: lib/api.php:30
+msgid "Pages"
+msgstr "Sivut"
+
+#: templates/display/standard.inc:116
+msgid "Permissions"
+msgstr "Oikeudet"
+
+#: templates/edit/standard.inc:36
+msgid "Preview"
+msgstr "Esikatselu"
+
+#: lib/Page/RecentChanges.php:102
+msgid "RecentChanges"
+msgstr "Viimeisimmät muutokset"
+
+#: lib/Page/AttachedFiles.php:110 lib/Page/MergeOrRename.php:75
+#, php-format
+msgid "Reload %s"
+msgstr "Lataa uudestaan %s"
+
+#: templates/history/header.inc:11
+msgid "Reload History"
+msgstr "Lataa historia uudestaan"
+
+#: templates/display/title.inc:7 templates/display/title.inc:8
+msgid "Reload Page"
+msgstr "Lataa sivu uudestaan"
+
+#: lib/Driver/sql.php:479
+#, php-format
+msgid "Renamed page from %s"
+msgstr "Nimettiin sivu %s uudestaan"
+
+#: templates/history/header.inc:26
+msgid "Restore Version"
+msgstr "Palauta versio"
+
+#: templates/history/summary.inc:28
+#, php-format
+msgid "Restore Version %s"
+msgstr "Palauta versio %s"
+
+#: lib/Driver.php:46
+msgid "Robots are not allowed to create pages."
+msgstr "Robotit eivät voi luoda sivuja."
+
+#: templates/edit/standard.inc:35
+msgid "Save"
+msgstr "Talleta"
+
+#: lib/Page/EditPage.php:112
+#, php-format
+msgid "Save Failed: %s"
+msgstr "Tallennus epäonnistui: %s"
+
+#: templates/menu.inc:31
+msgid "Search"
+msgstr "Haku"
+
+#: templates/display/AttachedFiles.html:54
+#: templates/display/AttachedFiles.html:109
+msgid "Select file to attach:"
+msgstr "Valitse liitettävä tiedosto:"
+
+#: templates/display/AttachedFiles.html:118
+msgid "Select the file to update"
+msgstr "Valitse tiedosto päivitettäväksi"
+
+#: templates/display/standard.inc:115
+#, php-format
+msgid "Set permissions for %s"
+msgstr "Aseta oikeudet %s:lle"
+
+#: templates/display/title.inc:27 lib/Page/RecentChanges.php:51
+#, php-format
+msgid "Show changes for %s"
+msgstr "Talleta muutokset %s:lle"
+
+#: lib/Page/RecentChanges.php:58
+#, php-format
+msgid "Show version %s"
+msgstr "Näytä versio %s"
+
+#: templates/display/MergeOrRename.html:33
+msgid "Stop and don't do anything"
+msgstr "Stop ja älä tee mitään"
+
+#: templates/display/MergeOrRename.html:58
+msgid "Submit"
+msgstr "Lähetä"
+
+#: lib/Page/AttachedFiles.php:210
+#, php-format
+msgid "There is already an attachment named \"%s\"."
+msgstr "On jo olemassa liite nimeltään \"%s\"."
+
+#: lib/Page/MergeOrRename.php:155 lib/Page/MergeOrRename.php:161
+msgid "This is a required field."
+msgstr "Tämä on pakollinen kenttä"
+
+#: display.php:100
+msgid "This page cannot be deleted"
+msgstr "Tätä sivua ei voi poistaa"
+
+#: display.php:73
+msgid "This page does not have a history"
+msgstr "Tällä sivulla ei ole historiaa"
+
+#: lib/Page/MergeOrRename.php:111
+#, php-format
+msgid "This page is referenced from %d other page(s)."
+msgstr "Tälle sivulle on viittauksia %d sivulta."
+
+#: templates/menu.inc:15 lib/Page/TitleSearch.php:85
+#: lib/Block/TitleSearch.php:3 lib/Block/TitleSearch.php:26
+#: config/prefs.php.dist:23
+msgid "TitleSearch"
+msgstr "Hae otsikoista"
+
+#: config/prefs.php.dist:25
+msgid "Type of search for the quick search box:"
+msgstr "Haun tyyppi pikahakuun:"
+
+#: templates/display/standard.inc:34
+msgid "Unlock"
+msgstr "Poista lukitus"
+
+#: templates/display/standard.inc:33
+#, php-format
+msgid "Unlock %s"
+msgstr "Poista lukitus %s"
+
+#: lib/Page.php:250 lib/Page.php:266 lib/Page.php:271 lib/Page.php:276
+#: lib/Page.php:361 lib/Page.php:371 lib/Page.php:381 lib/Page.php:391
+#: lib/Page.php:401 lib/Page.php:412 lib/Page.php:520 lib/Page.php:531
+#: lib/Page.php:536 lib/Page.php:541 lib/Page.php:546 lib/Page.php:570
+#: lib/Page.php:575 lib/Page.php:580 lib/Driver.php:122 lib/Driver.php:135
+#: lib/Driver.php:147 lib/Driver.php:152 lib/Driver.php:170 lib/Driver.php:175
+#: lib/Driver.php:200 lib/Driver.php:205 lib/Driver.php:210 lib/Driver.php:223
+#: lib/Driver.php:236 lib/Driver.php:248 lib/Driver.php:253 lib/Driver.php:258
+#: lib/Driver.php:276 lib/Driver.php:339 lib/Driver.php:371 lib/Driver.php:401
+msgid "Unsupported"
+msgstr "Ei tuettu"
+
+#: templates/display/AttachedFiles.html:149
+msgid "Update File"
+msgstr "Päivitä tiedosto"
+
+#: templates/display/AttachedFiles.html:104
+msgid "Update an Attachment"
+msgstr "Päivitä liite"
+
+#: scripts/wicked.php:158
+#, php-format
+msgid "Usage: %s [OPTIONS]..."
+msgstr "Käyttö: %s [PARAMETRIT]..."
+
+#: templates/edit/create.inc:17
+msgid ""
+"Use this template (templates are pages which begin or end with \"Template\"):"
+msgstr ""
+"Käytä tätä mallia (mallit ovat sivuja, jotka loppuvat tai alkavat sanalla "
+"\"Template\"):"
+
+#: templates/pagelist/header.inc:6 templates/pagelist/pagesearch.inc:26
+#: templates/pagelist/titlesearch.inc:24 templates/history/header.inc:19
+#: templates/display/AttachedFiles.html:14
+msgid "Version"
+msgstr "Versio"
+
+#: lib/Block/page.php:3
+msgid "Wiki page"
+msgstr "Wiki-sivu"
+
+#: display.php:61 display.php:80
+msgid "You are not allowed to edit this page"
+msgstr "Sinulla ei ole oikeuksia muokata tätä sivua"
+
+#: display.php:24
+msgid "You are not allowed to lock this page"
+msgstr "Sinulla ei ole oikeuksia lukita tätä sivua"
+
+#: display.php:39
+msgid "You are not allowed to unlock this page"
+msgstr "Sinulla ei ole oikeuksia poista lukitusta tältä sivulta"
+
+#: lib/Page/EditPage.php:57 lib/Page/EditPage.php:98
+#, php-format
+msgid "You don't have permission to edit '%s'."
+msgstr "Sinulla ei ole oikeuksia muokata '%s'."
+
+#: display.php:112
+msgid "You don't have permission to view this page."
+msgstr "Sinulla ei ole oikeuksia nähdä tätä sivua."
+
+#: lib/Page/EditPage.php:103
+msgid "You must enter a change description to save the page."
+msgstr "Sinun pitää muuttaa kuvausta tallettaaksesi sivun."
+
+#: templates/display/MergeOrRename.html:9
+msgid "for"
+msgstr " "
+
+#: scripts/wicked.php:125
+#, php-format
+msgid "page '%s' doesn't exist."
+msgstr "sivua '%s' ei ole olemassa."
--- /dev/null
+# Italian translations for wicked package.
+# Copyright 2008-2009 The Horde Project
+# This file is distributed under the same license as the wicked package.
+# Fabio Pedretti <fabio.pedretti@ing.unibs.it>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: wicked v1.0-cvs\n"
+"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
+"POT-Creation-Date: 2008-09-05 17:54+0200\n"
+"PO-Revision-Date: 2008-09-05 18:13+0200\n"
+"Last-Translator: Fabio Pedretti <fabio.pedretti@ing.unibs.it>\n"
+"Language-Team: i18n@lists.horde.org\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: templates/edit/create.inc:13
+#, php-format
+msgid ""
+"%s does not exist, but maybe you were looking for one of the following pages?"
+msgstr "%s non esiste, forse stavi cercando una delle pagine seguenti?"
+
+#: templates/edit/create.inc:30
+#, php-format
+msgid ""
+"%s does not exist. Click on \"Create\" below if you want to create this page "
+"now and start editing."
+msgstr "%s non esiste. Se vuoi creare la pagina clicca su \"Crea\" qui sotto "
+
+#: lib/Page/Search.php:112
+#, php-format
+msgid "%s does not exist. You can create it now."
+msgstr "%s non esiste. Puoi crearlo ora."
+
+#: templates/edit/create.inc:37
+msgid "(None)"
+msgstr "(Nessuno)"
+
+#: scripts/wicked.php:161
+msgid ""
+"-d, --debug Run in debug mode (displays extra information)"
+msgstr ""
+"-d, --debug Lancia in modalità debug (mostra informazioni "
+"extra)"
+
+#: scripts/wicked.php:163
+msgid ""
+"-g, --get[=pagetitle] Return all pages (unless pagetitle specified)"
+msgstr ""
+"-g, --get[=pagetitle] Ritorna tutte le pagine (senza il pagetitle "
+"specificato)"
+
+#: scripts/wicked.php:160
+msgid "-h, --help Show this help"
+msgstr "-h, --help Mostra questo help"
+
+#: scripts/wicked.php:162
+msgid "-l, --list-pages List pages"
+msgstr "-l, --list-pages Lista pagine"
+
+#: scripts/wicked.php:164
+msgid "-o, --out[=type] Output type for results (default:xml)"
+msgstr "-o, --out[=type] Output type for results (default:xml)"
+
+#: scripts/wicked.php:166
+msgid "-p, --password[=password] Horde login password"
+msgstr "-p, --password[=password] Horde login password"
+
+#: scripts/wicked.php:165
+msgid "-u, --username[=username] Horde login username"
+msgstr "-u, --username[=username] Horde login username"
+
+#: templates/sync/list.inc:25 templates/sync/list.inc:51
+#: templates/sync/list.inc:73
+msgid "Actions"
+msgstr ""
+
+#: templates/display/MergeOrRename.html:31
+msgid "Add the text from this page"
+msgstr "Aggiungi il testo da questa pagina"
+
+#: lib/Page/AddPage.php:108
+#, php-format
+msgid "AddPage: %s"
+msgstr "Aggiungi Pagina: %s"
+
+#: lib/Page/AllPages.php:90
+msgid "AllPages"
+msgstr "Tutte le Pagine"
+
+#: lib/Page/DeletePage.php:83
+msgid ""
+"Are you sure you want to delete this page? All versions will be permanently "
+"removed."
+msgstr "Sei sicuro di voler eliminare questa regola?"
+
+#: lib/Page/DeletePage.php:85
+#, php-format
+msgid "Are you sure you want to delete version %s of this page?"
+msgstr "Sei sicuro di voler eliminare la versione %s di questa pagina?"
+
+#: lib/Page/RevertPage.php:71
+#, php-format
+msgid "Are you sure you want to revert to version %s of this page?"
+msgstr "Sei sicuro di voler tornare alla versione %s di questa pagina?"
+
+#: templates/display/AttachedFiles.html:88
+msgid "Attach File"
+msgstr "Allega File"
+
+#: templates/display/AttachedFiles.html:52
+msgid "Attach a New File"
+msgstr "Allega un nuovo File"
+
+#: templates/display/standard.inc:77
+msgid "AttachedFiles"
+msgstr "Allegati"
+
+#: lib/Page/AttachedFiles.php:171
+#, php-format
+msgid "AttachedFiles: %s"
+msgstr "Allegato: %s"
+
+#: templates/display/standard.inc:78
+msgid "Attached_Files"
+msgstr "File_Allegati:"
+
+#: templates/display/AttachedFiles.html:7
+msgid "Attachment Name"
+msgstr "Nome allegato"
+
+#: templates/display/standard.inc:117
+msgid "Attachments"
+msgstr "Allegati"
+
+#: lib/Page/AttachedFiles.php:225
+msgid "Attachments with spaces can't be embedded into a page."
+msgstr "Allegati con spazi non possono essere inclusi nella pagina."
+
+#: templates/sync/diff.inc:25 templates/sync/diff.inc:61
+#: templates/sync/list.inc:24 templates/sync/list.inc:50
+#: templates/pagelist/header.inc:7 templates/history/header.inc:23
+#: templates/edit/create.inc:19 lib/Page/Search.php:158
+#: templates/display/AttachedFiles.html:10
+msgid "Author"
+msgstr "Autore"
+
+#: templates/display/standard.inc:104
+msgid "Ba_ck to"
+msgstr "_Torna a"
+
+#: templates/display/standard.inc:104
+msgid "Back to"
+msgstr "Torna a"
+
+#: templates/display/standard.inc:67
+msgid "BackLinks"
+msgstr "BackLink"
+
+#: lib/Page/BackLinks.php:80
+#, php-format
+msgid "BackLinks: %s"
+msgstr "BackLink: %s"
+
+#: lib/Page/SyncPages.php:246 lib/Page/SyncPages.php:249
+msgid "By default, your login data will be used"
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:231
+msgid "Can't read uploaded file."
+msgstr "Impossibile leggere il file caricato."
+
+#: lib/Page/RevertPage.php:120
+#, php-format
+msgid "Can't revert to an unknown version."
+msgstr "Impossibili tornare a una versione sconosciuta."
+
+#: lib/Page/AttachedFiles.php:271
+#, php-format
+msgid "Can't update \"%s\": no such attachment."
+msgstr "Impossibili aggiornare \"%s\": nessun allegato."
+
+#: templates/edit/create.inc:47 templates/edit/standard.inc:27
+#: lib/Page/DeletePage.php:104 lib/Page/MergeOrRename.php:140
+#: lib/Page/RevertPage.php:88 templates/display/MergeOrRename.html:62
+msgid "Cancel"
+msgstr "Annulla"
+
+#: templates/history/header.inc:29 templates/display/AttachedFiles.html:12
+msgid "Change Log"
+msgstr "Cambia Log"
+
+#: templates/sync/diff.inc:26 templates/sync/diff.inc:62
+#: templates/edit/standard.inc:29
+msgid "Change log"
+msgstr "Cambia log"
+
+#: templates/display/AttachedFiles.html:80
+#: templates/display/AttachedFiles.html:146
+msgid "Change log entry"
+msgstr "Cambia log di ingresso"
+
+#: templates/display/MergeOrRename.html:40
+msgid "Change references to this page from:"
+msgstr "Cambia referenze di questa pagina da:"
+
+#: lib/Page/MergeOrRename.php:253
+#, php-format
+msgid "Changed references from %s to %s"
+msgstr "Cambia referenze da %s a %s"
+
+#: templates/edit/standard.inc:28
+msgid "Changelog is required"
+msgstr "E' richiesto un cambiamento di log"
+
+#: templates/sync/diff.inc:27 templates/sync/diff.inc:63
+msgid "Checksum"
+msgstr ""
+
+#: templates/edit/create.inc:26
+msgid ""
+"Click on \"Create\" below if you want to create this page now and start "
+"editing."
+msgstr ""
+"Clicca su \"Create\" qua sotto se vuoi creare questa pagina e cominciare la "
+"creazione."
+
+#: scripts/wicked.php:42
+msgid "Couldn't read command-line options."
+msgstr "Impossibile leggere le opzioni della command-line."
+
+#: templates/edit/create.inc:46
+msgid "Create"
+msgstr "Crea"
+
+#: lib/Page/NewPage.php:135
+#, php-format
+msgid "Create Failed: %s"
+msgstr "Creazione fallita: %s"
+
+#: templates/sync/diff.inc:24 templates/sync/diff.inc:60
+#: templates/sync/list.inc:23 templates/sync/list.inc:49
+#: templates/history/header.inc:24
+msgid "Created"
+msgstr "Creato"
+
+#: templates/pagelist/header.inc:8 templates/edit/create.inc:20
+#: lib/Page/Search.php:159
+msgid "Creation Date"
+msgstr "Data creazione"
+
+#: lib/Page/SyncPages.php:231
+msgid "Custom"
+msgstr ""
+
+#: templates/display/AttachedFiles.html:11
+msgid "Date"
+msgstr "Data"
+
+#: lib/Page/DeletePage.php:103
+msgid "Delete"
+msgstr "Elimina"
+
+#: templates/display/standard.inc:52
+#, php-format
+msgid "Delete %s"
+msgstr "Elimina %s"
+
+#: templates/history/header.inc:16
+msgid "Delete Version"
+msgstr "Elimina Versione"
+
+#: templates/history/summary.inc:6
+#, php-format
+msgid "Delete Version %s"
+msgstr "Elimina Versione %s"
+
+#: lib/Page/DeletePage.php:97 lib/Page/DeletePage.php:120
+msgid "DeletePage"
+msgstr "Elimina Pagina"
+
+#: lib/Page/DeletePage.php:142
+#, php-format
+msgid "Deleted version %s of \"%s\"."
+msgstr "Elimina la versione %s di \"%s\"."
+
+#: templates/history/header.inc:26
+msgid "Diff From"
+msgstr "Diff da"
+
+#: templates/history/header.inc:27
+msgid "Diff To"
+msgstr "Diff per"
+
+#: diff.php:56 templates/sync/diff.inc:101 templates/diff/diff.inc:2
+#, php-format
+msgid "Diff for %s between %s and %s"
+msgstr "Diff per %s tra %s e %s"
+
+#: lib/Page/SyncPages.php:251
+msgid "Display"
+msgstr "Visualizza"
+
+#: templates/pagelist/summary.inc:3
+#, php-format
+msgid "Display %s"
+msgstr "Visualizza %s"
+
+#: templates/pagelist/summary.inc:6 templates/history/summary.inc:2
+#, php-format
+msgid "Display Version %s"
+msgstr "Visualizza versione %s"
+
+#: templates/sync/diff.inc:96 templates/sync/list.inc:35
+msgid "Download"
+msgstr "Scarica"
+
+#: templates/display/standard.inc:136
+msgid "Download this page as:"
+msgstr ""
+
+#: templates/display/AttachedFiles.html:13
+msgid "Downloads"
+msgstr "Scarica"
+
+#: lib/Page/SyncPages.php:389
+msgid "Downloded from remote server"
+msgstr ""
+
+#: lib/Page/SyncPages.php:237
+msgid "Driver"
+msgstr ""
+
+#: lib/Page/SyncPages.php:254
+msgid "Edit"
+msgstr "Modifica"
+
+#: preview.php:24 templates/display/standard.inc:24
+#, php-format
+msgid "Edit %s"
+msgstr "Modifica %s"
+
+#: templates/history/header.inc:18
+msgid "Edit Version"
+msgstr "Modifica Versione"
+
+#: templates/history/summary.inc:16
+#, php-format
+msgid "Edit Version %s"
+msgstr "Modifica Versione %s"
+
+#: templates/sync/diff.inc:98
+msgid "Edit local"
+msgstr "Modifica locale"
+
+#: templates/sync/diff.inc:99
+msgid "Edit remote"
+msgstr "Modifica remota"
+
+#: templates/edit/standard.inc:21 lib/Page/EditPage.php:93
+msgid "EditPage"
+msgstr "Modifica Pagina"
+
+#: templates/display/AttachedFiles.html:67
+msgid "Enter a name for this file (if blank, will use the file's current name)"
+msgstr ""
+"Inserisci un nome per questo file (se lasciato vuoti, verrà usato il nome "
+"corrente del file)"
+
+#: scripts/mail-filter.php:127
+#, php-format
+msgid "Error creating new page: %s"
+msgstr "Si è verificato un errore durante la creazione della nuova pagina: %s"
+
+#: lib/Page/MergeOrRename.php:202
+#, php-format
+msgid "Error deleting %s: %s"
+msgstr "Si è verificato un errore durante l'eliminazione di %s: %s"
+
+#: scripts/mail-filter.php:42
+#, php-format
+msgid "Error parsing MIME message: %s\n"
+msgstr "Errore nel parsing MIME messaggio: %s\n"
+
+#: lib/Page/MergeOrRename.php:217
+#, php-format
+msgid "Error renaming \"%s\": %s"
+msgstr "Errore nella rinominazione \"%s\": %s"
+
+#: lib/Page/MergeOrRename.php:247
+#, php-format
+msgid "Error retrieving %s: %s"
+msgstr "Errore nel recupero di %s: %s"
+
+#: lib/Page/AttachedFiles.php:111 lib/Page/AttachedFiles.php:253
+#, php-format
+msgid "Error retrieving attachments: %s"
+msgstr "Errore nel recupero dell'allegato: %s"
+
+#: lib/Page/AddPage.php:68
+#, php-format
+msgid "Error retrieving templates: %s"
+msgstr "Errore nel recupero del Template: %s"
+
+#: lib/Page/MergeOrRename.php:194 lib/Page/MergeOrRename.php:274
+#, php-format
+msgid "Error updating %s: %s"
+msgstr "Errore durante l'aggiornamento %s: %s"
+
+#: lib/Page/Search.php:165
+msgid "Exact Match"
+msgstr "Abbinamento Esatto"
+
+#: lib/Page/MergeOrRename.php:164
+#, php-format
+msgid "Failed to retrieve \"%s\": %s"
+msgstr "Impossibile ripristinare \"%s\": %s"
+
+#: lib/Page/SyncPages.php:194 lib/Page/SyncPages.php:271
+msgid "Fetch page list"
+msgstr ""
+
+#: templates/sync/diff.inc:54
+msgid "Found same content in history"
+msgstr ""
+
+#: lib/Page.php:274
+msgid "Guest"
+msgstr "Guest"
+
+#: templates/display/standard.inc:138
+msgid "HTML"
+msgstr ""
+
+#: templates/display/standard.inc:85
+msgid "Hi_story"
+msgstr "Hi_story"
+
+#: templates/display/standard.inc:84
+#, php-format
+msgid "History of %s"
+msgstr "Storia di %s"
+
+#: lib/Page/StandardPage/StdHistoryPage.php:46
+msgid "History page not found"
+msgstr "Storia della pagina non trovata"
+
+#: history.php:30 templates/history/header.inc:7
+#, php-format
+msgid "History: %s"
+msgstr "Storia: %s"
+
+#: lib/Wicked.php:130
+msgid "HowTo_UseWiki"
+msgstr "Co_me usare la Wiki"
+
+#: templates/display/MergeOrRename.html:26
+msgid "If a page with the new name already exists, then"
+msgstr "Se una pagina con un nome nuovo esiste già allora"
+
+#: display.php:17 history.php:18
+msgid "Internal error viewing requested page"
+msgstr "Errore interno nella visualizzazione della pagina richiesta"
+
+#: diff.php:39
+#, php-format
+msgid "Internal error viewing requested page: %s"
+msgstr "Errore interno nella visualizzazione della pagina richiesta: %s"
+
+#: lib/api.php:418
+msgid "Invalid page requested."
+msgstr "Pagina richiesta non valida."
+
+#: templates/display/AttachedFiles.html:133
+msgid "Is this a minor update?"
+msgstr "E' un aggiornamento minore?"
+
+#: templates/display/standard.inc:72
+#, fuzzy
+msgid "L_ikePages"
+msgstr "Immagini"
+
+#: templates/display/title.inc:6 templates/edit/standard.inc:20
+#, php-format
+msgid "Last Modified %s by %s"
+msgstr "Ultima Modifica %s by %s"
+
+#: templates/display/standard.inc:139
+msgid "Latex"
+msgstr "Latex"
+
+#: lib/Page/LeastPopular.php:93
+msgid "LeastPopular"
+msgstr "MenoPopulare"
+
+#: templates/display/standard.inc:72
+#, fuzzy
+msgid "LikePages"
+msgstr "Immagini"
+
+#: lib/Page/LikePages.php:82
+#, fuzzy, php-format
+msgid "LikePages: %s"
+msgstr "Immagini"
+
+#: templates/sync/diff.inc:32 templates/sync/diff.inc:68
+#: lib/Page/SyncDiff.php:80 lib/Page/SyncDiff.php:86
+msgid "Local"
+msgstr ""
+
+#: templates/sync/diff.inc:22 templates/sync/diff.inc:58
+msgid "Location"
+msgstr ""
+
+#: templates/display/standard.inc:40
+#, php-format
+msgid "Lock %s"
+msgstr "Blocca %s"
+
+#: templates/display/title.inc:34 templates/edit/standard.inc:21
+#: lib/Page/DeletePage.php:97 lib/Page/RevertPage.php:81
+msgid "Locked"
+msgstr "Bloccato"
+
+#: scripts/wicked.php:104
+#, php-format
+msgid "Logged in successfully as \"%s\"."
+msgstr "Autenticato con successo come \"%s\"."
+
+#: scripts/wicked.php:100
+msgid "Login is incorrect."
+msgstr "Login non corretta."
+
+#: scripts/wicked.php:158
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too."
+msgstr ""
+"Argomenti obbligatori troppo lunghi sono obbligatori anche per opzioni corte."
+
+#: templates/display/standard.inc:60
+msgid "MergeOrRename"
+msgstr "MergeOrRename"
+
+#: lib/Page/MergeOrRename.php:125
+#, php-format
+msgid "MergeOrRename: %s"
+msgstr "MergeOrRename: %s"
+
+#: lib/Page/MergeOrRename.php:207
+#, php-format
+msgid "Merged \"%s\" into \"%s\"."
+msgstr "Merged \"%s\" con \"%s\"."
+
+#: lib/Page/MergeOrRename.php:210
+#, php-format
+msgid "Merged \"%s\" into \"%s\". New page: %s\n"
+msgstr "Merged \"%s\" con \"%s\". Nuova pagina: %s\n"
+
+#: lib/Page/MergeOrRename.php:191
+#, php-format
+msgid "Merged from %s"
+msgstr "Merged da %s"
+
+#: templates/edit/standard.inc:30
+msgid "Minor Change"
+msgstr "Cambiamento minore"
+
+#: lib/Page/MostPopular.php:93
+msgid "MostPopular"
+msgstr "Più popolare"
+
+#: lib/Block/page.php:41
+msgid "Name of wiki page to display"
+msgstr "Nome della pagina wiki da visualizzare"
+
+#: lib/Page.php:263
+msgid "Never"
+msgstr "Mai"
+
+#: lib/Page/AttachedFiles.php:303
+#, php-format
+msgid "New attachment \"%s\" to page \"%s\"."
+msgstr "Nuovo allegato \"%s\" alla pagina \"%s\"."
+
+#: templates/display/MergeOrRename.html:15
+msgid "New name"
+msgstr "Nuovo nome"
+
+#: lib/Page/MergeOrRename.php:151
+msgid "New name is the same as old name."
+msgstr "Il nuovo nome è uguale al vecchio"
+
+#: templates/sync/list.inc:42
+msgid "New pages on local server"
+msgstr ""
+
+#: templates/sync/list.inc:16
+msgid "New pages on remote server"
+msgstr ""
+
+#: lib/Page/NewPage.php:112
+msgid "NewPage"
+msgstr "Nuova pagina"
+
+#: templates/edit/new.inc:20
+#, php-format
+msgid "NewPage: %s"
+msgstr "Nuova pagina: %s"
+
+#: lib/api.php:352 lib/Page/EditPage.php:124 lib/Page/SyncPages.php:387
+msgid "No changes made"
+msgstr "Nessun cambiamento fatto"
+
+#: templates/sync/list.inc:18 templates/sync/list.inc:44
+msgid "No pages found"
+msgstr "Nessuna pagina trovata"
+
+#: templates/sync/list.inc:70
+msgid "No pages to sync"
+msgstr "Nessuna pagina da sincronizzare"
+
+#: lib/Driver.php:124
+msgid "Not implemented."
+msgstr "Non implementato."
+
+#: templates/sync/list.inc:21 templates/sync/list.inc:47
+#: templates/sync/list.inc:73 templates/pagelist/header.inc:5
+#: templates/edit/create.inc:17 lib/Page/Search.php:156
+msgid "Page"
+msgstr "Pagina"
+
+#: lib/Page/MergeOrRename.php:179
+#, php-format
+msgid "Page \"%s\" already exists."
+msgstr "La pagina \"%s\" esiste già."
+
+#: lib/Page/SyncPages.php:395
+#, php-format
+msgid "Page \"%s\" was sucessfuly downloaded from remote to local wiki."
+msgstr ""
+
+#: lib/Page/SyncPages.php:425
+#, php-format
+msgid "Page \"%s\" was sucessfuly uploaded from local to remote wiki."
+msgstr ""
+
+#: lib/Page/NewPage.php:138
+msgid "Page Created"
+msgstr "Pagina creata"
+
+#: lib/Page/EditPage.php:131
+msgid "Page Saved"
+msgstr "Pagina salvata"
+
+#: templates/edit/create.inc:35
+msgid "Page Template:"
+msgstr "Modello pagina:"
+
+#: lib/Page/Search.php:179
+msgid "Page Text Matches"
+msgstr "Abbina testo pagina"
+
+#: lib/Page/Search.php:172
+msgid "Page Title Matches"
+msgstr "Abbina titolo pagina"
+
+#: templates/pagelist/header.inc:10
+msgid "Page Views"
+msgstr "Visualizzazione pagina"
+
+#: display.php:31
+#, php-format
+msgid "Page failed to lock: %s"
+msgstr "Blocco pagina fallito: %s"
+
+#: display.php:46
+#, php-format
+msgid "Page failed to unlock: %s"
+msgstr "Sblocco pagina fallito: %s"
+
+#: display.php:34
+msgid "Page locked"
+msgstr "Pagina bloccata"
+
+#: lib/Page/AddPage.php:53 lib/Page/NewPage.php:72 lib/Driver/sql.php:592
+msgid "Page name must not be empty"
+msgstr "Il nome della pagina deve essere presente"
+
+#: display.php:49
+msgid "Page unlocked"
+msgstr "Pagina sbloccata"
+
+#: lib/api.php:114 lib/api.php:117
+msgid "Pages"
+msgstr "Pagine"
+
+#: lib/Page/NewPage.php:129
+msgid "Pages cannot be empty."
+msgstr "Le pagine non possono essere vuote."
+
+#: templates/sync/list.inc:68
+msgid "Pages to sync"
+msgstr "Pagine da sincronizzare"
+
+#: lib/Page/SyncPages.php:249
+msgid "Password"
+msgstr ""
+
+#: templates/display/standard.inc:100
+msgid "Permissio_ns"
+msgstr "Perm_essi"
+
+#: lib/api.php:414
+msgid "Permission denied."
+msgstr "Permesso Negato."
+
+#: templates/display/standard.inc:137
+msgid "Plain Text"
+msgstr ""
+
+#: lib/Page/SyncPages.php:240
+msgid "Prefix"
+msgstr "Prefisso"
+
+#: templates/edit/new.inc:25 templates/edit/standard.inc:26
+msgid "Preview"
+msgstr "Anteprima"
+
+#: lib/Page/EditPage.php:112
+msgid "Random string did not match."
+msgstr "Stringa casuale non è abbinata"
+
+#: lib/Page/RecentChanges.php:114
+msgid "RecentChanges"
+msgstr "Cambiameti Recenti"
+
+#: lib/Page/AttachedFiles.php:67
+#, php-format
+msgid "Referrer \"%s\" does not exist."
+msgstr "Riferimento \"%s\" non esistente."
+
+#: lib/Page/AttachedFiles.php:129
+#, php-format
+msgid "Reload \"%s\""
+msgstr "Ricarica \"%s\""
+
+#: templates/history/header.inc:8
+msgid "Reload History"
+msgstr "Ricarica Storia"
+
+#: templates/display/title.inc:32 templates/display/title.inc:33
+msgid "Reload Page"
+msgstr "Ricarica pagina"
+
+#: templates/sync/diff.inc:40 templates/sync/diff.inc:76
+#: lib/Page/SyncDiff.php:81 lib/Page/SyncDiff.php:85
+msgid "Remote"
+msgstr ""
+
+#: lib/Page/SyncPages.php:194 lib/Page/SyncPages.php:300
+msgid "Remove login info"
+msgstr ""
+
+#: lib/Page/MergeOrRename.php:222
+#, php-format
+msgid "Renamed \"%s\" to \"%s\"."
+msgstr "\"%s\" rinominato in \"%s\"."
+
+#: lib/Page/MergeOrRename.php:225
+#, php-format
+msgid "Renamed \"%s\" to \"%s\". New page: %s\n"
+msgstr "\"%s\" rinominato in \"%s\". Nuova pagina: %s\n"
+
+#: lib/Driver/sql.php:681
+#, php-format
+msgid "Renamed page from %s"
+msgstr "Pagina rinominata da %s"
+
+#: lib/Page/SyncPages.php:194
+msgid "Reset"
+msgstr "Azzera"
+
+#: templates/history/header.inc:20
+msgid "Restore Version"
+msgstr "Recupera Versione"
+
+#: lib/Page/RevertPage.php:87
+msgid "Revert"
+msgstr "Ritorna"
+
+#: templates/history/summary.inc:26
+#, php-format
+msgid "Revert to version %s"
+msgstr "Ritorna alla versione %s"
+
+#: lib/Page/RevertPage.php:81 lib/Page/RevertPage.php:104
+msgid "RevertPage"
+msgstr "Ritorna alla pagina"
+
+#: lib/Page/RevertPage.php:127
+#, php-format
+msgid "Reverted to version %s of \"%s\"."
+msgstr "Ritorna alla versione %s di \"%s\"."
+
+#: lib/Driver/sql.php:596
+msgid "Robots are not allowed to create pages"
+msgstr "Ai robot non è permesso creare pagine"
+
+#: templates/edit/new.inc:24 templates/edit/standard.inc:25
+msgid "Save"
+msgstr "Salva"
+
+#: lib/Page/EditPage.php:128
+#, php-format
+msgid "Save Failed: %s"
+msgstr "Salvataggio fallito: %s"
+
+#: lib/Page/SyncPages.php:194 lib/Page/SyncPages.php:288
+msgid "Save login info"
+msgstr ""
+
+#: templates/menu.inc:17 lib/Page/Search.php:204
+msgid "Search"
+msgstr "Cerca"
+
+#: templates/pagelist/search.inc:1
+msgid "Search Results"
+msgstr "Risultati della Ricerca"
+
+#: templates/display/AttachedFiles.html:58
+#: templates/display/AttachedFiles.html:110
+msgid "Select file to attach:"
+msgstr "Seleziona file da allegare:"
+
+#: templates/display/AttachedFiles.html:119
+msgid "Select the file to update"
+msgstr "Seleziona il file da aggiornare"
+
+#: templates/display/standard.inc:99
+#, php-format
+msgid "Set permissions for %s"
+msgstr "Imposta permessi per %s"
+
+#: templates/sync/list.inc:79
+msgid "Show changes"
+msgstr "Mostra modifiche"
+
+#: templates/display/title.inc:16 lib/Page/RecentChanges.php:57
+#, php-format
+msgid "Show changes for %s"
+msgstr "Mostra modifiche di %s"
+
+#: lib/Page/RecentChanges.php:64
+#, php-format
+msgid "Show version %s"
+msgstr "Mostra versione %s"
+
+#: templates/edit/standard.inc:41
+msgid "Spam Protection - Enter the letters below:"
+msgstr "Protezione Spam - Inserisci le lettere qui sotto:"
+
+#: templates/display/MergeOrRename.html:33
+msgid "Stop and don't do anything"
+msgstr "Aspetta e non fare niente"
+
+#: lib/Page/SyncPages.php:231
+msgid "Stored"
+msgstr ""
+
+#: templates/display/MergeOrRename.html:61
+msgid "Submit"
+msgstr "Accetta"
+
+#: lib/Page/DeletePage.php:136
+#, php-format
+msgid "Successfully deleted \"%s\"."
+msgstr "\"%s\" eliminato con successo."
+
+#: lib/Page/AttachedFiles.php:207
+#, php-format
+msgid "Successfully deleted version %s of \"%s\" from \"%s\""
+msgstr "Versione %s di \"%s\" eliminata con successo da \"%s\""
+
+#: lib/Page/SyncPages.php:193
+msgid "Sync data"
+msgstr ""
+
+#: lib/Page/SyncPages.php:305
+msgid "Sync login info was removed."
+msgstr ""
+
+#: lib/Page/SyncPages.php:295
+msgid "Sync login info was stored"
+msgstr ""
+
+#: lib/Page/SyncDiff.php:129
+msgid "SyncDiff"
+msgstr ""
+
+#: lib/Page/SyncPages.php:169
+#, fuzzy
+msgid "SyncPages"
+msgstr "Pagine"
+
+#: lib/Page/SyncDiff.php:52
+msgid "Synchronization is disabled"
+msgstr ""
+
+#: lib/Page.php:488
+msgid "Table of Contents"
+msgstr "Tabella dei contenuti"
+
+#: lib/Page/AttachedFiles.php:280
+#, php-format
+msgid "There is already an attachment named \"%s\"."
+msgstr "C'è già un allegato chiamato \"%s\"."
+
+#: lib/Page/MergeOrRename.php:149 lib/Page/MergeOrRename.php:155
+msgid "This is a required field."
+msgstr "Questo è un campo richiesto."
+
+#: display.php:61
+msgid "This page does not have a history"
+msgstr "Questa pagina non ha una storia"
+
+#: lib/Page/MergeOrRename.php:100
+#, php-format
+msgid "This page is referenced from %d other page(s)."
+msgstr "Questa pagina è riferita da %d altra/e pagina/e."
+
+#: templates/display/standard.inc:35
+msgid "Un_lock"
+msgstr "_Sblocca"
+
+#: lib/Page/StandardPage.php:81
+#, php-format
+msgid "Unable to create %s"
+msgstr "Impossibile creare %s"
+
+#: lib/Page/StandardPage.php:89
+msgid "Unable to create WikiHome. The wiki is not configured."
+msgstr "Impossibile creare la home della wiki. La wiki non è configurata."
+
+#: templates/display/standard.inc:34
+#, php-format
+msgid "Unlock %s"
+msgstr "Sblocca %s"
+
+#: lib/Driver.php:78 lib/Driver.php:92 lib/Driver.php:104 lib/Driver.php:109
+#: lib/Driver.php:129 lib/Driver.php:134 lib/Driver.php:192 lib/Driver.php:197
+#: lib/Driver.php:209 lib/Driver.php:223 lib/Driver.php:237 lib/Driver.php:251
+#: lib/Driver.php:256 lib/Driver.php:261 lib/Driver.php:279 lib/Driver.php:399
+#: lib/Driver.php:425 lib/Driver.php:441 lib/Page.php:255 lib/Page.php:289
+#: lib/Page.php:294 lib/Page.php:393 lib/Page.php:403 lib/Page.php:413
+#: lib/Page.php:423 lib/Page.php:523 lib/Page.php:534 lib/Page.php:539
+#: lib/Page.php:544 lib/Page.php:549 lib/Page.php:589 lib/Sync.php:78
+#: lib/Sync.php:90 lib/Sync.php:102 lib/Sync.php:114 lib/Sync.php:126
+#: lib/Sync.php:142
+msgid "Unsupported"
+msgstr "Non supportato."
+
+#: templates/display/AttachedFiles.html:154
+msgid "Update File"
+msgstr "Aggiorna File"
+
+#: templates/display/AttachedFiles.html:104
+msgid "Update an Attachment"
+msgstr "Aggiorna un Allegato"
+
+#: lib/Page/AttachedFiles.php:300
+#, php-format
+msgid "Updated attachment \"%s\" on page \"%s\"."
+msgstr "Aggiornato l'Allegato \"%s\" sulla pagina \"%s\"."
+
+#: templates/sync/diff.inc:97 templates/sync/list.inc:61
+msgid "Upload"
+msgstr ""
+
+#: lib/Page/SyncPages.php:419
+msgid "Uploaded from remote server"
+msgstr ""
+
+#: lib/Page/SyncPages.php:243
+msgid "Url"
+msgstr ""
+
+#: scripts/wicked.php:156
+#, php-format
+msgid "Usage: %s [OPTIONS]..."
+msgstr "Usato: %s [OPZIONI]..."
+
+#: lib/Page/SyncPages.php:246
+msgid "User"
+msgstr ""
+
+#: templates/sync/diff.inc:23 templates/sync/diff.inc:59
+#: templates/sync/list.inc:22 templates/sync/list.inc:48
+#: templates/pagelist/header.inc:6 templates/history/header.inc:13
+#: templates/edit/create.inc:18 lib/Page/Search.php:157
+#: templates/display/AttachedFiles.html:9
+msgid "Version"
+msgstr "Versione"
+
+#: lib/Page/SyncPages.php:178
+msgid "View local"
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:309
+msgid "View page: "
+msgstr "Visualizza pagina: "
+
+#: lib/Page/SyncPages.php:180
+msgid "View remote"
+msgstr "Visualizza remoto"
+
+#: lib/Page/SyncPages.php:237
+msgid "Wicked"
+msgstr "Wicked"
+
+#: lib/api.php:374
+msgid "Wiki Templates"
+msgstr "Modello Wiki"
+
+#: lib/Block/page.php:3
+msgid "Wiki page"
+msgstr "Pagina Wiki"
+
+#: display.php:25
+msgid "You are not allowed to lock this page"
+msgstr "Non sei autorizzato a bloccare questa pagina"
+
+#: display.php:40
+msgid "You are not allowed to unlock this page"
+msgstr "Non sei autorizzato a sbloccare questa pagina"
+
+#: lib/Page/AttachedFiles.php:196
+msgid "You do not have permission to delete attachments from this page."
+msgstr "Non hai permesso di eliminare gli allegati da questa pagina."
+
+#: lib/Page/AttachedFiles.php:237 lib/Page/MergeOrRename.php:169
+#: lib/Page/MergeOrRename.php:184
+#, php-format
+msgid "You do not have permission to edit \"%s\""
+msgstr "Non hai il permesso di visualizzare di modificare \"%s\""
+
+#: lib/Page/NewPage.php:125
+#, php-format
+msgid "You don't have permission to create \"%s\"."
+msgstr "Non hai il permesso di creare \"%s\"."
+
+#: lib/Page/DeletePage.php:150
+#, php-format
+msgid "You don't have permission to delete \"%s\"."
+msgstr "Non hai il permesso di eliminare \"%s\"."
+
+#: lib/api.php:334 lib/Page/EditPage.php:107 lib/Page/RevertPage.php:133
+#: lib/Page/SyncPages.php:371
+#, php-format
+msgid "You don't have permission to edit \"%s\"."
+msgstr "Non hai il permesso di modificare \"%s\"."
+
+#: display.php:70 display.php:73 display.php:116 display.php:119
+msgid "You don't have permission to view this page."
+msgstr "Non hai permesso di visualizzare questa pagina."
+
+#: lib/Page/AttachedFiles.php:245
+msgid "You must enter a change description to attach this file."
+msgstr "Devi inserire una descrizione di cambio per allegare questo file."
+
+#: lib/api.php:338 lib/Page/EditPage.php:118
+msgid "You must provide a change log."
+msgstr "Devi fornire un cambio di log."
+
+#: lib/Wicked.php:130
+msgid "_AllPages"
+msgstr "_Tutte le pagine"
+
+#: templates/display/standard.inc:67
+msgid "_BackLinks"
+msgstr "_BackLinks"
+
+#: templates/display/standard.inc:53
+msgid "_Delete"
+msgstr "_Elimina"
+
+#: templates/display/standard.inc:25
+msgid "_EditPage"
+msgstr "_Modifica Pagina"
+
+#: templates/display/standard.inc:41
+msgid "_Lock"
+msgstr "_Blocca"
+
+#: templates/display/standard.inc:61
+msgid "_MergeOrRename"
+msgstr "_MergeOrRename"
+
+#: lib/Wicked.php:130
+msgid "_RecentChanges"
+msgstr "_Cambiamenti Recenti"
+
+#: lib/Wicked.php:130
+msgid "_WikiHome"
+msgstr "_WikiHome"
+
+#: lib/Page/AttachedFiles.php:217
+msgid "attachment"
+msgstr "allegato"
+
+#: scripts/wicked.php:123
+#, php-format
+msgid "page \"%s\" doesn't exist."
+msgstr "la pagina \"%s\" non esiste."
--- /dev/null
+# Japanese translations for Wicked package.
+# Copyright 2008-2009 The Horde Project
+# This file is distributed under the same license as the Wicked package.
+# Automatically generated, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Wicked 1.0-cvs\n"
+"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
+"POT-Creation-Date: 2008-01-09 09:58+0900\n"
+"PO-Revision-Date: 2007-12-16 15:08+0100\n"
+"Last-Translator: Takeshi Taguchi <taguchi@iij.ad.jp>\n"
+"Language-Team: i18n@lists.horde.org\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=SHIFT_JIS\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: lib/Page/Search.php:111
+#, php-format
+msgid "%s Does not exist. You can create it now."
+msgstr "%s \82Í\91¶\8dÝ\82µ\82Ü\82¹\82ñ\81B\82±\82ê\82©\82ç\8dì\90¬\82Å\82«\82Ü\82·\81B"
+
+#: templates/edit/create.inc:13
+#, php-format
+msgid ""
+"%s does not exist, but maybe you were looking for one of the following pages?"
+msgstr "%s \82Í\91¶\8dÝ\82µ\82Ü\82¹\82ñ\81B\82ª\81A\88È\89º\82Ì\83y\81[\83W\82ª\82¨\92T\82µ\82Ì\82à\82Ì\82©\82à\82µ\82ê\82Ü\82¹\82ñ\81B"
+
+#: templates/edit/create.inc:30
+#, php-format
+msgid ""
+"%s does not exist. Click on \"Create\" below if you want to create this page "
+"now and start editing."
+msgstr ""
+"%s \82Í\91¶\8dÝ\82µ\82Ü\82¹\82ñ\81B\8dì\90¬\82³\82ê\82½\82¢\8fê\8d\87\82Í\"\8dì\90¬\"\82ð\83N\83\8a\83b\83N\82µ\81A\95Ò\8fW\82ð\8aJ\8en\82µ\82Ä\82\82¾"
+"\82³\82¢\81B"
+
+#: templates/edit/create.inc:37
+msgid "(None)"
+msgstr "(\82È\82µ)"
+
+#: scripts/wicked.php:161
+msgid ""
+"-d, --debug Run in debug mode (displays extra information)"
+msgstr ""
+"-d, --debug Run in debug mode (displays extra information)"
+
+#: scripts/wicked.php:163
+msgid ""
+"-g, --get[=pagetitle] Return all pages (unless pagetitle specified)"
+msgstr ""
+"-g, --get[=pagetitle] Return all pages (unless pagetitle specified)"
+
+#: scripts/wicked.php:160
+msgid "-h, --help Show this help"
+msgstr "-h, --help Show this help"
+
+#: scripts/wicked.php:162
+msgid "-l, --list-pages List pages"
+msgstr "-l, --list-pages List pages"
+
+#: scripts/wicked.php:164
+msgid "-o, --out[=type] Output type for results (default:xml)"
+msgstr "-o, --out[=type] Output type for results (default:xml)"
+
+#: scripts/wicked.php:166
+msgid "-p, --password[=password] Horde login password"
+msgstr "-p, --password[=password] Horde login password"
+
+#: scripts/wicked.php:165
+msgid "-u, --username[=username] Horde login username"
+msgstr "-u, --username[=username] Horde login username"
+
+#: templates/display/MergeOrRename.html:31
+msgid "Add the text from this page"
+msgstr "\82±\82Ì\83y\81[\83W\82©\82ç\96{\95¶\82ð\92Ç\89Á"
+
+#: lib/Page/AddPage.php:98
+#, php-format
+msgid "AddPage: %s"
+msgstr "\92Ç\89Á\83y\81[\83W\81F%s"
+
+#: lib/Page/AllPages.php:90
+msgid "AllPages"
+msgstr "\91S\82Ä\82Ì\83y\81[\83W"
+
+#: lib/Page/DeletePage.php:83
+msgid ""
+"Are you sure you want to delete this page? All versions will be permanently "
+"removed."
+msgstr "\96{\93\96\82É\82±\82Ì\83y\81[\83W\82ð\8dí\8f\9c\82µ\82Ü\82·\82©\81H\91S\82Ä\82Ì\83o\81[\83W\83\87\83\93\82ª\8a®\91S\82É\8fÁ\8b\8e\82³\82ê\82Ü\82·\81B"
+
+#: lib/Page/DeletePage.php:85
+#, php-format
+msgid "Are you sure you want to delete version %s of this page?"
+msgstr "\96{\93\96\82É\82±\82Ì\83y\81[\83W\82Ì\83o\81[\83W\83\87\83\93 %s \82ð\8dí\8f\9c\82µ\82Ü\82·\82©\81H"
+
+#: lib/Page/RevertPage.php:71
+#, php-format
+msgid "Are you sure you want to revert to version %s of this page?"
+msgstr "\96{\93\96\82É\82±\82Ì\83y\81[\83W\82ð\83o\81[\83W\83\87\83\93 %s \82É\96ß\82µ\82Ü\82·\82©\81H"
+
+#: templates/display/AttachedFiles.html:88
+msgid "Attach File"
+msgstr "\93Y\95t\83t\83@\83C\83\8b"
+
+#: templates/display/AttachedFiles.html:52
+msgid "Attach a New File"
+msgstr "\90V\8bK\93Y\95t\83t\83@\83C\83\8b"
+
+#: templates/display/standard.inc:68
+msgid "AttachedFiles"
+msgstr "\93Y\95t\82³\82ê\82½\83t\83@\83C\83\8b"
+
+#: lib/Page/AttachedFiles.php:163
+#, php-format
+msgid "AttachedFiles: %s"
+msgstr "\93Y\95t\83t\83@\83C\83\8b\81F%s"
+
+#: templates/display/standard.inc:69
+msgid "Attached_Files"
+msgstr "\93Y\95t\83t\83@\83C\83\8b"
+
+#
+#: templates/display/AttachedFiles.html:7
+msgid "Attachment Name"
+msgstr "\93Y\95t\96¼"
+
+#: templates/display/standard.inc:105
+msgid "Attachments"
+msgstr "\93Y\95t\95¨"
+
+#: lib/Page/AttachedFiles.php:208
+msgid "Attachments with spaces can't be embedded into a page."
+msgstr "\8bó\94\92\82Ì\82Â\82¢\82½\93Y\95t\82Í\83y\81[\83W\82É\96\84\82ß\8d\9e\82ß\82Ü\82¹\82ñ\81B"
+
+#: templates/pagelist/header.inc:7 templates/history/header.inc:23
+#: templates/edit/create.inc:19 lib/Page/Search.php:157
+#: templates/display/AttachedFiles.html:10
+msgid "Author"
+msgstr "\8dì\90¬\8eÒ"
+
+#
+#: templates/display/standard.inc:92
+msgid "Ba_ck to"
+msgstr "_c\96ß\82é"
+
+#
+#: templates/display/standard.inc:92
+msgid "Back to"
+msgstr "\96ß\82é"
+
+#: templates/display/standard.inc:60
+msgid "BackLinks"
+msgstr "\83o\83b\83N\83\8a\83\93\83N"
+
+#: lib/Page/BackLinks.php:80
+#, php-format
+msgid "BackLinks: %s"
+msgstr "\83o\83b\83N\83\8a\83\93\83N: %s"
+
+#: lib/Page/AttachedFiles.php:213
+msgid "Can't read uploaded file."
+msgstr "\83A\83b\83v\83\8d\81[\83h\83t\83@\83C\83\8b\82ª\8aJ\82¯\82Ü\82¹\82ñ\81B"
+
+#: lib/Page/RevertPage.php:120
+#, php-format
+msgid "Can't revert to an unknown version."
+msgstr "\96¢\92m\82Ì\83o\81[\83W\83\87\83\93\82É\95\9c\8b\8c\82Å\82«\82Ü\82¹\82ñ\81B"
+
+#: lib/Page/AttachedFiles.php:248
+#, php-format
+msgid "Can't update \"%s\": no such attachment."
+msgstr "\"%s\" \82ð\8dX\90V\82Å\82«\82Ü\82¹\82ñ: \82»\82Ì\97l\82È\93Y\95t\82Í\82 \82è\82Ü\82¹\82ñ\81B"
+
+#
+#: templates/edit/create.inc:47 templates/edit/standard.inc:27
+#: lib/Page/DeletePage.php:104 lib/Page/MergeOrRename.php:140
+#: lib/Page/RevertPage.php:88 templates/display/MergeOrRename.html:62
+msgid "Cancel"
+msgstr "\83L\83\83\83\93\83Z\83\8b"
+
+#
+#: templates/history/header.inc:29 templates/display/AttachedFiles.html:12
+msgid "Change Log"
+msgstr "\95Ï\8dX\97\9a\97ð"
+
+#
+#: templates/edit/standard.inc:29
+msgid "Change log"
+msgstr "\95Ï\8dX\97\9a\97ð"
+
+#
+#: templates/display/AttachedFiles.html:80
+#: templates/display/AttachedFiles.html:146
+msgid "Change log entry"
+msgstr "\97\9a\97ð\8d\80\96Ú\82Ì\95Ï\8dX"
+
+#: templates/display/MergeOrRename.html:40
+msgid "Change references to this page from:"
+msgstr "\82±\82Ì\83y\81[\83W\82Ö\82Ì\8eQ\8fÆ\82Ì\95Ï\8dX"
+
+#: lib/Page/MergeOrRename.php:253
+#, php-format
+msgid "Changed references from %s to %s"
+msgstr "%s \82©\82ç %s \82Ö\82Ì\8eQ\8fÆ\82Ì\95Ï\8dX"
+
+#
+#: templates/edit/standard.inc:28
+msgid "Changelog is required"
+msgstr "\95Ï\8dX\97\9a\97ð\82ª\95K\97v\82Å\82·"
+
+#: templates/edit/create.inc:26
+msgid ""
+"Click on \"Create\" below if you want to create this page now and start "
+"editing."
+msgstr ""
+"\82±\82Ì\83y\81[\83W\82ð\8dì\90¬\82³\82ê\82½\82¢\8fê\8d\87\82Í\"Create\"\82ð\83N\83\8a\83b\83N\82µ\81A\95Ò\8fW\82ð\8aJ\8en\82µ\82Ä\89º\82³\82¢\81B"
+
+#
+#: scripts/wicked.php:42
+msgid "Couldn't read command-line options."
+msgstr "\83R\83}\83\93\83h\83\89\83C\83\93\88ø\90\94\82ð\93Ç\82Ý\8d\9e\82ß\82Ü\82¹\82ñ\81B"
+
+#: templates/edit/create.inc:46
+msgid "Create"
+msgstr "\8dì\90¬"
+
+#: lib/Page/NewPage.php:129
+#, php-format
+msgid "Create Failed: %s"
+msgstr "\8dì\90¬\8e¸\94s: %s"
+
+#
+#: templates/history/header.inc:24
+msgid "Created"
+msgstr "\8dì\90¬\8dÏ\82Ý"
+
+#
+#: templates/pagelist/header.inc:8 templates/edit/create.inc:20
+#: lib/Page/Search.php:158
+msgid "Creation Date"
+msgstr "\8dì\90¬\93ú"
+
+#: templates/display/AttachedFiles.html:11
+msgid "Date"
+msgstr "\93ú\95t"
+
+#: lib/Page/DeletePage.php:103
+msgid "Delete"
+msgstr "\8dí\8f\9c"
+
+#: templates/display/standard.inc:47
+#, php-format
+msgid "Delete %s"
+msgstr "%s \82ð\8dí\8f\9c"
+
+#
+#: templates/history/header.inc:16
+msgid "Delete Version"
+msgstr "\8dí\8f\9c\83o\81[\83W\83\87\83\93"
+
+#: templates/history/summary.inc:6
+#, php-format
+msgid "Delete Version %s"
+msgstr "\83o\81[\83W\83\87\83\93%s\82ð\8dí\8f\9c"
+
+#
+#: lib/Page/DeletePage.php:97 lib/Page/DeletePage.php:120
+msgid "DeletePage"
+msgstr "\8dí\8f\9c"
+
+#: lib/Page/DeletePage.php:142
+#, php-format
+msgid "Deleted version %s of \"%s\"."
+msgstr "\"%s\" \82Ì\83o\81[\83W\83\87\83\93\"%s\"\82ð\8dí\8f\9c"
+
+#
+#: templates/history/header.inc:26
+msgid "Diff From"
+msgstr "\88È\89º\82©\82ç\82Ì\8d·\95ª"
+
+#: templates/history/header.inc:27
+msgid "Diff To"
+msgstr "\88È\89º\82Ö\82Ì\8d·\95ª"
+
+#: diff.php:56 templates/diff/diff.inc:2
+#, php-format
+msgid "Diff for %s between %s and %s"
+msgstr "%s\82É\82¨\82¯\82é%s\82Æ%s\8aÔ\82Ì\8d·\95ª"
+
+#: templates/pagelist/summary.inc:3
+#, php-format
+msgid "Display %s"
+msgstr "\95\\8e¦ %s"
+
+#: templates/pagelist/summary.inc:6 templates/history/summary.inc:2
+#, php-format
+msgid "Display Version %s"
+msgstr "\95\\8e¦\83o\81[\83W\83\87\83\93 %s"
+
+#
+#: templates/display/AttachedFiles.html:13
+msgid "Downloads"
+msgstr "\83_\83E\83\93\83\8d\81[\83h"
+
+#: preview.php:24 templates/display/standard.inc:23
+#, php-format
+msgid "Edit %s"
+msgstr "\95Ò\8fW %s"
+
+#
+#: templates/history/header.inc:18
+msgid "Edit Version"
+msgstr "\83o\81[\83W\83\87\83\93\82Ì\95Ò\8fW"
+
+#: templates/history/summary.inc:16
+#, php-format
+msgid "Edit Version %s"
+msgstr "%s \83o\81[\83W\83\87\83\93\82Ì\95Ò\8fW"
+
+#
+#: templates/edit/standard.inc:21 lib/Page/EditPage.php:93
+msgid "EditPage"
+msgstr "\95Ò\8fW\83y\81[\83W"
+
+#: templates/display/AttachedFiles.html:67
+msgid "Enter a name for this file (if blank, will use the file's current name)"
+msgstr ""
+"\82±\82Ì\83t\83@\83C\83\8b\82Ì\96¼\91O\82ð\93ü\97Í\82µ\82Ä\89º\82³\82¢(\8bó\94\92\82È\82ç\82Î\81A\8c»\8dÝ\82Ì\83t\83@\83C\83\8b\96¼\82ª\97p\82¢\82ç\82ê\82Ü"
+"\82·)\81B"
+
+#: scripts/mail-filter.php:127
+#, php-format
+msgid "Error creating new page: %s"
+msgstr "\90V\8bK\83y\81[\83W\8dì\90¬\83G\83\89\81[: %s"
+
+#: lib/Page/MergeOrRename.php:202
+#, php-format
+msgid "Error deleting %s: %s"
+msgstr "%s\82Ì\8dí\8f\9c\83G\83\89\81[\81F%s"
+
+#: scripts/mail-filter.php:42
+#, php-format
+msgid "Error parsing MIME message: %s\n"
+msgstr "MIME\83\81\83b\83Z\81[\83W\89ð\90Í\83G\83\89\81[: %s\n"
+
+#: lib/Page/MergeOrRename.php:217
+#, php-format
+msgid "Error renaming \"%s\": %s"
+msgstr "\"%s\" \82Ì\96¼\91O\95Ï\8dX\83G\83\89\81[: %s"
+
+#: lib/Page/MergeOrRename.php:247
+#, php-format
+msgid "Error retrieving %s: %s"
+msgstr "%s \82Ì\8eó\82¯\8eæ\82è\83G\83\89\81[\81F%s"
+
+#: lib/Page/AttachedFiles.php:106 lib/Page/AttachedFiles.php:231
+#, php-format
+msgid "Error retrieving attachments: %s"
+msgstr "\93Y\95t\82Ì\8eó\82¯\8eæ\82è\83G\83\89\81[\81F%s"
+
+#: lib/Page/AddPage.php:58
+#, php-format
+msgid "Error retrieving templates: %s"
+msgstr "\83e\83\93\83v\83\8c\81[\83g\82Ì\8eó\82¯\8eæ\82è\83G\83\89\81[\81F%s"
+
+#: lib/Page/MergeOrRename.php:194 lib/Page/MergeOrRename.php:274
+#, php-format
+msgid "Error updating %s: %s"
+msgstr "%s\82Ì\8dX\90V\83G\83\89\81[: %s"
+
+#: lib/Page/Search.php:164
+msgid "Exact Match"
+msgstr "\8a®\91S\82É\88ê\92v"
+
+#: lib/Page/MergeOrRename.php:164
+#, php-format
+msgid "Failed to retrieve \"%s\": %s"
+msgstr "\"%s\"\82Ì\8eó\82¯\8eæ\82è\82É\8e¸\94s\81F%s"
+
+#
+#: lib/Page.php:274
+msgid "Guest"
+msgstr "\83Q\83X\83g"
+
+#: templates/display/standard.inc:75
+msgid "Hi_story"
+msgstr "_i\97\9a\97ð"
+
+#: templates/display/standard.inc:74
+#, php-format
+msgid "History of %s"
+msgstr "%s \82Ì\97\9a\97ð"
+
+#: history.php:30 templates/history/header.inc:7
+#, php-format
+msgid "History: %s"
+msgstr "\97\9a\97ð\81F%s"
+
+#: lib/Wicked.php:130
+msgid "HowTo_UseWiki"
+msgstr "_UWiki\82Ì\8eg\82¢\95û"
+
+#: templates/display/MergeOrRename.html:26
+msgid "If a page with the new name already exists, then"
+msgstr "\90V\82µ\82¢\96¼\91O\82ð\82à\82Â\83y\81[\83W\82ª\8aù\82É\91¶\8dÝ\82µ\82Ä\82¢\82é\82È\82ç\82Î\81A"
+
+#
+#: display.php:26 history.php:18
+msgid "Internal error viewing requested page"
+msgstr "\97v\8b\81\82³\82ê\82½\83y\81[\83W\82Ì\89{\97\97\92\86\82É\93à\95\94\83G\83\89\81[\82ª\94\90¶"
+
+#: diff.php:39
+#, php-format
+msgid "Internal error viewing requested page: %s"
+msgstr "\97v\8b\81\82³\82ê\82½\83y\81[\83W\82Ì\89{\97\97\92\86\82É\93à\95\94\83G\83\89\81[\82ª\94\90¶: %s"
+
+#: templates/display/AttachedFiles.html:133
+msgid "Is this a minor update?"
+msgstr "\82±\82ê\82Í\8f¬\8bK\96Í\82È\95Ï\8dX\82Å\82·\82©\81H"
+
+#: templates/display/standard.inc:64
+msgid "L_ikePages"
+msgstr "_i\8e\97\82½\83y\81[\83W"
+
+#: templates/edit/standard.inc:20 templates/display/title.inc:6
+#, php-format
+msgid "Last Modified %s by %s"
+msgstr "\8dÅ\8fI\8dX\90V\93ú\8e\9e %s (\8dX\90V\8eÒ: %s)"
+
+#: lib/Page/LeastPopular.php:93
+msgid "LeastPopular"
+msgstr "\8dÅ\8f¬\90l\8bC"
+
+#: templates/display/standard.inc:64
+msgid "LikePages"
+msgstr "\97Þ\8e\97\83y\81[\83W"
+
+#: lib/Page/LikePages.php:82
+#, php-format
+msgid "LikePages: %s"
+msgstr "\97Þ\8e\97\83y\81[\83W: %s"
+
+#: templates/display/standard.inc:35
+#, php-format
+msgid "Lock %s"
+msgstr "\83\8d\83b\83N %s"
+
+#: templates/edit/standard.inc:21 templates/display/title.inc:34
+#: lib/Page/DeletePage.php:97 lib/Page/RevertPage.php:81
+msgid "Locked"
+msgstr "\83\8d\83b\83N\8dÏ\82Ý"
+
+#: scripts/wicked.php:104
+#, php-format
+msgid "Logged in successfully as \"%s\"."
+msgstr "Logged in successfully as \"%s\"."
+
+#: scripts/wicked.php:100
+msgid "Login is incorrect."
+msgstr "Login is incorrect."
+
+#: scripts/wicked.php:158
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too."
+msgstr ""
+"Mandatory arguments to long options are mandatory for short options too."
+
+#
+#: templates/display/standard.inc:54
+msgid "MergeOrRename"
+msgstr "\93\9d\8d\87\82Ü\82½\82Í\96¼\91O\95Ï\8dX"
+
+#: lib/Page/MergeOrRename.php:125
+#, php-format
+msgid "MergeOrRename: %s"
+msgstr "\93\9d\8d\87\82Ü\82½\82Í\96¼\91O\95Ï\8dX: %s"
+
+#: lib/Page/MergeOrRename.php:207
+#, php-format
+msgid "Merged \"%s\" into \"%s\"."
+msgstr "\"%s\"\82ð\"%s\"\82É\93\9d\8d\87"
+
+#: lib/Page/MergeOrRename.php:210
+#, php-format
+msgid "Merged \"%s\" into \"%s\". New page: %s\n"
+msgstr "\"%s\"\82ð\"%s\"\82É\93\9d\8d\87\81B\90V\83y\81[\83W: %s\n"
+
+#: lib/Page/MergeOrRename.php:191
+#, php-format
+msgid "Merged from %s"
+msgstr "%s \82©\82ç\82Ì\93\9d\8d\87"
+
+#
+#: templates/edit/standard.inc:30
+msgid "Minor Change"
+msgstr "\8f¬\8bK\96Í\82È\95Ï\8dX"
+
+#
+#: lib/Page/MostPopular.php:93
+msgid "MostPopular"
+msgstr "\8dÅ\8d\82\90l\8bC"
+
+#
+#: lib/Block/page.php:41
+msgid "Name of wiki page to display"
+msgstr "\95\\8e¦\82·\82é\83y\81[\83W\96¼"
+
+#: lib/Page.php:263
+msgid "Never"
+msgstr "\82È\82µ"
+
+#: lib/Page/AttachedFiles.php:274
+#, php-format
+msgid "New attachment \"%s\" to page \"%s\"."
+msgstr "\83y\81[\83W\"%s\"\82Ö\82Ì\90V\8bK\93Y\95t\"%s\""
+
+#: templates/display/MergeOrRename.html:15
+msgid "New name"
+msgstr "\90V\82µ\82¢\96¼\91O"
+
+#: lib/Page/MergeOrRename.php:151
+msgid "New name is the same as old name."
+msgstr "\90V\82µ\82¢\96¼\91O\82Í\8cÃ\82¢\82à\82Ì\82Æ\93¯\82¶\82Å\82·\81B"
+
+#
+#: lib/Page/NewPage.php:106
+msgid "NewPage"
+msgstr "\90V\8bK\83y\81[\83W"
+
+#: templates/edit/new.inc:20
+#, php-format
+msgid "NewPage: %s"
+msgstr "\90V\8bK\83y\81[\83W\81F%s"
+
+#
+#: lib/Page/EditPage.php:124
+msgid "No changes made"
+msgstr "\95Ï\8dX\82È\82µ\81B"
+
+#: lib/Driver.php:124
+msgid "Not implemented."
+msgstr "\8eÀ\91\95\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B"
+
+#
+#: templates/pagelist/header.inc:5 templates/edit/create.inc:17
+#: lib/Page/Search.php:155
+msgid "Page"
+msgstr "\83y\81[\83W"
+
+#: lib/Page/MergeOrRename.php:179
+#, php-format
+msgid "Page \"%s\" already exists."
+msgstr "\83y\81[\83W \"%s\" \82Í\8aù\82É\82 \82è\82Ü\82·\81B"
+
+#
+#: lib/Page/NewPage.php:132
+msgid "Page Created"
+msgstr "\83y\81[\83W\82Í\90¶\90¬\82³\82ê\82Ü\82µ\82½"
+
+#: lib/Page/EditPage.php:131
+msgid "Page Saved"
+msgstr "\83y\81[\83W\82Í\95Û\91¶\82³\82ê\82Ü\82µ\82½"
+
+#: templates/edit/create.inc:35
+msgid "Page Template:"
+msgstr "\83y\81[\83W\90\97\8c`:"
+
+#: lib/Page/Search.php:178
+msgid "Page Text Matches"
+msgstr "\83y\81[\83W\96{\95¶\82É\83}\83b\83`"
+
+#: lib/Page/Search.php:171
+msgid "Page Title Matches"
+msgstr "\83y\81[\83W\91è\96¼\82É\83}\83b\83`"
+
+#
+#: templates/pagelist/header.inc:10
+msgid "Page Views"
+msgstr "\83y\81[\83W\95\\8e¦"
+
+#: display.php:40
+#, php-format
+msgid "Page failed to lock: %s"
+msgstr "\83y\81[\83W\82Ì\83\8d\83b\83N\82É\8e¸\94s: %s"
+
+#: display.php:55
+#, php-format
+msgid "Page failed to unlock: %s"
+msgstr "\83y\81[\83W\82Ì\83\8d\83b\83N\89ð\8f\9c\82É\8e¸\94s: %s"
+
+#: display.php:43
+msgid "Page locked"
+msgstr "\83y\81[\83W\82Í\83\8d\83b\83N\82³\82ê\82Ü\82µ\82½"
+
+#
+#: display.php:58
+msgid "Page unlocked"
+msgstr "\83y\81[\83W\83\8d\83b\83N\89ð\8f\9c"
+
+#
+#: lib/api.php:35 lib/api.php:38
+msgid "Pages"
+msgstr "\83y\81[\83W"
+
+#
+#: lib/Page/NewPage.php:123
+msgid "Pages cannot be empty."
+msgstr "\83y\81[\83W\82Í\8bó\82Å\82Í\82¢\82¯\82Ü\82¹\82ñ"
+
+#: templates/display/standard.inc:88
+msgid "Permissio_ns"
+msgstr "_n\83A\83N\83Z\83X\8c "
+
+#: templates/edit/new.inc:25 templates/edit/standard.inc:26
+msgid "Preview"
+msgstr "\83v\83\8c\83r\83\85\81["
+
+#: lib/Page/EditPage.php:112
+msgid "Random string did not match."
+msgstr "\97\90\90\94\95¶\8e\9a\97ñ\82Í\83}\83b\83`\82µ\82Ü\82¹\82ñ\81B"
+
+#: lib/Page/RecentChanges.php:113
+msgid "RecentChanges"
+msgstr "\8dÅ\8cã\82Ì\95Ï\8dX"
+
+#: lib/Page/AttachedFiles.php:63
+#, php-format
+msgid "Referrer \"%s\" does not exist."
+msgstr "\8eQ\8fÆ \"%s\" \82ª\82 \82è\82Ü\82¹\82ñ\81B"
+
+#: lib/Page/AttachedFiles.php:123
+#, php-format
+msgid "Reload \"%s\""
+msgstr "\8dÄ\93Ç\82Ý\8d\9e\82Ý \"%s\""
+
+#: templates/history/header.inc:8
+msgid "Reload History"
+msgstr "\97\9a\97ð\82ð\8dÄ\93Ç\82Ý\8d\9e\82Ý"
+
+#: templates/display/title.inc:32 templates/display/title.inc:33
+msgid "Reload Page"
+msgstr "\83y\81[\83W\82ð\8dÄ\93Ç\82Ý\8d\9e\82Ý"
+
+#: lib/Page/MergeOrRename.php:222
+#, php-format
+msgid "Renamed \"%s\" to \"%s\"."
+msgstr "\"%s\"\82ð\"%s\"\82É\96¼\91O\95Ï\8dX"
+
+#: lib/Page/MergeOrRename.php:225
+#, php-format
+msgid "Renamed \"%s\" to \"%s\". New page: %s\n"
+msgstr "\"%s\"\82ð\"%s\"\82É\96¼\91O\95Ï\8dX\81B\90V\83y\81[\83W: %s\n"
+
+#: lib/Driver/sql.php:674
+#, php-format
+msgid "Renamed page from %s"
+msgstr "%s \82©\82ç\96¼\91O\95Ï\8dX\82³\82ê\82½\83y\81[\83W"
+
+#: templates/history/header.inc:20
+msgid "Restore Version"
+msgstr "\8dÄ\8ai\94[\83o\81[\83W\83\87\83\93"
+
+#
+#: lib/Page/RevertPage.php:87
+msgid "Revert"
+msgstr "\95\9c\8b\8c"
+
+#: templates/history/summary.inc:26
+#, php-format
+msgid "Revert to version %s"
+msgstr "\83o\81[\83W\83\87\83\93%s\82É\95\9c\8b\8c"
+
+#: lib/Page/RevertPage.php:81 lib/Page/RevertPage.php:104
+msgid "RevertPage"
+msgstr "\95\9c\8b\8c\83y\81[\83W"
+
+#: lib/Page/RevertPage.php:127
+#, php-format
+msgid "Reverted to version %s of \"%s\"."
+msgstr "\"%s\"\82Ì\83o\81[\83W\83\87\83\93%s\82Ö\95\9c\8b\8c"
+
+#: lib/Driver/sql.php:589
+msgid "Robots are not allowed to create pages."
+msgstr "\83\8d\83{\83b\83g\82É\82Í\83y\81[\83W\8dì\90¬\82Í\8b\96\82³\82ê\82Ü\82¹\82ñ\81B"
+
+#: templates/edit/new.inc:24 templates/edit/standard.inc:25
+msgid "Save"
+msgstr "\95Û\91¶"
+
+#: lib/Page/EditPage.php:128
+#, php-format
+msgid "Save Failed: %s"
+msgstr "\95Û\91¶\8e¸\94s: %s"
+
+#: templates/menu.inc:19 lib/Page/Search.php:203
+msgid "Search"
+msgstr "\8c\9f\8dõ"
+
+#: templates/pagelist/search.inc:1
+msgid "Search Results"
+msgstr "\8c\9f\8dõ\8c\8b\89Ê"
+
+#: templates/display/AttachedFiles.html:58
+#: templates/display/AttachedFiles.html:110
+msgid "Select file to attach:"
+msgstr "\93Y\95t\82·\82é\83t\83@\83C\83\8b\82ð\91I\91ð:"
+
+#: templates/display/AttachedFiles.html:119
+msgid "Select the file to update"
+msgstr "\8dX\90V\82·\82é\83t\83@\83C\83\8b\82ð\91I\91ð"
+
+#: templates/display/standard.inc:87
+#, php-format
+msgid "Set permissions for %s"
+msgstr "%s\82Ì\83A\83N\83Z\83X\8c \82ð\90Ý\92è"
+
+#: templates/display/title.inc:16 lib/Page/RecentChanges.php:56
+#, php-format
+msgid "Show changes for %s"
+msgstr "%s \82Ì\95Ï\8dX\82ð\95\\8e¦"
+
+#: lib/Page/RecentChanges.php:63
+#, php-format
+msgid "Show version %s"
+msgstr "\83o\81[\83W\83\87\83\93%s \82ð\95\\8e¦"
+
+#: templates/edit/standard.inc:41
+msgid "Spam Protection - Enter the letters below:"
+msgstr "SPAM\91Î\8dô - \88È\89º\82Ì\95¶\8e\9a\82ð\93ü\97Í\82µ\82Ä\89º\82³\82¢:"
+
+#: templates/display/MergeOrRename.html:33
+msgid "Stop and don't do anything"
+msgstr "\92â\8e~\82µ\82Ä\89½\82à\8ds\82í\82È\82¢\82Å\89º\82³\82¢\81B"
+
+#: templates/display/MergeOrRename.html:61
+msgid "Submit"
+msgstr "\8eÀ\8ds"
+
+#: lib/Page/DeletePage.php:136
+#, php-format
+msgid "Successfully deleted \"%s\"."
+msgstr "\"%s\" \82ª\8dí\8f\9c\82³\82ê\82Ü\82µ\82½\81B"
+
+#: lib/Page/AttachedFiles.php:198
+#, php-format
+msgid "Successfully deleted version %s of \"%s\" from \"%s\""
+msgstr "\"%s\"\82©\82ç \"%s\" \82Ì\83o\81[\83W\83\87\83\93%s\82ª\8dí\8f\9c\82³\82ê\82Ü\82µ\82½\81B"
+
+#: lib/Page.php:483
+msgid "Table of Contents"
+msgstr "\96Ú\8e\9f"
+
+#: lib/Page/AttachedFiles.php:254
+#, php-format
+msgid "There is already an attachment named \"%s\"."
+msgstr "\93Y\95t \"%s\" \82Í\8aù\82É\91¶\8dÝ\82µ\82Ä\82¢\82Ü\82·\81B"
+
+#: lib/Page/MergeOrRename.php:149 lib/Page/MergeOrRename.php:155
+msgid "This is a required field."
+msgstr "\82±\82Ì\8d\80\96Ú\82Í\95K\90{\82Å\82·\81B"
+
+#: display.php:70
+msgid "This page does not have a history"
+msgstr "\82±\82Ì\83y\81[\83W\82É\82Í\97\9a\97ð\82ª\82 \82è\82Ü\82¹\82ñ"
+
+#: lib/Page/MergeOrRename.php:100
+#, php-format
+msgid "This page is referenced from %d other page(s)."
+msgstr "\82±\82Ì\83y\81[\83W\82Í %d \96\87\82Ì\83y\81[\83W\82©\82ç\8eQ\8fÆ\82³\82ê\82Ä\82¢\82Ü\82·\81B"
+
+#: templates/display/standard.inc:32
+msgid "Un_lock"
+msgstr "_l\83\8d\83b\83N\89ð\8f\9c"
+
+#: lib/Page/StandardPage.php:79
+#, php-format
+msgid "Unable to create %s"
+msgstr "%s \82ð\90¶\90¬\82Å\82«\82Ü\82¹\82ñ\81B"
+
+#: lib/Page/StandardPage.php:87
+msgid "Unable to create WikiHome. The wiki is not configured."
+msgstr "WikiHome\82ð\90¶\90¬\82Å\82«\82Ü\82¹\82ñ\81Bwiki\82Ì\90Ý\92è\82ª\8a®\97¹\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B"
+
+#: templates/display/standard.inc:31
+#, php-format
+msgid "Unlock %s"
+msgstr "\83\8d\83b\83N\89ð\8f\9c %s"
+
+#: lib/Driver.php:78 lib/Driver.php:92 lib/Driver.php:104 lib/Driver.php:109
+#: lib/Driver.php:129 lib/Driver.php:134 lib/Driver.php:192 lib/Driver.php:197
+#: lib/Driver.php:202 lib/Driver.php:216 lib/Driver.php:230 lib/Driver.php:244
+#: lib/Driver.php:249 lib/Driver.php:254 lib/Driver.php:272 lib/Driver.php:392
+#: lib/Driver.php:418 lib/Driver.php:434 lib/Page.php:255 lib/Page.php:289
+#: lib/Page.php:294 lib/Page.php:393 lib/Page.php:403 lib/Page.php:413
+#: lib/Page.php:423 lib/Page.php:518 lib/Page.php:529 lib/Page.php:534
+#: lib/Page.php:539 lib/Page.php:544 lib/Page.php:584
+msgid "Unsupported"
+msgstr "\83T\83|\81[\83g\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B"
+
+#: templates/display/AttachedFiles.html:154
+msgid "Update File"
+msgstr "\83t\83@\83C\83\8b\8dX\90V"
+
+#
+#: templates/display/AttachedFiles.html:104
+msgid "Update an Attachment"
+msgstr "\93Y\95t\8dX\90V"
+
+#: lib/Page/AttachedFiles.php:272
+#, php-format
+msgid "Updated attachment \"%s\" on page \"%s\"."
+msgstr "\83y\81[\83W \"%s\"\82Ì\93Y\95t \"%s\" \82ð\8dX\90V\82µ\82Ü\82µ\82½\81B"
+
+#: scripts/wicked.php:156
+#, php-format
+msgid "Usage: %s [OPTIONS]..."
+msgstr "Usage: %s [OPTIONS]..."
+
+#: templates/pagelist/header.inc:6 templates/history/header.inc:13
+#: templates/edit/create.inc:18 lib/Page/Search.php:156
+#: templates/display/AttachedFiles.html:9
+msgid "Version"
+msgstr "\83o\81[\83W\83\87\83\93"
+
+#: lib/Page/AttachedFiles.php:279
+msgid "View page: "
+msgstr "\83y\81[\83W\95\\8e¦:"
+
+#: lib/Block/page.php:3
+msgid "Wiki page"
+msgstr "Wiki\83y\81[\83W"
+
+#: display.php:34
+msgid "You are not allowed to lock this page"
+msgstr "\82 \82È\82½\82Í\82±\82Ì\83y\81[\83W\82ð\83\8d\83b\83N\82Å\82«\82Ü\82¹\82ñ\81B"
+
+#: display.php:49
+msgid "You are not allowed to unlock this page"
+msgstr "\82 \82È\82½\82Í\82±\82Ì\83y\81[\83W\82ð\83\8d\83b\83N\89ð\8f\9c\82Å\82«\82Ü\82¹\82ñ\81B"
+
+#: lib/Page/AttachedFiles.php:188
+msgid "You do not have permission to delete attachments from this page."
+msgstr "\82 \82È\82½\82É\82Í\82±\82Ì\83y\81[\83W\82©\82ç\93Y\95t\82ð\8dí\8f\9c\82·\82é\8c \8cÀ\82ª\82 \82è\82Ü\82¹\82ñ\81B"
+
+#: lib/Page/AttachedFiles.php:218 lib/Page/MergeOrRename.php:169
+#: lib/Page/MergeOrRename.php:184
+#, php-format
+msgid "You do not have permission to edit \"%s\""
+msgstr "\82 \82È\82½\82É\82Í\"%s\"\82ð\95Ò\8fW\82·\82é\8c \8cÀ\82ª\82 \82è\82Ü\82¹\82ñ\81B"
+
+#: lib/Page/NewPage.php:119
+#, php-format
+msgid "You don't have permission to create \"%s\"."
+msgstr "\82 \82È\82½\82É\82Í\"%s\"\82ð\8dì\90¬\82·\82é\8c \8cÀ\82ª\82 \82è\82Ü\82¹\82ñ\81B"
+
+#: lib/Page/DeletePage.php:150
+#, php-format
+msgid "You don't have permission to delete \"%s\"."
+msgstr "\82 \82È\82½\82É\82Í\"%s\"\82ð\8dí\8f\9c\82·\82é\8c \8cÀ\82ª\82 \82è\82Ü\82¹\82ñ\81B"
+
+#: lib/Page/EditPage.php:107 lib/Page/RevertPage.php:133
+#, php-format
+msgid "You don't have permission to edit \"%s\"."
+msgstr "\82 \82È\82½\82É\82Í\"%s\"\82ð\95Ò\8fW\82·\82é\8c \8cÀ\82ª\82 \82è\82Ü\82¹\82ñ\81B"
+
+#: display.php:82 display.php:85
+msgid "You don't have permission to view this page."
+msgstr "\82 \82È\82½\82Í\82±\82Ì\83y\81[\83W\82ð\8c©\82é\8c \8cÀ\82ª\82 \82è\82Ü\82¹\82ñ\81B"
+
+#: lib/Page/AttachedFiles.php:224
+msgid "You must enter a change description to attach this file."
+msgstr "\82±\82Ì\83t\83@\83C\83\8b\82ð\93Y\95t\82·\82é\95Ï\8dX\82Ì\90à\96¾\82ð\93ü\97Í\82µ\82È\82¯\82ê\82Î\82È\82è\82Ü\82¹\82ñ\81B"
+
+#: lib/Page/EditPage.php:118
+msgid "You must provide a change log."
+msgstr "\95Ï\8dX\83\8d\83O\82ð\92ñ\8b\9f\82µ\82È\82¯\82ê\82Î\82È\82è\82Ü\82¹\82ñ\81B"
+
+#: lib/Wicked.php:130
+msgid "_AllPages"
+msgstr "_A\91S\95\94\82Ì\83y\81[\83W"
+
+#: templates/display/standard.inc:60
+msgid "_BackLinks"
+msgstr "_B\83o\83b\83N\83\8a\83\93\83N"
+
+#: templates/display/standard.inc:48
+msgid "_Delete"
+msgstr "_D\8dí\8f\9c"
+
+#: templates/display/standard.inc:24
+msgid "_EditPage"
+msgstr "_E\95Ò\8fW"
+
+#: templates/display/standard.inc:36
+msgid "_Lock"
+msgstr "_L\83\8d\83b\83N"
+
+#: templates/display/standard.inc:55
+msgid "_MergeOrRename"
+msgstr "_M\93\9d\8d\87\82Ü\82½\82Í\96¼\91O\95Ï\8dX"
+
+#: lib/Wicked.php:130
+msgid "_RecentChanges"
+msgstr "_R\8dÅ\8cã\82Ì\95Ï\8dX"
+
+#: lib/Wicked.php:130
+msgid "_WikiHome"
+msgstr "_W\83z\81[\83\80"
+
+#: scripts/wicked.php:123
+#, php-format
+msgid "page \"%s\" doesn't exist."
+msgstr "\83y\81[\83W \"%s\" \82Í\91¶\8dÝ\82µ\82Ü\82¹\82ñ\81B"
--- /dev/null
+# translation of pt_BR.po to Português brasileiro
+# Portuguese translations for Wicked package.
+# Copyright 2008-2009 The Horde Project
+# This file is distributed under the same license as the Wicked package.
+#
+# Automatically generated, 2008.
+# Luis Felipe Marzagao <duli@fedoraproject.org>, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: pt_BR\n"
+"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
+"POT-Creation-Date: 2008-08-01 10:45+0200\n"
+"PO-Revision-Date: 2008-12-28 16:40-0200\n"
+"Last-Translator: Luis Felipe Marzagao <duli@fedoraproject.org>\n"
+"Language-Team: Português brasileiro <i18n@lists.horde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: templates/edit/create.inc:13
+#, php-format
+msgid ""
+"%s does not exist, but maybe you were looking for one of the following pages?"
+msgstr ""
+"%s não existe, mas talvez você estivesse procurando por uma das seguintes "
+"páginas?"
+
+#: templates/edit/create.inc:30
+#, php-format
+msgid ""
+"%s does not exist. Click on \"Create\" below if you want to create this page "
+"now and start editing."
+msgstr ""
+"%s não existe. Clique em \"Criar\" abaixo se você deseja criar esta página e "
+"editá-la."
+
+#: lib/Page/Search.php:111
+#, php-format
+msgid "%s does not exist. You can create it now."
+msgstr "%s não existe. Você pode criá-la agora."
+
+#: templates/edit/create.inc:37
+msgid "(None)"
+msgstr "(Nenhum)"
+
+#: scripts/wicked.php:161
+msgid ""
+"-d, --debug Run in debug mode (displays extra information)"
+msgstr ""
+"-d, --debug Run in debug mode (displays extra information)"
+
+#: scripts/wicked.php:163
+msgid ""
+"-g, --get[=pagetitle] Return all pages (unless pagetitle specified)"
+msgstr ""
+"-g, --get[=pagetitle] Return all pages (unless pagetitle specified)"
+
+#: scripts/wicked.php:160
+msgid "-h, --help Show this help"
+msgstr "-h, --help Show this help"
+
+#: scripts/wicked.php:162
+msgid "-l, --list-pages List pages"
+msgstr "-l, --list-pages List pages"
+
+#: scripts/wicked.php:164
+msgid "-o, --out[=type] Output type for results (default:xml)"
+msgstr "-o, --out[=type] Output type for results (default:xml)"
+
+#: scripts/wicked.php:166
+msgid "-p, --password[=password] Horde login password"
+msgstr "-p, --password[=password] Horde login password"
+
+#: scripts/wicked.php:165
+msgid "-u, --username[=username] Horde login username"
+msgstr "-u, --username[=username] Horde login username"
+
+#: templates/display/MergeOrRename.html:31
+msgid "Add the text from this page"
+msgstr "Adicionar o texto desta página"
+
+#: lib/Page/AddPage.php:108
+#, php-format
+msgid "AddPage: %s"
+msgstr "AdicionarPágina: %s"
+
+#: lib/Page/AllPages.php:90
+msgid "AllPages"
+msgstr "TodasAsPáginas"
+
+#: lib/Page/DeletePage.php:83
+msgid ""
+"Are you sure you want to delete this page? All versions will be permanently "
+"removed."
+msgstr ""
+"Deseja realmente apagar esta página? Todas as versões serão removidas de "
+"forma permanente."
+
+#: lib/Page/DeletePage.php:85
+#, php-format
+msgid "Are you sure you want to delete version %s of this page?"
+msgstr "Deseja realmente apagar a versão %s desta página?"
+
+#: lib/Page/RevertPage.php:71
+#, php-format
+msgid "Are you sure you want to revert to version %s of this page?"
+msgstr "Deseja realmente reverter para a versão %s desta página?"
+
+#: templates/display/AttachedFiles.html:88
+msgid "Attach File"
+msgstr "Anexar Arquivo"
+
+#: templates/display/AttachedFiles.html:52
+msgid "Attach a New File"
+msgstr "Anexar um Novo Arquivo"
+
+#: templates/display/standard.inc:77
+msgid "AttachedFiles"
+msgstr "ArquivosAnexados"
+
+#: lib/Page/AttachedFiles.php:171
+#, php-format
+msgid "AttachedFiles: %s"
+msgstr "ArquivosAnexados: %s"
+
+#: templates/display/standard.inc:78
+msgid "Attached_Files"
+msgstr "Arquivos_Anexados"
+
+#: templates/display/AttachedFiles.html:7
+msgid "Attachment Name"
+msgstr "Nome do Anexo"
+
+#: templates/display/standard.inc:117
+msgid "Attachments"
+msgstr "Anexos"
+
+#: lib/Page/AttachedFiles.php:225
+msgid "Attachments with spaces can't be embedded into a page."
+msgstr "Anexos com espaços não podem ser incorporados em uma página."
+
+#: templates/history/header.inc:23 templates/pagelist/header.inc:7
+#: templates/edit/create.inc:19 lib/Page/Search.php:157
+#: templates/display/AttachedFiles.html:10
+msgid "Author"
+msgstr "Autor"
+
+#: templates/display/standard.inc:104
+msgid "Ba_ck to"
+msgstr "Retorna_r para"
+
+#: templates/display/standard.inc:104
+msgid "Back to"
+msgstr "Retornar para"
+
+#: templates/display/standard.inc:67
+msgid "BackLinks"
+msgstr "Referenciadores"
+
+#: lib/Page/BackLinks.php:80
+#, php-format
+msgid "BackLinks: %s"
+msgstr "Referenciadores: %s"
+
+#: lib/Page/AttachedFiles.php:231
+msgid "Can't read uploaded file."
+msgstr "Impossível ler arquivo enviado."
+
+#: lib/Page/RevertPage.php:120
+#, php-format
+msgid "Can't revert to an unknown version."
+msgstr "Impossível reverter para uma versão desconhecida."
+
+#: lib/Page/AttachedFiles.php:271
+#, php-format
+msgid "Can't update \"%s\": no such attachment."
+msgstr "Impossível atualizar \"%s\": anexo inexistente."
+
+#: templates/edit/create.inc:47 templates/edit/standard.inc:27
+#: lib/Page/DeletePage.php:104 lib/Page/RevertPage.php:88
+#: lib/Page/MergeOrRename.php:140 templates/display/MergeOrRename.html:62
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: templates/history/header.inc:29 templates/display/AttachedFiles.html:12
+msgid "Change Log"
+msgstr "Log de Alterações"
+
+#: templates/edit/standard.inc:29
+msgid "Change log"
+msgstr "Log de alterações"
+
+#: templates/display/AttachedFiles.html:80
+#: templates/display/AttachedFiles.html:146
+msgid "Change log entry"
+msgstr "Registro do log de alterações"
+
+#: templates/display/MergeOrRename.html:40
+msgid "Change references to this page from:"
+msgstr "Alterar referências para essa página de:"
+
+#: lib/Page/MergeOrRename.php:253
+#, php-format
+msgid "Changed references from %s to %s"
+msgstr "Referências alteradas de %s para %s"
+
+#: templates/edit/standard.inc:28
+msgid "Changelog is required"
+msgstr "Log de alterações é necessário"
+
+#: templates/edit/create.inc:26
+msgid ""
+"Click on \"Create\" below if you want to create this page now and start "
+"editing."
+msgstr ""
+"Clique em \"Criar\" abaixo se você deseja criar esta página e editá-la."
+
+#: scripts/wicked.php:42
+msgid "Couldn't read command-line options."
+msgstr "Não foi possível ler opções de linha de comando."
+
+#: templates/edit/create.inc:46
+msgid "Create"
+msgstr "Criar"
+
+#: lib/Page/NewPage.php:135
+#, php-format
+msgid "Create Failed: %s"
+msgstr "Criação Falhou: %s"
+
+#: templates/history/header.inc:24
+msgid "Created"
+msgstr "Criado"
+
+#: templates/pagelist/header.inc:8 templates/edit/create.inc:20
+#: lib/Page/Search.php:158
+msgid "Creation Date"
+msgstr "Data de Criação"
+
+#: templates/display/AttachedFiles.html:11
+msgid "Date"
+msgstr "Data"
+
+#: lib/Page/DeletePage.php:103
+msgid "Delete"
+msgstr "Excluir"
+
+#: templates/display/standard.inc:52
+#, php-format
+msgid "Delete %s"
+msgstr "Excluir %s"
+
+#: templates/history/header.inc:16
+msgid "Delete Version"
+msgstr "Delete Version"
+
+#: templates/history/summary.inc:6
+#, php-format
+msgid "Delete Version %s"
+msgstr "Delete Version %s"
+
+#: lib/Page/DeletePage.php:97 lib/Page/DeletePage.php:120
+msgid "DeletePage"
+msgstr "ApagarPágina"
+
+#: lib/Page/DeletePage.php:142
+#, php-format
+msgid "Deleted version %s of \"%s\"."
+msgstr "Apagar versão %s de \"%s\"."
+
+#: templates/history/header.inc:26
+msgid "Diff From"
+msgstr "Diferenciar De"
+
+#: templates/history/header.inc:27
+msgid "Diff To"
+msgstr "Diferenciar Para"
+
+#: diff.php:56 templates/diff/diff.inc:2
+#, php-format
+msgid "Diff for %s between %s and %s"
+msgstr "Diferenciar para %s entre %s e %s"
+
+#: templates/pagelist/summary.inc:3
+#, php-format
+msgid "Display %s"
+msgstr "Exibir %s"
+
+#: templates/history/summary.inc:2 templates/pagelist/summary.inc:6
+#, php-format
+msgid "Display Version %s"
+msgstr "Exibir Versão %s"
+
+#: templates/display/AttachedFiles.html:13
+msgid "Downloads"
+msgstr "Downloads"
+
+#: preview.php:24 templates/display/standard.inc:24
+#, php-format
+msgid "Edit %s"
+msgstr "Editar %s"
+
+#: templates/history/header.inc:18
+msgid "Edit Version"
+msgstr "Editar Versão"
+
+#: templates/history/summary.inc:16
+#, php-format
+msgid "Edit Version %s"
+msgstr "Editar Versão %s"
+
+#: templates/edit/standard.inc:21 lib/Page/EditPage.php:93
+msgid "EditPage"
+msgstr "EditarPágina"
+
+#: templates/display/AttachedFiles.html:67
+msgid "Enter a name for this file (if blank, will use the file's current name)"
+msgstr ""
+"Digite um nome para este arquivo (se vazio, será usado o nome atual do "
+"arquivo)"
+
+#: scripts/mail-filter.php:127
+#, php-format
+msgid "Error creating new page: %s"
+msgstr "Erro ao criar nova página: %s"
+
+#: lib/Page/MergeOrRename.php:202
+#, php-format
+msgid "Error deleting %s: %s"
+msgstr "Erro ao apagar %s: %s"
+
+#: scripts/mail-filter.php:42
+#, php-format
+msgid "Error parsing MIME message: %s\n"
+msgstr "Erro ao processar mensagem MIME: %s\n"
+
+#: lib/Page/MergeOrRename.php:217
+#, php-format
+msgid "Error renaming \"%s\": %s"
+msgstr "Erro ao renomear \"%s\": %s"
+
+#: lib/Page/MergeOrRename.php:247
+#, php-format
+msgid "Error retrieving %s: %s"
+msgstr "Erro ao retornar %s: %s"
+
+#: lib/Page/AttachedFiles.php:111 lib/Page/AttachedFiles.php:253
+#, php-format
+msgid "Error retrieving attachments: %s"
+msgstr "Erro ao retornar anexos: %s"
+
+#: lib/Page/AddPage.php:68
+#, php-format
+msgid "Error retrieving templates: %s"
+msgstr "Erro ao retornar modelos: %s"
+
+#: lib/Page/MergeOrRename.php:194 lib/Page/MergeOrRename.php:274
+#, php-format
+msgid "Error updating %s: %s"
+msgstr "Erro ao atualizar %s: %s"
+
+#: lib/Page/Search.php:164
+msgid "Exact Match"
+msgstr "Correspondência Exata"
+
+#: lib/Page/MergeOrRename.php:164
+#, php-format
+msgid "Failed to retrieve \"%s\": %s"
+msgstr "Falha ao retornar \"%s\": %s"
+
+#: lib/Page.php:274
+msgid "Guest"
+msgstr "Convidado"
+
+#: templates/display/standard.inc:85
+msgid "Hi_story"
+msgstr "Hi_stórico"
+
+#: templates/display/standard.inc:84
+#, php-format
+msgid "History of %s"
+msgstr "Histórico de %s"
+
+#: lib/Page/StandardPage/StdHistoryPage.php:46
+msgid "History page not found"
+msgstr "Página de histórico não encontrada"
+
+#: history.php:30 templates/history/header.inc:7
+#, php-format
+msgid "History: %s"
+msgstr "Histórico: %s"
+
+#: lib/Wicked.php:130
+msgid "HowTo_UseWiki"
+msgstr "Como_UsarWiki"
+
+#: templates/display/MergeOrRename.html:26
+msgid "If a page with the new name already exists, then"
+msgstr "Se uma página com o novo nome já existir, então"
+
+#: history.php:18 display.php:18
+msgid "Internal error viewing requested page"
+msgstr "Erro interno ao exibir a página requisitada"
+
+#: diff.php:39
+#, php-format
+msgid "Internal error viewing requested page: %s"
+msgstr "Erro interno ao exibir a página requisitada: %s"
+
+#: lib/api.php:224
+msgid "Invalid page requested."
+msgstr "Página requisitada inválida."
+
+#: templates/display/AttachedFiles.html:133
+msgid "Is this a minor update?"
+msgstr "Esta é uma pequena atualização?"
+
+#: templates/display/standard.inc:72
+msgid "L_ikePages"
+msgstr "PáginasParec_idas"
+
+#: templates/display/title.inc:6 templates/edit/standard.inc:20
+#, php-format
+msgid "Last Modified %s by %s"
+msgstr "Modificado em %s por %s"
+
+#: lib/Page/LeastPopular.php:93
+msgid "LeastPopular"
+msgstr "MenosPopular"
+
+#: templates/display/standard.inc:72
+msgid "LikePages"
+msgstr "PáginasParecidas"
+
+#: lib/Page/LikePages.php:82
+#, php-format
+msgid "LikePages: %s"
+msgstr "PáginasParecidas: %s"
+
+#: templates/display/standard.inc:40
+#, php-format
+msgid "Lock %s"
+msgstr "Proteger %s"
+
+#: templates/display/title.inc:34 templates/edit/standard.inc:21
+#: lib/Page/DeletePage.php:97 lib/Page/RevertPage.php:81
+msgid "Locked"
+msgstr "Protegida"
+
+#: scripts/wicked.php:104
+#, php-format
+msgid "Logged in successfully as \"%s\"."
+msgstr "Sucesso ao entrar como \"%s\"."
+
+#: scripts/wicked.php:100
+msgid "Login is incorrect."
+msgstr "Login está errado."
+
+#: scripts/wicked.php:158
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too."
+msgstr ""
+"Argumentos essenciais para opções longas são essenciais para opções pequenas "
+"também."
+
+#: templates/display/standard.inc:60
+msgid "MergeOrRename"
+msgstr "CombinarOuRenomear"
+
+#: lib/Page/MergeOrRename.php:125
+#, php-format
+msgid "MergeOrRename: %s"
+msgstr "CombinarOuRenomear: %s"
+
+#: lib/Page/MergeOrRename.php:207
+#, php-format
+msgid "Merged \"%s\" into \"%s\"."
+msgstr "\"%s\" combinada em \"%s\"."
+
+#: lib/Page/MergeOrRename.php:210
+#, php-format
+msgid "Merged \"%s\" into \"%s\". New page: %s\n"
+msgstr "\"%s\" combinada em \"%s\". Nova página: %s\n"
+
+#: lib/Page/MergeOrRename.php:191
+#, php-format
+msgid "Merged from %s"
+msgstr "Combinada de %s"
+
+#: templates/edit/standard.inc:30
+msgid "Minor Change"
+msgstr "Pequena Alteração"
+
+#: lib/Page/MostPopular.php:93
+msgid "MostPopular"
+msgstr "MaisPopular"
+
+#: lib/Block/page.php:41
+msgid "Name of wiki page to display"
+msgstr "Nome da página wiki para exibir"
+
+#: lib/Page.php:263
+msgid "Never"
+msgstr "Nunca"
+
+#: lib/Page/AttachedFiles.php:303
+#, php-format
+msgid "New attachment \"%s\" to page \"%s\"."
+msgstr "Novo anexo \"%s\" para a página \"%s\"."
+
+#: templates/display/MergeOrRename.html:15
+msgid "New name"
+msgstr "Novo nome"
+
+#: lib/Page/MergeOrRename.php:151
+msgid "New name is the same as old name."
+msgstr "Novo nome é o mesmo que o anterior."
+
+#: lib/Page/NewPage.php:112
+msgid "NewPage"
+msgstr "NovaPágina"
+
+#: templates/edit/new.inc:20
+#, php-format
+msgid "NewPage: %s"
+msgstr "NovaPágina: %s"
+
+#: lib/api.php:159 lib/Page/EditPage.php:124
+msgid "No changes made"
+msgstr "Nenhuma mudança feita"
+
+#: lib/Driver.php:124
+msgid "Not implemented."
+msgstr "Não Implementado."
+
+#: templates/pagelist/header.inc:5 templates/edit/create.inc:17
+#: lib/Page/Search.php:155
+msgid "Page"
+msgstr "Página"
+
+#: lib/Page/MergeOrRename.php:179
+#, php-format
+msgid "Page \"%s\" already exists."
+msgstr "Página \"%s\" já existe."
+
+#: lib/Page/NewPage.php:138
+msgid "Page Created"
+msgstr "Página Criada"
+
+#: lib/Page/EditPage.php:131
+msgid "Page Saved"
+msgstr "Página Gravada"
+
+#: templates/edit/create.inc:35
+msgid "Page Template:"
+msgstr "Modelo de Página:"
+
+#: lib/Page/Search.php:178
+msgid "Page Text Matches"
+msgstr "Correspondências de Textos de Página"
+
+#: lib/Page/Search.php:171
+msgid "Page Title Matches"
+msgstr "Correspondências de Títulos de Página"
+
+#: templates/pagelist/header.inc:10
+msgid "Page Views"
+msgstr "Exibições da Página"
+
+#: display.php:32
+#, php-format
+msgid "Page failed to lock: %s"
+msgstr "Falha ao proteger página: %s"
+
+#: display.php:47
+#, php-format
+msgid "Page failed to unlock: %s"
+msgstr "Falha ao desproteger página: %s"
+
+#: display.php:35
+msgid "Page locked"
+msgstr "Página protegida"
+
+#: lib/Driver/sql.php:587 lib/Page/AddPage.php:53 lib/Page/NewPage.php:72
+msgid "Page name must not be empty"
+msgstr "Nome da página não pode ser vazio"
+
+#: display.php:50
+msgid "Page unlocked"
+msgstr "Página desprotegida"
+
+#: lib/api.php:73 lib/api.php:76
+msgid "Pages"
+msgstr "Páginas"
+
+#: lib/Page/NewPage.php:129
+msgid "Pages cannot be empty."
+msgstr "Páginas não podem ser vazias."
+
+#: templates/display/standard.inc:100
+msgid "Permissio_ns"
+msgstr "Permissõ_es"
+
+#: lib/api.php:220
+msgid "Permission denied."
+msgstr "Permissão negada."
+
+#: templates/edit/new.inc:25 templates/edit/standard.inc:26
+msgid "Preview"
+msgstr "Pré-visualização"
+
+#: lib/Page/EditPage.php:112
+msgid "Random string did not match."
+msgstr "Frase aleatória não correspondeu."
+
+#: lib/Page/RecentChanges.php:113
+msgid "RecentChanges"
+msgstr "AlteraçõesRecentes"
+
+#: lib/Page/AttachedFiles.php:67
+#, php-format
+msgid "Referrer \"%s\" does not exist."
+msgstr "Referenciador \"%s\" não existe."
+
+#: lib/Page/AttachedFiles.php:129
+#, php-format
+msgid "Reload \"%s\""
+msgstr "Recarregar \"%s\""
+
+#: templates/history/header.inc:8
+msgid "Reload History"
+msgstr "Recarregar Histórico"
+
+#: templates/display/title.inc:32 templates/display/title.inc:33
+msgid "Reload Page"
+msgstr "Recarregar Página"
+
+#: lib/Page/MergeOrRename.php:222
+#, php-format
+msgid "Renamed \"%s\" to \"%s\"."
+msgstr "Renomeada \"%s\" para \"%s\"."
+
+#: lib/Page/MergeOrRename.php:225
+#, php-format
+msgid "Renamed \"%s\" to \"%s\". New page: %s\n"
+msgstr "\"%s\" renomeada para \"%s\". Nova página: %s\n"
+
+#: lib/Driver/sql.php:676
+#, php-format
+msgid "Renamed page from %s"
+msgstr "Página renomeada de %s"
+
+#: templates/history/header.inc:20
+msgid "Restore Version"
+msgstr "Restaurar Versão"
+
+#: lib/Page/RevertPage.php:87
+msgid "Revert"
+msgstr "Reverter"
+
+#: templates/history/summary.inc:26
+#, php-format
+msgid "Revert to version %s"
+msgstr "Reverter para versão %s"
+
+#: lib/Page/RevertPage.php:81 lib/Page/RevertPage.php:104
+msgid "RevertPage"
+msgstr "ReverterPágina"
+
+#: lib/Page/RevertPage.php:127
+#, php-format
+msgid "Reverted to version %s of \"%s\"."
+msgstr "Revertida para versão %s de \"%s\"."
+
+#: lib/Driver/sql.php:591
+msgid "Robots are not allowed to create pages"
+msgstr "Robôs não podem criar páginas"
+
+#: templates/edit/new.inc:24 templates/edit/standard.inc:25
+msgid "Save"
+msgstr "Gravar"
+
+#: lib/Page/EditPage.php:128
+#, php-format
+msgid "Save Failed: %s"
+msgstr "Gravação Falhou: %s"
+
+#: templates/menu.inc:19 lib/Page/Search.php:203
+msgid "Search"
+msgstr "Pesquisar"
+
+#: templates/pagelist/search.inc:1
+msgid "Search Results"
+msgstr "Resultados da Pesquisa"
+
+#: templates/display/AttachedFiles.html:58
+#: templates/display/AttachedFiles.html:110
+msgid "Select file to attach:"
+msgstr "Selecione o arquivo para anexar:"
+
+#: templates/display/AttachedFiles.html:119
+msgid "Select the file to update"
+msgstr "Selecione o arquivo para atualizar"
+
+#: templates/display/standard.inc:99
+#, php-format
+msgid "Set permissions for %s"
+msgstr "Ajustar permissões para %s"
+
+#: templates/display/title.inc:16 lib/Page/RecentChanges.php:56
+#, php-format
+msgid "Show changes for %s"
+msgstr "Exibir alterações para %s"
+
+#: lib/Page/RecentChanges.php:63
+#, php-format
+msgid "Show version %s"
+msgstr "Exibir versão %s"
+
+#: templates/edit/standard.inc:41
+msgid "Spam Protection - Enter the letters below:"
+msgstr "Proteção contra Spam - Digite as letras abaixo:"
+
+#: templates/display/MergeOrRename.html:33
+msgid "Stop and don't do anything"
+msgstr "Parar e não fazer nada"
+
+#: templates/display/MergeOrRename.html:61
+msgid "Submit"
+msgstr "Enviar"
+
+#: lib/Page/DeletePage.php:136
+#, php-format
+msgid "Successfully deleted \"%s\"."
+msgstr "\"%s\" excluido com sucesso."
+
+#: lib/Page/AttachedFiles.php:207
+#, php-format
+msgid "Successfully deleted version %s of \"%s\" from \"%s\""
+msgstr "Versão %s de \"%s\" de \"%s\" apagada com sucesso."
+
+#: lib/Page.php:485
+msgid "Table of Contents"
+msgstr "Índice"
+
+#: lib/Page/AttachedFiles.php:280
+#, php-format
+msgid "There is already an attachment named \"%s\"."
+msgstr "Já existe um anexo chamado \"%s\"."
+
+#: lib/Page/MergeOrRename.php:149 lib/Page/MergeOrRename.php:155
+msgid "This is a required field."
+msgstr "Este é um campo necessário."
+
+#: display.php:62
+msgid "This page does not have a history"
+msgstr "Esta página não possui um histórico"
+
+#: lib/Page/MergeOrRename.php:100
+#, php-format
+msgid "This page is referenced from %d other page(s)."
+msgstr "Esta página é referenciada a partir de %d outra(s) página(s)."
+
+#: templates/display/standard.inc:35
+msgid "Un_lock"
+msgstr "_Desproteger"
+
+#: lib/Page/StandardPage.php:79
+#, php-format
+msgid "Unable to create %s"
+msgstr "Impossível criar %s"
+
+#: lib/Page/StandardPage.php:87
+msgid "Unable to create WikiHome. The wiki is not configured."
+msgstr "Impossível criar WikiHome. O wiki não está configurado."
+
+#: templates/display/standard.inc:34
+#, php-format
+msgid "Unlock %s"
+msgstr "Desproteger %s"
+
+#: lib/Driver.php:78 lib/Driver.php:92 lib/Driver.php:104 lib/Driver.php:109
+#: lib/Driver.php:129 lib/Driver.php:134 lib/Driver.php:192 lib/Driver.php:197
+#: lib/Driver.php:202 lib/Driver.php:216 lib/Driver.php:230 lib/Driver.php:244
+#: lib/Driver.php:249 lib/Driver.php:254 lib/Driver.php:272 lib/Driver.php:392
+#: lib/Driver.php:418 lib/Driver.php:434 lib/Page.php:255 lib/Page.php:289
+#: lib/Page.php:294 lib/Page.php:393 lib/Page.php:403 lib/Page.php:413
+#: lib/Page.php:423 lib/Page.php:520 lib/Page.php:531 lib/Page.php:536
+#: lib/Page.php:541 lib/Page.php:546 lib/Page.php:586
+msgid "Unsupported"
+msgstr "Não suportado"
+
+#: templates/display/AttachedFiles.html:154
+msgid "Update File"
+msgstr "Atualizar Arquivo"
+
+#: templates/display/AttachedFiles.html:104
+msgid "Update an Attachment"
+msgstr "Atualizar um Anexo"
+
+#: lib/Page/AttachedFiles.php:300
+#, php-format
+msgid "Updated attachment \"%s\" on page \"%s\"."
+msgstr "Atualizado anexo \"%s\" na página \"%s\"."
+
+#: scripts/wicked.php:156
+#, php-format
+msgid "Usage: %s [OPTIONS]..."
+msgstr "Usage: %s [OPTIONS]..."
+
+#: templates/history/header.inc:13 templates/pagelist/header.inc:6
+#: templates/edit/create.inc:18 lib/Page/Search.php:156
+#: templates/display/AttachedFiles.html:9
+msgid "Version"
+msgstr "Versão"
+
+#: lib/Page/AttachedFiles.php:309
+msgid "View page: "
+msgstr "Exibir página: "
+
+#: lib/api.php:181
+msgid "Wiki Templates"
+msgstr "Modelos de Wiki"
+
+#: lib/Block/page.php:3
+msgid "Wiki page"
+msgstr "Página Wiki"
+
+#: display.php:26
+msgid "You are not allowed to lock this page"
+msgstr "Você não pode proteger esta página"
+
+#: display.php:41
+msgid "You are not allowed to unlock this page"
+msgstr "Você não pode desproteger esta página"
+
+#: lib/Page/AttachedFiles.php:196
+msgid "You do not have permission to delete attachments from this page."
+msgstr "Você não tem permissão para apagar anexos dessa página."
+
+#: lib/Page/AttachedFiles.php:237 lib/Page/MergeOrRename.php:169
+#: lib/Page/MergeOrRename.php:184
+#, php-format
+msgid "You do not have permission to edit \"%s\""
+msgstr "Você não tem permissão para editar \"%s\""
+
+#: lib/Page/NewPage.php:125
+#, php-format
+msgid "You don't have permission to create \"%s\"."
+msgstr "Você não tem permissão para criar \"%s\"."
+
+#: lib/Page/DeletePage.php:150
+#, php-format
+msgid "You don't have permission to delete \"%s\"."
+msgstr "Você não tem permissão para apagar \"%s\"."
+
+#: lib/api.php:141 lib/Page/EditPage.php:107 lib/Page/RevertPage.php:133
+#, php-format
+msgid "You don't have permission to edit \"%s\"."
+msgstr "Você não tem permissão para editar \"%s\"."
+
+#: display.php:74 display.php:77
+msgid "You don't have permission to view this page."
+msgstr "Você não tem permissão para ver esta página."
+
+#: lib/Page/AttachedFiles.php:245
+msgid "You must enter a change description to attach this file."
+msgstr "Você deve digitar uma descrição de alteração para anexar esse arquivo."
+
+#: lib/api.php:145 lib/Page/EditPage.php:118
+msgid "You must provide a change log."
+msgstr "Você deve fornecer um log de alteração."
+
+#: lib/Wicked.php:130
+msgid "_AllPages"
+msgstr "TodasA_sPáginas"
+
+#: templates/display/standard.inc:67
+msgid "_BackLinks"
+msgstr "_Referenciadores"
+
+#: templates/display/standard.inc:53
+msgid "_Delete"
+msgstr "E_xcluir"
+
+#: templates/display/standard.inc:25
+msgid "_EditPage"
+msgstr "_EditarPágina"
+
+#: templates/display/standard.inc:41
+msgid "_Lock"
+msgstr "_Proteger"
+
+#: templates/display/standard.inc:61
+msgid "_MergeOrRename"
+msgstr "Co_mbinarOuRenomear"
+
+#: lib/Wicked.php:130
+msgid "_RecentChanges"
+msgstr "_AlteraçõesRecentes"
+
+#: lib/Wicked.php:130
+msgid "_WikiHome"
+msgstr "_WikiHome"
+
+#: lib/Page/AttachedFiles.php:217
+msgid "attachment"
+msgstr "anexo"
+
+#: scripts/wicked.php:123
+#, php-format
+msgid "page \"%s\" doesn't exist."
+msgstr "página \"%s\" não existe."
--- /dev/null
+# translation of wicked.po to Slovene
+# Copyright 2007-2009 The Horde Project
+# This file is distributed under the same license as the Horde package.
+#
+# Marko Milost <marko.milost@obala.si>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: wicked\n"
+"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
+"POT-Creation-Date: 2007-02-03 18:57+0100\n"
+"PO-Revision-Date: 2007-02-07 11:51+0100\n"
+"Last-Translator: Marko Milost <marko.milost@obala.si>\n"
+"Language-Team: Slovene <sl@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: templates/edit/create.inc:13
+#, php-format
+msgid ""
+"%s does not exist, but maybe you were looking for one of the following pages?"
+msgstr "%s ne obstaja, si morda iskal eno od spodaj nanizanih strani?"
+
+#: templates/edit/create.inc:30
+#, php-format
+msgid ""
+"%s does not exist. Click on \"Create\" below if you want to create this page "
+"now and start editing."
+msgstr ""
+"%s ne obstaja. Klikni na \"Ustvari\", če želiš ustvariti novo stran in "
+"začeti z urejanjem le-te."
+
+#: templates/edit/create.inc:37
+msgid "(None)"
+msgstr "(Nič)"
+
+#: scripts/wicked.php:161
+msgid ""
+"-d, --debug Run in debug mode (displays extra information)"
+msgstr ""
+
+#: scripts/wicked.php:163
+msgid ""
+"-g, --get[=pagetitle] Return all pages (unless pagetitle specified)"
+msgstr ""
+
+#: scripts/wicked.php:160
+msgid "-h, --help Show this help"
+msgstr ""
+
+#: scripts/wicked.php:162
+msgid "-l, --list-pages List pages"
+msgstr ""
+
+#: scripts/wicked.php:164
+msgid "-o, --out[=type] Output type for results (default:xml)"
+msgstr ""
+
+#: scripts/wicked.php:166
+msgid "-p, --password[=password] Horde login password"
+msgstr ""
+
+#: scripts/wicked.php:165
+msgid "-u, --username[=username] Horde login username"
+msgstr ""
+
+#: templates/display/MergeOrRename.html:31
+msgid "Add the text from this page"
+msgstr "Dodaj besedilo iz te strani"
+
+#: lib/Page/AddPage.php:93
+#, php-format
+msgid "AddPage: %s"
+msgstr "Dodaj stran: %s"
+
+#: lib/Page/AllPages.php:81
+msgid "AllPages"
+msgstr "VseStrani"
+
+#: lib/Page/DeletePage.php:77
+msgid ""
+"Are you sure you want to delete this page? All versions will be permanently "
+"removed."
+msgstr ""
+"Si prepričan, da želiš odstraniti to stran? Vse verzije bodo dokončno "
+"pobrisane."
+
+#: lib/Page/DeletePage.php:79
+#, php-format
+msgid "Are you sure you want to delete version %s of this page?"
+msgstr "Si prepričan, da želiš pobrisati verzijo %s te strani?"
+
+#: lib/Page/RevertPage.php:65
+#, php-format
+msgid "Are you sure you want to revert to version %s of this page?"
+msgstr "Si prepričan, da želiš nazadovati to stran na verzijo %s?"
+
+#: templates/display/AttachedFiles.html:88
+msgid "Attach File"
+msgstr "Dodaj priponko"
+
+#: templates/display/AttachedFiles.html:52
+msgid "Attach a New File"
+msgstr "Dodaj novo datoteko"
+
+#: templates/display/standard.inc:68
+msgid "AttachedFiles"
+msgstr "Priponke"
+
+#: lib/Page/AttachedFiles.php:158
+#, php-format
+msgid "AttachedFiles: %s"
+msgstr "Priponke: %s"
+
+#: templates/display/standard.inc:69
+msgid "Attached_Files"
+msgstr "Priponke"
+
+#: templates/display/AttachedFiles.html:7
+msgid "Attachment Name"
+msgstr "Ime priponke"
+
+#: templates/display/standard.inc:119
+msgid "Attachments"
+msgstr "Priponke"
+
+#: lib/Page/AttachedFiles.php:203
+msgid "Attachments with spaces can't be embedded into a page."
+msgstr "V to stran ne morete dodati priponk s presledki."
+
+#: templates/history/header.inc:23 templates/pagelist/header.inc:5
+#: templates/pagelist/pagesearch.inc:16 templates/pagelist/titlesearch.inc:16
+#: templates/edit/create.inc:19 templates/display/AttachedFiles.html:10
+msgid "Author"
+msgstr "Avtor"
+
+#: templates/display/standard.inc:106
+msgid "Ba_ck to"
+msgstr "Nazaj na"
+
+#: templates/display/standard.inc:106
+msgid "Back to"
+msgstr "Nazaj na"
+
+#: templates/display/standard.inc:60
+msgid "BackLinks"
+msgstr "PovezaveNazaj"
+
+#: lib/Page/BackLinks.php:74
+#, php-format
+msgid "BackLinks: %s"
+msgstr "PovezaveNazaj: %s"
+
+#: lib/Page/AttachedFiles.php:208
+msgid "Can't read uploaded file."
+msgstr "Ne morem prebrati naložene datoteke."
+
+#: lib/Page/RevertPage.php:113
+#, php-format
+msgid "Can't revert to an unknown version."
+msgstr "Ne morem preklopiti na neznano verzijo."
+
+#: lib/Page/AttachedFiles.php:243
+#, php-format
+msgid "Can't update \"%s\": no such attachment."
+msgstr "Ne morem osvežiti \"%s\": ni priponke."
+
+#: templates/edit/create.inc:47 templates/edit/standard.inc:33
+#: lib/Page/DeletePage.php:98 lib/Page/RevertPage.php:82
+#: lib/Page/MergeOrRename.php:135 templates/display/MergeOrRename.html:62
+msgid "Cancel"
+msgstr "Prekliči"
+
+#: templates/history/header.inc:29 templates/display/AttachedFiles.html:12
+msgid "Change Log"
+msgstr "Dnevnik sprememb"
+
+#: templates/edit/standard.inc:35
+msgid "Change log"
+msgstr "Dnevnik sprememb"
+
+#: templates/display/AttachedFiles.html:80
+#: templates/display/AttachedFiles.html:146
+msgid "Change log entry"
+msgstr "Vpis v dnevniki sprememb"
+
+#: config/prefs.php.dist:13
+msgid "Change menu preferences."
+msgstr "Spremeni nastavitve menija"
+
+#: templates/display/MergeOrRename.html:40
+msgid "Change references to this page from:"
+msgstr "Spremeni referenco na to stran iz:"
+
+#: lib/Page/MergeOrRename.php:248
+#, php-format
+msgid "Changed references from %s to %s"
+msgstr "Spremenjena referenca iz %s na %s"
+
+#: templates/edit/standard.inc:34
+msgid "Changelog is required"
+msgstr "Zahtevan je dnevnik sprememb"
+
+#: templates/edit/create.inc:26
+msgid ""
+"Click on \"Create\" below if you want to create this page now and start "
+"editing."
+msgstr ""
+"Če želiš ustvariti to stran in začeti z urejanjem klikni na \"Ustvari\"."
+
+#: scripts/wicked.php:42
+msgid "Couldn't read command-line options."
+msgstr ""
+
+#: templates/edit/create.inc:46
+msgid "Create"
+msgstr "Ustvari"
+
+#: lib/Page/NewPage.php:124
+#, php-format
+msgid "Create Failed: %s"
+msgstr "Napaka pri ustvarjanju: %s"
+
+#: templates/history/header.inc:24
+msgid "Created"
+msgstr "Ustvarjeno"
+
+#: templates/pagelist/header.inc:6 templates/pagelist/pagesearch.inc:17
+#: templates/pagelist/titlesearch.inc:17 templates/edit/create.inc:20
+msgid "Creation Date"
+msgstr "Datum stvaritve"
+
+#: templates/display/AttachedFiles.html:11
+msgid "Date"
+msgstr "Datum"
+
+#: templates/display/standard.inc:89
+msgid "Debug"
+msgstr "Debug"
+
+#: templates/display/standard.inc:88
+#, php-format
+msgid "Debug %s"
+msgstr "Debug %s"
+
+#: lib/Page/DeletePage.php:97
+msgid "Delete"
+msgstr "Briši"
+
+#: templates/display/standard.inc:47
+#, php-format
+msgid "Delete %s"
+msgstr "Zbriši %s"
+
+#: templates/history/header.inc:16
+msgid "Delete Version"
+msgstr "Zbriši verzijo"
+
+#: templates/history/summary.inc:6
+#, php-format
+msgid "Delete Version %s"
+msgstr "Zbriši verzijo %s"
+
+#: lib/Page/DeletePage.php:91 lib/Page/DeletePage.php:114
+msgid "DeletePage"
+msgstr "PobrišiStran"
+
+#: lib/Page/DeletePage.php:137
+#, php-format
+msgid "Deleted version %s of \"%s\"."
+msgstr "Pobriši verzijo %s od \"%s\"."
+
+#: templates/history/header.inc:26
+msgid "Diff From"
+msgstr "Razlika od"
+
+#: templates/history/header.inc:27
+msgid "Diff To"
+msgstr "Razlika do"
+
+#: diff.php:56 templates/diff/diff.inc:2
+#, php-format
+msgid "Diff for %s between %s and %s"
+msgstr "Razlika za %s med %s in %s"
+
+#: templates/pagelist/summary.inc:3
+#, php-format
+msgid "Display %s"
+msgstr "Prikaži %s"
+
+#: config/prefs.php.dist:11
+msgid "Display Options"
+msgstr "Možnosti prikaza"
+
+#: templates/history/summary.inc:2 templates/pagelist/summary.inc:6
+#, php-format
+msgid "Display Version %s"
+msgstr "Prikaz verzije %s"
+
+#: templates/display/AttachedFiles.html:13
+msgid "Downloads"
+msgstr "Downloads"
+
+#: preview.php:24 templates/display/standard.inc:23
+#, php-format
+msgid "Edit %s"
+msgstr "Uredi %s"
+
+#: templates/history/header.inc:18
+msgid "Edit Version"
+msgstr "Uredi verzijo"
+
+#: templates/history/summary.inc:16
+#, php-format
+msgid "Edit Version %s"
+msgstr "Uredi verzijo %s"
+
+#: templates/edit/standard.inc:22 lib/Page/EditPage.php:88
+msgid "EditPage"
+msgstr "UrediStran"
+
+#: templates/display/AttachedFiles.html:67
+msgid "Enter a name for this file (if blank, will use the file's current name)"
+msgstr "Vpiši ime za to datoteko (če pustiš prazno bo uporabljen naziv)"
+
+#: scripts/mail-filter.php:127
+#, php-format
+msgid "Error creating new page: %s"
+msgstr "Napaka pri stvaritvi strani: %s"
+
+#: lib/Page/MergeOrRename.php:197
+#, php-format
+msgid "Error deleting %s: %s"
+msgstr "Napaka pri brisanju %s: %s"
+
+#: scripts/mail-filter.php:42
+#, php-format
+msgid "Error parsing MIME message: %s\n"
+msgstr "Napaka pri prebiranju MIME sporočila: %s\n"
+
+#: lib/Page/MergeOrRename.php:212
+#, php-format
+msgid "Error renaming \"%s\": %s"
+msgstr "Napaka pri preimenovanju \"%s\": %s"
+
+#: lib/Page/MergeOrRename.php:242
+#, php-format
+msgid "Error retrieving %s: %s"
+msgstr "Napaka pri dostopanju %s: %s"
+
+#: lib/Page/AttachedFiles.php:101 lib/Page/AttachedFiles.php:226
+#, php-format
+msgid "Error retrieving attachments: %s"
+msgstr "Napaka pri dostopanju do priponke: %s"
+
+#: lib/Page/AddPage.php:53
+#, php-format
+msgid "Error retrieving templates: %s"
+msgstr "Napaka pri dostopanju do šablon: %s"
+
+#: lib/Page/MergeOrRename.php:189 lib/Page/MergeOrRename.php:269
+#, php-format
+msgid "Error updating %s: %s"
+msgstr "Napaka pri osveževanju %s: %s"
+
+#: lib/Page/MergeOrRename.php:159
+#, php-format
+msgid "Failed to retrieve \"%s\": %s"
+msgstr "Ni uspelo dobiti \"%s\": %s"
+
+#: templates/pagelist/titlesearch.inc:8
+msgid "Go"
+msgstr "Pojdi"
+
+#: lib/Page.php:278
+msgid "Guest"
+msgstr "Gost"
+
+#: templates/display/standard.inc:75
+msgid "Hi_story"
+msgstr "Zgodovina"
+
+#: templates/display/standard.inc:74
+#, php-format
+msgid "History of %s"
+msgstr "Zgodovina dokumenta %s"
+
+#: history.php:28 templates/history/header.inc:7
+#, php-format
+msgid "History: %s"
+msgstr "Zgodovina: %s"
+
+#: lib/Wicked.php:131
+msgid "HowTo_UseWiki"
+msgstr "KakoUporabimWiki"
+
+#: templates/display/MergeOrRename.html:26
+msgid "If a page with the new name already exists, then"
+msgstr "Če stran s tem imenom že obstaja, potem"
+
+#: templates/display/standard.inc:82
+msgid "Info"
+msgstr "Informacije"
+
+#: templates/display/standard.inc:81
+#, php-format
+msgid "Info about %s"
+msgstr "Info o %s"
+
+#: history.php:16 display.php:24
+msgid "Internal error viewing requested page"
+msgstr "Interna napaka pri pregledovanju zahtevane strani"
+
+#: diff.php:39
+#, php-format
+msgid "Internal error viewing requested page: %s"
+msgstr "Interna napaka pri pregledovanju zahtevane strani: %s"
+
+#: templates/display/AttachedFiles.html:133
+msgid "Is this a minor update?"
+msgstr "Je to manjša nadgradnja?"
+
+#: templates/display/standard.inc:64
+msgid "L_ikePages"
+msgstr "PodobneStrani"
+
+#: templates/display/title.inc:6 templates/edit/standard.inc:25
+#, php-format
+msgid "Last Modified %s by %s"
+msgstr "Zadje spremenjeno %s s strani %s"
+
+#: lib/Page/LeastPopular.php:86
+msgid "LeastPopular"
+msgstr "NajmanjPopularen"
+
+#: templates/display/standard.inc:64
+msgid "LikePages"
+msgstr "PodobneStrani"
+
+#: lib/Page/LikePages.php:76
+#, php-format
+msgid "LikePages: %s"
+msgstr "PodobneStrani: %s"
+
+#: templates/display/standard.inc:35
+#, php-format
+msgid "Lock %s"
+msgstr "Zakleni %s"
+
+#: templates/display/title.inc:34 templates/edit/standard.inc:22
+#: lib/Page/DeletePage.php:91 lib/Page/RevertPage.php:75
+msgid "Locked"
+msgstr "Zaklenjeno"
+
+#: scripts/wicked.php:104
+#, php-format
+msgid "Logged in successfully as \"%s\"."
+msgstr "Uspešno prijavljen kot \"%s\"."
+
+#: scripts/wicked.php:100
+msgid "Login is incorrect."
+msgstr "Napačna prijava."
+
+#: scripts/wicked.php:158
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too."
+msgstr "Obvezna polja za dolge opcije so obvezna tudi za kratke opcije."
+
+#: config/prefs.php.dist:12
+msgid "Menu Preferences"
+msgstr "Nastavitve menija"
+
+#: templates/display/standard.inc:54
+msgid "MergeOrRename"
+msgstr "ZdružiAliPreimenuj"
+
+#: lib/Page/MergeOrRename.php:120
+#, php-format
+msgid "MergeOrRename: %s"
+msgstr "ZdružiAliPreimenuj: %s"
+
+#: lib/Page/MergeOrRename.php:202
+#, php-format
+msgid "Merged \"%s\" into \"%s\"."
+msgstr "Združen \"%s\" v \"%s\"."
+
+#: lib/Page/MergeOrRename.php:205
+#, php-format
+msgid "Merged \"%s\" into \"%s\". New page: %s\n"
+msgstr "Združen \"%s\" v \"%s\". Nova stran: %s\n"
+
+#: lib/Page/MergeOrRename.php:186
+#, php-format
+msgid "Merged from %s"
+msgstr "Združeno iz %s."
+
+#: templates/edit/standard.inc:36
+msgid "Minor Change"
+msgstr "Manjša sprememba"
+
+#: lib/Page/MostPopular.php:86
+msgid "MostPopular"
+msgstr "NajboljPopularno"
+
+#: lib/Block/page.php:41
+msgid "Name of wiki page to display"
+msgstr "Ime wiki strani za prikaz"
+
+#: lib/Page.php:267
+msgid "Never"
+msgstr "Nikoli"
+
+#: lib/Page/AttachedFiles.php:269
+#, php-format
+msgid "New attachment \"%s\" to page \"%s\"."
+msgstr "Nova priponka \"%s\" na stran \"%s\"."
+
+#: templates/display/MergeOrRename.html:15
+msgid "New name"
+msgstr "Novo ime"
+
+#: lib/Page/MergeOrRename.php:146
+msgid "New name is the same as old name."
+msgstr "Novo ime je enako kot staro"
+
+#: lib/Page/NewPage.php:101
+msgid "NewPage"
+msgstr "NovaStran"
+
+#: templates/edit/new.inc:22
+#, php-format
+msgid "NewPage: %s"
+msgstr "NovaStran: %s"
+
+#: lib/Page/EditPage.php:119
+msgid "No changes made"
+msgstr "Ni sprememb"
+
+#: lib/Driver.php:126
+msgid "Not implemented."
+msgstr "Ni implementirano."
+
+#: templates/pagelist/header.inc:3 templates/pagelist/pagesearch.inc:14
+#: templates/pagelist/titlesearch.inc:14 templates/edit/create.inc:17
+msgid "Page"
+msgstr "Stran"
+
+#: lib/Page/MergeOrRename.php:174
+#, php-format
+msgid "Page \"%s\" already exists."
+msgstr "Stran \"%s\" že obstaja."
+
+#: lib/Page/NewPage.php:127
+msgid "Page Created"
+msgstr "Stran ustvarjena"
+
+#: templates/menu.inc:15 config/prefs.php.dist:22
+msgid "Page Lookup"
+msgstr "Pogled strani"
+
+#: lib/Page/EditPage.php:126
+msgid "Page Saved"
+msgstr "Stran shranjena"
+
+#: templates/edit/create.inc:35
+msgid "Page Template:"
+msgstr "Šablona strani:"
+
+#: templates/pagelist/header.inc:8
+msgid "Page Views"
+msgstr "Pogledi strani"
+
+#: display.php:38
+#, php-format
+msgid "Page failed to lock: %s"
+msgstr "Stran ni bilo mogoče zakleniti: %s"
+
+#: display.php:53
+#, php-format
+msgid "Page failed to unlock: %s"
+msgstr "Strani ni bilo mogoče odkleniti: %s"
+
+#: display.php:41
+msgid "Page locked"
+msgstr "Stran zaklenjena"
+
+#: display.php:56
+msgid "Page unlocked"
+msgstr "Stran odklenjena"
+
+#: templates/menu.inc:9 lib/Page/PageSearch.php:130 config/prefs.php.dist:24
+msgid "PageSearch"
+msgstr "IskanjeStrani"
+
+#: lib/api.php:30 lib/api.php:33
+msgid "Pages"
+msgstr "Strani"
+
+#: lib/Page/NewPage.php:118
+msgid "Pages cannot be empty."
+msgstr "Strani ne morejo biti prazne."
+
+#: templates/display/standard.inc:102
+msgid "Permissio_ns"
+msgstr "Dovoljenja"
+
+#: templates/edit/new.inc:29 templates/edit/standard.inc:32
+msgid "Preview"
+msgstr "Predpregled"
+
+#: lib/Page/EditPage.php:107
+msgid "Random string did not match."
+msgstr "Naključni niz ni enakovreden"
+
+#: lib/Page/RecentChanges.php:108
+msgid "RecentChanges"
+msgstr "ZadnjeSpremembe"
+
+#: lib/Page/AttachedFiles.php:58
+#, php-format
+msgid "Referrer \"%s\" does not exist."
+msgstr "Ne obstaja referrer za \"%s\"."
+
+#: lib/Page/AttachedFiles.php:118
+#, php-format
+msgid "Reload \"%s\""
+msgstr "Osveži \"%s\""
+
+#: templates/history/header.inc:8
+msgid "Reload History"
+msgstr "Osveži zgodovino"
+
+#: templates/display/title.inc:32 templates/display/title.inc:33
+msgid "Reload Page"
+msgstr "Osveži stran"
+
+#: lib/Page/MergeOrRename.php:217
+#, php-format
+msgid "Renamed \"%s\" to \"%s\"."
+msgstr "Preimenovan \"%s\" v \"%s\"."
+
+#: lib/Page/MergeOrRename.php:220
+#, php-format
+msgid "Renamed \"%s\" to \"%s\". New page: %s\n"
+msgstr "Preimenovan \"%s\" v \"%s\". Nova stran: %s\n"
+
+#: lib/Driver/sql.php:658
+#, php-format
+msgid "Renamed page from %s"
+msgstr "Preimenovana stran iz %s"
+
+#: templates/history/header.inc:20
+msgid "Restore Version"
+msgstr "Povrni verzijo"
+
+#: lib/Page/RevertPage.php:81
+msgid "Revert"
+msgstr "Povrni"
+
+#: templates/history/summary.inc:26
+#, php-format
+msgid "Revert to version %s"
+msgstr "Povrni na verzijo %s"
+
+#: lib/Page/RevertPage.php:75 lib/Page/RevertPage.php:98
+msgid "RevertPage"
+msgstr "PovrniStran"
+
+#: lib/Page/RevertPage.php:121
+#, php-format
+msgid "Reverted to version %s of \"%s\"."
+msgstr "Povrnjeno na verzijo %s od \"%s\"."
+
+#: lib/Driver/sql.php:573
+msgid "Robots are not allowed to create pages."
+msgstr "Roboti ne morejo ustvariti strani."
+
+#: templates/edit/new.inc:28 templates/edit/standard.inc:31
+msgid "Save"
+msgstr "Shrani"
+
+#: lib/Page/EditPage.php:123
+#, php-format
+msgid "Save Failed: %s"
+msgstr "Shranjevanje \"%s\" ni uspelo."
+
+#: templates/pagelist/pagesearch.inc:8 lib/Block/TitleSearch.php:60
+msgid "Search"
+msgstr "Najdi"
+
+#: templates/display/AttachedFiles.html:58
+#: templates/display/AttachedFiles.html:110
+msgid "Select file to attach:"
+msgstr "Izberi datoteko za pripeti:"
+
+#: templates/display/AttachedFiles.html:119
+msgid "Select the file to update"
+msgstr "Izberi datoteko za osvežiti"
+
+#: templates/display/standard.inc:101
+#, php-format
+msgid "Set permissions for %s"
+msgstr "Nastavi pravice dostopa za %s"
+
+#: templates/display/title.inc:16 lib/Page/RecentChanges.php:51
+#, php-format
+msgid "Show changes for %s"
+msgstr "Prikaži spremembe za %s"
+
+#: lib/Page/RecentChanges.php:58
+#, php-format
+msgid "Show version %s"
+msgstr "Prikaži verzijo %s"
+
+#: templates/edit/standard.inc:49
+msgid "Spam Protection - Enter the letters below:"
+msgstr "Zaščita pred roboti - Vpišite spodnje znake:"
+
+#: templates/display/MergeOrRename.html:33
+msgid "Stop and don't do anything"
+msgstr "Ustavi se in ne počni ničesar"
+
+#: templates/display/MergeOrRename.html:61
+msgid "Submit"
+msgstr "Pošlji"
+
+#: lib/Page/DeletePage.php:131
+#, php-format
+msgid "Successfully deleted \"%s\"."
+msgstr "Uspešno pobrisan \"%s\"."
+
+#: lib/Page/AttachedFiles.php:193
+#, php-format
+msgid "Successfully deleted version %s of \"%s\" from \"%s\""
+msgstr "Uspešno pobrisana verzija %s od \"%s\" iz \"%s\""
+
+#: lib/Page.php:516
+msgid "Table of Contents"
+msgstr "Spisek vsebine"
+
+#: lib/Page/AttachedFiles.php:249
+#, php-format
+msgid "There is already an attachment named \"%s\"."
+msgstr "Že obstaja priponka z imenom \"%s\"."
+
+#: lib/Page/MergeOrRename.php:144 lib/Page/MergeOrRename.php:150
+msgid "This is a required field."
+msgstr "To je zahtevano polje."
+
+#: display.php:68
+msgid "This page does not have a history"
+msgstr "Ta stran nima zgodovine"
+
+#: lib/Page/MergeOrRename.php:95
+#, php-format
+msgid "This page is referenced from %d other page(s)."
+msgstr "Na to stran kaže %d drugih strani."
+
+#: templates/menu.inc:5 lib/Block/TitleSearch.php:3
+#: lib/Block/TitleSearch.php:25 lib/Page/TitleSearch.php:116
+#: config/prefs.php.dist:23
+msgid "TitleSearch"
+msgstr "IskanjeNaslova"
+
+#: config/prefs.php.dist:25
+msgid "Type of search for the quick search box:"
+msgstr "Tip iskanja v polju za hitro iskanje:"
+
+#: templates/display/standard.inc:32
+msgid "Un_lock"
+msgstr "Odkleni"
+
+#: lib/Page/StandardPage.php:74
+#, php-format
+msgid "Unable to create %s"
+msgstr "Ni možno ustvariti %s"
+
+#: lib/Page/StandardPage.php:82
+msgid "Unable to create WikiHome. The wiki is not configured."
+msgstr "Ni možno ustvariti WikiDom. Wiki ni nastavljen."
+
+#: templates/display/standard.inc:31
+#, php-format
+msgid "Unlock %s"
+msgstr "Odkleni %s"
+
+#: lib/Driver.php:80 lib/Driver.php:94 lib/Driver.php:106 lib/Driver.php:111
+#: lib/Driver.php:131 lib/Driver.php:136 lib/Driver.php:194
+#: lib/Driver.php:199 lib/Driver.php:204 lib/Driver.php:218
+#: lib/Driver.php:232 lib/Driver.php:246 lib/Driver.php:251
+#: lib/Driver.php:256 lib/Driver.php:274 lib/Driver.php:394
+#: lib/Driver.php:420 lib/Driver.php:436 lib/Page.php:259 lib/Page.php:293
+#: lib/Page.php:298 lib/Page.php:397 lib/Page.php:407 lib/Page.php:417
+#: lib/Page.php:427 lib/Page.php:437 lib/Page.php:448 lib/Page.php:557
+#: lib/Page.php:568 lib/Page.php:573 lib/Page.php:578 lib/Page.php:583
+#: lib/Page.php:623
+msgid "Unsupported"
+msgstr "Ni podprto"
+
+#: templates/display/AttachedFiles.html:154
+msgid "Update File"
+msgstr "Osveži datoteko"
+
+#: templates/display/AttachedFiles.html:104
+msgid "Update an Attachment"
+msgstr "Osveži priponko"
+
+#: lib/Page/AttachedFiles.php:267
+#, php-format
+msgid "Updated attachment \"%s\" on page \"%s\"."
+msgstr "Osvežena priponka \"%s\" na strani \"%s\"."
+
+#: scripts/wicked.php:156
+#, php-format
+msgid "Usage: %s [OPTIONS]..."
+msgstr "Uporaba: %s [OPCIJE]..."
+
+#: templates/history/header.inc:13 templates/pagelist/header.inc:4
+#: templates/pagelist/pagesearch.inc:15 templates/pagelist/titlesearch.inc:15
+#: templates/edit/create.inc:18 templates/display/AttachedFiles.html:9
+msgid "Version"
+msgstr "Verzija"
+
+#: lib/Page/AttachedFiles.php:274
+msgid "View page: "
+msgstr "Poglej stran: "
+
+#: lib/Block/page.php:3
+msgid "Wiki page"
+msgstr "Wiki stran"
+
+#: display.php:32
+msgid "You are not allowed to lock this page"
+msgstr "Nimaš pravic za zaklep te strani"
+
+#: display.php:47
+msgid "You are not allowed to unlock this page"
+msgstr "Nimaš pravic za odklep te strani"
+
+#: lib/Page/AttachedFiles.php:183
+msgid "You do not have permission to delete attachments from this page."
+msgstr "Nimaš pravic za brisanje priponk s te strani."
+
+#: lib/Page/AttachedFiles.php:213 lib/Page/MergeOrRename.php:164
+#: lib/Page/MergeOrRename.php:179
+#, php-format
+msgid "You do not have permission to edit \"%s\""
+msgstr "Nimaš pravice za urejanje \"%s\""
+
+#: lib/Page/NewPage.php:114
+#, php-format
+msgid "You don't have permission to create \"%s\"."
+msgstr "Nimaš pravic za ustvariti \"%s\"."
+
+#: lib/Page/DeletePage.php:145
+#, php-format
+msgid "You don't have permission to delete \"%s\"."
+msgstr "Nimaš pravic za brisati \"%s\"."
+
+#: lib/Page/EditPage.php:102 lib/Page/RevertPage.php:127
+#, php-format
+msgid "You don't have permission to edit \"%s\"."
+msgstr "Nimaš pravic za urediti \"%s\"."
+
+#: display.php:80 display.php:83
+msgid "You don't have permission to view this page."
+msgstr "Nimaš pravic za pregled te strani."
+
+#: lib/Page/AttachedFiles.php:219
+msgid "You must enter a change description to attach this file."
+msgstr "Moraš vnesti drugi opis, da lahko pripnemo to datoteko."
+
+#: lib/Page/EditPage.php:113
+msgid "You must provide a change log."
+msgstr "Moraš dostaviti dnevnik sprememb."
+
+#: lib/Wicked.php:132
+msgid "_AllPages"
+msgstr "VseStrani"
+
+#: templates/display/standard.inc:60
+msgid "_BackLinks"
+msgstr "PovezaveNazaj"
+
+#: templates/display/standard.inc:48
+msgid "_Delete"
+msgstr "Briši"
+
+#: templates/display/standard.inc:24
+msgid "_EditPage"
+msgstr "UrediStran"
+
+#: templates/display/standard.inc:36
+msgid "_Lock"
+msgstr "Zakleni"
+
+#: templates/display/standard.inc:55
+msgid "_MergeOrRename"
+msgstr "ZdružiAliPreimenuj"
+
+#: lib/Wicked.php:132
+msgid "_PageSearch"
+msgstr "IskanjeStrani"
+
+#: lib/Wicked.php:131
+msgid "_RecentChanges"
+msgstr "ZadnjeSpremembe"
+
+#: lib/Wicked.php:132
+msgid "_TitleSearch"
+msgstr "IskanjeNaslovov"
+
+#: lib/Wicked.php:131
+msgid "_WikiHome"
+msgstr "WikiDom"
+
+#: scripts/wicked.php:123
+#, php-format
+msgid "page \"%s\" doesn't exist."
+msgstr "stran \"%s\" ne obstaja."
--- /dev/null
+# Ukrainian translations for Wicked package.
+# Copyright 2008-2009 The Horde Project
+# This file is distributed under the same license as the Wicked package.
+# Automatically generated, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Wicked 1.0-cvs\n"
+"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
+"POT-Creation-Date: 2008-12-04 10:52+0200\n"
+"PO-Revision-Date: 2008-12-04 12:00+0200\n"
+"Last-Translator: Andriy Kopystyansky <anri@polynet.lviv.ua>\n"
+"Language-Team: Ukrainian <anri@polynet.lviv.ua>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CP1251\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
+"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: templates/edit/create.inc:13
+#, php-format
+msgid ""
+"%s does not exist, but maybe you were looking for one of the following pages?"
+msgstr ""
+
+#: templates/edit/create.inc:30
+#, php-format
+msgid ""
+"%s does not exist. Click on \"Create\" below if you want to create this page "
+"now and start editing."
+msgstr ""
+"%s íå ³ñíóº. Êëàöí³òü \"Ñòâîðèòè\" äëÿ ñòâîðåííÿ ö³º¿ ñòîð³íêè çàðàç ³ "
+"ïî÷àòè ðåäàãóâàííÿ."
+
+#: lib/Page/Search.php:112
+#, php-format
+msgid "%s does not exist. You can create it now."
+msgstr "%s íå ³ñíóº. Âè ìîæåòå ñòâîðèòè ¿¿ çàðàç."
+
+#: templates/edit/create.inc:37
+msgid "(None)"
+msgstr "(Æîäåí)"
+
+#: scripts/wicked.php:161
+msgid ""
+"-d, --debug Run in debug mode (displays extra information)"
+msgstr ""
+
+#: scripts/wicked.php:163
+msgid ""
+"-g, --get[=pagetitle] Return all pages (unless pagetitle specified)"
+msgstr ""
+
+#: scripts/wicked.php:160
+msgid "-h, --help Show this help"
+msgstr ""
+
+#: scripts/wicked.php:162
+msgid "-l, --list-pages List pages"
+msgstr ""
+
+#: scripts/wicked.php:164
+msgid "-o, --out[=type] Output type for results (default:xml)"
+msgstr ""
+
+#: scripts/wicked.php:166
+msgid "-p, --password[=password] Horde login password"
+msgstr ""
+
+#: scripts/wicked.php:165
+msgid "-u, --username[=username] Horde login username"
+msgstr ""
+
+#: templates/sync/list.inc:25 templates/sync/list.inc:51
+#: templates/sync/list.inc:73
+msgid "Actions"
+msgstr "ij¿"
+
+#: templates/display/MergeOrRename.html:31
+msgid "Add the text from this page"
+msgstr "Äîäàòè òåêñò ç ö³º¿ ñòîð³íêè"
+
+#: lib/Page/AddPage.php:108
+#, php-format
+msgid "AddPage: %s"
+msgstr ""
+
+#: lib/Page/AllPages.php:90
+msgid "AllPages"
+msgstr ""
+
+#: lib/Page/DeletePage.php:83
+msgid ""
+"Are you sure you want to delete this page? All versions will be permanently "
+"removed."
+msgstr ""
+"Âè âïåâíåí³, ùî õî÷åòå âèòåðòè öþ ñòîð³íêó? Âñ³ âåðñ³¿ áóäóòü íàçàâæäè "
+"çíèùåí³."
+
+#: lib/Page/DeletePage.php:85
+#, php-format
+msgid "Are you sure you want to delete version %s of this page?"
+msgstr "Âïåâíåí³, ùî õî÷åòå âèòåðòè âåðñ³þ %s ö³º¿ ñòîð³íêè?"
+
+#: lib/Page/RevertPage.php:71
+#, php-format
+msgid "Are you sure you want to revert to version %s of this page?"
+msgstr ""
+
+#: templates/display/AttachedFiles.html:88
+msgid "Attach File"
+msgstr "Ïðèêð³ïèòè ôàéë"
+
+#: templates/display/AttachedFiles.html:52
+msgid "Attach a New File"
+msgstr "Ïðèêð³ïèòè íîâèé ôàéë"
+
+#: templates/display/standard.inc:77
+msgid "AttachedFiles"
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:171
+#, php-format
+msgid "AttachedFiles: %s"
+msgstr ""
+
+#: templates/display/standard.inc:78
+msgid "Attached_Files"
+msgstr ""
+
+#: templates/display/AttachedFiles.html:7
+msgid "Attachment Name"
+msgstr "Íàçâà äîäàòêó"
+
+#: templates/display/standard.inc:117
+msgid "Attachments"
+msgstr "Äîäàòêè"
+
+#: lib/Page/AttachedFiles.php:225
+msgid "Attachments with spaces can't be embedded into a page."
+msgstr "Äîäàòêè ç ïðîá³ëàìè íå ìîæóòü áóòè âñòàâëåí³ â ñòîð³íêó."
+
+#: templates/edit/create.inc:19 templates/pagelist/header.inc:7
+#: templates/sync/diff.inc:25 templates/sync/diff.inc:61
+#: templates/sync/list.inc:24 templates/sync/list.inc:50
+#: templates/history/header.inc:23 lib/Page/Search.php:158
+#: templates/display/AttachedFiles.html:10
+msgid "Author"
+msgstr "Àâòîð"
+
+#: templates/display/standard.inc:104
+msgid "Ba_ck to"
+msgstr "Íàçàä äî"
+
+#: templates/display/standard.inc:104
+msgid "Back to"
+msgstr "Íàçàä äî"
+
+#: templates/display/standard.inc:67
+msgid "BackLinks"
+msgstr ""
+
+#: lib/Page/BackLinks.php:80
+#, php-format
+msgid "BackLinks: %s"
+msgstr ""
+
+#: lib/Page/SyncPages.php:246 lib/Page/SyncPages.php:249
+msgid "By default, your login data will be used"
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:231
+msgid "Can't read uploaded file."
+msgstr "Íå ìîæó ïðî÷èòàòè çàâàíòàæåíèé ôàéë."
+
+#: lib/Page/RevertPage.php:120
+#, php-format
+msgid "Can't revert to an unknown version."
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:271
+#, php-format
+msgid "Can't update \"%s\": no such attachment."
+msgstr "Íå ìîæó îíîâèòè \"%s\": íåìà òàêîãî äîäàòêó."
+
+#: templates/edit/standard.inc:27 templates/edit/create.inc:47
+#: lib/Page/DeletePage.php:104 lib/Page/RevertPage.php:88
+#: lib/Page/MergeOrRename.php:140 templates/display/MergeOrRename.html:62
+msgid "Cancel"
+msgstr "³äì³íèòè"
+
+#: templates/history/header.inc:29 templates/display/AttachedFiles.html:12
+msgid "Change Log"
+msgstr "Æóðíàë Çì³í"
+
+#: templates/edit/standard.inc:29 templates/sync/diff.inc:26
+#: templates/sync/diff.inc:62
+msgid "Change log"
+msgstr "Æóðíàë Çì³í"
+
+#: templates/display/AttachedFiles.html:80
+#: templates/display/AttachedFiles.html:146
+msgid "Change log entry"
+msgstr "Çàïèñ â æóðíàë³ çì³í"
+
+#: templates/display/MergeOrRename.html:40
+msgid "Change references to this page from:"
+msgstr ""
+
+#: lib/Page/MergeOrRename.php:253
+#, php-format
+msgid "Changed references from %s to %s"
+msgstr ""
+
+#: templates/edit/standard.inc:28
+msgid "Changelog is required"
+msgstr "Íåîáõ³äíèé æóðíàë çì³í"
+
+#: templates/sync/diff.inc:27 templates/sync/diff.inc:63
+msgid "Checksum"
+msgstr ""
+
+#: templates/edit/create.inc:26
+msgid ""
+"Click on \"Create\" below if you want to create this page now and start "
+"editing."
+msgstr ""
+"Êëàöí³òü \"Ñòâîðèòè\" íèæ÷å, ÿêùî áàæàºòå ñòâîðèòè öþ ñòîð³íêó ³ ðîçïî÷àòè "
+"ðåäàãóâàííÿ."
+
+#: scripts/wicked.php:42
+msgid "Couldn't read command-line options."
+msgstr ""
+
+#: templates/edit/create.inc:46
+msgid "Create"
+msgstr "Ñòâîðèòè"
+
+#: lib/Page/NewPage.php:135
+#, php-format
+msgid "Create Failed: %s"
+msgstr "Ñòâîðåííÿ íåâäàëå: %s"
+
+#: templates/sync/diff.inc:24 templates/sync/diff.inc:60
+#: templates/sync/list.inc:23 templates/sync/list.inc:49
+#: templates/history/header.inc:24
+msgid "Created"
+msgstr "Ñòâîðåíî"
+
+#: templates/edit/create.inc:20 templates/pagelist/header.inc:8
+#: lib/Page/Search.php:159
+msgid "Creation Date"
+msgstr "Äàòà ñòâîðåííÿ"
+
+#: lib/Page/SyncPages.php:231
+msgid "Custom"
+msgstr ""
+
+#: templates/display/AttachedFiles.html:11
+msgid "Date"
+msgstr "Äàòà"
+
+#: lib/Page/DeletePage.php:103
+msgid "Delete"
+msgstr "Âèòåðòè"
+
+#: templates/display/standard.inc:52
+#, php-format
+msgid "Delete %s"
+msgstr "Âèòåðòè %s"
+
+#: templates/history/header.inc:16
+msgid "Delete Version"
+msgstr "Âèòåðòè âåðñ³þ"
+
+#: templates/history/summary.inc:6
+#, php-format
+msgid "Delete Version %s"
+msgstr "Âèòåðòè âåðñ³þ %s"
+
+#: lib/Page/DeletePage.php:97 lib/Page/DeletePage.php:120
+msgid "DeletePage"
+msgstr ""
+
+#: lib/Page/DeletePage.php:142
+#, php-format
+msgid "Deleted version %s of \"%s\"."
+msgstr ""
+
+#: templates/history/header.inc:26
+msgid "Diff From"
+msgstr ""
+
+#: templates/history/header.inc:27
+msgid "Diff To"
+msgstr ""
+
+#: diff.php:56 templates/sync/diff.inc:101 templates/diff/diff.inc:2
+#, php-format
+msgid "Diff for %s between %s and %s"
+msgstr ""
+
+#: lib/Page/SyncPages.php:251
+msgid "Display"
+msgstr "Ïîêàçàòè"
+
+#: templates/pagelist/summary.inc:3
+#, php-format
+msgid "Display %s"
+msgstr "Ïîêàçàòè %s"
+
+#: templates/pagelist/summary.inc:6 templates/history/summary.inc:2
+#, php-format
+msgid "Display Version %s"
+msgstr "Ïîêàçàòè âåðñ³þ %s"
+
+#: templates/sync/diff.inc:96 templates/sync/list.inc:35
+msgid "Download"
+msgstr "Ñêà÷àòè"
+
+#: templates/display/standard.inc:136
+msgid "Download this page as:"
+msgstr "Ñêà÷àòè öþ ñòîð³íêó ÿê:"
+
+#: templates/display/AttachedFiles.html:13
+msgid "Downloads"
+msgstr ""
+
+#: lib/Page/SyncPages.php:389
+msgid "Downloded from remote server"
+msgstr "Ñêà÷àíî ç â³ääàëåíîãî ñåðâåðà"
+
+#: lib/Page/SyncPages.php:237
+msgid "Driver"
+msgstr "Äðàéâåð"
+
+#: lib/Page/SyncPages.php:254
+msgid "Edit"
+msgstr "Ðåäàãóâàòè"
+
+#: preview.php:24 templates/display/standard.inc:24
+#, php-format
+msgid "Edit %s"
+msgstr "Ðåäàãóâàòè %s"
+
+#: templates/history/header.inc:18
+msgid "Edit Version"
+msgstr "Ðåäàãóâàòè âåðñ³þ"
+
+#: templates/history/summary.inc:16
+#, php-format
+msgid "Edit Version %s"
+msgstr "Ðåäàãóâàòè âåðñ³þ %s"
+
+#: templates/sync/diff.inc:98
+msgid "Edit local"
+msgstr ""
+
+#: templates/sync/diff.inc:99
+msgid "Edit remote"
+msgstr ""
+
+#: templates/edit/standard.inc:21 lib/Page/EditPage.php:93
+msgid "EditPage"
+msgstr ""
+
+#: templates/display/AttachedFiles.html:67
+msgid "Enter a name for this file (if blank, will use the file's current name)"
+msgstr ""
+"Ââåä³òü íàçâó öüîãî ôàéëà (ÿêùî ïîðîæíÿ, áóäå âèêîðèñòàíà ïîòî÷íà íàçâà)"
+
+#: scripts/mail-filter.php:135
+#, php-format
+msgid "Error creating new page: %s"
+msgstr "Ïîìèëêà ñòâîðåííÿ íîâî¿ ñòîð³íêè: %s"
+
+#: lib/Page/MergeOrRename.php:202
+#, php-format
+msgid "Error deleting %s: %s"
+msgstr "Ïîìèëêà âèòèðàííÿ %s: %s"
+
+#: scripts/mail-filter.php:42
+#, php-format
+msgid "Error parsing MIME message: %s\n"
+msgstr ""
+
+#: lib/Page/MergeOrRename.php:217
+#, php-format
+msgid "Error renaming \"%s\": %s"
+msgstr "Ïîìèëêà ïåðåéìåíóâàííÿ \"%s\": %s"
+
+#: lib/Page/MergeOrRename.php:247
+#, php-format
+msgid "Error retrieving %s: %s"
+msgstr "Ïîìèëêà îòðèìàííÿ %s: %s"
+
+#: lib/Page/AttachedFiles.php:111 lib/Page/AttachedFiles.php:253
+#, php-format
+msgid "Error retrieving attachments: %s"
+msgstr "Ïîìèëêà îòðèìàííÿ äîäàòê³â: %s"
+
+#: lib/Page/AddPage.php:68
+#, php-format
+msgid "Error retrieving templates: %s"
+msgstr ""
+
+#: lib/Page/MergeOrRename.php:194 lib/Page/MergeOrRename.php:274
+#, php-format
+msgid "Error updating %s: %s"
+msgstr "Ïîìèëêà îíîâëåííÿ %s: %s"
+
+#: lib/Page/Search.php:165
+msgid "Exact Match"
+msgstr ""
+
+#: lib/Page/MergeOrRename.php:164
+#, php-format
+msgid "Failed to retrieve \"%s\": %s"
+msgstr ""
+
+#: lib/Page/SyncPages.php:194 lib/Page/SyncPages.php:271
+msgid "Fetch page list"
+msgstr ""
+
+#: templates/sync/diff.inc:54
+msgid "Found same content in history"
+msgstr ""
+
+#: lib/Page.php:274
+msgid "Guest"
+msgstr "óñòü"
+
+#: templates/display/standard.inc:138
+msgid "HTML"
+msgstr "HTML"
+
+#: templates/display/standard.inc:85
+msgid "Hi_story"
+msgstr "²ñòîð³ÿ"
+
+#: templates/display/standard.inc:84
+#, php-format
+msgid "History of %s"
+msgstr "²ñòîð³ÿ %s"
+
+#: lib/Page/StandardPage/StdHistoryPage.php:46
+msgid "History page not found"
+msgstr "Ñòîð³íêó ³ñòî𳿠íå çíàéäåíî"
+
+#: history.php:30 templates/history/header.inc:7
+#, php-format
+msgid "History: %s"
+msgstr "²ñòîð³ÿ: %s"
+
+#: lib/Wicked.php:130
+msgid "HowTo_UseWiki"
+msgstr ""
+
+#: templates/display/MergeOrRename.html:26
+msgid "If a page with the new name already exists, then"
+msgstr "ßêùî ñòîð³íêà ç íîâîþ íàçâîþ âæå ³ñíóº, òî"
+
+#: display.php:17 displaysp.php:17 history.php:18
+msgid "Internal error viewing requested page"
+msgstr ""
+
+#: diff.php:39
+#, php-format
+msgid "Internal error viewing requested page: %s"
+msgstr ""
+
+#: lib/api.php:418
+msgid "Invalid page requested."
+msgstr ""
+
+#: templates/display/AttachedFiles.html:133
+msgid "Is this a minor update?"
+msgstr "×è öå íåçíà÷íà çì³íà?"
+
+#: templates/display/standard.inc:72
+msgid "L_ikePages"
+msgstr ""
+
+#: templates/edit/standard.inc:20 templates/display/title.inc:6
+#, php-format
+msgid "Last Modified %s by %s"
+msgstr "Âîñòàííº îíîâëåíî %s %s"
+
+#: templates/display/standard.inc:139
+msgid "Latex"
+msgstr "Latex"
+
+#: lib/Page/LeastPopular.php:93
+msgid "LeastPopular"
+msgstr ""
+
+#: templates/display/standard.inc:72
+msgid "LikePages"
+msgstr ""
+
+#: lib/Page/LikePages.php:82
+#, php-format
+msgid "LikePages: %s"
+msgstr ""
+
+#: templates/sync/diff.inc:32 templates/sync/diff.inc:68
+#: lib/Page/SyncDiff.php:80 lib/Page/SyncDiff.php:86
+msgid "Local"
+msgstr "Ëîêàëüíèé"
+
+#: templates/sync/diff.inc:22 templates/sync/diff.inc:58
+msgid "Location"
+msgstr "̳ñöå ïåðåáóâàííÿ"
+
+#: templates/display/standard.inc:40
+#, php-format
+msgid "Lock %s"
+msgstr "Çàìêíóòè %s"
+
+#: templates/edit/standard.inc:21 templates/display/title.inc:34
+#: lib/Page/DeletePage.php:97 lib/Page/RevertPage.php:81
+msgid "Locked"
+msgstr "Çàìêíåíà"
+
+#: scripts/wicked.php:104
+#, php-format
+msgid "Logged in successfully as \"%s\"."
+msgstr "Óñï³øíî ââ³éøëè ÿê \"%s\"."
+
+#: scripts/wicked.php:100
+msgid "Login is incorrect."
+msgstr ""
+
+#: scripts/wicked.php:158
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too."
+msgstr ""
+
+#: templates/display/standard.inc:60
+msgid "MergeOrRename"
+msgstr ""
+
+#: lib/Page/MergeOrRename.php:125
+#, php-format
+msgid "MergeOrRename: %s"
+msgstr ""
+
+#: lib/Page/MergeOrRename.php:207
+#, php-format
+msgid "Merged \"%s\" into \"%s\"."
+msgstr "Ïðèºäíàíî \"%s\" äî \"%s\"."
+
+#: lib/Page/MergeOrRename.php:210
+#, php-format
+msgid "Merged \"%s\" into \"%s\". New page: %s\n"
+msgstr "Ïðèºäíàíî \"%s\" äî \"%s\". Íîâà ñòîð³íêà: %s\n"
+
+#: lib/Page/MergeOrRename.php:191
+#, php-format
+msgid "Merged from %s"
+msgstr "Ïðèºäíàíî ç %s"
+
+#: templates/edit/standard.inc:30
+msgid "Minor Change"
+msgstr "Íåçíà÷íà çì³íà"
+
+#: lib/Page/MostPopular.php:93
+msgid "MostPopular"
+msgstr ""
+
+#: lib/Block/page.php:41
+msgid "Name of wiki page to display"
+msgstr "Íàçâà wiki-ñòîð³íêè, ÿêó ïîêàçàòè"
+
+#: lib/Page.php:263
+msgid "Never"
+msgstr "ͳêîëè"
+
+#: lib/Page/AttachedFiles.php:303
+#, php-format
+msgid "New attachment \"%s\" to page \"%s\"."
+msgstr "Íîâèé äîäàòîê \"%s\" äî ñòîð³íêè \"%s\"."
+
+#: templates/display/MergeOrRename.html:15
+msgid "New name"
+msgstr "Íîâà íàçâà"
+
+#: lib/Page/MergeOrRename.php:151
+msgid "New name is the same as old name."
+msgstr "Íîâà íàçâà òàêà æ, ÿ ³ ñòàðà."
+
+#: templates/sync/list.inc:42
+msgid "New pages on local server"
+msgstr ""
+
+#: templates/sync/list.inc:16
+msgid "New pages on remote server"
+msgstr "Íîâ³ ñòîð³íêè íà â³ääàëåíîìó ñåðâåð³"
+
+#: lib/Page/NewPage.php:112
+msgid "NewPage"
+msgstr ""
+
+#: templates/edit/new.inc:20
+#, php-format
+msgid "NewPage: %s"
+msgstr ""
+
+#: lib/api.php:352 lib/Page/SyncPages.php:387 lib/Page/EditPage.php:124
+msgid "No changes made"
+msgstr "Æîäíèõ çì³í íå çðîáëåíî"
+
+#: templates/sync/list.inc:18 templates/sync/list.inc:44
+msgid "No pages found"
+msgstr "Æîäíî¿ ñòîð³íêè íå çíàéäåíî"
+
+#: templates/sync/list.inc:70
+msgid "No pages to sync"
+msgstr ""
+
+#: lib/Driver.php:124
+msgid "Not implemented."
+msgstr "Íå ðåàë³çîâàíî."
+
+#: templates/edit/create.inc:17 templates/pagelist/header.inc:5
+#: templates/sync/list.inc:21 templates/sync/list.inc:47
+#: templates/sync/list.inc:73 lib/Page/Search.php:156
+msgid "Page"
+msgstr "Ñòîð³íêà"
+
+#: lib/Page/MergeOrRename.php:179
+#, php-format
+msgid "Page \"%s\" already exists."
+msgstr "Ñòîð³íêà \"%s\" âæå ³ñíóº."
+
+#: lib/Page/SyncPages.php:395
+#, php-format
+msgid "Page \"%s\" was sucessfuly downloaded from remote to local wiki."
+msgstr ""
+
+#: lib/Page/SyncPages.php:425
+#, php-format
+msgid "Page \"%s\" was sucessfuly uploaded from local to remote wiki."
+msgstr "Ñòîð³íêó \"%s\" óñï³øíî çàâàíòàæåíî ç ëîêàëüíîãî íà â³ääàëåíèé wiki."
+
+#: lib/Page/NewPage.php:138
+msgid "Page Created"
+msgstr "Ñòîð³íêó ñòâîðåíî"
+
+#: lib/Page/EditPage.php:131
+msgid "Page Saved"
+msgstr "Ñòîð³íêó çáåðåæåíî"
+
+#: templates/edit/create.inc:35
+msgid "Page Template:"
+msgstr "Øàáëîí ñòîð³íêè:"
+
+#: lib/Page/Search.php:179
+msgid "Page Text Matches"
+msgstr ""
+
+#: lib/Page/Search.php:172
+msgid "Page Title Matches"
+msgstr ""
+
+#: templates/pagelist/header.inc:10
+msgid "Page Views"
+msgstr ""
+
+#: display.php:31
+#, php-format
+msgid "Page failed to lock: %s"
+msgstr ""
+
+#: display.php:46
+#, php-format
+msgid "Page failed to unlock: %s"
+msgstr ""
+
+#: display.php:34
+msgid "Page locked"
+msgstr ""
+
+#: lib/Driver/sql.php:592 lib/Page/NewPage.php:72 lib/Page/AddPage.php:53
+msgid "Page name must not be empty"
+msgstr "Íàçâà ñòîð³íêè íå ìîæå áóòè ïîðîæíüîþ"
+
+#: display.php:49
+msgid "Page unlocked"
+msgstr ""
+
+#: lib/api.php:114 lib/api.php:117
+msgid "Pages"
+msgstr "Ñòîð³íêè"
+
+#: lib/Page/NewPage.php:129
+msgid "Pages cannot be empty."
+msgstr "Ñòîð³íêè íå ìîæóòü áóòè ïóñòèìè."
+
+#: templates/sync/list.inc:68
+msgid "Pages to sync"
+msgstr ""
+
+#: lib/Page/SyncPages.php:249
+msgid "Password"
+msgstr "Ïàðîëü"
+
+#: templates/display/standard.inc:100
+msgid "Permissio_ns"
+msgstr "Ïðàâà"
+
+#: lib/api.php:414
+msgid "Permission denied."
+msgstr "Äîñòóï çàáîðîíåíèé."
+
+#: templates/display/standard.inc:137
+msgid "Plain Text"
+msgstr "Ïðîñòèé òåêñò"
+
+#: lib/Page/SyncPages.php:240
+msgid "Prefix"
+msgstr "Ïðåô³êñ"
+
+#: templates/edit/standard.inc:26 templates/edit/new.inc:25
+msgid "Preview"
+msgstr "Îãëÿä"
+
+#: lib/Page/EditPage.php:112
+msgid "Random string did not match."
+msgstr ""
+
+#: lib/Page/RecentChanges.php:114
+msgid "RecentChanges"
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:67
+#, php-format
+msgid "Referrer \"%s\" does not exist."
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:129
+#, php-format
+msgid "Reload \"%s\""
+msgstr ""
+
+#: templates/history/header.inc:8
+msgid "Reload History"
+msgstr ""
+
+#: templates/display/title.inc:32 templates/display/title.inc:33
+msgid "Reload Page"
+msgstr ""
+
+#: templates/sync/diff.inc:40 templates/sync/diff.inc:76
+#: lib/Page/SyncDiff.php:81 lib/Page/SyncDiff.php:85
+msgid "Remote"
+msgstr "³ääàëåíèé"
+
+#: lib/Page/SyncPages.php:194 lib/Page/SyncPages.php:300
+msgid "Remove login info"
+msgstr ""
+
+#: lib/Page/MergeOrRename.php:222
+#, php-format
+msgid "Renamed \"%s\" to \"%s\"."
+msgstr "Ïåðåéìåíîâàíî \"%s\" íà \"%s\"."
+
+#: lib/Page/MergeOrRename.php:225
+#, php-format
+msgid "Renamed \"%s\" to \"%s\". New page: %s\n"
+msgstr "Ïåðåéìåíîâàíî \"%s\" íà \"%s\". Íîâà ñòîð³íêà: %s\n"
+
+#: lib/Driver/sql.php:681
+#, php-format
+msgid "Renamed page from %s"
+msgstr "Ïåðåéìåíîâàíà ñòîð³íêà ç %s"
+
+#: lib/Page/SyncPages.php:194
+msgid "Reset"
+msgstr "Î÷èñòèòè"
+
+#: templates/history/header.inc:20
+msgid "Restore Version"
+msgstr "³äíîâèòè âåðñ³þ"
+
+#: lib/Page/RevertPage.php:87
+msgid "Revert"
+msgstr ""
+
+#: templates/history/summary.inc:26
+#, php-format
+msgid "Revert to version %s"
+msgstr ""
+
+#: lib/Page/RevertPage.php:81 lib/Page/RevertPage.php:104
+msgid "RevertPage"
+msgstr ""
+
+#: lib/Page/RevertPage.php:127
+#, php-format
+msgid "Reverted to version %s of \"%s\"."
+msgstr ""
+
+#: lib/Driver/sql.php:596
+msgid "Robots are not allowed to create pages"
+msgstr "Ðîáîòàì íå äîçâîëåíî ñòâîðþâàòè ñòîð³íêè"
+
+#: templates/edit/standard.inc:25 templates/edit/new.inc:24
+msgid "Save"
+msgstr "Çáåðåãòè"
+
+#: lib/Page/EditPage.php:128
+#, php-format
+msgid "Save Failed: %s"
+msgstr "Çáåðåæåííÿ íå âäàëîñÿ: %s"
+
+#: lib/Page/SyncPages.php:194 lib/Page/SyncPages.php:288
+msgid "Save login info"
+msgstr ""
+
+#: templates/menu.inc:17 lib/Page/Search.php:204
+msgid "Search"
+msgstr "Ïîøóê"
+
+#: templates/pagelist/search.inc:1
+msgid "Search Results"
+msgstr "Ðåçóëüòàòè ïîøóêó"
+
+#: templates/display/AttachedFiles.html:58
+#: templates/display/AttachedFiles.html:110
+msgid "Select file to attach:"
+msgstr "Âèáåð³òü ôàéë, ÿêèé ïðèêð³ïèòè:"
+
+#: templates/display/AttachedFiles.html:119
+msgid "Select the file to update"
+msgstr "Âèáåð³òü ôàéë, ÿêèé îíîâèòè"
+
+#: templates/display/standard.inc:99
+#, php-format
+msgid "Set permissions for %s"
+msgstr "Âñòàíîâèòè ïðàâà äëÿ %s"
+
+#: templates/sync/list.inc:79
+msgid "Show changes"
+msgstr "Ïîêàçàòè çì³íè"
+
+#: templates/display/title.inc:16 lib/Page/RecentChanges.php:57
+#, php-format
+msgid "Show changes for %s"
+msgstr "Ïîêàçàòè çì³íè äëÿ %s"
+
+#: lib/Page/RecentChanges.php:64
+#, php-format
+msgid "Show version %s"
+msgstr "Ïîêàçàòè âåðñ³þ %s"
+
+#: templates/edit/standard.inc:41
+msgid "Spam Protection - Enter the letters below:"
+msgstr "Çàõèñò â³ä ñïàìó - Ââåä³òü ë³òåðè, ïîêàçàí³ íèæ÷å:"
+
+#: templates/display/MergeOrRename.html:33
+msgid "Stop and don't do anything"
+msgstr ""
+
+#: lib/Page/SyncPages.php:231
+msgid "Stored"
+msgstr ""
+
+#: templates/display/MergeOrRename.html:61
+msgid "Submit"
+msgstr "³ä³ñëàòè"
+
+#: lib/Page/DeletePage.php:136
+#, php-format
+msgid "Successfully deleted \"%s\"."
+msgstr "Óñï³øíî âèòåðòî \"%s\"."
+
+#: lib/Page/AttachedFiles.php:207
+#, php-format
+msgid "Successfully deleted version %s of \"%s\" from \"%s\""
+msgstr "Óñï³øíî âèòåðòî âåðñ³þ %s äëÿ \"%s\" ç \"%s\""
+
+#: lib/Page/SyncPages.php:193
+msgid "Sync data"
+msgstr ""
+
+#: lib/Page/SyncPages.php:305
+msgid "Sync login info was removed."
+msgstr ""
+
+#: lib/Page/SyncPages.php:295
+msgid "Sync login info was stored"
+msgstr ""
+
+#: lib/Page/SyncDiff.php:129
+msgid "SyncDiff"
+msgstr ""
+
+#: lib/Page/SyncPages.php:169
+msgid "SyncPages"
+msgstr ""
+
+#: lib/Page/SyncDiff.php:52
+msgid "Synchronization is disabled"
+msgstr "Ñèíõðîí³çàö³þ çàáîðîíåíî"
+
+#: lib/Page.php:488
+msgid "Table of Contents"
+msgstr "Çì³ñò"
+
+#: lib/Page/AttachedFiles.php:280
+#, php-format
+msgid "There is already an attachment named \"%s\"."
+msgstr "Âæå ³ñíóº äîäàòîê ç íàçâîþ \"%s\"."
+
+#: lib/Page/MergeOrRename.php:149 lib/Page/MergeOrRename.php:155
+msgid "This is a required field."
+msgstr "Öå îáîâ'ÿçêîâå ïîëå."
+
+#: display.php:61
+msgid "This page does not have a history"
+msgstr "Öÿ ñòîð³íêà íå ìຠ³ñòîð³¿."
+
+#: lib/Page/MergeOrRename.php:100
+#, php-format
+msgid "This page is referenced from %d other page(s)."
+msgstr ""
+
+#: templates/display/standard.inc:35
+msgid "Un_lock"
+msgstr ""
+
+#: lib/Page/StandardPage.php:81
+#, php-format
+msgid "Unable to create %s"
+msgstr "Íå ìîæó ñòâîðèòè %s"
+
+#: lib/Page/StandardPage.php:89
+msgid "Unable to create WikiHome. The wiki is not configured."
+msgstr ""
+
+#: templates/display/standard.inc:34
+#, php-format
+msgid "Unlock %s"
+msgstr ""
+
+#: lib/Page.php:255 lib/Page.php:289 lib/Page.php:294 lib/Page.php:393
+#: lib/Page.php:403 lib/Page.php:413 lib/Page.php:423 lib/Page.php:523
+#: lib/Page.php:534 lib/Page.php:539 lib/Page.php:544 lib/Page.php:549
+#: lib/Page.php:589 lib/Driver.php:78 lib/Driver.php:92 lib/Driver.php:104
+#: lib/Driver.php:109 lib/Driver.php:129 lib/Driver.php:134 lib/Driver.php:192
+#: lib/Driver.php:197 lib/Driver.php:209 lib/Driver.php:223 lib/Driver.php:237
+#: lib/Driver.php:251 lib/Driver.php:256 lib/Driver.php:261 lib/Driver.php:279
+#: lib/Driver.php:399 lib/Driver.php:425 lib/Driver.php:441 lib/Sync.php:78
+#: lib/Sync.php:90 lib/Sync.php:102 lib/Sync.php:114 lib/Sync.php:126
+#: lib/Sync.php:142
+msgid "Unsupported"
+msgstr ""
+
+#: templates/display/AttachedFiles.html:154
+msgid "Update File"
+msgstr "Îíîâèòè ôàéë"
+
+#: templates/display/AttachedFiles.html:104
+msgid "Update an Attachment"
+msgstr "Îíîâèòè äîäàòîê"
+
+#: lib/Page/AttachedFiles.php:300
+#, php-format
+msgid "Updated attachment \"%s\" on page \"%s\"."
+msgstr "Îíîâëåíî äîäàòîê \"%s\" íà ñòîð³íö³ \"%s\"."
+
+#: templates/sync/diff.inc:97 templates/sync/list.inc:61
+msgid "Upload"
+msgstr "Çàêà÷àòè"
+
+#: lib/Page/SyncPages.php:419
+msgid "Uploaded from remote server"
+msgstr "Çàâàíòàæåíî ç â³ääàëåíîãî ñåðâåðà"
+
+#: lib/Page/SyncPages.php:243
+msgid "Url"
+msgstr ""
+
+#: scripts/wicked.php:156
+#, php-format
+msgid "Usage: %s [OPTIONS]..."
+msgstr ""
+
+#: lib/Page/SyncPages.php:246
+msgid "User"
+msgstr "Êîðèñòóâà÷"
+
+#: templates/edit/create.inc:18 templates/pagelist/header.inc:6
+#: templates/sync/diff.inc:23 templates/sync/diff.inc:59
+#: templates/sync/list.inc:22 templates/sync/list.inc:48
+#: templates/history/header.inc:13 lib/Page/Search.php:157
+#: templates/display/AttachedFiles.html:9
+msgid "Version"
+msgstr "Âåðñ³ÿ"
+
+#: lib/Page/SyncPages.php:178
+msgid "View local"
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:309
+msgid "View page: "
+msgstr ""
+
+#: lib/Page/SyncPages.php:180
+msgid "View remote"
+msgstr ""
+
+#: lib/Page/SyncPages.php:237
+msgid "Wicked"
+msgstr ""
+
+#: lib/api.php:374
+msgid "Wiki Templates"
+msgstr "Øàáëîíè Wiki"
+
+#: lib/Block/page.php:3
+msgid "Wiki page"
+msgstr "Ñòîð³íêà Wiki"
+
+#: display.php:25
+msgid "You are not allowed to lock this page"
+msgstr "Âàì íå äîçâîëåíî çàìèêàòè öþ ñòîð³íêó"
+
+#: display.php:40
+msgid "You are not allowed to unlock this page"
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:196
+msgid "You do not have permission to delete attachments from this page."
+msgstr "Âè íå ìàºòå ïðàâà âèòèðàòè äîäàòêè ç ö³º¿ ñòîð³íêè."
+
+#: lib/Page/AttachedFiles.php:237 lib/Page/MergeOrRename.php:169
+#: lib/Page/MergeOrRename.php:184
+#, php-format
+msgid "You do not have permission to edit \"%s\""
+msgstr "Âè íå ìàºòå ïðàâà ðåäàãóâàòè \"%s\""
+
+#: lib/Page/NewPage.php:125
+#, php-format
+msgid "You don't have permission to create \"%s\"."
+msgstr "Âè íå ìàºòå ïðàâà ñòâîðþâàòè \"%s\"."
+
+#: lib/Page/DeletePage.php:150
+#, php-format
+msgid "You don't have permission to delete \"%s\"."
+msgstr "Âè íå ìàºòå ïðàâà âèòåðòè \"%s\"."
+
+#: lib/api.php:334 lib/Page/SyncPages.php:371 lib/Page/EditPage.php:107
+#: lib/Page/RevertPage.php:133
+#, php-format
+msgid "You don't have permission to edit \"%s\"."
+msgstr "Âè íå ìàºòå ïðàâà ðåäàãóâàòè \"%s\"."
+
+#: display.php:70 display.php:73 display.php:116 display.php:119
+#: displaysp.php:39 displaysp.php:42 displaysp.php:85 displaysp.php:88
+msgid "You don't have permission to view this page."
+msgstr "Âè íå ìàºòå ïðàâà ïåðåãëÿäàòè öþ ñòîð³íêó."
+
+#: lib/Page/AttachedFiles.php:245
+msgid "You must enter a change description to attach this file."
+msgstr "Âàì ñë³ä îïèñàòè çì³íè äëÿ ïðèêð³ïëåííÿ öüîãî ôàéëó."
+
+#: lib/api.php:338 lib/Page/EditPage.php:118
+msgid "You must provide a change log."
+msgstr "Âè ïîâèíí³ çàïîâíèòè æóðíàë çì³í."
+
+#: lib/Wicked.php:130
+msgid "_AllPages"
+msgstr ""
+
+#: templates/display/standard.inc:67
+msgid "_BackLinks"
+msgstr ""
+
+#: templates/display/standard.inc:53
+msgid "_Delete"
+msgstr "Âèòåðòè"
+
+#: templates/display/standard.inc:25
+msgid "_EditPage"
+msgstr ""
+
+#: templates/display/standard.inc:41
+msgid "_Lock"
+msgstr ""
+
+#: templates/display/standard.inc:61
+msgid "_MergeOrRename"
+msgstr ""
+
+#: lib/Wicked.php:130
+msgid "_RecentChanges"
+msgstr ""
+
+#: lib/Wicked.php:130
+msgid "_WikiHome"
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:217
+msgid "attachment"
+msgstr "äîäàòîê"
+
+#: scripts/wicked.php:123
+#, php-format
+msgid "page \"%s\" doesn't exist."
+msgstr "ñòîð³íêè \"%s\" íå ³ñíóº."
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright YEAR Horde Project
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
+"POT-Creation-Date: 2008-08-01 10:45+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: templates/edit/create.inc:13
+#, php-format
+msgid ""
+"%s does not exist, but maybe you were looking for one of the following pages?"
+msgstr ""
+
+#: templates/edit/create.inc:30
+#, php-format
+msgid ""
+"%s does not exist. Click on \"Create\" below if you want to create this page "
+"now and start editing."
+msgstr ""
+
+#: lib/Page/Search.php:111
+#, php-format
+msgid "%s does not exist. You can create it now."
+msgstr ""
+
+#: templates/edit/create.inc:37
+msgid "(None)"
+msgstr ""
+
+#: scripts/wicked.php:161
+msgid ""
+"-d, --debug Run in debug mode (displays extra information)"
+msgstr ""
+
+#: scripts/wicked.php:163
+msgid ""
+"-g, --get[=pagetitle] Return all pages (unless pagetitle specified)"
+msgstr ""
+
+#: scripts/wicked.php:160
+msgid "-h, --help Show this help"
+msgstr ""
+
+#: scripts/wicked.php:162
+msgid "-l, --list-pages List pages"
+msgstr ""
+
+#: scripts/wicked.php:164
+msgid "-o, --out[=type] Output type for results (default:xml)"
+msgstr ""
+
+#: scripts/wicked.php:166
+msgid "-p, --password[=password] Horde login password"
+msgstr ""
+
+#: scripts/wicked.php:165
+msgid "-u, --username[=username] Horde login username"
+msgstr ""
+
+#: templates/display/MergeOrRename.html:31
+msgid "Add the text from this page"
+msgstr ""
+
+#: lib/Page/AddPage.php:108
+#, php-format
+msgid "AddPage: %s"
+msgstr ""
+
+#: lib/Page/AllPages.php:90
+msgid "AllPages"
+msgstr ""
+
+#: lib/Page/DeletePage.php:83
+msgid ""
+"Are you sure you want to delete this page? All versions will be permanently "
+"removed."
+msgstr ""
+
+#: lib/Page/DeletePage.php:85
+#, php-format
+msgid "Are you sure you want to delete version %s of this page?"
+msgstr ""
+
+#: lib/Page/RevertPage.php:71
+#, php-format
+msgid "Are you sure you want to revert to version %s of this page?"
+msgstr ""
+
+#: templates/display/AttachedFiles.html:88
+msgid "Attach File"
+msgstr ""
+
+#: templates/display/AttachedFiles.html:52
+msgid "Attach a New File"
+msgstr ""
+
+#: templates/display/standard.inc:77
+msgid "AttachedFiles"
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:171
+#, php-format
+msgid "AttachedFiles: %s"
+msgstr ""
+
+#: templates/display/standard.inc:78
+msgid "Attached_Files"
+msgstr ""
+
+#: templates/display/AttachedFiles.html:7
+msgid "Attachment Name"
+msgstr ""
+
+#: templates/display/standard.inc:117
+msgid "Attachments"
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:225
+msgid "Attachments with spaces can't be embedded into a page."
+msgstr ""
+
+#: templates/history/header.inc:23 templates/pagelist/header.inc:7
+#: templates/edit/create.inc:19 lib/Page/Search.php:157
+#: templates/display/AttachedFiles.html:10
+msgid "Author"
+msgstr ""
+
+#: templates/display/standard.inc:104
+msgid "Ba_ck to"
+msgstr ""
+
+#: templates/display/standard.inc:104
+msgid "Back to"
+msgstr ""
+
+#: templates/display/standard.inc:67
+msgid "BackLinks"
+msgstr ""
+
+#: lib/Page/BackLinks.php:80
+#, php-format
+msgid "BackLinks: %s"
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:231
+msgid "Can't read uploaded file."
+msgstr ""
+
+#: lib/Page/RevertPage.php:120
+#, php-format
+msgid "Can't revert to an unknown version."
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:271
+#, php-format
+msgid "Can't update \"%s\": no such attachment."
+msgstr ""
+
+#: templates/edit/create.inc:47 templates/edit/standard.inc:27
+#: lib/Page/DeletePage.php:104 lib/Page/RevertPage.php:88
+#: lib/Page/MergeOrRename.php:140 templates/display/MergeOrRename.html:62
+msgid "Cancel"
+msgstr ""
+
+#: templates/history/header.inc:29 templates/display/AttachedFiles.html:12
+msgid "Change Log"
+msgstr ""
+
+#: templates/edit/standard.inc:29
+msgid "Change log"
+msgstr ""
+
+#: templates/display/AttachedFiles.html:80
+#: templates/display/AttachedFiles.html:146
+msgid "Change log entry"
+msgstr ""
+
+#: templates/display/MergeOrRename.html:40
+msgid "Change references to this page from:"
+msgstr ""
+
+#: lib/Page/MergeOrRename.php:253
+#, php-format
+msgid "Changed references from %s to %s"
+msgstr ""
+
+#: templates/edit/standard.inc:28
+msgid "Changelog is required"
+msgstr ""
+
+#: templates/edit/create.inc:26
+msgid ""
+"Click on \"Create\" below if you want to create this page now and start "
+"editing."
+msgstr ""
+
+#: scripts/wicked.php:42
+msgid "Couldn't read command-line options."
+msgstr ""
+
+#: templates/edit/create.inc:46
+msgid "Create"
+msgstr ""
+
+#: lib/Page/NewPage.php:135
+#, php-format
+msgid "Create Failed: %s"
+msgstr ""
+
+#: templates/history/header.inc:24
+msgid "Created"
+msgstr ""
+
+#: templates/pagelist/header.inc:8 templates/edit/create.inc:20
+#: lib/Page/Search.php:158
+msgid "Creation Date"
+msgstr ""
+
+#: templates/display/AttachedFiles.html:11
+msgid "Date"
+msgstr ""
+
+#: lib/Page/DeletePage.php:103
+msgid "Delete"
+msgstr ""
+
+#: templates/display/standard.inc:52
+#, php-format
+msgid "Delete %s"
+msgstr ""
+
+#: templates/history/header.inc:16
+msgid "Delete Version"
+msgstr ""
+
+#: templates/history/summary.inc:6
+#, php-format
+msgid "Delete Version %s"
+msgstr ""
+
+#: lib/Page/DeletePage.php:97 lib/Page/DeletePage.php:120
+msgid "DeletePage"
+msgstr ""
+
+#: lib/Page/DeletePage.php:142
+#, php-format
+msgid "Deleted version %s of \"%s\"."
+msgstr ""
+
+#: templates/history/header.inc:26
+msgid "Diff From"
+msgstr ""
+
+#: templates/history/header.inc:27
+msgid "Diff To"
+msgstr ""
+
+#: diff.php:56 templates/diff/diff.inc:2
+#, php-format
+msgid "Diff for %s between %s and %s"
+msgstr ""
+
+#: templates/pagelist/summary.inc:3
+#, php-format
+msgid "Display %s"
+msgstr ""
+
+#: templates/history/summary.inc:2 templates/pagelist/summary.inc:6
+#, php-format
+msgid "Display Version %s"
+msgstr ""
+
+#: templates/display/AttachedFiles.html:13
+msgid "Downloads"
+msgstr ""
+
+#: preview.php:24 templates/display/standard.inc:24
+#, php-format
+msgid "Edit %s"
+msgstr ""
+
+#: templates/history/header.inc:18
+msgid "Edit Version"
+msgstr ""
+
+#: templates/history/summary.inc:16
+#, php-format
+msgid "Edit Version %s"
+msgstr ""
+
+#: templates/edit/standard.inc:21 lib/Page/EditPage.php:93
+msgid "EditPage"
+msgstr ""
+
+#: templates/display/AttachedFiles.html:67
+msgid "Enter a name for this file (if blank, will use the file's current name)"
+msgstr ""
+
+#: scripts/mail-filter.php:127
+#, php-format
+msgid "Error creating new page: %s"
+msgstr ""
+
+#: lib/Page/MergeOrRename.php:202
+#, php-format
+msgid "Error deleting %s: %s"
+msgstr ""
+
+#: scripts/mail-filter.php:42
+#, php-format
+msgid "Error parsing MIME message: %s\n"
+msgstr ""
+
+#: lib/Page/MergeOrRename.php:217
+#, php-format
+msgid "Error renaming \"%s\": %s"
+msgstr ""
+
+#: lib/Page/MergeOrRename.php:247
+#, php-format
+msgid "Error retrieving %s: %s"
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:111 lib/Page/AttachedFiles.php:253
+#, php-format
+msgid "Error retrieving attachments: %s"
+msgstr ""
+
+#: lib/Page/AddPage.php:68
+#, php-format
+msgid "Error retrieving templates: %s"
+msgstr ""
+
+#: lib/Page/MergeOrRename.php:194 lib/Page/MergeOrRename.php:274
+#, php-format
+msgid "Error updating %s: %s"
+msgstr ""
+
+#: lib/Page/Search.php:164
+msgid "Exact Match"
+msgstr ""
+
+#: lib/Page/MergeOrRename.php:164
+#, php-format
+msgid "Failed to retrieve \"%s\": %s"
+msgstr ""
+
+#: lib/Page.php:274
+msgid "Guest"
+msgstr ""
+
+#: templates/display/standard.inc:85
+msgid "Hi_story"
+msgstr ""
+
+#: templates/display/standard.inc:84
+#, php-format
+msgid "History of %s"
+msgstr ""
+
+#: lib/Page/StandardPage/StdHistoryPage.php:46
+msgid "History page not found"
+msgstr ""
+
+#: history.php:30 templates/history/header.inc:7
+#, php-format
+msgid "History: %s"
+msgstr ""
+
+#: lib/Wicked.php:130
+msgid "HowTo_UseWiki"
+msgstr ""
+
+#: templates/display/MergeOrRename.html:26
+msgid "If a page with the new name already exists, then"
+msgstr ""
+
+#: history.php:18 display.php:18
+msgid "Internal error viewing requested page"
+msgstr ""
+
+#: diff.php:39
+#, php-format
+msgid "Internal error viewing requested page: %s"
+msgstr ""
+
+#: lib/api.php:224
+msgid "Invalid page requested."
+msgstr ""
+
+#: templates/display/AttachedFiles.html:133
+msgid "Is this a minor update?"
+msgstr ""
+
+#: templates/display/standard.inc:72
+msgid "L_ikePages"
+msgstr ""
+
+#: templates/display/title.inc:6 templates/edit/standard.inc:20
+#, php-format
+msgid "Last Modified %s by %s"
+msgstr ""
+
+#: lib/Page/LeastPopular.php:93
+msgid "LeastPopular"
+msgstr ""
+
+#: templates/display/standard.inc:72
+msgid "LikePages"
+msgstr ""
+
+#: lib/Page/LikePages.php:82
+#, php-format
+msgid "LikePages: %s"
+msgstr ""
+
+#: templates/display/standard.inc:40
+#, php-format
+msgid "Lock %s"
+msgstr ""
+
+#: templates/display/title.inc:34 templates/edit/standard.inc:21
+#: lib/Page/DeletePage.php:97 lib/Page/RevertPage.php:81
+msgid "Locked"
+msgstr ""
+
+#: scripts/wicked.php:104
+#, php-format
+msgid "Logged in successfully as \"%s\"."
+msgstr ""
+
+#: scripts/wicked.php:100
+msgid "Login is incorrect."
+msgstr ""
+
+#: scripts/wicked.php:158
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too."
+msgstr ""
+
+#: templates/display/standard.inc:60
+msgid "MergeOrRename"
+msgstr ""
+
+#: lib/Page/MergeOrRename.php:125
+#, php-format
+msgid "MergeOrRename: %s"
+msgstr ""
+
+#: lib/Page/MergeOrRename.php:207
+#, php-format
+msgid "Merged \"%s\" into \"%s\"."
+msgstr ""
+
+#: lib/Page/MergeOrRename.php:210
+#, php-format
+msgid "Merged \"%s\" into \"%s\". New page: %s\n"
+msgstr ""
+
+#: lib/Page/MergeOrRename.php:191
+#, php-format
+msgid "Merged from %s"
+msgstr ""
+
+#: templates/edit/standard.inc:30
+msgid "Minor Change"
+msgstr ""
+
+#: lib/Page/MostPopular.php:93
+msgid "MostPopular"
+msgstr ""
+
+#: lib/Block/page.php:41
+msgid "Name of wiki page to display"
+msgstr ""
+
+#: lib/Page.php:263
+msgid "Never"
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:303
+#, php-format
+msgid "New attachment \"%s\" to page \"%s\"."
+msgstr ""
+
+#: templates/display/MergeOrRename.html:15
+msgid "New name"
+msgstr ""
+
+#: lib/Page/MergeOrRename.php:151
+msgid "New name is the same as old name."
+msgstr ""
+
+#: lib/Page/NewPage.php:112
+msgid "NewPage"
+msgstr ""
+
+#: templates/edit/new.inc:20
+#, php-format
+msgid "NewPage: %s"
+msgstr ""
+
+#: lib/api.php:159 lib/Page/EditPage.php:124
+msgid "No changes made"
+msgstr ""
+
+#: lib/Driver.php:124
+msgid "Not implemented."
+msgstr ""
+
+#: templates/pagelist/header.inc:5 templates/edit/create.inc:17
+#: lib/Page/Search.php:155
+msgid "Page"
+msgstr ""
+
+#: lib/Page/MergeOrRename.php:179
+#, php-format
+msgid "Page \"%s\" already exists."
+msgstr ""
+
+#: lib/Page/NewPage.php:138
+msgid "Page Created"
+msgstr ""
+
+#: lib/Page/EditPage.php:131
+msgid "Page Saved"
+msgstr ""
+
+#: templates/edit/create.inc:35
+msgid "Page Template:"
+msgstr ""
+
+#: lib/Page/Search.php:178
+msgid "Page Text Matches"
+msgstr ""
+
+#: lib/Page/Search.php:171
+msgid "Page Title Matches"
+msgstr ""
+
+#: templates/pagelist/header.inc:10
+msgid "Page Views"
+msgstr ""
+
+#: display.php:32
+#, php-format
+msgid "Page failed to lock: %s"
+msgstr ""
+
+#: display.php:47
+#, php-format
+msgid "Page failed to unlock: %s"
+msgstr ""
+
+#: display.php:35
+msgid "Page locked"
+msgstr ""
+
+#: lib/Driver/sql.php:587 lib/Page/AddPage.php:53 lib/Page/NewPage.php:72
+msgid "Page name must not be empty"
+msgstr ""
+
+#: display.php:50
+msgid "Page unlocked"
+msgstr ""
+
+#: lib/api.php:73 lib/api.php:76
+msgid "Pages"
+msgstr ""
+
+#: lib/Page/NewPage.php:129
+msgid "Pages cannot be empty."
+msgstr ""
+
+#: templates/display/standard.inc:100
+msgid "Permissio_ns"
+msgstr ""
+
+#: lib/api.php:220
+msgid "Permission denied."
+msgstr ""
+
+#: templates/edit/new.inc:25 templates/edit/standard.inc:26
+msgid "Preview"
+msgstr ""
+
+#: lib/Page/EditPage.php:112
+msgid "Random string did not match."
+msgstr ""
+
+#: lib/Page/RecentChanges.php:113
+msgid "RecentChanges"
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:67
+#, php-format
+msgid "Referrer \"%s\" does not exist."
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:129
+#, php-format
+msgid "Reload \"%s\""
+msgstr ""
+
+#: templates/history/header.inc:8
+msgid "Reload History"
+msgstr ""
+
+#: templates/display/title.inc:32 templates/display/title.inc:33
+msgid "Reload Page"
+msgstr ""
+
+#: lib/Page/MergeOrRename.php:222
+#, php-format
+msgid "Renamed \"%s\" to \"%s\"."
+msgstr ""
+
+#: lib/Page/MergeOrRename.php:225
+#, php-format
+msgid "Renamed \"%s\" to \"%s\". New page: %s\n"
+msgstr ""
+
+#: lib/Driver/sql.php:676
+#, php-format
+msgid "Renamed page from %s"
+msgstr ""
+
+#: templates/history/header.inc:20
+msgid "Restore Version"
+msgstr ""
+
+#: lib/Page/RevertPage.php:87
+msgid "Revert"
+msgstr ""
+
+#: templates/history/summary.inc:26
+#, php-format
+msgid "Revert to version %s"
+msgstr ""
+
+#: lib/Page/RevertPage.php:81 lib/Page/RevertPage.php:104
+msgid "RevertPage"
+msgstr ""
+
+#: lib/Page/RevertPage.php:127
+#, php-format
+msgid "Reverted to version %s of \"%s\"."
+msgstr ""
+
+#: lib/Driver/sql.php:591
+msgid "Robots are not allowed to create pages"
+msgstr ""
+
+#: templates/edit/new.inc:24 templates/edit/standard.inc:25
+msgid "Save"
+msgstr ""
+
+#: lib/Page/EditPage.php:128
+#, php-format
+msgid "Save Failed: %s"
+msgstr ""
+
+#: templates/menu.inc:19 lib/Page/Search.php:203
+msgid "Search"
+msgstr ""
+
+#: templates/pagelist/search.inc:1
+msgid "Search Results"
+msgstr ""
+
+#: templates/display/AttachedFiles.html:58
+#: templates/display/AttachedFiles.html:110
+msgid "Select file to attach:"
+msgstr ""
+
+#: templates/display/AttachedFiles.html:119
+msgid "Select the file to update"
+msgstr ""
+
+#: templates/display/standard.inc:99
+#, php-format
+msgid "Set permissions for %s"
+msgstr ""
+
+#: templates/display/title.inc:16 lib/Page/RecentChanges.php:56
+#, php-format
+msgid "Show changes for %s"
+msgstr ""
+
+#: lib/Page/RecentChanges.php:63
+#, php-format
+msgid "Show version %s"
+msgstr ""
+
+#: templates/edit/standard.inc:41
+msgid "Spam Protection - Enter the letters below:"
+msgstr ""
+
+#: templates/display/MergeOrRename.html:33
+msgid "Stop and don't do anything"
+msgstr ""
+
+#: templates/display/MergeOrRename.html:61
+msgid "Submit"
+msgstr ""
+
+#: lib/Page/DeletePage.php:136
+#, php-format
+msgid "Successfully deleted \"%s\"."
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:207
+#, php-format
+msgid "Successfully deleted version %s of \"%s\" from \"%s\""
+msgstr ""
+
+#: lib/Page.php:485
+msgid "Table of Contents"
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:280
+#, php-format
+msgid "There is already an attachment named \"%s\"."
+msgstr ""
+
+#: lib/Page/MergeOrRename.php:149 lib/Page/MergeOrRename.php:155
+msgid "This is a required field."
+msgstr ""
+
+#: display.php:62
+msgid "This page does not have a history"
+msgstr ""
+
+#: lib/Page/MergeOrRename.php:100
+#, php-format
+msgid "This page is referenced from %d other page(s)."
+msgstr ""
+
+#: templates/display/standard.inc:35
+msgid "Un_lock"
+msgstr ""
+
+#: lib/Page/StandardPage.php:79
+#, php-format
+msgid "Unable to create %s"
+msgstr ""
+
+#: lib/Page/StandardPage.php:87
+msgid "Unable to create WikiHome. The wiki is not configured."
+msgstr ""
+
+#: templates/display/standard.inc:34
+#, php-format
+msgid "Unlock %s"
+msgstr ""
+
+#: lib/Driver.php:78 lib/Driver.php:92 lib/Driver.php:104 lib/Driver.php:109
+#: lib/Driver.php:129 lib/Driver.php:134 lib/Driver.php:192 lib/Driver.php:197
+#: lib/Driver.php:202 lib/Driver.php:216 lib/Driver.php:230 lib/Driver.php:244
+#: lib/Driver.php:249 lib/Driver.php:254 lib/Driver.php:272 lib/Driver.php:392
+#: lib/Driver.php:418 lib/Driver.php:434 lib/Page.php:255 lib/Page.php:289
+#: lib/Page.php:294 lib/Page.php:393 lib/Page.php:403 lib/Page.php:413
+#: lib/Page.php:423 lib/Page.php:520 lib/Page.php:531 lib/Page.php:536
+#: lib/Page.php:541 lib/Page.php:546 lib/Page.php:586
+msgid "Unsupported"
+msgstr ""
+
+#: templates/display/AttachedFiles.html:154
+msgid "Update File"
+msgstr ""
+
+#: templates/display/AttachedFiles.html:104
+msgid "Update an Attachment"
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:300
+#, php-format
+msgid "Updated attachment \"%s\" on page \"%s\"."
+msgstr ""
+
+#: scripts/wicked.php:156
+#, php-format
+msgid "Usage: %s [OPTIONS]..."
+msgstr ""
+
+#: templates/history/header.inc:13 templates/pagelist/header.inc:6
+#: templates/edit/create.inc:18 lib/Page/Search.php:156
+#: templates/display/AttachedFiles.html:9
+msgid "Version"
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:309
+msgid "View page: "
+msgstr ""
+
+#: lib/api.php:181
+msgid "Wiki Templates"
+msgstr ""
+
+#: lib/Block/page.php:3
+msgid "Wiki page"
+msgstr ""
+
+#: display.php:26
+msgid "You are not allowed to lock this page"
+msgstr ""
+
+#: display.php:41
+msgid "You are not allowed to unlock this page"
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:196
+msgid "You do not have permission to delete attachments from this page."
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:237 lib/Page/MergeOrRename.php:169
+#: lib/Page/MergeOrRename.php:184
+#, php-format
+msgid "You do not have permission to edit \"%s\""
+msgstr ""
+
+#: lib/Page/NewPage.php:125
+#, php-format
+msgid "You don't have permission to create \"%s\"."
+msgstr ""
+
+#: lib/Page/DeletePage.php:150
+#, php-format
+msgid "You don't have permission to delete \"%s\"."
+msgstr ""
+
+#: lib/api.php:141 lib/Page/EditPage.php:107 lib/Page/RevertPage.php:133
+#, php-format
+msgid "You don't have permission to edit \"%s\"."
+msgstr ""
+
+#: display.php:74 display.php:77
+msgid "You don't have permission to view this page."
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:245
+msgid "You must enter a change description to attach this file."
+msgstr ""
+
+#: lib/api.php:145 lib/Page/EditPage.php:118
+msgid "You must provide a change log."
+msgstr ""
+
+#: lib/Wicked.php:130
+msgid "_AllPages"
+msgstr ""
+
+#: templates/display/standard.inc:67
+msgid "_BackLinks"
+msgstr ""
+
+#: templates/display/standard.inc:53
+msgid "_Delete"
+msgstr ""
+
+#: templates/display/standard.inc:25
+msgid "_EditPage"
+msgstr ""
+
+#: templates/display/standard.inc:41
+msgid "_Lock"
+msgstr ""
+
+#: templates/display/standard.inc:61
+msgid "_MergeOrRename"
+msgstr ""
+
+#: lib/Wicked.php:130
+msgid "_RecentChanges"
+msgstr ""
+
+#: lib/Wicked.php:130
+msgid "_WikiHome"
+msgstr ""
+
+#: lib/Page/AttachedFiles.php:217
+msgid "attachment"
+msgstr ""
+
+#: scripts/wicked.php:123
+#, php-format
+msgid "page \"%s\" doesn't exist."
+msgstr ""
--- /dev/null
+# Wicked Traditional Chinese Translation
+# Copyright 2004-2009 The Horde Project
+# David Chang <david@tmv.gov.tw>, 2004.
+msgid ""
+msgstr ""
+"Project-Id-Version: Wicked 0.1 CVS\n"
+"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
+"POT-Creation-Date: 2007-01-25 15:10+0800\n"
+"PO-Revision-Date: 2006-04-21 10:23+0200\n"
+"Last-Translator: David Chang <david@tmv.gov.tw>\n"
+"Language-Team: Traditional Chinese <i18n@lists.horde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=BIG5\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: templates/edit/create.inc:13
+#, php-format
+msgid ""
+"%s does not exist, but maybe you were looking for one of the following pages?"
+msgstr "%s ¤£¦s¦b,¤£¹L©Î³\§An§äªº´N¬O¤U¦C¨ä¤¤ªº¤@Ó¶±?"
+
+#: templates/edit/create.inc:30
+#, php-format
+msgid ""
+"%s does not exist. Click on \"Create\" below if you want to create this page "
+"now and start editing."
+msgstr "%s ¤£¦s¦b. ¦pªGn«Ø¥ß³oÓ¶±¨Ã¥B¶}©l½s¿è½ÐÂI¿ï¤U±ªº \"«Ø¥ß\"."
+
+#: templates/edit/create.inc:37
+msgid "(None)"
+msgstr "(µL)"
+
+#: scripts/wicked.php:161
+msgid ""
+"-d, --debug Run in debug mode (displays extra information)"
+msgstr "-d, --debug ¥H°»¿ù¼Ò¦¡°õ¦æ (Åã¥ÜÃB¥~¸ê°T)"
+
+#: scripts/wicked.php:163
+msgid ""
+"-g, --get[=pagetitle] Return all pages (unless pagetitle specified)"
+msgstr "-g, --get[=pagetitle] ¦^¶Ç©Ò¦³¶± (°£¶±¼ÐÃD¤w«ü©w¥~)"
+
+#: scripts/wicked.php:160
+msgid "-h, --help Show this help"
+msgstr "-h, --help Åã¥Ü»¡©ú "
+
+#: scripts/wicked.php:162
+msgid "-l, --list-pages List pages"
+msgstr "-l, --list-pages ¦C¥X¶±"
+
+#: scripts/wicked.php:164
+msgid "-o, --out[=type] Output type for results (default:xml)"
+msgstr "-o, --out[=type] ¿é¥X«¬ºA (¹w³]:xml)"
+
+#: scripts/wicked.php:166
+msgid "-p, --password[=password] Horde login password"
+msgstr "-p, --password[=password] Horde µn¤J±K½X"
+
+#: scripts/wicked.php:165
+msgid "-u, --username[=username] Horde login username"
+msgstr "-u, --username[=username] Horde µn¤J¦WºÙ"
+
+#: templates/display/MergeOrRename.html:31
+msgid "Add the text from this page"
+msgstr "±q³oÓ¶±¤¤·s¼W¤å¦r"
+
+#: lib/Page/AddPage.php:93
+#, php-format
+msgid "AddPage: %s"
+msgstr "·s¼W¶±: %s"
+
+#: lib/Page/AllPages.php:81
+msgid "AllPages"
+msgstr "©Ò¦³¶±"
+
+#: lib/Page/DeletePage.php:77
+msgid ""
+"Are you sure you want to delete this page? All versions will be permanently "
+"removed."
+msgstr "§A½T©wn§R°£³oÓ¶±¶Ü? ©Ò¦³¦¹¶±ªºª©¥»¤]±N¤@¨Ö§R°£."
+
+#: lib/Page/DeletePage.php:79
+#, php-format
+msgid "Are you sure you want to delete version %s of this page?"
+msgstr "§A½T©wn§R°£³oÓ¶±ªº %s ª©¥»¶Ü?"
+
+#: lib/Page/RevertPage.php:65
+#, php-format
+msgid "Are you sure you want to revert to version %s of this page?"
+msgstr "§A½T©wn¦^¦s³oÓ¶±ªº %s ª©¥»¶Ü?"
+
+#: templates/display/AttachedFiles.html:88
+msgid "Attach File"
+msgstr "ªþ¥[ÀÉ®×"
+
+#: templates/display/AttachedFiles.html:52
+msgid "Attach a New File"
+msgstr "ªþ¥[¤@Ó·sªºÀÉ®×"
+
+#: templates/display/standard.inc:68
+msgid "AttachedFiles"
+msgstr "ªþ¥[ÀÉ®×"
+
+#: lib/Page/AttachedFiles.php:158
+#, php-format
+msgid "AttachedFiles: %s"
+msgstr "ªþ¥[ÀÉ®×: %s"
+
+#: templates/display/standard.inc:69
+msgid "Attached_Files"
+msgstr "ªþ¥[ÀÉ®×_F"
+
+#: templates/display/AttachedFiles.html:7
+msgid "Attachment Name"
+msgstr "ªþ¥ó¦WºÙ"
+
+#: templates/display/standard.inc:119
+msgid "Attachments"
+msgstr "ªþ¥ó"
+
+#: lib/Page/AttachedFiles.php:203
+msgid "Attachments with spaces can't be embedded into a page."
+msgstr "ªþ¥[Àɮפº§tªÅ¥Õ¤å¦r¦]¦¹µLªk®r¤J¶±¤¤."
+
+#: templates/pagelist/header.inc:5 templates/pagelist/pagesearch.inc:16
+#: templates/pagelist/titlesearch.inc:16 templates/history/header.inc:23
+#: templates/edit/create.inc:19 templates/display/AttachedFiles.html:10
+msgid "Author"
+msgstr "§@ªÌ"
+
+#: templates/display/standard.inc:106
+msgid "Ba_ck to"
+msgstr "¨ì_c"
+
+#: templates/display/standard.inc:106
+msgid "Back to"
+msgstr "¨ì"
+
+#: templates/display/standard.inc:60
+msgid "BackLinks"
+msgstr "°f¦V³sµ²"
+
+#: lib/Page/BackLinks.php:74
+#, php-format
+msgid "BackLinks: %s"
+msgstr "°f¦V³sµ²: %s"
+
+#: lib/Page/AttachedFiles.php:208
+msgid "Can't read uploaded file."
+msgstr "µLªkŪ¨ú¤W¶ÇÀÉ®×."
+
+#: lib/Page/RevertPage.php:113
+#, php-format
+msgid "Can't revert to an unknown version."
+msgstr "µLªk¦^¦s¨ì¤@Ó¥¼ª¾ªºª©¥»."
+
+#: lib/Page/AttachedFiles.php:243
+#, php-format
+msgid "Can't update \"%s\": no such attachment."
+msgstr "µLªk§ó·s \"%s\": µL¦¹ªþ¥ó."
+
+#: templates/edit/create.inc:47 templates/edit/standard.inc:33
+#: lib/Page/DeletePage.php:98 lib/Page/MergeOrRename.php:135
+#: lib/Page/RevertPage.php:82 templates/display/MergeOrRename.html:62
+msgid "Cancel"
+msgstr "¨ú®ø"
+
+#: templates/history/header.inc:29 templates/display/AttachedFiles.html:12
+msgid "Change Log"
+msgstr "Åܧó°O¿ý"
+
+#: templates/edit/standard.inc:35
+msgid "Change log"
+msgstr "Åܧó°O¿ý"
+
+#: templates/display/AttachedFiles.html:80
+#: templates/display/AttachedFiles.html:146
+msgid "Change log entry"
+msgstr "Åܧó¾ú¥v°O¿ý"
+
+#: config/prefs.php.dist:13
+msgid "Change menu preferences."
+msgstr "Åܧó¿ï³æ°¾¦n³]©w."
+
+#: templates/display/MergeOrRename.html:40
+msgid "Change references to this page from:"
+msgstr "Åܧó¨ì¤U¦C¶±¤¤ªºì©l³sµ²¦WºÙ:"
+
+#: lib/Page/MergeOrRename.php:248
+#, php-format
+msgid "Changed references from %s to %s"
+msgstr "%s¨ì%sªº°Ñ¦Ò¤wÅܧó"
+
+#: templates/edit/standard.inc:34
+msgid "Changelog is required"
+msgstr "¥²¶·n¦³Åܧó°O¿ý"
+
+#: templates/edit/create.inc:26
+msgid ""
+"Click on \"Create\" below if you want to create this page now and start "
+"editing."
+msgstr "¦pªGn«Ø¥ß³oÓ¶±¨Ã¥B¶}©l½s¿è½ÐÂI¿ï¤U±ªº \"«Ø¥ß\"."
+
+#: scripts/wicked.php:42
+msgid "Couldn't read command-line options."
+msgstr "µLªkŪ¨ú©R¥O¦Cªº¿ï¶µ."
+
+#: templates/edit/create.inc:46
+msgid "Create"
+msgstr "«Ø¥ß"
+
+#: lib/Page/NewPage.php:124
+#, php-format
+msgid "Create Failed: %s"
+msgstr "«Ø¥ß¥¢±Ñ: %s"
+
+#: templates/history/header.inc:24
+msgid "Created"
+msgstr "«Ø¥ß¤é"
+
+#: templates/pagelist/header.inc:6 templates/pagelist/pagesearch.inc:17
+#: templates/pagelist/titlesearch.inc:17 templates/edit/create.inc:20
+msgid "Creation Date"
+msgstr "«Ø¥ß¤é"
+
+#: templates/display/AttachedFiles.html:11
+msgid "Date"
+msgstr "¤é´Á"
+
+#: templates/display/standard.inc:89
+msgid "Debug"
+msgstr "°»¿ù"
+
+#: templates/display/standard.inc:88
+#, php-format
+msgid "Debug %s"
+msgstr "°»¿ù %s"
+
+#: lib/Page/DeletePage.php:97
+msgid "Delete"
+msgstr "§R°£"
+
+#: templates/display/standard.inc:47
+#, php-format
+msgid "Delete %s"
+msgstr "§R°£ %s"
+
+#: templates/history/header.inc:16
+msgid "Delete Version"
+msgstr "§R°£ª©¥»"
+
+#: templates/history/summary.inc:6
+#, php-format
+msgid "Delete Version %s"
+msgstr "§R°£ª©¥» %s"
+
+#: lib/Page/DeletePage.php:91 lib/Page/DeletePage.php:114
+msgid "DeletePage"
+msgstr "§R°£¶±"
+
+#: lib/Page/DeletePage.php:137
+#, php-format
+msgid "Deleted version %s of \"%s\"."
+msgstr "§R°£ \"%2$s\" ªºª©¥» %1$s."
+
+#: templates/history/header.inc:26
+msgid "Diff From"
+msgstr "¤£¦P¦Û"
+
+#: templates/history/header.inc:27
+msgid "Diff To"
+msgstr "¤£¦P¨ì"
+
+#: diff.php:56 templates/diff/diff.inc:2
+#, php-format
+msgid "Diff for %s between %s and %s"
+msgstr "%s ªºª©¥»®t²§¤¶©ó %s »P %s"
+
+#: templates/pagelist/summary.inc:3
+#, php-format
+msgid "Display %s"
+msgstr "Åã¥Ü %s"
+
+#: config/prefs.php.dist:11
+msgid "Display Options"
+msgstr "Åã¥Ü¿ï¶µ"
+
+#: templates/pagelist/summary.inc:6 templates/history/summary.inc:2
+#, php-format
+msgid "Display Version %s"
+msgstr "Åã¥Üª©¥» %s"
+
+#: templates/display/AttachedFiles.html:13
+msgid "Downloads"
+msgstr "¤U¸ü"
+
+#: preview.php:24 templates/display/standard.inc:23
+#, php-format
+msgid "Edit %s"
+msgstr "½s¿è %s"
+
+#: templates/history/header.inc:18
+msgid "Edit Version"
+msgstr "½s¿èª©¥»"
+
+#: templates/history/summary.inc:16
+#, php-format
+msgid "Edit Version %s"
+msgstr "½s¿èª©¥» %s"
+
+#: templates/edit/standard.inc:22 lib/Page/EditPage.php:88
+msgid "EditPage"
+msgstr "½s¿è¶±"
+
+#: templates/display/AttachedFiles.html:67
+msgid "Enter a name for this file (if blank, will use the file's current name)"
+msgstr "¿é¤JÀɮתº¦WºÙ (¦pªGªÅ¥Õ¡A¹w³]¨Ï¥ÎÀɮתº²{¦æ¦WºÙ)"
+
+#: scripts/mail-filter.php:127
+#, php-format
+msgid "Error creating new page: %s"
+msgstr "·s¶±«Ø¥ß®Éµo¥Í¿ù»~: %s"
+
+#: lib/Page/MergeOrRename.php:197
+#, php-format
+msgid "Error deleting %s: %s"
+msgstr "§R°£ %s: %s ®Éµo¥Í¿ù»~"
+
+#: scripts/mail-filter.php:42
+#, php-format
+msgid "Error parsing MIME message: %s\n"
+msgstr "°õ¦æ MIME ¶l¥ó: %s »y¥y¤ÀªR®Éµo¥Í¿ù»~\n"
+
+#: lib/Page/MergeOrRename.php:212
+#, php-format
+msgid "Error renaming \"%s\": %s"
+msgstr "§ó¦W \"%s\": %s ®Éµo¥Í¿ù»~."
+
+#: lib/Page/MergeOrRename.php:242
+#, php-format
+msgid "Error retrieving %s: %s"
+msgstr "Â^¨ú %s: %s ®Éµo¥Í¿ù»~"
+
+#: lib/Page/AttachedFiles.php:101 lib/Page/AttachedFiles.php:226
+#, php-format
+msgid "Error retrieving attachments: %s"
+msgstr "Â^¨úªþ¥[ÀÉ®×: %s ®Éµo¥Í¿ù»~"
+
+#: lib/Page/AddPage.php:53
+#, php-format
+msgid "Error retrieving templates: %s"
+msgstr "Â^¨ú½d¥»¶±: %s ®Éµo¥Í¿ù»~"
+
+#: lib/Page/MergeOrRename.php:189 lib/Page/MergeOrRename.php:269
+#, php-format
+msgid "Error updating %s: %s"
+msgstr "§ó·s %s: %s ®Éµo¥Í¿ù»~"
+
+#: lib/Page/MergeOrRename.php:159
+#, php-format
+msgid "Failed to retrieve \"%s\": %s"
+msgstr "Â^¨ú \"%s\": %s ¥¢±Ñ"
+
+#: templates/pagelist/titlesearch.inc:8
+msgid "Go"
+msgstr "«e©¹"
+
+#: lib/Page.php:278
+msgid "Guest"
+msgstr "¨Ó»«"
+
+#: templates/display/standard.inc:75
+msgid "Hi_story"
+msgstr "¾ú¥v_s"
+
+#: templates/display/standard.inc:74
+#, php-format
+msgid "History of %s"
+msgstr "%s ªº¾ú¥v"
+
+#: history.php:28 templates/history/header.inc:7
+#, php-format
+msgid "History: %s"
+msgstr "¾ú¥v: %s"
+
+#: lib/Wicked.php:131
+msgid "HowTo_UseWiki"
+msgstr "¦p¦ó¨Ï¥Î Wiki_U"
+
+#: templates/display/MergeOrRename.html:26
+msgid "If a page with the new name already exists, then"
+msgstr "¦pªG·s¦WºÙ¤w¸g¦s¦bªº¸Ü,¨º´N"
+
+#: templates/display/standard.inc:82
+msgid "Info"
+msgstr "¸ê°T"
+
+#: templates/display/standard.inc:81
+#, php-format
+msgid "Info about %s"
+msgstr "Ãö©ó %s ªº¸ê°T"
+
+#: display.php:24 history.php:16
+msgid "Internal error viewing requested page"
+msgstr "À˵ø¶±®Éµo¥Í¤@Ó¤º³¡¿ù»~."
+
+#: diff.php:39
+#, php-format
+msgid "Internal error viewing requested page: %s"
+msgstr "À˵ø¶±: %s ®Éµo¥Í¤@Ó¤º³¡¿ù»~."
+
+#: templates/display/AttachedFiles.html:133
+msgid "Is this a minor update?"
+msgstr "³o¬O¤@Ó¦¸n§ó·s?"
+
+#: templates/display/standard.inc:64
+msgid "L_ikePages"
+msgstr "¬Û¦ü¶±_i"
+
+#: templates/display/title.inc:6 templates/edit/standard.inc:25
+#, php-format
+msgid "Last Modified %s by %s"
+msgstr "³Ìªñ¤@¦¸§ó·s %s ¥Ñ %s"
+
+#: lib/Page/LeastPopular.php:86
+msgid "LeastPopular"
+msgstr "³Ì¤£¨ü³ß·Rªº"
+
+#: templates/display/standard.inc:64
+msgid "LikePages"
+msgstr "¬Û¦ü¶±"
+
+#: lib/Page/LikePages.php:76
+#, php-format
+msgid "LikePages: %s"
+msgstr "¬Û¦ü¶±: %s"
+
+#: templates/display/standard.inc:35
+#, php-format
+msgid "Lock %s"
+msgstr "吩w %s"
+
+#: templates/display/title.inc:34 templates/edit/standard.inc:22
+#: lib/Page/DeletePage.php:91 lib/Page/RevertPage.php:75
+msgid "Locked"
+msgstr "¤wÂê©w"
+
+#: scripts/wicked.php:104
+#, php-format
+msgid "Logged in successfully as \"%s\"."
+msgstr "¤w¦¨¥\µn¤J¬° \"%s\"."
+
+#: scripts/wicked.php:100
+msgid "Login is incorrect."
+msgstr "µn¤J¸ê®Æ¤£¥¿½T."
+
+#: scripts/wicked.php:158
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too."
+msgstr ""
+
+#: config/prefs.php.dist:12
+msgid "Menu Preferences"
+msgstr "¿ï³æ°¾¦n³]©w"
+
+#: templates/display/standard.inc:54
+msgid "MergeOrRename"
+msgstr "¦X¨Ö©Î§ó¦W"
+
+#: lib/Page/MergeOrRename.php:120
+#, php-format
+msgid "MergeOrRename: %s"
+msgstr "¦X¨Ö©Î§ó¦W: %s"
+
+#: lib/Page/MergeOrRename.php:202
+#, php-format
+msgid "Merged \"%s\" into \"%s\"."
+msgstr "¦X¨Ö \"%s\" ¨ì \"%s\" ¤¤."
+
+#: lib/Page/MergeOrRename.php:205
+#, php-format
+msgid "Merged \"%s\" into \"%s\". New page: %s\n"
+msgstr "¤w¦X¨Ö \"%s\" ¨ì \"%s\" ¤¤. ·s¶±: %s\n"
+
+#: lib/Page/MergeOrRename.php:186
+#, php-format
+msgid "Merged from %s"
+msgstr "¦X¨Ö¦Û %s"
+
+#: templates/edit/standard.inc:36
+msgid "Minor Change"
+msgstr "¦¸nÅܧó"
+
+#: lib/Page/MostPopular.php:86
+msgid "MostPopular"
+msgstr "³Ì¨ü³ß·Rªº"
+
+#: lib/Block/page.php:41
+msgid "Name of wiki page to display"
+msgstr "wiki ¶±ªºÅã¥Ü¦WºÙ"
+
+#: lib/Page.php:267
+msgid "Never"
+msgstr "±q¥¼"
+
+#: lib/Page/AttachedFiles.php:269
+#, php-format
+msgid "New attachment \"%s\" to page \"%s\"."
+msgstr "·s¼Wªþ¥[ÀÉ®× \"%s\" ¨ì¶± \"%s\"."
+
+#: templates/display/MergeOrRename.html:15
+msgid "New name"
+msgstr "·s¦WºÙ"
+
+#: lib/Page/MergeOrRename.php:146
+msgid "New name is the same as old name."
+msgstr "·s¦WºÙ»P¦WºÙ¬Û¦P."
+
+#: lib/Page/NewPage.php:101
+msgid "NewPage"
+msgstr "·s¼W¶±"
+
+#: templates/edit/new.inc:22
+#, php-format
+msgid "NewPage: %s"
+msgstr "·s¼W¶±: %s"
+
+#: lib/Page/EditPage.php:119
+msgid "No changes made"
+msgstr "¥¼Åܧó."
+
+#: lib/Driver.php:126
+msgid "Not implemented."
+msgstr "µ{¦¡©|¥¼§¹¦¨."
+
+#: templates/pagelist/header.inc:3 templates/pagelist/pagesearch.inc:14
+#: templates/pagelist/titlesearch.inc:14 templates/edit/create.inc:17
+msgid "Page"
+msgstr "¶±"
+
+#: lib/Page/MergeOrRename.php:174
+#, php-format
+msgid "Page \"%s\" already exists."
+msgstr "¶± \"%s\" ¤w¦s¦b."
+
+#: lib/Page/NewPage.php:127
+msgid "Page Created"
+msgstr "¶±¤w«Ø¥ß"
+
+#: templates/menu.inc:15 config/prefs.php.dist:22
+msgid "Page Lookup"
+msgstr "¶±¦WºÙ"
+
+#: lib/Page/EditPage.php:126
+msgid "Page Saved"
+msgstr "¶±¤wÀx¦s."
+
+#: templates/edit/create.inc:35
+msgid "Page Template:"
+msgstr "¶±¼ËªO"
+
+#: templates/pagelist/header.inc:8
+msgid "Page Views"
+msgstr "¶±À˵ø"
+
+#: display.php:38
+#, php-format
+msgid "Page failed to lock: %s"
+msgstr "¶±Âê©w¥¢±Ñ: %s"
+
+#: display.php:53
+#, php-format
+msgid "Page failed to unlock: %s"
+msgstr "¶±¸Ñ°£Âê©w¥¢±Ñ: %s"
+
+#: display.php:41
+msgid "Page locked"
+msgstr "¶±¤wÂê©w"
+
+#: display.php:56
+msgid "Page unlocked"
+msgstr "¶±¤w¸Ñ°£Âê©w"
+
+#: templates/menu.inc:9 lib/Page/PageSearch.php:130 config/prefs.php.dist:24
+msgid "PageSearch"
+msgstr "¶±·j´M"
+
+#: lib/api.php:30 lib/api.php:33
+msgid "Pages"
+msgstr "©Ò¦³¶±"
+
+#: lib/Page/NewPage.php:118
+msgid "Pages cannot be empty."
+msgstr "¶±¤£¥iªÅ¥Õ."
+
+#: templates/display/standard.inc:102
+msgid "Permissio_ns"
+msgstr "Åv_n"
+
+#: templates/edit/new.inc:29 templates/edit/standard.inc:32
+msgid "Preview"
+msgstr "¹wÄý"
+
+#: lib/Page/EditPage.php:107
+msgid "Random string did not match."
+msgstr "ÀH¾÷¦r¦ê¤£§k¦X."
+
+#: lib/Page/RecentChanges.php:108
+msgid "RecentChanges"
+msgstr "³ÌªñªºÅܧó"
+
+#: lib/Page/AttachedFiles.php:58
+#, php-format
+msgid "Referrer \"%s\" does not exist."
+msgstr "°Ñ·Ó \"%s\" ¤£¦s¦b."
+
+#: lib/Page/AttachedFiles.php:118
+#, php-format
+msgid "Reload \"%s\""
+msgstr "«·sÀ˵ø \"%s\""
+
+#: templates/history/header.inc:8
+msgid "Reload History"
+msgstr "«·sÀ˵ø¾ú¥v"
+
+#: templates/display/title.inc:32 templates/display/title.inc:33
+msgid "Reload Page"
+msgstr "«·sÀ˵ø¶±"
+
+#: lib/Page/MergeOrRename.php:217
+#, php-format
+msgid "Renamed \"%s\" to \"%s\"."
+msgstr "\"%s\" §ó¦W¬° \"%s\"."
+
+#: lib/Page/MergeOrRename.php:220
+#, php-format
+msgid "Renamed \"%s\" to \"%s\". New page: %s\n"
+msgstr "¤w§ó¦W \"%s\" ¬° \"%s\". ·s¶±: %s\n"
+
+#: lib/Driver/sql.php:658
+#, php-format
+msgid "Renamed page from %s"
+msgstr "§ó¦W¶±¦Û %s"
+
+#: templates/history/header.inc:20
+msgid "Restore Version"
+msgstr "¦^¦sª©¥»"
+
+#: lib/Page/RevertPage.php:81
+msgid "Revert"
+msgstr "¦^¦s"
+
+#: templates/history/summary.inc:26
+#, php-format
+msgid "Revert to version %s"
+msgstr "¦^¦s¨ìª©¥» %s"
+
+#: lib/Page/RevertPage.php:75 lib/Page/RevertPage.php:98
+msgid "RevertPage"
+msgstr "¦^¦s¶±"
+
+#: lib/Page/RevertPage.php:121
+#, php-format
+msgid "Reverted to version %s of \"%s\"."
+msgstr "¦^¦s \"%2$s\" ªºª©¥» %1$s."
+
+#: lib/Driver/sql.php:573
+msgid "Robots are not allowed to create pages."
+msgstr "¤£¤¹³\©Ç«È«Ø¥ß¶±."
+
+#: templates/edit/new.inc:28 templates/edit/standard.inc:31
+msgid "Save"
+msgstr "Àx¦s"
+
+#: lib/Page/EditPage.php:123
+#, php-format
+msgid "Save Failed: %s"
+msgstr "Àx¦s¥¢±Ñ: %s"
+
+#: templates/pagelist/pagesearch.inc:8 lib/Block/TitleSearch.php:60
+msgid "Search"
+msgstr "·j´M"
+
+#: templates/display/AttachedFiles.html:58
+#: templates/display/AttachedFiles.html:110
+msgid "Select file to attach:"
+msgstr "¿ï¾Üªþ¥[ÀÉ®×:"
+
+#: templates/display/AttachedFiles.html:119
+msgid "Select the file to update"
+msgstr "¿ï¾Ü§ó·sÀÉ®×"
+
+#: templates/display/standard.inc:101
+#, php-format
+msgid "Set permissions for %s"
+msgstr "³]©w %s ªºÅv"
+
+#: templates/display/title.inc:16 lib/Page/RecentChanges.php:51
+#, php-format
+msgid "Show changes for %s"
+msgstr "Åã¥Ü %s ªºÅܧó"
+
+#: lib/Page/RecentChanges.php:58
+#, php-format
+msgid "Show version %s"
+msgstr "Åã¥Üª©¥» %s"
+
+#: templates/edit/standard.inc:49
+msgid "Spam Protection - Enter the letters below:"
+msgstr "Spam ¨¾ªv - ½Ð¿é¤J¥H¤U¤å¦r:"
+
+#: templates/display/MergeOrRename.html:33
+msgid "Stop and don't do anything"
+msgstr "°±¤î¡A¤°»ò¤]¤£n°µ"
+
+#: templates/display/MergeOrRename.html:61
+msgid "Submit"
+msgstr "°e¥X"
+
+#: lib/Page/DeletePage.php:131
+#, php-format
+msgid "Successfully deleted \"%s\"."
+msgstr "\"%s\"¤w§R°£§¹¦¨."
+
+#: lib/Page/AttachedFiles.php:193
+#, php-format
+msgid "Successfully deleted version %s of \"%s\" from \"%s\""
+msgstr "¤w¦¨¥\ªº¦Û \"%3$s\" §R°£ \"%2$s\" ªºª©¥» %1$s."
+
+#: lib/Page.php:516
+msgid "Table of Contents"
+msgstr "¤º®e¯Á¤Þ"
+
+#: lib/Page/AttachedFiles.php:249
+#, php-format
+msgid "There is already an attachment named \"%s\"."
+msgstr "ªþ¥ó¦WºÙ \"%s\" ¤w¦s¦b."
+
+#: lib/Page/MergeOrRename.php:144 lib/Page/MergeOrRename.php:150
+msgid "This is a required field."
+msgstr "¦¹Äæ¦ì¬O¥²»Ýnªº."
+
+#: display.php:68
+msgid "This page does not have a history"
+msgstr "¦¹¶±µL¾ú¥v¸ê®Æ"
+
+#: lib/Page/MergeOrRename.php:95
+#, php-format
+msgid "This page is referenced from %d other page(s)."
+msgstr "ì©l¦WºÙ¥X²{¦b¤U¦C %d Ó¶±¤¤,¥ç¤@¨Ö§ó§ï¬°·sªº¦WºÙ."
+
+#: templates/menu.inc:5 lib/Page/TitleSearch.php:116
+#: lib/Block/TitleSearch.php:3 lib/Block/TitleSearch.php:25
+#: config/prefs.php.dist:23
+msgid "TitleSearch"
+msgstr "¼ÐÃD·j´M"
+
+#: config/prefs.php.dist:25
+msgid "Type of search for the quick search box:"
+msgstr "§Ö³t·j´MªºÃþ«¬:"
+
+#: templates/display/standard.inc:32
+msgid "Un_lock"
+msgstr "¸Ñ°£Âê©w_l"
+
+#: lib/Page/StandardPage.php:74
+#, php-format
+msgid "Unable to create %s"
+msgstr "µLªk«Ø¥ß %s"
+
+#: lib/Page/StandardPage.php:82
+msgid "Unable to create WikiHome. The wiki is not configured."
+msgstr "µLªk«Ø¥ß WikiHome. wiki ©|¥¼³]©w."
+
+#: templates/display/standard.inc:31
+#, php-format
+msgid "Unlock %s"
+msgstr "¸Ñ°£Âê©w %s"
+
+#: lib/Driver.php:80 lib/Driver.php:94 lib/Driver.php:106 lib/Driver.php:111
+#: lib/Driver.php:131 lib/Driver.php:136 lib/Driver.php:194 lib/Driver.php:199
+#: lib/Driver.php:204 lib/Driver.php:218 lib/Driver.php:232 lib/Driver.php:246
+#: lib/Driver.php:251 lib/Driver.php:256 lib/Driver.php:274 lib/Driver.php:394
+#: lib/Driver.php:420 lib/Driver.php:436 lib/Page.php:259 lib/Page.php:293
+#: lib/Page.php:298 lib/Page.php:397 lib/Page.php:407 lib/Page.php:417
+#: lib/Page.php:427 lib/Page.php:437 lib/Page.php:448 lib/Page.php:557
+#: lib/Page.php:568 lib/Page.php:573 lib/Page.php:578 lib/Page.php:583
+#: lib/Page.php:623
+msgid "Unsupported"
+msgstr "¥¼³Q¤ä´©"
+
+#: templates/display/AttachedFiles.html:154
+msgid "Update File"
+msgstr "ÅܧóÀÉ®×"
+
+#: templates/display/AttachedFiles.html:104
+msgid "Update an Attachment"
+msgstr "Åܧó¤@Óªþ¥ó"
+
+#: lib/Page/AttachedFiles.php:267
+#, php-format
+msgid "Updated attachment \"%s\" on page \"%s\"."
+msgstr "¶± \"%2$s\" ¤¤ªºªþ¥[ÀÉ®× \"%1$s\" ¤w§ó·s."
+
+#: scripts/wicked.php:156
+#, php-format
+msgid "Usage: %s [OPTIONS]..."
+msgstr "»yªk: %s [¿ï¶µ]..."
+
+#: templates/pagelist/header.inc:4 templates/pagelist/pagesearch.inc:15
+#: templates/pagelist/titlesearch.inc:15 templates/history/header.inc:13
+#: templates/edit/create.inc:18 templates/display/AttachedFiles.html:9
+msgid "Version"
+msgstr "ª©¥»"
+
+#: lib/Page/AttachedFiles.php:274
+msgid "View page: "
+msgstr "À˵ø¶±: "
+
+#: lib/Block/page.php:3
+msgid "Wiki page"
+msgstr "Wiki ¶±"
+
+#: display.php:32
+msgid "You are not allowed to lock this page"
+msgstr "§A¨S¦³¦¹¶±ªºÂê©wÅv."
+
+#: display.php:47
+msgid "You are not allowed to unlock this page"
+msgstr "§A¨S¦³¦¹¶±ªº¸Ñ°£Âê©wÅv."
+
+#: lib/Page/AttachedFiles.php:183
+msgid "You do not have permission to delete attachments from this page."
+msgstr "§A¨S¦³§R°£¦¹¶±¤¤ªþ¥[ÀɮתºÅv."
+
+#: lib/Page/AttachedFiles.php:213 lib/Page/MergeOrRename.php:164
+#: lib/Page/MergeOrRename.php:179
+#, php-format
+msgid "You do not have permission to edit \"%s\""
+msgstr "§A¨S¦³½s¿è \"%s\" ªºÅv."
+
+#: lib/Page/NewPage.php:114
+#, php-format
+msgid "You don't have permission to create \"%s\"."
+msgstr "§A¨S¦³«Ø¥ß \"%s\" ªºÅv."
+
+#: lib/Page/DeletePage.php:145
+#, php-format
+msgid "You don't have permission to delete \"%s\"."
+msgstr "§A¨S¦³§R°£ \"%s\" ªºÅv."
+
+#: lib/Page/EditPage.php:102 lib/Page/RevertPage.php:127
+#, php-format
+msgid "You don't have permission to edit \"%s\"."
+msgstr "§A¨S¦³½s¿è \"%s\" ªºÅv."
+
+#: display.php:80 display.php:83
+msgid "You don't have permission to view this page."
+msgstr "§A¨S¦³À˵ø¦¹ª«¥óªºÅv."
+
+#: lib/Page/AttachedFiles.php:219
+msgid "You must enter a change description to attach this file."
+msgstr "§A¥²¶·¿é¤J¤@ÓÅܧó´yz¥HÀx¦sªþ¥[ÀÉ®×."
+
+#: lib/Page/EditPage.php:113
+msgid "You must provide a change log."
+msgstr "§A¥²¶·¿é¤J¤@ÓÅܧó´yz."
+
+#: lib/Wicked.php:132
+msgid "_AllPages"
+msgstr "©Ò¦³¶±_A"
+
+#: templates/display/standard.inc:60
+msgid "_BackLinks"
+msgstr "°f¦V³sµ²_B"
+
+#: templates/display/standard.inc:48
+msgid "_Delete"
+msgstr "§R°£_D"
+
+#: templates/display/standard.inc:24
+msgid "_EditPage"
+msgstr "½s¿è¶±_E"
+
+#: templates/display/standard.inc:36
+msgid "_Lock"
+msgstr "吩w_L"
+
+#: templates/display/standard.inc:55
+msgid "_MergeOrRename"
+msgstr "¦X¨Ö©Î§ó¦W_M"
+
+#: lib/Wicked.php:132
+msgid "_PageSearch"
+msgstr "¶±·j´M_P"
+
+#: lib/Wicked.php:131
+msgid "_RecentChanges"
+msgstr "³ÌªñªºÅܧó_R"
+
+#: lib/Wicked.php:132
+msgid "_TitleSearch"
+msgstr "¼ÐÃD·j´M_T"
+
+#: lib/Wicked.php:131
+msgid "_WikiHome"
+msgstr "Wiki º¶_W"
+
+#: scripts/wicked.php:123
+#, php-format
+msgid "page \"%s\" doesn't exist."
+msgstr "¶± \"%s\" ¤£¦s¦b."
--- /dev/null
+<?php
+/**
+ * $Horde: wicked/preview.php,v 1.12 2009/07/14 00:25:37 mrubinsk Exp $
+ *
+ * Copyright 2004-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ */
+
+@define('WICKED_BASE', dirname(__FILE__));
+require_once WICKED_BASE . '/lib/base.php';
+
+if (!($text = Horde_Util::getFormData('page_text'))) {
+ exit;
+}
+
+$page = new Page();
+$wiki = &$page->getProcessor();
+$text = $wiki->transform($text);
+
+$title = sprintf(_("Edit %s"), Horde_Util::getFormData('age'));
+require WICKED_TEMPLATES . '/common-header.inc';
+require WICKED_TEMPLATES . '/menu.inc';
+require WICKED_TEMPLATES . '/edit/preview.inc';
+require $registry->get('templates', 'horde') . '/common-footer.inc';
--- /dev/null
+Deny from all
--- /dev/null
++ Creating New Pages
+You don't have to specifically create nodes. You can just type away and make up a new node name (a string with an initial capital letter, some lower case letters and at least one other capital letter). When you view the page again it will be a link. The first time you click on that link, the wiki will automatically create the page and you can edit it.
+
+See WickedTextFormat for information on how to format pages in this wiki.
--- /dev/null
+Browsing the wiki is just like browsing the web. You can edit any page by clicking on the edit button on any page.
+
+AddingPages - How to create new pages in Wicked.
+WickedTextFormat - How to format Wicked pages.
+SandBox - A page you can experiment on.
+
+
--- /dev/null
+: Set one key at a time : {{void **setFormatConf** (string //format name//,
+string //rule name//, string //conf key//, mixed //conf value//)}}
+
+: Set all keys at once : {{void **setFormatConf** (string //format name//,
+string //rule name//, array //conf key-value pairs//)}}
+
+Set the configuration for a rule renderer. For example, to tell the "Table"
+rule in "Xhtml" format what CSS class to use for data cells...
+
+<code type="php">
+$wiki =& new Text_Wiki();
+$wiki->setRenderConf('Xhtml', 'Table', 'css_td', 'my_td_class');
+</code>
+
+To set all of the "Table" configuration keys for "Xhtml" at the same time...
+
+<code type="php">
+$wiki =& new Text_Wiki();
+
+$conf = array(
+ 'css_table' => 'my_table_class',
+ 'css_tr' => 'my_tr_class',
+ 'css_td' => 'my_td_class'
+);
+
+$wiki->setRenderConf('Xhtml', 'Table', $conf);
+</code>
+
+> **Note:** Render rule conf keys may be different from format to format.
--- /dev/null
+[[toc]]
+
+++ About This Rule
+
+|| **Name** || interwiki ||
+|| **Type** || inline ||
+|| **Syntax** normal || {{``SiteName:PageName``}} ||
+|| **Syntax** described || {{[``SiteName:PageName`` Show this text instead]}}
+|| **||
+
+++ Parse Configuration Keys
+
+None.
+
+++ Render Configuration Keys
+
+|| **Format** || **Key** || **Type** || **Description** ||
+|| {{Xhtml}} || {{sites}} || array || An array of key-value pairs where the
+|| key is the text of the interwiki site name and the value is the URL for
+|| that site ||
+|| {{Xhtml}} || {{target}} || string || The HREF target for interwiki links;
+|| e.g., '_blank' ||
+
+
+++ Description
+
+Interwiki is a way of representing wiki pages on other wikis. To mark an
+interwiki link, type the name of the site, a colon, then the name of the page
+on the interwiki site.
+
+Text_Wiki needs to know the URL for the various interwiki sites so it make
+clickable links; to tell Text_Wiki the site names and urls, use the
+{{[MethodSetRenderConf setRenderConf()]}} method. The array key should be the
+name of the site, and the array value should be the URL part leading up to the
+page-value.
+
+<code type="php">
+// [snip] create a Text_Wiki object called $wiki
+
+// set up an array of interwiki site names and urls
+$sites = array(
+ 'MeatBall' => 'http://www.usemod.com/cgi-bin/mb.pl?%s',
+ 'Advogato' => 'http://advogato.org/%s',
+ 'Wiki' => 'http://c2.com/cgi/wiki?%s'
+);
+
+// configure the interwiki rule
+$wiki->setRenderConf('xhtml', 'interwiki', 'sites', $sites);
+</code>
+
+> **Note:** Note the use of %s in the above URL strings; the %s will be
+ replaced by the page name. If you specify a string that does not have a
+ %s in it, Text_Wiki will assume that the page name should go at the very
+ end of the string.
--- /dev/null
+[[toc]]
+
+++ About This Rule
+
+|| **Name** || wikilink ||
+|| **Type** || inline ||
+|| **Syntax** normal || {{``AnyPageName``}} ||
+|| **Syntax** described || {{``[AnyPageName displayed link text]``}} ||
+
+++ Parse Configuration Keys
+
+None.
+
+++ Render Configuration Keys
+
+|| **Format** || **Key** || **Type** || **Description** ||
+|| {{Xhtml}} || {{pages}} || array || A sequential array of page names that
+|| exist in the wiki ||
+|| {{Xhtml}} || {{view_url}} || string || The base URL to view pages in the
+|| wiki ||
+|| {{Xhtml}} || {{new_url}} || string || The base URL to create new pages in
+|| the wiki ||
+|| {{Xhtml}} || {{new_text}} || string || The text displayed after
+|| non-existent page names ||
+
+++ Description
+
+As you should know by now, page names in wikis are made of
+!WordsSmashedTogether in !StudlyCapsMode. The wikilink rule looks for
+!WikiPages and creates links out of them. This requires some moderate
+configuration to customize it for your environment.
+
+In Text_Wiki, wiki words are allowed to have numbers in them; each digit 0-9
+is treated as a lower-case character for purposes of parsing words.
+
+The rule needs to know what pages exist in the wiki, so that when it finds a
+page name in the source text, it can show the proper link (either to view an
+existing page, or create a page that has been named but does not yet exist).
+To tell Text_Wiki what wiki pages exist, use the 'pages' key in
+{{[MethodSetRenderConf setRenderConf()]}}.
+
+<code type="php">
+// [snip] create a Text_Wiki object called $wiki
+
+// get the list of pages in the wiki
+$pages = array(
+ 'HomePage',
+ 'WordsSmashedTogether',
+ 'SomeOtherPages'
+);
+
+$wiki->setRenderConf('xhtml', 'wikilink', 'pages', $pages);
+</code>
+
+Now Text_Wiki needs to know where to link pages to. There are two
+configuration keys for this, 'view_url' and 'new_url'. If the parser finds a
+page name that exists in the 'pages' array, it will use 'view_url'; if the
+page is not in the 'pages' array, it will use 'new_url'.
+
+<code type="php">
+$wiki->setRenderConf('xhtml', 'wikilink', 'view_url',
+ 'http://example.php/view.php?page=%s');
+
+$wiki->setRenderConf('xhtml', 'wikilink', 'new_url',
+ 'http://example.php/new.php?page=%s');
+</code>
+
+> **Note:** Note the use of %s in the above URL strings; the %s will be
+ replaced by the page name. If you specify a string that does not have a
+ %s in it, Text_Wiki will assume that the page name should go at the very
+ end of the string.
+
+Finally, if the page exists, Text_Wiki will make the page name itself a link.
+If the page does not exist, Text_Wiki will add some text after the page name
+and make that clickable instead (leading to the 'new_url'). Normally the
+'new_text' is just a question mark, but you can place any literal text you
+like.
+
+<code type="php">
+// make the new_text a tilde
+$wiki->setRenderConf('xhtml', 'wikilink', 'new_text', '~');
+
+// make the new_text an image tag
+$wiki->setRenderConf('xhtml', 'wikilink', 'new_text',
+ '<img src="new_page.jpg" />');
+</code>
--- /dev/null
+This is the sandbox. You can try out Wiki in here, and no one will care - but don't be rude and delete this explanatory text. **Stay below the first horizontal rule.**
+
+For reference, you might want to visit HowToUseWiki, WickedTextFormat or AddingPages.
+
+----
+
--- /dev/null
+Generic target page. You SmashWordsTogether to indicate a wiki page name.
\ No newline at end of file
--- /dev/null
++ Sample Page for Text_Wiki Default Markup
+
+[[toc]]
+
+----
+
+++ General Notes
+
+The markup described on this page is for the default {{Text_Wiki}} rules; \
+it is a combination of the [http://tavi.sourceforge.net WikkTikkiTavi] \
+and [http://develnet.org/ coWiki] markup styles.
+
+All text is entered as plain text, and will be converted to HTML entities as \
+necessary. This means that {{<}}, {{>}}, {{&}}, and so on are converted for \
+you (except in special situations where the characters are Wiki markup; \
+Text_Wiki is generally smart enough to know when to convert and when not to).
+
+Just hit "return" twice to make a paragraph break. If you want \
+to keep the same logical line but have to split it across \
+two physical lines (such as when your editor only shows a certain number \
+of characters per line), end the line with a backslash {{\}} and hit \
+return once. This will cause the two lines to be joined on display, and the \
+backslash will not show. (If you end a line with a backslash and a tab \
+or space, it will ''not'' be joined with the next line, and the backslash \
+will be printed.)
+
+
+----
+
+++ Inline Formatting
+
+|| {{``//emphasis text//``}} || //emphasis text// ||
+|| {{``**strong text**``}} || **strong text** ||
+|| {{``//**emphasis and strong**//``}} || //**emphasis and strong**// ||
+|| {{``{{teletype text}}``}} || {{teletype text}} ||
+|| {{``@@--- delete text +++ insert text @@``}} || @@--- delete text +++ insert text @@ ||
+|| {{``@@--- delete only @@``}} || @@--- delete only @@ ||
+|| {{``@@+++ insert only @@``}} || @@+++ insert only @@ ||
+|| {{``##red|red text## ``}} || ##red|red text## ||
+|| {{``##FFFF00|yellow text##``}} || ##FFFF00|yellow text## ||
+
+
+----
+
+++ Literal Text
+
+If you don't want Text_Wiki to parse some text, enclose it in two backticks (not single-quotes).
+
+<code>
+
+This //text// gets **parsed**.
+
+``This //text// does not get **parsed**.``
+
+</code>
+
+This //text// gets **parsed**.
+
+``This //text// does not get **parsed**.``
+
+----
+
+++ Headings
+
+You can make various levels of heading by putting \
+equals-signs before and after the text (all on its \
+own line):
+
+<code>
++++ Level 3 Heading
+++++ Level 4 Heading
++++++ Level 5 Heading
+++++++ Level 6 Heading
+</code>
+
++++ Level 3 Heading
+++++ Level 4 Heading
++++++ Level 5 Heading
+++++++ Level 6 Heading
+
+----
+
+++ Table of Contents
+
+To create a list of every heading, with a link to that heading, put a table of contents tag on its own line.
+
+<code>
+[[toc]]
+</code>
+
+----
+
+++ Horizontal Rules
+
+Use four dashes ({{``----``}}) to create a horizontal rule.
+
+----
+
+++ Lists
+
++++ Bullet Lists
+
+You can create bullet lists by starting a paragraph with one or \
+more asterisks.
+
+<code>
+* Bullet one
+ * Sub-bullet
+</code>
+
+* Bullet one
+ * Sub-bullet
+
++++ Numbered Lists
+
+Similarly, you can create numbered lists by starting a paragraph \
+with one or more hashes.
+
+<code>
+# Numero uno
+# Number two
+ # Sub-item
+</code>
+
+# Numero uno
+# Number two
+ # Sub-item
+
+
++++ Mixing Bullet and Number List Items
+
+You can mix and match bullet and number lists:
+
+<code>
+# Number one
+ * Bullet
+ * Bullet
+# Number two
+ * Bullet
+ * Bullet
+ * Sub-bullet
+ # Sub-sub-number
+ # Sub-sub-number
+# Number three
+ * Bullet
+ * Bullet
+</code>
+
+# Number one
+ * Bullet
+ * Bullet
+# Number two
+ * Bullet
+ * Bullet
+ * Sub-bullet
+ # Sub-sub-number
+ # Sub-sub-number
+# Number three
+ * Bullet
+ * Bullet
+
+
+
++++ Definition Lists
+
+You can create a definition (description) list with the following syntax:
+
+<code>
+: Item 1 : Something
+: Item 2 : Something else
+</code>
+
+: Item 1 : Something
+: Item 2 : Something else
+
+----
+
+++ Block Quotes
+
+You can mark a blockquote by starting a line with one or more '>' \
+characters, followed by a space and the text to be quoted.
+
+<code>
+This is normal text here.
+
+> Indent me! The quick brown fox jumps over the lazy dog. \
+Now this the time for all good men to come to the aid of \
+their country. Notice how we can continue the block-quote \
+in the same "paragraph" by using a backslash at the end of \
+the line.
+>
+> Another block, leading to...
+>> Second level of indenting. This second is indented even \
+more than the previous one.
+
+Back to normal text.
+</code>
+
+This is normal text here.
+
+> Indent me! The quick brown fox jumps over the lazy dog. \
+Now this the time for all good men to come to the aid of \
+their country. Notice how we can continue the block-quote \
+in the same "paragraph" by using a backslash at the end of \
+the line.
+>
+> Another block, leading to...
+>> Second level of indenting. This second is indented even \
+more than the previous one.
+
+Back to normal text.
+
+
+----
+
+++ Links and Images
+
++++ Wiki Links
+
+SmashWordsTogether to create a page link.
+
+You can force a WikiPage name '''not''' to be clickable by putting \
+an exclamation mark in front of it.
+
+<code>
+WikiPage !WikiPage
+</code>
+
+WikiPage !WikiPage
+
+You can create a "described" or "labeled" link to a wiki page by putting the page name in brackets, followed by some text.
+
+<code>
+[WikiPage Descriptive text for the link.]
+</code>
+
+[WikiPage Descriptive text for the link.]
+
+> **Note:** existing wiki pages must be in the [RuleWikilink wikilink] {{pages}} configuration, and the [RuleWikilink wikilink] {{view_url}} configuration value must be set for the linking to work.
+
++++ Interwiki Links
+
+Interwiki links are links to pages on other Wiki sites. \
+Type the {{``SiteName:PageName``}} like this:
+
+* MeatBall:RecentChanges
+* Advogato:proj/WikkiTikkiTavi
+* Wiki:WorseIsBetter
+
+> **Note:** the interwiki site must be in the [RuleInterwiki interwiki] {{sites}} configuration array.
+
++++ URLs
+
+Create a remote link simply by typing its URL: http://ciaweb.net.
+
+If you like, enclose it in brackets to create a numbered reference \
+and avoid cluttering the page; {{``[http://ciaweb.net/free/]``}} becomes [http://ciaweb.net/free/].
+
+Or you can have a described-reference instead of a numbered reference:
+<code>
+[http://pear.php.net PEAR]
+</code>
+[http://pear.php.net PEAR]
+
++++ On-Page Links
+
+Create and anchor on the page by {{``[[# anchorName nice anchor text]]``}} [[# anchorName nice anchor text]] and refer to it by {{``#anchorName``}} #anchorName, or {{``[#anchorName use normal link renaming]``}} [#anchorName use normal link renaming].
+
++++ Images
+
+You can put a picture in a page with {{``[[image foo.jpg]]``}}. You can use any file type, but most browsers only support GIF, JPEG, and PNG formats. The filename can either be a relative reference (in which case the wiki looks for a file attached to the current page - or a different wiki page if the file name is prefixed with a page name, e.g. {{``[[image WikiHome:foo.jpg]]``}}), an absolute reference which begins with a slash (in which case the wiki uses it to retrieve a file relative to the web server's root), or a full, external URL.
+
+Additonal attributes, such as "alt" can follow the image filename or URL like so: {{``[[image foo.jpg alt="A Foo JPEG"]]``}}. "link" is a special attribute which makes the image a link to the specified URL.
+
+----
+
+++ Code Blocks
+
+Create code blocks by using {{<code>...</code>}} tags (each on its own line).
+
+<code>
+This is an example code block!
+</code>
+
+
+To create PHP blocks that get automatically colorized when you use PHP tags, simply surround the code with {{<code type="php">...</code>}} tags (the tags themselves should each be on their own lines, and no need for the {{<?php ... ?>}} tags).
+
+<code>
+ <code type="php">
+ // Set up the wiki options
+ $options = array();
+ $options['view_url'] = "index.php?page=";
+
+ // load the text for the requested page
+ $text = implode('', file($page . '.wiki.txt'));
+
+ // create a Wiki objext with the loaded options
+ $wiki = new Text_Wiki($options);
+
+ // transform the wiki text.
+ echo $wiki->transform($text);
+ </code>
+</code>
+
+<code type="php">
+// Set up the wiki options
+$options = array();
+$options['view_url'] = "index.php?page=";
+
+// load the text for the requested page
+$text = implode('', file($page . '.wiki.txt'));
+
+// create a Wiki objext with the loaded options
+$wiki = new Text_Wiki($options);
+
+// transform the wiki text.
+echo $wiki->transform($text);
+</code>
+
+----
+
+++ Tables
+
+You can create tables using pairs of vertical bars:
+
+<code>
+||~ Heading one ||~ Heading two ||
+|| cell one || cell two ||
+|||| big ol' line ||
+|| cell four || cell five ||
+|| cell six || here's a very long cell ||
+</code>
+
+||~ Heading one ||~ Heading two ||
+|| cell one || cell two ||
+|||| big ol' line ||
+|| cell four || cell five ||
+|| cell six || here's a very long cell ||
+
+<code>
+|| lines must start and end || with double vertical bars || nothing ||
+|| cells are separated by || double vertical bars || nothing ||
+|||| you can span multiple columns by || starting each cell ||
+|| with extra cell |||| separators ||
+|||||| but perhaps an example is the easiest way to see ||
+</code>
+
+|| lines must start and end || with double vertical bars || nothing ||
+|| cells are separated by || double vertical bars || nothing ||
+|||| you can span multiple columns by || starting each cell ||
+|| with extra cell |||| separators ||
+|||||| but perhaps an example is the easiest way to see ||
--- /dev/null
+A WikiWikiWeb is a site where everyone can collaborate on the content. The most well-known and widely used Wiki is the Portland Pattern Repository at http://c2.com/cgi-bin/wiki?WikiWikiWeb.
+
+You and I will find these statements there particularly relevant:
+
+''The point is to make the EditPage form simple and the ((Search)) search fast.''
+
+''In addition to being quick, this site also aspires to Zen ideals generally labeled WabiSabi. Zen finds beauty in the imperfect and ephemeral. When it comes down to it, that's all you need.''
+
+''The Universe tends toward chaos. The Universe tends toward Wiki.''
+
+You can say hello on RecentVisitors, or read about HowToUseWiki and AddingPages. Currently this Wiki has no theme for discussion, so go ahead and play with it and have fun!
--- /dev/null
+Generic target page (for example usage).
\ No newline at end of file
--- /dev/null
+#!/usr/bin/php
+<?php
+/*
+ * $Horde: wicked/scripts/mail-filter.php,v 1.13 2009/06/10 19:58:06 slusarz Exp $
+ *
+ * This script accepts a MIME message on standard input and creates a new
+ * wiki page from it. It can also append the e-mail to the end of another
+ * page.
+ */
+
+@define('AUTH_HANDLER', true);
+@define('HORDE_BASE', dirname(__FILE__) . '/../..');
+
+// Do CLI checks and environment setup first.
+require_once HORDE_BASE . '/lib/core.php';
+
+$keepHeaders = array('From', 'To', 'Subject', 'Cc', 'Date');
+$dateFormat = "F j, Y";
+
+// Make sure no one runs this from the web.
+if (!Horde_Cli::runningFromCLI()) {
+ exit("Must be run from the command line\n");
+}
+
+// Load the CLI environment - make sure there's no time limit, init
+// some variables, etc.
+Horde_Cli::init();
+$cli = Horde_Cli::singleton();
+
+@define('WICKED_BASE', HORDE_BASE . '/wicked');
+require_once WICKED_BASE . '/lib/base.php';
+
+$text = '';
+while (!feof(STDIN)) {
+ $text .= fgets(STDIN, 512);
+}
+
+$message = Horde_Mime_Part::parseMessage($text);
+if (is_a($message, 'PEAR_Error')) {
+ $cli->fatal(sprintf(_("Error parsing MIME message: %s\n"),
+ $message->getMessage()));
+}
+
+if (preg_match("/^(.*?)\r?\n\r?\n/s", $text, $matches)) {
+ $hdrText = $matches[1];
+} else {
+ $hdrText = $text;
+}
+$headers = Horde_Mime_Headers::parseHeaders($hdrText);
+
+// Format the message into a pageBody.
+$pageBody = "";
+foreach ($headers as $name => $vals) {
+ foreach ($keepHeaders as $kh) {
+ if (!strcasecmp($kh, $name)) {
+ if (is_array($vals)) {
+ foreach ($vals as $val) {
+ $pageBody .= "'''" . $name . ":''' " . $val . " _\n";
+ }
+ } else {
+ $pageBody .= "'''" . $name . ":''' " . $vals . " _\n";
+ }
+ }
+ }
+}
+$pageBody .= "\n\n";
+
+// Create a new name for the page.
+$pageName = headerValue($headers, 'Subject');
+if (empty($pageName)) {
+ $pageName = 'no subject';
+}
+$pageName .= " -- ";
+
+$msgFrom = headerValue($headers, 'From');
+if (preg_match('/^\s*"?(.*?)"?\s*<.*>/', $msgFrom, $matches)) {
+ $msgFrom = $matches[1];
+} elseif (preg_match('/<(.*)>/', $msgFrom, $matches)) {
+ $msgFrom = $matches[1];
+}
+if (!empty($msgFrom)) {
+ $pageName .= $msgFrom . " ";
+}
+
+$msgDate = headerValue($headers, 'Date');
+if (empty($msgDate)) {
+ $time = time();
+} else {
+ $time = strtotime($msgDate);
+}
+$pageName .= date($dateFormat, $time);
+
+// We could have two messages with the same name, so append a number.
+if ($wicked->pageExists($pageName)) {
+ $counter = 2;
+ while ($wicked->pageExists($pageName . " (" . $counter . ")")) {
+ $counter++;
+ }
+ $pageName .= " (" . $counter . ")";
+}
+
+// Look for a text part.
+// FIXME: this is _extremely_ crude.
+if ($message->getType() == 'text/plain') {
+ $pageBody .= $message->getContents();
+} elseif ($message->getType() == 'multipart/alternative') {
+ foreach ($message->getParts() as $part) {
+ if ($part->getType() == 'text/plain') {
+ $pageBody .= $part->getContents();
+ break;
+ }
+ }
+} else {
+ $pageBody .= "[ Could not render body of message. ]";
+}
+
+$pageBody .= "\n";
+
+if (is_null($pageName)) {
+ $pageName = "EmailMessage" . ucfirst(md5(uniqid('wicked', true)));
+}
+
+$res = $wicked->newPage($pageName, $pageBody);
+if (is_a($res, 'PEAR_Error')) {
+ $cli->fatal(sprintf(_("Error creating new page: %s"), $res->getMessage()));
+}
+
+exit(0);
+
+function headerValue($headers, $name)
+{
+ $val = null;
+ foreach ($headers as $headerName => $headerVal) {
+ if (!strcasecmp($name, $headerName)) {
+ if (is_array($headerVal)) {
+ $thisVal = join(', ', $headerVal);
+ } else {
+ $thisVal = $headerVal;
+ }
+ if (is_null($val)) {
+ $val = $thisVal;
+ } else {
+ $val .= ", " . $thisVal;
+ }
+ }
+ }
+ return $val;
+}
--- /dev/null
+-- $Horde: wicked/scripts/sql/wicked.mssql.sql,v 1.4 2009/10/19 10:55:34 jan Exp $
+
+CREATE TABLE wicked_pages (
+ page_id INT NOT NULL,
+ page_name VARCHAR(100) NOT NULL,
+ page_text VARCHAR(MAX),
+ page_hits INT DEFAULT 0,
+ page_majorversion SMALLINT NOT NULL,
+ page_minorversion INT NOT NULL,
+ version_created INT NOT NULL,
+ change_author VARCHAR(255),
+ change_log VARCHAR(MAX),
+--
+ PRIMARY KEY (page_id),
+ UNIQUE (page_name)
+);
+
+CREATE TABLE wicked_history (
+ page_id INT NOT NULL,
+ page_name VARCHAR(100) NOT NULL,
+ page_text VARCHAR(MAX),
+ page_majorversion SMALLINT NOT NULL,
+ page_minorversion INT NOT NULL,
+ version_created INT NOT NULL,
+ change_author VARCHAR(255),
+ change_log VARCHAR(MAX),
+--
+ PRIMARY KEY (page_id, page_majorversion, page_minorversion)
+);
+
+CREATE INDEX wicked_history_name_idx ON wicked_history (page_name);
+CREATE INDEX wicked_history_version_idx ON wicked_history (page_majorversion, page_minorversion);
+
+CREATE TABLE wicked_attachments (
+ page_id INT NOT NULL,
+ attachment_name VARCHAR(100) NOT NULL,
+ attachment_hits INT DEFAULT 0,
+ attachment_majorversion SMALLINT NOT NULL,
+ attachment_minorversion INT NOT NULL,
+ attachment_created INT NOT NULL,
+ change_author VARCHAR(255),
+ change_log VARCHAR(MAX),
+--
+ PRIMARY KEY (page_id, attachment_name)
+);
+
+CREATE TABLE wicked_attachment_history (
+ page_id INT NOT NULL,
+ attachment_name VARCHAR(100) NOT NULL,
+ attachment_majorversion SMALLINT NOT NULL,
+ attachment_minorversion INT NOT NULL,
+ attachment_created INT NOT NULL,
+ change_author VARCHAR(255),
+ change_log VARCHAR(MAX),
+--
+ PRIMARY KEY (page_id, attachment_name, attachment_majorversion,
+ attachment_minorversion)
+);
+
+CREATE INDEX wicked_attachment_history_name_idx ON wicked_attachment_history (page_id, attachment_name);
+CREATE INDEX wicked_attachment_history_version_idx ON wicked_attachment_history (attachment_majorversion, attachment_minorversion);
--- /dev/null
+-- $Horde: wicked/scripts/sql/wicked.oci8.sql,v 1.3 2009/10/19 11:18:27 jan Exp $
+
+CREATE TABLE wicked_pages (
+ page_id NUMBER(16) NOT NULL,
+ page_name VARCHAR2(100) NOT NULL,
+ page_text CLOB,
+ page_hits NUMBER(16) DEFAULT 0,
+ page_majorversion NUMBER(8) NOT NULL,
+ page_minorversion NUMBER(16) NOT NULL,
+ version_created NUMBER(16) NOT NULL,
+ change_author VARCHAR2(255),
+ change_log CLOB,
+--
+ PRIMARY KEY (page_id),
+ UNIQUE (page_name)
+);
+
+CREATE TABLE wicked_history (
+ page_id NUMBER(16) NOT NULL,
+ page_name VARCHAR2(100) NOT NULL,
+ page_text CLOB,
+ page_majorversion NUMBER(8) NOT NULL,
+ page_minorversion NUMBER(16) NOT NULL,
+ version_created NUMBER(16) NOT NULL,
+ change_author VARCHAR2(255),
+ change_log CLOB,
+--
+ PRIMARY KEY (page_id, page_majorversion, page_minorversion)
+);
+
+CREATE INDEX wicked_history_name_idx ON wicked_history (page_name);
+CREATE INDEX wicked_history_version_idx ON wicked_history (page_majorversion, page_minorversion);
+
+CREATE TABLE wicked_attachments (
+ page_id NUMBER(16) NOT NULL,
+ attachment_name VARCHAR2(100) NOT NULL,
+ attachment_hits NUMBER(16) DEFAULT 0,
+ attachment_majorversion NUMBER(8) NOT NULL,
+ attachment_minorversion NUMBER(16) NOT NULL,
+ attachment_created NUMBER(16) NOT NULL,
+ change_author VARCHAR2(255),
+ change_log CLOB,
+--
+ PRIMARY KEY (page_id, attachment_name)
+);
+
+CREATE TABLE wicked_attachment_history (
+ page_id NUMBER(16) NOT NULL,
+ attachment_name VARCHAR2(100) NOT NULL,
+ attachment_majorversion NUMBER(8) NOT NULL,
+ attachment_minorversion NUMBER(16) NOT NULL,
+ attachment_created NUMBER(16) NOT NULL,
+ change_author VARCHAR2(255),
+ change_log CLOB,
+--
+ PRIMARY KEY (page_id, attachment_name, attachment_majorversion,
+ attachment_minorversion)
+);
+
+CREATE INDEX wicked_attach_hist_name_idx ON wicked_attachment_history (page_id, attachment_name);
+CREATE INDEX wicked_attach_hist_version_idx ON wicked_attachment_history (attachment_majorversion, attachment_minorversion);
--- /dev/null
+-- $Horde: wicked/scripts/sql/wicked.sql,v 1.8 2009/10/19 10:55:34 jan Exp $
+
+CREATE TABLE wicked_pages (
+ page_id INT NOT NULL,
+ page_name VARCHAR(100) NOT NULL,
+ page_text TEXT,
+ page_hits INT DEFAULT 0,
+ page_majorversion SMALLINT NOT NULL,
+ page_minorversion INT NOT NULL,
+ version_created INT NOT NULL,
+ change_author VARCHAR(255),
+ change_log TEXT,
+--
+ PRIMARY KEY (page_id),
+ UNIQUE (page_name)
+);
+
+CREATE TABLE wicked_history (
+ page_id INT NOT NULL,
+ page_name VARCHAR(100) NOT NULL,
+ page_text TEXT,
+ page_majorversion SMALLINT NOT NULL,
+ page_minorversion INT NOT NULL,
+ version_created INT NOT NULL,
+ change_author VARCHAR(255),
+ change_log TEXT,
+--
+ PRIMARY KEY (page_id, page_majorversion, page_minorversion)
+);
+
+CREATE INDEX wicked_history_name_idx ON wicked_history (page_name);
+CREATE INDEX wicked_history_version_idx ON wicked_history (page_majorversion, page_minorversion);
+
+CREATE TABLE wicked_attachments (
+ page_id INT NOT NULL,
+ attachment_name VARCHAR(100) NOT NULL,
+ attachment_hits INT DEFAULT 0,
+ attachment_majorversion SMALLINT NOT NULL,
+ attachment_minorversion INT NOT NULL,
+ attachment_created INT NOT NULL,
+ change_author VARCHAR(255),
+ change_log TEXT,
+--
+ PRIMARY KEY (page_id, attachment_name)
+);
+
+CREATE TABLE wicked_attachment_history (
+ page_id INT NOT NULL,
+ attachment_name VARCHAR(100) NOT NULL,
+ attachment_majorversion SMALLINT NOT NULL,
+ attachment_minorversion INT NOT NULL,
+ attachment_created INT NOT NULL,
+ change_author VARCHAR(255),
+ change_log TEXT,
+--
+ PRIMARY KEY (page_id, attachment_name, attachment_majorversion, attachment_minorversion)
+);
+
+CREATE INDEX wicked_attachment_history_name_idx ON wicked_attachment_history (page_id, attachment_name);
+CREATE INDEX wicked_attachment_history_version_idx ON wicked_attachment_history (attachment_majorversion, attachment_minorversion);
--- /dev/null
+ALTER TABLE wicked_pages DROP COLUMN page_locked;
--- /dev/null
+#!/usr/bin/php
+<?php
+/**
+ * This script converts the data in an SQL backend from any supported charset
+ * to UTF-8.
+ *
+ * $Horde: wicked/scripts/upgrades/convert_to_utf8.php,v 1.4 2009/06/10 19:58:06 slusarz Exp $
+ *
+ * Copyright 2008-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Jan Schneider <jan@horde.org>
+ */
+
+@define('AUTH_HANDLER', true);
+@define('HORDE_BASE', dirname(__FILE__) . '/../../..');
+
+// Do CLI checks and environment setup first.
+require_once HORDE_BASE . '/lib/core.php';
+
+// Make sure no one runs this from the web.
+if (!Horde_Cli::runningFromCLI()) {
+ exit("Must be run from the command line\n");
+}
+
+// Load the CLI environment - make sure there's no time limit, init some
+// variables, etc.
+$cli = &Horde_Cli::singleton();
+$cli->init();
+
+// Create driver instance.
+@define('WICKED_BASE', dirname(__FILE__) . '/../..');
+require_once WICKED_BASE . '/lib/base.php';
+if ($conf['storage']['driver'] != 'sql') {
+ exit("You must have an SQL backend configured.\n");
+}
+$db = &$wicked->_db;
+
+// Get current charset.
+$charset = $cli->prompt('Please specify the current charset of the data',
+ null, 'ISO-8859-1');
+
+// Read existing attachments.
+echo 'Converting attachments';
+$result = $db->query(
+ 'SELECT page_id, attachment_name, change_log FROM '
+ . $conf['storage']['params']['attachmenttable']);
+if (is_a($result, 'PEAR_Error')) {
+ $cli->fatal($result->toString());
+}
+$sth = $db->prepare(
+ 'UPDATE ' . $conf['storage']['params']['attachmenttable']
+ . ' SET attachment_name = ?, change_log = ?'
+ . ' WHERE page_id = ? AND attachment_name = ?');
+while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
+ $values = Horde_String::convertCharset(
+ array($row['attachment_name'], $row['change_log']),
+ $charset, 'UTF-8');
+ $values[] = $row['page_id'];
+ $values[] = $row['attachment_name'];
+ $executed = $db->execute($sth, $values);
+ if (is_a($executed, 'PEAR_Error')) {
+ $cli->fatal($executed->toString());
+ }
+ echo '.';
+}
+$result = $db->query(
+ 'SELECT page_id, attachment_name, change_log FROM '
+ . $conf['storage']['params']['attachmenthistorytable']);
+if (is_a($result, 'PEAR_Error')) {
+ $cli->fatal($result->toString());
+}
+$sth = $db->prepare(
+ 'UPDATE ' . $conf['storage']['params']['attachmenthistorytable']
+ . ' SET attachment_name = ?, change_log = ?'
+ . ' WHERE page_id = ? AND attachment_name = ?');
+while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
+ $values = Horde_String::convertCharset(
+ array($row['attachment_name'], $row['change_log']),
+ $charset, 'UTF-8');
+ $values[] = $row['page_id'];
+ $values[] = $row['attachment_name'];
+ $executed = $db->execute($sth, $values);
+ if (is_a($executed, 'PEAR_Error')) {
+ $cli->fatal($executed->toString());
+ }
+ echo '.';
+}
+$cli->writeln($cli->green('Done'));
+
+// Read existing history.
+$result = $db->query(
+ 'SELECT page_id, page_majorversion, page_minorversion, page_name, page_text, change_log FROM '
+ . $conf['storage']['params']['historytable']);
+if (is_a($result, 'PEAR_Error')) {
+ $cli->fatal($result->toString());
+}
+$sth = $db->prepare(
+ 'UPDATE ' . $conf['storage']['params']['historytable']
+ . ' SET page_name = ?, page_text = ?, change_log = ?'
+ . ' WHERE page_id = ? AND page_majorversion = ? AND page_minorversion = ?');
+echo 'Converting history';
+while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
+ $values = Horde_String::convertCharset(
+ array($row['page_name'], $row['page_text'], $row['change_log']),
+ $charset, 'UTF-8');
+ $values[] = $row['page_id'];
+ $values[] = $row['page_majorversion'];
+ $values[] = $row['page_minorversion'];
+ $executed = $db->execute($sth, $values);
+ if (is_a($executed, 'PEAR_Error')) {
+ $cli->fatal($executed->toString());
+ }
+ echo '.';
+}
+$cli->writeln($cli->green('Done'));
+
+// Read existing pages.
+$result = $db->query(
+ 'SELECT page_id, page_name, page_text, change_log FROM '
+ . $conf['storage']['params']['table']);
+if (is_a($result, 'PEAR_Error')) {
+ $cli->fatal($result->toString());
+}
+$sth = $db->prepare(
+ 'UPDATE ' . $conf['storage']['params']['table']
+ . ' SET page_name = ?, page_text = ?, change_log = ?'
+ . ' WHERE page_id = ?');
+echo 'Converting pages';
+while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
+ $values = Horde_String::convertCharset(
+ array($row['page_name'], $row['page_text'], $row['change_log']),
+ $charset, 'UTF-8');
+ $values[] = $row['page_id'];
+ $executed = $db->execute($sth, $values);
+ if (is_a($executed, 'PEAR_Error')) {
+ $cli->fatal($executed->toString());
+ }
+ echo '.';
+}
+$cli->writeln($cli->green('Done'));
--- /dev/null
+#!/usr/bin/php -q
+<?php
+/**
+* $Horde: wicked/scripts/wicked.php,v 1.9 2009/07/09 06:09:05 slusarz Exp $
+*
+* This script interfaces with Wicked via the command-line
+*
+* See the enclosed file COPYING for license information (GPL). If you
+* did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+*
+* @author Vijay Mahrra <vijay.mahrra@es.easynet.net>
+*/
+
+@define('AUTH_HANDLER', true);
+@define('HORDE_BASE', dirname(__FILE__) . '/../..');
+@define('WICKED_BASE', HORDE_BASE . '/wicked');
+
+// Do CLI checks and environment setup first.
+require_once WICKED_BASE . '/lib/base.php';
+
+// Make sure no one runs this from the web.
+if (!Horde_Cli::runningFromCLI()) {
+ exit("Must be run from the command line\n");
+}
+
+// Load the CLI environment.
+require_once 'Console/Getopt.php';
+Horde_Cli::init();
+$cli = &Horde_Cli::singleton();
+$registry = Horde_Registry::singleton();
+$registry->pushApp('wicked', false);
+$debug = false;
+$out = 'screen';
+
+// We accept the user name on the command-line.
+$ret = Console_Getopt::getopt(Console_Getopt::readPHPArgv(), 'hu::p::ldg::o::',
+ array('help', 'username==', 'password==', 'list-pages',
+ 'debug', 'get==', 'out=='));
+
+if (is_a($ret, 'PEAR_Error')) {
+ $error = _("Couldn't read command-line options.");
+ Horde::logMessage($error, __FILE__, __LINE__, PEAR_LOG_DEBUG);
+ $cli->fatal($error);
+}
+
+list($opts, $args) = $ret;
+
+// Show help and exit if no arguments were set.
+if (!count($opts)) {
+ showHelp();
+ exit;
+}
+
+foreach ($opts as $opt) {
+ list($optName, $optValue) = $opt;
+ switch ($optName) {
+ case 'd':
+ case '--debug':
+ $debug = true;
+ break;
+
+ case 'u':
+ case '--username':
+ $username = $optValue;
+ break;
+
+ case 'p':
+ case '--password':
+ $password = $optValue;
+ break;
+
+ case 'l':
+ case '--list-pages':
+ $listpages = true;
+ break;
+
+ case 'g':
+ case '--get':
+ $get = $optValue;
+ break;
+
+ case 'o':
+ case '--out':
+ $out = $optValue;
+ break;
+
+ default:
+ case 'h':
+ case '--help':
+ showHelp();
+ exit;
+ }
+}
+
+// Login to horde if username & password are set.
+if (!empty($username) && !empty($password)) {
+ $auth = Horde_Auth::singleton($conf['auth']['driver']);
+ if (!$auth->authenticate($username, array('password' => $password))) {
+ $error = _("Login is incorrect.");
+ Horde::logMessage($error, __FILE__, __LINE__, PEAR_LOG_ERR);
+ $cli->message($msg, 'cli.error');
+ } else {
+ $msg = sprintf(_("Logged in successfully as \"%s\"."), $username);
+ Horde::logMessage($msg, __FILE__, __LINE__, PEAR_LOG_DEBUG);
+ $cli->message($msg, 'cli.success');
+ }
+}
+
+// list page titles only
+if (!empty($listpages)) {
+ $pages = $wicked->getPages();
+ foreach ($pages as $page) {
+ $cli->writeln($page);
+ }
+ exit;
+}
+
+// retrieve a user-specified page or all of them
+if (!is_null($get)) {
+ $results = $wicked->getPage($get);
+ if (empty($results)) {
+ $error = sprintf(_("page \"%s\" doesn't exist."), $get);
+ $cli->message($error, 'cli.error');
+ exit;
+ }
+} elseif (is_null($get)) {
+ $results = $wicked->getAllPages();
+}
+
+// if we have a list of pages set, output them
+switch ($out) {
+default:
+case 'xml':
+ if (isset($results) && count($results) > 0) {
+ $cli->writeln("<wicked:wikipage>");
+ foreach ($results as $page) {
+ foreach ($page as $k => $v) {
+ $cli->writeln(sprintf("<wicked:%s>%s</wicked:%s>", $k, htmlentities($v), $k));
+ }
+ }
+ $cli->writeln("</wicked:wikipage>");
+ $cli->writeln();
+ }
+ break;
+}
+exit;
+
+/**
+ * Show the command line arguments that the script accepts.
+ */
+function showHelp()
+{
+ global $cli;
+
+ $cli->writeln(sprintf(_("Usage: %s [OPTIONS]..."), basename(__FILE__)));
+ $cli->writeln();
+ $cli->writeln(_("Mandatory arguments to long options are mandatory for short options too."));
+ $cli->writeln();
+ $cli->writeln(_("-h, --help Show this help"));
+ $cli->writeln(_("-d, --debug Run in debug mode (displays extra information)"));
+ $cli->writeln(_("-l, --list-pages List pages"));
+ $cli->writeln(_("-g, --get[=pagetitle] Return all pages (unless pagetitle specified)"));
+ $cli->writeln(_("-o, --out[=type] Output type for results (default:xml)"));
+ $cli->writeln(_("-u, --username[=username] Horde login username"));
+ $cli->writeln(_("-p, --password[=password] Horde login password"));
+ $cli->writeln();
+}
--- /dev/null
+<?php
+if (isset($language)) {
+ header('Content-type: text/html; charset=' . Horde_Nls::getCharset());
+ header('Vary: Accept-Language');
+}
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
+<!-- Wicked: Copyright 2003-2009 The Horde Project. Wicked is under a Horde license. -->
+<!-- Horde Project: http://www.horde.org/ | Wicked: http://www.horde.org/wicked/ -->
+<!-- Horde Licenses: http://www.horde.org/licenses/ -->
+<?php echo !empty($language) ? '<html lang="' . strtr($language, '_', '-') . '">' : '<html>' ?>
+<head>
+<?php
+
+$page_title = $registry->get('name');
+if (!empty($title)) $page_title .= ' :: ' . $title;
+if (!empty($refresh_time) && ($refresh_time > 0) && !empty($refresh_url)) {
+ echo "<meta http-equiv=\"refresh\" content=\"$refresh_time;url=$refresh_url\">\n";
+}
+
+Horde::includeScriptFiles();
+
+?>
+<title><?php echo htmlspecialchars($page_title) ?></title>
+<link href="<?php echo $GLOBALS['registry']->getImageDir()?>/favicon.ico" rel="SHORTCUT ICON" />
+<link href="<?php echo Horde::applicationUrl('opensearch.php', true, -1) ?>" rel="search" type="application/opensearchdescription+xml" title="<?php echo $registry->get('name') . ' (' . Horde::applicationUrl('', true) . ')' ?>" />
+<?php Horde::includeStylesheetFiles() ?>
+</head>
+
+<body<?php if ($bc = Horde_Util::nonInputVar('bodyClass')) echo ' class="' . $bc . '"' ?><?php if ($bi = Horde_Util::nonInputVar('bodyId')) echo ' id="' . $bi . '"'; ?>>
--- /dev/null
+<h1 class="header">
+ <?php printf(_("Diff for %s between %s and %s"), Horde::link($this->pageUrl()) . htmlspecialchars($this->pageName()) . '</a>', $version, htmlspecialchars($this->version())) ?>
+</h1>
+
+<div class="text headerbox" style="padding:5px">
+ <pre><?php echo $this->getDiff($version, 'inline') ?></pre>
+</div>
--- /dev/null
+<h1 class="header">
+ <tag:pageName />: <a href="<tag:referrerLink />"><tag:referrer /></a> <tag:refreshIcon />
+</h1>
+
+<table class="linedRow" style="width:100%" cellspacing="0">
+ <tr class="item">
+ <th align="left" width="25%"><gettext>Attachment Name</gettext></th>
+ <th align="left" width="1%"> </th>
+ <th align="left" width="4%"><gettext>Version</gettext></th>
+ <th align="left" width="10%"><gettext>Author</gettext></th>
+ <th align="left" width="20%"><gettext>Date</gettext></th>
+ <th align="left" width="35%"><gettext>Change Log</gettext></th>
+ <th align="left" width="5%" class="nowrap"><gettext>Downloads</gettext></th>
+ </tr>
+ <loop:attachments>
+ <tr>
+ <td><a href="<tag:attachments.url />"><tag:attachments.attachment_name /></a></td>
+ <td>
+ <if:attachments.delete_form>
+ <form method="post" action="<tag:formAction />">
+ <input type="hidden" name="cmd" value="delete" />
+ <input type="hidden" name="actionID" value="special" />
+ <input type="hidden" name="referrer" value="<tag:referrer />" />
+ <input type="hidden" name="filename" value="<tag:attachments.attachment_name />" />
+ <input type="hidden" name="version" value="<tag:attachments.attachment_majorversion />.<tag:attachments.attachment_minorversion />" />
+ <input type="image" class="img" src="<tag:deleteButton />" />
+ </form>
+ <else:attachments.delete_form>
+
+ </else:attachments.delete_form>
+ </if:attachments.delete_form>
+ </td>
+ <td><tag:attachments.attachment_majorversion />.<tag:attachments.attachment_minorversion /></td>
+ <td><tag:attachments.change_author /></td>
+ <td><tag:attachments.date /></td>
+ <td><tag:attachments.change_log /></td>
+ <td><tag:attachments.attachment_hits /></td>
+ </tr>
+ </loop:attachments>
+</table>
+
+<if:canAttach>
+<form method="post" action="<tag:formAction />" enctype="multipart/form-data" name="AttachedFiles">
+<tag:formInput />
+<input type="hidden" name="page" value="AttachedFiles" />
+<input type="hidden" name="referrer" value="<tag:referrer />" />
+<input type="hidden" name="actionID" value="special" />
+<input type="hidden" name="is_update" value="0" />
+<br class="spacer" />
+
+<h1 class="header">
+ <gettext>Attach a New File</gettext>
+</h1>
+<table class="striped" style="width:100%" cellspacing="0">
+ <tr>
+ <td width="20%" align="right">
+ <span class="form-error"><tag:requiredMarker /></span>
+ <gettext>Select file to attach:</gettext>
+ </td>
+ <td width="80%">
+ <input type="file" size="30" name="attachment_file" />
+ </td>
+ </tr>
+ <tr>
+ <td width="20%" align="right">
+ <span class="form-error"></span>
+ <gettext>Enter a name for this file (if blank, will use the file's current name)</gettext>
+ </td>
+ <td width="80%">
+ <input type="text" size="30" name="filename" />
+ </td>
+ </tr>
+ <tr>
+ <td width="20%" align="right">
+ <span class="form-error">
+ <if:requireChangelog>
+ <tag:requiredMarker />
+ </if:requireChangelog>
+ </span>
+ <gettext>Change log entry</gettext>
+ </td>
+ <td width="80%">
+ <input type="text" size="50" name="change_log" />
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <input class="button" type="submit" name="submit" value="<gettext>Attach File</gettext>" />
+ </td>
+ </tr>
+</table>
+</form>
+</if:canAttach>
+
+<if:canUpdate>
+<br class="spacer" />
+<form method="post" action="<tag:formAction />" enctype="multipart/form-data" name="AttachedFiles">
+<tag:formInput />
+<input type="hidden" name="page" value="AttachedFiles" />
+<input type="hidden" name="referrer" value="<tag:referrer />" />
+<input type="hidden" name="actionID" value="special" />
+<input type="hidden" name="is_update" value="1" />
+<h1 class="header">
+ <gettext>Update an Attachment</gettext>
+</h1>
+ <table class="striped" style="width:100%" cellspacing="0">
+ <tr>
+ <td width="20%" align="right">
+ <span class="form-error"><tag:requiredMarker /></span>
+ <gettext>Select file to attach:</gettext>
+ </td>
+ <td width="80%">
+ <input type="file" size="30" name="attachment_file" />
+ </td>
+ </tr>
+ <tr>
+ <td width="20%" align="right">
+ <span class="form-error"><tag:requiredMarker /></span>
+ <gettext>Select the file to update</gettext>
+ </td>
+ <td width="80%">
+ <select name="filename">
+ <option value="">-- select --</option>
+ <loop:files>
+ <option value="<tag:files />"><tag:files /></option>
+ </loop:files>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="20%" align="right">
+ <span class="form-error"></span>
+ <gettext>Is this a minor update?</gettext>
+ </td>
+ <td width="80%">
+ <input type="checkbox" name="minor_change" checked="checked" />
+ </td>
+ </tr>
+ <tr>
+ <td width="20%" align="right">
+ <span class="form-error">
+ <if:requireChangelog>
+ <tag:requiredMarker />
+ </if:requireChangelog>
+ </span>
+ <gettext>Change log entry</gettext>
+ </td>
+ <td width="80%">
+ <input type="text" size="50" name="change_log" />
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <input class="button" type="submit" name="submit" value="<gettext>Update File</gettext>" />
+ </td>
+ </tr>
+</table>
+
+</form>
+</if:canUpdate>
--- /dev/null
+<form method="post" action="<tag:formAction />" name="TitleSearch">
+<tag:formInput />
+<input type="hidden" name="page" value="MergeOrRename" />
+<input type="hidden" name="referrer" value="<tag:referrer />" />
+<input type="hidden" name="actionID" value="special" />
+
+<h1 class="header">
+ <tag:pageName />: <a href="<tag:referrerLink />"><tag:referrer /></a>
+</h1>
+
+<table class="striped" style="width:100%" cellspacing="0">
+ <tr valign="top">
+ <td width="20%" align="right">
+ <span class="form-error"><tag:requiredMarker /></span>
+ <strong><gettext>New name</gettext></strong>
+ <span class="form-error"><tag:errors.new_name /></span>
+ </td>
+ <td>
+ <input type="text" name="new_name" size="40" value="<tag:new_name />" />
+ </td>
+ </tr>
+
+ <tr valign="top">
+ <td align="right">
+ <span class="form-error"><tag:requiredMarker /></span>
+ <strong><gettext>If a page with the new name already exists, then</gettext></strong>
+ <span class="form-error"><tag:errors.collision /></span>
+ </td>
+ <td>
+ <input type="radio" name="collision" value="merge" checked="checked" />
+ <gettext>Add the text from this page</gettext><br />
+ <input type="radio" name="collision" value="fail" />
+ <gettext>Stop and don't do anything</gettext><br />
+ </td>
+ </tr>
+
+ <tr>
+ <td class="control" colspan="2">
+ <strong>
+ <gettext>Change references to this page from:</gettext>
+ </strong>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2"> <em><tag:referenceCount /></em></td>
+ </tr>
+
+ <loop:references>
+ <tr>
+ <td align="right">
+ <input type="checkbox" name="ref[<tag:references.checkbox />]" checked="checked" />
+ </td>
+ <td>
+ <strong><a href="<tag:references.page_url />"><tag:references.page_name /></a></strong>
+ </td>
+ </tr>
+ </loop:references>
+
+ <tr>
+ <td colspan="2">
+ <input type="submit" class="button" name="submit" value="<gettext>Submit</gettext>" />
+ <input type="submit" class="button" name="submit" value="<gettext>Cancel</gettext>" />
+ </td>
+ </tr>
+</table>
+
+</form>
--- /dev/null
+<div class="pagebody">
+<table class="table RecentChanges" cellspacing="0">
+ <loop:changes>
+ <tr>
+ <th colspan="4" class="table-cell control"><tag:changes.date /></th>
+ </tr>
+ <loop:changes.pages>
+ <tr>
+ <td class="table-cell nowrap" style="width:20%" valign="top"><a href="<tag:changes.pages.url />"><tag:changes.pages.name /></a></td>
+ <td class="table-cell nowrap" style="width:5%" valign="top"><a href="<tag:changes.pages.version_url />" title="<tag:changes.pages.version_alt />"><tag:changes.pages.version /></a> <a href="<tag:changes.pages.diff_url />" title="<tag:changes.pages.diff_alt />"><tag:changes.pages.diff_img /></a></td>
+ <td class="table-cell nowrap" style="width:15%" valign="top"><tag:changes.pages.author /></td>
+ <td class="table-cell" style="width:58%" valign="top"><tag:changes.pages.change_log /></td>
+ </tr>
+ </loop:changes.pages>
+ </loop:changes>
+</table>
+</div>
\ No newline at end of file
--- /dev/null
+<form name="display" action="#">
+<div class="control">
+<?php
+if (!function_exists('separator')) {
+ function separator($reset = false)
+ {
+ static $liststarted = false;
+ if ($reset) {
+ $liststarted = false;
+ } elseif (!$liststarted) {
+ $liststarted = true;
+ } else {
+ echo ' | ';
+ }
+ }
+}
+
+separator(true);
+
+if ($this->allows(WICKED_MODE_EDIT) && !$this->isLocked()) {
+ separator();
+ $url = Horde_Util::addParameter(Wicked::url('EditPage'),
+ 'referrer', $this->pageName());
+ echo Horde::widget($url, sprintf(_("Edit %s"), $this->pageName()),
+ 'widget', '', '', _("_EditPage"));
+}
+
+if ($this->isLocked()) {
+ if ($this->allows(WICKED_MODE_UNLOCKING)) {
+ separator();
+ echo Horde::widget(Horde_Util::removeParameter(
+ $this->pageUrl(null, 'unlock'),
+ 'version'),
+ sprintf(_("Unlock %s"), $this->pageName()),
+ 'widget', '', '', _("Un_lock"));
+ }
+} else {
+ if ($this->allows(WICKED_MODE_LOCKING)) {
+ separator();
+ echo Horde::widget(Horde_Util::removeParameter(
+ $this->pageUrl(null, 'lock'),
+ 'version'),
+ sprintf(_("Lock %s"), $this->pageName()),
+ 'widget', '', '', _("_Lock"));
+ }
+}
+
+if ($this->allows(WICKED_MODE_REMOVE)) {
+ separator();
+ $params = array('referrer' => $this->pageName());
+ if ($this->isOld()) {
+ $params['version'] = $this->version();
+ }
+ $url = Horde_Util::addParameter(Wicked::url('DeletePage'), $params);
+ echo Horde::widget($url, sprintf(_("Delete %s"), $this->pageName()),
+ 'widget', '', '', _("_Delete"));
+}
+
+if ($this->allows(WICKED_MODE_EDIT)) {
+ separator();
+ $url = Horde_Util::addParameter(Wicked::url('MergeOrRename'),
+ 'referrer', $this->pageName());
+ echo Horde::widget($url, _("MergeOrRename"), 'widget', '', '',
+ _("_MergeOrRename"));
+}
+
+separator();
+$url = Horde_Util::addParameter(Wicked::url('BackLinks'),
+ 'referrer', $this->pageName());
+echo Horde::widget($url, _("BackLinks"), 'widget', '', '', _("_BackLinks"));
+
+separator();
+$url = Horde_Util::addParameter(Wicked::url('LikePages'),
+ 'referrer', $this->pageName());
+echo Horde::widget($url, _("LikePages"), 'widget', '', '', _("L_ikePages"));
+
+separator();
+$url = Horde_Util::addParameter(Wicked::url('AttachedFiles'),
+ 'referrer', $this->pageName());
+echo Horde::widget($url, _("AttachedFiles"), 'widget', '', '',
+ _("Attached_Files"));
+
+if ($this->allows(WICKED_MODE_HISTORY)) {
+ separator();
+ echo Horde::widget(Horde_Util::removeParameter($this->pageUrl('history.php'),
+ 'version'),
+ sprintf(_("History of %s"), $this->pageName()),
+ 'widget', '', '', _("Hi_story"));
+}
+
+if (Horde_Auth::isAdmin()) {
+ separator();
+ $permsurl = Horde::url($GLOBALS['registry']->get('webroot', 'horde') . '/admin/perms/edit.php');
+ $permsurl = Horde_Util::addParameter(
+ $permsurl,
+ array('category' => 'wicked:pages:' . $this->pageId(),
+ 'autocreate' => 1,
+ 'autocreate_copy' => 'wicked',
+ 'autocreate_guest' => Horde_Perms::SHOW | Horde_Perms::READ,
+ 'autocreate_default' => Horde_Perms::SHOW | Horde_Perms::READ | Horde_Perms::EDIT | Horde_Perms::DELETE));
+ echo Horde::widget($permsurl,
+ sprintf(_("Set permissions for %s"), $this->pageName()),
+ 'widget', '_blank', '', _("Permissio_ns"));
+}
+?>
+<?php if (empty($isBlock) && !empty($_SESSION['wickedSession']['history'])): ?>
+ <?php separator(); echo Horde::widget('#', _("Back to"), 'widget', '', 'document.location = document.display.history[document.display.history.selectedIndex].value;', _("Ba_ck to")) ?>
+ <select name="history" onchange="document.location = document.display.history[document.display.history.selectedIndex].value">
+<?php foreach ($_SESSION['wickedSession']['history'] as $history): if (!strlen($history)) continue; ?>
+ <option value="<?php echo Wicked::url($history) ?>"><?php echo htmlspecialchars($history) ?></option>
+<?php endforeach; ?>
+ </select>
+<?php endif; ?>
+</div>
+</form>
+
+<div class="pagebody">
+ <?php if (!$isBlock && $attachments): ?>
+ <div class="filelist">
+ <h2><?php echo _("Attachments") ?></h2>
+ <?php
+foreach ($attachments as $attachment) {
+ $url = Horde::downloadUrl($attachment['attachment_name'],
+ array('page' => $this->pageName(),
+ 'file' => $attachment['attachment_name'],
+ 'version' => $attachment['attachment_majorversion'] . '.' . $attachment['attachment_minorversion']));
+ $icon = Horde_Mime_Viewer::getIcon(Horde_Mime_Magic::filenameToMime($attachment['attachment_name']));
+ echo Horde::link($url) .
+ '<img src="' . $icon . '" width="16" height="16" alt="" /> ' .
+ htmlspecialchars($attachment['attachment_name']) . '</a><br />';
+}
+?>
+ </div>
+ <?php endif; ?>
+ <?php echo $text ?>
+</div>
+
+<div id="pagefooter">
+ <?php echo _("Download this page as:") ?>
+ <a href="<?php echo Horde_Util::addParameter(Wicked::url($this->pageName()), array('actionID' => 'export', 'format' => 'plain')); ?>"><?php echo _("Plain Text") ?></a>,
+ <a href="<?php echo Horde_Util::addParameter(Wicked::url($this->pageName()), array('actionID' => 'export', 'format' => 'html')); ?>"><?php echo _("HTML") ?></a>,
+ <a href="<?php echo Horde_Util::addParameter(Wicked::url($this->pageName()), array('actionID' => 'export', 'format' => 'tex')); ?>"><?php echo _("Latex") ?></a>
+</div>
--- /dev/null
+<div class="header">
+<?php
+$right = '';
+$v = $this->versionCreated();
+if (!is_a($v, 'PEAR_Error')) {
+ $right .= sprintf(_("Last Modified %s by %s"), $this->formatVersionCreated(), $this->author());
+}
+
+$v = $this->version();
+if (!is_a($v, 'PEAR_Error') && $this->allows(WICKED_MODE_DIFF)) {
+ $diff_url = Horde_Util::addParameter(Horde::applicationUrl('diff.php'),
+ array('page' => $this->pageName(),
+ 'v1' => '?',
+ 'v2' => $v));
+
+ $diff_alt = sprintf(_("Show changes for %s"), $v);
+ $right .= ' ' .
+ Horde::link($diff_url, $diff_alt) .
+ Horde::img('diff.png', $diff_alt) . '</a>';
+}
+if ($right) {
+ echo '<div class="smallheader rightFloat">' . $right . '</div>';
+}
+
+if ($this->referrer()) {
+ $referrerLink = ': ' . '<a href="' . Wicked::url($this->referrer()) . '">' . htmlspecialchars($this->referrer()) . '</a>';
+} else {
+ $referrerLink = '';
+}
+
+echo htmlspecialchars($this->pageName()) . $referrerLink . ($this->isOld() ? ' (' . htmlspecialchars($v) . ')' : '') . ' ' .
+ Horde::link($this->pageUrl(), _("Reload Page")) .
+ Horde::img('reload.png', _("Reload Page"), '', $GLOBALS['registry']->getImageDir('horde')) ?></a>
+ <?php if ($this->isLocked()) echo Horde::img('locked.png', _("Locked")) ?>
+</div>
--- /dev/null
+<form name="newpage" method="post" action="<?php echo Wicked::url('NewPage') ?>">
+<?php Horde_Util::pformInput() ?>
+<input type="hidden" name="page" value="NewPage" />
+<input type="hidden" name="referrer" value="<?php echo htmlspecialchars($this->referrer()) ?>" />
+
+<h1 class="header">
+ <?php echo htmlspecialchars($this->pageName()) ?>
+</h1>
+
+<div class="headerbox" style="padding:5px">
+<?php if ($search_results): ?>
+ <p>
+ <?php printf(_("%s does not exist, but maybe you were looking for one of the following pages?"), $this->referrer()) ?>
+ </p>
+ <table class="linedRow" style="width:100%" cellspacing="0">
+ <tr class="item leftAlign">
+ <th style="width:40%"><?php echo _("Page") ?></th>
+ <th style="width:10%"><?php echo _("Version") ?></th>
+ <th style="width:25%"><?php echo _("Author") ?></th>
+ <th style="width:25%"><?php echo _("Creation Date") ?></th>
+ </tr>
+ <?php echo $search_results ?>
+ </table>
+ <br />
+ <p>
+ <?php echo _("Click on \"Create\" below if you want to create this page now and start editing.") ?>
+ </p>
+<?php else: ?>
+ <p>
+ <?php printf(_("%s does not exist. Click on \"Create\" below if you want to create this page now and start editing."), $this->referrer()) ?>
+ </p>
+<?php endif; ?>
+
+ <p>
+ <?php echo _("Page Template:") ?>
+ <select name="template">
+ <option value=""><?php echo _("(None)") ?></option>
+ <?php
+ foreach ($templates as $page) {
+ echo '<option value="', htmlspecialchars($page['page_name']), '">',
+ htmlspecialchars($page['page_name']), "</option>\n";
+ }
+ ?>
+ </select>
+
+ <input class="button" type="submit" value="<?php echo _("Create") ?>" />
+ <a class="button" href="#" onclick="window.history.back();"><?php echo _("Cancel") ?></a>
+ <?php echo Horde_Help::link('wicked', 'Templates') ?>
+ </p>
+</div>
+
+</form>
--- /dev/null
+<script type="text/javascript">
+function preview()
+{
+ document.editform.action = 'preview.php';
+ document.editform.target = '_blank';
+ document.editform.submit();
+
+ document.editform.action = '<?php echo Wicked::url('EditPage') ?>';
+ document.editform.target = '';
+}
+</script>
+
+<form method="post" name="editform" action="<?php echo Wicked::url('NewPage') ?>">
+<?php Horde_Util::pformInput() ?>
+<input type="hidden" name="page" value="NewPage" />
+<input type="hidden" name="actionID" value="special" />
+<input type="hidden" name="referrer" value="<?php echo htmlspecialchars($this->referrer()) ?>" />
+
+<h1 class="header">
+ <?php printf(_("NewPage: %s"), htmlspecialchars($this->referrer())) ?>
+</h1>
+
+<div class="control">
+ <input type="submit" value="<?php echo _("Save") ?>" class="button" />
+ <input type="button" value="<?php echo _("Preview") ?>" class="button" onclick="preview()" />
+</div>
+
+<div style="padding:8px">
+ <textarea class="fixed" style="width:100%" name="page_text" rows="29" cols="100"><?php echo @htmlspecialchars($page_text, ENT_COMPAT, Horde_Nls::getCharset()) ?></textarea>
+</div>
+
+</form>
--- /dev/null
+<div class="pagebody">
+ <?php echo $text ?>
+</div>
--- /dev/null
+<script type="text/javascript">
+function preview()
+{
+ document.editform.action = 'preview.php';
+ document.editform.target = '_blank';
+ document.editform.submit();
+
+ document.editform.action = '<?php echo Wicked::url('EditPage') ?>';
+ document.editform.target = '';
+}
+</script>
+
+<form method="post" name="editform" action="<?php echo Wicked::url('EditPage') ?>">
+<?php Horde_Util::pformInput() ?>
+<input type="hidden" name="page" value="EditPage" />
+<input type="hidden" name="actionID" value="special" />
+<input type="hidden" name="referrer" value="<?php echo htmlspecialchars($page->pageName()) ?>" />
+
+<h1 class="header">
+ <span class="smallheader rightFloat"><?php printf(_("Last Modified %s by %s"), $page->formatVersionCreated(), $page->author()) ?></span>
+ <?php echo _("EditPage") . ': ' . Horde::link($page->pageUrl()) . htmlspecialchars($page->pageName()) . '</a>'; if ($page->isLocked()) echo Horde::img('locked.png', _("Locked")) ?>
+</h1>
+
+<div class="control">
+ <input type="submit" value="<?php echo _("Save") ?>" class="button" />
+ <input type="button" value="<?php echo _("Preview") ?>" class="button" onclick="preview()" />
+ <a class="button" href="<?php echo $page->pageUrl() ?>"><?php echo _("Cancel") ?></a>
+ <?php if (!empty($GLOBALS['conf']['wicked']['require_change_log'])) echo Horde::img('required.png', _("Changelog is required"), '', $GLOBALS['registry']->getImageDir('horde')) ?>
+ <strong><?php echo _("Change log") . ': ' ?></strong><input type="text" name="changelog" size="50" />
+ <input type="checkbox" name="minor" id="minor" checked="checked" /><label for="minor"> <?php echo _("Minor Change") ?></label>
+</div>
+
+<?php
+if (!empty($GLOBALS['conf']['wicked']['captcha']) && !Horde_Auth::getAuth()):
+ require_once 'Text/Figlet.php';
+ $figlet = new Text_Figlet();
+ $result = $figlet->loadFont($GLOBALS['conf']['wicked']['figlet_font']);
+ if (!is_a($result, 'PEAR_Error')):
+?>
+<div class="control">
+ <?php echo _("Spam Protection - Enter the letters below:") ?>
+ <pre><?php echo $figlet->lineEcho(Wicked::getCAPTCHA(true)) ?></pre>
+ <input name="wicked_captcha" />
+</div>
+<?php endif; endif; ?>
+
+<div style="padding:8px">
+ <textarea class="fixed" style="width:100%" name="page_text" rows="29" cols="100"><?php echo @htmlspecialchars($page_text, ENT_COMPAT, Horde_Nls::getCharset()) ?></textarea>
+</div>
+
+</form>
--- /dev/null
+</table>
+</form>
--- /dev/null
+<form name="diff" method="get" action="diff.php">
+<?php Horde_Util::pformInput() ?>
+<input type="hidden" name="page" value="<?php echo htmlspecialchars($this->pageName()) ?>" />
+<input type="hidden" name="v2" value="" />
+
+<h1 class="header">
+ <?php printf(_("History: %s"), Horde::link($this->pageUrl()) . htmlspecialchars($this->pageName()) . '</a>');
+ echo Horde::link($this->pageUrl('history.php')) . Horde::img('reload.png', _("Reload History"), '', $GLOBALS['registry']->getImageDir('horde')) ?></a>
+</h1>
+
+<table width="100%" cellspacing="0" class="linedRow">
+ <tr class="item">
+ <th align="left" width="1%"><?php echo _("Version") ?></th>
+
+<?php if ($this->allows(WICKED_MODE_REMOVE)): ?>
+ <th align="center" class="nowrap" style="width:1%"><?php echo Horde::img('delete.png', _("Delete Version"), '', $GLOBALS['registry']->getImageDir('horde')) ?></th>
+<?php endif; if ($this->allows(WICKED_MODE_EDIT)): ?>
+ <th align="center" class="nowrap" style="width:1%"><?php echo Horde::img('edit.png', _("Edit Version"), '', $GLOBALS['registry']->getImageDir('horde')) ?></th>
+
+ <th align="center" class="nowrap" style="width:1%"><?php echo Horde::img('restore.png', _("Restore Version")) ?></th>
+<?php endif; ?>
+
+ <th align="left" style="width:10%"><?php echo _("Author") ?></th>
+ <th align="left" style="width:30%"><?php echo _("Created") ?></th>
+<?php if ($allow_diff): ?>
+ <th align="center" class="nowrap" style="width:1%"><?php echo _("Diff From") ?></th>
+ <th align="center" class="nowrap" style="width:1%"><?php echo _("Diff To") ?></th>
+<?php endif; ?>
+ <th align="left" style="width:50%"><?php echo _("Change Log") ?></th>
+ </tr>
--- /dev/null
+<tr>
+ <td><?php echo Horde::link($page->pageUrl(), sprintf(_("Display Version %s"), $page->version())) . htmlspecialchars($page->version()) ?></a></td>
+<?php if ($this->allows(WICKED_MODE_REMOVE)): ?>
+ <td style="text-align:center">
+<?php
+$text = sprintf(_("Delete Version %s"), $page->version());
+$url = Horde_Util::addParameter(Wicked::url('DeletePage'), array('referrer' => $page->pageName(),
+ 'version' => $page->version()));
+echo Horde::link($url, $text) . Horde::img('delete.png', $text, '', $GLOBALS['registry']->getImageDir('horde')) . '</a>';
+?>
+ </td>
+<?php endif; if ($this->allows(WICKED_MODE_EDIT)): ?>
+ <td style="text-align:center">
+<?php
+if ($show_edit) {
+ $text = sprintf(_("Edit Version %s"), $page->version());
+ $url = Horde_Util::addParameter(Wicked::url('EditPage'), array('referrer' => $page->pageName()));
+ echo Horde::link($url, $text) . Horde::img('edit.png', $text, '', $GLOBALS['registry']->getImageDir('horde')) . '</a>';
+}
+?>
+ </td>
+
+ <td style="text-align:center">
+<?php
+if ($show_restore) {
+ $text = sprintf(_("Revert to version %s"), $page->version());
+ $url = Horde_Util::addParameter(Wicked::url('RevertPage'), array('referrer' => $page->pageName(),
+ 'version' => $page->version()));
+ echo Horde::link($url, $text) . Horde::img('restore.png', $text) . '</a>';
+}
+?>
+</td>
+<?php endif; ?>
+
+ <td class="nowrap"><?php echo htmlspecialchars($page->author()) ?></td>
+ <td class="nowrap"><?php echo htmlspecialchars($page->formatVersionCreated()) ?></td>
+
+<?php if ($allow_diff): $pversion = $page->isOld() ? $page->version() : ''; ?>
+ <td style="text-align:center"><input type="radio" name="v1" value="<?php echo htmlspecialchars($pversion) ?>" /></td>
+ <td style="text-align:center"><input type="submit" class="button" value="<?php echo htmlspecialchars($page->version()) ?>" onclick="if (document.diff.v1[<?php echo $i ?>].checked) return false; document.diff.v2.value = '<?php echo htmlspecialchars($pversion) ?>';" /></td>
+<?php endif; ?>
+
+ <td><?php echo @htmlspecialchars($page->changeLog(), ENT_COMPAT, Horde_Nls::getcharset()) ?></td>
+</tr>
--- /dev/null
+<script type="text/javascript">
+function jump()
+{
+ if (!document.wjump.params.value) {
+ return false;
+ }
+ return true;
+}
+</script>
+
+<form name="wjump" method="get" action="<?php echo Horde::applicationurl('display.php') ?>">
+<input type="hidden" name="page" value="Search" />
+<?php Horde_Util::pformInput() ?>
+<div id="menu">
+ <div class="rightFloat">
+ <input type="text" size="10" name="params" value="<?php echo htmlspecialchars(Horde_Util::getFormData('params')) ?>" />
+ <input type="submit" onclick="return jump()" class="button" value="<?php echo _("Search") ?>" />
+ </div>
+ <?php echo Wicked::getMenu('string') ?>
+ <br class="clear" />
+</div>
+</form>
+<?php $notification->notify(array('listeners' => 'status'));
--- /dev/null
+</tbody>
+</table>
+</div>
--- /dev/null
+<div class="pagebody">
+<table class="pagelist striped sortable" style="width:100%" cellspacing="0">
+<thead>
+ <tr>
+ <th style="width:40%"><?php echo _("Page") ?></th>
+ <th style="width:10%"><?php echo _("Version") ?></th>
+ <th style="width:25%"><?php echo _("Author") ?></th>
+ <th style="width:25%"><?php echo _("Creation Date") ?></th>
+ <?php if (!empty($hits)): ?>
+ <th class="nowrap" style="width:5%"><?php echo _("Page Views") ?></th>
+ <?php endif; ?>
+ </tr>
+</thead>
+<tbody>
--- /dev/null
+<loop:pages>
+<tr>
+ <td>
+ <a href="<tag:pages.url />" class="<tag:pages.class />"><tag:pages.name /></a><if:pages.context> <small>(<tag:pages.context />)</small></if:pages.context>
+ </td>
+ <td class="nowrap">
+ <a href="<tag:pages.url />" class="<tag:pages.class />"><tag:pages.version /></a>
+ </td>
+ <td class="nowrap"><tag:pages.author /></td>
+ <td class="nowrap"><tag:pages.created /></td>
+ <if:hits>
+ <td class="nowrap"><tag:pages.hits /></td>
+ </if:hits>
+</tr>
+</loop:pages>
--- /dev/null
+</tbody>
+</table>
--- /dev/null
+<h2><tag:title /></h2>
+
+<table class="pagelist striped sortable" style="width:100%" cellspacing="0">
+<thead>
+ <tr>
+ <th style="width:40%"><tag:th_page /></th>
+ <th style="width:10%"><tag:th_version /></th>
+ <th style="width:25%"><tag:th_author /></th>
+ <th style="width:25%"><tag:th_created /></th>
+ </tr>
+</thead>
+<tbody>
--- /dev/null
+<h1 class="header"><?php echo _("Search Results") ?></h1>
+<div class="pagebody">
--- /dev/null
+<tr>
+ <td class="nowrap">
+ <?php echo Horde::link($page->pageUrl(), sprintf(_("Display %s"), $page->pageName())) . $page->pageName() . '</a>'; ?>
+ </td>
+ <td class="nowrap">
+ <?php echo Horde::link($page->pageUrl(), sprintf(_("Display Version %s"), $page->version())) . $page->version() . '</a>'; ?>
+ </td>
+ <td class="nowrap"><?php echo $page->author() ?></td>
+ <td class="nowrap"><?php echo $page->formatVersionCreated() ?></td>
+ <?php if (!empty($hits)): ?>
+ <td class="nowrap"><?php echo $page->hits() ?></td>
+ <?php endif; ?>
+</tr>
--- /dev/null
+<?php
+/**
+ * Fomates time accoring to user prefs
+ *
+ * @param int $timestamp message timestamp
+ *
+ * @return string $date formatted date
+ */
+function _format_date($timestamp)
+{
+ return strftime($GLOBALS['prefs']->getValue('date_format'), $timestamp)
+ . ' ' . date($GLOBALS['prefs']->getValue('twentyFour') ? 'G:i' : 'g:ia', $timestamp);
+}
+
+$local = $this->getLocalPageInfo($this->_pageName);
+$remote = $this->getRemotePageInfo($this->_pageName);
+
+?>
+<table style="width: 100%" class="striped">
+<thead>
+<tr>
+<th><?php echo _("Location") ?></th>
+<th><?php echo _("Version") ?></th>
+<th><?php echo _("Created") ?></th>
+<th><?php echo _("Author") ?></th>
+<th><?php echo _("Change log") ?></th>
+<th><?php echo _("Checksum") ?></th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><?php echo _("Local") ?></td>
+<td><?php echo $local['page_majorversion'] . '.' . $local['page_minorversion'] ?></td>
+<td><?php echo _format_date($local['version_created']) ?></td>
+<td><?php echo $local['change_author'] ?></td>
+<td><?php echo $local['change_log'] ?></td>
+<td><?php echo $local['page_checksum'] ?></td>
+</tr>
+<tr>
+<td><?php echo _("Remote") ?></td>
+<td><?php echo $remote['page_majorversion'] . '.' . $remote['page_minorversion'] ?></td>
+<td><?php echo _format_date($remote['version_created']) ?></td>
+<td><?php echo $remote['change_author'] ?></td>
+<td><?php echo $remote['change_log'] ?></td>
+<td><?php echo $remote['page_checksum'] ?></td>
+</tr>
+</tbody>
+</table>
+
+<?php
+$match = $this->_getSameVersion();
+if ($match) {
+?>
+<h1 class="header"><?php echo _("Found same content in history") ?></h1>
+<table style="width: 100%" class="striped">
+<thead>
+<tr>
+<th><?php echo _("Location") ?></th>
+<th><?php echo _("Version") ?></th>
+<th><?php echo _("Created") ?></th>
+<th><?php echo _("Author") ?></th>
+<th><?php echo _("Change log") ?></th>
+<th><?php echo _("Checksum") ?></th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><?php echo _("Local") ?></td>
+<td><?php echo $match['local']['page_majorversion'] . '.' . $match['local']['page_minorversion'] ?></td>
+<td><?php echo _format_date($match['local']['version_created']) ?></td>
+<td><?php echo $match['local']['change_author'] ?></td>
+<td><?php echo $match['local']['change_log'] ?></td>
+<td><?php echo $match['local']['page_checksum'] ?></td>
+</tr>
+<tr>
+<td><?php echo _("Remote") ?></td>
+<td><?php echo $match['remote']['page_majorversion'] . '.' . $match['remote']['page_minorversion'] ?></td>
+<td><?php echo _format_date($match['remote']['version_created']) ?></td>
+<td><?php echo $match['remote']['change_author'] ?></td>
+<td><?php echo $match['remote']['change_log'] ?></td>
+<td><?php echo $match['remote']['page_checksum'] ?></td>
+</tr>
+</tbody>
+</table>
+<?php
+}
+
+// nofiy what form returned
+$GLOBALS['notification']->notify(array('listeners' => 'status'));
+
+?>
+
+<h1 class="header">
+<span style="float: right">
+<a href="<?php echo Horde_Util::addParameter(Wicked::url('SyncDiff'), array('sync_page' => $this->_pageName, 'inverse' => !$inverse)) ?>">Inverse</a> |
+<a href="" target="_blank"><?php echo _("Download") ?></a> |
+<a href="" target="_blank"><?php echo _("Upload") ?></a> |
+<a href="<?php echo Horde_Util::addParameter(Wicked::url('EditPage'), 'referrer', $this->_pageName) ?>" target="_blank"><?php echo _("Edit local") ?></a> |
+<a href="<?php echo $_SESSION['wicked']['sync']['edit'] . $this->_pageName ?>" target="_blank"><?php echo _("Edit remote") ?></a>
+</span>
+<?php echo sprintf(_("Diff for %s between %s and %s"), $page->pageTitle(), $name1, $name2) ?>
+</h1>
+<div class="text headerbox" style="padding:5px">
+<pre><?php echo $renderer->render($diff) ?></pre>
+</div>
--- /dev/null
+<div class="pagebody">
+<?php
+/**
+ * Formats time according to user prefs
+ *
+ * @param int $timestamp message timestamp
+ *
+ * @return string $date formatted date
+ */
+function _format_date($timestamp)
+{
+ return strftime($GLOBALS['prefs']->getValue('date_format'), $timestamp)
+ . ' ' . date($GLOBALS['prefs']->getValue('twentyFour') ? 'G:i' : 'g:ia', $timestamp);
+}
+
+echo $form;
+
+// notify what form returned
+$notification->notify(array('listeners' => 'status'));
--- /dev/null
+<?php
+// notify what the form returned
+$GLOBALS['notification']->notify(array('listeners' => 'status'));
+echo $form;
+?>
+<div class="pagebody">
--- /dev/null
+<?php
+/**
+ * Formats time according to user prefs
+ *
+ * @param int $timestamp message timestamp
+ *
+ * @return string $date formatted date
+ */
+function _format_date($timestamp)
+{
+ return strftime($GLOBALS['prefs']->getValue('date_format'), $timestamp)
+ . ' ' . date($GLOBALS['prefs']->getValue('twentyFour') ? 'G:i' : 'g:ia', $timestamp);
+}
+
+/* Find new pages to download */
+echo '<h2>' . _("New pages on remote server") . ': ' . $_SESSION['wicked']['sync']['url'] . ' (' . $_SESSION['wicked']['sync']['user'] . ')</h2>';
+if (empty($new_remote)) {
+ echo _("No pages found");
+} else {
+ echo '<table id="new-remote" class="sortable striped"><thead><tr>'
+ . ' <th>' . _("Page") . '</th>'
+ . ' <th>' . _("Version") . '</th>'
+ . ' <th>' . _("Created") . '</th>'
+ . ' <th>' . _("Author") . '</th>'
+ . '<th>' . _("Actions") . '</th>'
+ . '</tr></thead><tbody>';
+ $download = Horde_Util::addParameter(Wicked::url('SyncPages'), array('actionID' => 'sync_download', 'sync_page' => '')) ;
+ foreach ($new_remote as $pageName => $info) {
+ echo '<tr>'
+ . '<td>' . $pageName . '</td>'
+ . '<td>' . $info['page_majorversion'] . '.' . $info['page_minorversion'] . '</td>'
+ . '<td>' . _format_date($info['version_created']) . '</td>'
+ . '<td>' . $info['change_author'] . '</td>'
+ . '<td>' . $this->_viewLink($pageName, false)
+ . ' | <a href="' . $download . $pageName . '">' . _("Download") . '</a></td>'
+ . '</tr>';
+ }
+ echo '</tbody></table>';
+}
+
+/* Find new pages to upload */
+echo '<h2>' . _("New pages on local server") . '</h2>';
+if (empty($new_local)) {
+ echo _("No pages found");
+} else {
+ echo '<table id="new-remote" class="sortable striped"><thead><tr>'
+ . ' <th>' . _("Page") . '</th>'
+ . ' <th>' . _("Version") . '</th>'
+ . ' <th>' . _("Created") . '</th>'
+ . ' <th>' . _("Author") . '</th>'
+ . '<th>' . _("Actions") . '</th>'
+ . '</tr></thead><tbody>';
+ $upload = Horde_Util::addParameter(Wicked::url('SyncPages'), array('actionID' => 'sync_upload', 'sync_page' => '')) ;
+ foreach ($new_local as $pageName => $info) {
+ echo '<tr>'
+ . '<td>' . $pageName . '</td>'
+ . '<td>' . $info['page_majorversion'] . '.' . $info['page_minorversion'] . '</td>'
+ . '<td>' . _format_date($info['version_created']) . '</td>'
+ . '<td>' . $info['change_author'] . '</td>'
+ . '<td>' . $this->_viewLink($pageName)
+ . ' | <a href="' . $upload . $pageName . '">' . _("Upload") . '</a></td>'
+ . '</tr>';
+ }
+
+ echo '</tbody></table>';
+}
+
+echo '<h2>' . _("Pages to sync") . '</h2>';
+if (empty($sync_pages)) {
+ echo _("No pages to sync");
+} else {
+ echo '<table id="new-remote" class="sortable striped"><thead><tr>'
+ . ' <th>' . _("Page") . '</th><th>' . _("Actions") . '</th></tr></thead><tbody>';
+ $showdiff = Horde_Util::addParameter(Wicked::url('SyncDiff'), array('actionID' => 'sync_diff', 'sync_page' => ''), null, false) ;
+ foreach ($sync_pages as $pageName) {
+ echo '<tr><td>' . $pageName . '</td>'
+ . '<td>' . $this->_viewLink($pageName)
+ . ' | ' . $this->_viewLink($pageName, false)
+ . ' | <a href="' . $showdiff . $pageName . '" target="_blank">' . _("Show changes") . '</a></td>'
+ . '</tr>';
+ }
+ echo '</tbody></table>';
+}
+
--- /dev/null
+<?php
+/**
+ * $Horde: wicked/test.php,v 1.15 2009/10/04 05:25:52 mrubinsk Exp $
+ *
+ * Copyright 2005-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author Jan Schneider <jan@horde.org>
+ */
+
+/* Include Horde's core.php file. */
+include_once '../lib/core.php';
+
+/* We should have loaded the String class, from the Horde_Util package, in
+ * core.php. If Horde_String:: isn't defined, then we're not finding some critical
+ * libraries. */
+if (!class_exists('Horde_String')) {
+ echo '<br /><h2 style="color:red">The Horde_Util package was not found. If PHP\'s error_reporting setting is high enough and display_errors is on, there should be error messages printed above that may help you in debugging the problem. If you are simply missing these files, then you need to get the <a href="http://cvs.horde.org/cvs.php/framework">framework</a> module from <a href="http://www.horde.org/source/">Horde CVS</a>, and install the packages in it with the install-packages.php script.</h2>';
+ exit;
+}
+
+/* Initialize the Horde_Test:: class. */
+if (!is_readable('../lib/Test.php')) {
+ echo 'ERROR: You must install Horde before running this script.';
+ exit;
+}
+require_once '../lib/Test.php';
+$horde_test = new Horde_Test;
+
+/* Wicked version. */
+$module = 'Wicked';
+require_once './lib/version.php';
+$module_version = WICKED_VERSION;
+
+require TEST_TEMPLATES . 'header.inc';
+require TEST_TEMPLATES . 'version.inc';
+
+/* Display PHP Version information. */
+$php_info = $horde_test->getPhpVersionInformation();
+require TEST_TEMPLATES . 'php_version.inc';
+
+/* PEAR */
+$pear_list = array(
+ 'Text_Wiki' => array(
+ 'path' => 'Text/Wiki.php',
+ 'error' => 'The Text_Wiki module is required to parse and render the wiki markup in Wicked.',
+ 'required' => true,
+ 'function' => '_check_pear_text_wiki_version'
+ ),
+ 'Text_Wiki_BBCode' => array(
+ 'path' => 'Text/Wiki/BBCode.php',
+ 'error' => 'The Text_Wiki_BBCode module is required if you plan on using BBCode formatting.',
+ 'required' => false,
+ ),
+ 'Text_Wiki_Cowiki' => array(
+ 'path' => 'Text/Wiki/Cowiki.php',
+ 'error' => 'The Text_Wiki_Cowiki module is required if you plan on using Cowiki formatting.',
+ 'required' => false,
+ ),
+ 'Text_Wiki_Creole' => array(
+ 'path' => 'Text/Wiki/Creole.php',
+ 'error' => 'The Text_Wiki_Creole module is required if you plan on using Creole formatting.',
+ 'required' => false,
+ ),
+ 'Text_Wiki_Mediawiki' => array(
+ 'path' => 'Text/Wiki/Mediawiki.php',
+ 'error' => 'The Text_Wiki_Mediawiki module is required if you plan on using Mediawiki formatting.',
+ 'required' => false,
+ ),
+ 'Text_Wiki_Tiki' => array(
+ 'path' => 'Text/Wiki/Tiki.php',
+ 'error' => 'The Text_Wiki_Tiki module is required if you plan on using Tiki formatting.',
+ 'required' => false,
+ ),
+);
+
+/* Additional check for PEAR Text_Wiki module for its version. */
+function _check_pear_text_wiki_version()
+{
+ if (!is_callable(array('Text_Wiki', 'setRenderConf'))) {
+ return 'Your version of Text_Wiki is not recent enough.';
+ }
+}
+
+?>
+<h1>PEAR Modules</h1>
+<ul>
+ <?php echo $horde_test->PEARModuleCheck($pear_list) ?>
+</ul>
+
+<?php
+require TEST_TEMPLATES . 'footer.inc';
--- /dev/null
+/**
+ * $Horde: wicked/themes/hordeweb/screen.css,v 1.3 2008/08/18 17:04:30 jan Exp $
+ */
+
+.control {
+ padding-left: 5px;
+ padding-right: 5px;
+ -moz-border-radius: 8px;
+ -webkit-border-radius: 8px;
+}
+
+.pagebody {
+ padding: 0;
+}
+.pagebody h1, .pagebody h2 {
+ border: none;
+}
+#pagefooter {
+ margin-left: 0;
+ margin-right: 0;
+}
+
+.filelist, #toc {
+ font-size: 100%;
+ background: #cfc;
+ border: none;
+ -moz-border-radius: 8px;
+ -webkit-border-radius: 8px;
+}
--- /dev/null
+/**
+ * $Horde: wicked/themes/screen.css,v 1.22 2008/08/18 17:04:30 jan Exp $
+ */
+
+.pagelink {
+ color: #6060ff;
+ text-decoration: underline;
+}
+.pagelink:hover {
+ color: #00f;
+}
+.attributes {
+ border: 1px dashed #999;
+ background: #eee;
+ margin-bottom: 10px;
+}
+
+/* Styles inside the wiki page body. */
+.pagebody {
+ color: #000;
+ background: #fff;
+ padding: 20px;
+}
+.pagebody * {
+ margin-top: 2px;
+ margin-bottom: 2px;
+}
+.pagebody a[href^="http://"],
+.pagebody a[href^="https://"],
+.pagebody a[href^="ftp://"],
+.pagebody a.external {
+ background: url("graphics/external.png") center right no-repeat;
+ padding-right: 13px;
+}
+.pagebody pre {
+ border: 1px dashed #999;
+ background: #eee;
+ padding: 2px;
+}
+.pagebody tt {
+ background: #eee;
+ padding-left: 2px;
+ padding-right: 2px;
+}
+.pagebody .table {
+ border-collapse: collapse;
+}
+.pagebody .table-cell {
+ border: 1px solid #ccc;
+ background: #f6f6f6;
+ padding: 3px;
+}
+.pagebody th.table-cell {
+ background: #e0e0e0;
+ text-align: left;
+}
+.pagebody h1 {
+ border-bottom: 2px solid black;
+}
+.pagebody h2 {
+ border-bottom: 1px solid black;
+}
+.pagebody h1, .pagebody h2, .pagebody h3, .pagebody h4, .pagebody h5, .pagebody h6 {
+ margin: .4em 0 .4em 0;
+}
+.pagebody p {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+.pagebody hr {
+ margin: .5em 0;
+}
+.pagebody div {
+ margin-left: 1em;
+}
+.pagebody div strong {
+ margin-left: -1em;
+}
+.pagebody ol, .pagebody ul, .pagebody li {
+ margin-left: 20px;
+}
+.pagebody dd {
+ margin-left: 40px;
+}
+.pagebody blockquote {
+ margin-left: 40px;
+}
+
+/* Page footer */
+#pagefooter {
+ border-top: thin solid #ccc;
+ margin: 20px 20px 0 20px;
+ padding: .5em 0;
+ font-size: 90%;
+}
+
+/* Page list tables */
+table.pagelist {
+ width: 100%;
+ border-top: 1px solid #ddd;
+ border-left: 1px solid #ddd;
+}
+table.pagelist th {
+ padding: 3px;
+ background: #e9e9e9;
+ border-right: 1px solid #ccc;
+ text-align: left;
+}
+table.pagelist td {
+ padding: 3px;
+ border-right: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+}
+table.pagelist th.sortup {
+ background: #bbcbff url("graphics/za.png") center left no-repeat;
+ padding-left: 10px;
+}
+table.pagelist th.sortdown {
+ background: #bbcbff url("graphics/az.png") center left no-repeat;
+ padding-left: 10px;
+}
+
+/* Attachment list block. */
+.filelist {
+ float: right;
+ clear: right;
+ margin: 0 0 10px 10px;
+ padding: 5px;
+ width: 200px;
+ font-size: 90%;
+ background: #f6f6f6;
+ border: 1px solid #ccc;
+}
+.filelist h2 {
+ font-size: 100%;
+ font-weight: bold;
+ margin: 0 0 4px 0;
+ border-bottom: 1px dashed #000;
+}
+
+/* Table of Contents block. */
+#toc {
+ float: right;
+ clear: right;
+ margin: 0 0 10px 10px;
+ padding: 5px;
+ width: 200px;
+ font-size: 90%;
+ background: #f6f6f6;
+ border: 1px solid #ccc;
+}
+#toc h2 {
+ font-size: 100%;
+ font-weight: bold;
+ margin: 0 0 4px 0;
+ border-bottom: 1px dashed #000;
+}
+#toc li {
+ margin: 0;
+}
+#toc li ol {
+ margin-left: 10px;
+}
+
+/* Recent Changes */
+table.RecentChanges {
+ width: 100%;
+}
+table.RecentChanges th {
+ text-align: left;
+}
+
+a.newpage {
+ color: red;
+}
+
+span.match {
+ font-weight: bold;
+ color: red;
+}
--- /dev/null
+<?php
+/**
+ * $Horde: wicked/view.php,v 1.10 2009/06/10 05:25:31 slusarz Exp $
+ *
+ * Copyright 2004-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author Jason Felice <jason.m.felice@gmail.com>
+ */
+
+require_once dirname(__FILE__) . '/lib/base.php';
+
+$page = Horde_Util::getFormData('page', 'WikiHome');
+$file = Horde_Util::getFormData('file');
+$mime = Horde_Util::getFormData('mime');
+
+$id = $wicked->getPageId($page);
+if ($id !== false) {
+ $page_id = $id;
+} else {
+ $page_id = $page;
+}
+
+$version = Horde_Util::getFormData('version');
+if (empty($version)) {
+ $attachments = $wicked->getAttachedFiles($page_id);
+ if (is_a($attachments, 'PEAR_Error')) {
+ // If we redirect here, we cause an infinite loop with inline
+ // attachments.
+ header('HTTP/1.1 404 Not Found');
+ exit;
+ }
+
+ foreach ($attachments as $attachment) {
+ if ($attachment['attachment_name'] == $file) {
+ $version = $attachment['attachment_majorversion'] . '.' .
+ $attachment['attachment_minorversion'];
+ }
+ }
+
+ if (empty($version)) {
+ // If we redirect here, we cause an infinite loop with inline
+ // attachments.
+ header('HTTP/1.1 404 Not Found');
+ exit;
+ }
+}
+
+$data = $wicked->getAttachmentContents($page_id, $file, $version);
+if (is_a($data, 'PEAR_Error')) {
+ // If we redirect here, we cause an infinite loop with inline
+ // attachments.
+ header('HTTP/1.1 404 Not Found');
+ echo $data->getMessage();
+ exit;
+}
+
+$type = Horde_Mime_Magic::analyzeData($data, isset($conf['mime']['magic_db']) ? $conf['mime']['magic_db'] : null);
+if ($type === false) {
+ $type = Horde_Mime_Magic::filenameToMime($file, false);
+}
+
+$browser->downloadHeaders($file, $type, !empty($mime), strlen($data));
+echo $data;