--- /dev/null
+use Modern::Perl;
+no warnings 'redefine';
+
+use CGI;
+use C4::Auth;
+use C4::ClassSource;
+
+sub plugin_parameters {
+ my ( $dbh, $record, $tagslib, $i, $tabloop ) = @_;
+ return "";
+}
+
+sub plugin_javascript {
+ my ( $dbh, $record, $tagslib, $field_number, $tabloop ) = @_;
+ my $function_name = "328" . ( int( rand(100000) ) + 1 );
+ my $res = "
+<script type=\"text/javascript\">
+//<![CDATA[
+
+function Focus$function_name(subfield_managed) {
+return 1;
+}
+
+function Blur$function_name(subfield_managed) {
+ return 1;
+}
+
+function Clic$function_name(i) {
+ q = document.getElementById('$field_number');
+ window.open(\"../cataloguing/plugin_launcher.pl?plugin_name=cn_browser.pl&popup&q=\"+q.value,\"cnbrowser\",\"width=500,height=400,toolbar=false,scrollbars=yes\");
+
+}
+
+//]]>
+</script>
+";
+
+ return ( $function_name, $res );
+}
+
+sub plugin {
+ my ($input) = @_;
+ my $cgi = new CGI;
+ my $params = $cgi->Vars;
+ my $results_per_page = 30;
+ my $current_page = $cgi->param('page') || 1;
+
+ my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
+ { template_name => "cataloguing/value_builder/cn_browser.tt",
+ query => $cgi,
+ type => "intranet",
+ authnotrequired => 0,
+ flagsrequired => { tools => 'cn_browser', catalogue => 1 },
+ }
+ );
+
+ my $cn_sort;
+
+ my $dbh = C4::Context->dbh;
+ my $sth;
+ my @cn;
+ my $query;
+ my $real_limit = $results_per_page / 2;
+ my $rows_lt = 999;
+ my $rows_gt = 999;
+ my $search;
+ my $globalGreen = 0;
+ my $lt = '';
+ my $gt = '';
+ my $q;
+
+ if ( $q = $cgi->param('q') ) {
+ $search = $q;
+ }
+ if ( $cgi->param('lt') ) {
+ $lt = $cgi->param('lt');
+ $search = $lt;
+ }
+ if ( $cgi->param('gt') ) {
+ $gt = $cgi->param('gt');
+ $search = $gt;
+ }
+
+ #Don't show half the results of show lt or gt
+ $real_limit = $results_per_page if $search ne $q;
+ $cn_sort = GetClassSort( undef, undef, $search );
+ my $cn_sort_q = GetClassSort( undef, undef, $q );
+
+ my $red = 0;
+ if ( $search ne $gt ) {
+ my $green = 0;
+
+ #Results before the cn_sort
+ $query = "SELECT b.title, itemcallnumber, biblionumber, barcode, cn_sort, branchname, author
+ FROM items AS i
+ JOIN biblio AS b USING (biblionumber)
+ LEFT OUTER JOIN branches ON (branches.branchcode = homebranch)
+ WHERE cn_sort < '$cn_sort'
+ AND itemcallnumber != ''
+ ORDER BY cn_sort DESC, itemnumber
+ LIMIT $real_limit;";
+ $sth = $dbh->prepare($query);
+ $sth->execute();
+ while ( my $data = $sth->fetchrow_hashref ) {
+ if ( $data->{itemcallnumber} eq $q ) {
+ $data->{background} = 'red';
+ $red = 1;
+ } elsif ( ( GetClassSort( undef, undef, $data->{itemcallnumber} ) lt $cn_sort_q ) && !$green && !$red ) {
+ if ( $#cn != -1 ) {
+ unshift @cn, { 'background' => 'green' };
+ $globalGreen = 1;
+ }
+ $green = 1;
+ }
+ unshift @cn, $data;
+ }
+ $rows_lt = $sth->rows;
+ $sth->finish;
+ }
+
+ if ( $search ne $lt ) {
+ my $green = 0;
+
+ #Results after the cn_sort
+ $query = "SELECT b.title, itemcallnumber, biblionumber, i.cn_sort, branchname, author
+ FROM items AS i
+ JOIN biblio AS b USING (biblionumber)
+ LEFT OUTER JOIN branches ON (branches.branchcode = homebranch)
+ WHERE i.cn_sort >= '$cn_sort'
+ AND itemcallnumber != ''
+ ORDER BY cn_sort, itemnumber
+ LIMIT $real_limit";
+ $sth = $dbh->prepare($query);
+ $sth->execute();
+
+ while ( my $data = $sth->fetchrow_hashref ) {
+ if ( $data->{itemcallnumber} eq $q ) {
+ $data->{background} = 'red';
+ $red = 1;
+ } elsif ( ( GetClassSort( undef, undef, $data->{itemcallnumber} ) gt $cn_sort_q ) && !$green && !$red && !$globalGreen ) {
+ push @cn, { 'background' => 'green' };
+ $green = 1;
+ }
+ push @cn, $data;
+ }
+ $rows_gt = $sth->rows;
+
+ if ( !$green && !$red && !$globalGreen ) {
+ push @cn, { 'background' => 'green' };
+ }
+
+ $sth->finish;
+ }
+
+ $template->param( 'q' => $q );
+ $template->param( 'cn_loop' => \@cn ) if $#cn != -1;
+ $template->param( 'popup' => defined( $cgi->param('popup') ) );
+
+ output_html_with_http_headers $cgi, $cookie, $template->output;
+}
+
+1;
--- /dev/null
+[% INCLUDE 'doc-head-open.inc' %]
+<title>Koha › Tools</title>
+<link rel="stylesheet" type="text/css" href="[% themelang %]/css/datatables.css" />
+[% INCLUDE 'doc-head-close.inc' %]
+[% INCLUDE 'datatables.inc' %]
+</head>
+<body>
+[% UNLESS ( popup ) %]
+[% INCLUDE 'header.inc' %]
+[% INCLUDE 'cat-search.inc' %]
+[% END %]
+
+<script language="JavaScript">
+$(document).ready(function()
+{
+ $("#cn_browser_table").DataTable({"paging": false, "bFilter": false, "info": false, "bSort": false});
+ $("#cn_browser_submit").click(function(){
+ window.location.href='/cgi-bin/koha/cataloguing/plugin_launcher.pl?plugin_name=cn_browser.pl&popup&q='+$("#cn_browser_input").val();
+ return false;
+ });
+}
+
+);
+</script>
+
+<h1 style="text-align:center">Call numbers browser</h1>
+
+<div style="margin:auto;text-align:center;">
+ <form method="get" action="cn_browser.pl">
+ <label for="searchcn">Search call number:</label>
+ <input type="text" id="cn_browser_input" name="q" value="[% q %]" />
+ <input id="cn_browser_submit" type="submit" value="Search" />
+ </form>
+</div>
+<br />
+
+<table id="cn_browser_table">
+ <thead><tr>
+ <th>Call Number</th>
+ <th>Title</th>
+ <th>Branch</th>
+ </tr></thead>
+ <tbody>
+[% FOREACH cn_loo IN cn_loop %]
+ <tr>
+ <td style="background:[% cn_loo.background %];">[% cn_loo.itemcallnumber %]</td>
+ <td style="background:[% cn_loo.background %];">
+ <a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=[% cn_loo.biblionumber %]">
+ [% cn_loo.title %] [% cn_loo.subtitle %] [% cn_loo.subtitle2 %]
+ [% IF ( cn_loo.author ) %]
+ <span>by</span> [% cn_loo.author %]
+ [% END %]
+ </a>
+ </td>
+ <td style="background:[% cn_loo.background %];">[% cn_loo.branchname %]</td>
+ </tr>
+[% END %]
+ </tbody>
+</table>
+
+<br />