Bug 17047: subscriptions management with Mana-KB
[koha.git] / koha-tmpl / intranet-tmpl / prog / js / subscription-add.js
1 /* global irregularity more_than_one_serial subscriptionid tags */
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(_("If you wish to claim late or missing issues you must link this subscription to a vendor. Click OK to ignore or Cancel to return and enter a vendor"));
51         if (input_box==false) {
52             return false;
53         }
54     }
55     if ($("#biblionumber").val().length == 0) {
56         alert(_("You must choose or create a biblio"));
57         return false;
58     }
59
60     return true;
61 }
62
63 function Check_page2(){
64     if( more_than_one_serial == "" ){
65         if($("#acqui_date").val().length == 0){
66             alert(_("You must choose a first publication date"));
67             return false;
68         }
69     }
70     if($("#sublength").val().length == 0 && $("input[name='enddate']").val().length == 0){
71         alert(_("You must choose a subscription length or an end date."));
72         return false;
73     }
74     if(advancedpatternlocked == 0){
75         alert(_("You have modified the advanced prediction pattern. Please save your work or cancel modifications."));
76         return false;
77     }
78     if(patternneedtobetested){
79         if( irregularity !== "" ){
80            alert(_("Warning! Present pattern has planned irregularities. Click on 'Test prediction pattern' to check if it's still valid"));
81         } else {
82             alert(_("Please click on 'Test prediction pattern' before saving subscription."));
83         }
84         return false;
85     }
86
87     return true;
88 }
89
90 function frequencyload(){
91     if ($("#frequency option:selected").val() === "mana"){
92         globalfreqdata=manafreqdata;
93         $("input[name='sfdescription']").val(manafreqdata.description);
94         $("input[name='unit']").val(manafreqdata.unit);
95         $("input[name='unitsperissue']").val(manafreqdata.unitsperissue);
96         $("input[name='issuesperunit']").val(manafreqdata.issuesperunit);
97         if ($( "#numberpattern option:selected" ).val() === "mana" ) {
98             $("input[name='mana_id']").val(manaid);
99         }
100     } else {
101         $.getJSON("subscription-frequency.pl",{"frequency_id":document.f.frequency.value,ajax:'true'},
102             function(freqdata){
103                 globalfreqdata=freqdata;
104                 if ( globalfreqdata.unit && globalfreqdata.unit.length == 0 ) {
105                     var option = $("#subtype option[value='issues']");
106                     $(option).attr('selected', 'selected');
107                     $("#subtype option[value!='issues']").prop('disabled', true);
108                 } else {
109                     $("#subtype option").prop('disabled', false);
110                 }
111             }
112         );
113         $("input[name='mana_id']").val("");
114     }
115 }
116
117 function numberpatternload(){
118     if($("#numberpattern option:selected" ).val() === "mana"){
119         globalnumpatterndata=mananumpatterndata;
120         $("input[name='sndescription']").val(mananumpatterndata.description);
121         if($("#frequency option:selected" ).val() === "mana"){
122             $("input[name='mana_id']").val(manaid);
123         }
124         if (globalnumpatterndata==undefined){
125             return false;
126         }
127         displaymoreoptions();
128         restoreAdvancedPattern();
129     } else {
130         $.getJSON("subscription-numberpattern.pl",{"numberpattern_id":document.f.numbering_pattern.value,ajax:'true'},
131             function(numpatterndata){
132                 globalnumpatterndata=numpatterndata;
133                 if (globalnumpatterndata==undefined){
134                     return false;
135                 }
136                 displaymoreoptions();
137                 restoreAdvancedPattern();
138             }
139         );
140         $("input[name='mana_id']").val("");
141     }
142 }
143
144 function displaymoreoptions() {
145     if(globalnumpatterndata == undefined){
146         $("#moreoptionst").hide();
147         return false;
148     }
149
150     var X = 0, Y = 0, Z = 0;
151     var numberingmethod = globalnumpatterndata.numberingmethod;
152     if(numberingmethod.match(/{X}/)) X = 1;
153     if(numberingmethod.match(/{Y}/)) Y = 1;
154     if(numberingmethod.match(/{Z}/)) Z = 1;
155
156     if(X || Y || Z) {
157         $("#moreoptionst").show();
158     } else {
159         $("#moreoptionst").hide();
160     }
161
162     if(X) {
163         if(globalnumpatterndata.label1) {
164             $("#headerX").html(globalnumpatterndata.label1);
165         } else {
166             $("#headerX").html("X");
167         }
168         $("#headerX").show();
169         $("#beginsX").show();
170         $("#innerX").show();
171     } else {
172         $("#headerX").hide();
173         $("#beginsX").hide();
174         $("#innerX").hide();
175         $("#lastvaluetemp1").val('');
176         $("#innerlooptemp1").val('');
177     }
178     if(Y) {
179         if(globalnumpatterndata.label2) {
180             $("#headerY").html(globalnumpatterndata.label2);
181         } else {
182             $("#headerY").html("Y");
183         }
184         $("#headerY").show();
185         $("#beginsY").show();
186         $("#innerY").show();
187     } else {
188         $("#headerY").hide();
189         $("#beginsY").hide();
190         $("#innerY").hide();
191         $("#lastvaluetemp2").val('');
192         $("#innerlooptemp2").val('');
193     }
194     if(Z) {
195         if(globalnumpatterndata.label3) {
196             $("#headerZ").html(globalnumpatterndata.label3);
197         } else {
198             $("#headerZ").html("Z");
199         }
200         $("#headerZ").show();
201         $("#beginsZ").show();
202         $("#innerZ").show();
203     } else {
204         $("#headerZ").hide();
205         $("#beginsZ").hide();
206         $("#innerZ").hide();
207         $("#lastvaluetemp3").val('');
208         $("#innerlooptemp3").val('');
209     }
210 }
211
212 function modifyAdvancedPattern() {
213     $("#patternname").prop('readOnly', false).val('');
214     $("#numberingmethod").prop('readOnly', false);
215
216     $("#advancedpredictionpatternt input").each(function() {
217         $(this).prop('readOnly', false);
218     });
219     $("#advancedpredictionpatternt select").each(function() {
220         $(this).prop('disabled', false);
221     });
222
223     $("#restoreadvancedpatternbutton").show();
224     $("#saveadvancedpatternbutton").show();
225     $("#modifyadvancedpatternbutton").hide();
226
227     advancedpatternlocked = 0;
228 }
229
230 function restoreAdvancedPattern() {
231     $("#patternname").prop('readOnly', true).val(globalnumpatterndata.label);
232     $("#numberingmethod").prop('readOnly', true).val(globalnumpatterndata.numberingmethod);
233
234     $("#advancedpredictionpatternt input").each(function() {
235         $(this).prop('readOnly', true);
236         var id = $(this).attr('id');
237         if(id.match(/lastvalue/) || id.match(/innerloop/)) {
238             var tempid = id.replace(/(\d)/, "temp$1");
239             $(this).val($("#"+tempid).val());
240         } else {
241             $(this).val(globalnumpatterndata[id]);
242         }
243     });
244     $("#advancedpredictionpatternt select").each(function() {
245         $(this).prop('disabled', true);
246         var id = $(this).attr('id');
247         $(this).val(globalnumpatterndata[id]);
248     });
249
250     $("#restoreadvancedpatternbutton").hide();
251     $("#saveadvancedpatternbutton").hide();
252     $("#modifyadvancedpatternbutton").show();
253
254     advancedpatternlocked = 1;
255 }
256
257 function testPredictionPattern() {
258     var frequencyid = $("#frequency").val();
259     var acquidate;
260     var error = 0;
261     var error_msg = "";
262     if(frequencyid == undefined || frequencyid == ""){
263         error_msg += _("- Frequency is not defined") + "\n";
264         error ++;
265     }
266     acquidate = $("#acqui_date").val();
267     if(acquidate == undefined || acquidate == ""){
268         error_msg += _("- First publication date is not defined") + "\n";
269         error ++;
270     }
271     if( more_than_one_serial !== "" ){
272         var nextacquidate = $("#nextacquidate").val();
273         if(nextacquidate == undefined || nextacquidate == ""){
274             error_msg += _("- Next issue publication date is not defined") + "\n";
275             error ++;
276         }
277     }
278
279     if(error){
280         alert(_("Cannot test prediction pattern for the following reason(s): %s").format(error_msg));
281         return false;
282     }
283
284     var custompattern = 0;
285     if(advancedpatternlocked == 0) {
286         custompattern = 1;
287     }
288
289     var ajaxData = {
290         'custompattern': custompattern,
291         'firstacquidate': acquidate
292     };
293
294     if( subscriptionid !== "" ){
295         ajaxData.subscriptionid = subscriptionid;
296     }
297     if( more_than_one_serial !== "" ){
298         ajaxData.nextacquidate = nextacquidate;
299     }
300
301
302     var ajaxParams = [
303         'to', 'subtype', 'sublength', 'frequency', 'numberingmethod',
304         'lastvalue1', 'lastvalue2', 'lastvalue3', 'add1', 'add2', 'add3',
305         'every1', 'every2', 'every3', 'innerloop1', 'innerloop2', 'innerloop3',
306         'setto1', 'setto2', 'setto3', 'numbering1', 'numbering2', 'numbering3',
307         'whenmorethan1', 'whenmorethan2', 'whenmorethan3', 'locale',
308         'sfdescription', 'unitsperissue', 'issuesperunit', 'unit'
309     ];
310     for(i in ajaxParams) {
311         var param = ajaxParams[i];
312         var value = $("#"+param).val();
313         if(value.length > 0)
314             ajaxData[param] = value;
315     }
316
317     $.ajax({
318         url:"/cgi-bin/koha/serials/showpredictionpattern.pl",
319         data: ajaxData,
320         success: function(data) {
321             $("#displayexample").html(data).show();
322             patternneedtobetested = 0;
323         }
324     });
325 }
326
327 function saveAdvancedPattern() {
328     if ($("#patternname").val().length == 0) {
329         alert(_("Please enter a name for this pattern"));
330         return false;
331     }
332
333     // Check if patternname already exists, and modify pattern
334     // instead of creating it if so
335     var found = 0;
336     $("#numberpattern option").each(function(){
337         if($(this).text() == $("#patternname").val()){
338             found = 1;
339             return false;
340         }
341     });
342     var cnfrm = 1;
343     if(found){
344         var msg = _("This pattern name already exists. Do you want to modify it?")
345             + "\n" + _("Warning: it will modify the pattern for all subscriptions that are using it.");
346         cnfrm = confirm(msg);
347     }
348
349     if(cnfrm) {
350         var ajaxData = {};
351         var ajaxParams = [
352             'patternname', 'numberingmethod', 'label1', 'label2', 'label3',
353             'add1', 'add2', 'add3', 'every1', 'every2', 'every3',
354             'setto1', 'setto2', 'setto3', 'numbering1', 'numbering2', 'numbering3',
355             'whenmorethan1', 'whenmorethan2', 'whenmorethan3', 'locale'
356         ];
357         for(i in ajaxParams) {
358             var param = ajaxParams[i];
359             var value = $("#"+param).val();
360             if(value.length > 0)
361                 ajaxData[param] = value;
362         }
363
364         $.getJSON(
365             "/cgi-bin/koha/serials/create-numberpattern.pl",
366             ajaxData,
367             function(data){
368                 if (data.numberpatternid) {
369                     if(found == 0){
370                         $("#numberpattern").append("<option value=\""+data.numberpatternid+"\">"+$("#patternname").val()+"</option>");
371                     }
372                     $("#numberpattern").val(data.numberpatternid);
373                     numberpatternload();
374                 } else {
375                     alert(_("Something went wrong. Unable to create a new numbering pattern."));
376                 }
377             }
378         );
379     }
380 }
381
382 function show_page_1() {
383     $("#page_1").show();
384     $("#page_2").hide();
385     $("#page_number").text("1/2");
386 }
387
388 function show_page_2() {
389     $("#page_1").hide();
390     $("#page_2").show();
391     $("#page_number").text("2/2");
392     displaymoreoptions();
393 }
394
395 function mana_search() {
396     $.ajax({
397         type: "POST",
398         url: "/cgi-bin/koha/svc/mana/search",
399         data: {biblionumber : $("#biblionumber").val()},
400         dataType: "html",
401     })
402     .done( function( result ) {
403     $("#mana_search_result .modal-body").html(result);
404         $("#mana_search_result_label").text("Results from Mana");
405         $("#mana_results_datatable").dataTable($.extend(true, {}, dataTablesDefaults, {
406             "sPaginationType": "four_button",
407             "aoColumnDefs": [
408                 { 'bSortable': false, "bSearchable": false, 'aTargets': [ 'NoSort' ] },
409                 { "sType": "title-string", "aTargets" : [ "title-string" ] },
410                 { 'sType': "anti-the", 'aTargets' : [ 'anti-the'] }
411             ]
412         }));
413         if($("td.dataTables_empty").length == 0){
414             $("#mana_search").show();
415         }
416     }).fail(function(result){
417     });
418 }
419
420 function mana_use(mana_id){
421     $("tr").removeClass("selected");
422     $("#row"+mana_id).addClass("selected");
423     $.ajax( {
424         type: "POST",
425         url: "/cgi-bin/koha/svc/mana/use",
426         data: {id : mana_id},
427         dataType: "json",
428     })
429     .done(function(result){
430         var select = document.getElementById('numberpattern');
431         for(i = 0; i < select.length; i++){
432             if(select[i].value === "mana"){
433                 select.remove(i);
434             }
435         }
436         var optionnumpattern = document.createElement("option");
437         optionnumpattern.text = result.label + " (mana)";
438         optionnumpattern.selected = true;
439         optionnumpattern.value="mana";
440         select.add(optionnumpattern);
441
442         mananumpatterndata = {
443             id:"mana",
444             add1:result.add1,
445             add2:result.add2,
446             add3:result.add3,
447             description:result.sndescription,
448             displayorder:result.displayorder,
449             every1:result.every1,
450             every2:result.every2,
451             every3:result.every3,
452             label:result.label,
453             label1:result.label1,
454             label2:result.label2,
455             label3:result.label3,
456             numbering1:result.numbering1,
457             numbering2:result.numbering2,
458             numbering3:result.numbering3,
459             numberingmethod:result.numberingmethod,
460             setto1:result.setto1,
461             setto2:result.setto2,
462             setto3:result.setto3,
463             whenmorethan1:result.whenmorethan1,
464             whenmorethan2:result.whenmorethan2,
465             whenmorethan3:result.whenmorethan3,
466         };
467         select = document.getElementById("frequency");
468         for(i = 0; i < select.length; i++){
469             if(select[i].value === "mana"){
470                 select.remove(i);
471             }
472         }
473         var optionfreq = document.createElement("option");
474         optionfreq.text = result.sfdescription + " (mana)";
475         optionfreq.selected = true;
476         optionfreq.value="mana";
477         select.add(optionfreq);
478         manafreqdata = {
479             id:"mana",
480             description:result.sfdescription,
481             displayorder:result.displayorder,
482             issuesperunit:result.issuesperunit,
483             unit:result.unit,
484             unitsperissue:result.unitsperissue,
485         };
486         manaid = result.id;
487         $("input[name='mana_id']").val(manaid);
488         $("#mana_search_result").modal("hide");
489         frequencyload();
490         numberpatternload();
491     }).fail( function( result ){
492     });
493 }
494
495 function removeDisabledAttr() {
496     $('select:disabled').removeAttr('disabled');
497 }
498
499 $(document).ready(function() {
500     $("#displayexample").hide();
501     $("#mana_search_result").modal("hide");
502     $("#aqbooksellerid").on('keypress', function(e) {
503         if (e.keyCode == 13) {
504             e.preventDefault();
505             FindAcqui();
506         }
507     });
508     $("#biblionumber").on('keypress', function(e) {
509         if (e.keyCode == 13) {
510             e.preventDefault();
511             Plugin();
512         }
513     });
514     $("select#frequency").change(function(){
515         patternneedtobetested = 1;
516         $("input[name='enddate']").val('');
517         frequencyload();
518     });
519     $("select#numberpattern").change(function(){
520         patternneedtobetested = 1;
521         numberpatternload();
522     });
523     $("#subtype").change(function(){
524         $("input[name='enddate']").val('');
525     });
526     $("#sublength").change(function(){
527         $("input[name='enddate']").val('');
528     });
529     $("#lastvaluetemp1").keyup(function(){
530         $("#lastvalue1").val($(this).val());
531     });
532     $("#lastvaluetemp2").keyup(function(){
533         $("#lastvalue2").val($(this).val());
534     });
535     $("#lastvaluetemp3").keyup(function(){
536         $("#lastvalue3").val($(this).val());
537     });
538     $("#lastvalue1").keyup(function(){
539         $("#lastvaluetemp1").val($(this).val());
540     });
541     $("#lastvalue2").keyup(function(){
542         $("#lastvaluetemp2").val($(this).val());
543     });
544     $("#lastvalue3").keyup(function(){
545         $("#lastvaluetemp3").val($(this).val());
546     });
547
548     $("#innerlooptemp1").keyup(function(){
549         $("#innerloop1").val($(this).val());
550     });
551     $("#innerlooptemp2").keyup(function(){
552         $("#innerloop2").val($(this).val());
553     });
554     $("#innerlooptemp3").keyup(function(){
555         $("#innerloop3").val($(this).val());
556     });
557     $("#innerloop1").keyup(function(){
558         $("#innerlooptemp1").val($(this).val());
559     });
560     $("#innerloop2").keyup(function(){
561         $("#innerlooptemp2").val($(this).val());
562     });
563     $("#innerloop3").keyup(function(){
564         $("#innerlooptemp3").val($(this).val());
565     });
566
567     if($("#frequency").val() != ""){
568         frequencyload();
569     }
570     if($("#numberpattern").val() != ""){
571         numberpatternload();
572     }
573
574     if( tags.length > 0 ){
575         tags.forEach( function( item ) {
576             var node = $("[name='" + item + "']");
577             if ( $(node).is('input') || $(node).is('textarea') ) {
578                 $(node).val("");
579             } else if ( $(node).is('select') ) {
580                 $(node).find("option:first").attr('selected','selected');
581             }
582         });
583     }
584
585     $("#mana_search").hide();
586
587     show_page_1();
588     $("#subscription_add_form").on("submit",function(){
589         return Check_page2();
590     });
591     $("#vendor_search").on("click",function(e){
592         e.preventDefault();
593         FindAcqui();
594     });
595     $("#record_search").on("click",function(e){
596         e.preventDefault();
597         Plugin();
598     });
599     $("#biblio_add_edit").on("click",function(e){
600         e.preventDefault();
601         if( $(this).data("biblionumber") ){
602             addbiblioPopup( $(this).data("biblionumber") );
603         } else {
604             addbiblioPopup();
605         }
606     });
607     $("#subscription_add_next").on("click",function(){
608         if ( Check_page1() ){
609             [% IF Koha.Preference('Mana') %]
610                 mana_search();
611             [% END %]
612             show_page_2();
613         }
614     });
615     $("#subscription_add_previous").on("click",function(){
616         show_page_1();
617     });
618     $(".toggle_advanced_pattern").on("click",function(e){
619         e.preventDefault();
620         $("#advancedpredictionpattern").toggle();
621         $(".toggle_advanced_pattern").toggle();
622     });
623     $("#modifyadvancedpatternbutton").on("click",function(e){
624         e.preventDefault();
625         modifyAdvancedPattern();
626     });
627     $("#restoreadvancedpatternbutton").on("click",function(e){
628         e.preventDefault();
629         restoreAdvancedPattern();
630     });
631     $("#saveadvancedpatternbutton").on("click",function(e){
632         e.preventDefault();
633         saveAdvancedPattern();
634     });
635     $("#testpatternbutton").on("click",function(e){
636         e.preventDefault();
637         testPredictionPattern();
638     });
639 });