Merge remote-tracking branch 'origin/new/bug_6488'
[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             return 1;
132         }
133         if (! NoMsgAlert ) {
134             showCartUpdate(MSG_RECORD_ADDED);
135         }
136     }
137 }
138
139 function AllAreChecked(s){
140         if (! s.length) { return false;}
141         var l = s.length;
142         for (var i=0; i < l; i++) {
143                 if(! s[i].checked) { return false; }
144         }
145         return true;
146 }
147
148 function SelectAll(){
149     if(document.bookbag_form.biblionumber.length > 0) {
150                 var checky = AllAreChecked(document.bookbag_form.biblionumber);
151                 var l = document.bookbag_form.biblionumber.length;
152         for (var i=0; i < l; i++) {
153             document.bookbag_form.biblionumber[i].checked = (checky) ? false : true;
154         }
155     }
156 }
157
158 function addMultiple(){
159     var c_value = "";
160     if(document.bookbag_form.biblionumber.length > 0) {
161         for (var i=0; i < document.bookbag_form.biblionumber.length; i++) {
162             if (document.bookbag_form.biblionumber[i].checked) {
163                 c_value = c_value + document.bookbag_form.biblionumber[i].value + "/";
164             }
165         }
166         addSelRecords(c_value);
167     } else {
168         c_value = c_value + document.bookbag_form.biblionumber.value + "/";
169         addSelRecords(c_value);
170     }
171 }
172
173 function addSelRecords(valSel) { // function for adding a selection of biblios to the basket
174                                                 // from the results list
175     var arrayRecords = valSel.split("/");
176     var i = 0;
177     var nbAdd = 0;
178     for (i=0;i<arrayRecords.length;i++) {
179         if (arrayRecords[i]) {
180             nbAdd += addRecord(arrayRecords[i], 1);
181         }
182         else {
183             break;
184         }
185     }
186     var msg = "";
187     if (nbAdd) {
188         if (i > nbAdd) {
189             msg = nbAdd+" "+MSG_NRECORDS_ADDED+", "+(i-nbAdd)+" "+MSG_NRECORDS_IN_BASKET;
190         }
191         else {
192             msg = nbAdd+" "+MSG_NRECORDS_ADDED;
193         }
194     }
195     else {
196         if (i < 1) {
197             msg = MSG_NO_RECORD_SELECTED;
198         }
199         else {
200             msg = MSG_NO_RECORD_ADDED+" ("+MSG_NRECORDS_IN_BASKET+") !";
201         }
202     }
203         showCartUpdate(msg);
204 }
205
206 function showCartUpdate(msg){
207         // set body of popup window
208         $("#cartDetails").html(msg);
209         showCart();
210         setTimeout("hideCart()",2000);  
211 }
212
213 function showListsUpdate(msg){
214        // set body of popup window
215        $("#listsDetails").html(msg);
216        showLists();
217        setTimeout("hideLists()",2000); 
218 }
219
220 function selRecord(num, status) {
221     var str = document.myform.records.value
222     if (status){
223         str += num+"/";
224     }
225     else {
226         str = delRecord(num, str);
227     }
228
229     document.myform.records.value = str;
230 }
231
232 function delSelRecords() {
233     var recordsSel = 0;
234     var end = 0;
235     var nameCookie = "bib_list";
236     var valCookie = readCookie(nameCookie, 1);
237
238     if (valCookie) {
239         var str = document.myform.records.value;
240         if (str.length > 0){
241             recordsSel = 1;
242             var str2 = valCookie;
243             while (!end){
244                 s = str.indexOf("/");
245                 if (s>0){
246                     num = str.substring(0, s)
247                     str = delRecord(num,str);
248                     str2 = delRecord(num,str2);
249                 } else {
250                     end = 1;
251                 }
252             }
253
254             if (str2.length == 0) { // equivalent to emptying the basket
255                 var rep = false;
256                 rep = confirm(MSG_CONFIRM_DEL_BASKET);
257                 if (rep) {
258                     delCookie(nameCookie);
259                     document.location = "about:blank";
260                     updateBasket(0,top.opener);
261                     window.close();
262                 } else {
263                     return;
264                 }
265             } else {
266                 writeCookie(nameCookie, str2, 1);
267             }
268         }
269     }
270
271     if (recordsSel) {
272         var strCookie = "";
273         var nameCookie = "bib_list";
274         var valCookie = readCookie(nameCookie, 1);
275         strCookie = nameCookie + "=" + valCookie;
276         var arrayRecords = valCookie.split("/");
277         updateBasket(arrayRecords.length-1,top.opener);
278         document.location = CGIBIN + "opac-basket.pl?" + strCookie;
279     }
280     else {
281         alert(MSG_NO_RECORD_SELECTED);
282     }
283 }
284
285 function delRecord (n, s) {
286     var re = /\d/;
287     var aux = s;
288     var found = 0;
289     var pos = -1;
290
291     while (!found) {
292         pos = aux.indexOf(n, pos+1);
293         var charAfter = aux.charAt(pos+n.length); // character right after the researched string
294         if (charAfter.match(re)) { // record number inside another one
295             continue;
296         }
297         else { // good record number
298             aux = s.substring(0, pos)+ s.substring(pos+n.length+1, s.length);
299             s = aux;
300             found = 1;
301         }
302     }
303
304     return s;
305 }
306
307
308 function delBasket() {
309     var nameCookie = "bib_list";
310
311     var rep = false;
312     rep = confirm(MSG_CONFIRM_DEL_BASKET);
313     if (rep) {
314         delCookie(nameCookie);
315         document.location = "about:blank";
316         updateBasket(0,top.opener);
317         window.close();
318     }
319 }
320
321
322 function quit() {
323     if (document.myform.records.value) {
324         var rep = false;
325         rep = confirm(MSG_CONFIRM_DEL_RECORDS);
326         if (rep) {
327             delSelRecords();
328         }
329     }
330     updateBasket(arrayRecords.length-1,top.opener);
331     window.close();
332 }
333
334 function sendBasket() {
335     var nameCookie = "bib_list";
336     var valCookie = readCookie(nameCookie);
337     var strCookie = nameCookie + "=" + valCookie;
338
339     var loc = CGIBIN + "opac-sendbasket.pl?" + strCookie;
340
341     var optWin="dependant=yes,scrollbars=no,resizable=no,height=300,width=450,top=50,left=100";
342     var win_form = open(loc,"win_form",optWin);
343 }
344
345 function downloadBasket() {
346     var nameCookie = "bib_list";
347     var valCookie = readCookie(nameCookie);
348     var strCookie = nameCookie + "=" + valCookie;
349
350     var loc = CGIBIN + "opac-downloadcart.pl?" + strCookie;
351
352     open(loc,"win_form",'dependant=yes,scrollbars=no,resizable=no,height=300,width=450,top=50,left=100');
353 }
354
355 function printBasket() {
356     var loc = document.location + "&print=1";
357     document.location = loc;
358 }
359
360 function showMore() {
361     var strCookie = "";
362
363     var nameCookie = "bib_list";
364     var valCookie = readCookie(nameCookie);
365     if (valCookie) {
366         strCookie = nameCookie + "=" + valCookie;
367     }
368     var loc = CGIBIN + "opac-basket.pl?" + strCookie + "&verbose=1";
369     document.location = loc;
370 }
371
372 function showLess() {
373     var strCookie = "";
374
375     var nameCookie = "bib_list";
376     var valCookie = readCookie(nameCookie);
377     if (valCookie) {
378         strCookie = nameCookie + "=" + valCookie;
379     }
380     var loc = CGIBIN + "opac-basket.pl?" + strCookie + "&verbose=0";
381     document.location = loc;
382 }
383
384 function updateBasket(updated_value,target) {
385         if(target){
386         target.$('#basketcount').html("<span>"+updated_value+"</span>");
387         target.$('#cartDetails').html(_("Your cart contains ")+updated_value+_(" items"));
388         } else {
389         $('#basketcount').html("<span>"+updated_value+"</span>");
390         $('#cartDetails').html(_("Your cart contains ")+updated_value+_(" items"));
391         }
392         var basketcount = updated_value;
393 }
394
395 function openBiblio(dest,biblionumber) {
396     openerURL=dest+"?biblionumber="+biblionumber;
397     opener.document.location = openerURL;
398     opener.focus();
399 }
400
401 function addSelToShelf() {
402     var items = document.getElementById('records').value;
403         if(items){
404     document.location = "/cgi-bin/koha/opac-addbybiblionumber.pl?biblionumber="+items;
405         } else {
406         alert(MSG_NO_RECORD_SELECTED);
407     }
408 }
409
410 ///  vShelfAdd()  builds url string for multiple-biblio adds.
411
412 function vShelfAdd() {
413         bibs= new Array;
414         if(document.bookbag_form.biblionumber.length > 0) {
415                 for (var i=0; i < document.bookbag_form.biblionumber.length; i++) {
416                         if (document.bookbag_form.biblionumber[i].checked) {
417                                 bibs.push("biblionumber=" +  document.bookbag_form.biblionumber[i].value);
418                         }
419                 }
420             if (bibs.length == 0) { showListsUpdate(MSG_NO_RECORD_SELECTED); }
421             return bibs.join("&");
422         } else {
423             if (document.bookbag_form.biblionumber.checked) {
424                 return "biblionumber=" + document.bookbag_form.biblionumber.value;
425             }
426         }
427 }
428
429 function showCart(){
430                 var position = $("#cartmenulink").offset();
431         var scrolld = $(window).scrollTop();
432                 var top = position.top + $("#cartmenulink").outerHeight();
433         if( scrolld > top ){
434             top = scrolld + 15;
435         }
436                 var menuWidth = 200;
437                 var buttonWidth = $("#cartmenulink").innerWidth();
438                 var buttonOffset = menuWidth - buttonWidth;
439                 var left = position.left -  buttonOffset;
440                 $("#cartDetails").css("position","absolute").css("top",top);
441                 $("#cartDetails").css("position","absolute").css("left",left);
442                 $("#cartDetails").fadeIn("fast");
443 }
444
445 function showLists(){
446                var position = $("#listsmenulink").offset();
447               var top = position.top + $("#listsmenulink").outerHeight();
448                var menuWidth = 200;
449                var buttonWidth = $("#listsmenulink").innerWidth();
450                var buttonOffset = menuWidth - buttonWidth;
451                var left = position.left -  buttonOffset;
452                $("#listsDetails").css("position","absolute").css("top",top);
453                $("#listsDetails").css("position","absolute").css("left",left);
454                $("#listsDetails").fadeIn("fast");
455 }
456
457 function hideCart(){
458     $("#cartDetails").fadeOut("fast");
459 }
460
461 function hideLists(){
462     $("#listsDetails").fadeOut("fast");
463 }
464
465 $("#cartDetails").ready(function(){
466         $("#cartDetails,#cartmenulink").click(function(){ hideCart(); });
467         $("#cartmenulink").click(function(){ openBasket(); return false; });
468         $("#cartmenulink").hoverIntent(function(){
469                 showCart();
470         },function(){
471                 hideCart();
472         });
473         if(basketcount){ updateBasket(basketcount) }
474 });
475
476