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