package Kwiki::RenamePage;

use warnings;
use strict;

=head1 NAME

Kwiki::RenamePage - Better Names for Misnamed Kwiki Pages

=head1 VERSION

Version 0.01

=cut

our $VERSION = '0.02';

=head1 SYNOPSIS

Moves content of OldPage to NewName, replacing it with the message, "This page has moved to NewName." Text in other pages which could have been a link to OldPage is changed to link to NewName, but with the old text left parenthesized as, "(Old name: OldPage)".

=cut

use Kwiki::Plugin '-Base';
use mixin 'Kwiki::NewPage';
use mixin 'Kwiki::Installer';

=head1 class_id

Unmodifiable Class id accessor

=cut

const class_id => 'rename_page';

=head1 cgi_class

Unmodifiable Class class accessor

=cut

const cgi_class => 'Kwiki::RenamePage::CGI';

=head1 screen_template

unmodifiable screen_template accessor

=cut

const screen_template =>  'rename_page_content.html';

=head1 old_page_name

Modifiable old_page_name accessor

=cut

field 'old_page_name';

=head1 old_page_content

Modifiable old_page_content accessor

=cut

field 'old_page_content';

# field 'page_time';

=head1 METHODS

=over 8

=item B<register>

Plug the plugin in.

=cut

sub register {
    my $registry = shift;
    $registry->add( action => 'rename_page' );
    $registry->add( toolbar => 'rename_page_button',
    			template => 'rename_page_button.html' );
}

=item B<rename_page>

Rename the page.

=cut

sub rename_page {
    my $page = $self->pages->current;
    my $old_name = $self->cgi->old_page_name;
    my $new_name      = $self->cgi->new_page_name;
    $self->old_page_name( $self->cgi->page_name );
    my $error_msg = '';
    my $page_uri;
    if ( $self->cgi->button ) {
        $error_msg = $self->check_page_name or do {
	    my $old_page = $self->pages->new_from_name( $old_name );
            my $new_page = $self->pages->new_from_name( $new_name );
            return $self->redirect( $new_page->uri )
              unless $new_page->is_writable;
	    my $current = $self->pages->current($old_page);
	    my $yanked_content  = $current->content;
	    $current->content("This page has moved to $new_name.");
	    if ( $current->modified_time != $self->cgi->page_time )
	    {
		    return("action=edit_contention;page_name=$current->uri");
	    }
            $current->update->store;
	    my $link = qr/$old_name/;
	    for my $page ( $self->pages->all )
	    {
		    # my $current = $self->pages->current($page);
		    my $content  = $page->content;
		    $content =~ s/$old_name/$new_name (Old name: $old_name)/g;
		    $page->content($content);
		    $page->update->store;
	    }
            $current = $self->pages->current($new_page);
            $current->content($yanked_content);
            $current->update->store;
	    return $self->redirect($current->uri);
          }
    }
    return $self->render_screen( error_msg => $error_msg ) if $error_msg;
    return $self->render_screen( old_page_name => $self->old_page_name, 
    				page_time => $page->modified_time);
}

package Kwiki::RenamePage::CGI;
use Kwiki::CGI '-base';

cgi 'new_page_name';
cgi 'old_page_name';
cgi 'page_name';
cgi 'page_time';

1;

package Kwiki::RenamePage;

=back

=head1 AUTHOR

Dr Bean, C<< <drbean, then an at sign, cpan, a dot, and finally org> >>

=head1 BUGS

Please report any bugs or feature requests to
C<bug-kwiki-renamepage at rt.cpan.org>, or through the web interface at
L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Kwiki::RenamePage>.
I will be notified, and then you'll automatically be notified of progress on
your bug as I make changes.

=head1 SUPPORT

You can find documentation for this module with the perldoc command.

    perldoc Kwiki::RenamePage

You can also look for information at:

=over 4

=item * AnnoCPAN: Annotated CPAN documentation

L<http://annocpan.org/dist/Kwiki::RenamePage>

=item * CPAN Ratings

L<http://cpanratings.perl.org/d/Kwiki::RenamePage>

=item * RT: CPAN's request tracker

L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Kwiki::RenamePage>

=item * Search CPAN

L<http://search.cpan.org/dist/Kwiki::RenamePage>

=back

=head1 ACKNOWLEDGEMENTS

=head1 COPYRIGHT & LICENSE

Copyright 2006 Dr Bean, all rights reserved.

This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.

=cut

1; # End of Kwiki::RenamePage

__DATA__

__template/tt2/rename_page_button.html__
<!-- BEGIN rename_page_button.html -->
[% IF hub.pages.current.is_writable %]
[% rev_id = hub.have_plugin('revisions') ? hub.revisions.revision_id : 0 %]
<a href="[% script_name %]?action=rename_page;page_name=[% page_uri %][% IF rev_id %];revision_id=[% rev_id %][% END %]" accesskey="R" title="Rename Page">
[% INCLUDE rename_page_button_icon.html %]
</a>
[% END %]
<!-- END rename_page_button.html -->
__template/tt2/rename_page_button_icon.html__
<!-- BEGIN rename_page_button_icon.html -->
Rename
<!-- END rename_page_button_icon.html -->
__template/tt2/rename_page_content.html__
<!-- BEGIN rename_page_content.html -->
[% screen_title = 'Rename Page' %]
<form method="post">
<p>Enter a new page name for this page.</p>
<p>OLD NAME: [% self.old_page_name %]</p>
<p>NEW NAME: <input type="text" size="20" maxlength="30" name="new_page_name" value="[% new_page_name %]" />
<input type="submit" name="button" value="RENAME" /></p>
<br />
<br />
<span class="error">[% error_msg %]</span>
<input type="hidden" name="action" value="rename_page">
<input type="hidden" name="old_page_name" value="[% old_page_name %]">
<input type="hidden" name="page_time" value="[% page_time %]">
</form>
<pre>


</pre>
<!-- END rename_page_content.html -->