# --
# Kernel/Modules/AgentEdit.pm - to forward a message
# Changed by Boris Ratner <boris@goldenmyth.co.il>
# original AgentForward.pm:
# Copyright (C) 2001-2003 Martin Edenhofer <martin+code@otrs.org>
# --
# $Id: AgentEdit.pm,v 0.1 2004/1/26 17:25:11 martin Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (GPL). If you
# did not receive this file, see http://www.gnu.org/licenses/gpl.txt.
# --

package Kernel::Modules::AgentEdit;

use strict;
use Kernel::System::State;

use vars qw($VERSION);
$VERSION = '$Revision: 1.28 $';
$VERSION =~ s/^\$.*:\W(.*)\W.+?$/$1/;

# --
sub new {
    my $Type = shift;
    my %Param = @_;
    # allocate new hash for object 
    my $Self = {}; 
    bless ($Self, $Type);
    # get common objects
    foreach (keys %Param) {
        $Self->{$_} = $Param{$_};
    }
    # check all needed objects
    foreach (qw(ParamObject DBObject QueueObject LayoutObject ConfigObject 
      LogObject TicketObject)) {
        die "Got no $_" if (!$Self->{$_});
    }
    # needed objects
    $Self->{StateObject} = Kernel::System::State->new(%Param);
    # get params
    $Self->{From} = $Self->{ParamObject}->GetParam(Param => 'From') || '';
    $Self->{To} = $Self->{ParamObject}->GetParam(Param => 'To') || '';
    $Self->{Cc} = $Self->{ParamObject}->GetParam(Param => 'Cc') || '';
    $Self->{Subject} = $Self->{ParamObject}->GetParam(Param => 'Subject') || '';
    $Self->{Body} = $Self->{ParamObject}->GetParam(Param => 'Body') || '';
    $Self->{InReplyTo} = $Self->{ParamObject}->GetParam(Param => 'InReplyTo') || '';
    $Self->{ArticleID} = $Self->{ParamObject}->GetParam(Param => 'ArticleID') || '';
    $Self->{ArticleTypeID} = $Self->{ParamObject}->GetParam(Param => 'ArticleTypeID') || '';
    $Self->{NextStateID} = $Self->{ParamObject}->GetParam(Param => 'ComposeStateID') || '';
    $Self->{TimeUnits} = $Self->{ParamObject}->GetParam(Param => 'TimeUnits') || 0;
    $Self->{ArticleSenderTypeID} = $Self->{ParamObject}->GetParam(Param => 'ArticleSenderTypeID') || 0;
    return $Self;
}
# --
sub Run {
    my $Self = shift;
    my %Param = @_;
    my $Output;
    # --
    # check needed stuff
    # --
    if (!$Self->{TicketID}) {
        # --
        # error page
        # --
        $Output = $Self->{LayoutObject}->Header(Title => 'Error');
        $Output .= $Self->{LayoutObject}->Error(
            Message => "Can't Edit ticket, no TicketID is given!",
            Comment => 'Please contact the admin.',
        );
        $Output .= $Self->{LayoutObject}->Footer();
        return $Output;
    }
    # --
    # check permissions
    # --
    if (!$Self->{TicketObject}->Permission(
        Type => 'forward',
        TicketID => $Self->{TicketID},
        UserID => $Self->{UserID})) {
        # --
        # error screen, don't show ticket
        # --
        return $Self->{LayoutObject}->NoPermission(WithHeader => 'yes');
    }

    if ($Self->{Subaction} eq 'SaveArticle') {
        $Output = $Self->SaveArticle();
    }
    else {
        $Output = $Self->Form();
    }
    return $Output;
}
# --
sub Form {
    my $Self = shift;
    my %Param = @_;
    my $Output;
 
    # start with page ...
    $Output .= $Self->{LayoutObject}->Header(Area => 'Agent', Title => 'Edit');
 
    my $Tn = $Self->{TicketObject}->GetTNOfId(ID => $Self->{TicketID});
    my $QueueID = $Self->{TicketObject}->GetQueueIDOfTicketID(TicketID => $Self->{TicketID});

    # get lock state && permissions
    if (!$Self->{TicketObject}->IsTicketLocked(TicketID => $Self->{TicketID})) {
        # set owner
        $Self->{TicketObject}->SetOwner(
            TicketID => $Self->{TicketID},
            UserID => $Self->{UserID},
            NewUserID => $Self->{UserID},
        );
        # set lock
        if ($Self->{TicketObject}->SetLock(
            TicketID => $Self->{TicketID},
            Lock => 'lock',
            UserID => $Self->{UserID},
        )) {
            # show lock state
            $Output .= $Self->{LayoutObject}->TicketLocked(TicketID => $Self->{TicketID});
        }
    }
    else {
        my ($OwnerID, $OwnerLogin) = $Self->{TicketObject}->CheckOwner(
            TicketID => $Self->{TicketID},
        );
        
        if ($OwnerID != $Self->{UserID}) {
            $Output .= $Self->{LayoutObject}->Warning(
                Message => "Sorry, the current owner is $OwnerLogin!",
                Comment => 'Please change the owner first.',
            );
            $Output .= $Self->{LayoutObject}->Footer();
            return $Output;
        }
    }
    
    # get last customer article or selecte article ...
    my %Data = ();
    if ($Self->{ArticleID}) {
        %Data = $Self->{TicketObject}->GetArticle(
            ArticleID => $Self->{ArticleID},
        );
    }
    else {
        %Data = $Self->{TicketObject}->GetLastCustomerArticle(
            TicketID => $Self->{TicketID},
        );
    }
    # --
    # check if original content isn't text/plain or text/html, don't use it
    # --
    if ($Data{'ContentType'}) { 
        if($Data{'ContentType'} =~ /text\/html/i) {
            $Data{Body} =~ s/\<.+?\>//gs;
        }
        elsif ($Data{'ContentType'} !~ /text\/plain/i) {
            $Data{Body} = "-> no quotable message <-";
        }
    }
    # prepare body ...
    my $NewLine = $Self->{ConfigObject}->Get('ComposeTicketNewLine') || 75;
    $Data{Body} =~ s/(.{$NewLine}.+?\s)/$1\n/g;

    my %ArticleTypes = $Self->{DBObject}->GetTableData(
      What=>'id,name',
      Table=>'article_type',
      );
    my %ArticleSenderTypes = $Self->{DBObject}->GetTableData(
      What=>'id,name',
      Table=>'article_sender_type'
      );

    $Output .= $Self->_Mask(
        TicketNumber => $Tn,
        TicketID => $Self->{TicketID},
        QueueID => $QueueID,
        NextScreen => $Self->{NextScreen},
        ArticleTypes => \%ArticleTypes,
	ArticleSenderTypes => \%ArticleSenderTypes,
        %Data,
    );
    
    $Output .= $Self->{LayoutObject}->Footer();
    
    return $Output;
}
# --
sub SaveArticle {
    my $Self = shift;
    my %Param = @_;
    my $Output;
    # --
    # check needed stuff
    # --
    foreach (qw(TicketID ArticleID)) {
        if (!$Self->{$_}) {
            # --
            # error page
            # --
            $Output = $Self->{LayoutObject}->Header(Title => 'Error');
            $Output .= $Self->{LayoutObject}->Error(
                Message => "Can't save ticket, no $_ is given!",
                Comment => 'Please contact the admin.',
            );
            $Output .= $Self->{LayoutObject}->Footer();
            return $Output;
        }
    }
    # --
    # check permissions
    # --
    if (!$Self->{TicketObject}->Permission(
        Type => 'rw',
        TicketID => $Self->{TicketID},
        UserID => $Self->{UserID})) {
        # --
        # error screen, don't show ticket
        # --
        return $Self->{LayoutObject}->NoPermission(WithHeader => 'yes');
    }
    # --
    # Put Attachment Handling Here 
    # --
    
    # --    
    # Save Article
    # --
    $Output .= $Self->{LayoutObject}->Header();
    
#   Prepare Strings for SQL
    my $NewLine = $Self->{ConfigObject}->Get('ComposeTicketNewLine') || 75;
    $Self->{Body} =~ s/(.{$NewLine}.+?\s)\n/$1/g;

    
    foreach (qw(From To Cc Subect Body)) {
     $Self->{$_}=$Self->{DBObject}->Quote($Self->{$_});     
    }
    my $SQL = qq| UPDATE article SET 
      article_type_id = $Self->{ArticleTypeID},
      article_sender_type_id = $Self->{ArticleSenderTypeID},
      a_from = '$Self->{From}',
      a_to = '$Self->{To}',
      a_cc = '$Self->{Cc}',
      a_subject = '$Self->{Subject}',
      a_body = '$Self->{Body}',
      change_time = now()
      WHERE id = $Self->{ArticleID};
    |;
    
    if ($Self->{DBObject}->Do(SQL => $SQL)) {
      $Output.= "<font size=+3>Saved Successfully!</font>";
    }
    else
    {
      $Output.= "<font size=+3>Error while updating Data!</font><pre>\n$_\n<pre>";
    }
#    $Output.="<pre>\n$SQL\n</pre>";
    $Output.= qq|<a href="$Self->{LayoutObject}->{Baselink}$Self->{LastScreen}" class="navitem">Back to Zoom Ticket</a>|; 
    
    $Output .= $Self->{LayoutObject}->Footer();
    return $Output;
    }
    
