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