Bug 14828: use Koha::ItemType[s] in admin/itemtypes
authorJonathan Druart <jonathan.druart@bugs.koha-community.org>
Tue, 15 Sep 2015 13:20:22 +0000 (14:20 +0100)
committerBrendan Gallagher <brendan@bywatersolutions.com>
Wed, 27 Jan 2016 20:46:58 +0000 (20:46 +0000)
Test plan:
Add/edit/remove item types from the administration module
(admin/itemtypes.pl).
You should get message feedback after each action.
Don't forget to play with the image and try to remove an item type
linked to records (you should not be able to remove it).

Signed-off-by: Marc VĂ©ron <veron@veron.ch>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Brendan Gallagher brendan@bywatersolutions.com
admin/itemtypes.pl
koha-tmpl/intranet-tmpl/prog/en/modules/admin/itemtypes.tt

index 9e2fdfe..f5182cd 100755 (executable)
@@ -1,6 +1,7 @@
 #!/usr/bin/perl
 
 # Copyright 2000-2002 Katipo Communications
+# Copyright 2002 Paul Poulain
 #
 # This file is part of Koha.
 #
 
 =head1 admin/itemtypes.pl
 
-script to administer the categories table
-written 20/02/2002 by paul.poulain@free.fr
- This software is placed under the gnu General Public License, v2 (http://www.gnu.org/licenses/gpl.html)
-
- ALGO :
- this script use an $op to know what to do.
- if $op is empty or none of the above values,
-       - the default screen is build (with all records, or filtered datas).
-       - the   user can clic on add, modify or delete record.
- if $op=add_form
-       - if primkey exists, this is a modification,so we read the $primkey record
-       - builds the add/modify form
- if $op=add_validate
-       - the user has just send datas, so we create/modify the record
- if $op=delete_form
-       - we show the record having primkey=$primkey and ask for deletion validation form
- if $op=delete_confirm
-       - we delete the record having primkey=$primkey
-
 =cut
 
-use strict;
-#use warnings; FIXME - Bug 2505
+use Modern::Perl;
 use CGI qw ( -utf8 );
 
-use List::Util qw/min/;
 use File::Spec;
 
 use C4::Koha;
@@ -52,18 +32,17 @@ use C4::Context;
 use C4::Auth;
 use C4::Output;
 
+use Koha::ItemTypes;
 use Koha::Localizations;
 
-my $input       = new CGI;
-my $searchfield = $input->param('description');
-my $script_name = "/cgi-bin/koha/admin/itemtypes.pl";
-my $itemtype    = $input->param('itemtype');
-my $op          = $input->param('op') // 'list';
+my $input         = new CGI;
+my $searchfield   = $input->param('description');
+my $itemtype_code = $input->param('itemtype');
+my $op            = $input->param('op') // 'list';
 my @messages;
-$searchfield =~ s/\,//g;
+$searchfield =~ s/\,//g if $searchfield;
 my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
-    {
-        template_name   => "admin/itemtypes.tt",
+    {   template_name   => "admin/itemtypes.tt",
         query           => $input,
         type            => "intranet",
         authnotrequired => 0,
@@ -72,228 +51,130 @@ my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
     }
 );
 
-$template->param(script_name => $script_name);
-if ($op) {
-       $template->param($op  => 1); # we show only the TMPL_VAR names $op
-}
-
 my $dbh = C4::Context->dbh;
 
 my $sip_media_type = $input->param('sip_media_type');
 undef($sip_media_type) if defined($sip_media_type) and $sip_media_type =~ /^\s*$/;
 
-################## ADD_FORM ##################################
-# called by default. Used to create form to add or  modify a record
 if ( $op eq 'add_form' ) {
-    #---- if primkey exists, it's a modify action, so read values to modify...
-    my $data;
-    if ($itemtype) {
-        my $sth = $dbh->prepare(q|
-            SELECT
-                   itemtypes.itemtype,
-                   itemtypes.description,
-                   itemtypes.rentalcharge,
-                   itemtypes.notforloan,
-                   itemtypes.imageurl,
-                   itemtypes.summary,
-                   itemtypes.checkinmsg,
-                   itemtypes.checkinmsgtype,
-                   itemtypes.sip_media_type,
-                   itemtypes.hideinopac,
-                   itemtypes.searchcategory,
-                   COALESCE( localization.translation, itemtypes.description ) AS translated_description
-            FROM   itemtypes
-            LEFT JOIN localization ON itemtypes.itemtype = localization.code
-                AND localization.entity='itemtypes'
-                AND localization.lang = ?
-            WHERE itemtype = ?
-        |);
-        my $language = C4::Languages::getlanguage();
-        $sth->execute($language, $itemtype);
-        $data = $sth->fetchrow_hashref;
-    }
-
-    my $imagesets = C4::Koha::getImageSets( checked => $data->{'imageurl'} );
-
-    my $remote_image = undef;
-    if ( defined $data->{imageurl} and $data->{imageurl} =~ /^http/i ) {
-        $remote_image = $data->{imageurl};
-    }
-
-    my $searchcategory = GetAuthorisedValues("ITEMTYPECAT", $data->{'searchcategory'});
-
+    my $itemtype = Koha::ItemTypes->find($itemtype_code);
+    my $imagesets = C4::Koha::getImageSets( checked => ( $itemtype ? $itemtype->imageurl : undef ) );
+    my $searchcategory = GetAuthorisedValues("ITEMTYPECAT", ( $itemtype ? $itemtype->searchcategory : '' ) );
     $template->param(
-        itemtype        => $itemtype,
-        description     => $data->{'description'},
-        rentalcharge    => sprintf( "%.2f", $data->{'rentalcharge'} ),
-        notforloan      => $data->{'notforloan'},
-        imageurl        => $data->{'imageurl'},
-        template        => C4::Context->preference('template'),
-        summary         => $data->{summary},
-        checkinmsg      => $data->{'checkinmsg'},
-        checkinmsgtype  => $data->{'checkinmsgtype'},
-        imagesets       => $imagesets,
-        remote_image    => $remote_image,
-        sip_media_type  => $data->{sip_media_type},
-        hideinopac      => $data->{'hideinopac'},
-        searchcategory  => $searchcategory,
+        itemtype  => $itemtype,
+        imagesets => $imagesets,
+        searchcategory => $searchcategory,
     );
-
-    # END $OP eq ADD_FORM
-################## ADD_VALIDATE ##################################
-    # called by add_form, used to insert/modify data in DB
-}
-elsif ( $op eq 'add_validate' ) {
-    my $is_a_modif = $input->param('is_a_modif');
-    my ( $already_exists ) = $dbh->selectrow_array(q|
-        SELECT itemtype
-        FROM   itemtypes
-        WHERE  itemtype = ?
-    |, undef, $itemtype );
-    if ( $already_exists and $is_a_modif ) { # it's a modification
-        my $query2 = '
-            UPDATE itemtypes
-            SET    description = ?
-                 , rentalcharge = ?
-                 , notforloan = ?
-                 , imageurl = ?
-                 , summary = ?
-                 , checkinmsg = ?
-                 , checkinmsgtype = ?
-                 , sip_media_type = ?
-                 , hideinopac = ?
-                 , searchcategory = ?
-            WHERE itemtype = ?
-        ';
-        my $sth = $dbh->prepare($query2);
-        $sth->execute(
-            $input->param('description'),
-            $input->param('rentalcharge'),
-            ( $input->param('notforloan') ? 1 : 0 ),
-            (
-                $input->param('image') eq 'removeImage' ? '' : (
-                      $input->param('image') eq 'remoteImage'
-                    ? $input->param('remoteImage')
-                    : $input->param('image') . ""
-                )
-            ),
-            $input->param('summary'),
-            $input->param('checkinmsg'),
-            $input->param('checkinmsgtype'),
-            $sip_media_type,
-            $input->param('hideinopac') ? 1 : 0,
-            $input->param('searchcategory'),
-            $input->param('itemtype')
-        );
-    }
-    elsif ( not $already_exists and not $is_a_modif ) {
-        my $query = "
-            INSERT INTO itemtypes
-                (itemtype,description,rentalcharge, notforloan, imageurl, summary, checkinmsg, checkinmsgtype, sip_media_type, hideinopac, searchcategory)
-            VALUES
-                (?,?,?,?,?,?,?,?,?,?,?);
-            ";
-        my $sth = $dbh->prepare($query);
-               my $image = $input->param('image');
-        $sth->execute(
-            $input->param('itemtype'),
-            $input->param('description'),
-            $input->param('rentalcharge'),
-            $input->param('notforloan') ? 1 : 0,
-            $image eq 'removeImage' ?           ''                 :
-            $image eq 'remoteImage' ? $input->param('remoteImage') :
-            $image,
-            $input->param('summary'),
-            $input->param('checkinmsg'),
-            $input->param('checkinmsgtype'),
-            $sip_media_type,
-            $input->param('hideinopac') ? 1 : 0,
-            $input->param('searchcategory'),
+} elsif ( $op eq 'add_validate' ) {
+    my $is_a_modif   = $input->param('is_a_modif');
+    my $itemtype     = Koha::ItemTypes->find($itemtype_code);
+    my $description  = $input->param('description');
+    my $rentalcharge = $input->param('rentalcharge');
+    my $image = $input->param('image') || q||;
+
+    my $notforloan = $input->param('notforloan') ? 1 : 0;
+    my $imageurl =
+      $image eq 'removeImage' ? ''
+      : (
+          $image eq 'remoteImage' ? $input->param('remoteImage')
+        : $image
+      );
+    my $summary        = $input->param('summary');
+    my $checkinmsg     = $input->param('checkinmsg');
+    my $checkinmsgtype = $input->param('checkinmsgtype');
+    my $hideinopac     = $input->param('hideinopac') // 0;
+    my $searchcategory = $input->param('searchcategory');
+
+    if ( $itemtype and $is_a_modif ) {    # it's a modification
+        $itemtype->description($description);
+        $itemtype->rentalcharge($rentalcharge);
+        $itemtype->notforloan($notforloan);
+        $itemtype->imageurl($imageurl);
+        $itemtype->summary($summary);
+        $itemtype->checkinmsg($checkinmsg);
+        $itemtype->checkinmsgtype($checkinmsgtype);
+        $itemtype->sip_media_type($sip_media_type);
+        $itemtype->hideinopac($hideinopac);
+        $itemtype->searchcategory($searchcategory);
+
+        eval { $itemtype->store; };
+
+        if ($@) {
+            push @messages, { type => 'error', code => 'error_on_update' };
+        } else {
+            push @messages, { type => 'message', code => 'success_on_update' };
+        }
+    } elsif ( not $itemtype and not $is_a_modif ) {
+        my $itemtype = Koha::ItemType->new(
+            {   itemtype       => $itemtype_code,
+                description    => $description,
+                rentalcharge   => $rentalcharge,
+                notforloan     => $notforloan,
+                imageurl       => $imageurl,
+                summary        => $summary,
+                checkinmsg     => $checkinmsg,
+                checkinmsgtype => $checkinmsgtype,
+                sip_media_type => $sip_media_type,
+                hideinopac     => $hideinopac,
+                searchcategory => $searchcategory,
+            }
         );
-    }
-    else {
-        push @messages, {
-            type => 'error',
+        eval { $itemtype->store; };
+
+        if ($@) {
+            push @messages, { type => 'error', code => 'error_on_insert' };
+        } else {
+            push @messages, { type => 'message', code => 'success_on_insert' };
+        }
+    } else {
+        push @messages,
+          { type => 'error',
             code => 'already_exists',
-        };
+          };
     }
 
     $searchfield = '';
-    $op = 'list';
-    # END $OP eq ADD_VALIDATE
-################## DELETE_CONFIRM ##################################
-    # called by default form, used to confirm deletion of data in DB
-}
-elsif ( $op eq 'delete_confirm' ) {
+    $op          = 'list';
+} elsif ( $op eq 'delete_confirm' ) {
+
     # Check both items and biblioitems
-    my $sth = $dbh->prepare('
+    my ($total) = $dbh->selectrow_array( '
         SELECT COUNT(*) AS total FROM (
             SELECT itemtype AS t FROM biblioitems
             UNION ALL
             SELECT itype AS t FROM items
         ) AS tmp
         WHERE tmp.t=?
-    ');
-    $sth->execute($itemtype);
-    my $total = $sth->fetchrow_hashref->{'total'};
+    ', {}, $itemtype_code );
+
+    if ($total) {
+        push @messages, { type => 'error', code => 'cannot_be_deleted', total => $total };
+        $op = 'list';
+    } else {
+        my $itemtype = Koha::ItemTypes->find($itemtype_code);
+        $template->param( itemtype => $itemtype, );
+    }
 
-    my $sth =
-      $dbh->prepare(
-"select itemtype,description,rentalcharge from itemtypes where itemtype=?"
-      );
-    $sth->execute($itemtype);
-    my $data = $sth->fetchrow_hashref;
-    $template->param(
-        itemtype        => $itemtype,
-        description     => $data->{description},
-        rentalcharge    => sprintf( "%.2f", $data->{rentalcharge} ),
-        imageurl        => $data->{imageurl},
-        total           => $total
-    );
+} elsif ( $op eq 'delete_confirmed' ) {
+    my $itemtype = Koha::ItemTypes->find($itemtype_code);
+    my $deleted = eval { $itemtype->delete };
+    if ( $@ or not $deleted ) {
+        push @messages, { type => 'error', code => 'error_on_delete' };
+    } else {
+        push @messages, { type => 'message', code => 'success_on_delete' };
+    }
 
-    # END $OP eq DELETE_CONFIRM
-################## DELETE_CONFIRMED ##################################
-  # called by delete_confirm, used to effectively confirm deletion of data in DB
-}
-elsif ( $op eq 'delete_confirmed' ) {
-    my $itemtype = uc( $input->param('itemtype') );
-    my $sth      = $dbh->prepare("delete from itemtypes where itemtype=?");
-    $sth->execute($itemtype);
-    $sth = $dbh->prepare("delete from issuingrules where itemtype=?");
-    $sth->execute($itemtype);
-    print $input->redirect('itemtypes.pl');
-    exit;
-    # END $OP eq DELETE_CONFIRMED
-################## DEFAULT ##################################
+    $op = 'list';
 }
 
 if ( $op eq 'list' ) {
-    my $results = C4::Koha::GetItemTypes( style => 'array' );
-    my @loop;
-    foreach my $itemtype ( @{$results} ) {
-        $itemtype->{imageurl} = getitemtypeimagelocation( 'intranet', $itemtype->{imageurl} );
-        $itemtype->{rentalcharge} = sprintf( '%.2f', $itemtype->{rentalcharge} );
-
-        my @translated_descriptions = Koha::Localizations->search(
-            {   entity => 'itemtypes',
-                code   => $itemtype->{itemtype},
-            }
-        );
-        $itemtype->{translated_descriptions} = [ map {
-            {
-                lang => $_->lang,
-                translation => $_->translation,
-            }
-        } @translated_descriptions ];
-
-        push( @loop, $itemtype );
-    }
-
+    my $itemtypes = Koha::ItemTypes->search;
     $template->param(
-        loop     => \@loop,
-        else     => 1,
-        messages => \@messages,
+        itemtypes => $itemtypes,
+        messages  => \@messages,
     );
 }
 
+$template->param( op => $op );
+
 output_html_with_http_headers $input, $cookie, $template->output;
index 6b2ab05..33ac762 100644 (file)
@@ -1,20 +1,22 @@
+[% USE Koha %]
 [% USE AuthorisedValues %]
+[% USE Price %]
 [% INCLUDE 'doc-head-open.inc' %]
-<title>Koha &rsaquo; Administration &rsaquo; Item types [% IF ( add_form ) %]&rsaquo;
+<title>Koha &rsaquo; Administration &rsaquo; Item types [% IF op == 'add_form' %]&rsaquo;
   [% IF ( itemtype ) %]
-Modify item type '[% itemtype %]'
+Modify item type '[% itemtype.itemtype %]'
   [% ELSE %]
 Add item type
   [% END %]
 [% END %]
-[% IF ( delete_confirm ) %]&rsaquo; 
+[% IF op == 'delete_confirm' %]&rsaquo;
   [% IF ( total ) %]
-Cannot delete item type '[% itemtype %]'
+Cannot delete item type '[% itemtype.itemtype %]'
   [% ELSE %]
-Delete item type '[% itemtype %]'?
+Delete item type '[% itemtype.itemtype %]'?
   [% END %]
 [% END %]
-[% IF ( delete_confirmed ) %]&rsaquo; 
+[% IF op == 'delete_confirmed' %]&rsaquo;
 Data deleted
 [% END %]
 </title>
@@ -55,312 +57,336 @@ Data deleted
 [% INCLUDE 'header.inc' %]
 [% INCLUDE 'cat-search.inc' %]
 
-<div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a> &rsaquo; <a href="/cgi-bin/koha/admin/admin-home.pl">Administration</a> &rsaquo; [% IF ( add_form ) %]
-  [% IF ( itemtype ) %]
-<a href="/cgi-bin/koha/admin/itemtypes.pl">Item types</a> &rsaquo; Modify item type '[% itemtype %]'
+<div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a> &rsaquo; <a href="/cgi-bin/koha/admin/admin-home.pl">Administration</a> &rsaquo; [% IF op == 'add_form' %]
+  [% IF itemtype %]
+<a href="/cgi-bin/koha/admin/itemtypes.pl">Item types</a> &rsaquo; Modify item type '[% itemtype.itemtype %]'
   [% ELSE %]
 <a href="/cgi-bin/koha/admin/itemtypes.pl">Item types</a> &rsaquo; Add item type
   [% END %]
 [% END %]
-[% IF ( delete_confirm ) %]
-  [% IF ( total ) %]
-<a href="/cgi-bin/koha/admin/itemtypes.pl">Item types</a> &rsaquo; Cannot delete item type '[% itemtype %]'
+[% IF op == 'delete_confirm' %]
+  [% IF total %]
+<a href="/cgi-bin/koha/admin/itemtypes.pl">Item types</a> &rsaquo; Cannot delete item type '[% itemtype.itemtype %]'
   [% ELSE %]
-<a href="/cgi-bin/koha/admin/itemtypes.pl">Item types</a> &rsaquo; Delete item type '[% itemtype %]'?
+<a href="/cgi-bin/koha/admin/itemtypes.pl">Item types</a> &rsaquo; Delete item type '[% itemtype.itemtype %]'?
   [% END %]
 [% END %]
-[% IF ( delete_confirmed ) %]
+[% IF op == 'delete_confirmed' %]
 <a href="/cgi-bin/koha/admin/itemtypes.pl">Item types</a> &rsaquo;Data deleted
 [% END %]
-[% IF ( else ) %]
+[% IF op == 'list' %]
 Item types administration
 [% END %]</div>
 
 <div id="doc3" class="yui-t2">
-   
+
    <div id="bd">
        <div id="yui-main">
        <div class="yui-b">
        
-[% IF ( else ) %]<div id="toolbar" class="btn-toolbar">
+
+[% IF op == 'list' %]<div id="toolbar" class="btn-toolbar">
     <a class="btn btn-small" id="newitemtype" href="/cgi-bin/koha/admin/itemtypes.pl?op=add_form"><i class="fa fa-plus"></i> New item type</a>
 </div>[% END %]
 
-[% FOREACH message IN messages %]
-  [% IF message.type == 'success' %]
-    <div class="dialog message">
-  [% ELSIF message.type == 'warning' %]
-    <div class="dialog alert">
-  [% ELSIF message.type == 'error' %]
-    <div class="dialog error" style="margin:auto;">
-  [% END %]
-  [% IF message.code == 'already_exists' %]
-    This item type already exists.
-  [% END %]
-  </div>
+[% FOREACH m IN messages %]
+    <div class="dialog [% m.type %]">
+        [% SWITCH m.code %]
+        [% CASE 'error_on_update' %]
+            An error occurred when updating this item type. Perhaps the value already exists.
+        [% CASE 'error_on_insert' %]
+            An error occurred when inserting this item type. Perhaps the value already exists.
+        [% CASE 'error_on_delete' %]
+            An error occurred when deleting this item type. Check the logs.
+        [% CASE 'success_on_update' %]
+            Item type updated successfully.
+        [% CASE 'success_on_insert' %]
+            Item type inserted successfully.
+        [% CASE 'success_on_delete' %]
+            Item type deleted successfully.
+        [% CASE 'already_exists' %]
+            This item type already exists.
+        [% CASE 'cannot_be_deleted' %]
+            Cannot delete this item type. <p><strong>This record is used [% m.total %] times</strong>. Deletion is not possible.</p>
+        [% CASE %]
+            [% m.code %]
+        [% END %]
+    </div>
 [% END %]
 
 
-[% IF ( add_form ) %]
-  [% IF ( itemtype ) %]
-      <h3>Modify item type</h3>
-  [% ELSE %]
-      <h3>Add item type</h3>
-  [% END %]
-<form action="[% script_name %]" name="Aform" method="post" id="itemtypeentry">
-  <input type="hidden" name="op" value="add_validate" />
-    <input type="hidden" name="checked" value="0" />
-               
-    <fieldset class="rows">
-       <ol>
-  [% IF ( itemtype ) %]
-      <li>
-          <input type="hidden" name="is_a_modif" value="1" />
-          <span class="label">Item type: </span> <input type="hidden" name="itemtype" value="[% itemtype %]" />
-          [% itemtype %]
-     </li>
-  [% ELSE %]
-      <li>
-          <label for="itemtype" class="required">Item type: </label> <input type="text" id="itemtype" name="itemtype" size="10" maxlength="10" onblur="toUC(this)" required="required" /> <span class="required">Required</span>
-      </li>
-  [% END %]
-      <li>
-          <label for="description" class="required">Description: </label><input type="text" id="description" name="description" size="48" value="[% description |html %]" required="required" /> <span class="required">Required</span>
-          <a href="/cgi-bin/koha/admin/localization.pl?entity=itemtypes&code=[% itemtype %]" title="Translate item type [% itemtype %]" rel="gb_page_center[600,500]"><i class="icon-edit"></i> Translate into other languages</a>
-      </li>
-      <li>
-          <span class="label">Search category</span>
-          <select id="searchcategory" name="searchcategory">
-          <option value="">None</option>
-                [% FOREACH cat IN searchcategory %]
-                    [% IF ( cat.selected ) %]
-                        <option value="[% cat.authorised_value %]" selected="selected">
-                            [% cat.lib %]
-                        </option>
-                    [% ELSE %]
-                        <option value="[% cat.authorised_value %]" >
-                            [% cat.lib %]
-                        </option>
-                    [% END %]
-                [% END %]
-          </select>
-          (Options are defined as the authorized values for the ITEMTYPECAT category)
-      </li>
-     [% IF ( noItemTypeImages ) %]
-        <li><span class="label">Image: </span>Item type images are disabled. To enable them, turn off the <a href="/cgi-bin/koha/admin/preferences.pl?op=search&amp;searchfield=noItemTypeImages">noItemTypeImages system preference</a></li></ol>
-        [% ELSE %]</ol>
-    <div id="icons" class="toptabs" style="clear:both">
-        <h5 style="margin-left:10px;">Choose an icon:</h5>
-                       <ul>
-          <li><a href="#none">None</a></li>
-                                 [% FOREACH imageset IN imagesets %]
-            [% IF ( imageset.imagesetactive ) %]<li class="ui-tabs-active">[% ELSE %]<li>[% END %]<a href="#[% imageset.imagesetname %]">[% imageset.imagesetname %]</a></li>
-                                 [% END %]
-                  [% IF ( remote_image ) %]<li class="ui-tabs-active">[% ELSE %]<li>[% END %]<a href="#remote">Remote image</a></li>
-                       </ul>
-  <div id="none"><ul>
-  <li><label for="noimage">No image: </label><input type="radio" name="image" id="noimage" value="removeImage" /></li>
-  </ul>
-  <br class="clear" /></div>
-
-  [% FOREACH imageset IN imagesets %]
-  <div id="[% imageset.imagesetname %]"><ul>
-  [% FOREACH image IN imageset.images %]
-                       <li style="float: none; display: inline-block; clear : none; width: auto;">
-            <label> [% IF ( image.StaffImageUrl ) %]
-              <img src="[% image.StaffImageUrl %]" alt="[% image.StaffImageUrl %]" title="[% image.StaffImageUrl %]" />
-        [% ELSE %]
-        [% END %]
-    [% IF ( image.checked ) %]
-              <input type="radio" name="image" value="[% image.KohaImage %]" checked="checked" />
+[% IF op == 'add_form' %]
+    [% IF itemtype %]
+        <h3>Modify item type</h3>
     [% ELSE %]
-              [% IF ( image.KohaImage ) %] <!-- to delete the radio button if there is no image after -->
-              <input type="radio" name="image" value="[% image.KohaImage %]" />
-              [% END %]
+        <h3>Add item type</h3>
     [% END %]
-            </label>
-                       </li>
-  [% END %]
-  </ul>
-  <br class="clear" />
-  </div>
-  [% END %]
-<div id="remote"><ul>
-<li> <label for="remote_image_check"> Remote image:</label>
-  [% IF ( remote_image ) %]
-            <input type="radio" id="remote_image_check" name="image" value="remoteImage" checked="checked" />
-  [% ELSE %]
-            <input type="radio" id="remote_image_check" name="image" value="remoteImage" />
-  [% END %]<input type="text" name="remoteImage" size="48" maxlength="200" value="[% remote_image %]" onmousedown="document.getElementById('remote_image_check').checked = true;" /> [% IF ( remote_image ) %]
-            <img src="[% remote_image %]" alt="" />
-  [% END %]</li>
-</ul>
-  <br class="clear" />
-</div>
-</div>
-[% END %]
-<ol>
-      <li>
-          <label for="hideinopac">Hide in OPAC: </label>
-          [% IF ( hideinopac ) %]
-              <input type="checkbox" id="hideinopac" name="hideinopac" checked="checked" value="1" />
-          [% ELSE %]
-              <input type="checkbox" id="hideinopac" name="hideinopac" value="1" />
-          [% END %]
-          (if checked, items of this type will be hidden as filters in OPAC's advanced search)
-      </li>
-      <li>
-          <label for="notforloan">Not for loan: </label>   [% IF ( notforloan ) %]
-                <input type="checkbox" id="notforloan" name="notforloan" checked="checked" value="1" />
-            [% ELSE %]
-                <input type="checkbox" id="notforloan" name="notforloan" value="1" />
-            [% END %]
-          (if checked, no item of this type can be issued. If not checked, every item of this type can be issued unless notforloan is set for a specific item)
-        
-      </li>
-      <li>
-          <label for="rentalcharge">Rental charge: </label>
-                 <input type="text" id="rentalcharge" name="rentalcharge" size="10" value="[% rentalcharge %]" />
-         </li>
-      <li>
-          <label for="checkinmsg">Checkin message: </label>
-          <textarea id="checkinmsg" name="checkinmsg" cols="55" rows="5">[% checkinmsg %]</textarea>
-      </li>
-      <li>
-          <label for="checkinmsgtype">Checkin message type: </label>
-          <select type="text" id="checkinmsgtype" name="checkinmsgtype">
-              [% IF ( checkinmsgtype == 'message' ) %]
-              <option value="message" selected="selected">Message</option>
-              [% ELSE %]
-                 <option value="message">Message</option>
-              [% END %]
-              [% IF ( checkinmsgtype == 'alert' ) %]
-              <option value="alert" selected="selected">Alert</option>
-              [% ELSE %]
-                  <option value="alert">Alert</option>
-              [% END %]
-          </select>
-      </li>
-      <li>
-          <label for="sip_media_type">SIP media type: </label>
-          <select id="sip_media_type" name="sip_media_type">
-              <option value=""></option>
-              [% FOREACH a IN AuthorisedValues.Get('SIP_MEDIA_TYPE', sip_media_type ) %]
-                  [% IF a.selected %]
-                      <option value="[% a.authorised_value %]" selected="selected">[% a.lib %]</option>
-                  [% ELSE %]
-                      <option value="[% a.authorised_value %]">[% a.lib %]</option>
-                  [% END %]
-              [% END %]
-          </select>
-      </li>
-      <li>
-          <label for="summary">Summary: </label>
-         <textarea id="summary" name="summary" cols="55" rows="5">[% summary %]</textarea>
-          <p>Enter a summary that will overwrite the default one in search results lists. Example, for a website itemtype : </p>
-          <p><b>&lt;a href="[856u]"&gt;open site&lt;/a&gt;</b> will show the link just below the title</p>
-      </li>
-         </ol>
-    </fieldset>
+    <form action="/cgi-bin/koha/admin/itemtypes.pl" name="Aform" method="post" id="itemtypeentry">
+        <input type="hidden" name="op" value="add_validate" />
+        <fieldset class="rows">
+            <ol>
+                [% IF itemtype %]
+                    <li>
+                        <input type="hidden" name="is_a_modif" value="1" />
+                        <span class="label">Item type: </span> <input type="hidden" name="itemtype" value="[% itemtype.itemtype %]" />
+                        [% itemtype.itemtype %]
+                    </li>
+                [% ELSE %]
+                    <li>
+                        <label for="itemtype" class="required">Item type: </label>
+                        <input type="text" id="itemtype" name="itemtype" size="10" maxlength="10" onblur="toUC(this)" required="required" /> <span class="required">Required</span>
+                    </li>
+                [% END %]
+                <li>
+                    <label for="description" class="required">Description: </label>
+                    <input type="text" id="description" name="description" size="48" value="[% itemtype.description |html %]" required="required" /> <span class="required">Required</span>
+                    <a href="/cgi-bin/koha/admin/localization.pl?entity=itemtypes&code=[% itemtype.itemtype %]" title="Translate item type [% itemtype.itemtype %]" rel="gb_page_center[600,500]"><i class="icon-edit"></i> Translate into other languages</a>
+                </li>
+                <li>
+                    <span class="label">Search category</span>
+                    <select id="searchcategory" name="searchcategory">
+                    <option value="">None</option>
+                        [% FOREACH cat IN searchcategory %]
+                            [% IF cat.selected %]
+                                <option value="[% cat.authorised_value %]" selected="selected">
+                                    [% cat.lib %]
+                                </option>
+                            [% ELSE %]
+                                <option value="[% cat.authorised_value %]" >
+                                    [% cat.lib %]
+                                </option>
+                            [% END %]
+                        [% END %]
+                    </select>
+                    (Options are defined as the authorized values for the ITEMTYPECAT category)
+                </li>
+                [% IF Koha.Preference('noItemTypeImages') %]
+                    <li>
+                        <span class="label">Image: </span>Item type images are disabled. To enable them, turn off the <a href="/cgi-bin/koha/admin/preferences.pl?op=search&amp;searchfield=noItemTypeImages">noItemTypeImages system preference</a>
+                    </li>
+                [% END %]
+            </ol>
+            [% UNLESS Koha.Preference('noItemTypeImages') %]
+                <div id="icons" class="toptabs" style="clear:both">
+                    <h5 style="margin-left:10px;">Choose an icon:</h5>
+                    <ul>
+                        <li><a href="#none">None</a></li>
+                        [% FOREACH imageset IN imagesets %]
+                            [% IF ( imageset.imagesetactive ) %]
+                                <li class="ui-tabs-active">
+                            [% ELSE %]
+                                <li>
+                            [% END %]
+                            <a href="#[% imageset.imagesetname %]">[% imageset.imagesetname %]</a>
+                            </li>
+                        [% END %]
+                        [% IF itemtype.image_location.match('^http') %]<li class="ui-tabs-active">[% ELSE %]<li>[% END %]<a href="#remote">Remote image</a></li>
+                    </ul>
+                    <div id="none">
+                        <ul>
+                            <li><label for="noimage">No image: </label><input type="radio" name="image" id="noimage" value="removeImage" /></li>
+                        </ul>
+                        <br class="clear" />
+                    </div>
 
-    <fieldset class="action">
-      <input type="submit" value="Save changes" />
-         <a href="/cgi-bin/koha/admin/itemtypes.pl" class="cancel">Cancel</a>
-    </fieldset>
-</form>
-[% END %]
+                    [% FOREACH imageset IN imagesets %]
+                        <div id="[% imageset.imagesetname %]">
+                            <ul>
+                                [% FOREACH image IN imageset.images %]
+                                    <li style="float: none; display: inline-block; clear : none; width: auto;">
+                                        <label>
+                                            [% IF image.StaffImageUrl %]
+                                                <img src="[% image.StaffImageUrl %]" alt="[% image.StaffImageUrl %]" title="[% image.StaffImageUrl %]" />
+                                            [% END %]
+                                            [% IF image.checked %]
+                                                <input type="radio" name="image" value="[% image.KohaImage %]" checked="checked" />
+                                            [% ELSIF image.KohaImage %] <!-- to delete the radio button if there is no image after -->
+                                                <input type="radio" name="image" value="[% image.KohaImage %]" />
+                                            [% END %]
+                                        </label>
+                                    </li>
+                                [% END %]
+                            </ul>
+                            <br class="clear" />
+                        </div>
+                    [% END %]
 
-[% IF ( delete_confirm ) %]
-[% IF ( total ) %]<div class="dialog message">
-<h3>Cannot delete item type</h3>
-<p><strong>This record is used [% total %] times</strong>. Deletion is not possible.</p>
-[% ELSE %]<div class="dialog alert">
-<h3>Delete item type '[% itemtype %]'?</h3>
+                    <div id="remote">
+                        <ul>
+                            <li>
+                                <label for="remote_image_check"> Remote image:</label>
+                                [% IF remote_image %]
+                                    <input type="radio" id="remote_image_check" name="image" value="remoteImage" checked="checked" />
+                                [% ELSE %]
+                                    <input type="radio" id="remote_image_check" name="image" value="remoteImage" />
+                                [% END %]
+                                <input type="text" name="remoteImage" size="48" maxlength="200" value="[% remote_image %]" onmousedown="document.getElementById('remote_image_check').checked = true;" />
+                                [% IF ( remote_image ) %]
+                                    <img src="[% remote_image %]" alt="" />
+                                [% END %]
+                            </li>
+                        </ul>
+                        <br class="clear" />
+                    </div>
+                </div>
+            [% END %]
+            <ol>
+                <li>
+                    <label for="hideinopac">Hide in OPAC: </label>
+                    [% IF ( hideinopac ) %]
+                        <input type="checkbox" id="hideinopac" name="hideinopac" checked="checked" value="1" />
+                    [% ELSE %]
+                        <input type="checkbox" id="hideinopac" name="hideinopac" value="1" />
+                    [% END %]
+                    (if checked, items of this type will be hidden as filters in OPAC's advanced search)
+                </li>
+                <li>
+                    <label for="notforloan">Not for loan: </label>
+                        [% IF itemtype.notforloan %]
+                            <input type="checkbox" id="notforloan" name="notforloan" checked="checked" value="1" />
+                        [% ELSE %]
+                            <input type="checkbox" id="notforloan" name="notforloan" value="1" />
+                        [% END %]
+                      (if checked, no item of this type can be issued. If not checked, every item of this type can be issued unless notforloan is set for a specific item)
+                </li>
+                <li>
+                    <label for="rentalcharge">Rental charge: </label>
+                    <input type="text" id="rentalcharge" name="rentalcharge" size="10" value="[% itemtype.rentalcharge %]" />
+                </li>
+                <li>
+                    <label for="checkinmsg">Checkin message: </label>
+                    <textarea id="checkinmsg" name="checkinmsg" cols="55" rows="5">[% itemtype.checkinmsg %]</textarea>
+                </li>
+                <li>
+                    <label for="checkinmsgtype">Checkin message type: </label>
+                    <select type="text" id="checkinmsgtype" name="checkinmsgtype">
+                        [% IF itemtype.checkinmsgtype == 'message' %]
+                            <option value="message" selected="selected">Message</option>
+                        [% ELSE %]
+                            <option value="message">Message</option>
+                        [% END %]
+                        [% IF itemtype.checkinmsgtype == 'alert' %]
+                            <option value="alert" selected="selected">Alert</option>
+                        [% ELSE %]
+                            <option value="alert">Alert</option>
+                        [% END %]
+                    </select>
+                </li>
+                <li>
+                    <label for="sip_media_type">SIP media type: </label>
+                    <select id="sip_media_type" name="sip_media_type">
+                        <option value=""></option>
+                        [% FOREACH a IN AuthorisedValues.Get('SIP_MEDIA_TYPE', itemtype.sip_media_type ) %]
+                            [% IF a.selected %]
+                                <option value="[% a.authorised_value %]" selected="selected">[% a.lib %]</option>
+                            [% ELSE %]
+                                <option value="[% a.authorised_value %]">[% a.lib %]</option>
+                            [% END %]
+                        [% END %]
+                    </select>
+                </li>
+                <li>
+                    <label for="summary">Summary: </label>
+                   <textarea id="summary" name="summary" cols="55" rows="5">[% itemtype.summary %]</textarea>
+                    <p>Enter a summary that will overwrite the default one in search results lists. Example, for a website itemtype : </p>
+                    <p><b>&lt;a href="[856u]"&gt;open site&lt;/a&gt;</b> will show the link just below the title</p>
+                </li>
+            </ol>
+        </fieldset>
+
+        <fieldset class="action">
+            <input type="submit" value="Save changes" />
+            <a href="/cgi-bin/koha/admin/itemtypes.pl" class="cancel">Cancel</a>
+        </fieldset>
+    </form>
 [% END %]
-<table>
-               <tr>
-                       <th scope="row">Item type</th>
-                       <td>[% itemtype %]</td>
-               </tr>
 
-       <tr><th scope="row">Description</th><td>[% translated_description %]</td></tr>
-       <tr><th scope="row">Loan length</th><td>[% loanlength %]</td></tr>
-<tr><th scope="row">Rental charge</th><td>[% rentalcharge %]</td></tr></table>
-               <form action="[% script_name %]" method="post">
-               <input type="hidden" name="op" value="delete_confirmed" /><input type="hidden" name="itemtype" value="[% itemtype %]" />[% IF ( total ) %]
-               </form>
-               
-               <form action="[% script_name %]" method="post"><input type="submit" class="approve" value="OK" /></form>
-       [% ELSE %]
-               <input type="submit" class="approve" value="Delete this Item Type" /></form> <form action="[% script_name %]" method="post"><input type="submit" class="deny" value="Do Not Delete" /></form>
-       [% END %]
-</div>
-       
+[% IF op == 'delete_confirm' %]
+    <div class="dialog message">
+        <h3>Delete item type '[% itemtype.itemtype %]'?</h3>
+        <table>
+            <tr>
+                <th scope="row">Item type</th>
+                <td>[% itemtype.itemtype %]</td>
+            </tr>
+            <tr><th scope="row">Description</th><td>[% itemtype.translated_description %]</td></tr>
+            [% UNLESS Koha.Preference('noItemTypeImages') %]
+                <tr>
+                    <th scope="row">Image</th>
+                    <td>
+                        [% IF itemtype.image_location %]<img src="[% itemtype.image_location %]" alt="" />[% END %]
+                    </td>
+                </tr>
+            [% END %]
+            <tr><th scope="row">Rental charge</th><td>[% itemtype.rentalcharge | $Price %]</td></tr>
+        </table>
+        <form action="/cgi-bin/koha/admin/itemtypes.pl" method="post">
+            <input type="hidden" name="op" value="delete_confirmed" /><input type="hidden" name="itemtype" value="[% itemtype.itemtype %]" />
+            <input type="submit" class="approve" value="Delete this Item Type" />
+        </form>
+        <form action="/cgi-bin/koha/admin/itemtypes.pl" method="post"><input type="submit" class="deny" value="Do Not Delete" /></form>
+    </div>
 [% END %]
 
-[% IF ( else ) %]
-<h2>Item types administration</h2>
-[% IF ( loop ) %]
-<table id="table_item_type">
-  <thead>
-    [% UNLESS ( noItemTypeImages ) %]<th>Image</th>[% END %]
-    <th>Code</th>
-    <th>Description</th>
-    <th>Search category</th>
-    <th>Not for loan</th>
-    <th>Hide in OPAC</th>
-    <th>Charge</th>
-    <th>Checkin message</th>
-    <th>Actions</th>
-  </thead>
-  [% FOREACH loo IN loop %]
-    <tr>
-   [% UNLESS ( noItemTypeImages ) %] <td>[% IF ( loo.imageurl ) %]<img src="[% loo.imageurl %]" alt="" />[% ELSE %]&nbsp;[% END %]</td>[% END %]
-    <td>
-      <a href="[% loo.script_name %]?op=add_form&amp;itemtype=[% loo.itemtype |html %]">
-        [% loo.itemtype %]
-      </a>
-    </td>
-    <td>
-        [% IF loo.translated_descriptions.size %]
-            [% loo.description %] (default)<br/>
-            [% FOR description IN loo.translated_descriptions %]
-                [% IF description.translation == loo.translated_description %]
-                    <b>[% description.translation %]</b>
+[% IF op == 'list' %]
+    <h2>Item types administration</h2>
+    [% IF itemtypes %]
+        <table id="table_item_type">
+          <thead>
+            [% UNLESS Koha.Preference('noItemTypeImages') %]<th>Image</th>[% END %]
+            <th>Code</th>
+            <th>Description</th>
+            <th>Search category</th>
+            <th>Not for loan</th>
+            <th>Hide in OPAC</th>
+            <th>Charge</th>
+            <th>Checkin message</th>
+            <th>Actions</th>
+          </thead>
+          [% FOREACH itemtype IN itemtypes %]
+            <tr>
+           [% UNLESS Koha.Preference('noItemTypeImages') %] <td>[% IF itemtype.image_location %]<img src="[% itemtype.image_location %]" alt="" />[% ELSE %]&nbsp;[% END %]</td>[% END %]
+            <td>
+              <a href="/cgi-bin/koha/admin/itemtypes.pl?op=add_form&amp;itemtype=[% itemtype.itemtype |html %]">
+                [% itemtype.itemtype %]
+              </a>
+            </td>
+            <td>
+                [% IF itemtype.translated_descriptions.size %]
+                    [% itemtype.description %] (default)<br/>
+                    [% FOR description IN itemtype.translated_descriptions %]
+                        [% IF description.translation == itemtype.translated_description %]
+                            <b>[% description.translation %]</b>
+                        [% ELSE %]
+                            [% description.translation %] ([% description.lang %])
+                        [% END %]
+                        <br/>
+                    [% END %]
                 [% ELSE %]
-                    [% description.translation %] ([% description.lang %])
+                    [% itemtype.description %]
                 [% END %]
-                <br/>
+            </td>
+            <td>[% itemtype.searchcategory %]</td>
+            <td>[% IF ( itemtype.notforloan ) %]Yes[% ELSE %]&nbsp;[% END %]</td>
+            <td>[% IF ( itemtype.hideinopac ) %]Yes[% ELSE %]&nbsp;[% END %]</td>
+            <td>
+            [% UNLESS ( itemtype.notforloan ) %]
+              [% itemtype.rentalcharge | $Price %]
             [% END %]
-        [% ELSE %]
-            [% loo.description %]
-        [% END %]
-    </td>
-    <td>[% loo.searchcategory %]</td>
-    <td>[% IF ( loo.notforloan ) %]Yes[% ELSE %]&nbsp;[% END %]</td>
-    <td>[% IF ( loo.hideinopac ) %]Yes[% ELSE %]&nbsp;[% END %]</td>
-    <td>
-    [% UNLESS ( loo.notforloan ) %]
-      [% loo.rentalcharge %]
+            </td>
+            <td>[% itemtype.checkinmsg | html_line_break %]</td>
+            <td>
+              <a href="/cgi-bin/koha/admin/itemtypes.pl?op=add_form&amp;itemtype=[% itemtype.itemtype |html %]">Edit</a>
+              <a href="/cgi-bin/koha/admin/itemtypes.pl?op=delete_confirm&amp;itemtype=[% itemtype.itemtype |html %]">Delete</a>
+            </td>
+          </tr>
+          [% END %]
+        </table>
+    [% ELSE %]
+        <div class="dialog message">There are no itemtypes defined</div>
     [% END %]
-    </td>
-    <td>[% loo.checkinmsg | html_line_break %]</td>
-    <td>
-      <a href="[% loo.script_name %]?op=add_form&amp;itemtype=[% loo.itemtype |html %]">Edit</a>
-      <a href="[% loo.script_name %]?op=delete_confirm&amp;itemtype=[% loo.itemtype |html %]">Delete</a>
-    </td>
-  </tr>
-  [% END %]
-</table>[% ELSE %]
-<div class="dialog message">There are no itemtypes defined</div>
-[% END %]
-
-<div class="pages">[% pagination_bar %]</div>
-
 [% END %]
 
-
-
 </div>
 </div>
 <div class="yui-b">