Bug 16516: Define the showListsUpdate JS function at the OPAC
[koha.git] / koha-tmpl / opac-tmpl / bootstrap / js / basket.js
1 //////////////////////////////////////////////////////////////////////////////
2 // BASIC FUNCTIONS FOR COOKIE MANAGEMENT //
3 //////////////////////////////////////////////////////////////////////////////
4
5 function basketCount(){
6     var valCookie = readCookie("bib_list");
7     if(valCookie){
8         var arrayRecords = valCookie.split("/");
9         if(arrayRecords.length > 0){
10             var basketcount = arrayRecords.length-1;
11         } else {
12             var basketcount = 0;
13         }
14     } else {
15             var basketcount = 0;
16     }
17     return basketcount;
18 }
19
20 function writeCookie(name, val, wd) {
21     if (wd) {
22         parent.opener.document.cookie = name + "=" + val;
23     }
24     else {
25         parent.document.cookie = name + "=" + val;
26     }
27 }
28
29 function readCookieValue (str, val_beg) {
30     var val_end = str.indexOf(";", val_end);
31     if (val_end == -1)
32         val_end = str.length;
33     return str.substring(val_beg, val_end);
34 }
35
36 function readCookie(name, wd) {
37     var str_name = name + "=";
38     var str_len = str_name.length;
39     var str_cookie = "";
40     if (wd) {
41         str_cookie = parent.opener.document.cookie;
42     }
43     else {
44         str_cookie = parent.document.cookie;
45     }
46         // fixed - getting the part of the basket that is bib_list
47         var cookie_parts = str_cookie.split(";");
48             for(var i=0;i < cookie_parts.length;i++) {
49                 var c = cookie_parts[i];
50                     while (c.charAt(0)==' ') c = c.substring(1,c.length);
51             if(c.indexOf(str_name) == 0) return c.substring(str_name.length,c.length);
52             }
53     return null;
54 }
55
56 function delCookie(name) {
57     var exp = new Date();
58     exp.setTime(exp.getTime()-1);
59     if(parent.opener){
60         parent.opener.document.cookie = name + "=null; expires=" + exp.toGMTString();
61     } else {
62         document.cookie = name + "=null; expires=" + exp.toGMTString();
63     }
64 }
65
66 ///////////////////////////////////////////////////////////////////
67 // SPECIFIC FUNCTIONS USING COOKIES //
68 ///////////////////////////////////////////////////////////////////
69
70 function openBasket() {
71     var strCookie = "";
72     var nameCookie = "bib_list";
73     var valCookie = readCookie(nameCookie);
74     if ( valCookie ) {
75         strCookie = nameCookie + "=" + valCookie;
76     }
77
78     if ( strCookie ) {
79         var iW = 820;
80         var iH = 450;
81         var optWin = "status=yes,scrollbars=yes,resizable=yes,toolbar=no,location=yes,height="+iH+",width="+iW;
82         var loc = "/cgi-bin/koha/opac-basket.pl?" + strCookie;
83         var basket = open(loc, "basket", optWin);
84         if (window.focus) {basket.focus()}
85     }
86     else {
87         showCartUpdate(MSG_BASKET_EMPTY);
88     }
89 }
90
91 function addRecord(val, selection,NoMsgAlert) {
92     var nameCookie = "bib_list";
93     var valCookie = readCookie(nameCookie);
94     var write = 0;
95
96     if ( ! valCookie ) { // empty basket
97         valCookie = val + '/';
98         write = 1;
99         updateBasket(1);
100     }
101     else {
102         // is this record already in the basket ?
103         var found = false;
104         var arrayRecords = valCookie.split("/");
105         for (var i = 0; i < valCookie.length - 1; i++) {
106             if (val == arrayRecords[i]) {
107                 found = true;
108                 break;
109             }
110         }
111         if ( found ) {
112             if (selection) {
113                 return 0;
114             }
115             if (! NoMsgAlert ) {
116                 showCartUpdate(MSG_RECORD_IN_BASKET);
117             }
118         }
119         else {
120             valCookie += val + '/';
121             write = 1;
122             updateBasket(arrayRecords.length);
123         }
124     }
125
126     if (write) {
127         writeCookie(nameCookie, valCookie);
128         if (selection) { // when adding a selection of records
129             updateLink(val,"add");
130             return 1;
131         }
132         if (! NoMsgAlert ) {
133             showCartUpdate(MSG_RECORD_ADDED);
134             updateLink(val,"add");
135         }
136
137     }
138 }
139
140 function AllAreChecked(s){
141     if (! s.length) { return false;}
142     var l = s.length;
143     for (var i=0; i < l; i++) {
144         if(! s[i].checked) { return false; }
145     }
146     return true;
147 }
148
149 function SelectAll(){
150     if(document.bookbag_form.biblionumber.length > 0) {
151         var checky = AllAreChecked(document.bookbag_form.biblionumber);
152         var l = document.bookbag_form.biblionumber.length;
153         for (var i=0; i < l; i++) {
154             document.bookbag_form.biblionumber[i].checked = (checky) ? false : true;
155         }
156     }
157 }
158
159 function addMultiple(){
160     var c_value = "";
161     if(document.bookbag_form.biblionumber.length > 0) {
162         for (var i=0; i < document.bookbag_form.biblionumber.length; i++) {
163             if (document.bookbag_form.biblionumber[i].checked) {
164                 c_value = c_value + document.bookbag_form.biblionumber[i].value + "/";
165             }
166         }
167         addSelRecords(c_value);
168     } else {
169         c_value = c_value + document.bookbag_form.biblionumber.value + "/";
170         addSelRecords(c_value);
171     }
172 }
173
174 function addSelRecords(valSel) { // function for adding a selection of biblios to the basket
175                                                 // from the results list
176     var arrayRecords = valSel.split("/");
177     var i = 0;
178     var nbAdd = 0;
179     for (i=0;i<arrayRecords.length;i++) {
180         if (arrayRecords[i]) {
181             nbAdd += addRecord(arrayRecords[i], 1);
182         }
183         else {
184             break;
185         }
186     }
187     var msg = "";
188     if (nbAdd) {
189         if (i > nbAdd) {
190             msg = nbAdd+" "+MSG_NRECORDS_ADDED+", "+(i-nbAdd)+" "+MSG_NRECORDS_IN_BASKET;
191         }
192         else {
193             msg = nbAdd+" "+MSG_NRECORDS_ADDED;
194         }
195     }
196     else {
197         if (i < 1) {
198             msg = MSG_NO_RECORD_SELECTED;
199         }
200         else {
201             msg = MSG_NO_RECORD_ADDED+" ("+MSG_NRECORDS_IN_BASKET+") !";
202         }
203     }
204     showCartUpdate(msg);
205 }
206
207 function showCartUpdate(msg){
208     // set body of popup window
209     $("#cartDetails").html(msg);
210     $("#cartmenuitem").html(MSG_IN_YOUR_CART + " " + basketCount());
211     showCart();
212     setTimeout("hideCart()",2000);
213 }
214
215 function showListsUpdate(msg){
216        // set body of popup window
217        alert(msg);
218 }
219
220 function selRecord(num, status) {
221     var str = document.myform.records.value
222     if (status){
223         str += num+"/";
224     }
225     else {
226         str = delRecord(num, str);
227     }
228
229     document.myform.records.value = str;
230 }
231
232 function delSingleRecord(biblionumber){
233     var nameCookie = "bib_list";
234     var valCookie = readCookie(nameCookie);
235     var arrayRecords = valCookie.split("/");
236     var pos = jQuery.inArray(biblionumber,arrayRecords);
237     arrayRecords.splice(pos,1);
238     valCookie = arrayRecords.join("/");
239     writeCookie( nameCookie, valCookie );
240     updateBasket( arrayRecords.length-1 );
241     updateLink(biblionumber,"del");
242     showCartUpdate(MSG_RECORD_REMOVED);
243 }
244
245 function delSelRecords() {
246     var recordsSel = 0;
247     var end = 0;
248     var nameCookie = "bib_list";
249     var valCookie = readCookie(nameCookie, 1);
250     if (valCookie) {
251         var str = document.myform.records.value;
252         if (str.length > 0){
253             recordsSel = 1;
254             var str2 = valCookie;
255             while (!end){
256                 s = str.indexOf("/");
257                 if (s>0){
258                     num = str.substring(0, s);
259                     str = delRecord(num,str);
260                     str2 = delRecord(num,str2);
261                     updateLink(num,"del",top.opener);
262                 } else {
263                     end = 1;
264                 }
265             }
266
267             if (str2.length == 0) { // equivalent to emptying the basket
268                 var rep = false;
269                 rep = confirm(MSG_CONFIRM_DEL_BASKET);
270                 if (rep) {
271                     delCookie(nameCookie);
272                     document.location = "about:blank";
273                     updateBasket(0,top.opener);
274                     window.close();
275                 } else {
276                     return;
277                 }
278             } else {
279                 writeCookie(nameCookie, str2, 1);
280             }
281         }
282     }
283
284     if (recordsSel) {
285         var strCookie = "";
286         var nameCookie = "bib_list";
287         var valCookie = readCookie(nameCookie, 1);
288         strCookie = nameCookie + "=" + valCookie;
289         var arrayRecords = valCookie.split("/");
290         updateBasket(arrayRecords.length-1,top.opener);
291         document.location = "/cgi-bin/koha/opac-basket.pl?" + strCookie;
292     }
293     else {
294         alert(MSG_NO_RECORD_SELECTED);
295     }
296 }
297
298 function delRecord (n, s) {
299     var re = /\d/;
300     var aux = s;
301     var found = 0;
302     var pos = -1;
303
304     while (!found) {
305         pos = aux.indexOf(n, pos+1);
306         var charAfter = aux.charAt(pos+n.length); // character right after the researched string
307         if (charAfter.match(re)) { // record number inside another one
308             continue;
309         }
310         else { // good record number
311             aux = s.substring(0, pos)+ s.substring(pos+n.length+1, s.length);
312             s = aux;
313             found = 1;
314         }
315     }
316
317     return s;
318 }
319
320
321 function delBasket() {
322     var nameCookie = "bib_list";
323
324     var rep = false;
325     rep = confirm(MSG_CONFIRM_DEL_BASKET);
326     if (rep) {
327         delCookie(nameCookie);
328         updateAllLinks(top.opener);
329         document.location = "about:blank";
330         updateBasket(0,top.opener);
331         window.close();
332     }
333 }
334
335
336 function quit() {
337     if (document.myform.records.value) {
338         var rep = false;
339         rep = confirm(MSG_CONFIRM_DEL_RECORDS);
340         if (rep) {
341             delSelRecords();
342         }
343     }
344     updateBasket(arrayRecords.length-1,top.opener);
345     window.close();
346 }
347
348 function sendBasket() {
349     var nameCookie = "bib_list";
350     var valCookie = readCookie(nameCookie);
351     var strCookie = nameCookie + "=" + valCookie;
352
353     var loc = "/cgi-bin/koha/opac-sendbasket.pl?" + strCookie;
354
355     var optWin="scrollbars=yes,resizable=yes,height=600,width=900,top=50,left=100";
356     var win_form = open(loc,"win_form",optWin);
357 }
358
359 function downloadBasket() {
360     var nameCookie = "bib_list";
361     var valCookie = readCookie(nameCookie);
362     var strCookie = nameCookie + "=" + valCookie;
363
364     var loc = "/cgi-bin/koha/opac-downloadcart.pl?" + strCookie;
365
366     open(loc,"win_form",'scrollbars=no,resizable=no,height=300,width=450,top=50,left=100');
367 }
368
369 function printBasket() {
370     var loc = document.location + "&print=1";
371     document.location = loc;
372 }
373
374 function showMore() {
375     var strCookie = "";
376
377     var nameCookie = "bib_list";
378     var valCookie = readCookie(nameCookie);
379     if (valCookie) {
380         strCookie = nameCookie + "=" + valCookie;
381     }
382     var loc = "/cgi-bin/koha/opac-basket.pl?" + strCookie + "&verbose=1";
383     document.location = loc;
384 }
385
386 function showLess() {
387     var strCookie = "";
388
389     var nameCookie = "bib_list";
390     var valCookie = readCookie(nameCookie);
391     if (valCookie) {
392         strCookie = nameCookie + "=" + valCookie;
393     }
394     var loc = "/cgi-bin/koha/opac-basket.pl?" + strCookie + "&verbose=0";
395     document.location = loc;
396 }
397
398 function holdSel() {
399     var items = document.getElementById('records').value;
400     if (items) {
401         parent.opener.document.location = "/cgi-bin/koha/opac-reserve.pl?biblionumbers=" + items;
402         window.close();
403     } else {
404         alert(MSG_NO_RECORD_SELECTED);
405     }
406 }
407
408 function updateBasket(updated_value,target) {
409     if(updated_value > 0){
410         bcount = "<span>"+updated_value+"</span>";
411     } else {
412         bcount = "";
413     }
414     if(target){
415         target.$('#basketcount').html(bcount);
416         target.$('.cart-message').html(MSG_IN_YOUR_CART+updated_value);
417     } else {
418         $('#basketcount').html(bcount);
419         $('.cart-message').html(MSG_IN_YOUR_CART+updated_value);
420     }
421 }
422
423 function openBiblio(dest,biblionumber) {
424     openerURL=dest+"?biblionumber="+biblionumber;
425     opener.document.location = openerURL;
426     opener.focus();
427 }
428
429 function addSelToShelf() {
430     var items = document.getElementById('records').value;
431     if(items){
432         var iW = 820;
433         var iH = 450;
434         var optWin = "status=yes,scrollbars=yes,resizable=yes,toolbar=no,location=yes,height="+iH+",width="+iW;
435         var loc = "/cgi-bin/koha/opac-addbybiblionumber.pl?biblionumber="+items;
436         var shelf = open(loc, "shelf", optWin);
437     } else {
438         alert(MSG_NO_RECORD_SELECTED);
439     }
440 }
441
442 ///  vShelfAdd()  builds url string for multiple-biblio adds.
443
444 function vShelfAdd() {
445         bibs= new Array;
446         if(document.bookbag_form.biblionumber.length > 0) {
447                 for (var i=0; i < document.bookbag_form.biblionumber.length; i++) {
448                         if (document.bookbag_form.biblionumber[i].checked) {
449                                 bibs.push("biblionumber=" +  document.bookbag_form.biblionumber[i].value);
450                         }
451                 }
452         if (bibs.length == 0) { showListsUpdate(MSG_NO_RECORD_SELECTED); }
453             return bibs.join("&");
454         } else {
455             if (document.bookbag_form.biblionumber.checked) {
456                 return "biblionumber=" + document.bookbag_form.biblionumber.value;
457             }
458         }
459 }
460
461 function showCart(){
462     var position = $("#cartmenulink").offset();
463     var scrolld = $(window).scrollTop();
464     var top = position.top + $("#cartmenulink").outerHeight();
465     if( scrolld > top ){
466         top = scrolld + 15;
467     }
468     var menuWidth = 200;
469     var buttonWidth = $("#cartmenulink").innerWidth();
470     var buttonOffset = menuWidth - buttonWidth;
471     var left = position.left -  0 // buttonOffset;
472     $("#cartDetails")
473         .css({"position":"absolute", "top":top, "left":left})
474         .fadeIn("fast");
475 }
476
477 function hideCart(){
478     $("#cartDetails").fadeOut("fast");
479 }
480
481 function updateLink(val,op,target){
482     if(target){
483         if(op == "add"){
484             target.$("a.cart"+val).html(MSG_ITEM_IN_CART).addClass("incart");
485             target.$("a.cartR"+val).show();
486         } else {
487             target.$("a.cart"+val).html(MSG_ITEM_NOT_IN_CART).removeClass("incart").addClass("addtocart cart"+val);
488             target.$("a.cartR"+val).hide();
489         }
490     } else {
491         if(op == "add"){
492             $("a.cart"+val).html(MSG_ITEM_IN_CART).addClass("incart");
493             $("a.cartR"+val).show();
494         } else {
495             $("a.cart"+val).html(MSG_ITEM_NOT_IN_CART).removeClass("incart").addClass("addtocart cart"+val);
496             $("a.cartR"+val).hide();
497         }
498     }
499 }
500
501 function updateAllLinks(target){
502     if(target){
503         target.$("a.incart").html(MSG_ITEM_NOT_IN_CART).removeClass("incart").addClass("addtocart");
504         target.$("a.cartRemove").hide();
505     } else {
506         $("a.incart").html(MSG_ITEM_NOT_IN_CART).removeClass("incart").addClass("addtocart");
507         $("a.cartRemove").hide();
508     }
509 }
510
511 $("#cartDetails").ready(function(){
512     $("#cartDetails,#cartmenuitem,#cartmenulink").on("click",function(){ hideCart(); });
513     $("#cartmenuitem").click(function(e){
514         e.preventDefault();
515         openBasket();
516         $("li").closest().removeClass("open");
517     });
518     updateBasket(basketCount());
519 });