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