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