Bug 21232: Add a client-side check on biblionumber when creating a subscription
[koha.git] / koha-tmpl / intranet-tmpl / prog / js / subscription-add.js
1 /* global _ irregularity more_than_one_serial subscriptionid tags interface theme mana_enabled MSG_FREQUENCY_LENGTH_ERROR */
2
3 var globalnumpatterndata;
4 var globalfreqdata;
5 var mananumpatterndata;
6 var manafreqdata;
7 var manaid;
8 var advancedpatternlocked;
9 var patternneedtobetested = 0;
10 if ( irregularity !== "" ){
11     patternneedtobetested = 1;
12 }
13
14 function check_issues(){
15     if (globalfreqdata.unit.length >0) {
16         if (document.f.subtype.value == globalfreqdata.unit){
17             document.f.issuelengthcount.value=(document.f.sublength.value*globalfreqdata.issuesperunit)/globalfreqdata.unitsperissue;
18         } else if (document.f.subtype.value != "issues"){
19             alert( MSG_FREQUENCY_LENGTH_ERROR );
20         }
21     }
22 }
23
24 function addbiblioPopup(biblionumber) {
25     var destination = "/cgi-bin/koha/cataloguing/addbiblio.pl?mode=popup";
26     if(biblionumber){
27         destination += "&biblionumber="+biblionumber;
28     }
29     window.open(destination,'AddBiblioPopup','width=1024,height=768,toolbar=no,scrollbars=yes');
30 }
31
32 function Plugin(){
33     window.open('subscription-bib-search.pl','FindABibIndex','width=800,height=400,toolbar=no,scrollbars=yes');
34 }
35
36 function FindAcqui(){
37     window.open('acqui-search.pl','FindASupplier','width=800,height=400,toolbar=no,scrollbars=yes');
38 }
39
40 function Find_ISSN(f){
41     window.open('issn-search.pl','FindABibIndex','width=800,height=400,toolbar=no,scrollbars=yes');
42 }
43
44 function Clear(id) {
45     $("#"+id).val('');
46 }
47
48 function Check_page1() {
49     if ( $("#aqbooksellerid").val().length == 0) {
50         input_box = confirm( MSG_LINK_TO_VENDOR );
51         if (input_box==false) {
52             return false;
53         }
54     }
55
56     var biblionumber = $("#biblionumber").val()
57     if ( biblionumber.length == 0 ) {
58         alert( MSG_LINK_BIBLIO );
59         return false;
60     }
61
62     var bib_exists = $("input[name='title']").val().length;
63
64     if (!bib_exists) alert(_("Bibliographic record does not exist!"));
65     return bib_exists;
66 }
67
68 function Check_page2(){
69     if( more_than_one_serial == "" ){
70         if($("#acqui_date").val().length == 0){
71             alert( MSG_REQUIRED_PUB_DATE );
72             return false;
73         }
74     }
75     if($("#sublength").val().length == 0 && $("input[name='enddate']").val().length == 0){
76         alert( MSG_REQUIRED_SUB_LENGTH );
77         return false;
78     }
79     if(advancedpatternlocked == 0){
80         alert( MSG_SAVE_PREDICTION_PATTERN );
81         return false;
82     }
83     if(patternneedtobetested){
84         if( irregularity !== "" ){
85             alert( MSG_PATTERN_IRREG );
86         } else {
87             alert( MSG_TEST_PREDICTION );
88         }
89         return false;
90     }
91
92     return true;
93 }
94
95 function frequencyload(){
96     if ($("#frequency option:selected").val() === "mana"){
97         globalfreqdata=manafreqdata;
98         $("input[name='sfdescription']").val(manafreqdata.description);
99         $("input[name='unit']").val(manafreqdata.unit);
100         $("input[name='unitsperissue']").val(manafreqdata.unitsperissue);
101         $("input[name='issuesperunit']").val(manafreqdata.issuesperunit);
102         if ($( "#numberpattern option:selected" ).val() === "mana" ) {
103             $("#mana_id").val(manaid);
104         }
105     } else {
106         $.getJSON("subscription-frequency.pl",{"frequency_id":document.f.frequency.value,ajax:'true'},
107             function(freqdata){
108                 globalfreqdata=freqdata;
109                 if ( globalfreqdata.unit && globalfreqdata.unit.length == 0 ) {
110                     var option = $("#subtype option[value='issues']");
111                     $(option).attr('selected', 'selected');
112                     $("#subtype option[value!='issues']").prop('disabled', true);
113                 } else {
114                     $("#subtype option").prop('disabled', false);
115                 }
116             }
117         );
118         $("#mana_id").val("");
119     }
120 }
121
122 function numberpatternload(){
123     if($("#numberpattern option:selected" ).val() === "mana"){
124         globalnumpatterndata=mananumpatterndata;
125         $("input[name='sndescription']").val(mananumpatterndata.description);
126         if($("#frequency option:selected" ).val() === "mana"){
127             $("#mana_id").val(manaid);
128         }
129         if (globalnumpatterndata==undefined){
130             return false;
131         }
132         displaymoreoptions();
133         restoreAdvancedPattern();
134     } else {
135         $.getJSON("subscription-numberpattern.pl",{"numberpattern_id":document.f.numbering_pattern.value,ajax:'true'},
136             function(numpatterndata){
137                 globalnumpatterndata=numpatterndata;
138                 if (globalnumpatterndata==undefined){
139                     return false;
140                 }
141                 displaymoreoptions();
142                 restoreAdvancedPattern();
143             }
144         );
145         $("#mana_id").val("");
146     }
147 }
148
149 function displaymoreoptions() {
150     if(globalnumpatterndata == undefined){
151         $("#moreoptionst").hide();
152         return false;
153     }
154
155     var X = 0, Y = 0, Z = 0;
156     var numberingmethod = globalnumpatterndata.numberingmethod;
157     if(numberingmethod.match(/{X}/)) X = 1;
158     if(numberingmethod.match(/{Y}/)) Y = 1;
159     if(numberingmethod.match(/{Z}/)) Z = 1;
160
161     if(X || Y || Z) {
162         $("#moreoptionst").show();
163     } else {
164         $("#moreoptionst").hide();
165     }
166
167     if(X) {
168         if(globalnumpatterndata.label1) {
169             $("#headerX").html(globalnumpatterndata.label1);
170         } else {
171             $("#headerX").html("X");
172         }
173         $("#headerX").show();
174         $("#beginsX").show();
175         $("#innerX").show();
176     } else {
177         $("#headerX").hide();
178         $("#beginsX").hide();
179         $("#innerX").hide();
180         $("#lastvaluetemp1").val('');
181         $("#innerlooptemp1").val('');
182     }
183     if(Y) {
184         if(globalnumpatterndata.label2) {
185             $("#headerY").html(globalnumpatterndata.label2);
186         } else {
187             $("#headerY").html("Y");
188         }
189         $("#headerY").show();
190         $("#beginsY").show();
191         $("#innerY").show();
192     } else {
193         $("#headerY").hide();
194         $("#beginsY").hide();
195         $("#innerY").hide();
196         $("#lastvaluetemp2").val('');
197         $("#innerlooptemp2").val('');
198     }
199     if(Z) {
200         if(globalnumpatterndata.label3) {
201             $("#headerZ").html(globalnumpatterndata.label3);
202         } else {
203             $("#headerZ").html("Z");
204         }
205         $("#headerZ").show();
206         $("#beginsZ").show();
207         $("#innerZ").show();
208     } else {
209         $("#headerZ").hide();
210         $("#beginsZ").hide();
211         $("#innerZ").hide();
212         $("#lastvaluetemp3").val('');
213         $("#innerlooptemp3").val('');
214     }
215 }
216
217 function modifyAdvancedPattern() {
218     $("#patternname").prop('readOnly', false).val('').focus();
219     $("#numberingmethod").prop('readOnly', false);
220
221     $("#advancedpredictionpatternt input").each(function() {
222         $(this).prop('readOnly', false);
223     });
224     $("#advancedpredictionpatternt select").each(function() {
225         $(this).prop('disabled', false);
226     });
227
228     $("#restoreadvancedpatternbutton").show();
229     $("#saveadvancedpatternbutton").show();
230     $("#modifyadvancedpatternbutton").hide();
231
232     advancedpatternlocked = 0;
233 }
234
235 function restoreAdvancedPattern() {
236     $("#patternname").prop('readOnly', true).val(globalnumpatterndata.label);
237     $("#numberingmethod").prop('readOnly', true).val(globalnumpatterndata.numberingmethod);
238
239     $("#advancedpredictionpatternt input").each(function() {
240         $(this).prop('readOnly', true);
241         var id = $(this).attr('id');
242         if(id.match(/lastvalue/) || id.match(/innerloop/)) {
243             var tempid = id.replace(/(\d)/, "temp$1");
244             $(this).val($("#"+tempid).val());
245         } else {
246             $(this).val(globalnumpatterndata[id]);
247         }
248     });
249     $("#advancedpredictionpatternt select").each(function() {
250         $(this).prop('disabled', true);
251         var id = $(this).attr('id');
252         $(this).val(globalnumpatterndata[id]);
253     });
254
255     $("#restoreadvancedpatternbutton").hide();
256     $("#saveadvancedpatternbutton").hide();
257     $("#modifyadvancedpatternbutton").show();
258
259     advancedpatternlocked = 1;
260 }
261
262 function testPredictionPattern() {
263     var frequencyid = $("#frequency").val();
264     var acquidate;
265     var error = 0;
266     var error_msg = "";
267     if(frequencyid == undefined || frequencyid == ""){
268         error_msg += "- " + MSG_FREQUENCY_UNDEFINED + "\n";
269         error ++;
270     }
271     acquidate = $("#acqui_date").val();
272     if(acquidate == undefined || acquidate == ""){
273         error_msg += "-" + MSG_PUB_DATE_UNDEFINED + "\n";
274         error ++;
275     }
276     if( more_than_one_serial !== "" ){
277         var nextacquidate = $("#nextacquidate").val();
278         if(nextacquidate == undefined || nextacquidate == ""){
279             error_msg += "-" + MSG_NEXT_ISSUE_UNDEFINED + "\n";
280             error ++;
281         }
282     }
283
284     if(error){
285         alert( MSG_PATTERN_TEST_FAILED.format(error_msg) );
286         return false;
287     }
288
289     var custompattern = 0;
290     if(advancedpatternlocked == 0) {
291         custompattern = 1;
292     }
293
294     var ajaxData = {
295         'custompattern': custompattern,
296         'firstacquidate': acquidate
297     };
298
299     if( subscriptionid !== "" ){
300         ajaxData.subscriptionid = subscriptionid;
301     }
302     if( more_than_one_serial !== "" ){
303         ajaxData.nextacquidate = nextacquidate;
304     }
305
306
307     var ajaxParams = [
308         'to', 'subtype', 'sublength', 'frequency', 'numberingmethod',
309         'lastvalue1', 'lastvalue2', 'lastvalue3', 'add1', 'add2', 'add3',
310         'every1', 'every2', 'every3', 'innerloop1', 'innerloop2', 'innerloop3',
311         'setto1', 'setto2', 'setto3', 'numbering1', 'numbering2', 'numbering3',
312         'whenmorethan1', 'whenmorethan2', 'whenmorethan3', 'locale',
313         'sfdescription', 'unitsperissue', 'issuesperunit', 'unit'
314     ];
315     for(i in ajaxParams) {
316         var param = ajaxParams[i];
317         var value = $("#"+param).val();
318         if(value.length > 0)
319             ajaxData[param] = value;
320     }
321
322     $.ajax({
323         url:"/cgi-bin/koha/serials/showpredictionpattern.pl",
324         data: ajaxData,
325         success: function(data) {
326             showPredictionPatternTest( data );
327             patternneedtobetested = 0;
328         }
329     });
330 }
331
332 function saveAdvancedPattern() {
333     if ($("#patternname").val().length == 0) {
334         alert( MSG_PATTERN_NAME );
335         return false;
336     }
337
338     // Check if patternname already exists, and modify pattern
339     // instead of creating it if so
340     var found = 0;
341     $("#numberpattern option").each(function(){
342         if($(this).text() == $("#patternname").val()){
343             found = 1;
344             return false;
345         }
346     });
347     var cnfrm = 1;
348     if(found){
349         var msg = MSG_PATTERN_NAME_EXISTS
350             + "\n" + MSG_OVERWRITE_PATTERNS;
351         cnfrm = confirm(msg);
352     }
353
354     if(cnfrm) {
355         var ajaxData = {};
356         var ajaxParams = [
357             'patternname', 'numberingmethod', 'label1', 'label2', 'label3',
358             'add1', 'add2', 'add3', 'every1', 'every2', 'every3',
359             'setto1', 'setto2', 'setto3', 'numbering1', 'numbering2', 'numbering3',
360             'whenmorethan1', 'whenmorethan2', 'whenmorethan3', 'locale'
361         ];
362         for(i in ajaxParams) {
363             var param = ajaxParams[i];
364             var value = $("#"+param).val();
365             if(value.length > 0)
366                 ajaxData[param] = value;
367         }
368
369         $.getJSON(
370             "/cgi-bin/koha/serials/create-numberpattern.pl",
371             ajaxData,
372             function(data){
373                 if (data.numberpatternid) {
374                     if(found == 0){
375                         $("#numberpattern").append("<option value=\""+data.numberpatternid+"\">"+$("#patternname").val()+"</option>");
376                     }
377                     $("#numberpattern").val(data.numberpatternid);
378                     numberpatternload();
379                 } else {
380                     alert( MSG_PATTERN_CREATE_FAILED );
381                 }
382             }
383         );
384     }
385 }
386
387 function show_page_1() {
388     $("#page_1").show();
389     $("#page_2").hide();
390     $("#page_number").text("1/2");
391 }
392
393 function show_page_2() {
394     $("#page_1").hide();
395     $("#page_2").show();
396     $("#page_number").text("2/2");
397     displaymoreoptions();
398 }
399
400 function mana_search() {
401     $("#mana_search").html("<p>" + MSG_MANA_SEARCHING + "... <img src='" + interface + "/" + theme + "/img/spinner-small.gif' /></p>");
402     $("#mana_search").show();
403
404     $.ajax({
405         type: "POST",
406         url: "/cgi-bin/koha/svc/mana/search",
407         data: {id: $("#biblionumber").val(), resource: 'subscription', usecomments: 1},
408         dataType: "html",
409     })
410         .done( function( result ) {
411             $("#mana_search_result .modal-body").html(result);
412             $("#mana_search_result_label").text( MSG_MANA_RESULTS );
413             $("#mana_results_datatable").dataTable($.extend(true, {}, dataTablesDefaults, {
414                 "sPaginationType": "full",
415                 "order":[[4, "desc"], [5, "desc"]],
416                 "autoWidth": false,
417                 "columnDefs": [
418                     { "width": "35%", "targets": 1 }
419                 ],
420                 "aoColumnDefs": [
421                     { 'bSortable': false, "bSearchable": false, 'aTargets': [ 'NoSort' ] },
422                     { "sType": "title-string", "aTargets" : [ "title-string" ] },
423                     { 'sType': "anti-the", 'aTargets' : [ 'anti-the'] }
424                 ]
425             }));
426             if( $("#mana_results_datatable").length && $("td.dataTables_empty").length == 0){
427                 $("#mana_search").html("<p>" + MSG_MANA_SUBSCRIPTION_FOUND + "</p><p> <a href=\"#\" data-toggle=\"modal\" data-target=\"#mana_search_result\"><i class=\"fa fa-window-maximize\"></i> " + MSG_MANA_SHOW_DETAILS + "</a></p>");
428             }
429             else if ( $("#mana_results_datatable").length ){
430                 $("#mana_search").html("<p>" + MSG_MANA_NO_SUBSCRIPTION_FOUND + "</p><p>" + MSG_MANA_SHARE_PATTERN + "</p>");
431             }
432             else{
433                 $("#mana_search").html( result );
434             }
435             $("#mana_search").show();
436         });
437 }
438
439 function mana_use(mana_id){
440     $("tr").removeClass("selected");
441     $("#row"+mana_id).addClass("selected");
442     $.ajax( {
443         type: "POST",
444         url: "/cgi-bin/koha/svc/mana/use",
445         data: {id: mana_id, resource: 'subscription'},
446         dataType: "json",
447     })
448         .done(function(result){
449             var select = document.getElementById('numberpattern');
450             for(i = 0; i < select.length; i++){
451                 if(select[i].value === "mana"){
452                     select.remove(i);
453                 }
454             }
455             var optionnumpattern = document.createElement("option");
456             optionnumpattern.text = result.label + " (mana)";
457             optionnumpattern.selected = true;
458             optionnumpattern.value="mana";
459             select.add(optionnumpattern);
460
461             mananumpatterndata = {
462                 id:"mana",
463                 add1:result.add1,
464                 add2:result.add2,
465                 add3:result.add3,
466                 description:result.sndescription,
467                 displayorder:result.displayorder,
468                 every1:result.every1,
469                 every2:result.every2,
470                 every3:result.every3,
471                 label:result.label,
472                 label1:result.label1,
473                 label2:result.label2,
474                 label3:result.label3,
475                 numbering1:result.numbering1,
476                 numbering2:result.numbering2,
477                 numbering3:result.numbering3,
478                 numberingmethod:result.numberingmethod,
479                 setto1:result.setto1,
480                 setto2:result.setto2,
481                 setto3:result.setto3,
482                 whenmorethan1:result.whenmorethan1,
483                 whenmorethan2:result.whenmorethan2,
484                 whenmorethan3:result.whenmorethan3,
485             };
486             select = document.getElementById("frequency");
487             for(i = 0; i < select.length; i++){
488                 if(select[i].value === "mana"){
489                     select.remove(i);
490                 }
491             }
492             var optionfreq = document.createElement("option");
493             optionfreq.text = result.sfdescription + " (mana)";
494             optionfreq.selected = true;
495             optionfreq.value="mana";
496             select.add(optionfreq);
497             manafreqdata = {
498                 id:"mana",
499                 description:result.sfdescription,
500                 displayorder:result.displayorder,
501                 issuesperunit:result.issuesperunit,
502                 unit:result.unit,
503                 unitsperissue:result.unitsperissue,
504             };
505             manaid = result.id;
506             $("#mana_id").val(manaid);
507             $("#mana_search_result").modal("hide");
508             frequencyload();
509             numberpatternload();
510         })
511         .done( function(){
512             $("tr").removeClass("selected");
513             $(".mana-use i").attr("class","fa fa-download");
514         })
515         .fail( function( result ){
516         });
517 }
518
519 function mana_comment_close(){
520     $("#selected_id").val("");
521     $("#mana-resource-id").val("");
522     $("#mana-comment").val("");
523     $("#mana_results").show();
524     $("#new_mana_comment").hide();
525 }
526
527 function showPredictionPatternTest( data ){
528     $("#displayexample").html(data).show();
529     $("#page_2 > div").attr("class","col-xs-6");
530 }
531
532 function hidePredcitionPatternTest(){
533     $("#displayexample").hide();
534     $("#page_2 > div").attr("class","col-md-10 col-md-offset-1 col-lg-8 col-lg-offset-2");
535 }
536
537 $(document).ready(function() {
538     if ( mana_enabled == 1 ) {
539         mana_search();
540     }
541     $("#displayexample").hide();
542
543     // When Mana search results modal is hidden, hide comment form and any status messages
544     $("#mana_search_result").on("hide.bs.modal", function(){
545         $("#mana_results").show();
546         $("#new_mana_comment").hide();
547         $(".mana_comment_status").hide();
548     });
549
550     $("#aqbooksellerid").on('keypress', function(e) {
551         if (e.keyCode == 13) {
552             e.preventDefault();
553             FindAcqui();
554         }
555     });
556     $("#biblionumber").on('keypress', function(e) {
557         if (e.keyCode == 13) {
558             e.preventDefault();
559             Plugin();
560         }
561     });
562     $("select#frequency").change(function(){
563         patternneedtobetested = 1;
564         $("input[name='enddate']").val('');
565         frequencyload();
566     });
567     $("select#numberpattern").change(function(){
568         patternneedtobetested = 1;
569         numberpatternload();
570     });
571     $("#subtype").change(function(){
572         $("input[name='enddate']").val('');
573     });
574     $("#sublength").change(function(){
575         $("input[name='enddate']").val('');
576     });
577     $("#lastvaluetemp1").keyup(function(){
578         $("#lastvalue1").val($(this).val());
579     });
580     $("#lastvaluetemp2").keyup(function(){
581         $("#lastvalue2").val($(this).val());
582     });
583     $("#lastvaluetemp3").keyup(function(){
584         $("#lastvalue3").val($(this).val());
585     });
586     $("#lastvalue1").keyup(function(){
587         $("#lastvaluetemp1").val($(this).val());
588     });
589     $("#lastvalue2").keyup(function(){
590         $("#lastvaluetemp2").val($(this).val());
591     });
592     $("#lastvalue3").keyup(function(){
593         $("#lastvaluetemp3").val($(this).val());
594     });
595
596     $("#innerlooptemp1").keyup(function(){
597         $("#innerloop1").val($(this).val());
598     });
599     $("#innerlooptemp2").keyup(function(){
600         $("#innerloop2").val($(this).val());
601     });
602     $("#innerlooptemp3").keyup(function(){
603         $("#innerloop3").val($(this).val());
604     });
605     $("#innerloop1").keyup(function(){
606         $("#innerlooptemp1").val($(this).val());
607     });
608     $("#innerloop2").keyup(function(){
609         $("#innerlooptemp2").val($(this).val());
610     });
611     $("#innerloop3").keyup(function(){
612         $("#innerlooptemp3").val($(this).val());
613     });
614
615     if($("#frequency").val() != ""){
616         frequencyload();
617     }
618     if($("#numberpattern").val() != ""){
619         numberpatternload();
620     }
621
622     if( tags.length > 0 ){
623         tags.forEach( function( item ) {
624             var node = $("[name='" + item + "']");
625             if ( $(node).is('input') || $(node).is('textarea') ) {
626                 $(node).val("");
627             } else if ( $(node).is('select') ) {
628                 $(node).find("option:first").attr('selected','selected');
629             }
630         });
631     }
632
633     $("#mana_search").hide();
634
635     show_page_1();
636     $("#subscription_add_form").on("submit",function(){
637         return Check_page2();
638     });
639     $("#vendor_search").on("click",function(e){
640         e.preventDefault();
641         FindAcqui();
642     });
643     $("#record_search").on("click",function(e){
644         e.preventDefault();
645         Plugin();
646     });
647     $("#biblio_add_edit").on("click",function(e){
648         e.preventDefault();
649         if( $(this).data("biblionumber") ){
650             addbiblioPopup( $(this).data("biblionumber") );
651         } else {
652             addbiblioPopup();
653         }
654     });
655     $("#subscription_add_next").on("click",function(){
656         if ( Check_page1() ){
657             if ( mana_enabled == 1 ) {
658                 mana_search();
659             }
660             show_page_2();
661         }
662     });
663     $("#subscription_add_previous").on("click",function(){
664         show_page_1();
665     });
666     $(".toggle_advanced_pattern").on("click",function(e){
667         e.preventDefault();
668         $("#advancedpredictionpattern").toggle();
669         $(".toggle_advanced_pattern").toggle();
670     });
671     $("#modifyadvancedpatternbutton").on("click",function(e){
672         e.preventDefault();
673         modifyAdvancedPattern();
674     });
675     $("#restoreadvancedpatternbutton").on("click",function(e){
676         e.preventDefault();
677         restoreAdvancedPattern();
678     });
679     $("#saveadvancedpatternbutton").on("click",function(e){
680         e.preventDefault();
681         saveAdvancedPattern();
682     });
683     $("#testpatternbutton").on("click",function(e){
684         e.preventDefault();
685         testPredictionPattern();
686     });
687     $('#save-subscription').on("click", function(e){
688         $('select:disabled').removeAttr('disabled');
689     });
690
691     $("body").on("click", ".mana-use", function(e) {
692         e.preventDefault();
693         $(this).find("i").attr("class","fa fa-refresh fa-spin");
694         var subscription_id = $(this).data("subscription_id");
695         mana_use( subscription_id );
696     });
697
698     $("#displayexample").on("click", "#hidepredictionpattern", function(e){
699         e.preventDefault();
700         hidePredcitionPatternTest();
701     });
702
703     $("#biblionumber").on("change", function(){
704         var biblionumber = $(this).val();
705         $.ajax({
706             url: "/api/v1/biblios/" + biblionumber,
707             type: "GET",
708             headers: {
709               Accept: "application/json",
710             },
711             contentType: "application/json",
712             success: function (biblio) {
713                 $("input[name='title']").val(biblio['title']);
714                 $("#error_bib_not_exist").html("");
715             },
716             error: function (x) {
717                 $("input[name='title']").val('');
718                 $("#error_bib_not_exist").html("This bibliographic record does not exist");
719             }
720         });
721     });
722
723 });