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