Bug 22023: Further improve responsive layout handling of staff client menu bar
[koha.git] / koha-tmpl / intranet-tmpl / prog / 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_ADDED MSG_RECORD_REMOVED MSG_CONFIRM_DEL_BASKET MSG_CONFIRM_DEL_RECORDS MSG_IN_YOUR_CART MSG_NO_RECORD_SELECTED MSG_ITEM_IN_CART MSG_ITEM_NOT_IN_CART */
2
3 //////////////////////////////////////////////////////////////////////////////
4 // BASIC FUNCTIONS FOR COOKIE MANAGEMENT //
5 //////////////////////////////////////////////////////////////////////////////
6
7 var CGIBIN = "/cgi-bin/koha/";
8
9 var nameCookie = "intranet_bib_list";
10 var nameParam = "bib_list";
11 var valCookie = readCookie(nameCookie);
12
13 if(valCookie){
14     var arrayRecords = valCookie.split("/");
15     if(arrayRecords.length > 0){
16         var basketcount = arrayRecords.length-1;
17     } else {
18         var basketcount = "";
19     }
20 } else {
21         var basketcount = "";
22 }
23
24 function writeCookie(name, val, wd) {
25     if (wd) {
26         parent.opener.document.cookie = name + "=" + val + "; path=/";
27     }
28     else {
29         parent.document.cookie = name + "=" + val + "; path=/";
30     }
31 }
32
33 function readCookieValue (str, val_beg) {
34     var val_end = str.indexOf(";", val_end);
35     if (val_end == -1)
36         val_end = str.length;
37     return str.substring(val_beg, val_end);
38 }
39
40 function readCookie(name, wd) {
41     var str_name = name + "=";
42     var str_len = str_name.length;
43     var str_cookie = "";
44     if (wd) {
45         str_cookie = parent.opener.document.cookie;
46     }
47     else {
48         str_cookie = parent.document.cookie;
49     }
50         // fixed - getting the part of the basket that is bib_list
51         var cookie_parts = str_cookie.split(";");
52             for(var i=0;i < cookie_parts.length;i++) {
53                     var c = cookie_parts[i];
54                     while (c.charAt(0)==' ') c = c.substring(1,c.length);
55                 if(c.indexOf(str_name) === 0) return c.substring(str_name.length,c.length);
56             }
57     return null;
58 }
59
60 function delCookie(name) {
61     var exp = new Date();
62     exp.setTime(exp.getTime()-1);
63     if(parent.opener){
64         parent.opener.document.cookie = name + "=null; path=/; expires=" + exp.toGMTString();
65     } else {
66         document.cookie = name + "=null; path=/; expires=" + exp.toGMTString();
67     }
68 }
69
70 ///////////////////////////////////////////////////////////////////
71 // SPECIFIC FUNCTIONS USING COOKIES //
72 ///////////////////////////////////////////////////////////////////
73
74 function openBasket() {
75     var strCookie = "";
76     var valCookie = readCookie(nameCookie);
77     if ( valCookie ) {
78         strCookie = nameParam + "=" + valCookie;
79     }
80
81     if ( strCookie ) {
82         var iW = 820;
83         var iH = 450;
84         var optWin = "status=yes,scrollbars=yes,resizable=yes,toolbar=no,location=yes,height="+iH+",width="+iW;
85         var loc = CGIBIN + "basket/basket.pl?" + strCookie;
86         var basket = open(loc, "basket", optWin);
87         if (window.focus) { basket.focus(); }
88     }
89     else {
90         showCartUpdate(MSG_BASKET_EMPTY);
91     }
92 }
93
94 function addRecord(val, selection,NoMsgAlert) {
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 function AllAreChecked(s){
142         if (! s.length) { return false;}
143         var l = s.length;
144         for (var i=0; i < l; i++) {
145                 if(! s[i].checked) { return false; }
146         }
147         return true;
148 }
149
150 function SelectAll(){
151     if(document.bookbag_form.biblionumber.length > 0) {
152                 var checky = AllAreChecked(document.bookbag_form.biblionumber);
153                 var l = document.bookbag_form.biblionumber.length;
154         for (var i=0; i < l; i++) {
155             document.bookbag_form.biblionumber[i].checked = (checky) ? false : true;
156         }
157     }
158 }
159
160 function addMultiple(biblist){
161     var c_value = "";
162     if( biblist && biblist.length > 0 ) {
163         for (var i=0; i < biblist.length; i++) {
164             if (biblist[i].checked) {
165                 c_value = c_value + biblist[i].value + "/";
166             }
167         }
168     } else {
169         var bibnums = getContextBiblioNumbers();
170         if ( bibnums.length > 0 ) {
171             for ( var i = 0 ; i < bibnums.length ; i++ ) {
172                 c_value = c_value + bibnums[i] + "/";
173             }
174         } else {
175             if(document.bookbag_form.biblionumber.length > 0) {
176                 for (var i=0; i < document.bookbag_form.biblionumber.length; i++) {
177                     if (document.bookbag_form.biblionumber[i].checked) {
178                         c_value = c_value + document.bookbag_form.biblionumber[i].value + "/";
179                     }
180                 }
181             } else {
182                 c_value = c_value + document.bookbag_form.biblionumber.value + "/";
183             }
184         }
185     }
186     addSelRecords(c_value);
187 }
188
189 function addSelRecords(valSel) { // function for adding a selection of biblios to the basket
190                                                 // from the results list
191     var arrayRecords = valSel.split("/");
192     var i = 0;
193     var nbAdd = 0;
194     for (i=0;i<arrayRecords.length;i++) {
195         if (arrayRecords[i]) {
196             nbAdd += addRecord(arrayRecords[i], 1);
197         }
198         else {
199             break;
200         }
201     }
202     var msg = "";
203     if (nbAdd) {
204         if (i > nbAdd) {
205             msg = MSG_NRECORDS_ADDED.format(nbAdd);
206             msg += "<br/>";
207             msg += MSG_NRECORDS_IN_BASKET.format((i-nbAdd));
208         }
209         else {
210             msg = MSG_NRECORDS_ADDED.format(nbAdd);
211         }
212     }
213     else {
214         if (i < 1) {
215             msg = MSG_NO_RECORD_SELECTED;
216         }
217         else {
218             msg = MSG_NO_RECORD_ADDED;
219         }
220     }
221         showCartUpdate(msg);
222 }
223
224 function showCartUpdate(msg){
225         // set body of popup window
226     console.log( msg );
227         $("#cartDetails").html(msg);
228         showCart();
229     setTimeout(hideCart,2000);
230 }
231
232 function showListsUpdate(msg){
233        // set body of popup window
234        alert(msg);
235 }
236
237 function selRecord(num, status) {
238     var str = document.myform.records.value;
239     if (status){
240         str += num+"/";
241     }
242     else {
243         str = delRecord(num, str);
244     }
245
246     document.myform.records.value = str;
247 }
248
249 function delSingleRecord(biblionumber){
250     var valCookie = readCookie(nameCookie);
251     var arrayRecords = valCookie.split("/");
252     var pos = jQuery.inArray(biblionumber,arrayRecords);
253     arrayRecords.splice(pos,1);
254     valCookie = arrayRecords.join("/");
255     writeCookie( nameCookie, valCookie );
256     updateBasket( arrayRecords.length-1 );
257     updateLink(biblionumber,"del");
258     showCartUpdate(MSG_RECORD_REMOVED);
259 }
260
261 function delSelRecords() {
262     var recordsSel = 0;
263     var end = 0;
264     var valCookie = readCookie(nameCookie, 1);
265
266     if (valCookie) {
267         var str = document.myform.records.value;
268         if (str.length > 0){
269             recordsSel = 1;
270             var str2 = valCookie;
271             while (!end){
272                 s = str.indexOf("/");
273                 if (s>0){
274                     num = str.substring(0, s);
275                     str = delRecord(num,str);
276                     str2 = delRecord(num,str2);
277                     updateLink(num,"del",top.opener);
278                 } else {
279                     end = 1;
280                 }
281             }
282
283             if (str2.length === 0) { // equivalent to emptying the basket
284                 var rep = false;
285                 rep = confirm(MSG_CONFIRM_DEL_BASKET);
286                 if (rep) {
287                     delCookie(nameCookie);
288                     document.location = "about:blank";
289                     updateBasket(0,top.opener);
290                     window.close();
291                 } else {
292                     return;
293                 }
294             } else {
295                 writeCookie(nameCookie, str2, 1);
296             }
297         }
298     }
299
300     if (recordsSel) {
301         var strCookie = "";
302         valCookie = readCookie(nameCookie, 1);
303         strCookie = nameParam + "=" + valCookie;
304         var arrayRecords = valCookie.split("/");
305         updateBasket(arrayRecords.length-1,top.opener);
306         document.location = CGIBIN + "basket/basket.pl?" + strCookie;
307     }
308     else {
309         alert(MSG_NO_RECORD_SELECTED);
310     }
311 }
312
313 function delRecord (n, s) {
314     var re = /\d/;
315     var aux = s;
316     var found = 0;
317     var pos = -1;
318
319     while (!found) {
320         pos = aux.indexOf(n, pos+1);
321         var charAfter = aux.charAt(pos+n.length); // character right after the researched string
322         if (charAfter.match(re)) { // record number inside another one
323             continue;
324         }
325         else { // good record number
326             aux = s.substring(0, pos)+ s.substring(pos+n.length+1, s.length);
327             s = aux;
328             found = 1;
329         }
330     }
331
332     return s;
333 }
334
335
336 function delBasket(context,rep) {
337     if (rep === undefined){
338         rep = confirm(MSG_CONFIRM_DEL_BASKET);
339     }
340     if (rep) {
341         if(context == "popup"){
342             delCookie(nameCookie);
343             updateAllLinks(top.opener);
344             document.location = "about:blank";
345             updateBasket(0,top.opener);
346             window.close();
347         } else {
348             delCookie(nameCookie);
349             updateBasket(0,top.opener);
350         }
351     }
352 }
353
354
355 function quit() {
356     if (document.myform.records.value) {
357         var rep = false;
358         rep = confirm(MSG_CONFIRM_DEL_RECORDS);
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     var win_form = 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(MSG_IN_YOUR_CART.format(updated_value));
416         } else {
417         $('#basketcount').html(" <span>("+updated_value+")</span>");
418     $('#cartDetails').html(MSG_IN_YOUR_CART.format(updated_value));
419         }
420         var basketcount = updated_value;
421 }
422
423 function openBiblio(openerURL) {
424     opener.document.location = openerURL;
425     opener.focus();
426 }
427
428 function addSelToShelf() {
429     var items = document.getElementById('records').value;
430         if(items){
431     document.location = "/cgi-bin/koha/virtualshelves/addbybiblionumber.pl?biblionumber="+items;
432         } else {
433         alert(MSG_NO_RECORD_SELECTED);
434     }
435 }
436
437 ///  vShelfAdd()  builds url string for multiple-biblio adds.
438
439 function vShelfAdd(biblist) {
440     var bibs = new Array;
441     if( biblist && biblist.length > 0 ) {
442         for (var 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(MSG_NO_RECORD_SELECTED); }
448         return bibs.join("&");
449     } else {
450         var bibnums = getContextBiblioNumbers();
451         if ( bibnums.length > 0 ) {
452             for ( var i = 0 ; i < bibnums.length ; i++ ) {
453                 bibs.push("biblionumber=" + bibnums[i]);
454             }
455             return bibs.join("&");
456         }
457     }
458 }
459
460 function showCart(){
461     var position = $("#cartmenulink").offset();
462     var toolbarh = $(".floating").outerHeight();
463     var scrolld = $(window).scrollTop();
464     var top = position.top + $("#cartmenulink").outerHeight();
465     if( scrolld > top ){
466         top = scrolld + toolbarh + 15;
467     }
468     var left = position.left;
469     $("#cartDetails")
470         .css("position","absolute")
471         .css("top",top)
472         .css("left",left)
473         .css("z-index",1000);
474     $("#cartDetails").fadeIn("fast");
475 }
476
477 function hideCart(){
478     $("#cartDetails").fadeOut("fast");
479 }
480
481 function updateLink(val, op, target){
482     var cart = target ? target.$("#cart" + val) : $("#cart" + val);
483     var cartR = target ? target.$("#cartR" + val) : $("#cartR" + val);
484
485     if(op == "add"){
486         cart.html(MSG_ITEM_IN_CART).addClass("incart");
487         cartR.show();
488     } else {
489         cart.html(MSG_ITEM_NOT_IN_CART).removeClass("incart").addClass("addtocart");
490         cartR.hide();
491     }
492 }
493
494 function updateAllLinks(target){
495     if(target){
496         target.$("a.incart").html(MSG_ITEM_NOT_IN_CART).removeClass("incart").addClass("addtocart");
497         target.$(".cartRemove").hide();
498     } else {
499         $("a.incart").html(MSG_ITEM_NOT_IN_CART).removeClass("incart").addClass("addtocart");
500         $(".cartRemove").hide();
501     }
502 }
503
504 $(document).ready(function(){
505     $("#cartmenulink").click(function( e ){
506         e.preventDefault();
507         openBasket();
508     });
509         if(basketcount){ updateBasket(basketcount); }
510 });