# --
sub _Mask {
    my $Self = shift;
    my %Param = @_;

    $Param{'ArticleTypesStrg'} = $Self->{LayoutObject}->OptionStrgHashRef(
        Data => $Param{ArticleTypes},
        Name => 'ArticleTypeID',
	SelectedID => $Param{ArticleTypeID}
    );
    
    $Param{'ArticleSenderTypesStrg'} = $Self->{LayoutObject}->OptionStrgHashRef(
        Data => $Param{ArticleSenderTypes},
        Name => 'ArticleSenderTypeID',
	SelectedID => $Param{ArticleSenderTypeID}
    );
    # create html from
    $Param{SystemFromHTML} = $Self->{LayoutObject}->Ascii2Html(Text => $Param{SystemFrom}, Max => 70);
    # do html quoting
    foreach (qw(ReplyTo From To Cc Subject SystemFrom Body)) {
        $Param{$_} = $Self->{LayoutObject}->{LanguageObject}->CharsetConvert(
            Text => $Param{$_},
            From => $Param{ContentCharset},
        );
        $Param{$_} = $Self->{LayoutObject}->Ascii2Html(Text => $Param{$_}) || '';
    }
    # create & return output
    return $Self->{LayoutObject}->Output(TemplateFile => 'AgentEdit', Data => \%Param);
}
# --
1;
