source: main/trunk/model-interfaces-dev/heritage-nz/js/berrybasket/berrycheckout.js@ 33230

Last change on this file since 33230 was 33230, checked in by davidb, 5 years ago

Continuation of quick-hack to allow simple emptying of basket, with consisent display in page

File size: 21.1 KB
Line 
1// The default link type in the basket - "document" = greenstone version of the document, "source" = link to source file eg pdf.
2//var default_link_type = "document"; // "source" or "document"
3var default_link_type = "source";
4// use the appropriate one of these to override the default for particular collections.
5var source_link_collections = new Array(); // or add list of collections like ["pdfberry", "mgppdemo"];
6var document_link_collections = new Array(); // or add list of collections as above.
7//these are the default metadata items used by berry baskets.
8var default_metas = ["Title", "root_Title", "root_assocfilepath", "root_srclinkFile", "name", "collection", "Date"];
9
10var docList = new Array();
11var urlonly = false;
12var mailinfo = new Array();
13mailinfo['address'] = gs.text.berry.to;
14mailinfo['cc'] = gs.text.berry.cc;
15mailinfo['bcc'] = gs.text.berry.bcc;
16mailinfo['subject'] = gs.text.berry.subject;
17var textwin;
18var mailwin;
19
20var options = ['fullview', 'textview', 'email'];
21
22function toggleSelectAll(selAllCheckbox) {
23 // https://stackoverflow.com/questions/386281/how-to-implement-select-all-check-box-in-html
24 var allBerriesCheckboxList = document.getElementsByName('select-berry-checkbox');
25 for (var i = 0; i < allBerriesCheckboxList.length; i++) {
26 // if the selectAllCheckbox is checked, then all the berries' checkboxes will get checked
27 // And vice-versa.
28 allBerriesCheckboxList[i].checked = selAllCheckbox.checked;
29 }
30}
31
32function deleteSelected() {
33
34 if(docList.length == 0) return; // no berries on page, nothing to delete
35
36 // https://stackoverflow.com/questions/590018/getting-all-selected-checkboxes-in-an-array
37 // https://www.w3schools.com/jsref/met_document_queryselectorall.asp
38 // https://www.w3schools.com/cssref/css_selectors.asp
39 var selectedList = document.querySelectorAll('input[name=select-berry-checkbox]:checked');
40 if(selectedList.length == 0) return; // nothing selected, so nothing to delete
41
42 // if all berries selected for deletion, can optimise
43 if(selectedList.length === docList.length) {
44 deleteAll();
45 return; // done!
46 }
47
48 // otherwise selected list of berries is a proper subset of total berries (berries in docList)
49 var idsToDelete = [];
50
51 // construct the deletion url by concatenating the ids with | which is %7C in URL-encoded form
52 var delurl = delurlPath; // var delurlPath is declared in ygDDPlayer.js.
53
54 for(var i = 0; i < selectedList.length; i++) {
55 selected_id = selectedList[i].id;
56 // Format of checkbox id: "<docid>-checkbox"
57 var end = selected_id.indexOf("-checkbox");
58 var doc_id = selected_id.substring(0, end);
59
60 idsToDelete[i] = doc_id;
61
62 // Now just need to append each doc_id to the deletion URL separated by |,
63 // but this character needs to be URL encoded, else the delete doesn't work.
64 if((i+1) == selectedList.length) { // if it's the last id to process, don't append separator
65 delurl += doc_id;
66 } else { // there's more ids to process, so append separator
67 delurl += doc_id + "%7C"; // url-encoded version of |
68 }
69
70 }
71
72 var delAll = false;
73 doDelete(delAll, delurl, selectedList, idsToDelete);
74}
75
76function deleteAll() {
77
78 if(docList.length == 0) return; // nothing to delete
79
80 var delurl = delurlPath; // var delurlPath is declared in ygDDPlayer.js.
81 // Just need to append each doc id separated by |, but this character needs to be URL encoded,
82 // else the delete doesn't work.
83
84 for(var i = 0; i < docList.length; i++) {
85 var doc = docList[i];
86 var doc_id = doc['collection']+":"+ doc['name'];
87
88 if((i+1) == docList.length) { // if it's the last id to process, don't append separator
89 delurl += doc_id;
90 } else { // there's more ids to process, so append separator (in URL encoded form!)
91 delurl += doc_id + "%7C"; // url-encoded version of |
92 }
93 }
94
95 var delAll = true;
96 doDelete(delAll, delurl, null, null);
97}
98
99
100function doDelete(deleteAll, delurl, selectedList, idsToDelete) { // given list of selected checkboxes
101
102 // The following is a modified version of methods internal to
103 // ygDDPlayer.js's ygDDPlayer.prototype.onDragDrop
104 var delSuccess = function(o) {
105 var result = o.responseXML;
106
107 if(!deleteAll) { // then we're given a selection to delete: Not deleting all berries, just a subset
108 // Remove id of selected doc to be deleted from docList.
109 // Minor optimisation to double for loop, dependent on ordering of selected berries being
110 // in order of checkboxes (i.e. order of docList ids), and order of docList ids having
111 // the same order as the checkboxes
112 var searchForNextSelectedIdFromIndex = idsToDelete.length-1;
113 for (var i = docList.length - 1; i >= 0; i--) {
114 var berry = docList[i];
115 var berry_id = berry['collection'] + ":" + berry['name'];
116
117 for(var j = searchForNextSelectedIdFromIndex; j >= 0; j--) {
118 if(idsToDelete[j] == berry_id) {
119 docList.splice(i, 1); // i indexes into docList, delete element i from docList
120 searchForNextSelectedIdFromIndex = j-1;
121 break;
122 }
123 }
124 }
125
126 // remove the selected documents' HTML display elements
127 var berryDocsList = YAHOO.util.Dom.get('berryDocsList'); // ordered list item containing the berries
128 for(var i = 0; i < selectedList.length; i++) {
129 var li = selectedList[i].parentNode; // list item parent of checkbox
130 // remove the list item from its containing orderedList
131 berryDocsList.removeChild(li);
132 }
133 }
134
135
136 // if all docs are deleted by this stage, then display "berry basket is empty" message
137 if (deleteAll || !berryDocsList.hasChildNodes()) { // 2nd clause no longer needed?, then this just becomes an else against the first if(!deleteAll) test
138
139 // if deleting all docs, just use the easy way to empty the docList array
140 docList.length = 0; // https://www.jstips.co/en/javascript/two-ways-to-empty-an-array/
141
142 // Removing all child nodes (done one at a time) is more optimal
143 // than setting innerHTML to empty string, see
144 // https://stackoverflow.com/questions/3955229/remove-all-child-elements-of-a-dom-node-in-javascript
145 var content = YAHOO.util.Dom.get('berryBasketContent');
146 while (content.hasChildNodes()) {
147 content.removeChild(content.firstChild);
148 }
149 content.appendChild(document.createTextNode('Your berry basket is empty.'));
150
151 // ****
152 var deleteAllDiv = YAHOO.util.Dom.get('berryBasketDeleteAll');
153 if (deleteAllDiv != null) {
154 deleteAllDiv.style.display = "none";
155 }
156
157 var trashbin = YAHOO.util.Dom.get('trashbin');
158 if ( trashbin != null){
159 trashbin.style.background = 'url("interfaces/default/images/trash-full.png") 0 0 no-repeat';
160 }
161 }
162
163 // Ensure the select-all, delete-all and delete-selected checkboxes are deselected
164 // ****
165 //YAHOO.util.Dom.get('select-all-checkbox').checked = false;
166 //YAHOO.util.Dom.get('delete-selected-checkbox').checked = false;
167 //YAHOO.util.Dom.get('delete-all-checkbox').checked = false;
168 }
169
170 var delFailure = function(o){ alert("Deletion failed" + o);}
171
172 var delcallback = {
173 success:delSuccess,
174 failure:delFailure,
175 argument:null // supposed to be the ygDDPlayer object, but don't have a ref to it here, so trying null
176 }
177
178 // Finally send the actual delete request
179 // request_type defaults to GET, which is what's used for add and del, see ygDDPlayer.js.
180 YAHOO.util.Connect.asyncRequest(request_type, delurl , delcallback);
181}
182
183function navigate(e){
184
185 var target = this;
186
187 if ( target.id.toLowerCase() == '' ) {
188 target = target.parentNode;
189 }
190
191 if (target.id.toLowerCase() == 'fullview'){
192 berryCheckoutHighlight( 'fullview' );
193 showFullView();
194 }
195
196 if (target.id.toLowerCase() == 'textview'){
197 berryCheckoutHighlight( 'textview' );
198 showTextView();
199 }
200
201 if (target.id.toLowerCase() == 'email'){
202 berryCheckoutHighlight( 'email' );
203 showEmail();
204 }
205
206 if (target.id.toLowerCase() == 'sendmail'){
207 sendMail();
208 }
209
210 if (target.id.toLowerCase() == 'urlcheck' && urlonly){
211 var urlcheck = YAHOO.util.Dom.get('urlcheck');
212 urlcheck.src = 'interfaces/default/images/check3.gif';
213 var parea =YAHOO.util.Dom.get('pretextarea');
214 urlonly = false;
215
216 this.value=gs.text.berry.url_only;
217
218 populateUrlsAndMetadata(parea);
219 return;
220 }
221
222 if (target.id.toLowerCase() == 'urlcheck' && !urlonly ){
223 var urlcheck = YAHOO.util.Dom.get('urlcheck');
224 urlcheck.src = 'interfaces/default/images/check4.gif';
225 var parea =YAHOO.util.Dom.get('pretextarea');
226 populateUrls(parea);
227 urlonly = true;
228
229 this.value=gs.text.berry.url_and_metadata;
230
231 return;
232 }
233
234 if (target.id.toLowerCase() == 'extextview' ){
235 if (textwin != null){
236 textwin.close();
237 }
238
239 textwin = window.open("","Berry basket plain text view","status=1,width=450,height=300");
240 textwin.moveTo(0,0);
241 var content = document.createElement('div');
242 buildPreview(content);
243 var body = textwin.document.getElementsByTagName('body')[0];
244 body.appendChild(content);
245 var prearea = textwin.document.getElementsByTagName('textarea')[0];
246 prearea.cols = '55';
247 prearea.rows = '15';
248 }
249
250 if (target.id.toLowerCase() == 'exemail' ){
251 if (mailwin != null){
252 mailwin.close();
253 }
254 mailwin = window.open("","Berry basket mail to a friend","status=1,width=450,height=350");
255 mailwin.moveTo(0,0);
256 var content = document.createElement('div');
257 getEmailContent(content);
258 var body = mailwin.document.getElementsByTagName('body')[0];
259 body.appendChild(content);
260 var prearea = mailwin.document.getElementsByTagName('textarea')[0];
261 prearea.cols = '50';
262 prearea.rows = '11';
263 }
264}
265
266function pageLoad(){
267 for(var j = 0; j < options.length; j++)
268 {
269 var ele = document.getElementById(options[j]);
270 YAHOO.util.Event.addListener(ele, 'click', navigate);
271 }
272
273 showFullView();
274}
275
276function showFullView(){
277
278 var content = YAHOO.util.Dom.get('berryBasketContent');
279 var fullview = YAHOO.util.Dom.get('fullview');
280 berryCheckoutPageClear();
281
282 if (docList.length == 0){
283 content.appendChild(document.createTextNode(gs.text.berry.empty_basket));
284
285 // ****
286 var deleteAllDiv = YAHOO.util.Dom.get('berryBasketDeleteAll');
287 if (deleteAllDiv != null) {
288 deleteAllDiv.style.display = "none";
289 }
290
291 return;
292 }
293
294 var trashbin = document.createElement('div');
295 trashbin.id ='trashbin';
296
297 var binhandle = document.createElement('div');
298 binhandle.id = 'binhandle';
299 binhandle.appendChild(document.createElement('span'));
300 trashbin.appendChild(binhandle);
301 content.appendChild(trashbin);
302
303 var dd = new ygDDOnTop('trashbin');
304 dd.setHandleElId('binhandle');
305 new YAHOO.util.DDTarget('trashbin','trash');
306
307 var dlist = document.createElement('div');
308 content.appendChild(dlist);
309 var ol = document.createElement('ol');
310 dlist.appendChild(ol);
311
312 ol.setAttribute("id", "berryDocsList");
313
314 for (var i in docList){
315 var doc = docList[i];
316 var li = document.createElement('li');
317 var img = document.createElement('img');
318 var text ="";
319
320 var doc_id = doc['collection']+":"+ doc['name'];
321
322 img.setAttribute("src", "interfaces/default/images/berry.png");
323 img.setAttribute("id", doc_id);
324 img.setAttribute("height", "15px");
325 img.setAttribute("width", "15px");
326 li.appendChild(img);
327
328 generateDocDisplay(li, doc, doc_id)
329 li.className = 'berrydoc';
330 ol.appendChild(li);
331 new ygDDPlayer(img.id,'trash',docList);
332 }
333
334}
335
336function generateDocDisplay(li, doc, doc_id) {
337 var checkbox = document.createElement('input');
338 checkbox.setAttribute("type", "checkbox");
339 checkbox.setAttribute("id", doc_id+"-checkbox");
340 checkbox.setAttribute("name", "select-berry-checkbox");
341 checkbox.setAttribute("value", "select-"+doc_id);
342
343 var a = document.createElement('a');
344 var text="";
345 a.href=generateURL(doc);
346 a.appendChild(document.createTextNode(doc['Title']));
347
348 if (doc['root_Title']){
349 li.appendChild(document.createTextNode(doc['root_Title']+": "));
350 }
351 li.appendChild(checkbox);
352 li.appendChild(a);
353 li.appendChild(document.createTextNode(" ("+doc['collection']+")"));
354 var metadata = "";
355 for (var metaItem in doc) {
356 if ( !default_metas.includes(metaItem)){
357 metadata += " "+metaItem+": "+ doc[metaItem]+" ";
358 }
359 }
360 text +=metadata;
361 li.appendChild(document.createTextNode(text));
362
363}
364
365function showTextView(){
366
367 var content = YAHOO.util.Dom.get('berryBasketContent');
368 var textview = YAHOO.util.Dom.get('textview');
369
370 berryCheckoutPageClear();
371 if (docList.length == 0){
372 content.appendChild(document.createTextNode(gs.text.berry.empty_basket));
373 // ****
374 var deleteAllDiv = YAHOO.util.Dom.get('berryBasketDeleteAll');
375 if (deleteAllDiv != null) {
376 deleteAllDiv.style.display = "none";
377 }
378
379 return;
380 }
381 buildPreview(content);
382
383}
384
385function getEmailContent(content){
386 var item ;
387 var tr;
388 var td;
389 var input;
390
391 table = document.createElement('table');
392 table.setAttribute("class","mailtable");
393
394 for (item in mailinfo){
395 tr = document.createElement('tr');
396 td = document.createElement('td');
397 td.setAttribute("class","mailitem");
398 td.appendChild(document.createTextNode(mailinfo[item]));
399 tr.appendChild(td);
400 td = document.createElement('td');
401 input = document.createElement('input');
402 input.setAttribute("id", item);
403 input.setAttribute("class", "mailinput");
404 if(item === "address") {
405 input.setAttribute("type", "email"); // https://html5-tutorial.net/form-validation/validating-email/
406 input.required = true; // https://stackoverflow.com/questions/18770369/how-to-set-html5-required-attribute-in-javascript
407 } else {
408 input.setAttribute("type", "text");
409 }
410 td.appendChild(input);
411 tr.appendChild(td);
412 table.appendChild(tr);
413 }
414
415 // an empty line
416 tr = document.createElement('tr');
417 td = document.createElement('td');
418 td.appendChild(document.createElement('br'));
419 tr.appendChild(td);
420 table.appendChild(tr);
421
422 content.appendChild(table);
423
424 buildPreview(content);
425
426 //send button
427 input = document.createElement('input');
428 input.setAttribute("id", 'sendmail');
429 input.setAttribute("class", "sendbutton");
430 input.setAttribute("type", "button");
431 input.setAttribute("value", gs.text.berry.send);
432 content.appendChild(input);
433}
434
435function showEmail(){
436 var content = YAHOO.util.Dom.get('berryBasketContent');
437 var email = YAHOO.util.Dom.get('email');
438
439 berryCheckoutPageClear();
440
441 if (docList.length == 0){
442 content.appendChild(document.createTextNode(gs.text.berry.empty_basket));
443
444 // ****
445 var deleteAllDiv = YAHOO.util.Dom.get('berryBasketDeleteAll');
446 if (deleteAllDiv != null) {
447 deleteAllDiv.style.display = "none";
448 }
449
450 return;
451 }
452
453 var item;
454 var tr;
455 var td;
456 var input;
457
458 table = document.createElement('table');
459 table.setAttribute("class","mailtable");
460
461 for (item in mailinfo){
462 tr = document.createElement('tr');
463 td = document.createElement('td');
464 td.setAttribute("class","mailitem");
465 td.appendChild(document.createTextNode(mailinfo[item]));
466 tr.appendChild(td);
467
468 td = document.createElement('td');
469 input = document.createElement('input');
470 input.setAttribute("id", item);
471 input.setAttribute("class", "mailinput");
472 if(item === "address") {
473 input.setAttribute("type", "email"); // https://html5-tutorial.net/form-validation/validating-email/
474 input.required = true; // https://stackoverflow.com/questions/18770369/how-to-set-html5-required-attribute-in-javascript
475 } else {
476 input.setAttribute("type", "text");
477 }
478 td.appendChild(input);
479 tr.appendChild(td);
480 table.appendChild(tr);
481
482 }
483
484 // an empty line
485 tr = document.createElement('tr');
486 td = document.createElement('td');
487 td.appendChild(document.createElement('br'));
488 tr.appendChild(td);
489 table.appendChild(tr);
490
491 content.appendChild(table);
492
493 buildPreview(content);
494
495 //send button
496 input = document.createElement('input');
497 input.setAttribute("id", 'sendmail');
498 input.setAttribute("class", "sendbutton");
499 input.setAttribute("type", "button");
500 input.setAttribute("value", gs.text.berry.send);
501 content.appendChild(input);
502
503 YAHOO.util.Event.addListener(input, 'click', navigate);
504}
505
506function buildPreview(parent){
507
508 var div = document.createElement('div');
509 var cb = document.createElement('input');
510 cb.setAttribute('class', 'sendbutton');
511 cb.type = 'button';
512 cb.id = 'urlcheck';
513 if (urlonly)
514 {
515 cb.value=gs.text.berry.url_and_metadata;
516 }
517 else
518 {
519 cb.value=gs.text.berry.url_only;
520 }
521
522 YAHOO.util.Event.addListener(cb, 'click', navigate);
523
524 var img = document.createElement('img');
525 img.src = 'interfaces/default/images/check3.gif';
526 img.id = 'urlcheck';
527 div.appendChild(cb);
528 //div.appendChild(img);
529
530 var urls = document.createElement('span');
531 urls.id = 'urls';
532 urls.className = 'berrycheck';
533 //urls.appendChild(document.createTextNode('URL only'));
534 div.appendChild(urls);
535
536 // var urlsmetadata = document.createElement('span');
537 // urlsmetadata.id = 'urlsmetadata'
538 // urlsmetadata.className = 'berryradio';
539 // urlsmetadata.appendChild(document.createTextNode('URLs and Metadata'));
540 // div.appendChild(urlsmetadata);
541
542 parent.appendChild(div);
543
544 var parea = document.createElement('textarea');
545 parea.id = 'pretextarea';
546 parea.required = true; // https://www.w3schools.com/tags/att_textarea_required.asp
547 // and https://stackoverflow.com/questions/18770369/how-to-set-html5-required-attribute-in-javascript
548
549 parent.appendChild(parea);
550
551 if(urlonly)
552 {
553 populateUrls(parea);
554 }
555 else
556 {
557 populateUrlsAndMetadata(parea);
558 }
559}
560
561function getDefaultLinkType(collection) {
562 var link_type;
563 if (document_link_collections.includes(collection)) {
564 link_type = "document";
565 } else if (source_link_collections.includes(collection)) {
566 link_type = "source";
567 }
568 else {
569 link_type = default_link_type;
570 if (link_type != "source" && link_type != "document") {
571 link_type = "document"; //the default default
572 }
573 }
574 return link_type;
575}
576
577function generateURL(doc) {
578
579 var url;
580 var doc_url = document.URL;
581 var root_url = doc_url.substring(0,doc_url.indexOf('?'));
582
583 var link_type = getDefaultLinkType(doc["collection"]);
584 if (link_type == "document") {
585 url = root_url+"/collection/"+doc["collection"]+"/document/"+doc["name"];
586 } else if (link_type == "source") {
587 url = root_url+"/sites/"+gs.xsltParams.site_name+"/collect/"+doc['collection']+"/index/assoc/"+doc["root_assocfilepath"]+"/"+doc["root_srclinkFile"];
588 }
589 return url;
590}
591
592
593function populateUrls(parea){
594
595 var urls="";
596 for (var i in docList){
597 var doc = docList[i];
598 urls += generateURL(doc)+"\n\n";
599 }
600
601 parea.value = urls;
602
603}
604
605function populateUrlsAndMetadata(parea){
606
607 var fulltext="";
608 for (var i in docList){
609 var doc = docList[i];
610 var url = generateURL(doc)+"\n";
611
612 var metadata = "";
613 if (doc['Title']) {
614 metadata += gs.text.berry.doc_title+": "+doc['Title']+"\n";
615 }
616 if (doc['root_Title']) {
617 metadata += gs.text.berry.doc_root_title+": "+doc['root_Title']+"\n";
618
619 }
620 if (doc['name']) {
621 metadata += gs.text.berry.doc_name+": "+doc['name']+"\n";
622 }
623 if (doc['collection']) {
624 metadata += gs.text.berry.doc_collection+": "+doc['collection']+"\n";
625 }
626 if (doc['Date']) {
627 metadata += gs.text.berry.doc_date+": "+doc['Date']+"\n";
628 }
629 // allow for inclusion of custom metadata
630 for (var m in doc) {
631 if (!default_metas.includes(m)) {
632 metadata += m +":" + doc[m]+"\n";
633 }
634 }
635 fulltext +=url+metadata+"\n";
636 }
637
638 parea.value = fulltext;
639
640}
641
642function sendMail(){
643 var url = gs.xsltParams.library_name + "?a=pr&rt=r&ro=1&s=SendMail&c=";
644 var request_type = "POST";
645 var postdata = "";
646 var i;
647
648 var content = YAHOO.util.Dom.get('pretextarea').value;
649
650 // To send an email, the To address and message Body must contain data.
651 // HTML5 input checking (required attribute) would make empty fields red outlined,
652 // but did not prevent Send button submitting form. So some basic sanity checking in JS:
653 // Checking non-empty and to address field must further be a URL: checking it contains @
654 var to_address = YAHOO.util.Dom.get('address').value;
655
656 if(to_address.trim() === "") {
657 alert(gs.text.berry.invalid_to_address_empty);
658 return;
659 } else if(to_address.indexOf('@') === -1) {
660 alert(gs.text.berry.invalid_to_address);
661 return;
662 } else if(content.trim() === "") {
663 alert(gs.text.berry.invalid_msg_body_empty);
664 return;
665 }
666
667 //get checked items
668 for (i in mailinfo) {
669 var input = YAHOO.util.Dom.get(i);
670 var value = input.value;
671 postdata +="&s1."+i+"="+value;
672 }
673
674
675 content = content.replace(/&/g,'-------');
676 postdata +="&s1.content="+content;
677
678 var callback = {
679 success: function(o) {
680 var result = o.responseText;
681 alert(gs.text.berry.send_success);
682 } ,
683 failure: function(o) {
684 alert(gs.text.berry.send_fail);
685 }
686 }
687 YAHOO.util.Connect.asyncRequest(request_type , url , callback, postdata);
688}
689
690function berryCheckoutPageClear() {
691 var bbc = document.getElementById('berryBasketContent');
692 if ( bbc == null ) return;
693 bbc.innerHTML = '';
694}
695
696function berryCheckoutHighlight( id ) {
697
698 for ( var i=0; i<options.length; i++ ) {
699 var option = document.getElementById( options[i] );
700 if ( option != null ) {
701 if ( id == options[i] ) {
702 //YAHOO.util.Dom.addClass( option, 'current' );
703 option.className='current';
704 } else {
705 //YAHOO.util.Dom.removeClass( option, 'current' );
706 option.className='';
707 }
708 }
709 }
710
711 if ( option == null ) return;
712 option.style.className = 'current';
713
714}
715
716YAHOO.util.Event.addListener(window,'load', pageLoad);
717
718
Note: See TracBrowser for help on using the repository browser.