1 dojo.require('dojo.date.locale');
2 dojo.require('dojo.date.stamp');
3 dojo.require('dijit.form.Button');
4 dojo.require('dijit.form.TextBox');
5 dojo.require('dijit.form.FilteringSelect');
6 dojo.require('dijit.form.Textarea');
7 dojo.require('dijit.ProgressBar');
8 dojo.require('openils.User');
9 dojo.require('openils.Util');
10 dojo.require('openils.acq.Lineitem');
11 dojo.require('openils.acq.PO');
12 dojo.require('openils.acq.Picklist');
13 dojo.require('openils.widget.AutoFieldWidget');
14 dojo.require('dojo.data.ItemFileReadStore');
15 dojo.require('openils.widget.ProgressDialog');
16 dojo.require('openils.PermaCrud');
18 dojo.requireLocalization('openils.acq', 'acq');
19 var localeStrings = dojo.i18n.getLocalization('openils.acq', 'acq');
21 function AcqLiTable() {
25 this.toggleState = false;
26 this.tbody = dojo.byId('acq-lit-tbody');
28 this.authtoken = openils.User.authtoken;
29 this.rowTemplate = this.tbody.removeChild(dojo.byId('acq-lit-row'));
30 this.copyTbody = dojo.byId('acq-lit-li-details-tbody');
31 this.copyRow = this.copyTbody.removeChild(dojo.byId('acq-lit-li-details-row'));
32 this.copyBatchRow = dojo.byId('acq-lit-li-details-batch-row');
33 this.copyBatchWidgets = {};
34 this.liNotesTbody = dojo.byId('acq-lit-notes-tbody');
35 this.liNotesRow = this.liNotesTbody.removeChild(dojo.byId('acq-lit-notes-row'));
37 dojo.connect(acqLitLiActionsSelector, 'onChange',
39 self.applySelectedLiAction(this.attr('value'))
40 acqLitLiActionsSelector.attr('value', '_');
43 acqLitCreatePoSubmit.onClick = function() {
44 acqLitPoCreateDialog.hide();
45 self._createPO(acqLitPoCreateDialog.getValues());
48 acqLitSavePlButton.onClick = function() {
49 acqLitSavePlDialog.hide();
50 self._savePl(acqLitSavePlDialog.getValues());
53 dojo.byId('acq-lit-notes-new-button').onclick = function(){acqLitCreateLiNoteDialog.show();}
55 dojo.byId('acq-lit-select-toggle').onclick = function(){self.toggleSelect()};
56 dojo.byId('acq-lit-info-back-button').onclick = function(){self.show('list')};
57 dojo.byId('acq-lit-copies-back-button').onclick = function(){self.show('list')};
58 dojo.byId('acq-lit-notes-back-button').onclick = function(){self.show('list')};
60 this.reset = function() {
61 while(self.tbody.childNodes[0])
62 self.tbody.removeChild(self.tbody.childNodes[0]);
66 this.setNext = function(handler) {
67 var link = dojo.byId('acq-lit-next');
69 dojo.style(link, 'visibility', 'visible');
70 link.onclick = handler;
72 dojo.style(link, 'visibility', 'hidden');
76 this.setPrev = function(handler) {
77 var link = dojo.byId('acq-lit-prev');
79 dojo.style(link, 'visibility', 'visible');
80 link.onclick = handler;
82 dojo.style(link, 'visibility', 'hidden');
86 this.show = function(div) {
87 openils.Util.hide('acq-lit-table-div');
88 openils.Util.hide('acq-lit-info-div');
89 openils.Util.hide('acq-lit-li-details');
90 openils.Util.hide('acq-lit-notes-div');
93 openils.Util.show('acq-lit-table-div');
96 openils.Util.show('acq-lit-info-div');
99 openils.Util.show('acq-lit-li-details');
102 openils.Util.show('acq-lit-notes-div');
106 openils.Util.show(div);
110 this.hide = function() {
114 this.toggleSelect = function() {
116 dojo.forEach(self.selectors, function(i){i.checked = false});
118 dojo.forEach(self.selectors, function(i){i.checked = true});
119 self.toggleState = !self.toggleState;
123 /** @param all If true, assume all are selected */
124 this.getSelected = function(all) {
126 dojo.forEach(self.selectors,
129 selected.push(self.liCache[i.parentNode.parentNode.getAttribute('li')]);
135 this.setRowAttr = function(td, liWrapper, field, type) {
136 var val = liWrapper.findAttr(field, type || 'lineitem_marc_attr_definition') || '';
137 td.appendChild(document.createTextNode(val));
140 this.addLineitem = function(li) {
141 this.liCache[li.id()] = li;
143 // sort the lineitem notes on edit_time
144 if(!li.lineitem_notes()) li.lineitem_notes([]);
146 var liWrapper = new openils.acq.Lineitem({lineitem:li});
147 var row = self.rowTemplate.cloneNode(true);
148 row.setAttribute('li', li.id());
149 var tds = dojo.query('[attr]', row);
150 dojo.forEach(tds, function(td) {self.setRowAttr(td, liWrapper, td.getAttribute('attr'), td.getAttribute('attr_type'));});
151 dojo.query('[name=source_label]', row)[0].appendChild(document.createTextNode(li.source_label()));
153 var isbn = liWrapper.findAttr('isbn', 'lineitem_marc_attr_definition');
155 // XXX media prefix for added content
156 dojo.query('[name=jacket]', row)[0].setAttribute('src', '/opac/extras/ac/jacket/small/' + isbn);
159 dojo.query('[attr=title]', row)[0].onclick = function() {self.drawInfo(li.id())};
160 dojo.query('[name=copieslink]', row)[0].onclick = function() {self.drawCopies(li.id())};
161 dojo.query('[name=count]', row)[0].innerHTML = li.item_count() || 0;
162 dojo.query('[name=notes_count]', row)[0].innerHTML = li.lineitem_notes().length;
163 dojo.query('[name=noteslink]', row)[0].onclick = function() {self.drawLiNotes(li)};
165 var priceInput = dojo.query('[name=price]', row)[0];
166 var priceData = liWrapper.getPrice();
167 priceInput.value = (priceData) ? priceData.price : '';
168 priceInput.onchange = function() { self.updateLiPrice(priceInput, li) };
170 var recv_link = dojo.query('[name=receive_link]', row)[0];
171 if(li.state() == 'received') {
172 openils.Util.hide(recv_link)
174 recv_link.onclick = function() {
176 openils.Util.hide(recv_link)
180 self.tbody.appendChild(row);
181 self.selectors.push(dojo.query('[name=selectbox]', row)[0]);
184 this.drawLiNotes = function(li) {
188 li.lineitem_notes().sort(
190 if(a.edit_time() < b.edit_time()) return 1;
196 while(this.liNotesTbody.childNodes[0])
197 this.liNotesTbody.removeChild(this.liNotesTbody.childNodes[0]);
200 acqLitCreateLiNoteSubmit.onClick = function() {
201 acqLitCreateLiNoteDialog.hide();
202 var value = acqLitCreateLiNoteDialog.getValues().note;
204 var note = new fieldmapper.acqlin();
207 li.lineitem_notes().push(note);
208 note.lineitem(li.id());
209 self.addLiNote(li, note);
212 dojo.byId('acq-lit-notes-save-button').onclick = function() {
213 self.updateLiNotes(li);
216 dojo.forEach(li.lineitem_notes(), function(note) { self.addLiNote(li, note) });
219 this.addLiNote = function(li, note) {
221 var row = self.liNotesRow.cloneNode(true);
222 dojo.query('[name=creator]', row)[0].innerHTML = note.creator() || ''; /* XXX */
223 dojo.query('[name=editor]', row)[0].innerHTML = note.editor() || ''; /* XXX */
225 if(note.create_time()) {
226 dojo.query('[name=create_time]', row)[0].innerHTML =
227 dojo.date.locale.format(
228 dojo.date.stamp.fromISOString(note.create_time()),
229 {formatLength:'short'});
232 if(note.edit_time()) {
233 dojo.query('[name=edit_time]', row)[0].innerHTML =
234 dojo.date.locale.format(
235 dojo.date.stamp.fromISOString(note.edit_time()),
236 {formatLength:'short'});
239 new openils.widget.AutoFieldWidget({
242 parentNode : dojo.query('[name=value]', row)[0],
243 widgetClass : 'dijit.form.Textarea',
246 dojo.connect(w, 'onChange',
248 note.value(this.attr('value'));
249 note.ischanged(true);
255 dojo.query('[name=delete]', row)[0].onclick = function() {
256 note.isdeleted(true);
257 self.liNotesTbody.removeChild(row);
260 self.liNotesTbody.appendChild(row);
263 this.updateLiNotes = function(li) {
264 progressDialog.show();
266 var notes = li.lineitem_notes().filter(
268 if(note.ischanged() || note.isnew() || note.isdeleted())
273 fieldmapper.standardRequest(
274 ['open-ils.acq', 'open-ils.acq.lineitem_note.cud.batch'],
276 params : [this.authtoken, notes],
277 onresponse : function(r) {
278 var resp = openils.Util.readResponse(r);
281 progressDialog.hide();
282 self.drawLiNotes(li);
286 progressDialog.update(resp);
288 var newnote = resp.note;
289 var oldnote = li.lineitem_notes().filter(function(n) { return (n.value() == newnote.value()) })[0];
290 var notes = li.lineitem_notes().filter(function(n) { return (n.value() != newnote.value()) });
292 if(!openils.Util.isTrue(oldnote.isdeleted()))
294 li.lineitem_notes(notes);
300 this.updateLiPrice = function(input, li) {
302 var price = input.value;
303 var liWrapper = new openils.acq.Lineitem({lineitem:li});
304 var oldPrice = liWrapper.getPrice() || null;
306 if(oldPrice) oldPrice = oldPrice.price;
307 if(price == oldPrice) return;
309 fieldmapper.standardRequest(
310 ['open-ils.acq', 'open-ils.acq.lineitem.price.set'],
312 params : [this.authtoken, li.id(), price],
313 oncomplete : function(r) {
314 openils.Util.readResponse(r);
320 this.removeLineitem = function(liId) {
321 this.tbody.removeChild(dojo.query('[li='+liId+']', this.tbody)[0]);
322 delete this.liCache[liId];
325 this.drawInfo = function(liId) {
327 openils.acq.Lineitem.fetchAttrDefs(
329 self._fetchLineitem(liId, function(li){self._drawInfo(li);});
334 this._fetchLineitem = function(liId, handler) {
336 var li = this.liCache[liId];
337 if(li && li.marc() && li.lineitem_details())
340 fieldmapper.standardRequest(
341 ['open-ils.acq', 'open-ils.acq.lineitem.retrieve'],
344 params: [self.authtoken, liId, {
346 flesh_li_details: true,
347 flesh_fund_debit: true }],
349 oncomplete: function(r) {
350 var li = openils.Util.readResponse(r);
357 this._drawInfo = function(li) {
359 acqLitEditOrderMarc.onClick = function() { self.editOrderMarc(li); }
360 acqLitEditILSMarc.onClick = function() { self.editILSMarc(li); }
363 openils.Util.hide('acq-lit-marc-order-record-label');
364 openils.Util.hide(acqLitEditOrderMarc.domNode);
365 openils.Util.show('acq-lit-marc-real-record-label');
366 openils.Util.show(acqLitEditILSMarc.domNode);
368 openils.Util.show('acq-lit-marc-order-record-label');
369 openils.Util.show(acqLitEditOrderMarc.domNode);
370 openils.Util.hide('acq-lit-marc-real-record-label');
371 openils.Util.hide(acqLitEditILSMarc.domNode);
374 this.drawMarcHTML(li);
375 this.infoTbody = dojo.byId('acq-lit-info-tbody');
378 this.infoRow = this.infoTbody.removeChild(dojo.byId('acq-lit-info-row'));
379 while(this.infoTbody.childNodes[0])
380 this.infoTbody.removeChild(this.infoTbody.childNodes[0]);
382 for(var i = 0; i < li.attributes().length; i++) {
383 var attr = li.attributes()[i];
384 var row = this.infoRow.cloneNode(true);
386 var type = attr.attr_type().replace(/lineitem_(.*)_attr_definition/, '$1');
387 var name = openils.acq.Lineitem.attrDefs[type].filter(
389 return (a.code() == attr.attr_name());
391 ).pop().description();
393 dojo.query('[name=label]', row)[0].appendChild(document.createTextNode(name));
394 dojo.query('[name=value]', row)[0].appendChild(document.createTextNode(attr.attr_value()));
395 this.infoTbody.appendChild(row);
399 openils.Util.show('acq-lit-info-cat-link');
400 var link = dojo.byId('acq-lit-info-cat-link').getElementsByTagName('a')[0];
401 var href = link.getAttribute('href');
403 link.setAttribute('href', href + li.eg_bib_id());
405 openils.Util.hide('acq-lit-info-cat-link');
409 this.drawMarcHTML = function(li) {
410 var params = [null, true, li.marc()];
412 params = [li.eg_bib_id(), true];
414 fieldmapper.standardRequest(
415 ['open-ils.search', 'open-ils.search.biblio.record.html'],
418 oncomplete: function(r) {
419 dojo.byId('acq-lit-marc-div').innerHTML =
420 openils.Util.readResponse(r);
426 if(this.canEditILSMarc === true) {
427 acqLitEditILSMarc.attr('disabled', false);
429 if(this.canEditILSMarc === false) {
430 acqLitEditILSMarc.attr('disabled', true);
433 new openils.User().getPermOrgList('UPDATE_RECORD',
435 if(list.length > 0) {
436 self.canEditILSMarc = true;
437 acqLitEditILSMarc.attr('disabled', false);
439 self.canEditILSMarc = false;
440 acqLitEditILSMarc.attr('disabled', true);
449 this.drawCopies = function(liId) {
453 this.copyWidgetCache = {};
455 acqLitSaveCopies.onClick = function() { self.saveCopyChanges(liId) };
456 acqLitBatchUpdateCopies.onClick = function() { self.batchCopyUpdate() };
458 while(this.copyTbody.childNodes[0])
459 this.copyTbody.removeChild(this.copyTbody.childNodes[0]);
461 this._drawBatchCopyWidgets();
463 this._fetchDistribFormulas(
465 openils.acq.Lineitem.fetchAttrDefs(
467 self._fetchLineitem(liId, function(li){self._drawCopies(li);});
474 this._fetchDistribFormulas = function(onload) {
475 if(this.distribForms) {
479 fieldmapper.standardRequest(
480 ['open-ils.acq', 'open-ils.acq.distribution_formula.ranged.retrieve.atomic'],
482 params: [openils.User.authtoken],
483 oncomplete: function(r) {
484 self.distribForms = openils.Util.readResponse(r);
485 self.distribFormulaStore =
486 new dojo.data.ItemFileReadStore(
487 {data:acqdf.toStoreData(self.distribForms)});
495 this._drawBatchCopyWidgets = function() {
496 var row = this.copyBatchRow;
497 dojo.forEach(['fund', 'owning_lib', 'location', 'circ_modifier', 'cn_label'],
499 if(self.copyBatchRowDrawn) {
500 self.copyBatchWidgets[field].attr('value', null);
502 var widget = new openils.widget.AutoFieldWidget({
505 parentNode : dojo.query('[name='+field+']', row)[0],
506 orgLimitPerms : ['CREATE_PICKLIST'],
507 dijitArgs : {required:false}
510 self.copyBatchWidgets[field] = widget.widget;
514 this.copyBatchRowDrawn = true;
517 this.batchCopyUpdate = function() {
519 var fields = ['fund', 'owning_lib', 'location', 'circ_modifier', 'cn_label'];
520 for(var k in this.copyWidgetCache) {
521 var cache = this.copyWidgetCache[k];
522 dojo.forEach(fields, function(f) {
523 var newval = self.copyBatchWidgets[f].attr('value');
524 if(newval) cache[f].attr('value', newval);
529 this._drawCopies = function(li) {
530 acqLitAddCopyCount.onClick = function() {
531 var count = acqLitCopyCountInput.attr('value');
532 for(var i = 0; i < count; i++)
535 if(li.lineitem_details().length > 0) {
536 dojo.forEach(li.lineitem_details(),
538 self.addCopy(li, copy);
546 this.virtCopyId = -1;
547 this.addCopy = function(li, copy) {
548 var row = this.copyRow.cloneNode(true);
549 this.copyTbody.appendChild(row);
553 copy = new fieldmapper.acqlid();
555 copy.id(this.virtCopyId--);
556 copy.lineitem(li.id());
559 this.copyCache[copy.id()] = copy;
560 row.setAttribute('copy_id', copy.id());
561 self.copyWidgetCache[copy.id()] = {};
563 dojo.forEach(['fund', 'owning_lib', 'location', 'barcode', 'cn_label', 'circ_modifier', 'note'],
565 var widget = new openils.widget.AutoFieldWidget({
569 parentNode : dojo.query('[name='+field+']', row)[0],
570 orgLimitPerms : ['CREATE_PICKLIST'],
574 // make sure we capture the value from any async widgets
575 function(w, ww) { copy[field](ww.getFormattedValue()) }
577 dojo.connect(widget.widget, 'onChange',
579 if(copy.isnew() || val != copy[field]()) {
580 // prevent setting ischanged() automatically on widget load for existing copies
581 copy[field](widget.getFormattedValue())
582 copy.ischanged(true);
586 self.copyWidgetCache[copy.id()][field] = widget.widget;
590 var recv_link = dojo.query('[name=receive]', row)[0];
591 if(copy.recv_time()) {
592 openils.Util.hide(recv_link);
594 recv_link.onclick = function() {
595 self.receiveLid(copy);
596 openils.Util.hide(recv_link);
601 openils.Util.hide(dojo.query('[name=delete]', row)[0].parentNode);
603 dojo.query('[name=delete]', row)[0].onclick =
604 function() { self.deleteCopy(row) };
608 this.deleteCopy = function(row) {
609 var copy = this.copyCache[row.getAttribute('copy_id')];
610 copy.isdeleted(true);
612 delete this.copyCache[copy.id()];
613 this.copyTbody.removeChild(row);
616 this.saveCopyChanges = function(liId) {
620 openils.Util.show('acq-lit-update-copies-progress');
622 for(var id in this.copyCache) {
623 var c = this.copyCache[id];
624 if(c.isnew() || c.ischanged() || c.isdeleted()) {
625 if(c.id() < 0) c.id(null);
630 if(copies.length == 0)
633 fieldmapper.standardRequest(
634 ['open-ils.acq', 'open-ils.acq.lineitem_detail.cud.batch'],
636 params: [openils.User.authtoken, copies],
637 onresponse: function(r) {
638 var res = openils.Util.readResponse(r);
639 litUpdateCopiesProgress.update(res);
641 oncomplete: function() {
642 openils.Util.hide('acq-lit-update-copies-progress');
643 self.drawCopies(liId);
649 this.applySelectedLiAction = function(action) {
653 case 'delete_selected':
654 this._deleteLiList(self.getSelected());
659 if(!this.createPoProviderSelector) {
660 var widget = new openils.widget.AutoFieldWidget({
661 fmField : 'provider',
663 parentNode : dojo.byId('acq-lit-po-provider'),
664 orgLimitPerms : ['CREATE_PURCHASE_ORDER'],
667 function(w) { self.createPoProviderSelector = w; }
671 acqLitPoCreateDialog.show();
674 case 'save_picklist':
675 this._loadPLSelect();
676 acqLitSavePlDialog.show();
687 case 'rollback_receive_po':
688 this.rollbackPoReceive();
691 case 'create_assets':
697 this.createAssets = function() {
698 if(!this.isPO) return;
699 if(!confirm(localeStrings.CREATE_PO_ASSETS_CONFIRM)) return;
700 this.show('acq-lit-progress-numbers');
702 fieldmapper.standardRequest(
703 ['open-ils.acq', 'open-ils.acq.purchase_order.assets.create'],
705 params: [this.authtoken, this.isPO],
706 onresponse: function(r) {
707 var resp = openils.Util.readResponse(r);
708 self._updateProgressNumbers(resp, true);
714 this.printPO = function() {
715 if(!this.isPO) return;
716 progressDialog.show(true);
717 fieldmapper.standardRequest(
718 ['open-ils.acq', 'open-ils.acq.purchase_order.format'],
720 params: [this.authtoken, this.isPO, 'html'],
721 oncomplete: function(r) {
722 progressDialog.hide();
723 var evt = openils.Util.readResponse(r);
724 if(evt && evt.template_output()) {
725 win = window.open('','', 'resizable,width=800,height=600,scrollbars=1');
726 win.document.body.innerHTML = evt.template_output().data();
734 this.receivePO = function() {
735 if(!this.isPO) return;
736 this.show('acq-lit-progress-numbers');
738 fieldmapper.standardRequest(
739 ['open-ils.acq', 'open-ils.acq.purchase_order.receive'],
741 params: [this.authtoken, this.isPO],
742 onresponse : function(r) {
743 var resp = openils.Util.readResponse(r);
744 self._updateProgressNumbers(resp, true);
750 this.receiveLi = function(li) {
751 if(!this.isPO) return;
752 progressDialog.show(true);
753 fieldmapper.standardRequest(
754 ['open-ils.acq', 'open-ils.acq.lineitem.receive'],
756 params: [this.authtoken, li.id()],
757 onresponse : function(r) {
758 var resp = openils.Util.readResponse(r);
759 progressDialog.hide();
765 this.receiveLid = function(li) {
766 if(!this.isPO) return;
767 progressDialog.show(true);
768 fieldmapper.standardRequest(
769 ['open-ils.acq', 'open-ils.acq.lineitem_detail.receive'],
771 params: [this.authtoken, li.id()],
772 onresponse : function(r) {
773 var resp = openils.Util.readResponse(r);
774 progressDialog.hide();
780 this.rollbackPoReceive = function() {
781 if(!this.isPO) return;
782 if(!confirm(localeStrings.ROLLBACK_PO_RECEIVE_CONFIRM)) return;
783 this.show('acq-lit-progress-numbers');
785 fieldmapper.standardRequest(
786 ['open-ils.acq', 'open-ils.acq.purchase_order.receive.rollback'],
788 params: [this.authtoken, this.isPO],
789 onresponse : function(r) {
790 var resp = openils.Util.readResponse(r);
791 self._updateProgressNumbers(resp, true);
797 this._updateProgressNumbers = function(resp, reloadOnComplete) {
799 dojo.byId('acq-pl-lit-li-processed').innerHTML = resp.li;
800 dojo.byId('acq-pl-lit-lid-processed').innerHTML = resp.lid;
801 dojo.byId('acq-pl-lit-debits-processed').innerHTML = resp.debits_accrued;
802 dojo.byId('acq-pl-lit-bibs-processed').innerHTML = resp.bibs;
803 dojo.byId('acq-pl-lit-indexed-processed').innerHTML = resp.indexed;
804 dojo.byId('acq-pl-lit-copies-processed').innerHTML = resp.copies;
805 if(resp.complete && reloadOnComplete)
806 location.href = location.href;
810 this._createPO = function(fields) {
811 this.show('acq-lit-progress-numbers');
812 var po = new fieldmapper.acqpo();
813 po.provider(this.createPoProviderSelector.attr('value'));
815 var selected = this.getSelected( (fields.create_from == 'all') );
816 if(selected.length == 0) return;
818 var max = selected.length * 3;
821 fieldmapper.standardRequest(
822 ['open-ils.acq', 'open-ils.acq.purchase_order.create'],
825 openils.User.authtoken,
828 lineitems : selected.map(function(li) { return li.id() }),
829 create_assets : fields.create_assets[0],
833 onresponse : function(r) {
834 var resp = openils.Util.readResponse(r);
835 self._updateProgressNumbers(resp);
837 location.href = oilsBasePath + '/eg/acq/po/view/' + resp.purchase_order.id();
843 this._deleteLiList = function(list, idx) {
844 if(idx == null) idx = 0;
845 if(idx >= list.length) return;
846 var liId = list[idx].id();
847 fieldmapper.standardRequest(
848 ['open-ils.acq', 'open-ils.acq.lineitem.delete'],
850 params: [openils.User.authtoken, liId],
851 oncomplete: function(r) {
852 self.removeLineitem(liId);
853 self._deleteLiList(list, ++idx);
859 this.editOrderMarc = function(li) {
861 /* To run in Firefox directly, must set signed.applets.codebase_principal_support
862 to true in about:config */
864 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
865 win = window.open('/xul/server/cat/marcedit.xul'); // XXX version?
869 record : {marc : li.marc()},
871 label: 'Save Record', // XXX I18N
872 func: function(xmlString) {
874 fieldmapper.standardRequest(
875 ['open-ils.acq', 'open-ils.acq.lineitem.update'],
877 params: [openils.User.authtoken, li],
878 oncomplete: function(r) {
879 openils.Util.readResponse(r);
881 self.drawInfo(li.id())
891 this.editILSMarc = function(li) {
893 /* To run in Firefox directly, must set signed.applets.codebase_principal_support
894 to true in about:config */
896 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
897 win = window.open('/xul/server/cat/marcedit.xul'); // XXX version?
899 var bib = new openils.PermaCrud().retrieve('bre', li.eg_bib_id());
903 record : {marc : li.marc()},
905 label: 'Save Record', // XXX I18N
906 func: function(xmlString) {
908 fieldmapper.standardRequest(
909 ['open-ils.cat', 'open-ils.cat.biblio.record_entry.update'],
911 params: [openils.User.authtoken, bib],
912 oncomplete: function(r) {
913 openils.Util.readResponse(r);
915 self.drawInfo(li.id())
924 this._savePl = function(values) {
926 var selected = this.getSelected( (values.which == 'all') );
927 openils.Util.show('acq-lit-generic-progress');
929 if(values.new_name) {
930 openils.acq.Picklist.create(
931 {name: values.new_name},
933 self._updateLiList(id, selected, 0,
935 location.href = oilsBasePath + '/eg/acq/picklist/view/' + id;
939 } else if(values.existing_pl) {
940 // update lineitems to use an existing picklist
941 self._updateLiList(values.existing_pl, selected, 0,
943 location.href = oilsBasePath + '/eg/acq/picklist/view/' + values.existing_pl;
948 this._updateLiList = function(pl, list, idx, oncomplete) {
949 if(idx >= list.length) return oncomplete();
952 litGenericProgress.update({maximum: list.length, progress: idx});
953 new openils.acq.Lineitem({lineitem:li}).update(
955 self._updateLiList(pl, list, ++idx, oncomplete);
960 this._loadPLSelect = function() {
961 if(this._plSelectLoaded) return;
963 function handleResponse(r) {
964 plList.push(r.recv().content());
966 var method = 'open-ils.acq.picklist.user.retrieve';
967 fieldmapper.standardRequest(
968 ['open-ils.acq', method],
970 params: [this.authtoken],
971 onresponse: handleResponse,
972 oncomplete: function() {
973 self._plSelectLoaded = true;
974 acqLitAddExistingSelect.store =
975 new dojo.data.ItemFileReadStore({data:acqpl.toStoreData(plList)});
976 acqLitAddExistingSelect.setValue();