Merge remote-tracking branch 'origin/new/bug_6720'
[koha.git] / koha-tmpl / opac-tmpl / prog / en / js / basket.js
1 //////////////////////////////////////////////////////////////////////////////
2 // BASIC FUNCTIONS FOR COOKIE MANAGEMENT //
3 //////////////////////////////////////////////////////////////////////////////
4
5 var CGIBIN = "/cgi-bin/koha/";
6
7
8 var nameCookie = "bib_list";
9 var valCookie = readCookie(nameCookie);
10
11 if(valCookie){
12     var arrayRecords = valCookie.split("/");
13     if(arrayRecords.length > 0){
14         var basketcount = arrayRecords.length-1;
15     } else {
16         var basketcount = "";
17     }
18 } else {
19         var basketcount = "";
20 }
21
22 function writeCookie(name, val, wd) {
23     if (wd) {
24         parent.opener.document.cookie = name + "=" + val;
25     }
26     else {
27         parent.document.cookie = name + "=" + val;
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; expires=" + exp.toGMTString();
63         } else {
64         document.cookie = name + "=null; 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 = "dependant=yes,status=yes,scrollbars=yes,resizable=yes,toolbar=no,location=yes,height="+iH+",width="+iW;
84         var loc = CGIBIN + "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 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(){
161     var c_value = "";
162     if(document.bookbag_form.biblionumber.length > 0) {
163         for (var i=0; i < document.bookbag_form.biblionumber.length; i++) {
164             if (document.bookbag_form.biblionumber[i].checked) {
165                 c_value = c_value + document.bookbag_form.biblionumber[i].value + "/";
166             }
167         }
168         addSelRecords(c_value);
169     } else {
170         c_value = c_value + document.bookbag_form.biblionumber.value + "/";
171         addSelRecords(c_value);
172     }
173 }
174
175 function addSelRecords(valSel) { // function for adding a selection of biblios to the basket
176                                                 // from the results list
177     var arrayRecords = valSel.split("/");
178     var i = 0;
179     var nbAdd = 0;
180     for (i=0;i<arrayRecords.length;i++) {
181         if (arrayRecords[i]) {
182             nbAdd += addRecord(arrayRecords[i], 1);
183         }
184         else {
185             break;
186         }
187     }
188     var msg = "";
189     if (nbAdd) {
190         if (i > nbAdd) {
191             msg = nbAdd+" "+MSG_NRECORDS_ADDED+", "+(i-nbAdd)+" "+MSG_NRECORDS_IN_BASKET;
192         }
193         else {
194             msg = nbAdd+" "+MSG_NRECORDS_ADDED;
195         }
196     }
197     else {
198         if (i < 1) {
199             msg = MSG_NO_RECORD_SELECTED;
200         }
201         else {
202             msg = MSG_NO_RECORD_ADDED+" ("+MSG_NRECORDS_IN_BASKET+") !";
203         }
204     }
205         showCartUpdate(msg);
206 }
207
208 function showCartUpdate(msg){
209         // set body of popup window
210         $("#cartDetails").html(msg);
211         showCart();
212         setTimeout("hideCart()",2000);  
213 }
214
215 function showListsUpdate(msg){
216        // set body of popup window
217        $("#listsDetails").html(msg);
218        showLists();
219        setTimeout("hideLists()",2000); 
220 }
221
222 function selRecord(num, status) {
223     var str = document.myform.records.value
224     if (status){
225         str += num+"/";
226     }
227     else {
228         str = delRecord(num, str);
229     }
230
231     document.myform.records.value = str;
232 }
233
234 function delSingleRecord(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 = CGIBIN + "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 = CGIBIN + "opac-sendbasket.pl?" + strCookie;
356
357     var optWin="dependant=yes,scrollbars=no,resizable=no,height=300,width=450,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 = CGIBIN + "opac-downloadcart.pl?" + strCookie;
367
368     open(loc,"win_form",'dependant=yes,scrollbars=no,resizable=no,height=300,width=450,top=50,left=100');
369 }
370
371 function printBasket() {
372     var loc = document.location + "&print=1";
373     document.location = loc;
374 }
375
376 function showMore() {
377     var strCookie = "";
378
379     var nameCookie = "bib_list";
380     var valCookie = readCookie(nameCookie);
381     if (valCookie) {
382         strCookie = nameCookie + "=" + valCookie;
383     }
384     var loc = CGIBIN + "opac-basket.pl?" + strCookie + "&verbose=1";
385     document.location = loc;
386 }
387
388 function showLess() {
389     var strCookie = "";
390
391     var nameCookie = "bib_list";
392     var valCookie = readCookie(nameCookie);
393     if (valCookie) {
394         strCookie = nameCookie + "=" + valCookie;
395     }
396     var loc = CGIBIN + "opac-basket.pl?" + strCookie + "&verbose=0";
397     document.location = loc;
398 }
399
400 function updateBasket(updated_value,target) {
401         if(target){
402         target.$('#basketcount').html("<span>"+updated_value+"</span>");
403     target.$('#cartDetails').html(MSG_IN_YOUR_CART+updated_value);
404         } else {
405         $('#basketcount').html("<span>"+updated_value+"</span>");
406     $('#cartDetails').html(MSG_IN_YOUR_CART+updated_value);
407         }
408         var basketcount = updated_value;
409 }
410
411 function openBiblio(dest,biblionumber) {
412     openerURL=dest+"?biblionumber="+biblionumber;
413     opener.document.location = openerURL;
414     opener.focus();
415 }
416
417 function addSelToShelf() {
418     var items = document.getElementById('records').value;
419         if(items){
420     document.location = "/cgi-bin/koha/opac-addbybiblionumber.pl?biblionumber="+items;
421         } else {
422         alert(MSG_NO_RECORD_SELECTED);
423     }
424 }
425
426 ///  vShelfAdd()  builds url string for multiple-biblio adds.
427
428 function vShelfAdd() {
429         bibs= new Array;
430         if(document.bookbag_form.biblionumber.length > 0) {
431                 for (var i=0; i < document.bookbag_form.biblionumber.length; i++) {
432                         if (document.bookbag_form.biblionumber[i].checked) {
433                                 bibs.push("biblionumber=" +  document.bookbag_form.biblionumber[i].value);
434                         }
435                 }
436             if (bibs.length == 0) { showListsUpdate(MSG_NO_RECORD_SELECTED); }
437             return bibs.join("&");
438         } else {
439             if (document.bookbag_form.biblionumber.checked) {
440                 return "biblionumber=" + document.bookbag_form.biblionumber.value;
441             }
442         }
443 }
444
445 function showCart(){
446                 var position = $("#cartmenulink").offset();
447         var scrolld = $(window).scrollTop();
448                 var top = position.top + $("#cartmenulink").outerHeight();
449         if( scrolld > top ){
450             top = scrolld + 15;
451         }
452                 var menuWidth = 200;
453                 var buttonWidth = $("#cartmenulink").innerWidth();
454                 var buttonOffset = menuWidth - buttonWidth;
455                 var left = position.left -  buttonOffset;
456                 $("#cartDetails").css("position","absolute").css("top",top);
457                 $("#cartDetails").css("position","absolute").css("left",left);
458                 $("#cartDetails").fadeIn("fast");
459 }
460
461 function showLists(){
462                var position = $("#listsmenulink").offset();
463               var top = position.top + $("#listsmenulink").outerHeight();
464                var menuWidth = 200;
465                var buttonWidth = $("#listsmenulink").innerWidth();
466                var buttonOffset = menuWidth - buttonWidth;
467                var left = position.left -  buttonOffset;
468                $("#listsDetails").css("position","absolute").css("top",top);
469                $("#listsDetails").css("position","absolute").css("left",left);
470                $("#listsDetails").fadeIn("fast");
471 }
472
473 function hideCart(){
474     $("#cartDetails").fadeOut("fast");
475 }
476
477 function hideLists(){
478     $("#listsDetails").fadeOut("fast");
479 }
480
481 function updateLink(val,op,target){
482     if(target){
483         if(op == "add"){
484             target.$("a.cart"+val).html(MSG_ITEM_IN_CART).addClass("incart");
485             target.$("a.cartR"+val).show();
486         } else {
487             target.$("a.cart"+val).html(MSG_ITEM_NOT_IN_CART).removeClass("incart").addClass("addtocart cart"+val);
488             target.$("a.cartR"+val).hide();
489         }
490     } else {
491         if(op == "add"){
492             $("a.cart"+val).html(MSG_ITEM_IN_CART).addClass("incart");
493             $("a.cartR"+val).show();
494         } else {
495             $("a.cart"+val).html(MSG_ITEM_NOT_IN_CART).removeClass("incart").addClass("addtocart cart"+val);
496             $("a.cartR"+val).hide();
497         }
498     }
499 }
500
501 function updateAllLinks(target){
502     if(target){
503         target.$("a.incart").html(MSG_ITEM_NOT_IN_CART).removeClass("incart").addClass("addtocart");
504         target.$("a.cartRemove").hide();
505     } else {
506         $("a.incart").html(MSG_ITEM_NOT_IN_CART).removeClass("incart").addClass("addtocart");
507         $("a.cartRemove").hide();
508     }
509 }
510
511 $("#cartDetails").ready(function(){
512         $("#cartDetails,#cartmenulink").click(function(){ hideCart(); });
513         $("#cartmenulink").click(function(){ openBasket(); return false; });
514         $("#cartmenulink").hoverIntent(function(){
515                 showCart();
516         },function(){
517                 hideCart();
518         });
519         if(basketcount){ updateBasket(basketcount) }
520 });
521
522