Bug 12464 - Bootstrap XSLT view no longer displaying 505 correctly formatted
[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 selRecord(num, status) {
216     var str = document.myform.records.value
217     if (status){
218         str += num+"/";
219     }
220     else {
221         str = delRecord(num, str);
222     }
223
224     document.myform.records.value = str;
225 }
226
227 function delSingleRecord(biblionumber){
228     var nameCookie = "bib_list";
229     var valCookie = readCookie(nameCookie);
230     var arrayRecords = valCookie.split("/");
231     var pos = jQuery.inArray(biblionumber,arrayRecords);
232     arrayRecords.splice(pos,1);
233     valCookie = arrayRecords.join("/");
234     writeCookie( nameCookie, valCookie );
235     updateBasket( arrayRecords.length-1 );
236     updateLink(biblionumber,"del");
237     showCartUpdate(MSG_RECORD_REMOVED);
238 }
239
240 function delSelRecords() {
241     var recordsSel = 0;
242     var end = 0;
243     var nameCookie = "bib_list";
244     var valCookie = readCookie(nameCookie, 1);
245     if (valCookie) {
246         var str = document.myform.records.value;
247         if (str.length > 0){
248             recordsSel = 1;
249             var str2 = valCookie;
250             while (!end){
251                 s = str.indexOf("/");
252                 if (s>0){
253                     num = str.substring(0, s);
254                     str = delRecord(num,str);
255                     str2 = delRecord(num,str2);
256                     updateLink(num,"del",top.opener);
257                 } else {
258                     end = 1;
259                 }
260             }
261
262             if (str2.length == 0) { // equivalent to emptying the basket
263                 var rep = false;
264                 rep = confirm(MSG_CONFIRM_DEL_BASKET);
265                 if (rep) {
266                     delCookie(nameCookie);
267                     document.location = "about:blank";
268                     updateBasket(0,top.opener);
269                     window.close();
270                 } else {
271                     return;
272                 }
273             } else {
274                 writeCookie(nameCookie, str2, 1);
275             }
276         }
277     }
278
279     if (recordsSel) {
280         var strCookie = "";
281         var nameCookie = "bib_list";
282         var valCookie = readCookie(nameCookie, 1);
283         strCookie = nameCookie + "=" + valCookie;
284         var arrayRecords = valCookie.split("/");
285         updateBasket(arrayRecords.length-1,top.opener);
286         document.location = "/cgi-bin/koha/opac-basket.pl?" + strCookie;
287     }
288     else {
289         alert(MSG_NO_RECORD_SELECTED);
290     }
291 }
292
293 function delRecord (n, s) {
294     var re = /\d/;
295     var aux = s;
296     var found = 0;
297     var pos = -1;
298
299     while (!found) {
300         pos = aux.indexOf(n, pos+1);
301         var charAfter = aux.charAt(pos+n.length); // character right after the researched string
302         if (charAfter.match(re)) { // record number inside another one
303             continue;
304         }
305         else { // good record number
306             aux = s.substring(0, pos)+ s.substring(pos+n.length+1, s.length);
307             s = aux;
308             found = 1;
309         }
310     }
311
312     return s;
313 }
314
315
316 function delBasket() {
317     var nameCookie = "bib_list";
318
319     var rep = false;
320     rep = confirm(MSG_CONFIRM_DEL_BASKET);
321     if (rep) {
322         delCookie(nameCookie);
323         updateAllLinks(top.opener);
324         document.location = "about:blank";
325         updateBasket(0,top.opener);
326         window.close();
327     }
328 }
329
330
331 function quit() {
332     if (document.myform.records.value) {
333         var rep = false;
334         rep = confirm(MSG_CONFIRM_DEL_RECORDS);
335         if (rep) {
336             delSelRecords();
337         }
338     }
339     updateBasket(arrayRecords.length-1,top.opener);
340     window.close();
341 }
342
343 function sendBasket() {
344     var nameCookie = "bib_list";
345     var valCookie = readCookie(nameCookie);
346     var strCookie = nameCookie + "=" + valCookie;
347
348     var loc = "/cgi-bin/koha/opac-sendbasket.pl?" + strCookie;
349
350     var optWin="scrollbars=yes,resizable=yes,height=600,width=900,top=50,left=100";
351     var win_form = open(loc,"win_form",optWin);
352 }
353
354 function downloadBasket() {
355     var nameCookie = "bib_list";
356     var valCookie = readCookie(nameCookie);
357     var strCookie = nameCookie + "=" + valCookie;
358
359     var loc = "/cgi-bin/koha/opac-downloadcart.pl?" + strCookie;
360
361     open(loc,"win_form",'scrollbars=no,resizable=no,height=300,width=450,top=50,left=100');
362 }
363
364 function printBasket() {
365     var loc = document.location + "&print=1";
366     document.location = loc;
367 }
368
369 function showMore() {
370     var strCookie = "";
371
372     var nameCookie = "bib_list";
373     var valCookie = readCookie(nameCookie);
374     if (valCookie) {
375         strCookie = nameCookie + "=" + valCookie;
376     }
377     var loc = "/cgi-bin/koha/opac-basket.pl?" + strCookie + "&verbose=1";
378     document.location = loc;
379 }
380
381 function showLess() {
382     var strCookie = "";
383
384     var nameCookie = "bib_list";
385     var valCookie = readCookie(nameCookie);
386     if (valCookie) {
387         strCookie = nameCookie + "=" + valCookie;
388     }
389     var loc = "/cgi-bin/koha/opac-basket.pl?" + strCookie + "&verbose=0";
390     document.location = loc;
391 }
392
393 function holdSel() {
394     var items = document.getElementById('records').value;
395     if (items) {
396         parent.opener.document.location = "/cgi-bin/koha/opac-reserve.pl?biblionumbers=" + items;
397         window.close();
398     } else {
399         alert(MSG_NO_RECORD_SELECTED);
400     }
401 }
402
403 function updateBasket(updated_value,target) {
404     if(updated_value > 0){
405         bcount = "<span>"+updated_value+"</span>";
406     } else {
407         bcount = "";
408     }
409     if(target){
410         target.$('#basketcount').html(bcount);
411         target.$('.cart-message').html(MSG_IN_YOUR_CART+updated_value);
412     } else {
413         $('#basketcount').html(bcount);
414         $('.cart-message').html(MSG_IN_YOUR_CART+updated_value);
415     }
416 }
417
418 function openBiblio(dest,biblionumber) {
419     openerURL=dest+"?biblionumber="+biblionumber;
420     opener.document.location = openerURL;
421     opener.focus();
422 }
423
424 function addSelToShelf() {
425     var items = document.getElementById('records').value;
426     if(items){
427     document.location = "/cgi-bin/koha/opac-addbybiblionumber.pl?biblionumber="+items;
428     } else {
429         alert(MSG_NO_RECORD_SELECTED);
430     }
431 }
432
433 ///  vShelfAdd()  builds url string for multiple-biblio adds.
434
435 function vShelfAdd() {
436         bibs= new Array;
437         if(document.bookbag_form.biblionumber.length > 0) {
438                 for (var i=0; i < document.bookbag_form.biblionumber.length; i++) {
439                         if (document.bookbag_form.biblionumber[i].checked) {
440                                 bibs.push("biblionumber=" +  document.bookbag_form.biblionumber[i].value);
441                         }
442                 }
443         if (bibs.length == 0) { showListsUpdate(MSG_NO_RECORD_SELECTED); }
444             return bibs.join("&");
445         } else {
446             if (document.bookbag_form.biblionumber.checked) {
447                 return "biblionumber=" + document.bookbag_form.biblionumber.value;
448             }
449         }
450 }
451
452 function showCart(){
453     var position = $("#cartmenulink").offset();
454     var scrolld = $(window).scrollTop();
455     var top = position.top + $("#cartmenulink").outerHeight();
456     if( scrolld > top ){
457         top = scrolld + 15;
458     }
459     var menuWidth = 200;
460     var buttonWidth = $("#cartmenulink").innerWidth();
461     var buttonOffset = menuWidth - buttonWidth;
462     var left = position.left -  0 // buttonOffset;
463     $("#cartDetails")
464         .css({"position":"absolute", "top":top, "left":left})
465         .fadeIn("fast");
466 }
467
468 function hideCart(){
469     $("#cartDetails").fadeOut("fast");
470 }
471
472 function updateLink(val,op,target){
473     if(target){
474         if(op == "add"){
475             target.$("a.cart"+val).html(MSG_ITEM_IN_CART).addClass("incart");
476             target.$("a.cartR"+val).show();
477         } else {
478             target.$("a.cart"+val).html(MSG_ITEM_NOT_IN_CART).removeClass("incart").addClass("addtocart cart"+val);
479             target.$("a.cartR"+val).hide();
480         }
481     } else {
482         if(op == "add"){
483             $("a.cart"+val).html(MSG_ITEM_IN_CART).addClass("incart");
484             $("a.cartR"+val).show();
485         } else {
486             $("a.cart"+val).html(MSG_ITEM_NOT_IN_CART).removeClass("incart").addClass("addtocart cart"+val);
487             $("a.cartR"+val).hide();
488         }
489     }
490 }
491
492 function updateAllLinks(target){
493     if(target){
494         target.$("a.incart").html(MSG_ITEM_NOT_IN_CART).removeClass("incart").addClass("addtocart");
495         target.$("a.cartRemove").hide();
496     } else {
497         $("a.incart").html(MSG_ITEM_NOT_IN_CART).removeClass("incart").addClass("addtocart");
498         $("a.cartRemove").hide();
499     }
500 }
501
502 $("#cartDetails").ready(function(){
503     $("#cartDetails,#cartmenuitem,#cartmenulink").on("click",function(){ hideCart(); });
504     $("#cartmenuitem").click(function(e){
505         e.preventDefault();
506         openBasket();
507         $("li").closest().removeClass("open");
508     });
509     updateBasket(basketCount());
510 });