Bug 13364: Fix table id + software error
[koha.git] / cataloguing / value_builder / cn_browser.pl
1 use Modern::Perl;
2 no warnings 'redefine';
3
4 use CGI;
5 use C4::Auth;
6 use C4::ClassSource;
7 use C4::Output;
8
9 sub plugin_parameters {
10     my ( $dbh, $record, $tagslib, $i, $tabloop ) = @_;
11     return "";
12 }
13
14 sub plugin_javascript {
15     my ( $dbh, $record, $tagslib, $field_number, $tabloop ) = @_;
16     my $function_name = "328" . ( int( rand(100000) ) + 1 );
17     my $res = "
18 <script type=\"text/javascript\">
19 //<![CDATA[
20
21 function Focus$function_name(subfield_managed) {
22 return 1;
23 }
24
25 function Blur$function_name(subfield_managed) {
26     return 1;
27 }
28
29 function Clic$function_name(i) {
30     q = document.getElementById('$field_number');
31     window.open(\"../cataloguing/plugin_launcher.pl?plugin_name=cn_browser.pl&popup&q=\"+q.value,\"cnbrowser\",\"width=500,height=400,toolbar=false,scrollbars=yes\");
32
33 }
34
35 //]]>
36 </script>
37 ";
38
39     return ( $function_name, $res );
40 }
41
42 sub plugin {
43     my ($input)          = @_;
44     my $cgi              = new CGI;
45     my $params           = $cgi->Vars;
46     my $results_per_page = 30;
47     my $current_page = $cgi->param('page') || 1;
48
49     my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
50         {   template_name   => "cataloguing/value_builder/cn_browser.tt",
51             query           => $cgi,
52             type            => "intranet",
53             authnotrequired => 0,
54             flagsrequired   => { tools => 'cn_browser', catalogue => 1 },
55         }
56     );
57
58     my $cn_sort;
59
60     my $dbh = C4::Context->dbh;
61     my $sth;
62     my @cn;
63     my $query;
64     my $real_limit = $results_per_page / 2;
65     my $rows_lt    = 999;
66     my $rows_gt    = 999;
67     my $search;
68     my $globalGreen = 0;
69     my $lt          = '';
70     my $gt          = '';
71     my $q;
72
73     if ( $q = $cgi->param('q') ) {
74         $search = $q;
75     }
76     if ( $cgi->param('lt') ) {
77         $lt     = $cgi->param('lt');
78         $search = $lt;
79     }
80     if ( $cgi->param('gt') ) {
81         $gt     = $cgi->param('gt');
82         $search = $gt;
83     }
84
85     #Don't show half the results of show lt or gt
86     $real_limit = $results_per_page if $search ne $q;
87     $cn_sort = GetClassSort( undef, undef, $search );
88     my $cn_sort_q = GetClassSort( undef, undef, $q );
89
90     my $red = 0;
91     if ( $search ne $gt ) {
92         my $green = 0;
93
94         #Results before the cn_sort
95         $query = "SELECT b.title, itemcallnumber, biblionumber, barcode, cn_sort, branchname, author
96         FROM items AS i
97         JOIN biblio AS b USING (biblionumber)
98         LEFT OUTER JOIN branches ON (branches.branchcode = homebranch)
99         WHERE cn_sort < '$cn_sort'
100         AND itemcallnumber != ''
101         ORDER BY cn_sort DESC, itemnumber
102         LIMIT $real_limit;";
103         $sth = $dbh->prepare($query);
104         $sth->execute();
105         while ( my $data = $sth->fetchrow_hashref ) {
106             if ( $data->{itemcallnumber} eq $q ) {
107                 $data->{background} = 'red';
108                 $red = 1;
109             } elsif ( ( GetClassSort( undef, undef, $data->{itemcallnumber} ) lt $cn_sort_q ) && !$green && !$red ) {
110                 if ( $#cn != -1 ) {
111                     unshift @cn, { 'background' => 'green' };
112                     $globalGreen = 1;
113                 }
114                 $green = 1;
115             }
116             unshift @cn, $data;
117         }
118         $rows_lt = $sth->rows;
119         $sth->finish;
120     }
121
122     if ( $search ne $lt ) {
123         my $green = 0;
124
125         #Results after the cn_sort
126         $query = "SELECT b.title, itemcallnumber, biblionumber, i.cn_sort, branchname, author
127         FROM items AS i
128         JOIN biblio AS b USING (biblionumber)
129         LEFT OUTER JOIN branches ON (branches.branchcode = homebranch)
130         WHERE i.cn_sort >= '$cn_sort'
131         AND itemcallnumber != ''
132         ORDER BY cn_sort, itemnumber
133         LIMIT $real_limit";
134         $sth = $dbh->prepare($query);
135         $sth->execute();
136
137         while ( my $data = $sth->fetchrow_hashref ) {
138             if ( $data->{itemcallnumber} eq $q ) {
139                 $data->{background} = 'red';
140                 $red = 1;
141             } elsif ( ( GetClassSort( undef, undef, $data->{itemcallnumber} ) gt $cn_sort_q ) && !$green && !$red && !$globalGreen ) {
142                 push @cn, { 'background' => 'green' };
143                 $green = 1;
144             }
145             push @cn, $data;
146         }
147         $rows_gt = $sth->rows;
148
149         if ( !$green && !$red && !$globalGreen ) {
150             push @cn, { 'background' => 'green' };
151         }
152
153         $sth->finish;
154     }
155
156     $template->param( 'q'       => $q );
157     $template->param( 'cn_loop' => \@cn ) if $#cn != -1;
158     $template->param( 'popup'   => defined( $cgi->param('popup') ) );
159
160     output_html_with_http_headers $cgi, $cookie, $template->output;
161 }
162
163 1;