The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Labyrinth::Plugin::Folders;

use warnings;
use strict;

my $VERSION = '5.14';

=head1 NAME

Labyrinth::Plugin::Folders - handler for Labyrinth folders

=head1 DESCRIPTION

Contains all the folder handling functionality for the Labyrinth
framework.

=cut

# -------------------------------------
# Library Modules

use base qw(Labyrinth::Plugin::Base);

use Labyrinth::DBUtils;
use Labyrinth::MLUtils;
use Labyrinth::Support;
use Labyrinth::Variables;

# -------------------------------------
# Variables

# type: 0 = optional, 1 = mandatory
# html: 0 = none, 1 = text, 2 = textarea

my %fields = (
    folderid    => { type => 0, html => 1 },
    path        => { type => 1, html => 1 },
    parent      => { type => 0, html => 1 },
    accessid    => { type => 1, html => 1 }
);

my (@mandatory,@allfields);
for(keys %fields) {
    push @mandatory, $_     if($fields{$_}->{type});
    push @allfields, $_;
}

my @savefields  = qw(path accessid parent);

my $LEVEL       = ADMIN;
my $INDEXKEY    = 'folderid';
my $ALLSQL      = 'AllFolders';
my $GETSQL      = 'GetFolder';
my $SAVESQL     = 'UpdateFolder';
my $ADDSQL      = 'InsertFolder';
my $DELETESQL   = 'DeleteFolder';

# -------------------------------------
# The Subs

=head1 ADMIN INTERFACE METHODS

All action methods are only accessible by users with admin permission.

=over 4

=item Admin

Lists the current set of folders.

=item Add

Add a new folder.

=item Edit

Edit specified folder.

=item Save

Save specified folder.

=item Delete

Delete specified folder.

=item DeleteLinkRealm

Delete a link between the specified folder and realm.

=back

=cut

sub Admin {
    return  unless AccessUser(ADMIN);

    if($cgiparams{doaction}) {
           if($cgiparams{doaction} eq 'Delete' ) { Delete();  }
    }

    my @rows = $dbi->GetQuery('hash','AllFolders');
    $tvars{data} = \@rows   if(@rows);
}

sub Add {
    return  unless AccessUser(ADMIN);
    $tvars{data} = {
        path        => '',
        ddaccess    => AccessSelect(1),
        ddparent    => FolderSelect(1,'parent')
    };
}

sub Edit {
    return  unless AccessUser($LEVEL);
    return  unless( $cgiparams{'folderid'} && $cgiparams{'folderid'} > 1 );

    my @rows = $dbi->GetQuery('hash','GetFolder',$cgiparams{'folderid'});
    return  unless(@rows);

    $tvars{data} = $rows[0];
    $tvars{data}{ddaccess} = AccessSelect($rows[0]->{accessid});
    $tvars{data}{ddparent} = FolderSelect($rows[0]->{parent},'parent');
}

sub Save {
    return  unless AccessUser($LEVEL);
    return  unless AuthorCheck('GetFolder',$INDEXKEY);

    for(keys %fields) {
           if($fields{$_}->{html} == 1) { $cgiparams{$_} = CleanHTML($cgiparams{$_}) }
        elsif($fields{$_}->{html} == 2) { $cgiparams{$_} = CleanTags($cgiparams{$_}) }
        elsif($fields{$_}->{html} == 3) { $cgiparams{$_} = CleanLink($cgiparams{$_}) }
    }

    return  if FieldCheck(\@allfields,\@mandatory);

    my @fields = map {$tvars{data}->{$_}} @savefields;
    if($cgiparams{$INDEXKEY}) {
        $dbi->DoQuery($SAVESQL,@fields,$cgiparams{$INDEXKEY});
    } else {
        $cgiparams{$INDEXKEY} = $dbi->IDQuery($ADDSQL,@fields);
    }

    $tvars{thanks} = 1;
}

sub Delete {
    return  unless AccessUser(ADMIN);
    my @ids = CGIArray('LISTED');
    return  unless @ids;

    $dbi->DoQuery($DELETESQL,{ids=>join(",",@ids)});
}

1;

__END__

=head1 SEE ALSO

L<Labyrinth>

=head1 AUTHOR

Barbie, <barbie@missbarbell.co.uk> for
Miss Barbell Productions, L<http://www.missbarbell.co.uk/>

=head1 COPYRIGHT & LICENSE

  Copyright (C) 2002-2014 Barbie for Miss Barbell Productions
  All Rights Reserved.

  This module is free software; you can redistribute it and/or
  modify it under the Artistic License 2.0.

=cut